mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.3 KiB
110 lines
3.3 KiB
#!/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)
|
|
|