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 11import sys 12from typing import Set 13 14import argparse 15import dataclasses 16 17 18# TODO(bugs.webrtc.org/14154): End date and bug should also be stored. 19@dataclasses.dataclass(frozen=True) 20class FieldTrial: 21 """Representation of all attributes associated with a field trial. 22 23 Attributes: 24 key: Field trial key. 25 """ 26 key: str 27 28 29# As per the policy in `g3doc/field-trials.md`, all field trials should be 30# registered in the container below. Please keep the keys sorted. 31REGISTERED_FIELD_TRIALS: Set[FieldTrial] = { 32 FieldTrial(''), # TODO(bugs.webrtc.org/14154): Populate 33} 34 35 36def RegistryHeader(field_trials: Set[FieldTrial] = None) -> str: 37 """Generates a C++ header with all field trial keys. 38 39 Args: 40 field_trials: Field trials to include in the header. 41 42 Returns: 43 String representation of a C++ header file containing all field trial keys. 44 45 >>> trials = {FieldTrial('B'), FieldTrial('A'), FieldTrial('B')} 46 >>> print(RegistryHeader(trials)) 47 // This file was automatically generated. Do not edit. 48 <BLANKLINE> 49 #ifndef GEN_REGISTERED_FIELD_TRIALS_H_ 50 #define GEN_REGISTERED_FIELD_TRIALS_H_ 51 <BLANKLINE> 52 #include "absl/strings/string_view.h" 53 <BLANKLINE> 54 namespace webrtc { 55 <BLANKLINE> 56 inline constexpr absl::string_view kRegisteredFieldTrials[] = { 57 "A", 58 "B", 59 }; 60 <BLANKLINE> 61 } // namespace webrtc 62 <BLANKLINE> 63 #endif // GEN_REGISTERED_FIELD_TRIALS_H_ 64 <BLANKLINE> 65 """ 66 if not field_trials: 67 field_trials = REGISTERED_FIELD_TRIALS 68 registered_keys = [f.key for f in field_trials] 69 keys = '\n'.join(f' "{k}",' for k in sorted(registered_keys)) 70 return ('// This file was automatically generated. Do not edit.\n' 71 '\n' 72 '#ifndef GEN_REGISTERED_FIELD_TRIALS_H_\n' 73 '#define GEN_REGISTERED_FIELD_TRIALS_H_\n' 74 '\n' 75 '#include "absl/strings/string_view.h"\n' 76 '\n' 77 'namespace webrtc {\n' 78 '\n' 79 'inline constexpr absl::string_view kRegisteredFieldTrials[] = {\n' 80 f'{keys}\n' 81 '};\n' 82 '\n' 83 '} // namespace webrtc\n' 84 '\n' 85 '#endif // GEN_REGISTERED_FIELD_TRIALS_H_\n') 86 87 88def CmdHeader(args: argparse.Namespace) -> None: 89 args.output.write(RegistryHeader()) 90 91 92def main() -> None: 93 parser = argparse.ArgumentParser() 94 subcommand = parser.add_subparsers(dest='cmd') 95 parser_header = subcommand.add_parser( 96 'header', 97 help='generate C++ header file containing registered field trial keys') 98 parser_header.add_argument('--output', 99 default=sys.stdout, 100 type=argparse.FileType('w'), 101 required=False, 102 help='output file') 103 parser_header.set_defaults(cmd=CmdHeader) 104 args = parser.parse_args() 105 106 if not args.cmd: 107 parser.print_help(sys.stderr) 108 sys.exit(1) 109 110 args.cmd(args) 111 112 113if __name__ == '__main__': 114 main() 115