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