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()" )
@@ -437,7 +446,7 @@ def test_select(self):
437
446
select .select ([], [], [], self .sleep_time )
438
447
dt = time .monotonic () - t0
439
448
self .stop_alarm ()
440
- self .assertGreaterEqual (dt , self . sleep_time )
449
+ self .check_elapsed_time (dt )
441
450
442
451
@unittest .skipIf (sys .platform == "darwin" ,
443
452
"poll may fail on macOS; see issue #28087" )
@@ -449,7 +458,7 @@ def test_poll(self):
449
458
poller .poll (self .sleep_time * 1e3 )
450
459
dt = time .monotonic () - t0
451
460
self .stop_alarm ()
452
- self .assertGreaterEqual (dt , self . sleep_time )
461
+ self .check_elapsed_time (dt )
453
462
454
463
@unittest .skipUnless (hasattr (select , 'epoll' ), 'need select.epoll' )
455
464
def test_epoll (self ):
@@ -460,7 +469,7 @@ def test_epoll(self):
460
469
poller .poll (self .sleep_time )
461
470
dt = time .monotonic () - t0
462
471
self .stop_alarm ()
463
- self .assertGreaterEqual (dt , self . sleep_time )
472
+ self .check_elapsed_time (dt )
464
473
465
474
@unittest .skipUnless (hasattr (select , 'kqueue' ), 'need select.kqueue' )
466
475
def test_kqueue (self ):
@@ -471,7 +480,7 @@ def test_kqueue(self):
471
480
kqueue .control (None , 1 , self .sleep_time )
472
481
dt = time .monotonic () - t0
473
482
self .stop_alarm ()
474
- self .assertGreaterEqual (dt , self . sleep_time )
483
+ self .check_elapsed_time (dt )
475
484
476
485
@unittest .skipUnless (hasattr (select , 'devpoll' ), 'need select.devpoll' )
477
486
def test_devpoll (self ):
@@ -482,7 +491,7 @@ def test_devpoll(self):
482
491
poller .poll (self .sleep_time * 1e3 )
483
492
dt = time .monotonic () - t0
484
493
self .stop_alarm ()
485
- self .assertGreaterEqual (dt , self . sleep_time )
494
+ self .check_elapsed_time (dt )
486
495
487
496
488
497
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