bpo-35513: Replace time.time() with time.monotonic() in tests (GH-11182)

Replace time.time() with time.monotonic() in tests to measure time
delta.

test_zipfile64: display progress every minute (60 secs) rather than
every 5 minutes (5*60 seconds).
This commit is contained in:
Victor Stinner 2018-12-17 09:36:36 +01:00 committed by GitHub
parent 4e80f5cbea
commit 2cf4c202ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 68 additions and 66 deletions

View File

@ -2231,14 +2231,14 @@ def _start_server(urlhandler, hostname, port):
Let the server do its thing. We just need to monitor its status. Let the server do its thing. We just need to monitor its status.
Use time.sleep so the loop doesn't hog the CPU. Use time.sleep so the loop doesn't hog the CPU.
>>> starttime = time.time() >>> starttime = time.monotonic()
>>> timeout = 1 #seconds >>> timeout = 1 #seconds
This is a short timeout for testing purposes. This is a short timeout for testing purposes.
>>> while serverthread.serving: >>> while serverthread.serving:
... time.sleep(.01) ... time.sleep(.01)
... if serverthread.serving and time.time() - starttime > timeout: ... if serverthread.serving and time.monotonic() - starttime > timeout:
... serverthread.stop() ... serverthread.stop()
... break ... break

View File

@ -155,11 +155,11 @@ class TimingWrapper(object):
self.elapsed = None self.elapsed = None
def __call__(self, *args, **kwds): def __call__(self, *args, **kwds):
t = time.time() t = time.monotonic()
try: try:
return self.func(*args, **kwds) return self.func(*args, **kwds)
finally: finally:
self.elapsed = time.time() - t self.elapsed = time.monotonic() - t
# #
# Base class for test cases # Base class for test cases
@ -1034,9 +1034,9 @@ class _TestQueue(BaseTestCase):
def test_timeout(self): def test_timeout(self):
q = multiprocessing.Queue() q = multiprocessing.Queue()
start = time.time() start = time.monotonic()
self.assertRaises(pyqueue.Empty, q.get, True, 0.200) self.assertRaises(pyqueue.Empty, q.get, True, 0.200)
delta = time.time() - start delta = time.monotonic() - start
# bpo-30317: Tolerate a delta of 100 ms because of the bad clock # bpo-30317: Tolerate a delta of 100 ms because of the bad clock
# resolution on Windows (usually 15.6 ms). x86 Windows7 3.x once # resolution on Windows (usually 15.6 ms). x86 Windows7 3.x once
# failed because the delta was only 135.8 ms. # failed because the delta was only 135.8 ms.
@ -1440,9 +1440,9 @@ class _TestCondition(BaseTestCase):
sem.release() sem.release()
with cond: with cond:
expected = 0.1 expected = 0.1
dt = time.time() dt = time.monotonic()
result = cond.wait_for(lambda : state.value==4, timeout=expected) result = cond.wait_for(lambda : state.value==4, timeout=expected)
dt = time.time() - dt dt = time.monotonic() - dt
# borrow logic in assertTimeout() from test/lock_tests.py # borrow logic in assertTimeout() from test/lock_tests.py
if not result and expected * 0.6 < dt < expected * 10.0: if not result and expected * 0.6 < dt < expected * 10.0:
success.value = True success.value = True
@ -2533,7 +2533,7 @@ class _TestPool(BaseTestCase):
# process would fill the result queue (after the result handler thread # process would fill the result queue (after the result handler thread
# terminated, hence not draining it anymore). # terminated, hence not draining it anymore).
t_start = time.time() t_start = time.monotonic()
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
with self.Pool(2) as p: with self.Pool(2) as p:
@ -2545,7 +2545,7 @@ class _TestPool(BaseTestCase):
p.join() p.join()
# check that we indeed waited for all jobs # check that we indeed waited for all jobs
self.assertGreater(time.time() - t_start, 0.9) self.assertGreater(time.monotonic() - t_start, 0.9)
def test_release_task_refs(self): def test_release_task_refs(self):
# Issue #29861: task arguments and results should not be kept # Issue #29861: task arguments and results should not be kept
@ -4108,9 +4108,9 @@ class TestWait(unittest.TestCase):
expected = 5 expected = 5
a, b = multiprocessing.Pipe() a, b = multiprocessing.Pipe()
start = time.time() start = time.monotonic()
res = wait([a, b], expected) res = wait([a, b], expected)
delta = time.time() - start delta = time.monotonic() - start
self.assertEqual(res, []) self.assertEqual(res, [])
self.assertLess(delta, expected * 2) self.assertLess(delta, expected * 2)
@ -4118,9 +4118,9 @@ class TestWait(unittest.TestCase):
b.send(None) b.send(None)
start = time.time() start = time.monotonic()
res = wait([a, b], 20) res = wait([a, b], 20)
delta = time.time() - start delta = time.monotonic() - start
self.assertEqual(res, [a]) self.assertEqual(res, [a])
self.assertLess(delta, 0.4) self.assertLess(delta, 0.4)
@ -4144,9 +4144,9 @@ class TestWait(unittest.TestCase):
self.assertIsInstance(p.sentinel, int) self.assertIsInstance(p.sentinel, int)
self.assertTrue(sem.acquire(timeout=20)) self.assertTrue(sem.acquire(timeout=20))
start = time.time() start = time.monotonic()
res = wait([a, p.sentinel, b], expected + 20) res = wait([a, p.sentinel, b], expected + 20)
delta = time.time() - start delta = time.monotonic() - start
self.assertEqual(res, [p.sentinel]) self.assertEqual(res, [p.sentinel])
self.assertLess(delta, expected + 2) self.assertLess(delta, expected + 2)
@ -4154,18 +4154,18 @@ class TestWait(unittest.TestCase):
a.send(None) a.send(None)
start = time.time() start = time.monotonic()
res = wait([a, p.sentinel, b], 20) res = wait([a, p.sentinel, b], 20)
delta = time.time() - start delta = time.monotonic() - start
self.assertEqual(sorted_(res), sorted_([p.sentinel, b])) self.assertEqual(sorted_(res), sorted_([p.sentinel, b]))
self.assertLess(delta, 0.4) self.assertLess(delta, 0.4)
b.send(None) b.send(None)
start = time.time() start = time.monotonic()
res = wait([a, p.sentinel, b], 20) res = wait([a, p.sentinel, b], 20)
delta = time.time() - start delta = time.monotonic() - start
self.assertEqual(sorted_(res), sorted_([a, p.sentinel, b])) self.assertEqual(sorted_(res), sorted_([a, p.sentinel, b]))
self.assertLess(delta, 0.4) self.assertLess(delta, 0.4)
@ -4176,9 +4176,9 @@ class TestWait(unittest.TestCase):
def test_neg_timeout(self): def test_neg_timeout(self):
from multiprocessing.connection import wait from multiprocessing.connection import wait
a, b = multiprocessing.Pipe() a, b = multiprocessing.Pipe()
t = time.time() t = time.monotonic()
res = wait([a], timeout=-1) res = wait([a], timeout=-1)
t = time.time() - t t = time.monotonic() - t
self.assertEqual(res, []) self.assertEqual(res, [])
self.assertLess(t, 1) self.assertLess(t, 1)
a.close() a.close()

View File

@ -74,7 +74,7 @@ class BaseTestCase(unittest.TestCase):
support.reap_children() support.reap_children()
def assertTimeout(self, actual, expected): def assertTimeout(self, actual, expected):
# The waiting and/or time.time() can be imprecise, which # The waiting and/or time.monotonic() can be imprecise, which
# is why comparing to the expected value would sometimes fail # is why comparing to the expected value would sometimes fail
# (especially under Windows). # (especially under Windows).
self.assertGreaterEqual(actual, expected * 0.6) self.assertGreaterEqual(actual, expected * 0.6)
@ -190,16 +190,16 @@ class BaseLockTests(BaseTestCase):
# TIMEOUT_MAX is ok # TIMEOUT_MAX is ok
lock.acquire(timeout=TIMEOUT_MAX) lock.acquire(timeout=TIMEOUT_MAX)
lock.release() lock.release()
t1 = time.time() t1 = time.monotonic()
self.assertTrue(lock.acquire(timeout=5)) self.assertTrue(lock.acquire(timeout=5))
t2 = time.time() t2 = time.monotonic()
# Just a sanity test that it didn't actually wait for the timeout. # Just a sanity test that it didn't actually wait for the timeout.
self.assertLess(t2 - t1, 5) self.assertLess(t2 - t1, 5)
results = [] results = []
def f(): def f():
t1 = time.time() t1 = time.monotonic()
results.append(lock.acquire(timeout=0.5)) results.append(lock.acquire(timeout=0.5))
t2 = time.time() t2 = time.monotonic()
results.append(t2 - t1) results.append(t2 - t1)
Bunch(f, 1).wait_for_finished() Bunch(f, 1).wait_for_finished()
self.assertFalse(results[0]) self.assertFalse(results[0])
@ -382,9 +382,9 @@ class EventTests(BaseTestCase):
N = 5 N = 5
def f(): def f():
results1.append(evt.wait(0.0)) results1.append(evt.wait(0.0))
t1 = time.time() t1 = time.monotonic()
r = evt.wait(0.5) r = evt.wait(0.5)
t2 = time.time() t2 = time.monotonic()
results2.append((r, t2 - t1)) results2.append((r, t2 - t1))
Bunch(f, N).wait_for_finished() Bunch(f, N).wait_for_finished()
self.assertEqual(results1, [False] * N) self.assertEqual(results1, [False] * N)
@ -545,9 +545,9 @@ class ConditionTests(BaseTestCase):
N = 5 N = 5
def f(): def f():
cond.acquire() cond.acquire()
t1 = time.time() t1 = time.monotonic()
result = cond.wait(0.5) result = cond.wait(0.5)
t2 = time.time() t2 = time.monotonic()
cond.release() cond.release()
results.append((t2 - t1, result)) results.append((t2 - t1, result))
Bunch(f, N).wait_for_finished() Bunch(f, N).wait_for_finished()
@ -584,9 +584,9 @@ class ConditionTests(BaseTestCase):
success = [] success = []
def f(): def f():
with cond: with cond:
dt = time.time() dt = time.monotonic()
result = cond.wait_for(lambda : state==4, timeout=0.1) result = cond.wait_for(lambda : state==4, timeout=0.1)
dt = time.time() - dt dt = time.monotonic() - dt
self.assertFalse(result) self.assertFalse(result)
self.assertTimeout(dt, 0.1) self.assertTimeout(dt, 0.1)
success.append(None) success.append(None)
@ -692,9 +692,9 @@ class BaseSemaphoreTests(BaseTestCase):
self.assertFalse(sem.acquire(timeout=0.005)) self.assertFalse(sem.acquire(timeout=0.005))
sem.release() sem.release()
self.assertTrue(sem.acquire(timeout=0.005)) self.assertTrue(sem.acquire(timeout=0.005))
t = time.time() t = time.monotonic()
self.assertFalse(sem.acquire(timeout=0.5)) self.assertFalse(sem.acquire(timeout=0.5))
dt = time.time() - t dt = time.monotonic() - t
self.assertTimeout(dt, 0.5) self.assertTimeout(dt, 0.5)
def test_default_value(self): def test_default_value(self):

View File

@ -2259,11 +2259,11 @@ def start_threads(threads, unlock=None):
try: try:
if unlock: if unlock:
unlock() unlock()
endtime = starttime = time.time() endtime = starttime = time.monotonic()
for timeout in range(1, 16): for timeout in range(1, 16):
endtime += 60 endtime += 60
for t in started: for t in started:
t.join(max(endtime - time.time(), 0.01)) t.join(max(endtime - time.monotonic(), 0.01))
started = [t for t in started if t.isAlive()] started = [t for t in started if t.isAlive()]
if not started: if not started:
break break

View File

@ -107,10 +107,10 @@ def run_briefly(loop):
def run_until(loop, pred, timeout=30): def run_until(loop, pred, timeout=30):
deadline = time.time() + timeout deadline = time.monotonic() + timeout
while not pred(): while not pred():
if timeout is not None: if timeout is not None:
timeout = deadline - time.time() timeout = deadline - time.monotonic()
if timeout <= 0: if timeout <= 0:
raise futures.TimeoutError() raise futures.TimeoutError()
loop.run_until_complete(tasks.sleep(0.001)) loop.run_until_complete(tasks.sleep(0.001))

View File

@ -70,8 +70,8 @@ def capture_server(evt, buf, serv):
pass pass
else: else:
n = 200 n = 200
start = time.time() start = time.monotonic()
while n > 0 and time.time() - start < 3.0: while n > 0 and time.monotonic() - start < 3.0:
r, w, e = select.select([conn], [], [], 0.1) r, w, e = select.select([conn], [], [], 0.1)
if r: if r:
n -= 1 n -= 1

View File

@ -70,14 +70,14 @@ class LockTests(unittest.TestCase):
to_unlock.release() to_unlock.release()
self.lock.acquire() self.lock.acquire()
start_time = int(time.time()) start_time = int(time.monotonic())
_thread.start_new_thread(delay_unlock,(self.lock, DELAY)) _thread.start_new_thread(delay_unlock,(self.lock, DELAY))
if support.verbose: if support.verbose:
print() print()
print("*** Waiting for thread to release the lock "\ print("*** Waiting for thread to release the lock "\
"(approx. %s sec.) ***" % DELAY) "(approx. %s sec.) ***" % DELAY)
self.lock.acquire() self.lock.acquire()
end_time = int(time.time()) end_time = int(time.monotonic())
if support.verbose: if support.verbose:
print("done") print("done")
self.assertGreaterEqual(end_time - start_time, DELAY, self.assertGreaterEqual(end_time - start_time, DELAY,

View File

@ -77,10 +77,10 @@ class OSSAudioDevTests(unittest.TestCase):
# set parameters based on .au file headers # set parameters based on .au file headers
dsp.setparameters(AFMT_S16_NE, nchannels, rate) dsp.setparameters(AFMT_S16_NE, nchannels, rate)
self.assertTrue(abs(expected_time - 3.51) < 1e-2, expected_time) self.assertTrue(abs(expected_time - 3.51) < 1e-2, expected_time)
t1 = time.time() t1 = time.monotonic()
dsp.write(data) dsp.write(data)
dsp.close() dsp.close()
t2 = time.time() t2 = time.monotonic()
elapsed_time = t2 - t1 elapsed_time = t2 - t1
percent_diff = (abs(elapsed_time - expected_time) / expected_time) * 100 percent_diff = (abs(elapsed_time - expected_time) / expected_time) * 100

View File

@ -1131,12 +1131,12 @@ class PydocServerTest(unittest.TestCase):
serverthread = pydoc._start_server(my_url_handler, hostname='0.0.0.0', port=0) serverthread = pydoc._start_server(my_url_handler, hostname='0.0.0.0', port=0)
self.assertIn('0.0.0.0', serverthread.docserver.address) self.assertIn('0.0.0.0', serverthread.docserver.address)
starttime = time.time() starttime = time.monotonic()
timeout = 1 #seconds timeout = 1 #seconds
while serverthread.serving: while serverthread.serving:
time.sleep(.01) time.sleep(.01)
if serverthread.serving and time.time() - starttime > timeout: if serverthread.serving and time.monotonic() - starttime > timeout:
serverthread.stop() serverthread.stop()
break break

View File

@ -1163,18 +1163,18 @@ class StressTest(unittest.TestCase):
self.setsig(signal.SIGALRM, second_handler) # for ITIMER_REAL self.setsig(signal.SIGALRM, second_handler) # for ITIMER_REAL
expected_sigs = 0 expected_sigs = 0
deadline = time.time() + 15.0 deadline = time.monotonic() + 15.0
while expected_sigs < N: while expected_sigs < N:
os.kill(os.getpid(), signal.SIGPROF) os.kill(os.getpid(), signal.SIGPROF)
expected_sigs += 1 expected_sigs += 1
# Wait for handlers to run to avoid signal coalescing # Wait for handlers to run to avoid signal coalescing
while len(sigs) < expected_sigs and time.time() < deadline: while len(sigs) < expected_sigs and time.monotonic() < deadline:
time.sleep(1e-5) time.sleep(1e-5)
os.kill(os.getpid(), signal.SIGUSR1) os.kill(os.getpid(), signal.SIGUSR1)
expected_sigs += 1 expected_sigs += 1
while len(sigs) < expected_sigs and time.time() < deadline: while len(sigs) < expected_sigs and time.monotonic() < deadline:
time.sleep(1e-5) time.sleep(1e-5)
# All ITIMER_REAL signals should have been delivered to the # All ITIMER_REAL signals should have been delivered to the
@ -1197,7 +1197,7 @@ class StressTest(unittest.TestCase):
self.setsig(signal.SIGALRM, handler) # for ITIMER_REAL self.setsig(signal.SIGALRM, handler) # for ITIMER_REAL
expected_sigs = 0 expected_sigs = 0
deadline = time.time() + 15.0 deadline = time.monotonic() + 15.0
while expected_sigs < N: while expected_sigs < N:
# Hopefully the SIGALRM will be received somewhere during # Hopefully the SIGALRM will be received somewhere during
@ -1207,7 +1207,7 @@ class StressTest(unittest.TestCase):
expected_sigs += 2 expected_sigs += 2
# Wait for handlers to run to avoid signal coalescing # Wait for handlers to run to avoid signal coalescing
while len(sigs) < expected_sigs and time.time() < deadline: while len(sigs) < expected_sigs and time.monotonic() < deadline:
time.sleep(1e-5) time.sleep(1e-5)
# All ITIMER_REAL signals should have been delivered to the # All ITIMER_REAL signals should have been delivered to the

View File

@ -95,9 +95,9 @@ class ThreadSignals(unittest.TestCase):
lock = thread.allocate_lock() lock = thread.allocate_lock()
lock.acquire() lock.acquire()
signal.alarm(1) signal.alarm(1)
t1 = time.time() t1 = time.monotonic()
self.assertRaises(KeyboardInterrupt, lock.acquire, timeout=5) self.assertRaises(KeyboardInterrupt, lock.acquire, timeout=5)
dt = time.time() - t1 dt = time.monotonic() - t1
# Checking that KeyboardInterrupt was raised is not sufficient. # Checking that KeyboardInterrupt was raised is not sufficient.
# We want to assert that lock.acquire() was interrupted because # We want to assert that lock.acquire() was interrupted because
# of the signal, not that the signal handler was called immediately # of the signal, not that the signal handler was called immediately
@ -136,9 +136,9 @@ class ThreadSignals(unittest.TestCase):
rlock.release() rlock.release()
time.sleep(0.01) time.sleep(0.01)
signal.alarm(1) signal.alarm(1)
t1 = time.time() t1 = time.monotonic()
self.assertRaises(KeyboardInterrupt, rlock.acquire, timeout=5) self.assertRaises(KeyboardInterrupt, rlock.acquire, timeout=5)
dt = time.time() - t1 dt = time.monotonic() - t1
# See rationale above in test_lock_acquire_interruption # See rationale above in test_lock_acquire_interruption
self.assertLess(dt, 3.0) self.assertLess(dt, 3.0)
finally: finally:
@ -203,9 +203,9 @@ class ThreadSignals(unittest.TestCase):
old_handler = signal.signal(signal.SIGUSR1, my_handler) old_handler = signal.signal(signal.SIGUSR1, my_handler)
try: try:
def timed_acquire(): def timed_acquire():
self.start = time.time() self.start = time.monotonic()
lock.acquire(timeout=0.5) lock.acquire(timeout=0.5)
self.end = time.time() self.end = time.monotonic()
def send_signals(): def send_signals():
for _ in range(40): for _ in range(40):
time.sleep(0.02) time.sleep(0.02)

View File

@ -127,11 +127,11 @@ class TimeoutTestCase(unittest.TestCase):
self.sock.settimeout(timeout) self.sock.settimeout(timeout)
method = getattr(self.sock, method) method = getattr(self.sock, method)
for i in range(count): for i in range(count):
t1 = time.time() t1 = time.monotonic()
try: try:
method(*args) method(*args)
except socket.timeout as e: except socket.timeout as e:
delta = time.time() - t1 delta = time.monotonic() - t1
break break
else: else:
self.fail('socket.timeout was not raised') self.fail('socket.timeout was not raised')

View File

@ -22,7 +22,7 @@ from test.support import TESTFN, requires_zlib
TESTFN2 = TESTFN + "2" TESTFN2 = TESTFN + "2"
# How much time in seconds can pass before we print a 'Still working' message. # How much time in seconds can pass before we print a 'Still working' message.
_PRINT_WORKING_MSG_INTERVAL = 5 * 60 _PRINT_WORKING_MSG_INTERVAL = 60
class TestsWithSourceFile(unittest.TestCase): class TestsWithSourceFile(unittest.TestCase):
def setUp(self): def setUp(self):
@ -43,12 +43,12 @@ class TestsWithSourceFile(unittest.TestCase):
# raw data to store. # raw data to store.
filecount = 6*1024**3 // len(self.data) filecount = 6*1024**3 // len(self.data)
next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL
for num in range(filecount): for num in range(filecount):
zipfp.writestr("testfn%d" % num, self.data) zipfp.writestr("testfn%d" % num, self.data)
# Print still working message since this test can be really slow # Print still working message since this test can be really slow
if next_time <= time.time(): if next_time <= time.monotonic():
next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL
print(( print((
' zipTest still writing %d of %d, be patient...' % ' zipTest still writing %d of %d, be patient...' %
(num, filecount)), file=sys.__stdout__) (num, filecount)), file=sys.__stdout__)
@ -60,8 +60,8 @@ class TestsWithSourceFile(unittest.TestCase):
for num in range(filecount): for num in range(filecount):
self.assertEqual(zipfp.read("testfn%d" % num), self.data) self.assertEqual(zipfp.read("testfn%d" % num), self.data)
# Print still working message since this test can be really slow # Print still working message since this test can be really slow
if next_time <= time.time(): if next_time <= time.monotonic():
next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL
print(( print((
' zipTest still reading %d of %d, be patient...' % ' zipTest still reading %d of %d, be patient...' %
(num, filecount)), file=sys.__stdout__) (num, filecount)), file=sys.__stdout__)

View File

@ -0,0 +1,2 @@
Replace :func:`time.time` with :func:`time.monotonic` in tests to measure
time delta.