xref: /aosp_15_r20/external/webrtc/experiments/field_trials.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker#!/usr/bin/env vpython3
2*d9f75844SAndroid Build Coastguard Worker
3*d9f75844SAndroid Build Coastguard Worker# Copyright (c) 2022 The WebRTC Project Authors. All Rights Reserved.
4*d9f75844SAndroid Build Coastguard Worker#
5*d9f75844SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license
6*d9f75844SAndroid Build Coastguard Worker# that can be found in the LICENSE file in the root of the source
7*d9f75844SAndroid Build Coastguard Worker# tree. An additional intellectual property rights grant can be found
8*d9f75844SAndroid Build Coastguard Worker# in the file PATENTS.  All contributing project authors may
9*d9f75844SAndroid Build Coastguard Worker# be found in the AUTHORS file in the root of the source tree.
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Workerimport sys
12*d9f75844SAndroid Build Coastguard Workerfrom typing import Set
13*d9f75844SAndroid Build Coastguard Worker
14*d9f75844SAndroid Build Coastguard Workerimport argparse
15*d9f75844SAndroid Build Coastguard Workerimport dataclasses
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker# TODO(bugs.webrtc.org/14154): End date and bug should also be stored.
19*d9f75844SAndroid Build Coastguard Worker@dataclasses.dataclass(frozen=True)
20*d9f75844SAndroid Build Coastguard Workerclass FieldTrial:
21*d9f75844SAndroid Build Coastguard Worker  """Representation of all attributes associated with a field trial.
22*d9f75844SAndroid Build Coastguard Worker
23*d9f75844SAndroid Build Coastguard Worker  Attributes:
24*d9f75844SAndroid Build Coastguard Worker    key: Field trial key.
25*d9f75844SAndroid Build Coastguard Worker  """
26*d9f75844SAndroid Build Coastguard Worker  key: str
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker
29*d9f75844SAndroid Build Coastguard Worker# As per the policy in `g3doc/field-trials.md`, all field trials should be
30*d9f75844SAndroid Build Coastguard Worker# registered in the container below. Please keep the keys sorted.
31*d9f75844SAndroid Build Coastguard WorkerREGISTERED_FIELD_TRIALS: Set[FieldTrial] = {
32*d9f75844SAndroid Build Coastguard Worker    FieldTrial(''),  # TODO(bugs.webrtc.org/14154): Populate
33*d9f75844SAndroid Build Coastguard Worker}
34*d9f75844SAndroid Build Coastguard Worker
35*d9f75844SAndroid Build Coastguard Worker
36*d9f75844SAndroid Build Coastguard Workerdef RegistryHeader(field_trials: Set[FieldTrial] = None) -> str:
37*d9f75844SAndroid Build Coastguard Worker  """Generates a C++ header with all field trial keys.
38*d9f75844SAndroid Build Coastguard Worker
39*d9f75844SAndroid Build Coastguard Worker  Args:
40*d9f75844SAndroid Build Coastguard Worker    field_trials: Field trials to include in the header.
41*d9f75844SAndroid Build Coastguard Worker
42*d9f75844SAndroid Build Coastguard Worker  Returns:
43*d9f75844SAndroid Build Coastguard Worker    String representation of a C++ header file containing all field trial keys.
44*d9f75844SAndroid Build Coastguard Worker
45*d9f75844SAndroid Build Coastguard Worker  >>> trials = {FieldTrial('B'), FieldTrial('A'), FieldTrial('B')}
46*d9f75844SAndroid Build Coastguard Worker  >>> print(RegistryHeader(trials))
47*d9f75844SAndroid Build Coastguard Worker  // This file was automatically generated. Do not edit.
48*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
49*d9f75844SAndroid Build Coastguard Worker  #ifndef GEN_REGISTERED_FIELD_TRIALS_H_
50*d9f75844SAndroid Build Coastguard Worker  #define GEN_REGISTERED_FIELD_TRIALS_H_
51*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
52*d9f75844SAndroid Build Coastguard Worker  #include "absl/strings/string_view.h"
53*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
54*d9f75844SAndroid Build Coastguard Worker  namespace webrtc {
55*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
56*d9f75844SAndroid Build Coastguard Worker  inline constexpr absl::string_view kRegisteredFieldTrials[] = {
57*d9f75844SAndroid Build Coastguard Worker      "A",
58*d9f75844SAndroid Build Coastguard Worker      "B",
59*d9f75844SAndroid Build Coastguard Worker  };
60*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
61*d9f75844SAndroid Build Coastguard Worker  }  // namespace webrtc
62*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
63*d9f75844SAndroid Build Coastguard Worker  #endif  // GEN_REGISTERED_FIELD_TRIALS_H_
64*d9f75844SAndroid Build Coastguard Worker  <BLANKLINE>
65*d9f75844SAndroid Build Coastguard Worker  """
66*d9f75844SAndroid Build Coastguard Worker  if not field_trials:
67*d9f75844SAndroid Build Coastguard Worker    field_trials = REGISTERED_FIELD_TRIALS
68*d9f75844SAndroid Build Coastguard Worker  registered_keys = [f.key for f in field_trials]
69*d9f75844SAndroid Build Coastguard Worker  keys = '\n'.join(f'    "{k}",' for k in sorted(registered_keys))
70*d9f75844SAndroid Build Coastguard Worker  return ('// This file was automatically generated. Do not edit.\n'
71*d9f75844SAndroid Build Coastguard Worker          '\n'
72*d9f75844SAndroid Build Coastguard Worker          '#ifndef GEN_REGISTERED_FIELD_TRIALS_H_\n'
73*d9f75844SAndroid Build Coastguard Worker          '#define GEN_REGISTERED_FIELD_TRIALS_H_\n'
74*d9f75844SAndroid Build Coastguard Worker          '\n'
75*d9f75844SAndroid Build Coastguard Worker          '#include "absl/strings/string_view.h"\n'
76*d9f75844SAndroid Build Coastguard Worker          '\n'
77*d9f75844SAndroid Build Coastguard Worker          'namespace webrtc {\n'
78*d9f75844SAndroid Build Coastguard Worker          '\n'
79*d9f75844SAndroid Build Coastguard Worker          'inline constexpr absl::string_view kRegisteredFieldTrials[] = {\n'
80*d9f75844SAndroid Build Coastguard Worker          f'{keys}\n'
81*d9f75844SAndroid Build Coastguard Worker          '};\n'
82*d9f75844SAndroid Build Coastguard Worker          '\n'
83*d9f75844SAndroid Build Coastguard Worker          '}  // namespace webrtc\n'
84*d9f75844SAndroid Build Coastguard Worker          '\n'
85*d9f75844SAndroid Build Coastguard Worker          '#endif  // GEN_REGISTERED_FIELD_TRIALS_H_\n')
86*d9f75844SAndroid Build Coastguard Worker
87*d9f75844SAndroid Build Coastguard Worker
88*d9f75844SAndroid Build Coastguard Workerdef CmdHeader(args: argparse.Namespace) -> None:
89*d9f75844SAndroid Build Coastguard Worker  args.output.write(RegistryHeader())
90*d9f75844SAndroid Build Coastguard Worker
91*d9f75844SAndroid Build Coastguard Worker
92*d9f75844SAndroid Build Coastguard Workerdef main() -> None:
93*d9f75844SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
94*d9f75844SAndroid Build Coastguard Worker  subcommand = parser.add_subparsers(dest='cmd')
95*d9f75844SAndroid Build Coastguard Worker  parser_header = subcommand.add_parser(
96*d9f75844SAndroid Build Coastguard Worker      'header',
97*d9f75844SAndroid Build Coastguard Worker      help='generate C++ header file containing registered field trial keys')
98*d9f75844SAndroid Build Coastguard Worker  parser_header.add_argument('--output',
99*d9f75844SAndroid Build Coastguard Worker                             default=sys.stdout,
100*d9f75844SAndroid Build Coastguard Worker                             type=argparse.FileType('w'),
101*d9f75844SAndroid Build Coastguard Worker                             required=False,
102*d9f75844SAndroid Build Coastguard Worker                             help='output file')
103*d9f75844SAndroid Build Coastguard Worker  parser_header.set_defaults(cmd=CmdHeader)
104*d9f75844SAndroid Build Coastguard Worker  args = parser.parse_args()
105*d9f75844SAndroid Build Coastguard Worker
106*d9f75844SAndroid Build Coastguard Worker  if not args.cmd:
107*d9f75844SAndroid Build Coastguard Worker    parser.print_help(sys.stderr)
108*d9f75844SAndroid Build Coastguard Worker    sys.exit(1)
109*d9f75844SAndroid Build Coastguard Worker
110*d9f75844SAndroid Build Coastguard Worker  args.cmd(args)
111*d9f75844SAndroid Build Coastguard Worker
112*d9f75844SAndroid Build Coastguard Worker
113*d9f75844SAndroid Build Coastguard Workerif __name__ == '__main__':
114*d9f75844SAndroid Build Coastguard Worker  main()
115