|
|
|
@ -108,6 +108,14 @@ TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)') |
|
|
|
|
# Regex for parsing test names from Google Test's output. |
|
|
|
|
TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)') |
|
|
|
|
|
|
|
|
|
# The command line flag to tell Google Test to output the list of tests it |
|
|
|
|
# will run. |
|
|
|
|
LIST_TESTS_FLAG = '--gtest_list_tests' |
|
|
|
|
|
|
|
|
|
# Indicates whether Google Test supports death tests. |
|
|
|
|
SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess( |
|
|
|
|
[COMMAND, LIST_TESTS_FLAG]).output |
|
|
|
|
|
|
|
|
|
# Full names of all tests in gtest_filter_unittests_. |
|
|
|
|
PARAM_TESTS = [ |
|
|
|
|
'SeqP/ParamTest.TestX/0', |
|
|
|
@ -129,6 +137,14 @@ DISABLED_TESTS = [ |
|
|
|
|
'DISABLED_FoobarbazTest.TestA', |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
if SUPPORTS_DEATH_TESTS: |
|
|
|
|
DEATH_TESTS = [ |
|
|
|
|
'HasDeathTest.Test1', |
|
|
|
|
'HasDeathTest.Test2', |
|
|
|
|
] |
|
|
|
|
else: |
|
|
|
|
DEATH_TESTS = [] |
|
|
|
|
|
|
|
|
|
# All the non-disabled tests. |
|
|
|
|
ACTIVE_TESTS = [ |
|
|
|
|
'FooTest.Abc', |
|
|
|
@ -141,10 +157,7 @@ ACTIVE_TESTS = [ |
|
|
|
|
'BazTest.TestOne', |
|
|
|
|
'BazTest.TestA', |
|
|
|
|
'BazTest.TestB', |
|
|
|
|
|
|
|
|
|
'HasDeathTest.Test1', |
|
|
|
|
'HasDeathTest.Test2', |
|
|
|
|
] + PARAM_TESTS |
|
|
|
|
] + DEATH_TESTS + PARAM_TESTS |
|
|
|
|
|
|
|
|
|
param_tests_present = None |
|
|
|
|
|
|
|
|
@ -210,7 +223,7 @@ def RunWithSharding(total_shards, shard_index, command): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
"""Tests GTEST_FILTER env variable or --gtest_filter flag to filter tests.""" |
|
|
|
|
"""Tests the env variable or the command line flag to filter tests.""" |
|
|
|
|
|
|
|
|
|
# Utilities. |
|
|
|
|
|
|
|
|
@ -242,17 +255,17 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
return tests_to_run |
|
|
|
|
|
|
|
|
|
def RunAndVerify(self, gtest_filter, tests_to_run): |
|
|
|
|
"""Checks that the binary runs correct set of tests for the given filter.""" |
|
|
|
|
"""Checks that the binary runs correct set of tests for a given filter.""" |
|
|
|
|
|
|
|
|
|
tests_to_run = self.AdjustForParameterizedTests(tests_to_run) |
|
|
|
|
|
|
|
|
|
# First, tests using GTEST_FILTER. |
|
|
|
|
# First, tests using the environment variable. |
|
|
|
|
|
|
|
|
|
# Windows removes empty variables from the environment when passing it |
|
|
|
|
# to a new process. This means it is impossible to pass an empty filter |
|
|
|
|
# into a process using the GTEST_FILTER environment variable. However, |
|
|
|
|
# we can still test the case when the variable is not supplied (i.e., |
|
|
|
|
# gtest_filter is None). |
|
|
|
|
# to a new process. This means it is impossible to pass an empty filter |
|
|
|
|
# into a process using the environment variable. However, we can still |
|
|
|
|
# test the case when the variable is not supplied (i.e., gtest_filter is |
|
|
|
|
# None). |
|
|
|
|
# pylint: disable-msg=C6403 |
|
|
|
|
if CAN_TEST_EMPTY_FILTER or gtest_filter != '': |
|
|
|
|
SetEnvVar(FILTER_ENV_VAR, gtest_filter) |
|
|
|
@ -261,7 +274,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
self.AssertSetEqual(tests_run, tests_to_run) |
|
|
|
|
# pylint: enable-msg=C6403 |
|
|
|
|
|
|
|
|
|
# Next, tests using --gtest_filter. |
|
|
|
|
# Next, tests using the command line flag. |
|
|
|
|
|
|
|
|
|
if gtest_filter is None: |
|
|
|
|
args = [] |
|
|
|
@ -291,10 +304,10 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
tests_to_run = self.AdjustForParameterizedTests(tests_to_run) |
|
|
|
|
|
|
|
|
|
# Windows removes empty variables from the environment when passing it |
|
|
|
|
# to a new process. This means it is impossible to pass an empty filter |
|
|
|
|
# into a process using the GTEST_FILTER environment variable. However, |
|
|
|
|
# we can still test the case when the variable is not supplied (i.e., |
|
|
|
|
# gtest_filter is None). |
|
|
|
|
# to a new process. This means it is impossible to pass an empty filter |
|
|
|
|
# into a process using the environment variable. However, we can still |
|
|
|
|
# test the case when the variable is not supplied (i.e., gtest_filter is |
|
|
|
|
# None). |
|
|
|
|
# pylint: disable-msg=C6403 |
|
|
|
|
if CAN_TEST_EMPTY_FILTER or gtest_filter != '': |
|
|
|
|
SetEnvVar(FILTER_ENV_VAR, gtest_filter) |
|
|
|
@ -435,10 +448,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
|
|
|
|
|
'BazTest.TestOne', |
|
|
|
|
'BazTest.TestA', |
|
|
|
|
'BazTest.TestB', |
|
|
|
|
|
|
|
|
|
'HasDeathTest.Test1', |
|
|
|
|
'HasDeathTest.Test2', ] + PARAM_TESTS) |
|
|
|
|
'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS) |
|
|
|
|
|
|
|
|
|
def testWildcardInTestName(self): |
|
|
|
|
"""Tests using wildcard in the test name.""" |
|
|
|
@ -499,7 +509,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
]) |
|
|
|
|
|
|
|
|
|
def testNegativeFilters(self): |
|
|
|
|
self.RunAndVerify('*-HasDeathTest.Test1', [ |
|
|
|
|
self.RunAndVerify('*-BazTest.TestOne', [ |
|
|
|
|
'FooTest.Abc', |
|
|
|
|
'FooTest.Xyz', |
|
|
|
|
|
|
|
|
@ -507,24 +517,17 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
'BarTest.TestTwo', |
|
|
|
|
'BarTest.TestThree', |
|
|
|
|
|
|
|
|
|
'BazTest.TestOne', |
|
|
|
|
'BazTest.TestA', |
|
|
|
|
'BazTest.TestB', |
|
|
|
|
] + DEATH_TESTS + PARAM_TESTS) |
|
|
|
|
|
|
|
|
|
'HasDeathTest.Test2', |
|
|
|
|
] + PARAM_TESTS) |
|
|
|
|
|
|
|
|
|
self.RunAndVerify('*-FooTest.Abc:HasDeathTest.*', [ |
|
|
|
|
self.RunAndVerify('*-FooTest.Abc:BazTest.*', [ |
|
|
|
|
'FooTest.Xyz', |
|
|
|
|
|
|
|
|
|
'BarTest.TestOne', |
|
|
|
|
'BarTest.TestTwo', |
|
|
|
|
'BarTest.TestThree', |
|
|
|
|
|
|
|
|
|
'BazTest.TestOne', |
|
|
|
|
'BazTest.TestA', |
|
|
|
|
'BazTest.TestB', |
|
|
|
|
] + PARAM_TESTS) |
|
|
|
|
] + DEATH_TESTS + PARAM_TESTS) |
|
|
|
|
|
|
|
|
|
self.RunAndVerify('BarTest.*-BarTest.TestOne', [ |
|
|
|
|
'BarTest.TestTwo', |
|
|
|
@ -532,15 +535,11 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
]) |
|
|
|
|
|
|
|
|
|
# Tests without leading '*'. |
|
|
|
|
self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:HasDeathTest.*', [ |
|
|
|
|
self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [ |
|
|
|
|
'BarTest.TestOne', |
|
|
|
|
'BarTest.TestTwo', |
|
|
|
|
'BarTest.TestThree', |
|
|
|
|
|
|
|
|
|
'BazTest.TestOne', |
|
|
|
|
'BazTest.TestA', |
|
|
|
|
'BazTest.TestB', |
|
|
|
|
] + PARAM_TESTS) |
|
|
|
|
] + DEATH_TESTS + PARAM_TESTS) |
|
|
|
|
|
|
|
|
|
# Value parameterized tests. |
|
|
|
|
self.RunAndVerify('*/*', PARAM_TESTS) |
|
|
|
@ -586,7 +585,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
os.remove(shard_status_file) |
|
|
|
|
|
|
|
|
|
def testShardStatusFileIsCreatedWithListTests(self): |
|
|
|
|
"""Tests that the shard file is created with --gtest_list_tests.""" |
|
|
|
|
"""Tests that the shard file is created with the "list_tests" flag.""" |
|
|
|
|
|
|
|
|
|
shard_status_file = os.path.join(gtest_test_utils.GetTempDir(), |
|
|
|
|
'shard_status_file2') |
|
|
|
@ -594,32 +593,41 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase): |
|
|
|
|
|
|
|
|
|
extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file} |
|
|
|
|
try: |
|
|
|
|
InvokeWithModifiedEnv(extra_env, |
|
|
|
|
RunAndReturnOutput, |
|
|
|
|
['--gtest_list_tests']) |
|
|
|
|
output = InvokeWithModifiedEnv(extra_env, |
|
|
|
|
RunAndReturnOutput, |
|
|
|
|
[LIST_TESTS_FLAG]) |
|
|
|
|
finally: |
|
|
|
|
# This assertion ensures that Google Test enumerated the tests as |
|
|
|
|
# opposed to running them. |
|
|
|
|
self.assert_('[==========]' not in output, |
|
|
|
|
'Unexpected output during test enumeration.\n' |
|
|
|
|
'Please ensure that LIST_TESTS_FLAG is assigned the\n' |
|
|
|
|
'correct flag value for listing Google Test tests.') |
|
|
|
|
|
|
|
|
|
self.assert_(os.path.exists(shard_status_file)) |
|
|
|
|
os.remove(shard_status_file) |
|
|
|
|
|
|
|
|
|
def testShardingWorksWithDeathTests(self): |
|
|
|
|
"""Tests integration with death tests and sharding.""" |
|
|
|
|
gtest_filter = 'HasDeathTest.*:SeqP/*' |
|
|
|
|
expected_tests = [ |
|
|
|
|
'HasDeathTest.Test1', |
|
|
|
|
'HasDeathTest.Test2', |
|
|
|
|
|
|
|
|
|
'SeqP/ParamTest.TestX/0', |
|
|
|
|
'SeqP/ParamTest.TestX/1', |
|
|
|
|
'SeqP/ParamTest.TestY/0', |
|
|
|
|
'SeqP/ParamTest.TestY/1', |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
for flag in ['--gtest_death_test_style=threadsafe', |
|
|
|
|
'--gtest_death_test_style=fast']: |
|
|
|
|
self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests, |
|
|
|
|
check_exit_0=True, args=[flag]) |
|
|
|
|
self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests, |
|
|
|
|
check_exit_0=True, args=[flag]) |
|
|
|
|
if SUPPORTS_DEATH_TESTS: |
|
|
|
|
def testShardingWorksWithDeathTests(self): |
|
|
|
|
"""Tests integration with death tests and sharding.""" |
|
|
|
|
|
|
|
|
|
gtest_filter = 'HasDeathTest.*:SeqP/*' |
|
|
|
|
expected_tests = [ |
|
|
|
|
'HasDeathTest.Test1', |
|
|
|
|
'HasDeathTest.Test2', |
|
|
|
|
|
|
|
|
|
'SeqP/ParamTest.TestX/0', |
|
|
|
|
'SeqP/ParamTest.TestX/1', |
|
|
|
|
'SeqP/ParamTest.TestY/0', |
|
|
|
|
'SeqP/ParamTest.TestY/1', |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
for flag in ['--gtest_death_test_style=threadsafe', |
|
|
|
|
'--gtest_death_test_style=fast']: |
|
|
|
|
self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests, |
|
|
|
|
check_exit_0=True, args=[flag]) |
|
|
|
|
self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests, |
|
|
|
|
check_exit_0=True, args=[flag]) |
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
gtest_test_utils.Main() |
|
|
|
|