@@ -125,12 +125,8 @@ async def main(srv):
125
125
class TestServer2 (unittest .IsolatedAsyncioTestCase ):
126
126
127
127
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
134
130
135
131
srv = await asyncio .start_server (serve , socket_helper .HOSTv4 , 0 )
136
132
self .addCleanup (srv .close )
@@ -141,8 +137,7 @@ async def serve(rd, wr):
141
137
self .assertFalse (task1 .done ())
142
138
143
139
# 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 ()
146
141
task2 = asyncio .create_task (srv .wait_closed ())
147
142
await asyncio .sleep (0 )
148
143
self .assertFalse (task1 .done ())
@@ -157,8 +152,7 @@ async def serve(rd, wr):
157
152
self .assertFalse (task2 .done ())
158
153
self .assertFalse (task3 .done ())
159
154
160
- wr .close ()
161
- await wr .wait_closed ()
155
+ srv ._detach ()
162
156
# active count == 0, closed: should unblock
163
157
await task1
164
158
await task2
@@ -167,96 +161,22 @@ async def serve(rd, wr):
167
161
168
162
async def test_wait_closed_race (self ):
169
163
# 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
176
166
177
167
srv = await asyncio .start_server (serve , socket_helper .HOSTv4 , 0 )
178
168
self .addCleanup (srv .close )
179
169
180
170
task = asyncio .create_task (srv .wait_closed ())
181
171
await asyncio .sleep (0 )
182
172
self .assertFalse (task .done ())
183
- addr = srv .sockets [0 ].getsockname ()
184
- (rd , wr ) = await asyncio .open_connection (addr [0 ], addr [1 ])
173
+ srv ._attach ()
185
174
loop = asyncio .get_running_loop ()
186
175
loop .call_soon (srv .close )
187
- loop .call_soon (wr . close )
176
+ loop .call_soon (srv . _detach )
188
177
await srv .wait_closed ()
189
178
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 ())
254
179
255
- srv .close ()
256
- srv .abort_clients ()
257
- await asyncio .sleep (0 )
258
- await asyncio .sleep (0 )
259
- self .assertTrue (task .done ())
260
180
261
181
262
182
# Test the various corner cases of Unix server socket removal
0 commit comments