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

Unified Diff: tests/gclient_utils_test.py

Issue 2241843002: gclient: kill git fetch operation that hangs. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Nits. Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests/gclient_scm_test.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/gclient_utils_test.py
diff --git a/tests/gclient_utils_test.py b/tests/gclient_utils_test.py
index 39a3d772d816a0d3eeda577ba6f70a42cbed2866..582fbba133065926a2888acb1e4e44abbdf1c3f4 100755
--- a/tests/gclient_utils_test.py
+++ b/tests/gclient_utils_test.py
@@ -6,6 +6,7 @@
import os
import StringIO
import sys
+import threading
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@@ -81,6 +82,62 @@ class CheckCallAndFilterTestCase(GclientUtilBase):
'ahah\naccb\nallo\naddb\n'
'________ running \'boo foo bar\' in \'bleh\'\nahah\naccb\nallo\naddb')
+ def _checkKillTimeout(self, output_block_for=0, kill_raises=False):
+ cv = threading.Condition()
+ order = []
+
+ output = list(reversed('output'))
+ def kid_stdout_read(_):
+ if output:
+ return output.pop()
+ else:
+ with cv:
+ cv.wait(timeout=output_block_for)
+ order.append('unblock')
+ return ''
+ def kid_kill():
+ with cv:
+ order.append('killed')
+ cv.notify()
+ if kill_raises:
+ raise OSError('somethign went wrong')
+
+ kid = self.ProcessIdMock('')
+ kid.stdout.read = kid_stdout_read
+ kid.kill = kid_kill # pylint: disable=W0201
+ cwd = 'bleh'
+ args = ['ar', 'gs']
+ gclient_utils.sys.stdout.write(
+ '\n________ running \'ar gs\' in \'bleh\'\noutput')
+ os.getcwd()
+ subprocess2.Popen(
+ args, cwd=cwd,
+ stdout=subprocess2.PIPE,
+ stderr=subprocess2.STDOUT,
+ bufsize=0).AndReturn(kid)
+ self.mox.ReplayAll()
+
+ # This test relies on the testing machine's ability to process 1 char
+ # of output in <0.01 seconds set in kill_timeout.
+ gclient_utils.CheckCallAndFilterAndHeader(
+ args, cwd=cwd, always=True, kill_timeout=0.01)
+ self.checkstdout(
+ '\n________ running \'ar gs\' in \'bleh\'\noutput\n'
+ '________ running \'ar gs\' in \'bleh\'\noutput')
+ return order
+
+ def testKillTimeout(self):
+ order = self._checkKillTimeout(output_block_for=1.0)
+ self.assertEquals(order, ['killed', 'unblock'])
+
+ def testKillRaise(self):
+ order = self._checkKillTimeout(output_block_for=1.0, kill_raises=True)
+ self.assertEquals(order, ['killed', 'unblock'])
+
+ def testNoKill(self):
+ order = self._checkKillTimeout(output_block_for=0.0)
+ self.assertEquals(order, ['unblock'])
+
class SplitUrlRevisionTestCase(GclientUtilBase):
def testSSHUrl(self):
@@ -203,6 +260,12 @@ class GClientUtilsTest(trial_dir.TestCase):
if __name__ == '__main__':
import unittest
+ import logging
+ level = logging.DEBUG if '-v' in sys.argv else logging.FATAL
+ logging.basicConfig(
+ level=level,
+ format='%(asctime).19s %(levelname)s %(filename)s:'
+ '%(lineno)s %(message)s')
unittest.main()
# vim: ts=2:sw=2:tw=80:et:
« no previous file with comments | « tests/gclient_scm_test.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698