#!/usr/bin/env -S python3 # Copyright (C) 2024 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import dataclasses import subprocess import sys from pathlib import Path @dataclasses.dataclass(frozen=True) class BaselineProject: """A project that has a baseline file to update.""" # The name of the project name: str # The baseline file path. baseline_file: Path def resource_path(project_dir, resource_path): return project_dir / "src" / "test" / "resources" / resource_path def find_baseline_projects(metalava_dir): projects = [] for buildFile in metalava_dir.glob("*/build.gradle.kts"): for line in open(buildFile, 'r'): if """id("metalava-model-provider-plugin")""" in line: project_dir = buildFile.parent baseline = BaselineProject( name=project_dir.name, baseline_file=resource_path(project_dir, "model-test-suite-baseline.txt"), ) projects.append(baseline) projects.append(BaselineProject( name="metalava", baseline_file=resource_path(metalava_dir / "metalava", "source-model-provider-baseline.txt") )) return projects def main(args): args_parser = argparse.ArgumentParser(description="Refresh the baseline files.") args_parser.add_argument("projects", nargs='*') args = args_parser.parse_args(args) # Get various directories. this = Path(__file__) script_dir = this.parent metalava_dir = script_dir.parent out_dir = metalava_dir.parent.parent / "out" metalava_out_dir = out_dir / "metalava" # Get the projects which have a baseline file to update. baseline_projects = find_baseline_projects(metalava_dir) # Filter the baseline projects by the names specified on the command line. if args.projects: baseline_projects = [p for p in baseline_projects if p.name in args.projects] for baseline_project in baseline_projects: project_name = baseline_project.name # Delete all the test report files. print(f"Deleting test report files for {project_name}") test_reports_dir = metalava_out_dir / project_name / "build" / "test-results" / "test" for f in test_reports_dir.glob("**/TEST-*.xml"): f.unlink() # Delete the baseline file. baseline_file = baseline_project.baseline_file print(f"Deleting baseline file - {baseline_file}") baseline_file.unlink(missing_ok=True) # Run the tests. print(f"Running all tests in {project_name}") subprocess.run(["./gradlew", f":{project_name}:test", "--continue"], cwd=metalava_dir) print(f"Updating baseline file - {baseline_file}") test_report_files = " ".join([f"'{str(f)}'" for f in test_reports_dir.glob("**/TEST-*.xml")]) project_dir = metalava_dir / project_name subprocess.run(["./gradlew", f":metalava-model-testsuite-cli:run", f"""--args={test_report_files} --baseline-file '{baseline_file}'"""], cwd=metalava_dir) if __name__ == "__main__": main(sys.argv[1:])