startup.py revision 58537e28ecd584eab876aee8be7156509866d23a
1c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import json
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from telemetry.page import page_measurement
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochclass Startup(page_measurement.PageMeasurement):
10c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  """Performs a measurement of Chromium's startup performance.
11c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
12c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  This test must be invoked with either --warm or --cold on the command line. A
13c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  cold start means none of the Chromium files are in the disk cache. A warm
14c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  start assumes the OS has already cached much of Chromium's content. For warm
15c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  tests, you should repeat the page set to ensure it's cached.
16c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  """
179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  HISTOGRAMS_TO_RECORD = {
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    'messageloop_start_time' :
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        'Startup.BrowserMessageLoopStartTimeFromMainEntry',
21b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    'window_display_time' : 'Startup.BrowserWindowDisplay',
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    'open_tabs_time' : 'Startup.BrowserOpenTabs'}
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def __init__(self):
25c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    super(Startup, self).__init__(needs_browser_restart_after_each_run=True)
26c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
27c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  def AddCommandLineOptions(self, parser):
28c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    parser.add_option('--cold', action='store_true',
29c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                      help='Clear the OS disk cache before performing the test')
30c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    parser.add_option('--warm', action='store_true',
31c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                      help='Start up with everything already cached')
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def CustomizeBrowserOptions(self, options):
34c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    # TODO: Once the bots start running benchmarks, enforce that either --warm
35c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    # or --cold is explicitly specified.
36c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    # assert options.warm != options.cold, \
37c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    #     "You must specify either --warm or --cold"
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if options.cold:
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser_options = options.browser_options
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser_options.clear_sytem_cache_for_browser_and_profile_on_start = True
41c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    else:
42c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      self.discard_first_result = True
43c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    options.AppendExtraBrowserArgs([
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--enable-stats-collection-bindings',
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        # Old commandline flags used for reference builds.
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--dom-automation',
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--reduce-security-for-dom-automation-tests'
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ])
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def MeasurePage(self, page, tab, results):
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # TODO(jeremy): Remove references to
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # domAutomationController.getBrowserHistogram when we update the reference
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # builds.
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    get_histogram_js = ('(window.statsCollectionController ?'
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'statsCollectionController :'
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'domAutomationController).getBrowserHistogram("%s")')
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    for display_name, histogram_name in self.HISTOGRAMS_TO_RECORD.iteritems():
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      result = tab.EvaluateJavaScript(get_histogram_js % histogram_name)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result = json.loads(result)
63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      measured_time = 0
64b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      if 'sum' in result:
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        # For all the histograms logged here, there's a single entry so sum
67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        # is the exact value for that entry.
68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        measured_time = result['sum']
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      elif 'buckets' in result:
70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        measured_time = \
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            (result['buckets'][0]['high'] + result['buckets'][0]['low']) / 2
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      results.Add(display_name, 'ms', measured_time)
74