@@ -1194,6 +1194,47 @@ def getaddrinfo(*args, **kw):
11941194 self .loop .run_until_complete (coro )
11951195 self .assertTrue (sock .close .called )
11961196
1197+ def test_create_connection_sock_transport_error_closes_sock (self ):
1198+ # gh-153133: a user-provided socket is closed if the transport is
1199+ # never created.
1200+ sock = mock .Mock ()
1201+ sock .type = socket .SOCK_STREAM
1202+
1203+ def factory ():
1204+ raise ZeroDivisionError
1205+
1206+ coro = self .loop .create_connection (factory , sock = sock )
1207+ with self .assertRaises (ZeroDivisionError ):
1208+ self .loop .run_until_complete (coro )
1209+ self .assertTrue (sock .close .called )
1210+
1211+ @patch_socket
1212+ def test_create_connection_transport_error_closes_sock (self , m_socket ):
1213+ # gh-153133: an internally created socket is closed if the transport
1214+ # is never created.
1215+ sock = mock .Mock ()
1216+ m_socket .socket .return_value = sock
1217+
1218+ def getaddrinfo (* args , ** kw ):
1219+ fut = self .loop .create_future ()
1220+ addr = (socket .AF_INET , socket .SOCK_STREAM , 0 , '' ,
1221+ ('127.0.0.1' , 80 ))
1222+ fut .set_result ([addr ])
1223+ return fut
1224+ self .loop .getaddrinfo = getaddrinfo
1225+
1226+ async def sock_connect (sock , address ):
1227+ return None
1228+
1229+ def factory ():
1230+ raise ZeroDivisionError
1231+
1232+ with mock .patch .object (self .loop , 'sock_connect' , sock_connect ):
1233+ coro = self .loop .create_connection (factory , '127.0.0.1' , 80 )
1234+ with self .assertRaises (ZeroDivisionError ):
1235+ self .loop .run_until_complete (coro )
1236+ self .assertTrue (sock .close .called )
1237+
11971238 @patch_socket
11981239 def test_create_connection_happy_eyeballs_empty_exceptions (self , m_socket ):
11991240 # See gh-135836: Fix IndexError when Happy Eyeballs algorithm
0 commit comments