Source code
Revision control
Copy as Markdown
Other Tools
/**
* @license
* Copyright 2025 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
import fs from 'node:fs';
/**
* This command compares two versions (good and bad) of the field trial testing configs
* and prints features that need to be disabled to go back to the state
* defined by the good config.
*
* Usage:
*
* node --experimental-strip-types tools/compare-trials.ts configBad.json configGood.json
*/
// TODO: replace with yargs.
const bad = readConfig(process.argv[2]);
const good = readConfig(process.argv[3]);
function readConfig(filepath: string): object {
return JSON.parse(fs.readFileSync(filepath, 'utf-8'));
}
function getFeatures(config: object) {
const enabledFeatures = new Set();
const distabledFeatures = new Set();
for (const key of Object.keys(config)) {
const item = config[key];
for (const subitem of item) {
// In field trials, only the first experiment applies.
// TODO: this should be per platform.
const exp = subitem['experiments'][0];
for (const feature of exp['enable_features'] ?? []) {
enabledFeatures.add(feature);
}
for (const feature of exp['disable_features'] ?? []) {
enabledFeatures.add(feature);
}
}
}
return {enabledFeatures, distabledFeatures};
}
const {
enabledFeatures: badEnabledFeatures,
distabledFeatures: badDisabledFeatures,
} = getFeatures(bad);
const {
enabledFeatures: goodEnabledFeatures,
distabledFeatures: goodDisabledFeatures,
} = getFeatures(good);
for (const badFeature of badEnabledFeatures) {
if (!goodEnabledFeatures.has(badFeature)) {
console.log(`'${badFeature}',`);
}
}
for (const goodFeature of goodDisabledFeatures) {
if (!badDisabledFeatures.has(goodFeature)) {
console.log(`'${goodFeature}',`);
}
}