mirror of
https://github.com/python/cpython.git
synced 2025-08-10 03:49:18 +00:00
[3.12] gh-110038: KqueueSelector must count all read/write events (GH-110039) (#110043)
[3.12] gh-110038: KqueueSelector must count all read/write events (GH-110039).
(cherry picked from commit b14f0ab51c
)
This commit is contained in:
parent
4bdcb99469
commit
c794103417
3 changed files with 38 additions and 1 deletions
|
@ -279,6 +279,35 @@ class BaseSelectorTestCase:
|
|||
|
||||
self.assertEqual([(wr_key, selectors.EVENT_WRITE)], result)
|
||||
|
||||
def test_select_read_write(self):
|
||||
# gh-110038: when a file descriptor is registered for both read and
|
||||
# write, the two events must be seen on a single call to select().
|
||||
s = self.SELECTOR()
|
||||
self.addCleanup(s.close)
|
||||
|
||||
sock1, sock2 = self.make_socketpair()
|
||||
sock2.send(b"foo")
|
||||
my_key = s.register(sock1, selectors.EVENT_READ | selectors.EVENT_WRITE)
|
||||
|
||||
seen_read, seen_write = False, False
|
||||
result = s.select()
|
||||
# We get the read and write either in the same result entry or in two
|
||||
# distinct entries with the same key.
|
||||
self.assertLessEqual(len(result), 2)
|
||||
for key, events in result:
|
||||
self.assertTrue(isinstance(key, selectors.SelectorKey))
|
||||
self.assertEqual(key, my_key)
|
||||
self.assertFalse(events & ~(selectors.EVENT_READ |
|
||||
selectors.EVENT_WRITE))
|
||||
if events & selectors.EVENT_READ:
|
||||
self.assertFalse(seen_read)
|
||||
seen_read = True
|
||||
if events & selectors.EVENT_WRITE:
|
||||
self.assertFalse(seen_write)
|
||||
seen_write = True
|
||||
self.assertTrue(seen_read)
|
||||
self.assertTrue(seen_write)
|
||||
|
||||
def test_context_manager(self):
|
||||
s = self.SELECTOR()
|
||||
self.addCleanup(s.close)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue