git cl test framework: improve debuggability of expected calls.

R=phajdan.jr@chromium.org
BUG=

Review-Url: https://codereview.chromium.org/2074233002
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 53fdacb..cc01ae3 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -213,7 +213,7 @@
   def setUp(self):
     super(TestGitCl, self).setUp()
     self.calls = []
-    self._calls_done = 0
+    self._calls_done = []
     self.mock(subprocess2, 'call', self._mocked_call)
     self.mock(subprocess2, 'check_call', self._mocked_call)
     self.mock(subprocess2, 'check_output', self._mocked_call)
@@ -251,7 +251,7 @@
   def _mocked_call(self, *args, **_kwargs):
     self.assertTrue(
         self.calls,
-        '@%d  Expected: <Missing>   Actual: %r' % (self._calls_done, args))
+        '@%d  Expected: <Missing>   Actual: %r' % (len(self._calls_done), args))
     top = self.calls.pop(0)
     if len(top) > 2 and top[2]:
       raise top[2]
@@ -260,11 +260,26 @@
     # Also logs otherwise it could get caught in a try/finally and be hard to
     # diagnose.
     if expected_args != args:
-      msg = '@%d  Expected: %r   Actual: %r' % (
-          self._calls_done, expected_args, args)
-      git_cl.logging.error(msg)
-      self.fail(msg)
-    self._calls_done += 1
+      N = 5
+      prior_calls  = '\n  '.join(
+          '@%d: %r' % (len(self._calls_done) - N + i, c[0])
+          for i, c in enumerate(self._calls_done[-N:]))
+      following_calls = '\n  '.join(
+          '@%d: %r' % (len(self._calls_done) + i + 1, c[0])
+          for i, c in enumerate(self.calls[:N]))
+      extended_msg = (
+          'A few prior calls:\n  %s\n\n'
+          'This (expected):\n  @%d: %r\n'
+          'This (actual):\n  @%d: %r\n\n'
+          'A few following expected calls:\n  %s' %
+          (prior_calls, len(self._calls_done), expected_args,
+           len(self._calls_done), args, following_calls))
+      git_cl.logging.error(extended_msg)
+
+      self.fail('@%d  Expected: %r   Actual: %r' % (
+          len(self._calls_done), expected_args, args))
+
+    self._calls_done.append(top)
     return result
 
   @classmethod