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