#!/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)