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