diff --git a/os_testr/testlist_builder.py b/os_testr/testlist_builder.py index af05795..4a8175f 100644 --- a/os_testr/testlist_builder.py +++ b/os_testr/testlist_builder.py @@ -94,8 +94,11 @@ def construct_list(blacklist_file, whitelist_file, regex, black_regex, for (rex, msg, s_list) in black_data: for test_case in list_of_test_cases: if rex.search(test_case): - set_of_test_cases.remove(test_case) - s_list.append(test_case) + # NOTE(mtreinish): In the case of overlapping regex the test + # case might have already been removed from the set of tests + if test_case in set_of_test_cases: + set_of_test_cases.remove(test_case) + s_list.append(test_case) if print_exclude: for (rex, msg, s_list) in black_data: diff --git a/os_testr/tests/testlist_builder.py b/os_testr/tests/testlist_builder.py index 5424feb..30fbabe 100644 --- a/os_testr/tests/testlist_builder.py +++ b/os_testr/tests/testlist_builder.py @@ -114,3 +114,25 @@ class TestConstructList(base.TestCase): False) self.assertEqual(set(result), set(('fake_test1[tg]', 'fake_test3[tg,foo]'))) + + def test_overlapping_black_regex(self): + + black_list = [(re.compile('compute.test_keypairs.KeypairsTestV210'), + '', []), + (re.compile('compute.test_keypairs.KeypairsTestV21'), + '', [])] + test_lists = [ + 'compute.test_keypairs.KeypairsTestV210.test_create_keypair', + 'compute.test_keypairs.KeypairsTestV21.test_create_keypair', + 'compute.test_fake.FakeTest.test_fake_test'] + with mock.patch('os_testr.regex_builder._get_test_list', + return_value=test_lists): + with mock.patch('os_testr.testlist_builder.black_reader', + return_value=black_list): + result = list_builder.construct_list('file', + None, + 'fake_test', + None, + False) + self.assertEqual( + list(result), ['compute.test_fake.FakeTest.test_fake_test'])