OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Unit tests for git_cl.py.""" | 6 """Unit tests for git_cl.py.""" |
7 | 7 |
| 8 import copy |
8 import json | 9 import json |
9 import os | 10 import os |
10 import StringIO | 11 import StringIO |
11 import sys | 12 import sys |
12 import unittest | 13 import unittest |
13 import urlparse | 14 import urlparse |
14 | 15 |
15 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | 16 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
16 | 17 |
17 from testing_support.auto_stub import TestCase | 18 from testing_support.auto_stub import TestCase |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 self.mock(subprocess2, 'check_output', self._mocked_call) | 259 self.mock(subprocess2, 'check_output', self._mocked_call) |
259 self.mock(subprocess2, 'communicate', | 260 self.mock(subprocess2, 'communicate', |
260 lambda *a, **kw: ([self._mocked_call(*a, **kw), ''], 0)) | 261 lambda *a, **kw: ([self._mocked_call(*a, **kw), ''], 0)) |
261 self.mock(git_cl.gclient_utils, 'CheckCallAndFilter', self._mocked_call) | 262 self.mock(git_cl.gclient_utils, 'CheckCallAndFilter', self._mocked_call) |
262 self.mock(git_common, 'is_dirty_git_tree', lambda x: False) | 263 self.mock(git_common, 'is_dirty_git_tree', lambda x: False) |
263 self.mock(git_common, 'get_or_create_merge_base', | 264 self.mock(git_common, 'get_or_create_merge_base', |
264 lambda *a: ( | 265 lambda *a: ( |
265 self._mocked_call(['get_or_create_merge_base']+list(a)))) | 266 self._mocked_call(['get_or_create_merge_base']+list(a)))) |
266 self.mock(git_cl, 'BranchExists', lambda _: True) | 267 self.mock(git_cl, 'BranchExists', lambda _: True) |
267 self.mock(git_cl, 'FindCodereviewSettingsFile', lambda: '') | 268 self.mock(git_cl, 'FindCodereviewSettingsFile', lambda: '') |
| 269 self.mock(git_cl, 'time_sleep', |
| 270 lambda seconds: self._mocked_call(['time_sleep', seconds])) |
| 271 self.mock(git_cl, 'time_time', lambda: self._mocked_call(['time_time'])) |
268 self.mock(git_cl, 'ask_for_data', self._mocked_call) | 272 self.mock(git_cl, 'ask_for_data', self._mocked_call) |
269 self.mock(git_cl, 'write_json', lambda path, contents: | 273 self.mock(git_cl, 'write_json', lambda path, contents: |
270 self._mocked_call('write_json', path, contents)) | 274 self._mocked_call('write_json', path, contents)) |
271 self.mock(git_cl.presubmit_support, 'DoPresubmitChecks', PresubmitMock) | 275 self.mock(git_cl.presubmit_support, 'DoPresubmitChecks', PresubmitMock) |
272 self.mock(git_cl.rietveld, 'Rietveld', RietveldMock) | 276 self.mock(git_cl.rietveld, 'Rietveld', RietveldMock) |
273 self.mock(git_cl.rietveld, 'CachingRietveld', RietveldMock) | 277 self.mock(git_cl.rietveld, 'CachingRietveld', RietveldMock) |
274 self.mock(git_cl.upload, 'RealMain', self.fail) | 278 self.mock(git_cl.upload, 'RealMain', self.fail) |
275 self.mock(git_cl.watchlists, 'Watchlists', WatchlistsMock) | 279 self.mock(git_cl.watchlists, 'Watchlists', WatchlistsMock) |
276 self.mock(git_cl.auth, 'get_authenticator_for_host', AuthenticatorMock) | 280 self.mock(git_cl.auth, 'get_authenticator_for_host', AuthenticatorMock) |
277 self.mock(git_cl.gerrit_util.GceAuthenticator, 'is_gce', | 281 self.mock(git_cl.gerrit_util.GceAuthenticator, 'is_gce', |
(...skipping 1801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2079 self._mocked_call(['_buildbucket_retry'])) | 2083 self._mocked_call(['_buildbucket_retry'])) |
2080 | 2084 |
2081 def _setup_fetch_try_jobs_rietveld(self, *request_results): | 2085 def _setup_fetch_try_jobs_rietveld(self, *request_results): |
2082 self._setup_fetch_try_jobs(most_recent_patchset=20001) | 2086 self._setup_fetch_try_jobs(most_recent_patchset=20001) |
2083 self.calls += [ | 2087 self.calls += [ |
2084 ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | 2088 ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), |
2085 ((['git', 'config', 'branch.feature.rietveldissue'],), '1'), | 2089 ((['git', 'config', 'branch.feature.rietveldissue'],), '1'), |
2086 ((['git', 'config', 'rietveld.autoupdate'],), CERR1), | 2090 ((['git', 'config', 'rietveld.autoupdate'],), CERR1), |
2087 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), | 2091 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), |
2088 ((['git', 'config', 'branch.feature.rietveldpatchset'],), '20001'), | 2092 ((['git', 'config', 'branch.feature.rietveldpatchset'],), '20001'), |
| 2093 ((['time_time'],), 1000.0), |
2089 ((['git', 'config', 'branch.feature.rietveldserver'],), | 2094 ((['git', 'config', 'branch.feature.rietveldserver'],), |
2090 'codereview.example.com'), | 2095 'codereview.example.com'), |
2091 ((['get_authenticator_for_host', 'codereview.example.com'],), | 2096 ((['get_authenticator_for_host', 'codereview.example.com'],), |
2092 AuthenticatorMock()), | 2097 AuthenticatorMock()), |
2093 ] + [((['_buildbucket_retry'],), r) for r in request_results] | 2098 ] + [((['_buildbucket_retry'],), copy.deepcopy(r)) for r in request_results] |
2094 | 2099 |
2095 def test_fetch_try_jobs_none_rietveld(self): | 2100 def test_fetch_try_jobs_none_rietveld(self): |
2096 self._setup_fetch_try_jobs_rietveld({}) | 2101 self._setup_fetch_try_jobs_rietveld({}) |
2097 # Simulate that user isn't logged in. | 2102 # Simulate that user isn't logged in. |
2098 self.mock(AuthenticatorMock, 'has_cached_credentials', lambda _: False) | 2103 self.mock(AuthenticatorMock, 'has_cached_credentials', lambda _: False) |
2099 self.assertEqual(0, git_cl.main(['try-results'])) | 2104 self.assertEqual(0, git_cl.main(['try-results'])) |
2100 self.assertRegexpMatches(sys.stdout.getvalue(), | 2105 self.assertRegexpMatches(sys.stdout.getvalue(), |
2101 'Warning: Some results might be missing') | 2106 'Warning: Some results might be missing') |
2102 self.assertRegexpMatches(sys.stdout.getvalue(), 'No try jobs') | 2107 self.assertRegexpMatches(sys.stdout.getvalue(), 'No try jobs') |
2103 | 2108 |
2104 def test_fetch_try_jobs_some_rietveld(self): | 2109 def test_fetch_try_jobs_some_rietveld(self): |
2105 self._setup_fetch_try_jobs_rietveld({ | 2110 self._setup_fetch_try_jobs_rietveld({ |
2106 'builds': self.BUILDBUCKET_BUILDS_MAP.values(), | 2111 'builds': self.BUILDBUCKET_BUILDS_MAP.values(), |
2107 }) | 2112 }) |
2108 self.assertEqual(0, git_cl.main(['try-results'])) | 2113 self.assertEqual(0, git_cl.main(['try-results'])) |
2109 self.assertRegexpMatches(sys.stdout.getvalue(), '^Failures:') | 2114 self.assertRegexpMatches(sys.stdout.getvalue(), '^Failures:') |
2110 self.assertRegexpMatches(sys.stdout.getvalue(), 'Started:') | 2115 self.assertRegexpMatches(sys.stdout.getvalue(), 'Started:') |
2111 self.assertRegexpMatches(sys.stdout.getvalue(), '2 try jobs') | 2116 self.assertRegexpMatches(sys.stdout.getvalue(), '2 try jobs') |
2112 | 2117 |
2113 def _setup_fetch_try_jobs_gerrit(self, *request_results): | 2118 def _setup_fetch_try_jobs_gerrit(self, *request_results): |
2114 self._setup_fetch_try_jobs(most_recent_patchset=13) | 2119 self._setup_fetch_try_jobs(most_recent_patchset=13) |
2115 self.calls += [ | 2120 self.calls += [ |
2116 ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | 2121 ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), |
2117 ((['git', 'config', 'branch.feature.rietveldissue'],), CERR1), | 2122 ((['git', 'config', 'branch.feature.rietveldissue'],), CERR1), |
2118 ((['git', 'config', 'branch.feature.gerritissue'],), '1'), | 2123 ((['git', 'config', 'branch.feature.gerritissue'],), '1'), |
2119 # Simulate that Gerrit has more patchsets than local. | 2124 # Simulate that Gerrit has more patchsets than local. |
2120 ((['git', 'config', 'branch.feature.gerritpatchset'],), '12'), | 2125 ((['git', 'config', 'branch.feature.gerritpatchset'],), '12'), |
| 2126 ((['time_time'],), 1000.0), |
2121 ((['git', 'config', 'branch.feature.gerritserver'],), | 2127 ((['git', 'config', 'branch.feature.gerritserver'],), |
2122 'https://x-review.googlesource.com'), | 2128 'https://x-review.googlesource.com'), |
2123 ((['get_authenticator_for_host', 'x-review.googlesource.com'],), | 2129 ((['get_authenticator_for_host', 'x-review.googlesource.com'],), |
2124 AuthenticatorMock()), | 2130 AuthenticatorMock()), |
2125 ] + [((['_buildbucket_retry'],), r) for r in request_results] | 2131 ] + [((['_buildbucket_retry'],), copy.deepcopy(r)) for r in request_results] |
2126 | 2132 |
2127 def test_fetch_try_jobs_none_gerrit(self): | 2133 def test_fetch_try_jobs_none_gerrit(self): |
2128 self._setup_fetch_try_jobs_gerrit({}) | 2134 self._setup_fetch_try_jobs_gerrit({}) |
2129 self.assertEqual(0, git_cl.main(['try-results'])) | 2135 self.assertEqual(0, git_cl.main(['try-results'])) |
2130 self.assertRegexpMatches( | 2136 self.assertRegexpMatches( |
2131 sys.stdout.getvalue(), | 2137 sys.stdout.getvalue(), |
2132 r'Warning: Codereview server has newer patchsets \(13\)') | 2138 r'Warning: Codereview server has newer patchsets \(13\)') |
2133 self.assertRegexpMatches(sys.stdout.getvalue(), 'No try jobs') | 2139 self.assertRegexpMatches(sys.stdout.getvalue(), 'No try jobs') |
2134 | 2140 |
2135 def test_fetch_try_jobs_some_gerrit(self): | 2141 def test_fetch_try_jobs_some_gerrit(self): |
2136 self._setup_fetch_try_jobs_gerrit({ | 2142 self._setup_fetch_try_jobs_gerrit({ |
2137 'builds': self.BUILDBUCKET_BUILDS_MAP.values(), | 2143 'builds': self.BUILDBUCKET_BUILDS_MAP.values(), |
2138 }) | 2144 }) |
2139 # Explicit --patchset means actual local patchset doesn't matter. | 2145 # Explicit --patchset means actual local patchset doesn't matter. |
2140 self.calls.remove( | 2146 self.calls.remove( |
2141 ((['git', 'config', 'branch.feature.gerritpatchset'],), '12')) | 2147 ((['git', 'config', 'branch.feature.gerritpatchset'],), '12')) |
2142 self.assertEqual(0, git_cl.main(['try-results', '--patchset', '5'])) | 2148 self.assertEqual(0, git_cl.main(['try-results', '--patchset', '5'])) |
2143 | 2149 |
2144 # ... and doesn't result in warning. | 2150 # ... and doesn't result in warning. |
2145 self.assertNotRegexpMatches(sys.stdout.getvalue(), 'Warning') | 2151 self.assertNotRegexpMatches(sys.stdout.getvalue(), 'Warning') |
2146 self.assertRegexpMatches(sys.stdout.getvalue(), '^Failures:') | 2152 self.assertRegexpMatches(sys.stdout.getvalue(), '^Failures:') |
2147 self.assertRegexpMatches(sys.stdout.getvalue(), 'Started:') | 2153 self.assertRegexpMatches(sys.stdout.getvalue(), 'Started:') |
2148 self.assertRegexpMatches(sys.stdout.getvalue(), '2 try jobs') | 2154 self.assertRegexpMatches(sys.stdout.getvalue(), '2 try jobs') |
2149 | 2155 |
| 2156 def test_fetch_try_jobs_some_gerrit_wait(self): |
| 2157 # Sort jobs by ID for determinism. |
| 2158 some_incomplete = copy.deepcopy([ |
| 2159 b for _, b in sorted(self.BUILDBUCKET_BUILDS_MAP.iteritems())]) |
| 2160 self.assertEqual(some_incomplete[0]['id'], '8000') |
| 2161 self.assertEqual(some_incomplete[0]['status'], 'COMPLETED') |
| 2162 self.assertEqual(some_incomplete[1]['id'], '9000') |
| 2163 self.assertEqual(some_incomplete[1]['status'], 'STARTED') |
| 2164 all_complete = copy.deepcopy(some_incomplete) |
| 2165 all_complete[1]['status'] = 'COMPLETED' |
| 2166 |
| 2167 self._setup_fetch_try_jobs_gerrit({'builds': some_incomplete}) |
| 2168 self.calls += [ |
| 2169 ((['time_time'],), 1010.0), |
| 2170 ((['time_sleep', 10],), None), |
| 2171 ((['get_authenticator_for_host', 'x-review.googlesource.com'],), |
| 2172 AuthenticatorMock()), |
| 2173 ((['_buildbucket_retry'],), {'builds': all_complete}), |
| 2174 ] |
| 2175 self.assertEqual(0, git_cl.main(['try-results', '-w'])) |
| 2176 |
| 2177 def test_fetch_try_jobs_gerrit_wait_timeout(self): |
| 2178 self._setup_fetch_try_jobs_gerrit({ |
| 2179 'builds': self.BUILDBUCKET_BUILDS_MAP.values(), # Not all complete. |
| 2180 }) |
| 2181 self.calls += [ |
| 2182 ((['time_time'],), 1000.0 + 60 * 60 + 1), # Simulate running for too long. |
| 2183 ] |
| 2184 self.assertEqual(3, git_cl.main(['try-results', '-w'])) |
| 2185 |
2150 | 2186 |
2151 if __name__ == '__main__': | 2187 if __name__ == '__main__': |
2152 git_cl.logging.basicConfig( | 2188 git_cl.logging.basicConfig( |
2153 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) | 2189 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) |
2154 unittest.main() | 2190 unittest.main() |
OLD | NEW |