2525from test .support import os_helper
2626from test .support import socket_helper
2727
28+
29+ # gh-109592: Tolerate a difference of 20 ms when comparing timings
30+ # (clock resolution)
31+ CLOCK_RES = 0.020
32+
33+
2834@contextlib .contextmanager
2935def kill_on_error (proc ):
3036 """Context manager killing the subprocess if a Python exception is raised."""
@@ -75,6 +81,9 @@ def subprocess(self, *args, **kw):
7581 cmd_args = (sys .executable , '-c' ) + args
7682 return subprocess .Popen (cmd_args , ** kw )
7783
84+ def check_elapsed_time (self , elapsed ):
85+ self .assertGreaterEqual (elapsed , self .sleep_time - CLOCK_RES )
86+
7887
7988@unittest .skipUnless (hasattr (signal , "setitimer" ), "requires setitimer()" )
8089class OSEINTRTest (EINTRBaseTest ):
@@ -373,7 +382,7 @@ def test_sleep(self):
373382 time .sleep (self .sleep_time )
374383 self .stop_alarm ()
375384 dt = time .monotonic () - t0
376- self .assertGreaterEqual (dt , self . sleep_time )
385+ self .check_elapsed_time (dt )
377386
378387
379388@unittest .skipUnless (hasattr (signal , "setitimer" ), "requires setitimer()" )
@@ -435,7 +444,7 @@ def test_select(self):
435444 select .select ([], [], [], self .sleep_time )
436445 dt = time .monotonic () - t0
437446 self .stop_alarm ()
438- self .assertGreaterEqual (dt , self . sleep_time )
447+ self .check_elapsed_time (dt )
439448
440449 @unittest .skipIf (sys .platform == "darwin" ,
441450 "poll may fail on macOS; see issue #28087" )
@@ -447,7 +456,7 @@ def test_poll(self):
447456 poller .poll (self .sleep_time * 1e3 )
448457 dt = time .monotonic () - t0
449458 self .stop_alarm ()
450- self .assertGreaterEqual (dt , self . sleep_time )
459+ self .check_elapsed_time (dt )
451460
452461 @unittest .skipUnless (hasattr (select , 'epoll' ), 'need select.epoll' )
453462 def test_epoll (self ):
@@ -458,7 +467,7 @@ def test_epoll(self):
458467 poller .poll (self .sleep_time )
459468 dt = time .monotonic () - t0
460469 self .stop_alarm ()
461- self .assertGreaterEqual (dt , self . sleep_time )
470+ self .check_elapsed_time (dt )
462471
463472 @unittest .skipUnless (hasattr (select , 'kqueue' ), 'need select.kqueue' )
464473 def test_kqueue (self ):
@@ -469,7 +478,7 @@ def test_kqueue(self):
469478 kqueue .control (None , 1 , self .sleep_time )
470479 dt = time .monotonic () - t0
471480 self .stop_alarm ()
472- self .assertGreaterEqual (dt , self . sleep_time )
481+ self .check_elapsed_time (dt )
473482
474483 @unittest .skipUnless (hasattr (select , 'devpoll' ), 'need select.devpoll' )
475484 def test_devpoll (self ):
@@ -480,7 +489,7 @@ def test_devpoll(self):
480489 poller .poll (self .sleep_time * 1e3 )
481490 dt = time .monotonic () - t0
482491 self .stop_alarm ()
483- self .assertGreaterEqual (dt , self . sleep_time )
492+ self .check_elapsed_time (dt )
484493
485494
486495class FNTLEINTRTest (EINTRBaseTest ):
@@ -512,8 +521,8 @@ def _lock(self, lock_func, lock_name):
512521 # potential context switch delay
513522 lock_func (f , fcntl .LOCK_EX )
514523 dt = time .monotonic () - start_time
515- self .assertGreaterEqual (dt , self .sleep_time )
516524 self .stop_alarm ()
525+ self .check_elapsed_time (dt )
517526 proc .wait ()
518527
519528 # Issue 35633: See https://bugs.python.org/issue35633#msg333662
0 commit comments