summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_epoll.py
diff options
context:
space:
mode:
authorKevin Krakauer <kevinGC@users.noreply.github.com>2023-05-04 14:38:20 (GMT)
committerGitHub <noreply@github.com>2023-05-04 14:38:20 (GMT)
commitc9ecd3ee75b472bb0a7538e0288c5cfea146da83 (patch)
treef3baf59dbee4781b1fd13cc0eaf2c61f2f466898 /Lib/test/test_epoll.py
parent45398ad51220b63b8df08fb5551c6b736205daed (diff)
downloadcpython-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.py15
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)]