| #!/usr/bin/env python3 |
| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # Script that compares the metrics when running Autofill captured site tests |
| # with some features enabled and disabled. |
| # Run from the root of the Chromium src directory. -h for help. |
| # The tool expects that the captured_sites_interactive_tests binary is built. |
| import argparse, json, os, urllib.parse |
| |
| |
| # Extracts the names of all non-disabled captured site tests. |
| def get_all_sites(): |
| with open("chrome/test/data/autofill/captured_sites/artifacts/testcases.json", |
| "r") as f: |
| return (site["site_name"] for site in json.loads(f.read())["tests"] |
| if not site.get("disabled", False)) |
| |
| # Command line args. |
| parser = argparse.ArgumentParser(epilog="List of tests: " + |
| ", ".join(get_all_sites())) |
| parser.add_argument( |
| "target", |
| help=("Build target of captured_sites_interactive_tests binary. " |
| "For example, Default. The binary should already exist.")) |
| parser.add_argument("features", help="A comma-separated list of feature names.") |
| parser.add_argument( |
| "-r", |
| dest="histogram_regex", |
| help=("A regex matching the histogram names that should be dumped. If not " |
| "specified, the metrics of all histograms dumped.")) |
| parser.add_argument( |
| "-o", |
| dest="output", |
| default="/tmp/", |
| help=("Directory to record the metrics into. Creates files per test, named" |
| " after the test case.")) |
| parser.add_argument( |
| "-t", |
| dest="test", |
| help="Test case. If no test is specified, all tests are run.") |
| parser.add_argument("-s", |
| dest="silent", |
| action="store_true", |
| help="Don't print test output.") |
| args = parser.parse_args() |
| |
| # The captured_sites_interactive_tests binary should be built. |
| captured_site_tests = "out/%s/captured_sites_interactive_tests" % args.target |
| assert os.path.exists(captured_site_tests) |
| |
| |
| # Runs the capture site test for `site` and scrapes the metrics. |
| # args.features is enabled/disabled depending on `features_enabled`. |
| def run_test(site, features_enabled): |
| cmd = "./" + captured_site_tests |
| cmd += (" --gtest_filter=" |
| "All/AutofillCapturedSitesInteractiveTest.Recipe/" + site) |
| # Enable scraping tools. Special characters need to be escaped. |
| cmd += " --enable-features=AutofillCapturedSiteTestsMetricsScraper" |
| cmd += ":output_dir/" + urllib.parse.quote(args.output, safe="") |
| if args.histogram_regex is not None: |
| cmd += "/histogram_regex/" + urllib.parse.quote(args.histogram_regex, |
| safe="") |
| # En- or disable features. |
| if features_enabled: |
| cmd += "," + args.features |
| else: |
| cmd += " --disable-features=" + args.features |
| # Random arguments that the captured site tests recommend. |
| cmd += " --enable-pixel-output-in-tests" |
| cmd += " --test-launcher-timeout=10000000" |
| cmd += " --ui-test-action-max-timeout=10000000" |
| cmd += (" --vmodule=captured_sites_test_utils=2\," |
| "autofill_captured_sites_interactive_uitest=1") |
| # Maybe disable output. |
| if args.silent: |
| cmd += " > /dev/null 2>&1" |
| # Run |
| os.system(cmd) |
| |
| |
| # Runs the captured site test `site` twice. Once with `args.features` enabled |
| # and once with the feature disabled. |
| # Diffs the metrics collected. |
| def run_tests_and_diff(site): |
| print("Testing %s..." % site) |
| |
| def file_name(infix): |
| return "%s/%s%s.txt" % (args.output, site, infix) |
| |
| # `output` is where the captured site test will write to. Rename the file |
| # afterwards to distinguish between enabled/disabled state. |
| output = file_name("") |
| result_enabled = file_name("_enabled") |
| result_disabled = file_name("_disabled") |
| |
| print("Running with features enabled. Results at " + result_enabled) |
| run_test(site, True) |
| os.rename(output, result_enabled) |
| |
| print("Running with features disabled. Results at " + result_disabled) |
| run_test(site, False) |
| os.rename(output, result_disabled) |
| |
| print("Comparing metrics (no output means no diff)") |
| os.system("diff %s %s" % (result_enabled, result_disabled)) |
| print("") |
| |
| # If a test is specified, only run that specific test. Otherwise run all. |
| if args.test is None: |
| for site in get_all_sites(): |
| run_tests_and_diff(site) |
| else: |
| run_tests_and_diff(args.test) |