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.

111 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)