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

Unified Diff: tests/gclient_scm_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 | « gclient_utils.py ('k') | tests/gclient_utils_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/gclient_scm_test.py
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py
index 00592244c90ab633a05752319e5e4569aacdf28d..f3d1b366c4afcfec62315b96d75d53684d359a73 100755
--- a/tests/gclient_scm_test.py
+++ b/tests/gclient_scm_test.py
@@ -16,6 +16,7 @@ import os
import re
import sys
import tempfile
+import threading
import unittest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@@ -969,6 +970,67 @@ class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
self.checkstdout('________ unmanaged solution; skipping .\n')
+class GitHungTest(BaseGitWrapperTestCase):
+ def setUp(self):
+ super(GitHungTest, self).setUp()
+ self.old = gclient_scm.gclient_utils.CheckCallAndFilter
+ self.old2 = gclient_scm.gclient_utils.subprocess2.Popen
+ self.options = self.Options()
+ self.options.verbose = False
+ self.scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
+ relpath=self.relpath)
+ os.environ['GCLIENT_KILL_GIT_FETCH_AFTER'] = '1.0'
+
+ def tearDown(self):
+ os.environ.pop('GCLIENT_KILL_GIT_FETCH_AFTER')
+ gclient_scm.gclient_utils.CheckCallAndFilter = self.old
+ gclient_scm.gclient_utils.subprocess2.Popen = self.old2
+ super(GitHungTest, self).tearDown()
+
+ def testGitFetchOk(self):
+ def subprocess_git_fetch_run(_, filter_fn, kill_timeout, **__):
+ self.assertEqual(kill_timeout, 1.0)
+ filter_fn('remote: something')
+ gclient_scm.gclient_utils.CheckCallAndFilter = subprocess_git_fetch_run
+ self.scm._Fetch(self.options)
+ self.checkstdout('remote: something\n')
+
+ def testGitFetchHungAndRetry(self):
+ class Process(object):
+ # First process will hang, second process will exit with 0 quickly.
+ cv = threading.Condition()
+ count = -1
+ killed = []
+ def __init__(self):
+ self.count += 1
+ self.stdout = self
+ self.data = list('retry' if self.count > 0 else 'hung')
+ self.data.reverse()
+ self.this_killed = False
+ def read(self, _):
+ if self.data:
+ return self.data.pop()
+ if self.count == 0:
+ # Simulate hung process.
+ with self.cv:
+ self.cv.wait(timeout=0)
+ return ''
+ def kill(self):
+ self.this_killed = True
+ self.killed.append(self.count)
+ with self.cv:
+ self.cv.notify()
+ def wait(self):
+ if self.this_killed:
+ return 1
+ return 0
+
+ gclient_scm.gclient_utils.subprocess2.Popen = lambda *_, **__: Process()
+ self.scm._Capture = lambda *_, **__: None
+ self.scm._Fetch(self.options)
+ self.checkstdout('hung\n')
+
+
if __name__ == '__main__':
level = logging.DEBUG if '-v' in sys.argv else logging.FATAL
logging.basicConfig(
« no previous file with comments | « gclient_utils.py ('k') | tests/gclient_utils_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698