def test_execute_with_no_issue_number(self):
     git_cl = GitCL(self.tool)
     git_cl.get_issue_number = lambda: 'None'
     self.command.git_cl = lambda: git_cl
     return_code = self.command.execute(self.command_options(), [], self.tool)
     self.assertEqual(return_code, 1)
     self.assertLog(['ERROR: No issue number for current branch.\n'])
Beispiel #2
0
 def test_trigger_try_jobs_with_list(self):
     # When no bucket is specified, master.tryserver.blink is used by
     # default. Besides, `git cl try` invocations are grouped by buckets.
     host = MockHost()
     git_cl = GitCL(host, auth_refresh_token_json='token.json')
     git_cl.trigger_try_jobs([
         'android_blink_rel', 'fake_blink_try_linux', 'fake_blink_try_win',
         'fake_mac_cq'
     ])
     self.assertEqual(host.executive.calls, [
         [
             'git', 'cl', 'try', '-B', 'master.tryserver.blink', '-b',
             'fake_blink_try_linux', '-b', 'fake_blink_try_win',
             '--auth-refresh-token-json', 'token.json'
         ],
         [
             'git', 'cl', 'try', '-B', 'master.tryserver.chromium.android',
             '-b', 'android_blink_rel', '--auth-refresh-token-json',
             'token.json'
         ],
         [
             'git', 'cl', 'try', '-B', 'master.tryserver.chromium.mac',
             '-b', 'fake_mac_cq', '--auth-refresh-token-json', 'token.json'
         ],
     ])
Beispiel #3
0
 def test_latest_try_jobs(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_raw_try_job_results = lambda **_: [
         {
             'builder_name': 'builder-b',
             'status': 'COMPLETED',
             'result': 'SUCCESS',
             'url': 'http://build.chromium.org/p/master/builders/builder-b/builds/100',
         },
         {
             'builder_name': 'builder-b',
             'status': 'COMPLETED',
             'result': 'SUCCESS',
             'url': 'http://build.chromium.org/p/master/builders/builder-b/builds/90',
         },
         {
             'builder_name': 'builder-a',
             'status': 'SCHEDULED',
             'result': None,
             'url': None,
         },
         {
             'builder_name': 'builder-c',
             'status': 'COMPLETED',
             'result': 'SUCCESS',
             'url': 'http://ci.chromium.org/master/builder-c/123',
         },
     ]
     self.assertEqual(
         git_cl.latest_try_jobs(['builder-a', 'builder-b']),
         {
             Build('builder-a'): TryJobStatus('SCHEDULED'),
             Build('builder-b', 100): TryJobStatus('COMPLETED', 'SUCCESS'),
         })
Beispiel #4
0
 def test_fetch_raw_try_job_results(self):
     # Fetching raw try job results has a side effect of writing to and
     # reading from a temporary JSON file. This test method verifies the
     # command line used to fetch try job results.
     host = MockHost()
     host.filesystem.write_text_file('/__im_tmp/tmp_0_/try-results.json',
                                     '{}')
     host.filesystem.write_text_file('/__im_tmp/tmp_1_/try-results.json',
                                     '{}')
     git_cl = GitCL(host)
     git_cl.fetch_raw_try_job_results()
     git_cl.fetch_raw_try_job_results(patchset=7)
     self.assertEqual(
         host.executive.calls,
         [[
             'git',
             'cl',
             'try-results',
             '--json',
             '/__im_tmp/tmp_0_/try-results.json',
         ],
          [
              'git', 'cl', 'try-results', '--json',
              '/__im_tmp/tmp_1_/try-results.json', '--patchset', '7'
          ]])
 def __init__(self, host):
     self.host = host
     self.port = self.host.port_factory.get()
     self.git_cl = GitCL(host)
     self.finder = PathFinder(self.host.filesystem)
     self.ports_with_no_results = set()
     self.ports_with_all_pass = set()
Beispiel #6
0
 def test_execute_with_unfinished_jobs(self):
     builds = {
         Build('MOCK Try Win', 5000): TryJobStatus('COMPLETED', 'FAILURE'),
         Build('MOCK Try Mac', 4000): TryJobStatus('STARTED'),
         Build('MOCK Try Linux', 6000): TryJobStatus('SCHEDULED'),
     }
     git_cl = GitCL(self.tool)
     git_cl.get_issue_number = lambda: '11112222'
     git_cl.latest_try_jobs = lambda _: builds
     self.command.git_cl = lambda: git_cl
     exit_code = self.command.execute(self.command_options(), [], self.tool)
     self.assertEqual(exit_code, 1)
     self.assertLog([
         'INFO: Finished try jobs:\n',
         'INFO:   MOCK Try Win\n',
         'INFO: Scheduled or started try jobs:\n',
         'INFO:   MOCK Try Linux\n',
         'INFO:   MOCK Try Mac\n',
         'INFO: There are some builders with no results:\n',
         'INFO:   MOCK Try Linux\n',
         'INFO:   MOCK Try Mac\n',
         'INFO: Would you like to try to fill in missing results with\n'
         'available results? This assumes that layout test results\n'
         'for the platforms with missing results are the same as\n'
         'results on other platforms.\n',
         'INFO: Aborting.\n',
     ])
Beispiel #7
0
 def test_latest_try_jobs_cq_only(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_raw_try_job_results = lambda **_: [
         {
             'builder_name': 'cq-a',
             'experimental': False,
             'result': None,
             'status': 'SCHEDULED',
             'tags': ['user_agent:cq'],
             'url': None,
         },
         {
             'builder_name': 'cq-a-experimental',
             'experimental': True,
             'result': None,
             'status': 'SCHEDULED',
             'tags': ['user_agent:cq'],
             'url': None,
         },
         {
             'builder_name': 'other',
             'experimental': False,
             'status': 'SCHEDULED',
             'result': None,
             'tags': ['user_agent:git_cl_try'],
             'url': None,
         },
     ]
     self.assertEqual(
         git_cl.latest_try_jobs(cq_only=True),
         {
             Build('cq-a'): TryJobStatus('SCHEDULED'),
         })
Beispiel #8
0
    def main(self, argv=None):
        options = self.parse_args(argv)
        self.verbose = options.verbose

        if not self.checkout_is_okay(options.allow_local_commits):
            return 1

        self.git_cl = GitCL(
            self.host, auth_refresh_token_json=options.auth_refresh_token_json)

        self.print_('## Noting the current Chromium commit.')
        _, show_ref_output = self.run(['git', 'show-ref', 'HEAD'])
        chromium_commitish = show_ref_output.split()[0]

        if options.target == 'wpt':
            import_commitish = self.update(WPT_DEST_NAME, WPT_REPO_URL,
                                           options.keep_w3c_repos_around,
                                           options.revision)
            self._copy_resources()
        elif options.target == 'css':
            import_commitish = self.update(CSS_DEST_NAME, CSS_REPO_URL,
                                           options.keep_w3c_repos_around,
                                           options.revision)
        else:
            raise AssertionError("Unsupported target %s" % options.target)

        has_changes = self.commit_changes_if_needed(chromium_commitish,
                                                    import_commitish)
        if options.auto_update and has_changes:
            commit_successful = self.do_auto_update()
            if not commit_successful:
                return 1
        return 0
Beispiel #9
0
 def test_try_job_results_with_task_id_in_url(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_raw_try_job_results = lambda **_: [
         {
             'builder_name':
             'builder-a',
             'status':
             'COMPLETED',
             'result':
             'FAILURE',
             'failure_reason':
             'BUILD_FAILURE',
             'url': ('https://ci.chromium.org/swarming/task/'
                     '36a767f405d9ee10'),
         },
         {
             'builder_name':
             'builder-b',
             'status':
             'COMPLETED',
             'result':
             'SUCCESS',
             'url': ('https://ci.chromium.org/swarming/task/'
                     '38740befcd9c0010?server=chromium-swarm.appspot.com'),
         },
     ]
     self.assertEqual(
         git_cl.try_job_results(), {
             Build('builder-a', '36a767f405d9ee10'):
             TryJobStatus('COMPLETED', 'FAILURE'),
             Build('builder-b', '38740befcd9c0010'):
             TryJobStatus('COMPLETED', 'SUCCESS'),
         })
 def test_run(self):
     host = MockHost()
     host.executive = MockExecutive(output='mock-output')
     git_cl = GitCL(host)
     output = git_cl.run(['command'])
     self.assertEqual(output, 'mock-output')
     self.assertEqual(host.executive.calls, [['git', 'cl', 'command']])
    def test_execute_with_trigger_jobs_option(self):
        builds = [
            Build('MOCK Try Win', 5000),
            Build('MOCK Try Mac', 4000),
        ]
        git_cl = GitCL(self.tool)
        git_cl.get_issue_number = lambda: '11112222'
        git_cl.latest_try_jobs = lambda _: builds
        self.command.git_cl = lambda: git_cl

        return_code = self.command.execute(
            self.command_options(trigger_jobs=True), [], self.tool)

        self.assertEqual(return_code, 1)
        self.assertLog([
            'INFO: Triggering try jobs for:\n',
            'INFO:   MOCK Try Linux\n',
            'INFO: Please re-run webkit-patch rebaseline-cl once all pending try jobs have finished.\n',
        ])
        self.assertEqual(self.tool.executive.calls, [[
            'python',
            '/mock-checkout/third_party/WebKit/Tools/Scripts/webkitpy/thirdparty/wpt/wpt/manifest',
            '--work', '--tests-root',
            '/mock-checkout/third_party/WebKit/LayoutTests/external/wpt'
        ], [
            'git', 'cl', 'try', '-m', 'tryserver.blink', '-b', 'MOCK Try Linux'
        ]])
 def test_latest_try_builds_failures(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_raw_try_job_results = lambda: [
         {
             'builder_name':
             'builder-a',
             'status':
             'COMPLETED',
             'result':
             'FAILURE',
             'failure_reason':
             'BUILD_FAILURE',
             'url':
             'http://build.chromium.org/p/master/builders/builder-a/builds/100',
         },
         {
             'builder_name':
             'builder-b',
             'status':
             'COMPLETED',
             'result':
             'FAILURE',
             'failure_reason':
             'INFRA_FAILURE',
             'url':
             'http://build.chromium.org/p/master/builders/builder-b/builds/200',
         },
     ]
     self.assertEqual(
         git_cl.latest_try_jobs(['builder-a', 'builder-b']), {
             Build('builder-a', 100): TryJobStatus('COMPLETED', 'FAILURE'),
             Build('builder-b', 200): TryJobStatus('COMPLETED', 'FAILURE'),
         })
Beispiel #13
0
 def test_latest_try_builds_ignores_swarming(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_raw_try_job_results = lambda: [{
         'builder_name':
         'builder-b',
         'status':
         'COMPLETED',
         'result':
         'SUCCESS',
         'url':
         'http://build.chromium.org/p/master/builders/builder-b/builds/100',
     }, {
         'builder_name':
         'builder-b',
         'status':
         'COMPLETED',
         'result':
         'SUCCESS',
         'url':
         'https://ci.chromium.org/swarming/task/1234abcd1234abcd?server=chromium-swarm.appspot.com',
     }]
     self.assertEqual(
         git_cl.latest_try_jobs(['builder-b']), {
             Build('builder-b', 100): TryJobStatus('COMPLETED', 'SUCCESS'),
         })
Beispiel #14
0
 def test_wait_for_try_jobs_done(self):
     host = MockHost()
     host.executive = MockExecutive(output='lgtm')
     git_cl = GitCL(host)
     git_cl.fetch_raw_try_job_results = lambda: [
         {
             'builder_name':
             'some-builder',
             'status':
             'COMPLETED',
             'result':
             'FAILURE',
             'url':
             'http://build.chromium.org/p/master/builders/some-builder/builds/100',
         },
     ]
     self.assertEqual(
         git_cl.wait_for_try_jobs(),
         CLStatus(status='lgtm',
                  try_job_results={
                      Build('some-builder', 100):
                      TryJobStatus('COMPLETED', 'FAILURE'),
                  }))
     self.assertEqual(host.stdout.getvalue(),
                      'Waiting for try jobs, timeout: 7200 seconds.\n')
Beispiel #15
0
 def test_latest_try_builds(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_try_results = lambda: [
         {
             'builder_name': 'builder-b',
             'status': 'COMPLETED',
             'result': 'SUCCESS',
             'url': 'http://build.chromium.org/p/master/builders/some-builder/builds/100',
         },
         {
             'builder_name': 'builder-b',
             'status': 'COMPLETED',
             'result': 'SUCCESS',
             'url': 'http://build.chromium.org/p/master/builders/some-builder/builds/90',
         },
         {
             'builder_name': 'builder-a',
             'status': 'SCHEDULED',
             'result': None,
             'url': None,
         },
         {
             'builder_name': 'builder-c',
             'status': 'COMPLETED',
             'result': 'SUCCESS',
             'url': 'http://build.chromium.org/p/master/builders/some-builder/builds/123',
         },
     ]
     self.assertEqual(
         git_cl.latest_try_jobs(['builder-a', 'builder-b']),
         [Build('builder-a'), Build('builder-b', 100)])
Beispiel #16
0
    def main(self, argv=None):
        options = self.parse_args(argv)
        self.verbose = options.verbose
        log_level = logging.DEBUG if self.verbose else logging.INFO
        logging.basicConfig(level=log_level, format='%(message)s')

        if not self.checkout_is_okay(options.allow_local_commits):
            return 1

        self.git_cl = GitCL(self.host, auth_refresh_token_json=options.auth_refresh_token_json)

        _log.debug('Noting the current Chromium commit.')
        _, show_ref_output = self.run(['git', 'show-ref', 'HEAD'])
        chromium_commit = show_ref_output.split()[0]

        assert options.target in ('wpt', 'css')
        dest_dir_name = WPT_DEST_NAME
        repo_url = WPT_REPO_URL
        if options.target != 'wpt':
            dest_dir_name = CSS_DEST_NAME
            repo_url = CSS_REPO_URL

        # TODO(qyearsley): Simplify this to use LocalWPT.fetch when csswg-test
        # is merged into web-platform-tests.
        temp_repo_path = self.path_from_webkit_base(dest_dir_name)
        _log.info('Cloning repo: %s', repo_url)
        _log.info('Local path: %s', temp_repo_path)
        self.run(['git', 'clone', repo_url, temp_repo_path])

        if options.target == 'wpt' and not options.ignore_exportable_commits:
            commits = self.exportable_but_not_exported_commits(temp_repo_path)
            if commits:
                _log.error('There were exportable but not-yet-exported commits:')
                for commit in commits:
                    _log.error('  https://chromium.googlesource.com/chromium/src/+/%s', commit.sha)
                _log.error('Aborting import to prevent clobbering these commits.')
                self.clean_up_temp_repo(temp_repo_path)
                return 1

        import_commit = self.update(dest_dir_name, temp_repo_path, options.revision)

        self.clean_up_temp_repo(temp_repo_path)

        if options.target == 'wpt':
            self._copy_resources()

        has_changes = self._has_changes()
        if not has_changes:
            _log.info('Done: no changes to import.')
            return 0

        commit_message = self._commit_message(chromium_commit, import_commit)
        self._commit_changes(commit_message)
        _log.info('Done: changes imported and committed.')

        if options.auto_update:
            commit_successful = self.do_auto_update()
            if not commit_successful:
                return 1
        return 0
Beispiel #17
0
 def test_run_with_auth(self):
     host = MockHost()
     host.executive = MockExecutive(output='mock-output')
     git_cl = GitCL(host, auth_refresh_token_json='token.json')
     git_cl.run(['try', '-b', 'win10_blink_rel'])
     self.assertEqual(
         host.executive.calls,
         [['git', 'cl', 'try', '-b', 'win10_blink_rel', '--auth-refresh-token-json', 'token.json']])
Beispiel #18
0
 def test_execute_with_no_issue_number_aborts(self):
     # If the user hasn't uploaded a CL, an error message is printed.
     git_cl = GitCL(self.tool)
     git_cl.get_issue_number = lambda: 'None'
     self.command.git_cl = lambda: git_cl
     exit_code = self.command.execute(self.command_options(), [], self.tool)
     self.assertEqual(exit_code, 1)
     self.assertLog(['ERROR: No issue number for current branch.\n'])
Beispiel #19
0
 def test_wait_for_closed_status_closed(self):
     host = MockHost()
     host.executive = MockExecutive(output='closed')
     git_cl = GitCL(host)
     self.assertEqual(git_cl.wait_for_closed_status(), 'closed')
     self.assertEqual(
         host.stdout.getvalue(),
         'Waiting for closed status, timeout: 1800 seconds.\n'
         'CL is closed.\n')
 def test_execute_with_issue_number_from_branch(self):
     git_cl = GitCL(self.tool)
     git_cl.get_issue_number = lambda: '11112222'
     self.command.git_cl = lambda: git_cl
     self.command.execute(self.command_options(), [], self.tool)
     self.assertLog([
         'INFO: Rebaselining fast/dom/prototype-inheritance.html\n',
         'INFO: Rebaselining fast/dom/prototype-newtest.html\n',
         'INFO: Rebaselining fast/dom/prototype-taco.html\n',
         'INFO: Rebaselining svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr.html\n',
     ])
Beispiel #21
0
 def test_latest_try_jobs_started_build_luci_url(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_raw_try_job_results = lambda **_: [
         {
             'builder_name': 'builder-a',
             'status': 'STARTED',
             'result': None,
             'url': 'http://ci.chromium.org/p/master/some-builder/100',
         },
     ]
     self.assertEqual(git_cl.latest_try_jobs(['builder-a']),
                      {Build('builder-a', 100): TryJobStatus('STARTED')})
Beispiel #22
0
 def test_trigger_try_jobs_with_frozenset(self):
     # The trigger_try_jobs method may be called with an immutable set.
     host = MockHost()
     git_cl = GitCL(host, auth_refresh_token_json='token.json')
     git_cl.trigger_try_jobs(
         frozenset(['fake_blink_try_linux', 'fake_blink_try_win']))
     self.assertEqual(host.executive.calls, [
         [
             'git', 'cl', 'try', '-B', 'master.tryserver.blink', '-b',
             'fake_blink_try_linux', '-b', 'fake_blink_try_win',
             '--auth-refresh-token-json', 'token.json'
         ],
     ])
Beispiel #23
0
 def test_trigger_try_jobs_with_frozenset(self):
     # The trigger_try_jobs method may be called with an immutable set.
     # It has special logic which assumes most builders to trigger are
     # on the master tryserver.blink.
     host = MockHost()
     git_cl = GitCL(host, auth_refresh_token_json='token.json')
     git_cl.trigger_try_jobs(frozenset(['builder-a', 'builder-b']))
     self.assertEqual(host.executive.calls, [
         [
             'git', 'cl', 'try', '-m', 'tryserver.blink', '-b', 'builder-a',
             '-b', 'builder-b', '--auth-refresh-token-json', 'token.json'
         ],
     ])
Beispiel #24
0
 def test_trigger_try_jobs_with_explicit_bucket(self):
     # An explicit bucket overrides configured or default buckets.
     host = MockHost()
     git_cl = GitCL(host, auth_refresh_token_json='token.json')
     git_cl.trigger_try_jobs(['fake_blink_try_linux', 'fake_mac_cq'],
                             bucket='luci.dummy')
     self.assertEqual(host.executive.calls, [
         [
             'git', 'cl', 'try', '-B', 'luci.dummy', '-b',
             'fake_blink_try_linux', '-b', 'fake_mac_cq',
             '--auth-refresh-token-json', 'token.json'
         ],
     ])
Beispiel #25
0
 def test_trigger_try_jobs_with_list(self):
     host = MockHost()
     git_cl = GitCL(host, auth_refresh_token_json='token.json')
     git_cl.trigger_try_jobs(['builder-a', 'android_blink_rel'])
     self.assertEqual(host.executive.calls, [
         [
             'git', 'cl', 'try', '-m', 'tryserver.chromium.android', '-b',
             'android_blink_rel', '--auth-refresh-token-json', 'token.json'
         ],
         [
             'git', 'cl', 'try', '-m', 'tryserver.blink', '-b', 'builder-a',
             '--auth-refresh-token-json', 'token.json'
         ],
     ])
Beispiel #26
0
 def test_execute_no_try_jobs_started_and_no_trigger_jobs(self):
     # If there are no try jobs started yet and --no-trigger-jobs is passed,
     # then we just abort immediately.
     git_cl = GitCL(self.tool)
     git_cl.get_issue_number = lambda: '11112222'
     git_cl.latest_try_jobs = lambda _: {}
     self.command.git_cl = lambda: git_cl
     exit_code = self.command.execute(
         self.command_options(trigger_jobs=False), [], self.tool)
     self.assertEqual(exit_code, 1)
     self.assertLog([
         'INFO: No finished try jobs.\n',
         'INFO: Aborted: no try jobs and --no-trigger-jobs passed.\n',
     ])
 def test_wait_for_try_jobs_no_results_not_considered_finished(self):
     host = MockHost()
     git_cl = GitCL(host)
     git_cl.fetch_raw_try_job_results = lambda: []
     git_cl.wait_for_try_jobs()
     self.assertEqual(
         host.stdout.getvalue(),
         'Waiting for try jobs, timeout: 7200 seconds.\n'
         'Waiting for try jobs. 600 seconds passed.\n'
         'Waiting for try jobs. 1800 seconds passed.\n'
         'Waiting for try jobs. 3000 seconds passed.\n'
         'Waiting for try jobs. 4200 seconds passed.\n'
         'Waiting for try jobs. 5400 seconds passed.\n'
         'Waiting for try jobs. 6600 seconds passed.\n'
         'Timed out waiting for try jobs.\n')
Beispiel #28
0
 def test_wait_for_try_jobs_done(self):
     host = MockHost()
     git_cl = GitCL(host)
     git_cl.fetch_try_results = lambda: [
         {
             'builder_name': 'some-builder',
             'status': 'COMPLETED',
             'result': 'FAILURE',
         },
     ]
     git_cl.wait_for_try_jobs()
     self.assertEqual(
         host.stdout.getvalue(),
         'Waiting for try jobs (timeout: 7200 seconds).\n'
         'All jobs finished.\n')
Beispiel #29
0
 def test_latest_try_builds_started_builds(self):
     git_cl = GitCL(MockHost())
     git_cl.fetch_try_results = lambda: [
         {
             'builder_name':
             'builder-a',
             'status':
             'STARTED',
             'result':
             None,
             'url':
             'http://build.chromium.org/p/master/builders/some-builder/builds/100',
         },
     ]
     self.assertEqual(git_cl.latest_try_jobs(['builder-a']),
                      [Build('builder-a', 100)])
Beispiel #30
0
 def test_wait_for_closed_status_timeout(self):
     host = MockHost()
     host.executive = MockExecutive(output='commit')
     git_cl = GitCL(host)
     self.assertIsNone(git_cl.wait_for_closed_status())
     self.assertEqual(
         host.stdout.getvalue(),
         'Waiting for closed status, timeout: 1800 seconds.\n'
         'Waiting for closed status. 120 seconds passed.\n'
         'Waiting for closed status. 360 seconds passed.\n'
         'Waiting for closed status. 600 seconds passed.\n'
         'Waiting for closed status. 840 seconds passed.\n'
         'Waiting for closed status. 1080 seconds passed.\n'
         'Waiting for closed status. 1320 seconds passed.\n'
         'Waiting for closed status. 1560 seconds passed.\n'
         'Waiting for closed status. 1800 seconds passed.\n'
         'Timed out waiting for closed status.\n')