git-cl: Re-write some tests to use mock.

I think this makes tests easier to read and write.

Change-Id: I9430a5d40e3466ff2a24b6b40253419aea3f30b5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1820034
Reviewed-by: Anthony Polito <apolito@google.com>
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index f1cdf4d..f103d46 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -18,6 +18,7 @@
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 
 from testing_support.auto_stub import TestCase
+from third_party import mock
 
 import metrics
 # We have to disable monitoring before importing git_cl.
@@ -34,6 +35,12 @@
   return subprocess2.CalledProcessError(code, cmd, cwd, stdout, stderr)
 
 
+def _constantFn(return_value):
+  def f(*args, **kwargs):
+    return return_value
+  return f
+
+
 CERR1 = callError(1)
 
 
@@ -91,6 +98,15 @@
     return ['joe@example.com']
 
 
+class CodereviewSettingsFileMock(object):
+  def __init__(self):
+    pass
+  # pylint: disable=no-self-use
+  def read(self):
+    return ('CODE_REVIEW_SERVER: gerrit.chromium.org\n' +
+            'GERRIT_HOST: True\n')
+
+
 class AuthenticatorMock(object):
   def __init__(self, *_args):
     pass
@@ -2349,196 +2365,6 @@
     ]
     self.assertEqual(0, git_cl.main(['issue', '--json', 'output.json']))
 
-  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.Changelist, 'SetCQState',
-              lambda _, s: self._mocked_call(['SetCQState', s]))
-
-    self.calls = [
-        ((['git', 'symbolic-ref', 'HEAD'],), 'feature'),
-        ((['git', 'config', 'branch.feature.gerritissue'],), '123456'),
-        ((['git', 'config', 'branch.feature.gerritserver'],),
-         'https://chromium-review.googlesource.com'),
-        ((['git', 'config', 'branch.feature.merge'],), 'feature'),
-        ((['git', 'config', 'branch.feature.remote'],), 'origin'),
-        ((['git', 'config', 'remote.origin.url'],),
-         'https://chromium.googlesource.com/depot_tools'),
-        (('GetChangeDetail', 'chromium-review.googlesource.com',
-          'depot_tools~123456',
-         ['DETAILED_ACCOUNTS', 'ALL_REVISIONS', 'CURRENT_COMMIT']), {
-          'project': 'depot_tools',
-          'status': 'OPEN',
-          'owner': {'email': 'owner@e.mail'},
-          'revisions': {
-            'deadbeaf': {
-              '_number': 6,
-            },
-            'beeeeeef': {
-              '_number': 7,
-              'fetch': {'http': {
-                'url': 'https://chromium.googlesource.com/depot_tools',
-                'ref': 'refs/changes/56/123456/7'
-              }},
-            },
-          },
-        }),
-        ((['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], ), 0),
-    ]
-    out = StringIO.StringIO()
-    self.mock(git_cl.sys, 'stdout', out)
-    self.assertEqual(0, git_cl.main(['try']))
-    self.assertEqual(
-        out.getvalue(),
-        'Scheduling CQ dry run on: '
-        'https://chromium-review.googlesource.com/123456\n')
-
-  def test_parse_bucket(self):
-    self.assertEqual(git_cl._parse_bucket('chromium/try'), ('chromium', 'try'))
-    self.assertEqual(
-        git_cl._parse_bucket('luci.chromium.try'), ('chromium', 'try'))
-    self.assertEqual(git_cl._parse_bucket('not-a-bucket'), (None, None))
-    self.mock(git_cl.sys, 'stdout', StringIO.StringIO())
-    self.assertEqual(
-        git_cl._parse_bucket('skia.primary'),
-        ('skia', 'skia.primary'))
-    self.assertIn(
-        'WARNING Please specify buckets',
-        git_cl.sys.stdout.getvalue())
-
-  def test_git_cl_try_buildbucket_with_wrong_bucket(self):
-    self.mock(git_cl.Changelist, 'GetMostRecentPatchset', lambda _: 7)
-    self.mock(git_cl.uuid, 'uuid4', lambda: 'uuid4')
-
-    self.calls = [
-        ((['git', 'symbolic-ref', 'HEAD'],), 'feature'),
-        ((['git', 'config', 'branch.feature.gerritissue'],), '123456'),
-        ((['git', 'config', 'branch.feature.gerritserver'],),
-         'https://chromium-review.googlesource.com'),
-        ((['git', 'config', 'branch.feature.merge'],), 'feature'),
-        ((['git', 'config', 'branch.feature.remote'],), 'origin'),
-        ((['git', 'config', 'remote.origin.url'],),
-         'https://chromium.googlesource.com/depot_tools'),
-        (('GetChangeDetail', 'chromium-review.googlesource.com',
-          'depot_tools~123456',
-         ['DETAILED_ACCOUNTS', 'ALL_REVISIONS', 'CURRENT_COMMIT']), {
-          'project': 'depot_tools',
-          'status': 'OPEN',
-          'owner': {'email': 'owner@e.mail'},
-          'revisions': {
-            'deadbeaf': {
-              '_number': 6,
-            },
-            'beeeeeef': {
-              '_number': 7,
-              'fetch': {'http': {
-                'url': 'https://chromium.googlesource.com/depot_tools',
-                'ref': 'refs/changes/56/123456/7'
-              }},
-            },
-          },
-        }),
-        ((['git', 'config', 'branch.feature.gerritpatchset'],), '7'),
-    ]
-
-    self.mock(git_cl.sys, 'stdout', StringIO.StringIO())
-    self.assertEqual(0, git_cl.main([
-        'try', '-B', 'not-a-bucket', '-b', 'win',
-        '-p', 'key=val', '-p', 'json=[{"a":1}, null]']))
-    self.assertIn(
-        'Could not parse bucket "not-a-bucket"',
-        git_cl.sys.stdout.getvalue())
-
-  def test_git_cl_try_buildbucket_with_properties_gerrit(self):
-    def _mock_call_buildbucket(_http, buildbucket_host, method, request=None):
-      bb_request = {
-          "requests": [{
-              "scheduleBuild": {
-                  "requestId": "uuid4",
-                  "builder": {
-                      "project": "chromium",
-                      "builder": "win",
-                      "bucket": "try",
-                  },
-                  "gerritChanges": [{
-                      "project": "depot_tools",
-                      "host": "chromium-review.googlesource.com",
-                      "patchset": 7,
-                      "change": 123456,
-                  }],
-                  "properties": {
-                      "category": "git_cl_try",
-                      "json": [{"a": 1}, None],
-                      "key": "val",
-                  },
-                  "tags": [
-                      {"value": "win", "key": "builder"},
-                      {"value": "git_cl_try", "key": "user_agent"},
-                  ],
-              },
-          }],
-      }
-      self.assertEqual(method, 'Batch')
-      self.assertEqual(buildbucket_host, 'cr-buildbucket.appspot.com')
-      self.assertEqual(request, bb_request)
-      return {}
-
-    self.mock(git_cl, '_call_buildbucket', _mock_call_buildbucket)
-    self.mock(git_cl.Changelist, 'GetMostRecentPatchset', lambda _: 7)
-    self.mock(git_cl.uuid, 'uuid4', lambda: 'uuid4')
-
-    self.calls = [
-        ((['git', 'symbolic-ref', 'HEAD'],), 'feature'),
-        ((['git', 'config', 'branch.feature.gerritissue'],), '123456'),
-        ((['git', 'config', 'branch.feature.gerritserver'],),
-         'https://chromium-review.googlesource.com'),
-        ((['git', 'config', 'branch.feature.merge'],), 'feature'),
-        ((['git', 'config', 'branch.feature.remote'],), 'origin'),
-        ((['git', 'config', 'remote.origin.url'],),
-         'https://chromium.googlesource.com/depot_tools'),
-        (('GetChangeDetail', 'chromium-review.googlesource.com',
-          'depot_tools~123456',
-         ['DETAILED_ACCOUNTS', 'ALL_REVISIONS', 'CURRENT_COMMIT']), {
-          'project': 'depot_tools',
-          'status': 'OPEN',
-          'owner': {'email': 'owner@e.mail'},
-          'revisions': {
-            'deadbeaf': {
-              '_number': 6,
-            },
-            'beeeeeef': {
-              '_number': 7,
-              'fetch': {'http': {
-                'url': 'https://chromium.googlesource.com/depot_tools',
-                'ref': 'refs/changes/56/123456/7'
-              }},
-            },
-          },
-        }),
-        ((['git', 'config', 'branch.feature.gerritpatchset'],), '7'),
-    ]
-
-    self.mock(git_cl.sys, 'stdout', StringIO.StringIO())
-    self.assertEqual(0, git_cl.main([
-        'try', '-B', 'luci.chromium.try', '-b', 'win',
-        '-p', 'key=val', '-p', 'json=[{"a":1}, null]']))
-    self.assertIn(
-        'Scheduling jobs on:\nBucket: luci.chromium.try',
-        git_cl.sys.stdout.getvalue())
-
   def _common_GerritCommitMsgHookCheck(self):
     self.mock(git_cl.sys, 'stdout', StringIO.StringIO())
     self.mock(git_cl.os.path, 'abspath',
@@ -3299,6 +3125,170 @@
     self.assertEqual(cl._GerritChangeIdentifier(), '123456')
 
 
+class CMDTryTestCase(unittest.TestCase):
+  def setUp(self):
+    super(CMDTryTestCase, self).setUp()
+    mock.patch('git_cl.sys.stdout', StringIO.StringIO()).start()
+    mock.patch('git_cl.uuid.uuid4', _constantFn('uuid4')).start()
+    mock.patch('git_cl.Changelist.GetIssue', _constantFn(123456)).start()
+    mock.patch('git_cl.Changelist.GetCodereviewServer',
+               _constantFn('https://chromium-review.googlesource.com')).start()
+    mock.patch('git_cl.Changelist.SetPatchset').start()
+    mock.patch('git_cl.Changelist.GetPatchset', _constantFn(7)).start()
+    mock.patch('git_cl.auth.get_authenticator_for_host', AuthenticatorMock())
+    self.addCleanup(mock.patch.stopall)
+
+  @mock.patch('git_cl.Changelist._GetChangeDetail')
+  @mock.patch('git_cl.Changelist.SetCQState')
+  @mock.patch('git_cl._get_bucket_map', _constantFn({}))
+  def testSetCQDryRunByDefault(self, mockSetCQState, mockGetChangeDetail):
+    mockSetCQState.return_value = 0
+    mockGetChangeDetail.return_value = {
+        'project': 'depot_tools',
+        'status': 'OPEN',
+        'owner': {'email': 'owner@e.mail'},
+        'current_revision': 'beeeeeef',
+        'revisions': {
+            'deadbeaf': {
+                '_number': 6,
+            },
+            'beeeeeef': {
+                '_number': 7,
+                'fetch': {'http': {
+                    'url': 'https://chromium.googlesource.com/depot_tools',
+                    'ref': 'refs/changes/56/123456/7'
+                }},
+            },
+        },
+    }
+
+    self.assertEqual(0, git_cl.main(['try']))
+    git_cl.Changelist.SetCQState.assert_called_with(git_cl._CQState.DRY_RUN)
+    self.assertEqual(
+        sys.stdout.getvalue(),
+        'Scheduling CQ dry run on: '
+        'https://chromium-review.googlesource.com/123456\n')
+
+  @mock.patch('git_cl.Changelist._GetChangeDetail')
+  @mock.patch('git_cl._call_buildbucket')
+  def testScheduleOnBuildbucket(self, mockCallBuildbucket, mockGetChangeDetail):
+    mockCallBuildbucket.return_value = {}
+    mockGetChangeDetail.return_value = {
+        'project': 'depot_tools',
+        'status': 'OPEN',
+        'owner': {'email': 'owner@e.mail'},
+        'current_revision': 'beeeeeef',
+        'revisions': {
+            'deadbeaf': {
+                '_number': 6,
+            },
+            'beeeeeef': {
+                '_number': 7,
+                'fetch': {'http': {
+                    'url': 'https://chromium.googlesource.com/depot_tools',
+                    'ref': 'refs/changes/56/123456/7'
+                }},
+            },
+        },
+    }
+
+    self.assertEqual(0, git_cl.main([
+        'try', '-B', 'luci.chromium.try', '-b', 'win',
+        '-p', 'key=val', '-p', 'json=[{"a":1}, null]']))
+    self.assertIn(
+        'Scheduling jobs on:\nBucket: luci.chromium.try',
+        git_cl.sys.stdout.getvalue())
+
+    expected_request = {
+        "requests": [{
+            "scheduleBuild": {
+                "requestId": "uuid4",
+                "builder": {
+                    "project": "chromium",
+                    "builder": "win",
+                    "bucket": "try",
+                },
+                "gerritChanges": [{
+                    "project": "depot_tools",
+                    "host": "chromium-review.googlesource.com",
+                    "patchset": 7,
+                    "change": 123456,
+                }],
+                "properties": {
+                    "category": "git_cl_try",
+                    "json": [{"a": 1}, None],
+                    "key": "val",
+                },
+                "tags": [
+                    {"value": "win", "key": "builder"},
+                    {"value": "git_cl_try", "key": "user_agent"},
+                ],
+            },
+        }],
+    }
+    mockCallBuildbucket.assert_called_with(
+        mock.ANY, 'cr-buildbucket.appspot.com', 'Batch', expected_request)
+
+
+  @mock.patch('git_cl.Changelist._GetChangeDetail')
+  def testScheduleOnBuildbucket_WrongBucket(self, mockGetChangeDetail):
+    mockGetChangeDetail.return_value = {
+        'project': 'depot_tools',
+        'status': 'OPEN',
+        'owner': {'email': 'owner@e.mail'},
+        'current_revision': 'beeeeeef',
+        'revisions': {
+            'deadbeaf': {
+                '_number': 6,
+            },
+            'beeeeeef': {
+                '_number': 7,
+                'fetch': {'http': {
+                    'url': 'https://chromium.googlesource.com/depot_tools',
+                    'ref': 'refs/changes/56/123456/7'
+                }},
+            },
+        },
+    }
+
+    self.assertEqual(0, git_cl.main([
+        'try', '-B', 'not-a-bucket', '-b', 'win',
+        '-p', 'key=val', '-p', 'json=[{"a":1}, null]']))
+    self.assertIn(
+        'WARNING Could not parse bucket "not-a-bucket". Skipping.',
+        git_cl.sys.stdout.getvalue())
+
+  def test_parse_bucket(self):
+    test_cases = [
+        {
+            'bucket': 'chromium/try',
+            'result': ('chromium', 'try'),
+        },
+        {
+            'bucket': 'luci.chromium.try',
+            'result': ('chromium', 'try'),
+            'has_warning': True,
+        },
+        {
+            'bucket': 'skia.primary',
+            'result': ('skia', 'skia.primary'),
+            'has_warning': True,
+        },
+        {
+            'bucket': 'not-a-bucket',
+            'result': (None, None),
+        },
+    ]
+
+    for test_case in test_cases:
+      git_cl.sys.stdout.truncate(0)
+      self.assertEqual(
+          test_case['result'], git_cl._parse_bucket(test_case['bucket']))
+      if test_case.get('has_warning'):
+        self.assertIn(
+            'WARNING Please specify buckets', git_cl.sys.stdout.getvalue())
+
+
 if __name__ == '__main__':
   logging.basicConfig(
       level=logging.DEBUG if '-v' in sys.argv else logging.ERROR)