[lit][unit] avoid adding gtest binary more than once

Due to CMake mis-configurations, some gtest binaries may be added to the test
list more than once. This patch makes lit avoid such cases and issues a
warning when it happens.
This commit is contained in:
Yuanfang Chen
2022-09-22 14:17:06 -07:00
parent ca8099bd3c
commit 2380c1b609
4 changed files with 75 additions and 0 deletions

View File

@@ -15,6 +15,7 @@ kIsWindows = sys.platform in ['win32', 'cygwin']
class GoogleTest(TestFormat):
def __init__(self, test_sub_dirs, test_suffix, run_under = []):
self.seen_executables = set()
self.test_sub_dirs = str(test_sub_dirs).split(';')
# On Windows, assume tests will also end in '.exe'.
@@ -54,6 +55,12 @@ class GoogleTest(TestFormat):
suffixes=self.test_suffixes):
# Discover the tests in this executable.
execpath = os.path.join(source_path, subdir, fn)
if execpath in self.seen_executables:
litConfig.warning(
"Skip adding %r since it has been added to the test pool" % execpath)
continue
else:
self.seen_executables.add(execpath)
num_tests = self.get_num_tests(execpath, litConfig,
localConfig)
if num_tests is not None:

View File

@@ -0,0 +1,55 @@
#!/usr/bin/env python
import os
import sys
if len(sys.argv) == 3 and sys.argv[1] == "--gtest_list_tests":
if sys.argv[2] != '--gtest_filter=-*DISABLED_*':
raise ValueError("unexpected argument: %s" % (sys.argv[2]))
print("""\
FirstTest.
subTestA""")
sys.exit(0)
elif len(sys.argv) != 1:
# sharding and json output are specified using environment variables
raise ValueError("unexpected argument: %r" % (' '.join(sys.argv[1:])))
for e in ['GTEST_TOTAL_SHARDS', 'GTEST_SHARD_INDEX', 'GTEST_OUTPUT']:
if e not in os.environ:
raise ValueError("missing environment variables: " + e)
if not os.environ['GTEST_OUTPUT'].startswith('json:'):
raise ValueError("must emit json output: " + os.environ['GTEST_OUTPUT'])
output = """\
{
"random_seed": 123,
"testsuites": [
{
"name": "FirstTest",
"testsuite": [
{
"name": "subTestA",
"result": "COMPLETED",
"time": "0.001s"
}
]
}
]
}"""
dummy_output = """\
{
"testsuites": [
]
}"""
json_filename = os.environ['GTEST_OUTPUT'].split(':', 1)[1]
with open(json_filename, 'w', encoding='utf-8') as f:
if os.environ['GTEST_SHARD_INDEX'] == '0':
f.write(output)
else:
f.write(dummy_output)
exit_code = 0
sys.exit(exit_code)

View File

@@ -0,0 +1,3 @@
import lit.formats
config.name = 'googletest-detect-duplicate'
config.test_format = lit.formats.GoogleTest('DummySubDir', 'Test')

View File

@@ -0,0 +1,10 @@
# Check we don't add a GoogleTest binary more than once and issue a warning
# when it happens.
# RUN: %{lit} -v --order=random %{inputs}/googletest-detect-duplicate \
# RUN: %{inputs}/googletest-detect-duplicate 2>&1 | FileCheck %s
# CHECK: warning: Skip adding
# CHECK: -- Testing:
# CHECK: PASS: googletest-detect-duplicate :: [[PATH:[Dd]ummy[Ss]ub[Dd]ir/]][[FILE:OneTest\.py]]/0
# CHECK: Passed{{ *}}: 1