tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

field_trials.py (40794B)


      1 #!/usr/bin/env vpython3
      2 
      3 # Copyright (c) 2022 The WebRTC Project Authors. All Rights Reserved.
      4 #
      5 # Use of this source code is governed by a BSD-style license
      6 # that can be found in the LICENSE file in the root of the source
      7 # tree. An additional intellectual property rights grant can be found
      8 # in the file PATENTS.  All contributing project authors may
      9 # be found in the AUTHORS file in the root of the source tree.
     10 
     11 import datetime
     12 from datetime import date
     13 import hashlib
     14 import sys
     15 from typing import FrozenSet, List, Set
     16 
     17 import argparse
     18 import dataclasses
     19 
     20 
     21 @dataclasses.dataclass(frozen=True)
     22 class FieldTrial:
     23    """Representation of all attributes associated with a field trial.
     24 
     25    Attributes:
     26      key: Field trial key.
     27      bug_id: Associated open bug containing more context.
     28      end_date: Date when the field trial expires and must be deleted.
     29    """
     30    key: str
     31    bug_id: int
     32    end_date: date
     33 
     34    def bug_url(self) -> str:
     35        if self.bug_id <= 0:
     36            return ''
     37        return f'https://issues.webrtc.org/issues/{self.bug_id}'
     38 
     39 
     40 # As per the policy in `g3doc/field-trials.md`, all field trials should be
     41 # registered in the container below.
     42 ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([
     43    # keep-sorted start
     44    FieldTrial('WebRTC-Aec3BufferingMaxAllowedExcessRenderBlocksOverride',
     45               337900458,
     46               date(2024, 9, 1)),
     47    FieldTrial('WebRTC-Audio-GainController2',
     48               42232605,
     49               date(2024, 4, 1)),
     50    FieldTrial('WebRTC-Audio-OpusDecodeStereoByDefault',
     51               379996136,
     52               date(2025, 11, 15)),
     53    FieldTrial('WebRTC-Audio-OpusGeneratePlc',
     54               42223518,
     55               date(2025, 4, 1)),
     56    FieldTrial('WebRTC-Audio-PriorityBitrate',
     57               42226125,
     58               date(2024, 4, 1)),
     59    FieldTrial('WebRTC-AV1-OverridePriorityBitrate',
     60               42226119,
     61               date(2024, 4, 1)),
     62    FieldTrial('WebRTC-Av1-GetEncoderInfoOverride',
     63               42225234,
     64               date(2024, 4, 1)),
     65    FieldTrial('WebRTC-BitrateAdjusterUseNewfangledHeadroomAdjustment',
     66               349561566,
     67               date(2025, 8, 26)),
     68    FieldTrial('WebRTC-Bwe-LimitPacingFactorByUpperLinkCapacityEstimate',
     69               42220543,
     70               date(2025, 1, 1)),
     71    FieldTrial('WebRTC-Bwe-ResetOnAdapterIdChange',
     72               42225231,
     73               date(2025, 5, 30)),
     74    FieldTrial('WebRTC-DataChannelMessageInterleaving',
     75               41481008,
     76               date(2024, 10, 1)),
     77    FieldTrial('WebRTC-Dav1dDecoder-CropToRenderResolution',
     78               405341160,
     79               date(2026, 3, 21)),
     80    FieldTrial('WebRTC-DisableRtxRateLimiter',
     81               42225500,
     82               date(2024, 4, 1)),
     83    FieldTrial('WebRTC-DisableSslGroupIds',
     84               404763475,
     85               date(2025,9,1)),
     86    FieldTrial('WebRTC-ElasticBitrateAllocation',
     87               350555527,
     88               date(2025, 3, 1)),
     89    FieldTrial('WebRTC-EncoderDataDumpDirectory',
     90               296242528,
     91               date(2024, 4, 1)),
     92    FieldTrial('WebRTC-ForceDtls13',
     93               383141571,
     94               date(2024,9,1)),
     95    FieldTrial('WebRTC-EnableDtlsPqc',
     96               404763475,
     97               date(2026,6,1)),
     98    FieldTrial('WebRTC-HeaderExtensionNegotiateMemory',
     99               439514253,
    100               date(2026, 2, 18)),
    101    FieldTrial('WebRTC-IPv6NetworkResolutionFixes',
    102               42224598,
    103               date(2024, 4, 1)),
    104    FieldTrial('WebRTC-IncomingTimestampOnMarkerBitOnly',
    105               42224805,
    106               date(2024, 4, 1)),
    107    FieldTrial('WebRTC-IncreaseIceCandidatePriorityHostSrflx',
    108               42225331,
    109               date(2024, 4, 1)),
    110    FieldTrial('WebRTC-JitterEstimatorConfig',
    111               42224404,
    112               date(2024, 4, 1)),
    113    FieldTrial('WebRTC-LibaomAv1Encoder-DropRepeatFramesOnEnhancementLayers',
    114               445115234,
    115               date(2026, 3, 19)),
    116    FieldTrial('WebRTC-LibaomAv1Encoder-PostEncodeFrameDrop',
    117               351644568,
    118               date(2026, 1, 30)),
    119    FieldTrial('WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings',
    120               42226191,
    121               date(2024, 9, 1)),
    122    FieldTrial('WebRTC-MixedCodecSimulcast',
    123               362277533,
    124               date(2025, 9, 1)),
    125    FieldTrial('WebRTC-NoSdpMangleUfrag',
    126               375571816,
    127               date(2025, 10, 11)),
    128    FieldTrial('WebRTC-NoSdpMangleUfragRestrictedAddresses',
    129               409713509,
    130               date(2025, 10, 11)),
    131    FieldTrial('WebRTC-NoSdpMangleReject',
    132               40567530,
    133               date(2026, 6, 1)),
    134    FieldTrial('WebRTC-NoSdpMangleAllowForTesting',
    135               40567530,
    136               date(2026, 6, 1)),
    137    FieldTrial('WebRTC-Pacer-FastRetransmissions',
    138               40235589,
    139               date(2024, 4, 1)),
    140    FieldTrial('WebRTC-Pacer-KeyframeFlushing',
    141               42221435,
    142               date(2024, 4, 1)),
    143    FieldTrial('WebRTC-PostFilterKillSwitch',
    144               417439718,
    145               date(2025, 9, 1)),
    146    FieldTrial('WebRTC-QCM-Dynamic-AV1',
    147               349860657,
    148               date(2025, 7, 1)),
    149    FieldTrial('WebRTC-QCM-Dynamic-VP8',
    150               349860657,
    151               date(2025, 7, 1)),
    152    FieldTrial('WebRTC-QCM-Dynamic-VP9',
    153               349860657,
    154               date(2025, 7, 1)),
    155    FieldTrial('WebRTC-QCM-Static-AV1',
    156               349860657,
    157               date(2025, 7, 1)),
    158    FieldTrial('WebRTC-QCM-Static-VP8',
    159               349860657,
    160               date(2025, 7, 1)),
    161    FieldTrial('WebRTC-QCM-Static-VP9',
    162               349860657,
    163               date(2025, 7, 1)),
    164    FieldTrial('WebRTC-ReceiveBufferSize',
    165               42225927,
    166               date(2024, 4, 1)),
    167    FieldTrial('WebRTC-RFC8888CongestionControlFeedback',
    168               42225697,
    169               date(2025, 1, 30)),
    170    FieldTrial('WebRTC-RtcEventLogEncodeDependencyDescriptor',
    171               42225280,
    172               date(2024, 4, 1)),
    173    FieldTrial('WebRTC-RtcEventLogEncodeNetEqSetMinimumDelayKillSwitch',
    174               42225058,
    175               date(2024, 4, 1)),
    176    FieldTrial('WebRTC-Sctp-Snap',
    177               426480601,
    178               date(2026, 1, 1)),
    179    FieldTrial('WebRTC-SimulcastEncoderAdapter-DropUnalignedResolution',
    180               415329365,
    181               date(2025, 11, 2)),
    182    FieldTrial('WebRTC-SrtpRemoveReceiveStream',
    183               42225949,
    184               date(2024, 10, 1)),
    185    FieldTrial('WebRTC-SwitchEncoderFollowCodecPreferenceOrder',
    186               378566918,
    187               date(2025, 5, 1)),
    188    FieldTrial('WebRTC-SynchronousDestructors',
    189               443588673,
    190               date(2026, 7, 1)),
    191    FieldTrial('WebRTC-PayloadTypesInTransport',
    192               360058654,
    193               date(2025, 9, 11)),
    194    FieldTrial('WebRTC-TimestampExtrapolatorConfig',
    195               424739326,
    196               date(2026, 6, 30)),
    197    FieldTrial('WebRTC-UseAbsCapTimeForG2gMetric',
    198               401512883,
    199               date(2025, 9, 10)),
    200    FieldTrial('WebRTC-UseNtpTimeAbsoluteSendTime',
    201               42226305,
    202               date(2024, 9, 1)),
    203    FieldTrial('WebRTC-VP8-MaxFrameInterval',
    204               42225870,
    205               date(2024, 4, 1)),
    206    FieldTrial('WebRTC-VP9-SvcForSimulcast',
    207               347737882,
    208               date(2024, 10, 1)),
    209    FieldTrial('WebRTC-Video-CalculatePsnr',
    210               388070060,
    211               date(2026, 1, 1)),
    212    FieldTrial('WebRTC-Video-EnableRetransmitAllLayers',
    213               42225262,
    214               date(2024, 4, 1)),
    215    FieldTrial('WebRTC-Video-EncoderFallbackSettings',
    216               42231704,
    217               date(2024, 4, 1)),
    218    FieldTrial('WebRTC-VideoEncoderSettings',
    219               40252667,
    220               date(2024, 4, 1)),
    221    FieldTrial('WebRTC-Video-H26xPacketBuffer',
    222               41480904,
    223               date(2024, 6, 1)),
    224    FieldTrial('WebRTC-Video-Vp9FlexibleMode',
    225               329396373,
    226               date(2025, 6, 26)),
    227    FieldTrial('WebRTC-IceHandshakeDtls',
    228               367395350,
    229               date(2026, 1, 1)),
    230    FieldTrial('WebRTC-H265-QualityScaling',
    231               402154973,
    232               date(2026, 1, 1)),
    233    FieldTrial('WebRTC-RTP-Lifetime',
    234               440975167,
    235               date(2026, 1, 1)),
    236    # keep-sorted end
    237 ])  # yapf: disable
    238 
    239 NO_BUG = -1
    240 INDEFINITE = date(datetime.MAXYEAR, 1, 1)
    241 
    242 # These field trials precedes the policy in `g3doc/field-trials.md` and are
    243 # therefore not required to follow it. Do not add any new field trials here.
    244 # If you remove an entry you should also update
    245 # POLICY_EXEMPT_FIELD_TRIALS_DIGEST.
    246 POLICY_EXEMPT_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([
    247    # keep-sorted start
    248    FieldTrial('WebRTC-AddNetworkCostToVpn',
    249               42223280,
    250               date(2024, 4, 1)),
    251    FieldTrial('WebRTC-AddPacingToCongestionWindowPushback',
    252               42220204,
    253               date(2024, 4, 1)),
    254    FieldTrial('WebRTC-AdjustOpusBandwidth',
    255               42233664,
    256               date(2024, 4, 1)),
    257    FieldTrial('WebRTC-Aec3AecStateFullResetKillSwitch',
    258               42221578,
    259               INDEFINITE),
    260    FieldTrial('WebRTC-Aec3AecStateSubtractorAnalyzerResetKillSwitch',
    261               42221578,
    262               INDEFINITE),
    263    FieldTrial('WebRTC-Aec3AntiHowlingMinimizationKillSwitch',
    264               150764764,
    265               INDEFINITE),
    266    FieldTrial('WebRTC-Aec3ClampInstQualityToOneKillSwitch',
    267               42220991,
    268               INDEFINITE),
    269    FieldTrial('WebRTC-Aec3ClampInstQualityToZeroKillSwitch',
    270               42220991,
    271               INDEFINITE),
    272    FieldTrial('WebRTC-Aec3CoarseFilterResetHangoverKillSwitch',
    273               42222401,
    274               date(2024, 4, 1)),
    275    FieldTrial('WebRTC-Aec3ConservativeTailFreqResponse',
    276               42223361,
    277               date(2024, 4, 1)),
    278    FieldTrial('WebRTC-Aec3DeactivateInitialStateResetKillSwitch',
    279               42221578,
    280               date(2024, 4, 1)),
    281    FieldTrial('WebRTC-Aec3DelayEstimateSmoothingDelayFoundOverride',
    282               42222934,
    283               date(2024, 4, 1)),
    284    FieldTrial('WebRTC-Aec3DelayEstimateSmoothingOverride',
    285               42222934,
    286               date(2024, 4, 1)),
    287    FieldTrial('WebRTC-Aec3EchoSaturationDetectionKillSwitch',
    288               42221578,
    289               INDEFINITE),
    290    FieldTrial('WebRTC-Aec3EnforceCaptureDelayEstimationDownmixing',
    291               42221238,
    292               INDEFINITE),
    293    FieldTrial(
    294        'WebRTC-Aec3EnforceCaptureDelayEstimationLeftRightPrioritization',
    295        42221238,
    296        INDEFINITE),
    297    FieldTrial('WebRTC-Aec3EnforceConservativeHfSuppression',
    298               42222109,
    299               date(2024, 4, 1)),
    300    FieldTrial('WebRTC-Aec3EnforceLowActiveRenderLimit',
    301               42221578,
    302               INDEFINITE),
    303    FieldTrial('WebRTC-Aec3EnforceMoreTransparentNearendSuppressorHfTuning',
    304               42221589,
    305               INDEFINITE),
    306    FieldTrial('WebRTC-Aec3EnforceMoreTransparentNearendSuppressorTuning',
    307               42221578,
    308               INDEFINITE),
    309    FieldTrial('WebRTC-Aec3EnforceMoreTransparentNormalSuppressorHfTuning',
    310               42221589,
    311               INDEFINITE),
    312    FieldTrial('WebRTC-Aec3EnforceMoreTransparentNormalSuppressorTuning',
    313               42221578,
    314               INDEFINITE),
    315    FieldTrial('WebRTC-Aec3EnforceRapidlyAdjustingNearendSuppressorTunings',
    316               42221578,
    317               INDEFINITE),
    318    FieldTrial('WebRTC-Aec3EnforceRapidlyAdjustingNormalSuppressorTunings',
    319               42221578,
    320               INDEFINITE),
    321    FieldTrial('WebRTC-Aec3EnforceRenderDelayEstimationDownmixing',
    322               42221238,
    323               INDEFINITE),
    324    FieldTrial('WebRTC-Aec3EnforceSlowlyAdjustingNearendSuppressorTunings',
    325               42221578,
    326               INDEFINITE),
    327    FieldTrial('WebRTC-Aec3EnforceSlowlyAdjustingNormalSuppressorTunings',
    328               42221578,
    329               INDEFINITE),
    330    FieldTrial('WebRTC-Aec3EnforceStationarityProperties',
    331               42221578,
    332               INDEFINITE),
    333    FieldTrial('WebRTC-Aec3EnforceStationarityPropertiesAtInit',
    334               42221578,
    335               INDEFINITE),
    336    FieldTrial('WebRTC-Aec3EnforceVeryLowActiveRenderLimit',
    337               42221578,
    338               INDEFINITE),
    339    FieldTrial('WebRTC-Aec3HighPassFilterEchoReference',
    340               42222401,
    341               date(2024, 4, 1)),
    342    FieldTrial('WebRTC-Aec3MinErleDuringOnsetsKillSwitch',
    343               42220385,
    344               date(2024, 4, 1)),
    345    FieldTrial('WebRTC-Aec3NonlinearModeReverbKillSwitch',
    346               42222109,
    347               date(2024, 4, 1)),
    348    FieldTrial('WebRTC-Aec3OnsetDetectionKillSwitch',
    349               42221578,
    350               INDEFINITE),
    351    FieldTrial(
    352        'WebRTC-Aec3RenderDelayEstimationLeftRightPrioritizationKillSwitch',
    353        42221238,
    354        date(2024, 4, 1)),
    355    FieldTrial('WebRTC-Aec3SensitiveDominantNearendActivation',
    356               42221578,
    357               INDEFINITE),
    358    FieldTrial('WebRTC-Aec3SetupSpecificDefaultConfigDefaultsKillSwitch',
    359               42221236,
    360               INDEFINITE),
    361    FieldTrial('WebRTC-Aec3ShortHeadroomKillSwitch',
    362               42220385,
    363               date(2024, 4, 1)),
    364    FieldTrial('WebRTC-Aec3StereoContentDetectionKillSwitch',
    365               42225201,
    366               INDEFINITE),
    367    FieldTrial('WebRTC-Aec3SuppressorAntiHowlingGainOverride',
    368               42221589,
    369               INDEFINITE),
    370    FieldTrial('WebRTC-Aec3SuppressorDominantNearendEnrExitThresholdOverride',
    371               42221589,
    372               INDEFINITE),
    373    FieldTrial('WebRTC-Aec3SuppressorDominantNearendEnrThresholdOverride',
    374               42221589,
    375               INDEFINITE),
    376    FieldTrial('WebRTC-Aec3SuppressorDominantNearendHoldDurationOverride',
    377               42221589,
    378               INDEFINITE),
    379    FieldTrial('WebRTC-Aec3SuppressorDominantNearendSnrThresholdOverride',
    380               42221589,
    381               INDEFINITE),
    382    FieldTrial('WebRTC-Aec3SuppressorDominantNearendTriggerThresholdOverride',
    383               42221589,
    384               INDEFINITE),
    385    FieldTrial('WebRTC-Aec3SuppressorNearendHfMaskSuppressOverride',
    386               42221589,
    387               INDEFINITE),
    388    FieldTrial('WebRTC-Aec3SuppressorNearendHfMaskTransparentOverride',
    389               42221589,
    390               INDEFINITE),
    391    FieldTrial('WebRTC-Aec3SuppressorNearendLfMaskSuppressOverride',
    392               42221589,
    393               INDEFINITE),
    394    FieldTrial('WebRTC-Aec3SuppressorNearendLfMaskTransparentOverride',
    395               42221589,
    396               date(2024, 4, 1)),
    397    FieldTrial('WebRTC-Aec3SuppressorNearendMaxDecFactorLfOverride',
    398               42221589,
    399               date(2024, 4, 1)),
    400    FieldTrial('WebRTC-Aec3SuppressorNearendMaxIncFactorOverride',
    401               42221589,
    402               date(2024, 4, 1)),
    403    FieldTrial('WebRTC-Aec3SuppressorNormalHfMaskSuppressOverride',
    404               42221589,
    405               date(2024, 4, 1)),
    406    FieldTrial('WebRTC-Aec3SuppressorNormalHfMaskTransparentOverride',
    407               42221589,
    408               date(2024, 4, 1)),
    409    FieldTrial('WebRTC-Aec3SuppressorNormalLfMaskSuppressOverride',
    410               42221589,
    411               date(2024, 4, 1)),
    412    FieldTrial('WebRTC-Aec3SuppressorNormalLfMaskTransparentOverride',
    413               42221589,
    414               date(2024, 4, 1)),
    415    FieldTrial('WebRTC-Aec3SuppressorNormalMaxDecFactorLfOverride',
    416               42221589,
    417               date(2024, 4, 1)),
    418    FieldTrial('WebRTC-Aec3SuppressorNormalMaxIncFactorOverride',
    419               42221589,
    420               date(2024, 4, 1)),
    421    FieldTrial('WebRTC-Aec3SuppressorTuningOverride',
    422               42221589,
    423               date(2024, 4, 1)),
    424    FieldTrial('WebRTC-Aec3TransparentAntiHowlingGain',
    425               42221578,
    426               date(2024, 4, 1)),
    427    FieldTrial('WebRTC-Aec3TransparentModeHmm',
    428               42222401,
    429               date(2024, 4, 1)),
    430    FieldTrial('WebRTC-Aec3TransparentModeKillSwitch',
    431               42234438,
    432               date(2024, 4, 1)),
    433    FieldTrial('WebRTC-Aec3Use1Dot2SecondsInitialStateDuration',
    434               42221578,
    435               date(2024, 4, 1)),
    436    FieldTrial('WebRTC-Aec3Use1Dot6SecondsInitialStateDuration',
    437               42221578,
    438               date(2024, 4, 1)),
    439    FieldTrial('WebRTC-Aec3Use2Dot0SecondsInitialStateDuration',
    440               42221578,
    441               date(2024, 4, 1)),
    442    FieldTrial('WebRTC-Aec3UseDot1SecondsInitialStateDuration',
    443               42221578,
    444               date(2024, 4, 1)),
    445    FieldTrial('WebRTC-Aec3UseDot2SecondsInitialStateDuration',
    446               42221578,
    447               date(2024, 4, 1)),
    448    FieldTrial('WebRTC-Aec3UseDot3SecondsInitialStateDuration',
    449               42221578,
    450               date(2024, 4, 1)),
    451    FieldTrial('WebRTC-Aec3UseDot6SecondsInitialStateDuration',
    452               42221578,
    453               date(2024, 4, 1)),
    454    FieldTrial('WebRTC-Aec3UseDot9SecondsInitialStateDuration',
    455               42221578,
    456               date(2024, 4, 1)),
    457    FieldTrial('WebRTC-Aec3UseErleOnsetCompensationInDominantNearend',
    458               42222842,
    459               date(2024, 4, 1)),
    460    FieldTrial('WebRTC-Aec3UseLowEarlyReflectionsDefaultGain',
    461               42221578,
    462               date(2024, 4, 1)),
    463    FieldTrial('WebRTC-Aec3UseLowLateReflectionsDefaultGain',
    464               42221578,
    465               date(2024, 4, 1)),
    466    FieldTrial('WebRTC-Aec3UseNearendReverbLen',
    467               42223329,
    468               INDEFINITE),
    469    FieldTrial('WebRTC-Aec3UseShortConfigChangeDuration',
    470               42221578,
    471               date(2024, 4, 1)),
    472    FieldTrial('WebRTC-Aec3UseZeroInitialStateDuration',
    473               42221578,
    474               date(2024, 4, 1)),
    475    FieldTrial('WebRTC-Aec3VerySensitiveDominantNearendActivation',
    476               42221578,
    477               date(2024, 4, 1)),
    478    FieldTrial('WebRTC-Agc2SimdAvx2KillSwitch',
    479               42232605,
    480               date(2024, 4, 1)),
    481    FieldTrial('WebRTC-Agc2SimdNeonKillSwitch',
    482               42232605,
    483               date(2024, 4, 1)),
    484    FieldTrial('WebRTC-Agc2SimdSse2KillSwitch',
    485               42232605,
    486               date(2024, 4, 1)),
    487    FieldTrial('WebRTC-AllowMACBasedIPv6',
    488               41480878,
    489               date(2024, 4, 1)),
    490    FieldTrial('WebRTC-AlrDetectorParameters',
    491               42220590,
    492               INDEFINITE),
    493    FieldTrial('WebRTC-AndroidNetworkMonitor-IsAdapterAvailable',
    494               42223964,
    495               date(2024, 4, 1)),
    496    FieldTrial('WebRTC-ApmExperimentalMultiChannelCaptureKillSwitch',
    497               42225202,
    498               INDEFINITE),
    499    FieldTrial('WebRTC-ApmExperimentalMultiChannelRenderKillSwitch',
    500               42225203,
    501               INDEFINITE),
    502    FieldTrial('WebRTC-Audio-2ndAgcMinMicLevelExperiment',
    503               40207112,
    504               date(2024, 4, 1)),
    505    FieldTrial('WebRTC-Audio-ABWENoTWCC',
    506               42233370,
    507               INDEFINITE),
    508    FieldTrial('WebRTC-Audio-AdaptivePtime',
    509               40694579,
    510               date(2024, 4, 1)),
    511    FieldTrial('WebRTC-Audio-Allocation',
    512               42220324,
    513               INDEFINITE),
    514    FieldTrial('WebRTC-Audio-AlrProbing',
    515               42220234,
    516               date(2024, 4, 1)),
    517    FieldTrial('WebRTC-Audio-LegacyOverhead',
    518               42221084,
    519               INDEFINITE),
    520    FieldTrial('WebRTC-Audio-MinimizeResamplingOnMobile',
    521               42231221,
    522               date(2024, 4, 1)),
    523    FieldTrial('WebRTC-Audio-NetEqDecisionLogicConfig',
    524               42223518,
    525               date(2024, 4, 1)),
    526    FieldTrial('WebRTC-Audio-NetEqDelayManagerConfig',
    527               42220376,
    528               date(2024, 4, 1)),
    529    FieldTrial('WebRTC-Audio-NetEqNackTrackerConfig',
    530               42220211,
    531               date(2024, 4, 1)),
    532    FieldTrial('WebRTC-Audio-NetEqSmartFlushing',
    533               42222334,
    534               date(2024, 4, 1)),
    535    FieldTrial('WebRTC-Audio-OpusBitrateMultipliers',
    536               42221139,
    537               date(2024, 4, 1)),
    538    FieldTrial('WebRTC-Audio-Red-For-Opus',
    539               42221750,
    540               date(2024, 4, 1)),
    541    FieldTrial('WebRTC-Audio-iOS-Holding',
    542               42233253,
    543               date(2024, 4, 1)),
    544    FieldTrial('WebRTC-AudioDevicePlayoutBufferSizeFactor',
    545               42221006,
    546               date(2024, 4, 1)),
    547    FieldTrial('WebRTC-BindUsingInterfaceName',
    548               42220770,
    549               date(2024, 4, 1)),
    550    FieldTrial('WebRTC-Bwe-AllocationProbing',
    551               42220440,
    552               date(2024, 4, 1)),
    553    FieldTrial('WebRTC-Bwe-AlrProbing',
    554               42220440,
    555               date(2024, 4, 1)),
    556    FieldTrial('WebRTC-Bwe-EstimateBoundedIncrease',
    557               42220543,
    558               date(2024, 4, 1)),
    559    FieldTrial('WebRTC-Bwe-ExponentialProbing',
    560               42220440,
    561               date(2024, 4, 1)),
    562    FieldTrial('WebRTC-Bwe-IgnoreProbesLowerThanNetworkStateEstimate',
    563               42220543,
    564               date(2024, 4, 1)),
    565    FieldTrial('WebRTC-Bwe-InitialProbing',
    566               42220440,
    567               date(2024, 4, 1)),
    568    FieldTrial('WebRTC-Bwe-InjectedCongestionController',
    569               'webrtc:8415',
    570               INDEFINITE),
    571    FieldTrial('WebRTC-Bwe-LimitProbesLowerThanThroughputEstimate',
    572               42221601,
    573               date(2024, 4, 1)),
    574    FieldTrial('WebRTC-Bwe-LossBasedBweV2',
    575               42222865,
    576               date(2024, 4, 1)),
    577    FieldTrial('WebRTC-Bwe-MaxRttLimit',
    578               42234928,
    579               INDEFINITE),
    580    FieldTrial('WebRTC-Bwe-MinAllocAsLowerBound',
    581               NO_BUG,
    582               date(2024, 4, 1)),
    583    FieldTrial('WebRTC-Bwe-NetworkRouteConstraints',
    584               42221535,
    585               date(2024, 4, 1)),
    586    FieldTrial('WebRTC-Bwe-NoFeedbackReset',
    587               42234928,
    588               date(2024, 4, 1)),
    589    FieldTrial('WebRTC-Bwe-ProbingBehavior',
    590               42220440,
    591               date(2024, 4, 1)),
    592    FieldTrial('WebRTC-Bwe-ProbingConfiguration',
    593               42220440,
    594               date(2024, 4, 1)),
    595    FieldTrial('WebRTC-Bwe-ReceiveTimeFix',
    596               42234228,
    597               date(2024, 4, 1)),
    598    FieldTrial('WebRTC-Bwe-ReceiverLimitCapsOnly',
    599               42222445,
    600               date(2024, 4, 1)),
    601    FieldTrial('WebRTC-Bwe-RobustThroughputEstimatorSettings',
    602               42220312,
    603               date(2024, 4, 1)),
    604    FieldTrial('WebRTC-Bwe-SafeResetOnRouteChange',
    605               42234928,
    606               INDEFINITE),
    607    FieldTrial('WebRTC-Bwe-SeparateAudioPackets',
    608               42221011,
    609               date(2024, 4, 1)),
    610    FieldTrial('WebRTC-Bwe-TrendlineEstimatorSettings',
    611               42221011,
    612               date(2024, 4, 1)),
    613    FieldTrial('WebRTC-BweBackOffFactor',
    614               42233342,
    615               INDEFINITE),
    616    FieldTrial('WebRTC-BweLossExperiment',
    617               42230863,
    618               date(2024, 4, 1)),
    619    FieldTrial('WebRTC-BweRapidRecoveryExperiment',
    620               42233136,
    621               date(2024, 4, 1)),
    622    FieldTrial('WebRTC-BweThroughputWindowConfig',
    623               42220312,
    624               date(2024, 4, 1)),
    625    FieldTrial('WebRTC-BweWindowSizeInPackets',
    626               42233342,
    627               INDEFINITE),
    628    FieldTrial('WebRTC-CongestionWindow',
    629               42225197,
    630               INDEFINITE),
    631    FieldTrial('WebRTC-CpuLoadEstimator',
    632               42233645,
    633               date(2024, 4, 1)),
    634    FieldTrial('WebRTC-Debugging-RtpDump',
    635               42220735,
    636               INDEFINITE),
    637    FieldTrial('WebRTC-DecoderDataDumpDirectory',
    638               42224491,
    639               INDEFINITE),
    640    FieldTrial('WebRTC-DefaultBitrateLimitsKillSwitch',
    641               NO_BUG,
    642               date(2024, 4, 1)),
    643    FieldTrial('WebRTC-DependencyDescriptorAdvertised',
    644               42220386,
    645               date(2024, 4, 1)),
    646    FieldTrial('WebRTC-DisableUlpFecExperiment',
    647               NO_BUG,
    648               date(2024, 4, 1)),
    649    FieldTrial('WebRTC-DontIncreaseDelayBasedBweInAlr',
    650               42220590,
    651               date(2024, 4, 1)),
    652    FieldTrial('WebRTC-DscpFieldTrial',
    653               42223835,
    654               date(2024, 4, 1)),
    655    FieldTrial('WebRTC-ExtraICEPing',
    656               42220311,
    657               date(2024, 4, 1)),
    658    FieldTrial('WebRTC-FakeNetworkReceiveConfig',
    659               42224493,
    660               INDEFINITE),
    661    FieldTrial('WebRTC-FakeNetworkSendConfig',
    662               42224493,
    663               INDEFINITE),
    664    FieldTrial('WebRTC-FilterAbsSendTimeExtension',
    665               42220271,
    666               INDEFINITE),
    667    FieldTrial('WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart',
    668               42221149,
    669               date(2024, 4, 1)),
    670    FieldTrial('WebRTC-FlexFEC-03',
    671               42230680,
    672               date(2024, 4, 1)),
    673    FieldTrial('WebRTC-FlexFEC-03-Advertised',
    674               42230680,
    675               date(2024, 4, 1)),
    676    FieldTrial('WebRTC-ForcePlayoutDelay',
    677               42222016,
    678               INDEFINITE),
    679    FieldTrial('WebRTC-ForceSendPlayoutDelay',
    680               42222016,
    681               INDEFINITE),
    682    FieldTrial('WebRTC-ForceSimulatedOveruseIntervalMs',
    683               42224494,
    684               INDEFINITE),
    685    FieldTrial('WebRTC-FrameDropper',
    686               42234921,
    687               INDEFINITE),
    688    FieldTrial('WebRTC-FullBandHpfKillSwitch',
    689               42221279,
    690               date(2024, 4, 1)),
    691    FieldTrial('WebRTC-GenericCodecDependencyDescriptor',
    692               42225273,
    693               INDEFINITE),
    694    FieldTrial('WebRTC-GenericDescriptorAdvertised',
    695               42234553,
    696               INDEFINITE),
    697    FieldTrial('WebRTC-GenericDescriptorAuth',
    698               42220132,
    699               INDEFINITE),
    700    FieldTrial('WebRTC-GenericPictureId',
    701               42234553,
    702               INDEFINITE),
    703    FieldTrial('WebRTC-GetEncoderInfoOverride',
    704               NO_BUG,
    705               date(2024, 4, 1)),
    706    FieldTrial('WebRTC-H264HighProfile',
    707               41481030,
    708               date(2024, 4, 1)),
    709    FieldTrial('WebRTC-IPv6Default',
    710               NO_BUG,  # chromium:413437
    711               date(2024, 4, 1)),
    712    FieldTrial('WebRTC-IceControllerFieldTrials',
    713               40658968,
    714               INDEFINITE),
    715    FieldTrial('WebRTC-IceFieldTrials',
    716               42221103,
    717               INDEFINITE),
    718    FieldTrial('WebRTC-KeyframeInterval',
    719               42220470,
    720               INDEFINITE),
    721    FieldTrial('WebRTC-LegacyFrameIdJumpBehavior',
    722               42223541,
    723               date(2024, 4, 1)),
    724    FieldTrial('WebRTC-LegacySimulcastLayerLimit',
    725               42233936,
    726               INDEFINITE),
    727    FieldTrial('WebRTC-LowresSimulcastBitrateInterpolation',
    728               42222558,
    729               date(2024, 4, 1)),
    730    FieldTrial('WebRTC-MutedStateKillSwitch',
    731               177830919,
    732               date(2024, 4, 1)),
    733    FieldTrial('WebRTC-Network-UseNWPathMonitor',
    734               42221045,
    735               date(2024, 4, 1)),
    736    FieldTrial('WebRTC-NetworkMonitorAutoDetect',
    737               42223964,
    738               date(2024, 4, 1)),
    739    FieldTrial('WebRTC-NormalizeSimulcastResolution',
    740               NO_BUG,
    741               INDEFINITE),
    742    FieldTrial('WebRTC-Pacer-BlockAudio',
    743               42233548,
    744               INDEFINITE),
    745    FieldTrial('WebRTC-Pacer-DrainQueue',
    746               42233548,
    747               date(2024, 4, 1)),
    748    FieldTrial('WebRTC-Pacer-IgnoreTransportOverhead',
    749               42235102,
    750               INDEFINITE),
    751    FieldTrial('WebRTC-Pacer-PadInSilence',
    752               42233548,
    753               date(2024, 4, 1)),
    754    FieldTrial('WebRTC-PacketBufferMaxSize',
    755               42235070,
    756               INDEFINITE),
    757    FieldTrial('WebRTC-PcFactoryDefaultBitrates',
    758               42220941,
    759               date(2024, 4, 1)),
    760    FieldTrial('WebRTC-PiggybackIceCheckAcknowledgement',
    761               NO_BUG,
    762               date(2024, 4, 1)),
    763    FieldTrial('WebRTC-PixelLimitResource',
    764               42222397,
    765               INDEFINITE),
    766    FieldTrial('WebRTC-ProbingScreenshareBwe',
    767               42232804,
    768               date(2024, 4, 1)),
    769    FieldTrial('WebRTC-ProtectionOverheadRateThreshold',
    770               42225198,
    771               INDEFINITE),
    772    FieldTrial('WebRTC-QpParsingKillSwitch',
    773               42222690,
    774               date(2024, 4, 1)),
    775    FieldTrial('WebRTC-RtcEventLogKillSwitch',
    776               42222210,
    777               INDEFINITE),
    778    FieldTrial('WebRTC-RtcEventLogNewFormat',
    779               42233237,
    780               date(2024, 4, 1)),
    781    FieldTrial('WebRTC-RtcpLossNotification',
    782               42220379,
    783               date(2024, 4, 1)),
    784    FieldTrial('WebRTC-SendBufferSizeBytes',
    785               42222026,
    786               date(2024, 4, 1)),
    787    FieldTrial('WebRTC-SendNackDelayMs',
    788               42235176,
    789               date(2024, 4, 1)),
    790    FieldTrial('WebRTC-SetSocketReceiveBuffer',
    791               42223976,
    792               date(2024, 4, 1)),
    793    FieldTrial('WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride',
    794               NO_BUG,
    795               date(2024, 4, 1)),
    796    FieldTrial('WebRTC-SimulcastLayerLimitRoundUp',
    797               NO_BUG,
    798               date(2024, 4, 1)),
    799    FieldTrial('WebRTC-SpsPpsIdrIsH264Keyframe',
    800               42233557,
    801               INDEFINITE),
    802    FieldTrial('WebRTC-StrictPacingAndProbing',
    803               42233198,
    804               date(2024, 4, 1)),
    805    FieldTrial('WebRTC-StunInterPacketDelay',
    806               NO_BUG,
    807               date(2024, 4, 1)),
    808    FieldTrial('WebRTC-SurfaceCellularTypes',
    809               42221576,
    810               date(2024, 4, 1)),
    811    FieldTrial('WebRTC-SwitchEncoderOnInitializationFailures',
    812               42223783,
    813               date(2024, 4, 1)),
    814    FieldTrial('WebRTC-Target-Bitrate-Rtcp',
    815               42235192,
    816               INDEFINITE),
    817    FieldTrial('WebRTC-TransientSuppressorForcedOff',
    818               40172597,
    819               INDEFINITE),
    820    FieldTrial('WebRTC-UseBaseHeavyVP8TL3RateAllocation',
    821               42234670,
    822               date(2024, 4, 1)),
    823    FieldTrial('WebRTC-UseDifferentiatedCellularCosts',
    824               42221576,
    825               date(2024, 4, 1)),
    826    FieldTrial('WebRTC-UseStandardBytesStats',
    827               42220573,
    828               date(2024, 4, 1)),
    829    FieldTrial('WebRTC-UseTurnServerAsStunServer',
    830               42221142,
    831               date(2024, 4, 1)),
    832    FieldTrial('WebRTC-VP8-ForcePartitionResilience',
    833               42221952,
    834               INDEFINITE),
    835    FieldTrial('WebRTC-VP8-Forced-Fallback-Encoder-v2',
    836               42231704,
    837               INDEFINITE),
    838    FieldTrial('WebRTC-VP8-GetEncoderInfoOverride',
    839               42221952,
    840               INDEFINITE),
    841    FieldTrial('WebRTC-VP8-Postproc-Config',
    842               42221657,
    843               date(2024, 4, 1)),
    844    FieldTrial('WebRTC-VP8-Postproc-Config-Arm',
    845               42231704,
    846               INDEFINITE),
    847    FieldTrial('WebRTC-VP8IosMaxNumberOfThread',
    848               42220027,
    849               date(2024, 4, 1)),
    850    FieldTrial('WebRTC-VP9-GetEncoderInfoOverride',
    851               NO_BUG,
    852               date(2024, 4, 1)),
    853    FieldTrial('WebRTC-VP9-LowTierOptimizations',
    854               42224122,
    855               date(2024, 4, 1)),
    856    FieldTrial('WebRTC-VP9-PerformanceFlags',
    857               42221657,
    858               date(2024, 4, 1)),
    859    FieldTrial('WebRTC-VP9QualityScaler',
    860               42221411,
    861               date(2024, 4, 1)),
    862    FieldTrial('WebRTC-Video-BalancedDegradation',
    863               42232717,
    864               INDEFINITE),
    865    FieldTrial('WebRTC-Video-BalancedDegradationSettings',
    866               NO_BUG,
    867               INDEFINITE),
    868    FieldTrial('WebRTC-Video-DisableAutomaticResize',
    869               42221931,
    870               date(2024, 4, 1)),
    871    FieldTrial('WebRTC-Video-DiscardPacketsWithUnknownSsrc',
    872               42235091,
    873               INDEFINITE),
    874    FieldTrial('WebRTC-Video-ForcedSwDecoderFallback',
    875               NO_BUG,
    876               INDEFINITE),
    877    FieldTrial('WebRTC-Video-InitialDecoderResolution',
    878               42222018,
    879               date(2024, 4, 1)),
    880    FieldTrial('WebRTC-Video-MinVideoBitrate',
    881               42220993,
    882               date(2024, 4, 1)),
    883    FieldTrial('WebRTC-Video-Pacing',
    884               42220062,
    885               date(2024, 4, 1)),
    886    FieldTrial('WebRTC-Video-PreferTemporalSupportOnBaseLayer',
    887               42221417,
    888               INDEFINITE),
    889    FieldTrial('WebRTC-Video-QualityScalerSettings',
    890               NO_BUG,
    891               INDEFINITE),
    892    FieldTrial('WebRTC-Video-QualityScaling',
    893               42234348,
    894               INDEFINITE),
    895    FieldTrial('WebRTC-Video-UseFrameRateForOverhead',
    896               166341943,
    897               date(2024, 4, 1)),
    898    FieldTrial('WebRTC-VideoFrameTrackingIdAdvertised',
    899               42222747,
    900               INDEFINITE),
    901    FieldTrial('WebRTC-VideoLayersAllocationAdvertised',
    902               42222126,
    903               INDEFINITE),
    904    FieldTrial('WebRTC-VideoRateControl',
    905               42220259,
    906               INDEFINITE),
    907    FieldTrial('WebRTC-Vp9InterLayerPred',
    908               NO_BUG,  # chromium:949536
    909               INDEFINITE),
    910    FieldTrial('WebRTC-Vp9IssueKeyFrameOnLayerDeactivation',
    911               40595338,
    912               date(2024, 4, 1)),
    913    FieldTrial('WebRTC-ZeroPlayoutDelay',
    914               40228487,
    915               date(2024, 4, 1)),
    916    # keep-sorted end
    917 ])  # yapf: disable
    918 
    919 POLICY_EXEMPT_FIELD_TRIALS_DIGEST: str = \
    920    '625f8d689ab8bcfe4118347c6f8c852e3ac372c7'
    921 
    922 REGISTERED_FIELD_TRIALS: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS.union(
    923    POLICY_EXEMPT_FIELD_TRIALS)
    924 
    925 
    926 def todays_date() -> date:
    927    now = datetime.datetime.now(datetime.timezone.utc)
    928    return date(now.year, now.month, now.day)
    929 
    930 
    931 def registry_header(
    932        field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS) -> str:
    933    """Generates a C++ header with all field trial keys.
    934 
    935    Args:
    936      field_trials: Field trials to include in the header.
    937 
    938    Returns:
    939      String representation of a C++ header file containing all field trial
    940      keys.
    941 
    942    >>> trials = {
    943    ...     FieldTrial('B', '', date(1, 1, 1)),
    944    ...     FieldTrial('A', '', date(1, 1, 1)),
    945    ...     FieldTrial('B', '', date(2, 2, 2)),
    946    ... }
    947    >>> print(registry_header(trials))
    948    // This file was automatically generated. Do not edit.
    949    <BLANKLINE>
    950    #ifndef GEN_REGISTERED_FIELD_TRIALS_H_
    951    #define GEN_REGISTERED_FIELD_TRIALS_H_
    952    <BLANKLINE>
    953    #include "absl/strings/string_view.h"
    954    <BLANKLINE>
    955    namespace webrtc {
    956    <BLANKLINE>
    957    inline constexpr absl::string_view kRegisteredFieldTrials[] = {
    958        "A",
    959        "B",
    960    };
    961    <BLANKLINE>
    962    }  // namespace webrtc
    963    <BLANKLINE>
    964    #endif  // GEN_REGISTERED_FIELD_TRIALS_H_
    965    <BLANKLINE>
    966    """
    967    registered_keys = {f.key for f in field_trials}
    968    keys = '\n'.join(f'    "{k}",' for k in sorted(registered_keys))
    969    return ('// This file was automatically generated. Do not edit.\n'
    970            '\n'
    971            '#ifndef GEN_REGISTERED_FIELD_TRIALS_H_\n'
    972            '#define GEN_REGISTERED_FIELD_TRIALS_H_\n'
    973            '\n'
    974            '#include "absl/strings/string_view.h"\n'
    975            '\n'
    976            'namespace webrtc {\n'
    977            '\n'
    978            'inline constexpr absl::string_view kRegisteredFieldTrials[] = {\n'
    979            f'{keys}\n'
    980            '};\n'
    981            '\n'
    982            '}  // namespace webrtc\n'
    983            '\n'
    984            '#endif  // GEN_REGISTERED_FIELD_TRIALS_H_\n')
    985 
    986 
    987 def expired_field_trials(
    988    threshold: date,
    989    field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS
    990 ) -> Set[FieldTrial]:
    991    """Obtains expired field trials.
    992 
    993    Args:
    994      threshold: Date from which to check end date.
    995      field_trials: Field trials to validate.
    996 
    997    Returns:
    998      All expired field trials.
    999 
   1000    >>> trials = {
   1001    ...     FieldTrial('Expired', '', date(1, 1, 1)),
   1002    ...     FieldTrial('Not-Expired', '', date(1, 1, 2)),
   1003    ... }
   1004    >>> expired_field_trials(date(1, 1, 1), trials)
   1005    {FieldTrial(key='Expired', bug='', end_date=datetime.date(1, 1, 1))}
   1006    """
   1007    return {f for f in field_trials if f.end_date <= threshold}
   1008 
   1009 
   1010 def validate_field_trials(
   1011        field_trials: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS
   1012 ) -> List[str]:
   1013    """Validate that field trials conforms to the policy.
   1014 
   1015    Args:
   1016      field_trials: Field trials to validate.
   1017 
   1018    Returns:
   1019      A list of explanations for invalid field trials.
   1020    """
   1021    invalid = []
   1022 
   1023    sha1 = hashlib.sha1()
   1024    for trial in sorted(POLICY_EXEMPT_FIELD_TRIALS, key=lambda f: f.key):
   1025        sha1.update(trial.key.encode('ascii'))
   1026    if sha1.hexdigest() != POLICY_EXEMPT_FIELD_TRIALS_DIGEST:
   1027        invalid.append(
   1028            'POLICY_EXEMPT_FIELD_TRIALS has been modified. Please note that '
   1029            'you must not add any new entries there. If you removed an entry '
   1030            'you should also update POLICY_EXEMPT_FIELD_TRIALS_DIGEST. The '
   1031            f'new digest is "{sha1.hexdigest()}".')
   1032 
   1033    for trial in field_trials:
   1034        if not trial.key.startswith('WebRTC-'):
   1035            invalid.append(f'{trial.key} does not start with "WebRTC-".')
   1036        if trial.bug_id <= 0:
   1037            invalid.append(f'{trial.key} must have an associated bug.')
   1038        if trial.end_date >= INDEFINITE:
   1039            invalid.append(f'{trial.key} must have an end date.')
   1040 
   1041    return invalid
   1042 
   1043 
   1044 def cmd_header(args: argparse.Namespace) -> None:
   1045    if not args.no_validation:
   1046        if errors := validate_field_trials():
   1047            print('\n'.join(sorted(errors)))
   1048            sys.exit(1)
   1049 
   1050    args.output.write(registry_header())
   1051 
   1052 
   1053 def cmd_expired(args: argparse.Namespace) -> None:
   1054    today = todays_date()
   1055    diff = datetime.timedelta(days=args.in_days)
   1056    expired = expired_field_trials(
   1057        today + diff,
   1058        ACTIVE_FIELD_TRIALS if args.no_exempt else REGISTERED_FIELD_TRIALS)
   1059 
   1060    if len(expired) <= 0:
   1061        return
   1062 
   1063    expired_by_date = sorted(expired, key=lambda f: (f.end_date, f.key))
   1064    print('\n'.join(
   1065        f'{f.key} '
   1066        f'{f"<{f.bug_url()}> " if f.bug_url() else ""}'
   1067        f'{"expired" if f.end_date <= today else "expires"} on {f.end_date}'
   1068        for f in expired_by_date))
   1069    if any(f.end_date <= today for f in expired_by_date):
   1070        sys.exit(1)
   1071 
   1072 
   1073 def cmd_validate(args: argparse.Namespace) -> None:
   1074    del args
   1075    invalid = validate_field_trials()
   1076 
   1077    if len(invalid) <= 0:
   1078        return
   1079 
   1080    print('\n'.join(sorted(invalid)))
   1081    sys.exit(1)
   1082 
   1083 
   1084 def main() -> None:
   1085    parser = argparse.ArgumentParser()
   1086    subcommand = parser.add_subparsers(dest='cmd')
   1087 
   1088    parser_header = subcommand.add_parser(
   1089        'header',
   1090        help='generate C++ header file containing registered field trial keys')
   1091    parser_header.add_argument('--output',
   1092                               default=sys.stdout,
   1093                               type=argparse.FileType('w'),
   1094                               required=False,
   1095                               help='output file')
   1096    parser_header.add_argument(
   1097        '--no-validation',
   1098        default=False,
   1099        action='store_true',
   1100        required=False,
   1101        help='whether to validate the field trials before writing')
   1102    parser_header.set_defaults(cmd=cmd_header)
   1103 
   1104    parser_expired = subcommand.add_parser(
   1105        'expired',
   1106        help='lists all expired field trials',
   1107        description='''
   1108        Lists all expired field trials. Exits with a non-zero exit status if
   1109        any field trials has expired, ignoring the --in-days argument.
   1110        ''')
   1111    parser_expired.add_argument(
   1112        '--no-exempt',
   1113        default=False,
   1114        action='store_true',
   1115        required=False,
   1116        help='whether to include policy exempt field trials')
   1117    parser_expired.add_argument(
   1118        '--in-days',
   1119        default=0,
   1120        type=int,
   1121        required=False,
   1122        help='number of days relative to today to check')
   1123    parser_expired.set_defaults(cmd=cmd_expired)
   1124 
   1125    parser_validate = subcommand.add_parser(
   1126        'validate',
   1127        help='validates that all field trials conforms to the policy.',
   1128        description='''
   1129        Validates that all field trials conforms to the policy. Exits with a
   1130        non-zero exit status if any field trials does not.
   1131        ''')
   1132    parser_validate.set_defaults(cmd=cmd_validate)
   1133 
   1134    args = parser.parse_args()
   1135 
   1136    if not args.cmd:
   1137        parser.print_help(sys.stderr)
   1138        sys.exit(1)
   1139 
   1140    args.cmd(args)
   1141 
   1142 
   1143 if __name__ == '__main__':
   1144    main()