OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # chrome_tests.py | 6 # chrome_tests.py |
7 | 7 |
8 ''' Runs various chrome tests through valgrind_test.py.''' | 8 ''' Runs various chrome tests through valgrind_test.py.''' |
9 | 9 |
10 import glob | 10 import glob |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 | 78 |
79 script_dir = path_utils.ScriptDir() | 79 script_dir = path_utils.ScriptDir() |
80 # Compute the top of the tree (the "source dir") from the script dir (where | 80 # Compute the top of the tree (the "source dir") from the script dir (where |
81 # this script lives). We assume that the script dir is in tools/valgrind/ | 81 # this script lives). We assume that the script dir is in tools/valgrind/ |
82 # relative to the top of the tree. | 82 # relative to the top of the tree. |
83 self._source_dir = os.path.dirname(os.path.dirname(script_dir)) | 83 self._source_dir = os.path.dirname(os.path.dirname(script_dir)) |
84 # since this path is used for string matching, make sure it's always | 84 # since this path is used for string matching, make sure it's always |
85 # an absolute Unix-style path | 85 # an absolute Unix-style path |
86 self._source_dir = os.path.abspath(self._source_dir).replace('\\', '/') | 86 self._source_dir = os.path.abspath(self._source_dir).replace('\\', '/') |
87 valgrind_test_script = os.path.join(script_dir, "valgrind_test.py") | 87 valgrind_test_script = os.path.join(script_dir, "valgrind_test.py") |
88 self._command_preamble = [valgrind_test_script, | 88 self._command_preamble = ["--source_dir=%s" % (self._source_dir)] |
89 "--source_dir=%s" % (self._source_dir)] | |
90 | 89 |
91 def _DefaultCommand(self, module, exe=None, valgrind_test_args=None): | 90 def _DefaultCommand(self, tool, module, exe=None, valgrind_test_args=None): |
92 '''Generates the default command array that most tests will use.''' | 91 '''Generates the default command array that most tests will use.''' |
93 module_dir = os.path.join(self._source_dir, module) | 92 module_dir = os.path.join(self._source_dir, module) |
94 | 93 |
95 # We need multiple data dirs, the current script directory and a module | 94 # We need multiple data dirs, the current script directory and a module |
96 # specific one. The global suppression file lives in our directory, and the | 95 # specific one. The global suppression file lives in our directory, and the |
97 # module specific suppression file lives with the module. | 96 # module specific suppression file lives with the module. |
98 self._data_dirs = [path_utils.ScriptDir()] | 97 self._data_dirs = [path_utils.ScriptDir()] |
99 | 98 |
100 if module == "chrome": | 99 if module == "chrome": |
101 # unfortunately, not all modules have the same directory structure | 100 # unfortunately, not all modules have the same directory structure |
(...skipping 12 matching lines...) Expand all Loading... |
114 os.path.join(self._source_dir, "sconsbuild", "Debug"), | 113 os.path.join(self._source_dir, "sconsbuild", "Debug"), |
115 os.path.join(self._source_dir, "out", "Debug"), | 114 os.path.join(self._source_dir, "out", "Debug"), |
116 ] | 115 ] |
117 if exe: | 116 if exe: |
118 self._options.build_dir = FindDirContainingNewestFile(dirs, exe) | 117 self._options.build_dir = FindDirContainingNewestFile(dirs, exe) |
119 else: | 118 else: |
120 self._options.build_dir = FindNewestDir(dirs) | 119 self._options.build_dir = FindNewestDir(dirs) |
121 | 120 |
122 cmd = list(self._command_preamble) | 121 cmd = list(self._command_preamble) |
123 for directory in self._data_dirs: | 122 for directory in self._data_dirs: |
124 tool_name = self._options.valgrind_tool | 123 tool_name = tool.ToolName(); |
125 suppression_file = os.path.join(directory, | 124 suppression_file = os.path.join(directory, |
126 "%s/suppressions.txt" % tool_name) | 125 "%s/suppressions.txt" % tool_name) |
127 if os.path.exists(suppression_file): | 126 if os.path.exists(suppression_file): |
128 cmd.append("--suppressions=%s" % suppression_file) | 127 cmd.append("--suppressions=%s" % suppression_file) |
129 # Platform specific suppression | 128 # Platform specific suppression |
130 for suppression_platform in common.PlatformNames(): | 129 for suppression_platform in common.PlatformNames(): |
131 suppression_file_platform = \ | 130 suppression_file_platform = \ |
132 os.path.join(directory, | 131 os.path.join(directory, |
133 '%s/suppressions_%s.txt' % (tool_name, suppression_platform)) | 132 '%s/suppressions_%s.txt' % (tool_name, suppression_platform)) |
134 if os.path.exists(suppression_file_platform): | 133 if os.path.exists(suppression_file_platform): |
135 cmd.append("--suppressions=%s" % suppression_file_platform) | 134 cmd.append("--suppressions=%s" % suppression_file_platform) |
136 | 135 |
137 cmd.append("--tool=%s" % self._options.valgrind_tool) | |
138 if self._options.valgrind_tool_flags: | 136 if self._options.valgrind_tool_flags: |
139 cmd += self._options.valgrind_tool_flags.split(" ") | 137 cmd += self._options.valgrind_tool_flags.split(" ") |
140 if valgrind_test_args != None: | 138 if valgrind_test_args != None: |
141 for arg in valgrind_test_args: | 139 for arg in valgrind_test_args: |
142 cmd.append(arg) | 140 cmd.append(arg) |
143 if exe: | 141 if exe: |
144 if common.IsWine(): | 142 if common.IsWine(): |
145 cmd.append(os.environ.get('WINE')) | 143 cmd.append(os.environ.get('WINE')) |
146 exe = exe + '.exe' | 144 exe = exe + '.exe' |
147 cmd.append(os.path.join(self._options.build_dir, exe)) | 145 cmd.append(os.path.join(self._options.build_dir, exe)) |
148 # Valgrind runs tests slowly, so slow tests hurt more; show elapased time | 146 # Valgrind runs tests slowly, so slow tests hurt more; show elapased time |
149 # so we can find the slowpokes. | 147 # so we can find the slowpokes. |
150 cmd.append("--gtest_print_time") | 148 cmd.append("--gtest_print_time") |
151 if self._options.gtest_repeat: | 149 if self._options.gtest_repeat: |
152 cmd.append("--gtest_repeat=%s" % self._options.gtest_repeat) | 150 cmd.append("--gtest_repeat=%s" % self._options.gtest_repeat) |
153 return cmd | 151 return cmd |
154 | 152 |
155 def Run(self): | 153 def Run(self): |
156 ''' Runs the test specified by command-line argument --test ''' | 154 ''' Runs the test specified by command-line argument --test ''' |
157 logging.info("running test %s" % (self._test)) | 155 logging.info("running test %s" % (self._test)) |
158 return self._test_list[self._test](self) | 156 return self._test_list[self._test](self) |
159 | 157 |
160 def _ReadGtestFilterFile(self, name, cmd): | 158 def _ReadGtestFilterFile(self, tool, name, cmd): |
161 '''Read a file which is a list of tests to filter out with --gtest_filter | 159 '''Read a file which is a list of tests to filter out with --gtest_filter |
162 and append the command-line option to cmd. | 160 and append the command-line option to cmd. |
163 ''' | 161 ''' |
164 filters = [] | 162 filters = [] |
165 for directory in self._data_dirs: | 163 for directory in self._data_dirs: |
166 gtest_filter_files = [ | 164 gtest_filter_files = [ |
167 os.path.join(directory, name + ".gtest.txt"), | 165 os.path.join(directory, name + ".gtest.txt"), |
168 os.path.join(directory, name + ".gtest-%s.txt" % \ | 166 os.path.join(directory, name + ".gtest-%s.txt" % \ |
169 self._options.valgrind_tool)] | 167 tool.ToolName())] |
170 for platform_suffix in common.PlatformNames(): | 168 for platform_suffix in common.PlatformNames(): |
171 gtest_filter_files += [ | 169 gtest_filter_files += [ |
172 os.path.join(directory, name + ".gtest_%s.txt" % platform_suffix), | 170 os.path.join(directory, name + ".gtest_%s.txt" % platform_suffix), |
173 os.path.join(directory, name + ".gtest-%s_%s.txt" % \ | 171 os.path.join(directory, name + ".gtest-%s_%s.txt" % \ |
174 (self._options.valgrind_tool, platform_suffix))] | 172 (tool.ToolName(), platform_suffix))] |
175 for filename in gtest_filter_files: | 173 for filename in gtest_filter_files: |
176 if os.path.exists(filename): | 174 if os.path.exists(filename): |
177 logging.info("reading gtest filters from %s" % filename) | 175 logging.info("reading gtest filters from %s" % filename) |
178 f = open(filename, 'r') | 176 f = open(filename, 'r') |
179 for line in f.readlines(): | 177 for line in f.readlines(): |
180 if line.startswith("#") or line.startswith("//") or line.isspace(): | 178 if line.startswith("#") or line.startswith("//") or line.isspace(): |
181 continue | 179 continue |
182 line = line.rstrip() | 180 line = line.rstrip() |
183 test_prefixes = ["FLAKY", "FAILS"] | 181 test_prefixes = ["FLAKY", "FAILS"] |
184 for p in test_prefixes: | 182 for p in test_prefixes: |
(...skipping 13 matching lines...) Expand all Loading... |
198 gtest_filter += ":" | 196 gtest_filter += ":" |
199 if gtest_filter.find("-") < 0: | 197 if gtest_filter.find("-") < 0: |
200 gtest_filter += "-" | 198 gtest_filter += "-" |
201 else: | 199 else: |
202 gtest_filter = "-" | 200 gtest_filter = "-" |
203 gtest_filter += ":".join(filters) | 201 gtest_filter += ":".join(filters) |
204 if gtest_filter: | 202 if gtest_filter: |
205 cmd.append("--gtest_filter=%s" % gtest_filter) | 203 cmd.append("--gtest_filter=%s" % gtest_filter) |
206 | 204 |
207 def SimpleTest(self, module, name, valgrind_test_args=None, cmd_args=None): | 205 def SimpleTest(self, module, name, valgrind_test_args=None, cmd_args=None): |
208 cmd = self._DefaultCommand(module, name, valgrind_test_args) | 206 tool = valgrind_test.CreateTool(self._options.valgrind_tool) |
209 self._ReadGtestFilterFile(name, cmd) | 207 cmd = self._DefaultCommand(tool, module, name, valgrind_test_args) |
| 208 self._ReadGtestFilterFile(tool, name, cmd) |
210 if cmd_args: | 209 if cmd_args: |
211 cmd.extend(["--"]) | 210 cmd.extend(["--"]) |
212 cmd.extend(cmd_args) | 211 cmd.extend(cmd_args) |
213 | 212 |
214 # Sets LD_LIBRARY_PATH to the build folder so external libraries can be | 213 # Sets LD_LIBRARY_PATH to the build folder so external libraries can be |
215 # loaded. | 214 # loaded. |
216 if (os.getenv("LD_LIBRARY_PATH")): | 215 if (os.getenv("LD_LIBRARY_PATH")): |
217 os.putenv("LD_LIBRARY_PATH", "%s:%s" % (os.getenv("LD_LIBRARY_PATH"), | 216 os.putenv("LD_LIBRARY_PATH", "%s:%s" % (os.getenv("LD_LIBRARY_PATH"), |
218 self._options.build_dir)) | 217 self._options.build_dir)) |
219 else: | 218 else: |
220 os.putenv("LD_LIBRARY_PATH", self._options.build_dir) | 219 os.putenv("LD_LIBRARY_PATH", self._options.build_dir) |
221 return valgrind_test.RunTool(cmd, module) | 220 return tool.Run(cmd, module) |
222 | 221 |
223 def TestBase(self): | 222 def TestBase(self): |
224 return self.SimpleTest("base", "base_unittests") | 223 return self.SimpleTest("base", "base_unittests") |
225 | 224 |
226 def TestBrowser(self): | 225 def TestBrowser(self): |
227 return self.SimpleTest("chrome", "browser_tests") | 226 return self.SimpleTest("chrome", "browser_tests") |
228 | 227 |
229 def TestGURL(self): | 228 def TestGURL(self): |
230 return self.SimpleTest("chrome", "googleurl_unittests") | 229 return self.SimpleTest("chrome", "googleurl_unittests") |
231 | 230 |
232 def TestCourgette(self): | 231 def TestCourgette(self): |
233 return self.SimpleTest("courgette", "courgette_unittests") | 232 return self.SimpleTest("courgette", "courgette_unittests") |
234 | 233 |
235 def TestMedia(self): | 234 def TestMedia(self): |
236 return self.SimpleTest("chrome", "media_unittests") | 235 return self.SimpleTest("chrome", "media_unittests") |
237 | 236 |
238 def TestNotifier(self): | 237 def TestNotifier(self): |
239 return self.SimpleTest("chrome", "notifier_unit_tests") | 238 return self.SimpleTest("chrome", "notifier_unit_tests") |
240 | 239 |
241 def TestPrinting(self): | 240 def TestPrinting(self): |
242 return self.SimpleTest("chrome", "printing_unittests") | 241 return self.SimpleTest("chrome", "printing_unittests") |
243 | 242 |
244 def TestRemoting(self): | 243 def TestRemoting(self): |
245 return self.SimpleTest("chrome", "remoting_unittests") | 244 return self.SimpleTest("chrome", "remoting_unittests") |
246 | 245 |
247 def TestIpc(self): | 246 def TestIpc(self): |
248 return self.SimpleTest("ipc", "ipc_tests", | 247 return self.SimpleTest("ipc", "ipc_tests", |
249 valgrind_test_args=["--trace_children"]) | 248 valgrind_test_args=["--trace_children"]) |
250 | 249 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 # list of tests. Wrap around to beginning of list at end. | 290 # list of tests. Wrap around to beginning of list at end. |
292 # If chunk_size is zero, run all tests in the list once. | 291 # If chunk_size is zero, run all tests in the list once. |
293 # If a text file is given as argument, it is used as the list of tests. | 292 # If a text file is given as argument, it is used as the list of tests. |
294 # | 293 # |
295 # Build the ginormous commandline in 'cmd'. | 294 # Build the ginormous commandline in 'cmd'. |
296 # It's going to be roughly | 295 # It's going to be roughly |
297 # python valgrind_test.py ... python run_webkit_tests.py ... | 296 # python valgrind_test.py ... python run_webkit_tests.py ... |
298 # but we'll use the --indirect flag to valgrind_test.py | 297 # but we'll use the --indirect flag to valgrind_test.py |
299 # to avoid valgrinding python. | 298 # to avoid valgrinding python. |
300 # Start by building the valgrind_test.py commandline. | 299 # Start by building the valgrind_test.py commandline. |
301 cmd = self._DefaultCommand("webkit") | 300 tool = valgrind_test.CreateTool(self._options.valgrind_tool) |
| 301 cmd = self._DefaultCommand(tool, "webkit") |
302 cmd.append("--trace_children") | 302 cmd.append("--trace_children") |
303 cmd.append("--indirect") | 303 cmd.append("--indirect") |
304 cmd.append("--ignore_exit_code") | 304 cmd.append("--ignore_exit_code") |
305 # Now build script_cmd, the run_webkits_tests.py commandline | 305 # Now build script_cmd, the run_webkits_tests.py commandline |
306 # Store each chunk in its own directory so that we can find the data later | 306 # Store each chunk in its own directory so that we can find the data later |
307 chunk_dir = os.path.join("layout", "chunk_%05d" % chunk_num) | 307 chunk_dir = os.path.join("layout", "chunk_%05d" % chunk_num) |
308 test_shell = os.path.join(self._options.build_dir, "test_shell") | 308 test_shell = os.path.join(self._options.build_dir, "test_shell") |
309 out_dir = os.path.join(path_utils.ScriptDir(), "latest") | 309 out_dir = os.path.join(path_utils.ScriptDir(), "latest") |
310 out_dir = os.path.join(out_dir, chunk_dir) | 310 out_dir = os.path.join(out_dir, chunk_dir) |
311 if os.path.exists(out_dir): | 311 if os.path.exists(out_dir): |
(...skipping 15 matching lines...) Expand all Loading... |
327 if self._options.build_dir.endswith("Debug"): | 327 if self._options.build_dir.endswith("Debug"): |
328 script_cmd.append("--debug"); | 328 script_cmd.append("--debug"); |
329 if (chunk_size > 0): | 329 if (chunk_size > 0): |
330 script_cmd.append("--run-chunk=%d:%d" % (chunk_num, chunk_size)) | 330 script_cmd.append("--run-chunk=%d:%d" % (chunk_num, chunk_size)) |
331 if len(self._args): | 331 if len(self._args): |
332 # if the arg is a txt file, then treat it as a list of tests | 332 # if the arg is a txt file, then treat it as a list of tests |
333 if os.path.isfile(self._args[0]) and self._args[0][-4:] == ".txt": | 333 if os.path.isfile(self._args[0]) and self._args[0][-4:] == ".txt": |
334 script_cmd.append("--test-list=%s" % self._args[0]) | 334 script_cmd.append("--test-list=%s" % self._args[0]) |
335 else: | 335 else: |
336 script_cmd.extend(self._args) | 336 script_cmd.extend(self._args) |
337 self._ReadGtestFilterFile("layout", script_cmd) | 337 self._ReadGtestFilterFile(tool, "layout", script_cmd) |
338 # Now run script_cmd with the wrapper in cmd | 338 # Now run script_cmd with the wrapper in cmd |
339 cmd.extend(["--"]) | 339 cmd.extend(["--"]) |
340 cmd.extend(script_cmd) | 340 cmd.extend(script_cmd) |
341 return valgrind_test.RunTool(cmd, "layout") | 341 return tool.Run(cmd, "layout") |
342 | 342 |
343 def TestLayout(self): | 343 def TestLayout(self): |
344 # A "chunk file" is maintained in the local directory so that each test | 344 # A "chunk file" is maintained in the local directory so that each test |
345 # runs a slice of the layout tests of size chunk_size that increments with | 345 # runs a slice of the layout tests of size chunk_size that increments with |
346 # each run. Since tests can be added and removed from the layout tests at | 346 # each run. Since tests can be added and removed from the layout tests at |
347 # any time, this is not going to give exact coverage, but it will allow us | 347 # any time, this is not going to give exact coverage, but it will allow us |
348 # to continuously run small slices of the layout tests under valgrind rather | 348 # to continuously run small slices of the layout tests under valgrind rather |
349 # than having to run all of them in one shot. | 349 # than having to run all of them in one shot. |
350 chunk_size = self._options.num_tests | 350 chunk_size = self._options.num_tests |
351 if (chunk_size == 0): | 351 if (chunk_size == 0): |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 for t in options.test: | 452 for t in options.test: |
453 tests = ChromeTests(options, args, t) | 453 tests = ChromeTests(options, args, t) |
454 ret = tests.Run() | 454 ret = tests.Run() |
455 if ret: return ret | 455 if ret: return ret |
456 return 0 | 456 return 0 |
457 | 457 |
458 | 458 |
459 if __name__ == "__main__": | 459 if __name__ == "__main__": |
460 ret = _main(sys.argv) | 460 ret = _main(sys.argv) |
461 sys.exit(ret) | 461 sys.exit(ret) |
OLD | NEW |