page_test_runner.py revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1# Copyright (c) 2012 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4import logging
5import os
6import sys
7
8from telemetry.core import browser_finder
9from telemetry.core import browser_options
10from telemetry.page import page_test
11from telemetry.page import page_runner
12from telemetry.page import page_set
13from telemetry.test import discover
14
15def Main(test_dir, page_set_filenames):
16  """Turns a PageTest into a command-line program.
17
18  Args:
19    test_dir: Path to directory containing PageTests.
20  """
21  tests = discover.DiscoverClasses(test_dir,
22                                   os.path.join(test_dir, '..'),
23                                   page_test.PageTest)
24
25  # Naively find the test. If we use the browser options parser, we run
26  # the risk of failing to parse if we use a test-specific parameter.
27  test_name = None
28  for arg in sys.argv:
29    if arg in tests:
30      test_name = arg
31
32  options = browser_options.BrowserOptions()
33  parser = options.CreateParser('%prog [options] <test> <page_set>')
34
35  page_runner.PageRunner.AddCommandLineOptions(parser)
36
37  test = None
38  if test_name is not None:
39    if test_name not in tests:
40      sys.stderr.write('No test name %s found' % test_name)
41      sys.exit(1)
42    test = tests[test_name]()
43    test.AddCommandLineOptions(parser)
44
45  _, args = parser.parse_args()
46
47  if test is None or len(args) != 2:
48    parser.print_usage()
49    print >> sys.stderr, 'Available tests:\n%s\n' % ',\n'.join(
50        sorted(tests.keys()))
51    print >> sys.stderr, 'Available page_sets:\n%s\n' % ',\n'.join(
52        sorted([os.path.relpath(f)
53                for f in page_set_filenames]))
54    sys.exit(1)
55
56  ps = page_set.PageSet.FromFile(args[1])
57  results = page_test.PageTestResults()
58
59  return RunTestOnPageSet(options, ps, test, results)
60
61def RunTestOnPageSet(options, ps, test, results):
62  test.CustomizeBrowserOptions(options)
63  possible_browser = browser_finder.FindBrowser(options)
64  if not possible_browser:
65    print >> sys.stderr, """No browser found.\n
66Use --browser=list to figure out which are available.\n"""
67    sys.exit(1)
68
69  with page_runner.PageRunner(ps) as runner:
70    runner.Run(options, possible_browser, test, results)
71
72  print '%i pages succeed\n' % len(results.page_successes)
73  if len(results.page_failures):
74    logging.warning('Failed pages: %s', '\n'.join(
75        [failure['page'].url for failure in results.page_failures]))
76
77  if len(results.skipped_pages):
78    logging.warning('Skipped pages: %s', '\n'.join(
79        [skipped['page'].url for skipped in results.skipped_pages]))
80  return min(255, len(results.page_failures))
81