OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | |
3 # | |
4 # Use of this source code is governed by a BSD-style license | |
5 # that can be found in the LICENSE file in the root of the source | |
6 # tree. An additional intellectual property rights grant can be found | |
7 # in the file PATENTS. All contributing project authors may | |
8 # be found in the AUTHORS file in the root of the source tree. | |
9 | |
10 """Runs various WebRTC tests through valgrind_test.py. | |
11 | |
12 This script inherits the chrome_tests.py in Chrome, but allows running any test | |
13 instead of only the hard-coded ones. It uses the -t cmdline flag to do this, and | |
14 only supports specifying a single test for each run. | |
15 | |
16 Suppression files: | |
17 The Chrome valgrind directory we use as a DEPS dependency contains the following | |
18 suppression files: | |
19 valgrind/memcheck/suppressions.txt | |
20 valgrind/memcheck/suppressions_mac.txt | |
21 Since they're referenced from the chrome_tests.py script, we have similar files | |
22 below the directory of this script. When executing, this script will setup both | |
23 Chrome's suppression files and our own, so we can easily maintain WebRTC | |
24 specific suppressions in our own files. | |
25 """ | |
26 | |
27 import logging | |
28 import optparse | |
29 import os | |
30 import sys | |
31 | |
32 import logging_utils | |
33 import path_utils | |
34 | |
35 import chrome_tests | |
36 | |
37 | |
38 class WebRTCTest(chrome_tests.ChromeTests): | |
39 """Class that handles setup of suppressions for WebRTC. | |
40 | |
41 Everything else is inherited from chrome_tests.ChromeTests. | |
42 """ | |
43 | |
44 def __init__(self, test_name, options, args, test_in_chrome_tests): | |
45 """Create a WebRTC test. | |
46 Args: | |
47 test_name: Short name for the test executable (no path). | |
48 options: options to pass to ChromeTests. | |
49 args: args to pass to ChromeTests. | |
50 test_in_chrome_tests: The name of the test configuration in ChromeTests. | |
51 """ | |
52 self._test_name = test_name | |
53 chrome_tests.ChromeTests.__init__(self, options, args, test_in_chrome_tests) | |
54 | |
55 def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None): | |
56 """Override command-building method so we can add more suppressions.""" | |
57 cmd = chrome_tests.ChromeTests._DefaultCommand(self, tool, exe, | |
58 valgrind_test_args) | |
59 | |
60 # Add gtest filters, if found. | |
61 chrome_tests.ChromeTests._AppendGtestFilter(self, tool, self._test_name, | |
62 cmd) | |
63 | |
64 # When ChromeTests._DefaultCommand has executed, it has setup suppression | |
65 # files based on what's found in the memcheck/ subdirectory of | |
66 # this script's location. If Mac or Windows is executing, additional | |
67 # platform specific files have also been added. | |
68 # Since only the ones located below this directory are added, we must also | |
69 # add the ones maintained by Chrome, located in ../../tools/valgrind. | |
70 | |
71 # The idea is to look for --suppression arguments in the cmd list and add a | |
72 # modified copy of each suppression file, for the corresponding file in | |
73 # ../../tools/valgrind. | |
74 script_dir = path_utils.ScriptDir() | |
75 checkout_src = os.path.abspath(os.path.join(script_dir, os.pardir, | |
76 os.pardir)) | |
77 new_dir = os.path.join(checkout_src, 'tools', 'valgrind') | |
78 add_suppressions = [] | |
79 for token in cmd: | |
80 if '--suppressions' in token: | |
81 add_suppressions.append(token.replace(script_dir, new_dir)) | |
82 return add_suppressions + cmd | |
83 | |
84 | |
85 def main(_): | |
86 parser = optparse.OptionParser( | |
87 'usage: %prog -b <dir> -t <test> -- <test args>') | |
88 parser.disable_interspersed_args() | |
89 parser.add_option('-b', '--build-dir', | |
90 help=('Location of the compiler output. Can only be used ' | |
91 'when the test argument does not contain this path.')) | |
92 parser.add_option("--target", help="Debug or Release") | |
93 parser.add_option('-t', '--test', help='Test to run.') | |
94 parser.add_option('', '--baseline', action='store_true', default=False, | |
95 help='Generate baseline data instead of validating') | |
96 parser.add_option('', '--gtest_filter', | |
97 help='Additional arguments to --gtest_filter') | |
98 parser.add_option('', '--gtest_repeat', | |
99 help='Argument for --gtest_repeat') | |
100 parser.add_option("--gtest_shuffle", action="store_true", default=False, | |
101 help="Randomize tests' orders on every iteration.") | |
102 parser.add_option("--gtest_break_on_failure", action="store_true", | |
103 default=False, | |
104 help="Drop in to debugger on assertion failure. Also " | |
105 "useful for forcing tests to exit with a stack dump " | |
106 "on the first assertion failure when running with " | |
107 "--gtest_repeat=-1") | |
108 parser.add_option('-v', '--verbose', action='store_true', default=False, | |
109 help='Verbose output - enable debug log messages') | |
110 parser.add_option('', '--tool', dest='valgrind_tool', default='memcheck', | |
111 help='Specify a valgrind tool to run the tests under') | |
112 parser.add_option('', '--tool_flags', dest='valgrind_tool_flags', default='', | |
113 help='Specify custom flags for the selected valgrind tool') | |
114 parser.add_option('', '--keep_logs', action='store_true', default=False, | |
115 help=('Store memory tool logs in the <tool>.logs directory ' | |
116 'instead of /tmp.\nThis can be useful for tool ' | |
117 'developers/maintainers.\nPlease note that the <tool>' | |
118 '.logs directory will be clobbered on tool startup.')) | |
119 parser.add_option("--test-launcher-bot-mode", action="store_true", | |
120 help="run the tests with --test-launcher-bot-mode") | |
121 parser.add_option("--test-launcher-total-shards", type=int, | |
122 help="run the tests with --test-launcher-total-shards") | |
123 parser.add_option("--test-launcher-shard-index", type=int, | |
124 help="run the tests with --test-launcher-shard-index") | |
125 options, args = parser.parse_args() | |
126 | |
127 if options.verbose: | |
128 logging_utils.config_root(logging.DEBUG) | |
129 else: | |
130 logging_utils.config_root() | |
131 | |
132 if not options.test: | |
133 parser.error('--test not specified') | |
134 | |
135 # Support build dir both with and without the target. | |
136 if (options.target and options.build_dir and | |
137 not options.build_dir.endswith(options.target)): | |
138 options.build_dir = os.path.join(options.build_dir, options.target) | |
139 | |
140 # If --build_dir is provided, prepend it to the test executable if needed. | |
141 test_executable = options.test | |
142 if options.build_dir and not test_executable.startswith(options.build_dir): | |
143 test_executable = os.path.join(options.build_dir, test_executable) | |
144 args = [test_executable] + args | |
145 | |
146 test = WebRTCTest(options.test, options, args, 'cmdline') | |
147 return test.Run() | |
148 | |
149 if __name__ == '__main__': | |
150 return_code = main(sys.argv) | |
151 sys.exit(return_code) | |
OLD | NEW |