blob: 62797cc0c5828469d19627284090994f2ac9fda7 [file] [log] [blame] [edit]
#!/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:])