14 from benchmark_builder.benchmark_builder_factory import BenchmarkBuilderFactory
15 from browser_driver.browser_driver_factory import BrowserDriverFactory
16 from http_server_driver.http_server_driver_factory import HTTPServerDriverFactory
17 from utils import loadModule, getPathFromProjectRoot
18 from utils import timeout
21 _log = logging.getLogger(__name__)
24 class BenchmarkRunner(object):
26 def __init__(self, planFile, buildDir, outputFile, platform, browser):
27 _log.info('Initializing benchmark running')
29 with open(planFile, 'r') as fp:
30 self.plan = json.load(fp)
31 self.browserDriver = BrowserDriverFactory.create([platform, browser])
32 self.httpServerDriver = HTTPServerDriverFactory.create([self.plan['http_server_driver']])
33 self.buildDir = os.path.abspath(buildDir)
34 self.outputFile = outputFile
36 _log.error('Can not open plan file: %s' % planFile)
38 _log.error('Plan file:%s may not follow JSON format' % planFile)
43 _log.info('Start to execute the plan')
44 _log.info('Start a new benchmark')
46 benchmarkBuilder = BenchmarkBuilderFactory.create([self.plan['benchmark_builder']])
47 webRoot = benchmarkBuilder.prepare(self.plan['original_benchmark'], self.plan['benchmark_patch'] if 'benchmark_patch' in self.plan else None)
48 for x in xrange(int(self.plan['count'])):
49 _log.info('Start the iteration %d of current benchmark' % (x + 1))
50 self.httpServerDriver.serve(webRoot)
51 self.browserDriver.prepareEnv()
52 self.browserDriver.launchUrl(urlparse.urljoin(self.httpServerDriver.baseUrl(), self.plan['entry_point']), self.buildDir)
54 with timeout(self.plan['timeout']):
55 result = json.loads(self.httpServerDriver.fetchResult())
56 assert(not self.httpServerDriver.getReturnCode())
58 results.append(result)
60 _log.error('No result or server crashes. Something went wrong. Will skip current benchmark.')
61 self.browserDriver.closeBrowsers()
62 self.httpServerDriver.killServer()
63 benchmarkBuilder.clean()
66 self.browserDriver.closeBrowsers()
67 _log.info('End of %d iteration of current benchmark' % (x + 1))
68 results = self.wrap(results)
69 self.dump(results, self.outputFile if self.outputFile else self.plan['output_file'])
70 benchmarkBuilder.clean()
74 def dump(cls, results, outputFile):
75 _log.info('Dumpping the results to file')
77 with open(outputFile, 'w') as fp:
78 json.dump(results, fp)
80 _log.error('Cannot open output file: %s' % outputFile)
81 _log.error('Results are:\n %s', json.dumps(results))
89 ret = cls.merge(ret, dic)
94 assert(isinstance(a, type(b)))
96 # special handle for list type, and should be handle before equal check
97 if argType == types.ListType:
101 if argType == types.DictType:
103 for key, value in a.items():
105 result[key] = cls.merge(value, b[key])
108 for key, value in b.items():
109 if key not in result: