@@ -364,6 +364,31 @@ def test_accept_connection_multiple(self):
364364 self .loop .run_until_complete (asyncio .sleep (0 ))
365365 self .assertEqual (sock .accept .call_count , backlog )
366366
367+ def test_accept_connection_skip_connectionabortederror (self ):
368+ sock = mock .Mock ()
369+
370+ def mock_sock_accept ():
371+ # mock accept(2) returning -ECONNABORTED every-other
372+ # time that it's called. This applies most to OpenBSD
373+ # whose sockets generate this errno more reproducibly than
374+ # Linux and other OSs.
375+ if sock .accept .call_count % 2 == 0 :
376+ raise ConnectionAbortedError
377+ return (mock .Mock (), mock .Mock ())
378+
379+ sock .accept .side_effect = mock_sock_accept
380+ backlog = 100
381+ # test that _accept_connection's loop calls sock.accept
382+ # all 100 times, continuing past ConnectionAbortedError
383+ # instead of unnecessarily returning early
384+ mock_obj = mock .patch .object
385+ with mock_obj (self .loop , '_accept_connection2' ) as accept2_mock :
386+ self .loop ._accept_connection (
387+ mock .Mock (), sock , backlog = backlog )
388+ # as in test_accept_connection_multiple avoid task pending
389+ # warnings by using asyncio.sleep(0)
390+ self .loop .run_until_complete (asyncio .sleep (0 ))
391+ self .assertEqual (sock .accept .call_count , backlog )
367392
368393class SelectorTransportTests (test_utils .TestCase ):
369394
0 commit comments