@@ -6186,11 +6186,53 @@ def test_dual_stack_client_v6(self):
6186
6186
self .echo_server (sock )
6187
6187
self .echo_client (("::1" , port ), socket .AF_INET6 )
6188
6188
6189
+ @requireAttrs (socket , "send_fds" )
6190
+ @requireAttrs (socket , "recv_fds" )
6191
+ @requireAttrs (socket , "AF_UNIX" )
6192
+ class SendRecvFdsTests (unittest .TestCase ):
6193
+ def testSendAndRecvFds (self ):
6194
+ def close_pipes (pipes ):
6195
+ for fd1 , fd2 in pipes :
6196
+ os .close (fd1 )
6197
+ os .close (fd2 )
6198
+
6199
+ def close_fds (fds ):
6200
+ for fd in fds :
6201
+ os .close (fd )
6202
+
6203
+ # send 10 file descriptors
6204
+ pipes = [os .pipe () for _ in range (10 )]
6205
+ self .addCleanup (close_pipes , pipes )
6206
+ fds = [rfd for rfd , wfd in pipes ]
6207
+
6208
+ # use a UNIX socket pair to exchange file descriptors locally
6209
+ sock1 , sock2 = socket .socketpair (socket .AF_UNIX , socket .SOCK_STREAM )
6210
+ with sock1 , sock2 :
6211
+ socket .send_fds (sock1 , [MSG ], fds )
6212
+ # request more data and file descriptors than expected
6213
+ msg , fds2 , flags , addr = socket .recv_fds (sock2 , len (MSG ) * 2 , len (fds ) * 2 )
6214
+ self .addCleanup (close_fds , fds2 )
6215
+
6216
+ self .assertEqual (msg , MSG )
6217
+ self .assertEqual (len (fds2 ), len (fds ))
6218
+ self .assertEqual (flags , 0 )
6219
+ # don't test addr
6220
+
6221
+ # test that file descriptors are connected
6222
+ for index , fds in enumerate (pipes ):
6223
+ rfd , wfd = fds
6224
+ os .write (wfd , str (index ).encode ())
6225
+
6226
+ for index , rfd in enumerate (fds2 ):
6227
+ data = os .read (rfd , 100 )
6228
+ self .assertEqual (data , str (index ).encode ())
6229
+
6189
6230
6190
6231
def test_main ():
6191
6232
tests = [GeneralModuleTests , BasicTCPTest , TCPCloserTest , TCPTimeoutTest ,
6192
6233
TestExceptions , BufferIOTest , BasicTCPTest2 , BasicUDPTest ,
6193
- UDPTimeoutTest , CreateServerTest , CreateServerFunctionalTest ]
6234
+ UDPTimeoutTest , CreateServerTest , CreateServerFunctionalTest ,
6235
+ SendRecvFdsTests ]
6194
6236
6195
6237
tests .extend ([
6196
6238
NonBlockingTCPTests ,
@@ -6255,47 +6297,5 @@ def test_main():
6255
6297
support .threading_cleanup (* thread_info )
6256
6298
6257
6299
6258
- @requireAttrs (socket , "send_fds" )
6259
- @requireAttrs (socket , "recv_fds" )
6260
- @requireAttrs (socket , "AF_UNIX" )
6261
- class SendRecvFdsTests (unittest .TestCase ):
6262
- def testSendAndRecvFds (self ):
6263
- def close_pipes (pipes ):
6264
- for fd1 , fd2 in pipes :
6265
- os .close (fd1 )
6266
- os .close (fd2 )
6267
-
6268
- def close_fds (fds ):
6269
- for fd in fds :
6270
- os .close (fd )
6271
-
6272
- # send 10 file descriptors
6273
- pipes = [os .pipe () for _ in range (10 )]
6274
- self .addCleanup (close_pipes , pipes )
6275
- fds = [fd2 for fd1 , fd2 in pipes ]
6276
-
6277
- # use a UNIX socket pair to exchange file descriptors locally
6278
- sock1 , sock2 = socket .socketpair (socket .AF_UNIX , socket .SOCK_STREAM )
6279
- with sock1 , sock2 :
6280
- socket .send_fds (sock1 , [MSG ], fds )
6281
- # request more data and file descriptors than expected
6282
- msg , fds2 , flags , addr = socket .recv_fds (sock2 , len (MSG ) * 2 , len (fds ) * 2 )
6283
- self .addCleanup (close_fds , fds2 )
6284
-
6285
- self .assertEqual (msg , MSG )
6286
- self .assertEqual (len (fds2 ), len (fds ))
6287
- self .assertEqual (flags , 0 )
6288
- # don't test addr
6289
-
6290
- # test that file descriptors are connected
6291
- for index , fds in enumerate (pipes ):
6292
- fd1 , fd2 = fds
6293
- os .write (fd1 , str (index ).encode ())
6294
-
6295
- for index , fd in enumerate (fds2 ):
6296
- data = os .read (fd , 100 )
6297
- self .assertEqual (data , str (index ).encode ())
6298
-
6299
-
6300
6300
if __name__ == "__main__" :
6301
6301
test_main ()
0 commit comments