# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import os import tomllib import shutil BASE_PATH = os.path.join("src", "zen", "tests") EXTERNAL_TESTS_MANIFEST = os.path.join(BASE_PATH, "manifest.toml") EXTERNAL_TESTS_OUTPUT = os.path.join(BASE_PATH, "mochitests") FILE_PREFIX = """ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # This file is autogenerated by scripts/import_external_tests.py # Do not edit manually. BROWSER_CHROME_MANIFESTS += [ """ FILE_SUFFIX = "]" def get_tests_manifest(): with open(EXTERNAL_TESTS_MANIFEST, "rb") as f: return tomllib.load(f) def die_with_error(message): print(f"ERROR: {message}") exit(1) def validate_tests_path(path, files, ignore_list): for ignore in ignore_list: if ignore not in files: die_with_error(f"Ignore file '{ignore}' not found in tests folder '{path}'") if "browser.toml" not in files or "browser.js" in ignore_list: die_with_error(f"'browser.toml' not found in tests folder '{path}'") def disable_and_replace_manifest(manifest, output_path): toml_file = os.path.join(output_path, "browser.toml") disabled_tests = manifest.get("disable", []) with open(toml_file, "r") as f: data = f.read() for test in disabled_tests: segment = f'["{test}"]' if segment not in data: die_with_error(f"Could not disable test '{test}' as it was not found in '{toml_file}'") replace_with = f'["{test}"]\ndisabled="Disabled by import_external_tests.py"' data = data.replace(segment, replace_with) for replacement in manifest.get("replace-manifest", {}).keys(): if replacement not in data: die_with_error(f"Could not replace manifest entry '{replacement}' as it was not found in '{toml_file}'") data = data.replace(replacement, manifest["replace-manifest"][replacement]) with open(toml_file, "w") as f: f.write(data) def import_test_suite(test_suite, source_path, output_path, ignore_list, manifest, is_direct_path=False): print(f"Importing test suite '{test_suite}' from '{source_path}'") tests_folder = os.path.join("engine", source_path) if not is_direct_path: tests_folder = os.path.join(tests_folder, "tests") if not os.path.exists(tests_folder): die_with_error(f"Tests folder not found: {tests_folder}") files = os.listdir(tests_folder) validate_tests_path(tests_folder, files, ignore_list) if os.path.exists(output_path): shutil.rmtree(output_path) os.makedirs(output_path, exist_ok=True) for item in files: if item in ignore_list: continue s = os.path.join(tests_folder, item) d = os.path.join(output_path, item) if os.path.isdir(s): shutil.copytree(s, d) else: shutil.copy2(s, d) disable_and_replace_manifest(manifest[test_suite], output_path) def write_moz_build_file(manifest): moz_build_path = os.path.join(EXTERNAL_TESTS_OUTPUT, "moz.build") print(f"Writing moz.build file to '{moz_build_path}'") with open(moz_build_path, "w") as f: f.write(FILE_PREFIX) for test_suite in manifest.keys(): f.write(f'\t"{test_suite}/browser.toml",\n') f.write(FILE_SUFFIX) def make_sure_ordered_tests(manifest): ordered_tests = sorted(manifest.keys()) if list(manifest.keys()) != ordered_tests: die_with_error("Test suites in manifest.toml are not in alphabetical order.") def main(): manifest = get_tests_manifest() if os.path.exists(EXTERNAL_TESTS_OUTPUT): shutil.rmtree(EXTERNAL_TESTS_OUTPUT) os.makedirs(EXTERNAL_TESTS_OUTPUT, exist_ok=True) make_sure_ordered_tests(manifest) for test_suite, config in manifest.items(): import_test_suite( test_suite=test_suite, source_path=config["source"], output_path=os.path.join(EXTERNAL_TESTS_OUTPUT, test_suite), ignore_list=config.get("ignore", []), is_direct_path=config.get("is_direct_path", False), manifest=manifest ) write_moz_build_file(manifest) if __name__ == "__main__": main()