Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Parses the command line, discovers the appropriate tests, and runs them. | 5 """Parses the command line, discovers the appropriate tests, and runs them. |
| 6 | 6 |
| 7 Handles test configuration, but all the logic for | 7 Handles test configuration, but all the logic for |
| 8 actually running the test is in Test and PageRunner.""" | 8 actually running the test is in Test and PageRunner.""" |
| 9 | 9 |
| 10 import hashlib | 10 import hashlib |
| 11 import inspect | 11 import inspect |
| 12 import json | 12 import json |
| 13 import os | 13 import os |
| 14 import sys | 14 import sys |
| 15 | 15 |
| 16 from telemetry import benchmark | 16 from telemetry import benchmark |
| 17 from telemetry import decorators | 17 from telemetry import decorators |
| 18 from telemetry.core import browser_finder | 18 from telemetry.core import browser_finder |
| 19 from telemetry.core import browser_options | 19 from telemetry.core import browser_options |
| 20 from telemetry.core import command_line | 20 from telemetry.core import command_line |
| 21 from telemetry.core import discover | 21 from telemetry.core import discover |
| 22 from telemetry.core import environment | 22 from telemetry.core import environment |
| 23 from telemetry.core import util | 23 from telemetry.core import util |
| 24 from telemetry.page import page_set | 24 from telemetry.page import page_set |
| 25 from telemetry.page import page_test | |
| 26 from telemetry.page import profile_creator | |
| 27 from telemetry.util import find_dependencies | 25 from telemetry.util import find_dependencies |
| 28 | 26 |
| 29 | 27 |
| 30 class Deps(find_dependencies.FindDependenciesCommand): | 28 class Deps(find_dependencies.FindDependenciesCommand): |
| 31 """Prints all dependencies""" | 29 """Prints all dependencies""" |
| 32 | 30 |
| 33 def Run(self, args): | 31 def Run(self, args): |
| 34 main_module = sys.modules['__main__'] | 32 main_module = sys.modules['__main__'] |
| 35 args.positional_args.append(os.path.realpath(main_module.__file__)) | 33 args.positional_args.append(os.path.realpath(main_module.__file__)) |
| 36 return super(Deps, self).Run(args) | 34 return super(Deps, self).Run(args) |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 f.write(_GetJsonTestList(possible_browser, possible_reference_browser, | 97 f.write(_GetJsonTestList(possible_browser, possible_reference_browser, |
| 100 args.tests, args.num_shards)) | 98 args.tests, args.num_shards)) |
| 101 else: | 99 else: |
| 102 _PrintTestList(args.tests) | 100 _PrintTestList(args.tests) |
| 103 return 0 | 101 return 0 |
| 104 | 102 |
| 105 | 103 |
| 106 class Run(command_line.OptparseCommand): | 104 class Run(command_line.OptparseCommand): |
| 107 """Run one or more tests (default)""" | 105 """Run one or more tests (default)""" |
| 108 | 106 |
| 109 usage = 'test_name [page_set] [<options>]' | 107 usage = 'test_name [page_set] [<options>]' |
|
nednguyen
2014/10/16 02:25:31
Remove [page_set]. I would also change the word "t
| |
| 110 | 108 |
| 111 @classmethod | 109 @classmethod |
| 112 def CreateParser(cls): | 110 def CreateParser(cls): |
| 113 options = browser_options.BrowserFinderOptions() | 111 options = browser_options.BrowserFinderOptions() |
| 114 parser = options.CreateParser('%%prog %s %s' % (cls.Name(), cls.usage)) | 112 parser = options.CreateParser('%%prog %s %s' % (cls.Name(), cls.usage)) |
| 115 return parser | 113 return parser |
| 116 | 114 |
| 117 @classmethod | 115 @classmethod |
| 118 def AddCommandLineArgs(cls, parser): | 116 def AddCommandLineArgs(cls, parser): |
| 119 benchmark.AddCommandLineArgs(parser) | 117 benchmark.AddCommandLineArgs(parser) |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 146 sys.exit(-1) | 144 sys.exit(-1) |
| 147 | 145 |
| 148 if len(matching_tests) > 1: | 146 if len(matching_tests) > 1: |
| 149 print >> sys.stderr, 'Multiple tests named "%s".' % input_test_name | 147 print >> sys.stderr, 'Multiple tests named "%s".' % input_test_name |
| 150 print >> sys.stderr, 'Did you mean one of these?' | 148 print >> sys.stderr, 'Did you mean one of these?' |
| 151 print >> sys.stderr | 149 print >> sys.stderr |
| 152 _PrintTestList(matching_tests) | 150 _PrintTestList(matching_tests) |
| 153 sys.exit(-1) | 151 sys.exit(-1) |
| 154 | 152 |
| 155 test_class = matching_tests.pop() | 153 test_class = matching_tests.pop() |
| 156 if issubclass(test_class, page_test.PageTest): | 154 if len(args.positional_args) > 1: |
| 157 if len(args.positional_args) < 2: | 155 parser.error('Too many arguments.') |
| 158 parser.error('Need to specify a page set for "%s".' % test_class.Name()) | |
| 159 if len(args.positional_args) > 2: | |
| 160 parser.error('Too many arguments.') | |
| 161 page_set_name = args.positional_args[1] | |
| 162 page_set_class = _MatchPageSetName(page_set_name) | |
| 163 if page_set_class is None: | |
| 164 parser.error("Page set %s not found. Available sets:\n%s" % | |
| 165 (page_set_name, _AvailablePageSetNamesString())) | |
| 166 | |
| 167 class TestWrapper(benchmark.Benchmark): | |
| 168 test = test_class | |
| 169 | |
| 170 @classmethod | |
| 171 def CreatePageSet(cls, options): | |
| 172 return page_set_class() | |
| 173 | |
| 174 test_class = TestWrapper | |
| 175 else: | |
| 176 if len(args.positional_args) > 1: | |
| 177 parser.error('Too many arguments.') | |
| 178 | 156 |
| 179 assert issubclass(test_class, benchmark.Benchmark), ( | 157 assert issubclass(test_class, benchmark.Benchmark), ( |
| 180 'Trying to run a non-Benchmark?!') | 158 'Trying to run a non-Benchmark?!') |
| 181 | 159 |
| 182 benchmark.ProcessCommandLineArgs(parser, args) | 160 benchmark.ProcessCommandLineArgs(parser, args) |
| 183 test_class.ProcessCommandLineArgs(parser, args) | 161 test_class.ProcessCommandLineArgs(parser, args) |
| 184 | 162 |
| 185 cls._test = test_class | 163 cls._test = test_class |
| 186 | 164 |
| 187 def Run(self, args): | 165 def Run(self, args): |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 199 continue | 177 continue |
| 200 if not issubclass(cls, command_line.Command): | 178 if not issubclass(cls, command_line.Command): |
| 201 continue | 179 continue |
| 202 yield cls | 180 yield cls |
| 203 | 181 |
| 204 def _MatchingCommands(string): | 182 def _MatchingCommands(string): |
| 205 return [command for command in _Commands() | 183 return [command for command in _Commands() |
| 206 if command.Name().startswith(string)] | 184 if command.Name().startswith(string)] |
| 207 | 185 |
| 208 @decorators.Cache | 186 @decorators.Cache |
| 209 def _Tests(): | 187 def _Tests(): |
|
nednguyen
2014/10/16 02:25:31
s/_Tests/_Benchmarks.
ernstm
2014/10/16 17:54:28
Done.
| |
| 210 tests = [] | 188 tests = [] |
| 211 for base_dir in config.base_paths: | 189 for base_dir in config.base_paths: |
| 212 tests += discover.DiscoverClasses(base_dir, base_dir, benchmark.Benchmark, | 190 tests += discover.DiscoverClasses(base_dir, base_dir, benchmark.Benchmark, |
| 213 index_by_class_name=True).values() | 191 index_by_class_name=True).values() |
| 214 page_tests = discover.DiscoverClasses(base_dir, base_dir, | |
| 215 page_test.PageTest, | |
| 216 index_by_class_name=True).values() | |
| 217 tests += [test_class for test_class in page_tests | |
| 218 if not issubclass(test_class, profile_creator.ProfileCreator)] | |
| 219 return tests | 192 return tests |
| 220 | 193 |
| 221 | 194 |
| 222 # TODO(ariblue): Use discover.py's abstracted _MatchName class (in pending CL | 195 # TODO(ariblue): Use discover.py's abstracted _MatchName class (in pending CL |
| 223 # 432543003) and eliminate _MatchPageSetName and _MatchTestName. | 196 # 432543003) and eliminate _MatchPageSetName and _MatchTestName. |
| 224 def _MatchPageSetName(input_name): | 197 def _MatchPageSetName(input_name): |
|
nednguyen
2014/10/16 02:25:31
Remove this?
ernstm
2014/10/16 17:54:28
Done.
| |
| 225 page_sets = [] | 198 page_sets = [] |
| 226 for base_dir in config.base_paths: | 199 for base_dir in config.base_paths: |
| 227 page_sets += discover.DiscoverClasses(base_dir, base_dir, page_set.PageSet, | 200 page_sets += discover.DiscoverClasses(base_dir, base_dir, page_set.PageSet, |
| 228 index_by_class_name=True).values() | 201 index_by_class_name=True).values() |
| 229 for p in page_sets: | 202 for p in page_sets: |
| 230 if input_name == p.Name(): | 203 if input_name == p.Name(): |
| 231 return p | 204 return p |
| 232 return None | 205 return None |
| 233 | 206 |
| 234 | 207 |
| 235 def _AvailablePageSetNamesString(): | 208 def _AvailablePageSetNamesString(): |
|
nednguyen
2014/10/16 02:25:31
Dead code.
ernstm
2014/10/16 17:54:28
Done.
| |
| 236 result = "" | 209 result = "" |
| 237 for base_dir in config.base_paths: | 210 for base_dir in config.base_paths: |
| 238 for p in discover.DiscoverClasses(base_dir, base_dir, page_set.PageSet, | 211 for p in discover.DiscoverClasses(base_dir, base_dir, page_set.PageSet, |
| 239 index_by_class_name=True).values(): | 212 index_by_class_name=True).values(): |
| 240 result += p.Name() + "\n" | 213 result += p.Name() + "\n" |
| 241 return result | 214 return result |
| 242 | 215 |
| 243 | 216 |
| 244 def _MatchTestName(input_test_name, exact_matches=True): | 217 def _MatchTestName(input_test_name, exact_matches=True): |
|
nednguyen
2014/10/16 02:25:31
_MatchBenchmarkName
ernstm
2014/10/16 17:54:28
Done.
| |
| 245 def _Matches(input_string, search_string): | 218 def _Matches(input_string, search_string): |
| 246 if search_string.startswith(input_string): | 219 if search_string.startswith(input_string): |
| 247 return True | 220 return True |
| 248 for part in search_string.split('.'): | 221 for part in search_string.split('.'): |
| 249 if part.startswith(input_string): | 222 if part.startswith(input_string): |
| 250 return True | 223 return True |
| 251 return False | 224 return False |
| 252 | 225 |
| 253 # Exact matching. | 226 # Exact matching. |
| 254 if exact_matches: | 227 if exact_matches: |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 | 307 |
| 335 filtered_tests = [test_class for test_class in tests | 308 filtered_tests = [test_class for test_class in tests |
| 336 if issubclass(test_class, benchmark.Benchmark)] | 309 if issubclass(test_class, benchmark.Benchmark)] |
| 337 if filtered_tests: | 310 if filtered_tests: |
| 338 print >> sys.stderr, 'Available tests are:' | 311 print >> sys.stderr, 'Available tests are:' |
| 339 for test_class in sorted(filtered_tests, key=lambda t: t.Name()): | 312 for test_class in sorted(filtered_tests, key=lambda t: t.Name()): |
| 340 print >> sys.stderr, format_string % ( | 313 print >> sys.stderr, format_string % ( |
| 341 test_class.Name(), test_class.Description()) | 314 test_class.Name(), test_class.Description()) |
| 342 print >> sys.stderr | 315 print >> sys.stderr |
| 343 | 316 |
| 344 filtered_tests = [test_class for test_class in tests | |
| 345 if issubclass(test_class, page_test.PageTest)] | |
| 346 if filtered_tests: | |
| 347 print >> sys.stderr, 'Available page tests are:' | |
| 348 for test_class in sorted(filtered_tests, key=lambda t: t.Name()): | |
| 349 print >> sys.stderr, format_string % ( | |
| 350 test_class.Name(), test_class.Description()) | |
| 351 print >> sys.stderr | |
| 352 | |
| 353 | 317 |
| 354 config = environment.Environment([util.GetBaseDir()]) | 318 config = environment.Environment([util.GetBaseDir()]) |
| 355 | 319 |
| 356 | 320 |
| 357 def main(): | 321 def main(): |
| 358 # Get the command name from the command line. | 322 # Get the command name from the command line. |
| 359 if len(sys.argv) > 1 and sys.argv[1] == '--help': | 323 if len(sys.argv) > 1 and sys.argv[1] == '--help': |
| 360 sys.argv[1] = 'help' | 324 sys.argv[1] = 'help' |
| 361 | 325 |
| 362 command_name = 'run' | 326 command_name = 'run' |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 381 | 345 |
| 382 # Parse and run the command. | 346 # Parse and run the command. |
| 383 parser = command.CreateParser() | 347 parser = command.CreateParser() |
| 384 command.AddCommandLineArgs(parser) | 348 command.AddCommandLineArgs(parser) |
| 385 options, args = parser.parse_args() | 349 options, args = parser.parse_args() |
| 386 if commands: | 350 if commands: |
| 387 args = args[1:] | 351 args = args[1:] |
| 388 options.positional_args = args | 352 options.positional_args = args |
| 389 command.ProcessCommandLineArgs(parser, options) | 353 command.ProcessCommandLineArgs(parser, options) |
| 390 return command().Run(options) | 354 return command().Run(options) |
| OLD | NEW |