from test.support import os_helper
from test.support import socket_helper
+
+# gh-109592: Tolerate a difference of 20 ms when comparing timings
+# (clock resolution)
+CLOCK_RES = 0.020
+
+
@contextlib.contextmanager
def kill_on_error(proc):
"""Context manager killing the subprocess if a Python exception is raised."""
cmd_args = (sys.executable, '-c') + args
return subprocess.Popen(cmd_args, **kw)
+ def check_elapsed_time(self, elapsed):
+ self.assertGreaterEqual(elapsed, self.sleep_time - CLOCK_RES)
+
@unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()")
class OSEINTRTest(EINTRBaseTest):
time.sleep(self.sleep_time)
self.stop_alarm()
dt = time.monotonic() - t0
- self.assertGreaterEqual(dt, self.sleep_time)
+ self.check_elapsed_time(dt)
@unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()")
select.select([], [], [], self.sleep_time)
dt = time.monotonic() - t0
self.stop_alarm()
- self.assertGreaterEqual(dt, self.sleep_time)
+ self.check_elapsed_time(dt)
@unittest.skipIf(sys.platform == "darwin",
"poll may fail on macOS; see issue #28087")
poller.poll(self.sleep_time * 1e3)
dt = time.monotonic() - t0
self.stop_alarm()
- self.assertGreaterEqual(dt, self.sleep_time)
+ self.check_elapsed_time(dt)
@unittest.skipUnless(hasattr(select, 'epoll'), 'need select.epoll')
def test_epoll(self):
poller.poll(self.sleep_time)
dt = time.monotonic() - t0
self.stop_alarm()
- self.assertGreaterEqual(dt, self.sleep_time)
+ self.check_elapsed_time(dt)
@unittest.skipUnless(hasattr(select, 'kqueue'), 'need select.kqueue')
def test_kqueue(self):
kqueue.control(None, 1, self.sleep_time)
dt = time.monotonic() - t0
self.stop_alarm()
- self.assertGreaterEqual(dt, self.sleep_time)
+ self.check_elapsed_time(dt)
@unittest.skipUnless(hasattr(select, 'devpoll'), 'need select.devpoll')
def test_devpoll(self):
poller.poll(self.sleep_time * 1e3)
dt = time.monotonic() - t0
self.stop_alarm()
- self.assertGreaterEqual(dt, self.sleep_time)
+ self.check_elapsed_time(dt)
class FNTLEINTRTest(EINTRBaseTest):
# potential context switch delay
lock_func(f, fcntl.LOCK_EX)
dt = time.monotonic() - start_time
- self.assertGreaterEqual(dt, self.sleep_time)
self.stop_alarm()
+ self.check_elapsed_time(dt)
proc.wait()
# Issue 35633: See https://bugs.python.org/issue35633#msg333662