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