| # Copyright 2016 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import fnmatch |
| import json |
| import os |
| import subprocess |
| import sys |
| |
| |
| # Add src/testing/ into sys.path for importing common without pylint errors. |
| sys.path.append( |
| os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) |
| from scripts import common |
| |
| |
| def ParseTestList(test_list_contents): |
| lines = test_list_contents.splitlines() |
| |
| all_tests = [] |
| fixture = None |
| for line in lines: |
| if '#' in line: |
| line = line[:line.index('#')] |
| line = line.rstrip() |
| if line[0] == ' ': |
| assert fixture |
| all_tests.append(fixture + line.lstrip()) |
| else: |
| fixture = line |
| |
| return all_tests |
| |
| |
| def LoadFilterList(filter_file): |
| with open(filter_file, 'r') as f: |
| lines = f.readlines() |
| |
| all_filters = [] |
| for line in lines: |
| if '#' in line: |
| line = line[:line.index('#')] |
| line = line.strip() |
| if not line: |
| continue |
| assert line.startswith('-') # TODO(scottmg): Handle +s. |
| all_filters.append(line[1:]) |
| |
| return all_filters |
| |
| |
| def FilterMatchesTest(filter_string, test_string): |
| """Does something close enough to base/strings/pattern.h's MatchPattern() for |
| our purposes here.""" |
| return fnmatch.fnmatch(test_string, filter_string) |
| |
| |
| def main_run(args): |
| binary_name = args.args[0] |
| test_filter_file = args.args[1] |
| base_path = os.path.join(args.paths['checkout'], 'out', args.build_config_fs) |
| list_tests_output = subprocess.check_output( |
| [os.path.join(base_path, binary_name), '--gtest_list_tests']) |
| tests = ParseTestList(list_tests_output) |
| negative_filter_list = LoadFilterList( |
| os.path.join(base_path, test_filter_file)) |
| |
| result = {'valid': True, 'failures': []} |
| result['total_tests'] = len(tests) |
| result['disabled_tests'] = len([t for t in tests if '.DISABLED_' in t]) |
| |
| # Filter out all the tests that aren't being run. |
| for f in negative_filter_list: |
| tests = [t for t in tests if not FilterMatchesTest(f, t)] |
| result['filtered_tests'] = result['total_tests'] - len(tests) |
| |
| json.dump(result, args.output) |
| return 0 |
| |
| |
| def main_compile_targets(args): |
| # TODO(scottmg): Get the binary name passed here instead of hardcoding. |
| json.dump(['browser_tests', 'content_browsertests'], args.output) |
| |
| |
| if __name__ == '__main__': |
| funcs = { |
| 'run': main_run, |
| 'compile_targets': main_compile_targets, |
| } |
| sys.exit(common.run_script(sys.argv[1:], funcs)) |