@@ -671,6 +671,47 @@ def test_create_connection_local_addr(self):
671
671
self .assertEqual (port , expected )
672
672
tr .close ()
673
673
674
+ def test_create_connection_local_addr_skip_different_family (self ):
675
+ # See https://github.com/python/cpython/issues/86508
676
+ port1 = socket_helper .find_unused_port ()
677
+ port2 = socket_helper .find_unused_port ()
678
+ getaddrinfo_orig = self .loop .getaddrinfo
679
+
680
+ async def getaddrinfo (host , port , * args , ** kwargs ):
681
+ if port == port2 :
682
+ return [(socket .AF_INET6 , socket .SOCK_STREAM , 0 , '' , ('::1' , 0 , 0 , 0 )),
683
+ (socket .AF_INET , socket .SOCK_STREAM , 0 , '' , ('127.0.0.1' , 0 ))]
684
+ return await getaddrinfo_orig (host , port , * args , ** kwargs )
685
+
686
+ self .loop .getaddrinfo = getaddrinfo
687
+
688
+ f = self .loop .create_connection (
689
+ lambda : MyProto (loop = self .loop ),
690
+ 'localhost' , port1 , local_addr = ('localhost' , port2 ))
691
+
692
+ with self .assertRaises (OSError ):
693
+ self .loop .run_until_complete (f )
694
+
695
+ def test_create_connection_local_addr_nomatch_family (self ):
696
+ # See https://github.com/python/cpython/issues/86508
697
+ port1 = socket_helper .find_unused_port ()
698
+ port2 = socket_helper .find_unused_port ()
699
+ getaddrinfo_orig = self .loop .getaddrinfo
700
+
701
+ async def getaddrinfo (host , port , * args , ** kwargs ):
702
+ if port == port2 :
703
+ return [(socket .AF_INET6 , socket .SOCK_STREAM , 0 , '' , ('::1' , 0 , 0 , 0 ))]
704
+ return await getaddrinfo_orig (host , port , * args , ** kwargs )
705
+
706
+ self .loop .getaddrinfo = getaddrinfo
707
+
708
+ f = self .loop .create_connection (
709
+ lambda : MyProto (loop = self .loop ),
710
+ 'localhost' , port1 , local_addr = ('localhost' , port2 ))
711
+
712
+ with self .assertRaises (OSError ):
713
+ self .loop .run_until_complete (f )
714
+
674
715
def test_create_connection_local_addr_in_use (self ):
675
716
with test_utils .run_test_server () as httpd :
676
717
f = self .loop .create_connection (
0 commit comments