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

Unified Diff: tests/gclient_utils_test.py

Issue 2300433003: gclient_utils: provide subproces42 based CheckCallAndFilter. (Closed)
Patch Set: 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') | 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 64a98362559761d04c6b2c5e1881be817cdac581..828bea4a191a3eb6865a6531e9626ee43de25dc0 100755
--- a/tests/gclient_utils_test.py
+++ b/tests/gclient_utils_test.py
@@ -7,6 +7,7 @@ import os
import StringIO
import sys
import threading
+import time
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@@ -15,6 +16,7 @@ from testing_support import trial_dir
import gclient_utils
import subprocess2
+import subprocess42
class GclientUtilBase(SuperMoxTestBase):
@@ -23,6 +25,7 @@ class GclientUtilBase(SuperMoxTestBase):
gclient_utils.sys.stdout.flush = lambda: None
self.mox.StubOutWithMock(subprocess2, 'Popen')
self.mox.StubOutWithMock(subprocess2, 'communicate')
+ self.mox.StubOutWithMock(subprocess42, 'Popen')
class CheckCallAndFilterTestCase(GclientUtilBase):
@@ -139,6 +142,93 @@ class CheckCallAndFilterTestCase(GclientUtilBase):
self.assertEquals(order, ['unblock'])
+class CheckCallAndFilter42TestCase(GclientUtilBase):
+ class ProcessIdMock(object):
+ def __init__(self, test_string, block_for=None):
+ self._test_string = test_string
+ self._block_for = block_for
+ self._killed = threading.Event()
+ self._started = time.time()
+ self.pid = 9284
+ # pylint: disable=R0201
+ def wait(self):
+ return 0
+ def kill(self):
+ self._killed.set()
+ def duration(self):
+ return time.time() - self._started
+ def yield_any(self, maxsize, timeout):
+ for c in self._test_string:
+ yield 'stdout', c
+ if self._block_for:
+ while not self._killed.is_set():
+ left = self._started + self._block_for - time.time()
+ if left < 0:
+ break
+ # ignore timeout argument for faster test.
+ self._killed.wait(min(left, 0.01))
+ yield None, None
+
+ def _inner(self, args, test_string, block_for=None, kill_timeout=None):
+ cwd = 'bleh'
+ gclient_utils.sys.stdout.write(
+ '\n________ running \'boo foo bar\' in \'bleh\'\n')
+ for i in test_string:
+ gclient_utils.sys.stdout.write(i)
+ # pylint: disable=E1101
+ subprocess42.Popen(
+ args,
+ cwd=cwd,
+ stdout=subprocess42.PIPE,
+ stderr=subprocess42.STDOUT,
+ bufsize=0).AndReturn(self.ProcessIdMock(test_string, block_for))
+
+ os.getcwd()
+ self.mox.ReplayAll()
+ compiled_pattern = gclient_utils.re.compile(r'a(.*)b')
+ line_list = []
+ capture_list = []
+ def FilterLines(line):
+ line_list.append(line)
+ assert isinstance(line, str), type(line)
+ match = compiled_pattern.search(line)
+ if match:
+ capture_list.append(match.group(1))
+ gclient_utils.CheckCallAndFilterAndHeader(
+ args, cwd=cwd, always=True, filter_fn=FilterLines, use_v42=True,
+ kill_timeout=kill_timeout)
+ self.assertEquals(line_list, ['ahah', 'accb', 'allo', 'addb'])
+ self.assertEquals(capture_list, ['cc', 'dd'])
+
+ def testCheckCallAndFilter(self):
+ args = ['boo', 'foo', 'bar']
+ test_string = 'ahah\naccb\nallo\naddb\n'
+ self._inner(args, test_string)
+ self.checkstdout('\n________ running \'boo foo bar\' in \'bleh\'\n'
+ 'ahah\naccb\nallo\naddb\n\n'
+ '________ running \'boo foo bar\' in \'bleh\'\nahah\naccb\nallo\naddb'
+ '\n')
+
+ def testNoLF(self):
+ # Exactly as testCheckCallAndFilterAndHeader without trailing \n
+ args = ['boo', 'foo', 'bar']
+ test_string = 'ahah\naccb\nallo\naddb'
+ self._inner(args, test_string)
+ self.checkstdout('\n________ running \'boo foo bar\' in \'bleh\'\n'
+ 'ahah\naccb\nallo\naddb\n'
+ '________ running \'boo foo bar\' in \'bleh\'\nahah\naccb\nallo\naddb')
+
+ def testKilled(self):
+ args = ['boo', 'foo', 'bar']
+ test_string = 'ahah\naccb\nallo\naddb'
+ self._inner(args, test_string, block_for=3, kill_timeout=1)
+ self.checkstdout('\n________ running \'boo foo bar\' in \'bleh\'\n'
+ 'ahah\naccb\nallo\naddb\n'
+ '________ running \'boo foo bar\' in \'bleh\'\nahah\naccb\nallo\naddb'
+ 'ERROR: killing process \'"boo" "foo" "bar"\' in bleh running for 1s '
+ '(timeout: 1s)\n')
+
+
class SplitUrlRevisionTestCase(GclientUtilBase):
def testSSHUrl(self):
url = "ssh://test@example.com/test.git"
« no previous file with comments | « gclient_utils.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698