#!/usr/bin/env vpython3
# Copyright (c) 2022 The WebRTC Project Authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
import datetime
from datetime
import date
import hashlib
import sys
from typing
import FrozenSet, List, Set
import argparse
import dataclasses
@dataclasses.dataclass(frozen=
True )
class FieldTrial:
"" "Representation of all attributes associated with a field trial.
Attributes:
key: Field trial key.
bug_id: Associated open bug containing more context.
end_date: Date when the field trial expires
and must be deleted.
"" "
key: str
bug_id: int
end_date: date
def bug_url(self) -> str:
if self.bug_id <=
0 :
return ''
return f
'https://issues.webrtc.org/issues/{self.bug_id} '
# As per the policy in `g3doc/field-trials.md`, all field trials should be
# registered in the container below.
ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([
# keep-sorted start
FieldTrial(
'WebRTC-AV1-OverridePriorityBitrate' ,
42226119 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3BufferingMaxAllowedExcessRenderBlocksOverride' ,
337900458 ,
date(
2024 ,
9 ,
1 )),
FieldTrial(
'WebRTC-Agc2MaxSpeechLevelExperimental' ,
457791164 ,
date(
2026 ,
12 ,
11 )),
FieldTrial(
'WebRTC-Agc2SpeechLevelEstimatorExperimental' ,
457791164 ,
date(
2026 ,
11 ,
5 )),
FieldTrial(
'WebRTC-ApmEnforce48kHzProcessingRate' ,
454695115 ,
date(
2026 ,
6 ,
1 )),
FieldTrial(
'WebRTC-Audio-GainController2' ,
42232605 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-OpusDecodeStereoByDefault' ,
379996136 ,
date(
2025 ,
11 ,
15 )),
FieldTrial(
'WebRTC-Audio-OpusGeneratePlc' ,
42223518 ,
date(
2025 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-PriorityBitrate' ,
42226125 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Av1-GetEncoderInfoOverride' ,
42225234 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-BitrateAdjusterUseNewfangledHeadroomAdjustment' ,
349561566 ,
date(
2025 ,
8 ,
26 )),
FieldTrial(
'WebRTC-Bwe-LimitPacingFactorByUpperLinkCapacityEstimate' ,
42220543 ,
date(
2025 ,
1 ,
1 )),
FieldTrial(
'WebRTC-Bwe-ResetOnAdapterIdChange' ,
42225231 ,
date(
2025 ,
5 ,
30 )),
FieldTrial(
'WebRTC-Bwe-ScreamV2' ,
447037083 ,
date(
2026 ,
12 ,
30 )),
FieldTrial(
'WebRTC-CorruptionDetectionFrameSelector' ,
358039777 ,
date(
2026 ,
4 ,
1 )),
FieldTrial(
'WebRTC-DataChannelMessageInterleaving' ,
41481008 ,
date(
2024 ,
10 ,
1 )),
FieldTrial(
'WebRTC-Dav1dDecoder-CropToRenderResolution' ,
405341160 ,
date(
2026 ,
3 ,
21 )),
FieldTrial(
'WebRTC-DisableRtxRateLimiter' ,
42225500 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-DisableSslGroupIds' ,
404763475 ,
date(
2025 ,
9 ,
1 )),
FieldTrial(
'WebRTC-ElasticBitrateAllocation' ,
350555527 ,
date(
2025 ,
3 ,
1 )),
FieldTrial(
'WebRTC-EnableDtlsPqc' ,
404763475 ,
date(
2026 ,
6 ,
1 )),
FieldTrial(
'WebRTC-EncoderDataDumpDirectory' ,
296242528 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-EncoderSpeed' ,
443906251 ,
date(
2026 ,
4 ,
6 )),
FieldTrial(
'WebRTC-EnforceTransceiverDirection' ,
448408148 ,
date(
2026 ,
6 ,
1 )),
FieldTrial(
'WebRTC-ForceDtls13' ,
383141571 ,
date(
2024 ,
9 ,
1 )),
FieldTrial(
'WebRTC-H265-QualityScaling' ,
402154973 ,
date(
2026 ,
1 ,
1 )),
FieldTrial(
'WebRTC-HeaderExtensionNegotiateMemory' ,
439514253 ,
date(
2026 ,
2 ,
18 )),
FieldTrial(
'WebRTC-IPv6NetworkResolutionFixes' ,
42224598 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-IceHandshakeDtls' ,
367395350 ,
date(
2026 ,
1 ,
1 )),
FieldTrial(
'WebRTC-IncomingTimestampOnMarkerBitOnly' ,
42224805 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-IncreaseIceCandidatePriorityHostSrflx' ,
42225331 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-JitterEstimatorConfig' ,
42224404 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-LibaomAv1Encoder-DropRepeatFramesOnEnhancementLayers' ,
445115234 ,
date(
2026 ,
3 ,
19 )),
FieldTrial(
'WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings' ,
42226191 ,
date(
2024 ,
9 ,
1 )),
FieldTrial(
'WebRTC-LibvpxVp9Encoder-PostEncodeFrameDrop' ,
500517546 ,
date(
2027 ,
1 ,
1 )),
FieldTrial(
'WebRTC-MediaTaskQueuePriorities' ,
470337728 ,
date(
2027 ,
4 ,
1 )),
FieldTrial(
'WebRTC-MixedCodecSimulcast' ,
362277533 ,
date(
2025 ,
9 ,
1 )),
FieldTrial(
'WebRTC-NoSdpMangleAllowForTesting' ,
40567530 ,
date(
2026 ,
6 ,
1 )),
FieldTrial(
'WebRTC-NoSdpMangleReject' ,
40567530 ,
date(
2026 ,
6 ,
1 )),
FieldTrial(
'WebRTC-NoSdpMangleUfrag' ,
375571816 ,
date(
2025 ,
10 ,
11 )),
FieldTrial(
'WebRTC-NoSdpMangleUfragRestrictedAddresses' ,
409713509 ,
date(
2025 ,
10 ,
11 )),
FieldTrial(
'WebRTC-Pacer-FastRetransmissions' ,
40235589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Pacer-KeyframeFlushing' ,
42221435 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-PayloadTypesInTransport' ,
360058654 ,
date(
2025 ,
9 ,
11 )),
FieldTrial(
'WebRTC-PostFilterKillSwitch' ,
417439718 ,
date(
2025 ,
9 ,
1 )),
FieldTrial(
'WebRTC-QCM-Dynamic-AV1' ,
349860657 ,
date(
2025 ,
7 ,
1 )),
FieldTrial(
'WebRTC-QCM-Dynamic-VP8' ,
349860657 ,
date(
2025 ,
7 ,
1 )),
FieldTrial(
'WebRTC-QCM-Dynamic-VP9' ,
349860657 ,
date(
2025 ,
7 ,
1 )),
FieldTrial(
'WebRTC-QCM-Static-AV1' ,
349860657 ,
date(
2025 ,
7 ,
1 )),
FieldTrial(
'WebRTC-QCM-Static-VP8' ,
349860657 ,
date(
2025 ,
7 ,
1 )),
FieldTrial(
'WebRTC-QCM-Static-VP9' ,
349860657 ,
date(
2025 ,
7 ,
1 )),
FieldTrial(
'WebRTC-RFC8888CongestionControlFeedback' ,
42225697 ,
date(
2025 ,
1 ,
30 )),
FieldTrial(
'WebRTC-ReceiveBufferSize' ,
42225927 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-RtcEventLogEncodeNetEqSetMinimumDelayKillSwitch' ,
42225058 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Sctp-Snap' ,
426480601 ,
date(
2026 ,
1 ,
1 )),
FieldTrial(
'WebRTC-SdpBundlePayloadTypeCollisionCheck' ,
42224689 ,
date(
2027 ,
1 ,
1 )),
FieldTrial(
'WebRTC-SimulcastEncoderAdapter-DropUnalignedResolution' ,
415329365 ,
date(
2025 ,
11 ,
2 )),
FieldTrial(
'WebRTC-SrtpRemoveReceiveStream' ,
42225949 ,
date(
2024 ,
10 ,
1 )),
FieldTrial(
'WebRTC-SwitchEncoderFollowCodecPreferenceOrder' ,
378566918 ,
date(
2025 ,
5 ,
1 )),
FieldTrial(
'WebRTC-SynchronousDestructors' ,
443588673 ,
date(
2026 ,
7 ,
1 )),
FieldTrial(
'WebRTC-TimestampExtrapolatorConfig' ,
424739326 ,
date(
2026 ,
6 ,
30 )),
FieldTrial(
'WebRTC-UnifiedCommunications' ,
466507512 ,
date(
2026 ,
6 ,
30 )),
FieldTrial(
'WebRTC-UseAbsCapTimeForG2gMetric' ,
401512883 ,
date(
2025 ,
9 ,
10 )),
FieldTrial(
'WebRTC-UseWildcardInSdp' ,
500638469 ,
date(
2027 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP8-MaxFrameInterval' ,
42225870 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP9-SvcForSimulcast' ,
347737882 ,
date(
2024 ,
10 ,
1 )),
FieldTrial(
'WebRTC-Video-CalculatePsnr' ,
388070060 ,
date(
2026 ,
1 ,
1 )),
FieldTrial(
'WebRTC-Video-EnableRetransmitAllLayers' ,
42225262 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-EncoderFallbackSettings' ,
42231704 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-H26xPacketBuffer' ,
41480904 ,
date(
2024 ,
6 ,
1 )),
FieldTrial(
'WebRTC-VideoEncoderSettings' ,
40252667 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VoIP-NetEqConfig' ,
500324590 ,
date(
2027 ,
4 ,
1 )),
# keep-sorted end
])
# yapf: disable
NO_BUG = -
1
INDEFINITE = date(datetime.MAXYEAR,
1 ,
1 )
# These field trials precedes the policy in `g3doc/field-trials.md` and are
# therefore not required to follow it. Do not add any new field trials here.
# If you remove an entry you should also update
# POLICY_EXEMPT_FIELD_TRIALS_DIGEST.
POLICY_EXEMPT_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([
# keep-sorted start
FieldTrial(
'WebRTC-AddNetworkCostToVpn' ,
42223280 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-AddPacingToCongestionWindowPushback' ,
42220204 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-AdjustOpusBandwidth' ,
42233664 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3AecStateFullResetKillSwitch' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3AecStateSubtractorAnalyzerResetKillSwitch' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3AntiHowlingMinimizationKillSwitch' ,
150764764 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3ClampInstQualityToOneKillSwitch' ,
42220991 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3ClampInstQualityToZeroKillSwitch' ,
42220991 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3CoarseFilterResetHangoverKillSwitch' ,
42222401 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3ConservativeTailFreqResponse' ,
42223361 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3DeactivateInitialStateResetKillSwitch' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3DelayEstimateSmoothingDelayFoundOverride' ,
42222934 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3DelayEstimateSmoothingOverride' ,
42222934 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3EchoSaturationDetectionKillSwitch' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceCaptureDelayEstimationDownmixing' ,
42221238 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceCaptureDelayEstimationLeftRightPrioritization' ,
42221238 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceConservativeHfSuppression' ,
42222109 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3EnforceLowActiveRenderLimit' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceMoreTransparentNearendSuppressorHfTuning' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceMoreTransparentNearendSuppressorTuning' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceMoreTransparentNormalSuppressorHfTuning' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceMoreTransparentNormalSuppressorTuning' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceRapidlyAdjustingNearendSuppressorTunings' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceRapidlyAdjustingNormalSuppressorTunings' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceRenderDelayEstimationDownmixing' ,
42221238 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceSlowlyAdjustingNearendSuppressorTunings' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceSlowlyAdjustingNormalSuppressorTunings' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceStationarityProperties' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceStationarityPropertiesAtInit' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3EnforceVeryLowActiveRenderLimit' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3HighPassFilterEchoReference' ,
42222401 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3MinErleDuringOnsetsKillSwitch' ,
42220385 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3NonlinearModeReverbKillSwitch' ,
42222109 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3OnsetDetectionKillSwitch' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3RenderDelayEstimationLeftRightPrioritizationKillSwitch' ,
42221238 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SensitiveDominantNearendActivation' ,
42221578 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SetupSpecificDefaultConfigDefaultsKillSwitch' ,
42221236 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3ShortHeadroomKillSwitch' ,
42220385 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3StereoContentDetectionKillSwitch' ,
42225201 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorAntiHowlingGainOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorDominantNearendEnrExitThresholdOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorDominantNearendEnrThresholdOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorDominantNearendHoldDurationOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorDominantNearendSnrThresholdOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorDominantNearendTriggerThresholdOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorNearendHfMaskSuppressOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorNearendHfMaskTransparentOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorNearendLfMaskSuppressOverride' ,
42221589 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3SuppressorNearendLfMaskTransparentOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNearendMaxDecFactorLfOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNearendMaxIncFactorOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNormalHfMaskSuppressOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNormalHfMaskTransparentOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNormalLfMaskSuppressOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNormalLfMaskTransparentOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNormalMaxDecFactorLfOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorNormalMaxIncFactorOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3SuppressorTuningOverride' ,
42221589 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3TransparentAntiHowlingGain' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3TransparentModeHmm' ,
42222401 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3TransparentModeKillSwitch' ,
42234438 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3Use1Dot2SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3Use1Dot6SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3Use2Dot0SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseDot1SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseDot2SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseDot3SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseDot6SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseDot9SecondsInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseErleOnsetCompensationInDominantNearend' ,
42222842 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseLowEarlyReflectionsDefaultGain' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseLowLateReflectionsDefaultGain' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseNearendReverbLen' ,
42223329 ,
INDEFINITE),
FieldTrial(
'WebRTC-Aec3UseShortConfigChangeDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3UseZeroInitialStateDuration' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Aec3VerySensitiveDominantNearendActivation' ,
42221578 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Agc2SimdAvx2KillSwitch' ,
42232605 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Agc2SimdNeonKillSwitch' ,
42232605 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Agc2SimdSse2KillSwitch' ,
42232605 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-AllowMACBasedIPv6' ,
41480878 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-AlrDetectorParameters' ,
42220590 ,
INDEFINITE),
FieldTrial(
'WebRTC-AndroidNetworkMonitor-IsAdapterAvailable' ,
42223964 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-ApmExperimentalMultiChannelCaptureKillSwitch' ,
42225202 ,
INDEFINITE),
FieldTrial(
'WebRTC-ApmExperimentalMultiChannelRenderKillSwitch' ,
42225203 ,
INDEFINITE),
FieldTrial(
'WebRTC-Audio-2ndAgcMinMicLevelExperiment' ,
40207112 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-ABWENoTWCC' ,
42233370 ,
INDEFINITE),
FieldTrial(
'WebRTC-Audio-AdaptivePtime' ,
40694579 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-Allocation' ,
42220324 ,
INDEFINITE),
FieldTrial(
'WebRTC-Audio-AlrProbing' ,
42220234 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-LegacyOverhead' ,
42221084 ,
INDEFINITE),
FieldTrial(
'WebRTC-Audio-MinimizeResamplingOnMobile' ,
42231221 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-NetEqDecisionLogicConfig' ,
42223518 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-NetEqDelayManagerConfig' ,
42220376 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-NetEqNackTrackerConfig' ,
42220211 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-NetEqSmartFlushing' ,
42222334 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-OpusBitrateMultipliers' ,
42221139 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-Red-For-Opus' ,
42221750 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Audio-iOS-Holding' ,
42233253 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-AudioDevicePlayoutBufferSizeFactor' ,
42221006 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-BindUsingInterfaceName' ,
42220770 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-AllocationProbing' ,
42220440 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-AlrProbing' ,
42220440 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-EstimateBoundedIncrease' ,
42220543 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-ExponentialProbing' ,
42220440 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-IgnoreProbesLowerThanNetworkStateEstimate' ,
42220543 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-InitialProbing' ,
42220440 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-InjectedCongestionController' ,
'webrtc:8415' ,
INDEFINITE),
FieldTrial(
'WebRTC-Bwe-LimitProbesLowerThanThroughputEstimate' ,
42221601 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-LossBasedBweV2' ,
42222865 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-MaxRttLimit' ,
42234928 ,
INDEFINITE),
FieldTrial(
'WebRTC-Bwe-MinAllocAsLowerBound' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-ProbingBehavior' ,
42220440 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-ProbingConfiguration' ,
42220440 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-ReceiveTimeFix' ,
42234228 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-ReceiverLimitCapsOnly' ,
42222445 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-RobustThroughputEstimatorSettings' ,
42220312 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-SafeResetOnRouteChange' ,
42234928 ,
INDEFINITE),
FieldTrial(
'WebRTC-Bwe-SeparateAudioPackets' ,
42221011 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Bwe-TrendlineEstimatorSettings' ,
42221011 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-BweBackOffFactor' ,
42233342 ,
INDEFINITE),
FieldTrial(
'WebRTC-BweLossExperiment' ,
42230863 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-BweRapidRecoveryExperiment' ,
42233136 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-BweThroughputWindowConfig' ,
42220312 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-BweWindowSizeInPackets' ,
42233342 ,
INDEFINITE),
FieldTrial(
'WebRTC-CongestionWindow' ,
42225197 ,
INDEFINITE),
FieldTrial(
'WebRTC-CpuLoadEstimator' ,
42233645 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Debugging-RtpDump' ,
42220735 ,
INDEFINITE),
FieldTrial(
'WebRTC-DecoderDataDumpDirectory' ,
42224491 ,
INDEFINITE),
FieldTrial(
'WebRTC-DefaultBitrateLimitsKillSwitch' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-DependencyDescriptorAdvertised' ,
42220386 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-DisableUlpFecExperiment' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-DontIncreaseDelayBasedBweInAlr' ,
42220590 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-DscpFieldTrial' ,
42223835 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-ExtraICEPing' ,
42220311 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-FakeNetworkReceiveConfig' ,
42224493 ,
INDEFINITE),
FieldTrial(
'WebRTC-FakeNetworkSendConfig' ,
42224493 ,
INDEFINITE),
FieldTrial(
'WebRTC-FilterAbsSendTimeExtension' ,
42220271 ,
INDEFINITE),
FieldTrial(
'WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart' ,
42221149 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-FlexFEC-03' ,
42230680 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-FlexFEC-03-Advertised' ,
42230680 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-ForcePlayoutDelay' ,
42222016 ,
INDEFINITE),
FieldTrial(
'WebRTC-ForceSendPlayoutDelay' ,
42222016 ,
INDEFINITE),
FieldTrial(
'WebRTC-ForceSimulatedOveruseIntervalMs' ,
42224494 ,
INDEFINITE),
FieldTrial(
'WebRTC-FrameDropper' ,
42234921 ,
INDEFINITE),
FieldTrial(
'WebRTC-FullBandHpfKillSwitch' ,
42221279 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-GenericCodecDependencyDescriptor' ,
42225273 ,
INDEFINITE),
FieldTrial(
'WebRTC-GenericDescriptorAdvertised' ,
42234553 ,
INDEFINITE),
FieldTrial(
'WebRTC-GenericDescriptorAuth' ,
42220132 ,
INDEFINITE),
FieldTrial(
'WebRTC-GenericPictureId' ,
42234553 ,
INDEFINITE),
FieldTrial(
'WebRTC-GetEncoderInfoOverride' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-H264HighProfile' ,
41481030 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-IPv6Default' ,
NO_BUG,
# chromium:413437
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-IceControllerFieldTrials' ,
40658968 ,
INDEFINITE),
FieldTrial(
'WebRTC-IceFieldTrials' ,
42221103 ,
INDEFINITE),
FieldTrial(
'WebRTC-KeyframeInterval' ,
42220470 ,
INDEFINITE),
FieldTrial(
'WebRTC-LegacyFrameIdJumpBehavior' ,
42223541 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-LegacySimulcastLayerLimit' ,
42233936 ,
INDEFINITE),
FieldTrial(
'WebRTC-LowresSimulcastBitrateInterpolation' ,
42222558 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-MutedStateKillSwitch' ,
177830919 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Network-UseNWPathMonitor' ,
42221045 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-NetworkMonitorAutoDetect' ,
42223964 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-NormalizeSimulcastResolution' ,
NO_BUG,
INDEFINITE),
FieldTrial(
'WebRTC-Pacer-BlockAudio' ,
42233548 ,
INDEFINITE),
FieldTrial(
'WebRTC-Pacer-DrainQueue' ,
42233548 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Pacer-IgnoreTransportOverhead' ,
42235102 ,
INDEFINITE),
FieldTrial(
'WebRTC-Pacer-PadInSilence' ,
42233548 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-PacketBufferMaxSize' ,
42235070 ,
INDEFINITE),
FieldTrial(
'WebRTC-PcFactoryDefaultBitrates' ,
42220941 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-PiggybackIceCheckAcknowledgement' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-PixelLimitResource' ,
42222397 ,
INDEFINITE),
FieldTrial(
'WebRTC-ProbingScreenshareBwe' ,
42232804 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-ProtectionOverheadRateThreshold' ,
42225198 ,
INDEFINITE),
FieldTrial(
'WebRTC-QpParsingKillSwitch' ,
42222690 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-RtcEventLogKillSwitch' ,
42222210 ,
INDEFINITE),
FieldTrial(
'WebRTC-RtcEventLogNewFormat' ,
42233237 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-RtcpLossNotification' ,
42220379 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SendBufferSizeBytes' ,
42222026 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SendNackDelayMs' ,
42235176 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SetSocketReceiveBuffer' ,
42223976 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SimulcastLayerLimitRoundUp' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SpsPpsIdrIsH264Keyframe' ,
42233557 ,
INDEFINITE),
FieldTrial(
'WebRTC-StrictPacingAndProbing' ,
42233198 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SurfaceCellularTypes' ,
42221576 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-SwitchEncoderOnInitializationFailures' ,
42223783 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Target-Bitrate-Rtcp' ,
42235192 ,
INDEFINITE),
FieldTrial(
'WebRTC-TransientSuppressorForcedOff' ,
40172597 ,
INDEFINITE),
FieldTrial(
'WebRTC-UseBaseHeavyVP8TL3RateAllocation' ,
42234670 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-UseDifferentiatedCellularCosts' ,
42221576 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-UseStandardBytesStats' ,
42220573 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-UseTurnServerAsStunServer' ,
42221142 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP8-ForcePartitionResilience' ,
42221952 ,
INDEFINITE),
FieldTrial(
'WebRTC-VP8-Forced-Fallback-Encoder-v2' ,
42231704 ,
INDEFINITE),
FieldTrial(
'WebRTC-VP8-GetEncoderInfoOverride' ,
42221952 ,
INDEFINITE),
FieldTrial(
'WebRTC-VP8-Postproc-Config' ,
42221657 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP8-Postproc-Config-Arm' ,
42231704 ,
INDEFINITE),
FieldTrial(
'WebRTC-VP8IosMaxNumberOfThread' ,
42220027 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP9-GetEncoderInfoOverride' ,
NO_BUG,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP9-LowTierOptimizations' ,
42224122 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP9-PerformanceFlags' ,
42221657 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VP9QualityScaler' ,
42221411 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-BalancedDegradation' ,
42232717 ,
INDEFINITE),
FieldTrial(
'WebRTC-Video-BalancedDegradationSettings' ,
NO_BUG,
INDEFINITE),
FieldTrial(
'WebRTC-Video-DisableAutomaticResize' ,
42221931 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-DiscardPacketsWithUnknownSsrc' ,
42235091 ,
INDEFINITE),
FieldTrial(
'WebRTC-Video-ForcedSwDecoderFallback' ,
NO_BUG,
INDEFINITE),
FieldTrial(
'WebRTC-Video-InitialDecoderResolution' ,
42222018 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-MinVideoBitrate' ,
42220993 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-Pacing' ,
42220062 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-Video-PreferTemporalSupportOnBaseLayer' ,
42221417 ,
INDEFINITE),
FieldTrial(
'WebRTC-Video-QualityScalerSettings' ,
NO_BUG,
INDEFINITE),
FieldTrial(
'WebRTC-Video-QualityScaling' ,
42234348 ,
INDEFINITE),
FieldTrial(
'WebRTC-Video-UseFrameRateForOverhead' ,
166341943 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-VideoFrameTrackingIdAdvertised' ,
42222747 ,
INDEFINITE),
FieldTrial(
'WebRTC-VideoLayersAllocationAdvertised' ,
42222126 ,
INDEFINITE),
FieldTrial(
'WebRTC-VideoRateControl' ,
42220259 ,
INDEFINITE),
FieldTrial(
'WebRTC-Vp9InterLayerPred' ,
NO_BUG,
# chromium:949536
INDEFINITE),
FieldTrial(
'WebRTC-Vp9IssueKeyFrameOnLayerDeactivation' ,
40595338 ,
date(
2024 ,
4 ,
1 )),
FieldTrial(
'WebRTC-ZeroPlayoutDelay' ,
40228487 ,
date(
2024 ,
4 ,
1 )),
# keep-sorted end
])
# yapf: disable
POLICY_EXEMPT_FIELD_TRIALS_DIGEST: str = \
'20cad45453c8a63b501bd34503e1f616413f05a1'
REGISTERED_FIELD_TRIALS: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS.union(
POLICY_EXEMPT_FIELD_TRIALS)
def todays_date() -> date:
now = datetime.datetime.now(datetime.timezone.utc)
return date(now.year, now.month, now.day)
def registry_header(
field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS) -> str:
"" "Generates a C++ header with all field trial keys.
Args:
field_trials: Field trials to include
in the header.
Returns:
String representation of a C++ header file containing all field trial
keys.
>>> trials = {
... FieldTrial(
'B' ,
'' , date(
1 ,
1 ,
1 )),
... FieldTrial(
'A' ,
'' , date(
1 ,
1 ,
1 )),
... FieldTrial(
'B' ,
'' , date(
2 ,
2 ,
2 )),
... }
>>> print(registry_header(trials))
// This file was automatically generated. Do
not edit.
<BLANKLINE>
#ifndef GEN_REGISTERED_FIELD_TRIALS_H_
#define GEN_REGISTERED_FIELD_TRIALS_H_
<BLANKLINE>
#include "absl/strings/string_view.h"
<BLANKLINE>
namespace webrtc {
<BLANKLINE>
inline constexpr absl::string_view kRegisteredFieldTrials[] = {
"A" ,
"B" ,
};
<BLANKLINE>
} // namespace webrtc
<BLANKLINE>
#endif // GEN_REGISTERED_FIELD_TRIALS_H_
<BLANKLINE>
"" "
registered_keys = {f.key
for f
in field_trials}
keys =
'\n' .join(f
' "{k}",' for k
in sorted(registered_keys))
return (
'// This file was automatically generated. Do not edit.\n'
'\n'
'#ifndef GEN_REGISTERED_FIELD_TRIALS_H_\n'
'#define GEN_REGISTERED_FIELD_TRIALS_H_\n'
'\n'
'#include "absl/strings/string_view.h"\n'
'\n'
'namespace webrtc {\n'
'\n'
'inline constexpr absl::string_view kRegisteredFieldTrials[] = {\n'
f
'{keys}\n'
'};\n'
'\n'
'} // namespace webrtc\n'
'\n'
'#endif // GEN_REGISTERED_FIELD_TRIALS_H_\n')
def expired_field_trials(
threshold: date,
field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS
) -> Set[FieldTrial]:
"" "Obtains expired field trials.
Args:
threshold: Date
from which to check end date.
field_trials: Field trials to validate.
Returns:
All expired field trials.
>>> trials = {
... FieldTrial(
'Expired' ,
'' , date(
1 ,
1 ,
1 )),
... FieldTrial(
'Not-Expired' ,
'' , date(
1 ,
1 ,
2 )),
... }
>>> expired_field_trials(date(
1 ,
1 ,
1 ), trials)
{FieldTrial(key=
'Expired' , bug=
'' , end_date=datetime.date(
1 ,
1 ,
1 ))}
"" "
return {f
for f
in field_trials
if f.end_date <= threshold}
def validate_field_trials(
field_trials: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS
) -> List[str]:
"" "Validate that field trials conforms to the policy.
Args:
field_trials: Field trials to validate.
Returns:
A list of explanations
for invalid field trials.
"" "
invalid = []
sha1 = hashlib.sha1()
for trial
in sorted(POLICY_EXEMPT_FIELD_TRIALS, key=
lambda f: f.key):
sha1.update(trial.key.encode(
'ascii' ))
if sha1.hexdigest() != POLICY_EXEMPT_FIELD_TRIALS_DIGEST:
invalid.append(
'POLICY_EXEMPT_FIELD_TRIALS has been modified. Please note that '
'you must not add any new entries there. If you removed an entry '
'you should also update POLICY_EXEMPT_FIELD_TRIALS_DIGEST. The '
f
'new digest is "{sha1.hexdigest()}".' )
for trial
in field_trials:
if not trial.key.startswith(
'WebRTC-' ):
invalid.append(f
'{trial.key} does not start with "WebRTC-".' )
if trial.bug_id <=
0 :
invalid.append(f
'{trial.key} must have an associated bug.' )
if trial.end_date >= INDEFINITE:
invalid.append(f
'{trial.key} must have an end date.' )
return invalid
def cmd_header(args: argparse.Namespace) ->
None :
if not args.no_validation:
if errors := validate_field_trials():
print(
'\n' .join(sorted(errors)))
sys.exit(
1 )
args.output.write(registry_header())
def cmd_expired(args: argparse.Namespace) ->
None :
today = todays_date()
diff = datetime.timedelta(days=args.in_days)
expired = expired_field_trials(
today + diff,
ACTIVE_FIELD_TRIALS
if args.no_exempt
else REGISTERED_FIELD_TRIALS)
if len(expired) <=
0 :
return
expired_by_date = sorted(expired, key=
lambda f: (f.end_date, f.key))
print(
'\n' .join(
f
'{f.key} '
f
'{f"<{f.bug_url()}> " if f.bug_url() else ""}'
f
'{"expired" if f.end_date <= today else "expires"} on {f.end_date}'
for f
in expired_by_date))
if any(f.end_date <= today
for f
in expired_by_date):
sys.exit(
1 )
def cmd_validate(args: argparse.Namespace) ->
None :
del args
invalid = validate_field_trials()
if len(invalid) <=
0 :
return
print(
'\n' .join(sorted(invalid)))
sys.exit(
1 )
def main() ->
None :
parser = argparse.ArgumentParser()
subcommand = parser.add_subparsers(dest=
'cmd' )
parser_header = subcommand.add_parser(
'header' ,
help=
'generate C++ header file containing registered field trial keys' )
parser_header.add_argument(
'--output' ,
default=sys.stdout,
type=argparse.FileType(
'w' ),
required=
False ,
help=
'output file' )
parser_header.add_argument(
'--no-validation' ,
default=
False ,
action=
'store_true' ,
required=
False ,
help=
'whether to validate the field trials before writing' )
parser_header.set_defaults(cmd=cmd_header)
parser_expired = subcommand.add_parser(
'expired' ,
help=
'lists all expired field trials' ,
description=
'' '
Lists all expired field trials. Exits
with a non-zero exit status
if
any field trials has expired, ignoring the --
in -days argument.
'' ')
parser_expired.add_argument(
'--no-exempt' ,
default=
False ,
action=
'store_true' ,
required=
False ,
help=
'whether to include policy exempt field trials' )
parser_expired.add_argument(
'--in-days' ,
default=
0 ,
type=int,
required=
False ,
help=
'number of days relative to today to check' )
parser_expired.set_defaults(cmd=cmd_expired)
parser_validate = subcommand.add_parser(
'validate' ,
help=
'validates that all field trials conforms to the policy.' ,
description=
'' '
Validates that all field trials conforms to the policy. Exits
with a
non-zero exit status
if any field trials does
not .
'' ')
parser_validate.set_defaults(cmd=cmd_validate)
args = parser.parse_args()
if not args.cmd:
parser.print_help(sys.stderr)
sys.exit(
1 )
args.cmd(args)
if __name__ ==
'__main__' :
main()
Messung V0.5 in Prozent C=98 H=81 G=89
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-08-22)
¤
*© Formatika GbR, Deutschland