| #!/usr/bin/env python3 |
| |
| # Copyright 2022 gRPC authors. |
| # |
| # 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 os |
| import re |
| import subprocess |
| import sys |
| |
| from google.cloud import bigquery |
| import run_buildozer |
| import update_flakes_query |
| |
| lookback_hours = 24 * 7 * 4 |
| |
| |
| def include_test(test): |
| if "@" in test: |
| return False |
| if test.startswith("//test/cpp/qps:"): |
| return False |
| return True |
| |
| |
| TEST_DIRS = ["test/core", "test/cpp"] |
| tests = {} |
| already_flaky = set() |
| for test_dir in TEST_DIRS: |
| for line in subprocess.check_output( |
| ["bazel", "query", "tests({}/...)".format(test_dir)] |
| ).splitlines(): |
| test = line.strip().decode("utf-8") |
| if not include_test(test): |
| continue |
| tests[test] = False |
| for test_dir in TEST_DIRS: |
| for line in subprocess.check_output( |
| ["bazel", "query", "attr(flaky, 1, tests({}/...))".format(test_dir)] |
| ).splitlines(): |
| test = line.strip().decode("utf-8") |
| if not include_test(test): |
| continue |
| already_flaky.add(test) |
| |
| flaky_e2e = set() |
| |
| client = bigquery.Client() |
| for row in client.query( |
| update_flakes_query.QUERY.format(lookback_hours=lookback_hours) |
| ).result(): |
| if "/macos/" in row.job_name: |
| continue # we know mac stuff is flaky |
| if row.test_binary not in tests: |
| m = re.match( |
| r"^//test/core/end2end:([^@]*)@([^@]*)(.*)", row.test_binary |
| ) |
| if m: |
| flaky_e2e.add("{}@{}{}".format(m.group(1), m.group(2), m.group(3))) |
| print("will mark end2end test {} as flaky".format(row.test_binary)) |
| else: |
| print("skip obsolete test {}".format(row.test_binary)) |
| continue |
| print("will mark {} as flaky".format(row.test_binary)) |
| tests[row.test_binary] = True |
| |
| buildozer_commands = [] |
| for test, flaky in sorted(tests.items()): |
| if flaky: |
| buildozer_commands.append("set flaky True|{}".format(test)) |
| elif test in already_flaky: |
| buildozer_commands.append("remove flaky|{}".format(test)) |
| |
| with open("test/core/end2end/flaky.bzl", "w") as f: |
| with open(sys.argv[0]) as my_source: |
| for line in my_source: |
| if line[0] != "#": |
| break |
| for line in my_source: |
| if line[0] == "#": |
| print(line.strip(), file=f) |
| break |
| for line in my_source: |
| if line[0] != "#": |
| break |
| print(line.strip(), file=f) |
| print( |
| ( |
| '"""A list of flaky tests, consumed by generate_tests.bzl to set' |
| ' flaky attrs."""' |
| ), |
| file=f, |
| ) |
| print("FLAKY_TESTS = [", file=f) |
| for line in sorted(list(flaky_e2e)): |
| print(' "{}",'.format(line), file=f) |
| print("]", file=f) |
| |
| run_buildozer.run_buildozer(buildozer_commands) |