Add support for having comments in the exclude file

This commit adds the support to have comments in the exclude file.
After this commit anything after a '#' will be treated as a comment
and ignored for matching. A new option --print-exclude is added which
will print out what is being skipped by the exclude file with any
comments in the file.

Change-Id: Ia357730f918e0a57cf2ac51cd8195e2721667511
This commit is contained in:
Matthew Treinish 2015-04-13 11:32:50 -04:00
parent 80012c0c0a
commit ff3dc87d6b

View File

@ -66,20 +66,69 @@ def parse_args():
'encountered. Running with subunit or pretty' 'encountered. Running with subunit or pretty'
'output enable will force the loop to run tests' 'output enable will force the loop to run tests'
'serially') 'serially')
parser.add_argument('--print-exclude', action='store_true',
help='If an exclude file is used this option will '
'prints the comment from the same line and all '
'skipped tests before the test run')
parser.set_defaults(pretty=True, slowest=True, parallel=True) parser.set_defaults(pretty=True, slowest=True, parallel=True)
opts = parser.parse_args() opts = parser.parse_args()
return opts return opts
def construct_regex(blacklist_file, regex): def _get_test_list(regex, env=None):
env = env or copy.deepcopy(os.environ)
proc = subprocess.Popen(['testr', 'list-tests', regex], env=env,
stdout=subprocess.PIPE)
out = proc.communicate()[0]
raw_test_list = out.split('\n')
bad = False
test_list = []
exclude_list = ['OS_', 'CAPTURE', 'TEST_TIMEOUT', 'PYTHON',
'subunit.run discover']
for line in raw_test_list:
for exclude in exclude_list:
if exclude in line:
bad = True
break
elif not line:
bad = True
break
if not bad:
test_list.append(line)
bad = False
return test_list
def print_skips(regex, message):
test_list = _get_test_list(regex)
if test_list:
if message:
print(message)
else:
print('Skipped because of regex %s:' % regex)
for test in test_list:
print(test)
# Extra whitespace to separate
print('\n')
def construct_regex(blacklist_file, regex, print_exclude):
if not blacklist_file: if not blacklist_file:
exclude_regex = '' exclude_regex = ''
else: else:
black_file = open(blacklist_file, 'r') black_file = open(blacklist_file, 'r')
exclude_regex = '' exclude_regex = ''
for line in black_file: for line in black_file:
regex = line.strip() raw_line = line.strip()
exclude_regex = '|'.join([regex, exclude_regex]) split_line = raw_line.split('#')
# Before the # is the regex
regex = split_line[0].strip()
# After the # is a comment
comment = split_line[1].strip()
if regex:
if print_exclude:
print_skips(regex, comment)
exclude_regex = '|'.join([regex, exclude_regex])
if exclude_regex: if exclude_regex:
exclude_regex = "'(?!.*" + exclude_regex + ")" exclude_regex = "'(?!.*" + exclude_regex + ")"
if regex: if regex:
@ -106,25 +155,7 @@ def call_testr(regex, subunit, pretty, list_tests, slowest, parallel, concur,
# This workaround is necessary because of lp bug 1411804 it's super hacky # This workaround is necessary because of lp bug 1411804 it's super hacky
# and makes tons of unfounded assumptions, but it works for the most part # and makes tons of unfounded assumptions, but it works for the most part
if (subunit or pretty) and until_failure: if (subunit or pretty) and until_failure:
proc = subprocess.Popen(['testr', 'list-tests', regex], env=env, test_list = _get_test_list(regex, env)
stdout=subprocess.PIPE)
out = proc.communicate()[0]
raw_test_list = out.split('\n')
bad = False
test_list = []
exclude_list = ['CAPTURE', 'TEST_TIMEOUT', 'PYTHON',
'subunit.run discover']
for line in raw_test_list:
for exclude in exclude_list:
if exclude in line:
bad = True
break
elif not line:
bad = True
break
if not bad:
test_list.append(line)
bad = False
count = 0 count = 0
failed = False failed = False
if not test_list: if not test_list:
@ -217,7 +248,8 @@ def main():
msg = "You can not use until_failure mode with pdb or no-discover" msg = "You can not use until_failure mode with pdb or no-discover"
print(msg) print(msg)
exit(5) exit(5)
exclude_regex = construct_regex(opts.blacklist_file, opts.regex) exclude_regex = construct_regex(opts.blacklist_file, opts.regex,
opts.print_exclude)
if not os.path.isdir('.testrepository'): if not os.path.isdir('.testrepository'):
subprocess.call(['testr', 'init']) subprocess.call(['testr', 'init'])
if not opts.no_discover and not opts.pdb: if not opts.no_discover and not opts.pdb: