@@ -125,12 +125,8 @@ async def main(srv):
125125class TestServer2 (unittest .IsolatedAsyncioTestCase ):
126126
127127 async def test_wait_closed_basic (self ):
128- async def serve (rd , wr ):
129- try :
130- await rd .read ()
131- finally :
132- wr .close ()
133- await wr .wait_closed ()
128+ async def serve (* args ):
129+ pass
134130
135131 srv = await asyncio .start_server (serve , socket_helper .HOSTv4 , 0 )
136132 self .addCleanup (srv .close )
@@ -141,8 +137,7 @@ async def serve(rd, wr):
141137 self .assertFalse (task1 .done ())
142138
143139 # active count != 0, not closed: should block
144- addr = srv .sockets [0 ].getsockname ()
145- (rd , wr ) = await asyncio .open_connection (addr [0 ], addr [1 ])
140+ srv ._attach ()
146141 task2 = asyncio .create_task (srv .wait_closed ())
147142 await asyncio .sleep (0 )
148143 self .assertFalse (task1 .done ())
@@ -157,8 +152,7 @@ async def serve(rd, wr):
157152 self .assertFalse (task2 .done ())
158153 self .assertFalse (task3 .done ())
159154
160- wr .close ()
161- await wr .wait_closed ()
155+ srv ._detach ()
162156 # active count == 0, closed: should unblock
163157 await task1
164158 await task2
@@ -167,96 +161,22 @@ async def serve(rd, wr):
167161
168162 async def test_wait_closed_race (self ):
169163 # Test a regression in 3.12.0, should be fixed in 3.12.1
170- async def serve (rd , wr ):
171- try :
172- await rd .read ()
173- finally :
174- wr .close ()
175- await wr .wait_closed ()
164+ async def serve (* args ):
165+ pass
176166
177167 srv = await asyncio .start_server (serve , socket_helper .HOSTv4 , 0 )
178168 self .addCleanup (srv .close )
179169
180170 task = asyncio .create_task (srv .wait_closed ())
181171 await asyncio .sleep (0 )
182172 self .assertFalse (task .done ())
183- addr = srv .sockets [0 ].getsockname ()
184- (rd , wr ) = await asyncio .open_connection (addr [0 ], addr [1 ])
173+ srv ._attach ()
185174 loop = asyncio .get_running_loop ()
186175 loop .call_soon (srv .close )
187- loop .call_soon (wr . close )
176+ loop .call_soon (srv . _detach )
188177 await srv .wait_closed ()
189178
190- async def test_close_clients (self ):
191- async def serve (rd , wr ):
192- try :
193- await rd .read ()
194- finally :
195- wr .close ()
196- await wr .wait_closed ()
197-
198- srv = await asyncio .start_server (serve , socket_helper .HOSTv4 , 0 )
199- self .addCleanup (srv .close )
200-
201- addr = srv .sockets [0 ].getsockname ()
202- (rd , wr ) = await asyncio .open_connection (addr [0 ], addr [1 ])
203- self .addCleanup (wr .close )
204-
205- task = asyncio .create_task (srv .wait_closed ())
206- await asyncio .sleep (0 )
207- self .assertFalse (task .done ())
208-
209- srv .close ()
210- srv .close_clients ()
211- await asyncio .sleep (0 )
212- await asyncio .sleep (0 )
213- self .assertTrue (task .done ())
214-
215- async def test_abort_clients (self ):
216- async def serve (rd , wr ):
217- nonlocal s_rd , s_wr
218- s_rd = rd
219- s_wr = wr
220- await wr .wait_closed ()
221-
222- s_rd = s_wr = None
223- srv = await asyncio .start_server (serve , socket_helper .HOSTv4 , 0 )
224- self .addCleanup (srv .close )
225-
226- addr = srv .sockets [0 ].getsockname ()
227- (c_rd , c_wr ) = await asyncio .open_connection (addr [0 ], addr [1 ], limit = 4096 )
228- self .addCleanup (c_wr .close )
229-
230- # Limit the socket buffers so we can reliably overfill them
231- s_sock = s_wr .get_extra_info ('socket' )
232- s_sock .setsockopt (socket .SOL_SOCKET , socket .SO_SNDBUF , 65536 )
233- c_sock = c_wr .get_extra_info ('socket' )
234- c_sock .setsockopt (socket .SOL_SOCKET , socket .SO_RCVBUF , 65536 )
235-
236- # Get the reader in to a paused state by sending more than twice
237- # the configured limit
238- s_wr .write (b'a' * 4096 )
239- s_wr .write (b'a' * 4096 )
240- s_wr .write (b'a' * 4096 )
241- while c_wr .transport .is_reading ():
242- await asyncio .sleep (0 )
243-
244- # Get the writer in a waiting state by sending data until the
245- # socket buffers are full on both server and client sockets and
246- # the kernel stops accepting more data
247- s_wr .write (b'a' * c_sock .getsockopt (socket .SOL_SOCKET , socket .SO_RCVBUF ))
248- s_wr .write (b'a' * s_sock .getsockopt (socket .SOL_SOCKET , socket .SO_SNDBUF ))
249- self .assertNotEqual (s_wr .transport .get_write_buffer_size (), 0 )
250-
251- task = asyncio .create_task (srv .wait_closed ())
252- await asyncio .sleep (0 )
253- self .assertFalse (task .done ())
254179
255- srv .close ()
256- srv .abort_clients ()
257- await asyncio .sleep (0 )
258- await asyncio .sleep (0 )
259- self .assertTrue (task .done ())
260180
261181
262182# Test the various corner cases of Unix server socket removal
0 commit comments