Monkey-patch in tests using mock.patch

Change-Id: Idf2205074e8f12bc0e515c860e9c1bddf59561d1
This commit is contained in:
Tim Burke 2021-01-14 14:11:41 -08:00
parent 267d432f86
commit 14a42d573a

View File

@ -1374,55 +1374,46 @@ class TestServer(unittest.TestCase):
def sleep(self, *args, **kwargs): def sleep(self, *args, **kwargs):
pass pass
with temptree([]) as t: with temptree([]) as t, open(os.path.join(t, 'output'), 'w+') as f, \
old_stdout = sys.stdout mock.patch.object(sys, 'stdout', f), \
old_wait = manager.WARNING_WAIT mock.patch.object(manager, 'WARNING_WAIT', 0.01), \
old_time = manager.time mock.patch.object(manager, 'time', MockTime()):
try: # Note that we actually capture the read stdout (for prints)
manager.WARNING_WAIT = 0.01 # test closing pipe in subprocess unblocks read
manager.time = MockTime() with MockProcess() as proc:
with open(os.path.join(t, 'output'), 'w+') as f: server.procs = [proc]
# actually capture the read stdout (for prints) status = server.wait()
sys.stdout = f self.assertEqual(status, 0)
# test closing pipe in subprocess unblocks read # wait should return before process exits
with MockProcess() as proc: self.assertTrue(proc.is_alive())
server.procs = [proc] self.assertFalse(proc.finished)
status = server.wait() self.assertTrue(proc.finished) # make sure it did finish
self.assertEqual(status, 0) # test output kwarg prints subprocess output
# wait should return before process exits with MockProcess() as proc:
self.assertTrue(proc.is_alive()) server.procs = [proc]
self.assertFalse(proc.finished) status = server.wait(output=True)
self.assertTrue(proc.finished) # make sure it did finish output = pop_stream(f)
# test output kwarg prints subprocess output self.assertIn('mock process started', output)
with MockProcess() as proc: self.assertIn('setup complete', output)
server.procs = [proc] # make sure we don't get prints after stdout was closed
status = server.wait(output=True) self.assertNotIn('mock process finished', output)
output = pop_stream(f) # test process which fails to start
self.assertIn('mock process started', output) with MockProcess(fail_to_start=True) as proc:
self.assertIn('setup complete', output) server.procs = [proc]
# make sure we don't get prints after stdout was closed status = server.wait()
self.assertNotIn('mock process finished', output) self.assertEqual(status, 1)
# test process which fails to start self.assertIn('failed', pop_stream(f))
with MockProcess(fail_to_start=True) as proc: # test multiple procs
server.procs = [proc] procs = [MockProcess(delay=.5) for i in range(3)]
status = server.wait() for proc in procs:
self.assertEqual(status, 1) proc.start()
self.assertIn('failed', pop_stream(f)) server.procs = procs
# test multiple procs status = server.wait()
procs = [MockProcess(delay=.5) for i in range(3)] self.assertEqual(status, 0)
for proc in procs: for proc in procs:
proc.start() self.assertTrue(proc.is_alive())
server.procs = procs for proc in procs:
status = server.wait() proc.join()
self.assertEqual(status, 0)
for proc in procs:
self.assertTrue(proc.is_alive())
for proc in procs:
proc.join()
finally:
sys.stdout = old_stdout
manager.WARNING_WAIT = old_wait
manager.time = old_time
def test_interact(self): def test_interact(self):
class MockProcess(object): class MockProcess(object):