diff options
author | Kevin Krakauer <kevinGC@users.noreply.github.com> | 2023-05-04 14:38:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-04 14:38:20 (GMT) |
commit | c9ecd3ee75b472bb0a7538e0288c5cfea146da83 (patch) | |
tree | f3baf59dbee4781b1fd13cc0eaf2c61f2f466898 /Lib/test/test_epoll.py | |
parent | 45398ad51220b63b8df08fb5551c6b736205daed (diff) | |
download | cpython-c9ecd3ee75b472bb0a7538e0288c5cfea146da83.zip cpython-c9ecd3ee75b472bb0a7538e0288c5cfea146da83.tar.gz cpython-c9ecd3ee75b472bb0a7538e0288c5cfea146da83.tar.bz2 |
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.
Diffstat (limited to 'Lib/test/test_epoll.py')
-rw-r--r-- | Lib/test/test_epoll.py | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index b623852..c94946a 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -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)] |