diff --git a/os_testr/os_testr.py b/os_testr/os_testr.py index 149d5ce..353868c 100755 --- a/os_testr/os_testr.py +++ b/os_testr/os_testr.py @@ -66,20 +66,69 @@ def parse_args(): 'encountered. Running with subunit or pretty' 'output enable will force the loop to run tests' '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) opts = parser.parse_args() 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: exclude_regex = '' else: black_file = open(blacklist_file, 'r') exclude_regex = '' for line in black_file: - regex = line.strip() - exclude_regex = '|'.join([regex, exclude_regex]) + raw_line = line.strip() + 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: exclude_regex = "'(?!.*" + exclude_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 # and makes tons of unfounded assumptions, but it works for the most part if (subunit or pretty) and until_failure: - 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 = ['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 + test_list = _get_test_list(regex, env) count = 0 failed = False if not test_list: @@ -217,7 +248,8 @@ def main(): msg = "You can not use until_failure mode with pdb or no-discover" print(msg) 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'): subprocess.call(['testr', 'init']) if not opts.no_discover and not opts.pdb: