gh-102795: Fix use of poll in test_epoll's test_control_and_wait (#102796)

This test can fail unnecessarily. In the test we wait for events on two
file descriptors. This is done in a single call to select.epoll's poll()
function. However, it is valid for the OS to return only one event via
poll() and the next via a subsequent call to poll(). This rarely
happens, but it can cause the test to fail despite properly functioning
polling.

Instead, we poll a second time when necessary.
This commit is contained in:
Kevin Krakauer 2023-05-04 07:38:20 -07:00 committed by GitHub
parent 45398ad512
commit c9ecd3ee75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 4 deletions

View File

@ -27,6 +27,7 @@ import select
import socket
import time
import unittest
from test import support
if not hasattr(select, "epoll"):
raise unittest.SkipTest("test works only on Linux 2.6")
@ -186,10 +187,16 @@ class TestEPoll(unittest.TestCase):
client.sendall(b"Hello!")
server.sendall(b"world!!!")
now = time.monotonic()
events = ep.poll(1.0, 4)
then = time.monotonic()
self.assertFalse(then - now > 0.01)
# we might receive events one at a time, necessitating multiple calls to
# poll
events = []
for _ in support.busy_retry(support.SHORT_TIMEOUT):
now = time.monotonic()
events += ep.poll(1.0, 4)
then = time.monotonic()
self.assertFalse(then - now > 0.01)
if len(events) >= 2:
break
expected = [(client.fileno(), select.EPOLLIN | select.EPOLLOUT),
(server.fileno(), select.EPOLLIN | select.EPOLLOUT)]

View File

@ -0,0 +1 @@
fix use of poll in test_epoll's test_control_and_wait