25
25
from test .support import os_helper
26
26
from test .support import socket_helper
27
27
28
+
29
+ # gh-109592: Tolerate a difference of 20 ms when comparing timings
30
+ # (clock resolution)
31
+ CLOCK_RES = 0.020
32
+
33
+
28
34
@contextlib .contextmanager
29
35
def kill_on_error (proc ):
30
36
"""Context manager killing the subprocess if a Python exception is raised."""
@@ -75,6 +81,9 @@ def subprocess(self, *args, **kw):
75
81
cmd_args = (sys .executable , '-c' ) + args
76
82
return subprocess .Popen (cmd_args , ** kw )
77
83
84
+ def check_elapsed_time (self , elapsed ):
85
+ self .assertGreaterEqual (elapsed , self .sleep_time - CLOCK_RES )
86
+
78
87
79
88
@unittest .skipUnless (hasattr (signal , "setitimer" ), "requires setitimer()" )
80
89
class OSEINTRTest (EINTRBaseTest ):
@@ -373,7 +382,7 @@ def test_sleep(self):
373
382
time .sleep (self .sleep_time )
374
383
self .stop_alarm ()
375
384
dt = time .monotonic () - t0
376
- self .assertGreaterEqual (dt , self . sleep_time )
385
+ self .check_elapsed_time (dt )
377
386
378
387
379
388
@unittest .skipUnless (hasattr (signal , "setitimer" ), "requires setitimer()" )
@@ -435,7 +444,7 @@ def test_select(self):
435
444
select .select ([], [], [], self .sleep_time )
436
445
dt = time .monotonic () - t0
437
446
self .stop_alarm ()
438
- self .assertGreaterEqual (dt , self . sleep_time )
447
+ self .check_elapsed_time (dt )
439
448
440
449
@unittest .skipIf (sys .platform == "darwin" ,
441
450
"poll may fail on macOS; see issue #28087" )
@@ -447,7 +456,7 @@ def test_poll(self):
447
456
poller .poll (self .sleep_time * 1e3 )
448
457
dt = time .monotonic () - t0
449
458
self .stop_alarm ()
450
- self .assertGreaterEqual (dt , self . sleep_time )
459
+ self .check_elapsed_time (dt )
451
460
452
461
@unittest .skipUnless (hasattr (select , 'epoll' ), 'need select.epoll' )
453
462
def test_epoll (self ):
@@ -458,7 +467,7 @@ def test_epoll(self):
458
467
poller .poll (self .sleep_time )
459
468
dt = time .monotonic () - t0
460
469
self .stop_alarm ()
461
- self .assertGreaterEqual (dt , self . sleep_time )
470
+ self .check_elapsed_time (dt )
462
471
463
472
@unittest .skipUnless (hasattr (select , 'kqueue' ), 'need select.kqueue' )
464
473
def test_kqueue (self ):
@@ -469,7 +478,7 @@ def test_kqueue(self):
469
478
kqueue .control (None , 1 , self .sleep_time )
470
479
dt = time .monotonic () - t0
471
480
self .stop_alarm ()
472
- self .assertGreaterEqual (dt , self . sleep_time )
481
+ self .check_elapsed_time (dt )
473
482
474
483
@unittest .skipUnless (hasattr (select , 'devpoll' ), 'need select.devpoll' )
475
484
def test_devpoll (self ):
@@ -480,7 +489,7 @@ def test_devpoll(self):
480
489
poller .poll (self .sleep_time * 1e3 )
481
490
dt = time .monotonic () - t0
482
491
self .stop_alarm ()
483
- self .assertGreaterEqual (dt , self . sleep_time )
492
+ self .check_elapsed_time (dt )
484
493
485
494
486
495
class FNTLEINTRTest (EINTRBaseTest ):
@@ -512,8 +521,8 @@ def _lock(self, lock_func, lock_name):
512
521
# potential context switch delay
513
522
lock_func (f , fcntl .LOCK_EX )
514
523
dt = time .monotonic () - start_time
515
- self .assertGreaterEqual (dt , self .sleep_time )
516
524
self .stop_alarm ()
525
+ self .check_elapsed_time (dt )
517
526
proc .wait ()
518
527
519
528
# Issue 35633: See https://bugs.python.org/issue35633#msg333662
0 commit comments