Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: tests/git_cl_test.py

Issue 2074233002: git cl test framework: improve debuggability of expected calls. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: remove duplication Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 os 8 import os
9 import StringIO 9 import StringIO
10 import stat 10 import stat
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 # Gerrrit. 206 # Gerrrit.
207 test('https://chrome-review.source.com/c/123/4', 207 test('https://chrome-review.source.com/c/123/4',
208 123, 4, 'chrome-review.source.com') 208 123, 4, 'chrome-review.source.com')
209 test('https://chrome-review.source.com/bad/123/4', fail=True) 209 test('https://chrome-review.source.com/bad/123/4', fail=True)
210 210
211 211
212 class TestGitCl(TestCase): 212 class TestGitCl(TestCase):
213 def setUp(self): 213 def setUp(self):
214 super(TestGitCl, self).setUp() 214 super(TestGitCl, self).setUp()
215 self.calls = [] 215 self.calls = []
216 self._calls_done = 0 216 self._calls_done = []
217 self.mock(subprocess2, 'call', self._mocked_call) 217 self.mock(subprocess2, 'call', self._mocked_call)
218 self.mock(subprocess2, 'check_call', self._mocked_call) 218 self.mock(subprocess2, 'check_call', self._mocked_call)
219 self.mock(subprocess2, 'check_output', self._mocked_call) 219 self.mock(subprocess2, 'check_output', self._mocked_call)
220 self.mock(subprocess2, 'communicate', self._mocked_call) 220 self.mock(subprocess2, 'communicate', self._mocked_call)
221 self.mock(git_cl.gclient_utils, 'CheckCallAndFilter', self._mocked_call) 221 self.mock(git_cl.gclient_utils, 'CheckCallAndFilter', self._mocked_call)
222 self.mock(git_common, 'is_dirty_git_tree', lambda x: False) 222 self.mock(git_common, 'is_dirty_git_tree', lambda x: False)
223 self.mock(git_common, 'get_or_create_merge_base', 223 self.mock(git_common, 'get_or_create_merge_base',
224 lambda *a: ( 224 lambda *a: (
225 self._mocked_call(['get_or_create_merge_base']+list(a)))) 225 self._mocked_call(['get_or_create_merge_base']+list(a))))
226 self.mock(git_cl, 'BranchExists', lambda _: True) 226 self.mock(git_cl, 'BranchExists', lambda _: True)
(...skipping 17 matching lines...) Expand all
244 # included, has failed. That means current test may have actually ran 244 # included, has failed. That means current test may have actually ran
245 # fine, and the check for no leftover calls would be skipped. 245 # fine, and the check for no leftover calls would be skipped.
246 if not self.has_failed(): 246 if not self.has_failed():
247 self.assertEquals([], self.calls) 247 self.assertEquals([], self.calls)
248 finally: 248 finally:
249 super(TestGitCl, self).tearDown() 249 super(TestGitCl, self).tearDown()
250 250
251 def _mocked_call(self, *args, **_kwargs): 251 def _mocked_call(self, *args, **_kwargs):
252 self.assertTrue( 252 self.assertTrue(
253 self.calls, 253 self.calls,
254 '@%d Expected: <Missing> Actual: %r' % (self._calls_done, args)) 254 '@%d Expected: <Missing> Actual: %r' % (len(self._calls_done), args))
255 top = self.calls.pop(0) 255 top = self.calls.pop(0)
256 if len(top) > 2 and top[2]: 256 if len(top) > 2 and top[2]:
257 raise top[2] 257 raise top[2]
258 expected_args, result = top 258 expected_args, result = top
259 259
260 # Also logs otherwise it could get caught in a try/finally and be hard to 260 # Also logs otherwise it could get caught in a try/finally and be hard to
261 # diagnose. 261 # diagnose.
262 if expected_args != args: 262 if expected_args != args:
263 msg = '@%d Expected: %r Actual: %r' % ( 263 N = 5
264 self._calls_done, expected_args, args) 264 prior_calls = '\n '.join(
265 git_cl.logging.error(msg) 265 '@%d: %r' % (len(self._calls_done) - N + i, c[0])
266 self.fail(msg) 266 for i, c in enumerate(self._calls_done[-N:]))
267 self._calls_done += 1 267 following_calls = '\n '.join(
268 '@%d: %r' % (len(self._calls_done) + i + 1, c[0])
269 for i, c in enumerate(self.calls[:N]))
270 extended_msg = (
271 'A few prior calls:\n %s\n\n'
272 'This (expected):\n @%d: %r\n'
273 'This (actual):\n @%d: %r\n\n'
274 'A few following expected calls:\n %s' %
275 (prior_calls, len(self._calls_done), expected_args,
276 len(self._calls_done), args, following_calls))
277 git_cl.logging.error(extended_msg)
278
279 self.fail('@%d Expected: %r Actual: %r' % (
280 len(self._calls_done), expected_args, args))
281
282 self._calls_done.append(top)
268 return result 283 return result
269 284
270 @classmethod 285 @classmethod
271 def _is_gerrit_calls(cls, gerrit=False): 286 def _is_gerrit_calls(cls, gerrit=False):
272 return [((['git', 'config', 'rietveld.autoupdate'],), ''), 287 return [((['git', 'config', 'rietveld.autoupdate'],), ''),
273 ((['git', 'config', 'gerrit.host'],), 'True' if gerrit else '')] 288 ((['git', 'config', 'gerrit.host'],), 'True' if gerrit else '')]
274 289
275 @classmethod 290 @classmethod
276 def _upload_calls(cls, similarity, find_copies, private): 291 def _upload_calls(cls, similarity, find_copies, private):
277 return (cls._git_base_calls(similarity, find_copies) + 292 return (cls._git_base_calls(similarity, find_copies) +
(...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after
1628 ((['rm_file_or_tree', '/abs/git_repo_root/.git/hooks/commit-msg'],), 1643 ((['rm_file_or_tree', '/abs/git_repo_root/.git/hooks/commit-msg'],),
1629 ''), 1644 ''),
1630 ] 1645 ]
1631 cl._codereview_impl._GerritCommitMsgHookCheck(offer_removal=True) 1646 cl._codereview_impl._GerritCommitMsgHookCheck(offer_removal=True)
1632 1647
1633 1648
1634 if __name__ == '__main__': 1649 if __name__ == '__main__':
1635 git_cl.logging.basicConfig( 1650 git_cl.logging.basicConfig(
1636 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) 1651 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR)
1637 unittest.main() 1652 unittest.main()
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698