| Index: tests/git_cl_test.py | 
| diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py | 
| index 0d8b285d3917053ba682e3ce437dbc6c4abc3d00..37c2fa13ab0bb0b81f766140824c06235c77c60c 100755 | 
| --- a/tests/git_cl_test.py | 
| +++ b/tests/git_cl_test.py | 
| @@ -1912,10 +1912,58 @@ class TestGitCl(TestCase): | 
| out.getvalue(), | 
| 'scheduled CQ Dry Run on https://codereview.chromium.org/123\n') | 
|  | 
| -  def test_git_cl_try_buildbucket_with_properties(self): | 
| -    self.mock(git_cl.Changelist, 'GetMostRecentPatchset', lambda _: 20001) | 
| -    self.mock(git_cl.Changelist, 'GetIssueOwner', lambda _: 'owner@e.mail') | 
| -    self.mock(git_cl.Changelist, 'GetIssueProject', lambda _: 'depot_tools') | 
| +  def test_git_cl_try_default_cq_dry_run_gerrit(self): | 
| +    self.mock(git_cl.Changelist, 'GetChange', | 
| +              lambda _, *a: ( | 
| +                self._mocked_call(['GetChange']+list(a)))) | 
| +    self.mock(git_cl.presubmit_support, 'DoGetTryMasters', | 
| +              lambda *_, **__: ( | 
| +                self._mocked_call(['DoGetTryMasters']))) | 
| +    self.mock(git_cl._GerritChangelistImpl, 'SetCQState', | 
| +              lambda _, s: self._mocked_call(['SetCQState', s])) | 
| + | 
| +    def _GetChangeDetail(gerrit_change_list_impl, opts=None): | 
| +      # Get realistic expectations. | 
| +      gerrit_change_list_impl._GetGerritHost() | 
| +      return self._mocked_call(['_GetChangeDetail', opts or []]) | 
| +    self.mock(git_cl._GerritChangelistImpl, '_GetChangeDetail', | 
| +              _GetChangeDetail) | 
| + | 
| +    self.calls = [ | 
| +        ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | 
| +        ((['git', 'config', 'branch.feature.rietveldissue'],), CERR1), | 
| +        ((['git', 'config', 'branch.feature.gerritissue'],), '123456'), | 
| +        ((['git', 'config', 'branch.feature.gerritserver'],), | 
| +         'https://chromium-review.googlesource.com'), | 
| +        ((['_GetChangeDetail', []],), {'status': 'OPEN'}), | 
| +        ((['git', 'config', 'branch.feature.merge'],), 'feature'), | 
| +        ((['git', 'config', 'branch.feature.remote'],), 'origin'), | 
| +        ((['get_or_create_merge_base', 'feature', 'feature'],), | 
| +         'fake_ancestor_sha'), | 
| +        ((['GetChange', 'fake_ancestor_sha', None], ), | 
| +         git_cl.presubmit_support.GitChange( | 
| +           '', '', '', '', '', '', '', '')), | 
| +        ((['git', 'rev-parse', '--show-cdup'],), '../'), | 
| +        ((['DoGetTryMasters'], ), None), | 
| +        ((['SetCQState', git_cl._CQState.DRY_RUN], ), None), | 
| +    ] | 
| +    out = StringIO.StringIO() | 
| +    self.mock(git_cl.sys, 'stdout', out) | 
| +    self.assertEqual(0, git_cl.main(['try'])) | 
| +    self.assertEqual( | 
| +        out.getvalue(), | 
| +        'scheduled CQ Dry Run on ' | 
| +        'https://chromium-review.googlesource.com/123456\n') | 
| + | 
| +  def test_git_cl_try_buildbucket_with_properties_rietveld(self): | 
| +    self.mock(git_cl._RietveldChangelistImpl, 'GetIssueProperties', | 
| +              lambda _: { | 
| +                'owner_email': 'owner@e.mail', | 
| +                'private': False, | 
| +                'closed': False, | 
| +                'project': 'depot_tools', | 
| +                'patchsets': [20001], | 
| +              }) | 
| self.mock(git_cl.uuid, 'uuid4', lambda: 'uuid4') | 
| self.calls = [ | 
| ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | 
| @@ -1923,8 +1971,8 @@ class TestGitCl(TestCase): | 
| ((['git', 'config', 'rietveld.autoupdate'],), CERR1), | 
| ((['git', 'config', 'rietveld.server'],), | 
| 'https://codereview.chromium.org'), | 
| -        ((['git', 'config', 'branch.feature.rietveldserver'],), CERR1), | 
| ((['git', 'config', 'branch.feature.rietveldpatchset'],), '20001'), | 
| +        ((['git', 'config', 'branch.feature.rietveldserver'],), CERR1), | 
| ] | 
|  | 
| def _buildbucket_retry(*_, **kw): | 
| @@ -1968,10 +2016,100 @@ class TestGitCl(TestCase): | 
| git_cl.sys.stdout.getvalue(), | 
| 'Tried jobs on:\nBucket: master.tryserver.chromium') | 
|  | 
| +  def test_git_cl_try_buildbucket_with_properties_gerrit(self): | 
| +    self.mock(git_cl.Changelist, 'GetMostRecentPatchset', lambda _: 7) | 
| +    self.mock(git_cl.uuid, 'uuid4', lambda: 'uuid4') | 
| + | 
| +    def _GetChangeDetail(gerrit_change_list_impl, opts=None): | 
| +      # Get realistic expectations. | 
| +      gerrit_change_list_impl._GetGerritHost() | 
| +      return self._mocked_call(['_GetChangeDetail', opts or []]) | 
| +    self.mock(git_cl._GerritChangelistImpl, '_GetChangeDetail', | 
| +              _GetChangeDetail) | 
| + | 
| +    self.calls = [ | 
| +        ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | 
| +        ((['git', 'config', 'branch.feature.rietveldissue'],), CERR1), | 
| +        ((['git', 'config', 'branch.feature.gerritissue'],), '123456'), | 
| +        ((['git', 'config', 'branch.feature.gerritserver'],), | 
| +         'https://chromium-review.googlesource.com'), | 
| +        ((['_GetChangeDetail', []],), {'status': 'OPEN'}), | 
| +        ((['git', 'config', 'branch.feature.gerritpatchset'],), '7'), | 
| +        ((['_GetChangeDetail', ['DETAILED_ACCOUNTS']],), | 
| +         {'owner': {'email': 'owner@e.mail'}}), | 
| +        ((['_GetChangeDetail', ['ALL_REVISIONS']],), { | 
| +          'project': 'depot_tools', | 
| +          'revisions': { | 
| +            'deadbeaf':  { | 
| +              '_number': 6, | 
| +            }, | 
| +            'beeeeeef': { | 
| +              '_number': 7, | 
| +              'fetch': {'http': { | 
| +                'url': 'https://chromium.googlesource.com/depot_tools', | 
| +                'ref': 'refs/changes/56/123456/7' | 
| +              }}, | 
| +            }, | 
| +          }, | 
| +        }), | 
| +    ] | 
| + | 
| +    def _buildbucket_retry(*_, **kw): | 
| +      # self.maxDiff = 10000 | 
| +      body = json.loads(kw['body']) | 
| +      self.assertEqual(len(body['builds']), 1) | 
| +      build = body['builds'][0] | 
| +      params = json.loads(build.pop('parameters_json')) | 
| +      self.assertEqual(params, { | 
| +        u'builder_name': u'win', | 
| +        u'changes': [{u'author': {u'email': u'owner@e.mail'}, | 
| +                      u'revision': None}], | 
| +        u'properties': { | 
| +          u'category': u'git_cl_try', | 
| +           u'key': u'val', | 
| +           u'json': [{u'a': 1}, None], | 
| +           u'master': u'tryserver.chromium', | 
| + | 
| +           u'patch_gerrit_url': | 
| +             u'https://chromium-review.googlesource.com', | 
| +           u'patch_issue': 123456, | 
| +           u'patch_project': u'depot_tools', | 
| +           u'patch_ref': u'refs/changes/56/123456/7', | 
| +           u'patch_repository_url': | 
| +             u'https://chromium.googlesource.com/depot_tools', | 
| +           u'patch_set': 7, | 
| +           u'patch_storage': u'gerrit', | 
| +        } | 
| +      }) | 
| +      self.assertEqual(build, { | 
| +        u'bucket': u'master.tryserver.chromium', | 
| +        u'client_operation_id': u'uuid4', | 
| +        u'tags': [ | 
| +          u'builder:win', | 
| +          u'buildset:patch/gerrit/chromium-review.googlesource.com/123456/7', | 
| +          u'user_agent:git_cl_try', | 
| +          u'master:tryserver.chromium'], | 
| +      }) | 
| + | 
| +    self.mock(git_cl, '_buildbucket_retry', _buildbucket_retry) | 
| + | 
| +    self.mock(git_cl.sys, 'stdout', StringIO.StringIO()) | 
| +    self.assertEqual(0, git_cl.main([ | 
| +        'try', '-m', 'tryserver.chromium', '-b', 'win', | 
| +        '-p', 'key=val', '-p', 'json=[{"a":1}, null]'])) | 
| +    self.assertRegexpMatches( | 
| +        git_cl.sys.stdout.getvalue(), | 
| +        'Tried jobs on:\nBucket: master.tryserver.chromium') | 
| + | 
| def test_git_cl_try_buildbucket_bucket_flag(self): | 
| -    self.mock(git_cl.Changelist, 'GetMostRecentPatchset', lambda _: 20001) | 
| -    self.mock(git_cl.Changelist, 'GetIssueOwner', lambda _: 'owner@e.mail') | 
| -    self.mock(git_cl.Changelist, 'GetIssueProject', lambda _: 'depot_tools') | 
| +    self.mock(git_cl._RietveldChangelistImpl, 'GetIssueProperties', | 
| +              lambda _: { | 
| +                'owner_email': 'owner@e.mail', | 
| +                'private': False, | 
| +                'closed': False, | 
| +                'project': 'depot_tools', | 
| +                'patchsets': [20001], | 
| +              }) | 
| self.mock(git_cl.uuid, 'uuid4', lambda: 'uuid4') | 
| self.calls = [ | 
| ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | 
| @@ -1979,8 +2117,8 @@ class TestGitCl(TestCase): | 
| ((['git', 'config', 'rietveld.autoupdate'],), CERR1), | 
| ((['git', 'config', 'rietveld.server'],), | 
| 'https://codereview.chromium.org'), | 
| -        ((['git', 'config', 'branch.feature.rietveldserver'],), CERR1), | 
| ((['git', 'config', 'branch.feature.rietveldpatchset'],), '20001'), | 
| +        ((['git', 'config', 'branch.feature.rietveldserver'],), CERR1), | 
| ] | 
|  | 
| def _buildbucket_retry(*_, **kw): | 
| @@ -2025,7 +2163,7 @@ class TestGitCl(TestCase): | 
| ((['git', 'config', 'branch.feature.rietveldissue'],), '123'), | 
| ((['git', 'config', 'rietveld.autoupdate'],), CERR1), | 
| ((['git', 'config', 'rietveld.server'],), | 
| -       'https://codereview.chromium.org'), | 
| +        'https://codereview.chromium.org'), | 
| ((['git', 'config', 'branch.feature.rietveldserver'],), CERR1), | 
| ((['git', 'config', 'branch.feature.rietveldpatchset'],), '20001'), | 
| ] | 
|  |