From 5543a967cd985cf2444a36b0c1f376e83186548f Mon Sep 17 00:00:00 2001 From: Emil Lundmark Date: Fri, 22 Sep 2023 17:07:24 +0200 Subject: [PATCH] Add sub-command for validating that field trials conforms to the policy Bug: webrtc:14154 Change-Id: I2c12351abaa956ca5a38ab911c8cf887b4453958 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/321184 Reviewed-by: Harald Alvestrand Commit-Queue: Emil Lundmark Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/heads/main@{#40818} --- experiments/field_trials.py | 67 ++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/experiments/field_trials.py b/experiments/field_trials.py index d69bd02ca0..d9ac201fd4 100755 --- a/experiments/field_trials.py +++ b/experiments/field_trials.py @@ -11,7 +11,7 @@ import datetime from datetime import date import sys -from typing import FrozenSet, Set +from typing import FrozenSet, List, Set import argparse import dataclasses @@ -32,11 +32,29 @@ class FieldTrial: # As per the policy in `g3doc/field-trials.md`, all field trials should be -# registered in the container below. Please keep the keys sorted. -REGISTERED_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ +# registered in the container below. +ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ + # keep-sorted start FieldTrial('', '', date(1, 1, 1)), # TODO(bugs.webrtc.org/14154): Populate + # keep-sorted end ]) +# 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. +POLICY_EXEMPT_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ + # keep-sorted start + FieldTrial('', '', date(1, 1, 1)), # TODO(bugs.webrtc.org/14154): Populate + # keep-sorted end +]) + +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: @@ -117,13 +135,32 @@ def expired_field_trials( 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 = [] + for trial in field_trials: + if not trial.key.startswith('WebRTC-'): + invalid.append(f'{trial.key} does not start with "WebRTC-".') + if len(trial.bug) <= 0: + invalid.append(f'{trial.key} must have an associated bug.') + return invalid + + def cmd_header(args: argparse.Namespace) -> None: args.output.write(registry_header()) def cmd_expired(args: argparse.Namespace) -> None: - now = datetime.datetime.now(datetime.timezone.utc) - today = date(now.year, now.month, now.day) + today = todays_date() diff = datetime.timedelta(days=args.in_days) expired = expired_field_trials(today + diff) @@ -138,6 +175,17 @@ def cmd_expired(args: argparse.Namespace) -> None: 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') @@ -167,6 +215,15 @@ def main() -> None: 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: