Subclass Benchmark Runner script for WebDriver support
[WebKit-https.git] / Tools / Scripts / webkitpy / benchmark_runner / run_benchmark.py
1 #!/usr/bin/env python
2
3 import argparse
4 import json
5 import logging
6 import platform
7 import os
8 import sys
9
10 from browser_driver.browser_driver_factory import BrowserDriverFactory
11 from webdriver_benchmark_runner import WebDriverBenchmarkRunner
12 from webserver_benchmark_runner import WebServerBenchmarkRunner
13
14
15 _log = logging.getLogger(__name__)
16 benchmark_runner_subclasses = {
17     WebDriverBenchmarkRunner.name: WebDriverBenchmarkRunner,
18     WebServerBenchmarkRunner.name: WebServerBenchmarkRunner,
19 }
20
21
22 def default_platform():
23     if sys.platform.startswith('linux'):
24         return 'linux'
25     return 'osx'
26
27
28 def default_browser():
29     if sys.platform.startswith('linux'):
30         return 'minibrowser-gtk'
31     return 'safari'
32
33
34 def parse_args():
35     parser = argparse.ArgumentParser(description='Automate the browser based performance benchmarks')
36     parser.add_argument('--output-file', dest='output', default=None)
37     parser.add_argument('--build-directory', dest='buildDir', help='Path to the browser executable. e.g. WebKitBuild/Release/')
38     parser.add_argument('--platform', dest='platform', default=default_platform(), choices=BrowserDriverFactory.available_platforms())
39     parser.add_argument('--browser', dest='browser', default=default_browser(), choices=BrowserDriverFactory.available_browsers())
40     parser.add_argument('--debug', action='store_true')
41     parser.add_argument('--local-copy', dest='localCopy', help='Path to a local copy of the benchmark. e.g. PerformanceTests/SunSpider/')
42     parser.add_argument('--count', dest='countOverride', type=int, help='Number of times to run the benchmark. e.g. 5')
43     parser.add_argument('--device-id', dest='device_id', default=None)
44     parser.add_argument('--driver', dest='driver', default=WebServerBenchmarkRunner.name, choices=benchmark_runner_subclasses.keys())
45     parser.add_argument('--no-adjust-unit', dest='scale_unit', action='store_false')
46     mutual_group = parser.add_mutually_exclusive_group(required=True)
47     mutual_group.add_argument('--read-results-json', dest='json_file', help='Specify file you want to format')
48     mutual_group.add_argument('--plan', dest='plan', help='Benchmark plan to run. e.g. speedometer, jetstream')
49     mutual_group.add_argument('--allplans', action='store_true', help='Run all available benchmark plans sequentially')
50
51     args = parser.parse_args()
52
53     if args.debug:
54         _log.setLevel(logging.DEBUG)
55     _log.debug('Initializing program with following parameters')
56     _log.debug('\toutput file name\t: %s' % args.output)
57     _log.debug('\tbuild directory\t: %s' % args.buildDir)
58     _log.debug('\tplan name\t: %s', args.plan)
59
60     return args
61
62
63 def start(args):
64     if args.json_file:
65         results_json = json.load(open(args.json_file, 'r'))
66         if 'debugOutput' in results_json:
67             del results_json['debugOutput']
68         BenchmarkRunner.show_results(results_json, args.scale_unit)
69         return
70     if args.allplans:
71         failed = []
72         skipped = []
73         plandir = os.path.join(os.path.dirname(__file__), 'data/plans')
74         planlist = [os.path.splitext(f)[0] for f in os.listdir(plandir) if f.endswith('.plan')]
75         skippedfile = os.path.join(plandir, 'Skipped')
76         if not planlist:
77             raise Exception('Cant find any .plan file in directory %s' % plandir)
78         if os.path.isfile(skippedfile):
79             skipped = [line.strip() for line in open(skippedfile) if not line.startswith('#') and len(line) > 1]
80         for plan in sorted(planlist):
81             if plan in skipped:
82                 _log.info('Skipping benchmark plan: %s because is listed on the Skipped file' % plan)
83                 continue
84             _log.info('Starting benchmark plan: %s' % plan)
85             try:
86                 runner = BenchmarkRunner(plan, args.localCopy, args.countOverride, args.buildDir, args.output, args.platform, args.browser, args.scale_unit, args.device_id)
87                 runner.execute()
88                 _log.info('Finished benchmark plan: %s' % plan)
89             except KeyboardInterrupt:
90                 raise
91             except:
92                 failed.append(plan)
93                 _log.exception('Error running benchmark plan: %s' % plan)
94         if failed:
95             _log.error('The following benchmark plans have failed: %s' % failed)
96         return len(failed)
97     benchmark_runner_class = benchmark_runner_subclasses[args.driver]
98     runner = benchmark_runner_class(args.plan, args.localCopy, args.countOverride, args.buildDir, args.output, args.platform, args.browser, args.scale_unit, args.device_id)
99     runner.execute()
100
101
102 def format_logger(logger):
103     logger.setLevel(logging.INFO)
104     ch = logging.StreamHandler()
105     formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
106     ch.setFormatter(formatter)
107     logger.addHandler(ch)
108
109
110 def main():
111     return start(parse_args())