103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)# found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)import json
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)import logging
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)import StringIO
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)import unittest
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core import browser_options
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.backends.remote import trybot_browser_finder
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.unittest import simple_mock
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.unittest import system_stub
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class TrybotBrowserFinderTest(unittest.TestCase):
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def setUp(self):
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.log_output = StringIO.StringIO()
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.stream_handler = logging.StreamHandler(self.log_output)
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    logging.getLogger().addHandler(self.stream_handler)
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._real_subprocess = trybot_browser_finder.subprocess
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._real_urllib2 = trybot_browser_finder.urllib2
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._stubs = system_stub.Override(trybot_browser_finder,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       ['sys', 'open', 'os'])
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def tearDown(self):
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    logging.getLogger().removeHandler(self.stream_handler)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.log_output.close()
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.subprocess = self._real_subprocess
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.urllib2 = self._real_urllib2
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._stubs.Restore()
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def _ExpectProcesses(self, args):
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    mock_subprocess = simple_mock.MockObject()
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    mock_subprocess.SetAttribute('PIPE', simple_mock.MockObject())
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    for arg in args:
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mock_popen = simple_mock.MockObject()
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mock_popen.ExpectCall('communicate').WillReturn(arg[1][1:])
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mock_popen.ExpectCall('poll').WillReturn(arg[1][0])
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mock_subprocess.ExpectCall(
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          'Popen').WithArgs(arg[0]).WillReturn(mock_popen)
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.subprocess = mock_subprocess
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_find_all_browser_types_list(self):
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions(browser_type='list')
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.urllib2 = simple_mock.MockObject()
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.urllib2.ExpectCall('urlopen').WithArgs(
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'http://build.chromium.org/p/tryserver.chromium.perf/json').WillReturn(
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            StringIO.StringIO(json.dumps({'builders': {
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                'android_nexus4_perf_bisect': 'stuff',
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                'mac_10_9_perf_bisect': 'otherstuff',
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                'win_perf_bisect_builder': 'not a trybot',
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            }})))
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ['trybot-android-nexus4', 'trybot-mac-10-9'],
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        # pylint: disable=W0212
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        sorted(trybot_browser_finder.FindAllBrowserTypes(finder_options)))
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_find_all_browser_types_trybot(self):
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions(
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        browser_type='trybot-win')
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.urllib2 = simple_mock.MockObject()
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.urllib2.ExpectCall('urlopen').WithArgs(
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'http://build.chromium.org/p/tryserver.chromium.perf/json').WillReturn(
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            StringIO.StringIO(json.dumps({'builders': {
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                'android_nexus4_perf_bisect': 'stuff',
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                'mac_10_9_perf_bisect': 'otherstuff',
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                'win_perf_bisect_builder': 'not a trybot',
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            }})))
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ['trybot-android-nexus4', 'trybot-mac-10-9'],
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        # pylint: disable=W0212
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        sorted(trybot_browser_finder.FindAllBrowserTypes(finder_options)))
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_find_all_browser_types_non_trybot_browser(self):
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions(
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        browser_type='release')
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trybot_browser_finder.urllib2 = simple_mock.MockObject()
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        [],
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        # pylint: disable=W0212
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        sorted(trybot_browser_finder.FindAllBrowserTypes(finder_options)))
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_constructor(self):
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions()
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser = trybot_browser_finder.PossibleTrybotBrowser(
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'trybot-android-nexus4', finder_options)
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # pylint: disable=W0212
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals('android', browser._target_os)
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # pylint: disable=W0212
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals('android_nexus4_perf_bisect', browser._buildername)
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_no_git(self):
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions()
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser = trybot_browser_finder.PossibleTrybotBrowser(
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'trybot-android-nexus4', finder_options)
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._ExpectProcesses((
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (128, None, None)),
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ))
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser.RunRemote()
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'Must be in a git repository to send changes to trybots.\n',
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        self.log_output.getvalue())
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_dirty_tree(self):
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions()
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser = trybot_browser_finder.PossibleTrybotBrowser(
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'trybot-android-nexus4', finder_options)
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._ExpectProcesses((
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'diff-index', 'HEAD'], (0, 'dirty tree', None)),
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ))
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser.RunRemote()
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'Cannot send a try job with a dirty tree. Commit locally first.\n',
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        self.log_output.getvalue())
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_no_local_commits(self):
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions()
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser = trybot_browser_finder.PossibleTrybotBrowser(
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'trybot-android-nexus4', finder_options)
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._ExpectProcesses((
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'diff-index', 'HEAD'], (0, '', None)),
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'log', 'origin/master..HEAD'], (0, '', None)),
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (['git', 'diff-index', 'HEAD'], (0, '', None)),
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (['git', 'log', 'origin/master..HEAD'], (0, '', None)),
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ))
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser.RunRemote()
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ('No local changes found in chromium or blink trees. '
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         'browser=trybot-android-nexus4 argument sends local changes to the '
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         'android_nexus4_perf_bisect perf trybot.\n'),
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        self.log_output.getvalue())
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_branch_checkout_fails(self):
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions()
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser = trybot_browser_finder.PossibleTrybotBrowser(
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'trybot-android-nexus4', finder_options)
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._ExpectProcesses((
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'diff-index', 'HEAD'], (0, '', None)),
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'log', 'origin/master..HEAD'], (0, 'logs here', None)),
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'checkout', '-b', 'telemetry-tryjob'],
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         (1, None, 'fatal: A branch named \'telemetry-try\' already exists.')),
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ))
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser.RunRemote()
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ('Error creating branch telemetry-tryjob. '
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         'Please delete it if it exists.\n'
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         'fatal: A branch named \'telemetry-try\' already exists.\n'),
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        self.log_output.getvalue())
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def _GetConfigForBrowser(self, name, branch, cfg_filename, is_blink=False):
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    finder_options = browser_options.BrowserFinderOptions()
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser = trybot_browser_finder.PossibleTrybotBrowser(name, finder_options)
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    bot = '%s_perf_bisect' % name.replace('trybot-', '').replace('-', '_')
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    first_processes = ()
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if is_blink:
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      first_processes = (
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (['git', 'diff-index', 'HEAD'], (0, '', None)),
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (['git', 'log', 'origin/master..HEAD'], (0, '', None))
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      )
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._ExpectProcesses(first_processes + (
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, branch, None)),
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'diff-index', 'HEAD'], (0, '', None)),
17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'log', 'origin/master..HEAD'], (0, 'logs here', None)),
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'checkout', '-b', 'telemetry-tryjob'], (0, None, None)),
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (['git', 'branch', '--set-upstream-to', 'origin/master'],
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         (0, None, None)),
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'commit', '-a', '-m', 'bisect config'], (0, None, None)),
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         'CL for perf tryjob'],
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         (0, 'stuff https://codereview.chromium.org/12345 stuff', None)),
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b', bot],
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         (0, None, None)),
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'checkout', branch], (0, None, None)),
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        (['git', 'branch', '-D', 'telemetry-tryjob'], (0, None, None))
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ))
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._stubs.sys.argv = [
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'tools/perf/run_benchmark',
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        '--browser=%s' % browser,
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'sunspider']
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    cfg = StringIO.StringIO()
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._stubs.open.files = {cfg_filename: cfg}
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser.RunRemote()
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return cfg.getvalue()
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_config_android(self):
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config = self._GetConfigForBrowser(
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'trybot-android-nexus4', 'somebranch', 'tools/run-perf-test.cfg')
20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ('config = {\n'
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "command": "./tools/perf/run_measurement '
20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '--browser=android-chrome-shell sunspider",\n'
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "max_time_minutes": "120",\n'
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "repeat_count": "1",\n'
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "truncate_percent": "0"\n'
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '}'), config)
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def test_config_mac(self):
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config = self._GetConfigForBrowser(
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'trybot-mac-10-9', 'currentwork', 'tools/run-perf-test.cfg')
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.assertEquals(
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ('config = {\n'
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         '  "command": "./tools/perf/run_measurement '
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         '--browser=release sunspider",\n'
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         '  "max_time_minutes": "120",\n'
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         '  "repeat_count": "1",\n'
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         '  "truncate_percent": "0"\n'
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         '}'), config)
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def test_config_blink(self):
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config = self._GetConfigForBrowser(
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'trybot-mac-10-9', 'blinkbranch', 'Tools/run-perf-test.cfg', True)
22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ('config = {\n'
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "command": "./tools/perf/run_measurement '
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '--browser=release sunspider",\n'
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "max_time_minutes": "120",\n'
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "repeat_count": "1",\n'
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '  "truncate_percent": "0"\n'
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         '}'), config)
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
238