@@ -6186,11 +6186,53 @@ def test_dual_stack_client_v6(self):
61866186 self .echo_server (sock )
61876187 self .echo_client (("::1" , port ), socket .AF_INET6 )
61886188
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+
61896230
61906231def test_main ():
61916232 tests = [GeneralModuleTests , BasicTCPTest , TCPCloserTest , TCPTimeoutTest ,
61926233 TestExceptions , BufferIOTest , BasicTCPTest2 , BasicUDPTest ,
6193- UDPTimeoutTest , CreateServerTest , CreateServerFunctionalTest ]
6234+ UDPTimeoutTest , CreateServerTest , CreateServerFunctionalTest ,
6235+ SendRecvFdsTests ]
61946236
61956237 tests .extend ([
61966238 NonBlockingTCPTests ,
@@ -6255,47 +6297,5 @@ def test_main():
62556297 support .threading_cleanup (* thread_info )
62566298
62576299
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-
63006300if __name__ == "__main__" :
63016301 test_main ()
0 commit comments