1*6777b538SAndroid Build Coastguard Worker# Field Trial Testing Configuration 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard WorkerThis directory contains the `fieldtrial_testing_config.json` configuration file, 4*6777b538SAndroid Build Coastguard Workerwhich is used to ensure test coverage of active field trials. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard WorkerFor each study, the first available experiment after platform filtering is used 7*6777b538SAndroid Build Coastguard Workeras the default experiment for Chromium builds. This experiment is also used for 8*6777b538SAndroid Build Coastguard Workerperf bots and various browser tests in the waterfall (e.g. browser_tests, 9*6777b538SAndroid Build Coastguard Workercomponents_browsertests, content_browsertests, extensions_browsertests, interactive_ui_tests and 10*6777b538SAndroid Build Coastguard Workersync_integration_tests). It is not used by unit test targets. 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker> Note: This configuration applies specifically to Chromium developer builds. 13*6777b538SAndroid Build Coastguard Worker> Chrome branded / official builds do not use these definitions by default. 14*6777b538SAndroid Build Coastguard Worker> They can, however, be enabled with the `--enable-field-trial-config` switch. 15*6777b538SAndroid Build Coastguard Worker> For Chrome branded Android builds, due to binary size constraints, the 16*6777b538SAndroid Build Coastguard Worker> configuration cannot be applied by this switch. 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker> Note: Non-developer builds of Chromium (for example, non-Chrome browsers, 19*6777b538SAndroid Build Coastguard Worker> or Chromium builds provided by Linux distros) should disable the testing 20*6777b538SAndroid Build Coastguard Worker> config by either (1) specifying the GN flag `disable_fieldtrial_testing_config=true`, 21*6777b538SAndroid Build Coastguard Worker> (2) specifying the `--disable-field-trial-config` switch or (3) specifying a 22*6777b538SAndroid Build Coastguard Worker> custom variations server URL using the `--variations-server-url` switch. 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker> Note: An experiment in the testing configuration file that enables/disables a 25*6777b538SAndroid Build Coastguard Worker> feature that is explicitly overridden (e.g. using the `--enable-features` or 26*6777b538SAndroid Build Coastguard Worker> `--disable-features` switches) will be skipped. 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker## Config File Format 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker```json 31*6777b538SAndroid Build Coastguard Worker{ 32*6777b538SAndroid Build Coastguard Worker "StudyName": [ 33*6777b538SAndroid Build Coastguard Worker { 34*6777b538SAndroid Build Coastguard Worker "platforms": [Array of Strings of Valid Platforms for These Experiments], 35*6777b538SAndroid Build Coastguard Worker "experiments": [ 36*6777b538SAndroid Build Coastguard Worker { 37*6777b538SAndroid Build Coastguard Worker "//0": "Comment Line 0. Lines 0-9 are supported.", 38*6777b538SAndroid Build Coastguard Worker "name": "ExperimentName", 39*6777b538SAndroid Build Coastguard Worker "params": {Dictionary of Params}, 40*6777b538SAndroid Build Coastguard Worker "enable_features": [Array of Strings of Features], 41*6777b538SAndroid Build Coastguard Worker "disable_features": [Array of Strings of Features] 42*6777b538SAndroid Build Coastguard Worker }, 43*6777b538SAndroid Build Coastguard Worker ... 44*6777b538SAndroid Build Coastguard Worker ] 45*6777b538SAndroid Build Coastguard Worker }, 46*6777b538SAndroid Build Coastguard Worker ... 47*6777b538SAndroid Build Coastguard Worker ], 48*6777b538SAndroid Build Coastguard Worker ... 49*6777b538SAndroid Build Coastguard Worker} 50*6777b538SAndroid Build Coastguard Worker``` 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard WorkerThe config file is a dictionary at the top level mapping a study name to an 53*6777b538SAndroid Build Coastguard Workerarray of *study configurations*. The study name in the configuration file 54*6777b538SAndroid Build Coastguard Worker**must** match the FieldTrial name used in the Chromium client code. 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker> Note: Many newer studies do not use study names in the client code at all, and 57*6777b538SAndroid Build Coastguard Worker> rely on the [Feature List API][FeatureListAPI] instead. Nonetheless, if a 58*6777b538SAndroid Build Coastguard Worker> study has a server-side configuration, the study `name` specified here 59*6777b538SAndroid Build Coastguard Worker> must still match the name specified in the server-side configuration; this is 60*6777b538SAndroid Build Coastguard Worker> used to implement consistency checks on the server. 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker### Study Configurations 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard WorkerEach *study configuration* is a dictionary containing `platforms` and 65*6777b538SAndroid Build Coastguard Worker`experiments`. 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker`platforms` is an array of strings, indicating the targetted platforms. The 68*6777b538SAndroid Build Coastguard Workerstrings may be `android`, `android_weblayer`, `android_webview`, `chromeos`, 69*6777b538SAndroid Build Coastguard Worker`chromeos_lacros`, `ios`, `linux`, `mac`, or `windows`. 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker`experiments` is an array containing the *experiments*. 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard WorkerThe converter uses the `platforms` array to determine which experiment to use 74*6777b538SAndroid Build Coastguard Workerfor the study. The first experiment matching the active platform will be used. 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker> Note: While `experiments` is defined as an array, currently only the first 77*6777b538SAndroid Build Coastguard Worker> entry is used*\**. We would love to be able to test all possible study 78*6777b538SAndroid Build Coastguard Worker> configurations, but don't currently have the buildbot resources to do so. 79*6777b538SAndroid Build Coastguard Worker> Hence, the current best-practice is to identify which experiment group is the 80*6777b538SAndroid Build Coastguard Worker> most likely candidate for ultimate launch, and to test that configuration. If 81*6777b538SAndroid Build Coastguard Worker> there is a server-side configuration for this study, it's typically 82*6777b538SAndroid Build Coastguard Worker> appropriate to copy/paste one of the experiment definitions into this file. 83*6777b538SAndroid Build Coastguard Worker> 84*6777b538SAndroid Build Coastguard Worker> *\** 85*6777b538SAndroid Build Coastguard Worker> <small> 86*6777b538SAndroid Build Coastguard Worker> Technically, there is one exception: If there's a forcing_flag group 87*6777b538SAndroid Build Coastguard Worker> specified in the config, that group will be used if there's a corresponding 88*6777b538SAndroid Build Coastguard Worker> forcing_flag specified on the command line. You, dear reader, should 89*6777b538SAndroid Build Coastguard Worker> probably not use this fancy mechanism unless you're <em>quite</em> sure you 90*6777b538SAndroid Build Coastguard Worker> know what you're doing =) 91*6777b538SAndroid Build Coastguard Worker> </small> 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker### Experiments (Groups) 94*6777b538SAndroid Build Coastguard WorkerEach *experiment* is a dictionary that must contain the `name` key, identifying 95*6777b538SAndroid Build Coastguard Workerthe experiment group name. 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker> Note: Studies should typically use the [Feature List API][FeatureListAPI]. For 98*6777b538SAndroid Build Coastguard Worker> such studies, the experiment `name` specified in the testing config is still 99*6777b538SAndroid Build Coastguard Worker> required (for legacy reasons), but it is ignored. However, the lists of 100*6777b538SAndroid Build Coastguard Worker> `enable_features`, `disable_features`, and `params` **must** match the server 101*6777b538SAndroid Build Coastguard Worker> config. This is enforced via server-side Tricorder checks. 102*6777b538SAndroid Build Coastguard Worker> 103*6777b538SAndroid Build Coastguard Worker> For old-school studies that do check the actual experiment group name in the 104*6777b538SAndroid Build Coastguard Worker> client code, the `name` **must** exactly match the client code and the server 105*6777b538SAndroid Build Coastguard Worker> config. 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard WorkerThe remaining keys -- `enable_features`, `disable_features`, `min_os_version`, 108*6777b538SAndroid Build Coastguard Workerand `params` -- are optional. 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker`enable_features` and `disable_features` indicate which features should be 111*6777b538SAndroid Build Coastguard Workerenabled and disabled, respectively, through the 112*6777b538SAndroid Build Coastguard Worker[Feature List API][FeatureListAPI]. 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker`min_os_version` indicates a minimum OS version level (e.g. "10.0.0") to apply 115*6777b538SAndroid Build Coastguard Workerthe experiment. This string is decoded as a `base::Version`. The same version is 116*6777b538SAndroid Build Coastguard Workerapplied to all platforms. If you need different versions for different 117*6777b538SAndroid Build Coastguard Workerplatforms, you will need to use different studies. 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker`params` is a dictionary mapping parameter name to parameter value. 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker> Reminder: The variations framework does not actually fetch any field trial 122*6777b538SAndroid Build Coastguard Worker> definitions from the server for Chromium builds, so any feature enabling or 123*6777b538SAndroid Build Coastguard Worker> disabling must be configured here. 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker[FeatureListAPI]: https://cs.chromium.org/chromium/src/base/feature_list.h 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker#### Comments 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard WorkerEach experiment may have up to 10 lines of comments. The comment key must be of 130*6777b538SAndroid Build Coastguard Workerthe form `//N` where `N` is between 0 and 9. 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker```json 133*6777b538SAndroid Build Coastguard Worker{ 134*6777b538SAndroid Build Coastguard Worker "AStudyWithExperimentComment": [ 135*6777b538SAndroid Build Coastguard Worker { 136*6777b538SAndroid Build Coastguard Worker "platforms": ["chromeos", "linux", "mac", "windows"], 137*6777b538SAndroid Build Coastguard Worker "experiments": [ 138*6777b538SAndroid Build Coastguard Worker { 139*6777b538SAndroid Build Coastguard Worker "//0": "This is the first comment line.", 140*6777b538SAndroid Build Coastguard Worker "//1": "This is the second comment line.", 141*6777b538SAndroid Build Coastguard Worker "name": "DesktopExperiment" 142*6777b538SAndroid Build Coastguard Worker } 143*6777b538SAndroid Build Coastguard Worker ] 144*6777b538SAndroid Build Coastguard Worker } 145*6777b538SAndroid Build Coastguard Worker ] 146*6777b538SAndroid Build Coastguard Worker} 147*6777b538SAndroid Build Coastguard Worker``` 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker### Specifying Different Experiments for Different Platforms 150*6777b538SAndroid Build Coastguard WorkerSimply specify two different study configurations in the study: 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker```json 153*6777b538SAndroid Build Coastguard Worker{ 154*6777b538SAndroid Build Coastguard Worker "DifferentExperimentsPerPlatform": [ 155*6777b538SAndroid Build Coastguard Worker { 156*6777b538SAndroid Build Coastguard Worker "platforms": ["chromeos", "linux", "mac", "windows"], 157*6777b538SAndroid Build Coastguard Worker "experiments": [{ "name": "DesktopExperiment" }] 158*6777b538SAndroid Build Coastguard Worker }, 159*6777b538SAndroid Build Coastguard Worker { 160*6777b538SAndroid Build Coastguard Worker "platforms": ["android", "ios"], 161*6777b538SAndroid Build Coastguard Worker "experiments": [{ "name": "MobileExperiment" }] 162*6777b538SAndroid Build Coastguard Worker } 163*6777b538SAndroid Build Coastguard Worker ] 164*6777b538SAndroid Build Coastguard Worker} 165*6777b538SAndroid Build Coastguard Worker``` 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker## Formatting 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard WorkerRun the following command to auto-format the `fieldtrial_testing_config.json` 170*6777b538SAndroid Build Coastguard Workerconfiguration file: 171*6777b538SAndroid Build Coastguard Worker 172*6777b538SAndroid Build Coastguard Worker```shell 173*6777b538SAndroid Build Coastguard Workerpython3 testing/variations/PRESUBMIT.py testing/variations/fieldtrial_testing_config.json 174*6777b538SAndroid Build Coastguard Worker``` 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard WorkerThe presubmit tool will also ensure that your changes follow the correct 177*6777b538SAndroid Build Coastguard Workerordering and format. 178