]> granicus.if.org Git - python/commitdiff
bpo-33353: test_asyncio set SO_SNDBUF after connect (GH-7086)
authorVictor Stinner <vstinner@redhat.com>
Thu, 24 May 2018 00:43:45 +0000 (02:43 +0200)
committerGitHub <noreply@github.com>
Thu, 24 May 2018 00:43:45 +0000 (02:43 +0200)
bpo-32622, bpo-33353: On macOS, sock.connect() changes the
SO_SNDBUF value. Only set SO_SNDBUF and SO_RCVBUF buffer sizes
once a socket is connected or binded, not before.

Lib/test/test_asyncio/test_events.py

index c9e39b2b0321d89701e6bbecb0313fb06156ce81..64d726d16d1cd89f6dae9ab89d7c1ee82b57026d 100644 (file)
@@ -2142,11 +2142,15 @@ class SockSendfileMixin(SendfileBase):
         async def wait_closed(self):
             await self.fut
 
+    def set_socket_opts(self, sock):
+        # On macOS, SO_SNDBUF is reset by connect(). So this method
+        # should be called after the socket is connected.
+        sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
+        sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
+
     def make_socket(self, cleanup=True):
         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         sock.setblocking(False)
-        sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
-        sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
         if cleanup:
             self.addCleanup(sock.close)
         return sock
@@ -2159,7 +2163,9 @@ class SockSendfileMixin(SendfileBase):
         srv_sock.bind((support.HOST, port))
         server = self.run_loop(self.loop.create_server(
             lambda: proto, sock=srv_sock))
+        self.set_socket_opts(srv_sock)
         self.run_loop(self.loop.sock_connect(sock, ('127.0.0.1', port)))
+        self.set_socket_opts(sock)
 
         def cleanup():
             if proto.transport is not None:
@@ -2264,9 +2270,9 @@ class SendfileMixin(SendfileBase):
         else:
             server_hostname = None
         cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        cli_sock.connect((support.HOST, port))
         # reduce send socket buffer size to test on relative small data sets
         cli_sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
-        cli_sock.connect((support.HOST, port))
         cli_proto = self.MySendfileProto(loop=self.loop)
         tr, pr = self.run_loop(self.loop.create_connection(
             lambda: cli_proto, sock=cli_sock,