Index: tools/telemetry/telemetry/core/backends/remote/trybot_browser_finder_unittest.py |
diff --git a/tools/telemetry/telemetry/core/backends/remote/trybot_browser_finder_unittest.py b/tools/telemetry/telemetry/core/backends/remote/trybot_browser_finder_unittest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3bc393f11fa7c0896e13a70d8beb5180e81734d6 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/core/backends/remote/trybot_browser_finder_unittest.py |
@@ -0,0 +1,208 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import json |
+import logging |
+import StringIO |
+import unittest |
+ |
+from telemetry.core import browser_options |
+from telemetry.core.backends.remote import trybot_browser_finder |
+from telemetry.unittest import simple_mock |
+from telemetry.unittest import system_stub |
+ |
+ |
+class TrybotBrowserFinderTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ self.log_output = StringIO.StringIO() |
+ self.stream_handler = logging.StreamHandler(self.log_output) |
+ logging.getLogger().addHandler(self.stream_handler) |
+ self._real_subprocess = trybot_browser_finder.subprocess |
+ self._real_urllib2 = trybot_browser_finder.urllib2 |
+ self._stubs = system_stub.Override(trybot_browser_finder, ['sys', 'open']) |
+ |
+ def tearDown(self): |
+ logging.getLogger().removeHandler(self.stream_handler) |
+ self.log_output.close() |
+ trybot_browser_finder.subprocess = self._real_subprocess |
+ trybot_browser_finder.urllib2 = self._real_urllib2 |
+ self._stubs.Restore() |
+ |
+ def _ExpectProcesses(self, args): |
+ mock_subprocess = simple_mock.MockObject() |
+ mock_subprocess.SetAttribute('PIPE', simple_mock.MockObject()) |
+ for arg in args: |
+ mock_popen = simple_mock.MockObject() |
+ mock_popen.ExpectCall('communicate').WillReturn(arg[1][1:]) |
+ mock_popen.ExpectCall('poll').WillReturn(arg[1][0]) |
+ mock_subprocess.ExpectCall( |
+ 'Popen').WithArgs(arg[0]).WillReturn(mock_popen) |
+ trybot_browser_finder.subprocess = mock_subprocess |
+ |
+ def test_find_all_browser_types_list(self): |
+ finder_options = browser_options.BrowserFinderOptions(browser_type='list') |
+ trybot_browser_finder.urllib2 = simple_mock.MockObject() |
+ trybot_browser_finder.urllib2.ExpectCall('urlopen').WithArgs( |
+ 'http://build.chromium.org/p/tryserver.chromium.perf/json').WillReturn( |
+ StringIO.StringIO(json.dumps({'builders': { |
+ 'android_nexus4_perf_bisect': 'stuff', |
+ 'mac_10_9_perf_bisect': 'otherstuff', |
+ 'win_perf_bisect_builder': 'not a trybot', |
+ }}))) |
+ self.assertEquals( |
+ ['trybot-android-nexus4', 'trybot-mac-10-9'], |
+ # pylint: disable=W0212 |
+ sorted(trybot_browser_finder.FindAllBrowserTypes(finder_options))) |
+ |
+ def test_find_all_browser_types_trybot(self): |
+ finder_options = browser_options.BrowserFinderOptions( |
+ browser_type='trybot-win') |
+ trybot_browser_finder.urllib2 = simple_mock.MockObject() |
+ trybot_browser_finder.urllib2.ExpectCall('urlopen').WithArgs( |
+ 'http://build.chromium.org/p/tryserver.chromium.perf/json').WillReturn( |
+ StringIO.StringIO(json.dumps({'builders': { |
+ 'android_nexus4_perf_bisect': 'stuff', |
+ 'mac_10_9_perf_bisect': 'otherstuff', |
+ 'win_perf_bisect_builder': 'not a trybot', |
+ }}))) |
+ self.assertEquals( |
+ ['trybot-android-nexus4', 'trybot-mac-10-9'], |
+ # pylint: disable=W0212 |
+ sorted(trybot_browser_finder.FindAllBrowserTypes(finder_options))) |
+ |
+ def test_find_all_browser_types_non_trybot_browser(self): |
+ finder_options = browser_options.BrowserFinderOptions( |
+ browser_type='release') |
+ trybot_browser_finder.urllib2 = simple_mock.MockObject() |
+ self.assertEquals( |
+ [], |
+ # pylint: disable=W0212 |
+ sorted(trybot_browser_finder.FindAllBrowserTypes(finder_options))) |
+ |
+ def test_constructor(self): |
+ finder_options = browser_options.BrowserFinderOptions() |
+ browser = trybot_browser_finder.PossibleTrybotBrowser( |
+ 'trybot-android-nexus4', finder_options) |
+ # pylint: disable=W0212 |
+ self.assertEquals('android', browser._target_os) |
+ # pylint: disable=W0212 |
+ self.assertEquals('android_nexus4_perf_bisect', browser._buildername) |
+ |
+ def test_no_git(self): |
+ finder_options = browser_options.BrowserFinderOptions() |
+ browser = trybot_browser_finder.PossibleTrybotBrowser( |
+ 'trybot-android-nexus4', finder_options) |
+ self._ExpectProcesses(( |
+ (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (128, None, None)), |
+ )) |
+ browser.RunRemote() |
+ self.assertEquals( |
+ 'Must be in a git repository to send changes to trybots.\n', |
+ self.log_output.getvalue()) |
+ |
+ def test_dirty_tree(self): |
+ finder_options = browser_options.BrowserFinderOptions() |
+ browser = trybot_browser_finder.PossibleTrybotBrowser( |
+ 'trybot-android-nexus4', finder_options) |
+ self._ExpectProcesses(( |
+ (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)), |
+ (['git', 'update-index', '--refresh', '-q'], (0, None, None,)), |
+ (['git', 'diff-index', 'HEAD'], (0, 'dirty tree', None)), |
+ )) |
+ |
+ browser.RunRemote() |
+ self.assertEquals( |
+ 'Cannot send a try job with a dirty tree. Commit locally first.\n', |
+ self.log_output.getvalue()) |
+ |
+ def test_no_local_commits(self): |
+ finder_options = browser_options.BrowserFinderOptions() |
+ browser = trybot_browser_finder.PossibleTrybotBrowser( |
+ 'trybot-android-nexus4', finder_options) |
+ self._ExpectProcesses(( |
+ (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)), |
+ (['git', 'update-index', '--refresh', '-q'], (0, None, None,)), |
+ (['git', 'diff-index', 'HEAD'], (0, '', None)), |
+ (['git', 'log', 'origin/master..HEAD'], (0, '', None)), |
+ )) |
+ |
+ browser.RunRemote() |
+ self.assertEquals( |
+ ('No local changes on branch br. browser=trybot-android-nexus4 ' |
+ 'argument sends local changes to the android_nexus4_perf_bisect ' |
+ 'perf trybot.\n'), |
+ self.log_output.getvalue()) |
+ |
+ def test_branch_checkout_fails(self): |
+ finder_options = browser_options.BrowserFinderOptions() |
+ browser = trybot_browser_finder.PossibleTrybotBrowser( |
+ 'trybot-android-nexus4', finder_options) |
+ self._ExpectProcesses(( |
+ (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)), |
+ (['git', 'update-index', '--refresh', '-q'], (0, None, None,)), |
+ (['git', 'diff-index', 'HEAD'], (0, '', None)), |
+ (['git', 'log', 'origin/master..HEAD'], (0, 'logs here', None)), |
+ (['git', 'checkout', '-b', 'telemetry-tryjob'], |
+ (1, None, 'fatal: A branch named \'telemetry-try\' already exists.')), |
+ )) |
+ |
+ browser.RunRemote() |
+ self.assertEquals( |
+ ('Error creating branch telemetry-tryjob. ' |
+ 'Please delete it if it exists.\n' |
+ 'fatal: A branch named \'telemetry-try\' already exists.\n'), |
+ self.log_output.getvalue()) |
+ |
+ def _GetConfigForBrowser(self, name, branch): |
+ finder_options = browser_options.BrowserFinderOptions() |
+ browser = trybot_browser_finder.PossibleTrybotBrowser(name, finder_options) |
+ bot = '%s_perf_bisect' % name.replace('trybot-', '').replace('-', '_') |
+ self._ExpectProcesses(( |
+ (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, branch, None)), |
+ (['git', 'update-index', '--refresh', '-q'], (0, None, None,)), |
+ (['git', 'diff-index', 'HEAD'], (0, '', None)), |
+ (['git', 'log', 'origin/master..HEAD'], (0, 'logs here', None)), |
+ (['git', 'checkout', '-b', 'telemetry-tryjob'], (0, None, None)), |
+ (['git', 'commit', '-a', '-m', 'bisect config'], (0, None, None)), |
+ (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m', |
+ 'CL for perf tryjob'], |
+ (0, 'stuff https://codereview.chromium.org/12345 stuff', None)), |
+ (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b', bot], |
+ (0, None, None)), |
+ (['git', 'checkout', branch], (0, None, None)), |
+ (['git', 'branch', '-D', 'telemetry-tryjob'], (0, None, None)) |
+ )) |
+ self._stubs.sys.argv = [ |
+ 'tools/perf/run_benchmark', |
+ '--browser=%s' % browser, |
+ 'sunspider'] |
+ cfg = StringIO.StringIO() |
+ self._stubs.open.files = {'tools/run-perf-test.cfg': cfg} |
+ |
+ browser.RunRemote() |
+ return cfg.getvalue() |
+ |
+ def test_config_android(self): |
+ config = self._GetConfigForBrowser('trybot-android-nexus4', 'somebranch') |
+ self.assertEquals( |
+ ('config = {\n' |
+ ' "command": "./tools/perf/run_measurement ' |
+ '--browser=android-chrome-shell sunspider",\n' |
+ ' "max_time_minutes": "120",\n' |
+ ' "repeat_count": "1",\n' |
+ ' "truncate_percent": "0"\n' |
+ '}'), config) |
+ |
+ def test_config_mac(self): |
+ config = self._GetConfigForBrowser('trybot-mac-10-9', 'currentwork') |
+ self.assertEquals( |
+ ('config = {\n' |
+ ' "command": "./tools/perf/run_measurement ' |
+ '--browser=release sunspider",\n' |
+ ' "max_time_minutes": "120",\n' |
+ ' "repeat_count": "1",\n' |
+ ' "truncate_percent": "0"\n' |
+ '}'), config) |
+ |