bpo-33353: test_asyncio use set_write_buffer_limits() (GH-7200) · python/cpython@441afbd (original) (raw)
`@@ -2113,7 +2113,10 @@ async def connect(cmd=None, **kwds):
`
2113
2113
``
2114
2114
`class SendfileBase:
`
2115
2115
``
2116
``
`-
DATA = b"12345abcde" * 64 * 1024 # 64 KiB (don't use smaller sizes)
`
``
2116
`+
DATA = b"SendfileBaseData" * (1024 * 8) # 128 KiB
`
``
2117
+
``
2118
`+
Reduce socket buffer size to test on relative small data sets.
`
``
2119
`+
BUF_SIZE = 4 * 1024 # 4 KiB
`
2117
2120
``
2118
2121
`@classmethod
`
2119
2122
`def setUpClass(cls):
`
`@@ -2171,30 +2174,40 @@ def tearDownClass(cls):
`
2171
2174
`constants.SENDFILE_FALLBACK_READBUFFER_SIZE = cls.__old_bufsize
`
2172
2175
`super().tearDownClass()
`
2173
2176
``
2174
``
`-
def set_socket_opts(self, sock):
`
2175
``
`-
On macOS, SO_SNDBUF is reset by connect(). So this method
`
2176
``
`-
should be called after the socket is connected.
`
2177
``
`-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
`
2178
``
`-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
`
2179
``
-
2180
2177
`def make_socket(self, cleanup=True):
`
2181
2178
`sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
`
2182
2179
`sock.setblocking(False)
`
2183
2180
`if cleanup:
`
2184
2181
`self.addCleanup(sock.close)
`
2185
2182
`return sock
`
2186
2183
``
``
2184
`+
def reduce_receive_buffer_size(self, sock):
`
``
2185
`+
Reduce receive socket buffer size to test on relative
`
``
2186
`+
small data sets.
`
``
2187
`+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, self.BUF_SIZE)
`
``
2188
+
``
2189
`+
def reduce_send_buffer_size(self, sock, transport=None):
`
``
2190
`+
Reduce send socket buffer size to test on relative small data sets.
`
``
2191
+
``
2192
`+
On macOS, SO_SNDBUF is reset by connect(). So this method
`
``
2193
`+
should be called after the socket is connected.
`
``
2194
`+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, self.BUF_SIZE)
`
``
2195
+
``
2196
`+
if transport is not None:
`
``
2197
`+
transport.set_write_buffer_limits(high=self.BUF_SIZE)
`
``
2198
+
2187
2199
`def prepare_socksendfile(self):
`
2188
``
`-
sock = self.make_socket()
`
2189
2200
`proto = self.MyProto(self.loop)
`
2190
2201
`port = support.find_unused_port()
`
2191
2202
`srv_sock = self.make_socket(cleanup=False)
`
2192
2203
`srv_sock.bind((support.HOST, port))
`
2193
2204
`server = self.run_loop(self.loop.create_server(
`
2194
2205
`lambda: proto, sock=srv_sock))
`
2195
``
`-
self.set_socket_opts(srv_sock)
`
``
2206
`+
self.reduce_receive_buffer_size(srv_sock)
`
``
2207
+
``
2208
`+
sock = self.make_socket()
`
2196
2209
`self.run_loop(self.loop.sock_connect(sock, ('127.0.0.1', port)))
`
2197
``
`-
self.set_socket_opts(sock)
`
``
2210
`+
self.reduce_send_buffer_size(sock)
`
2198
2211
``
2199
2212
`def cleanup():
`
2200
2213
`if proto.transport is not None:
`
`@@ -2243,7 +2256,7 @@ def test_sock_sendfile_zero_size(self):
`
2243
2256
`self.assertEqual(self.file.tell(), 0)
`
2244
2257
``
2245
2258
`def test_sock_sendfile_mix_with_regular_send(self):
`
2246
``
`-
buf = b"X" * 160 * 1024 # 160 KiB
`
``
2259
`+
buf = b"mix_regular_send" * (4 * 1024) # 64 KiB
`
2247
2260
`sock, proto = self.prepare_socksendfile()
`
2248
2261
`self.run_loop(self.loop.sock_sendall(sock, buf))
`
2249
2262
`ret = self.run_loop(self.loop.sock_sendfile(sock, self.file))
`
`@@ -2288,24 +2301,23 @@ def prepare_sendfile(self, *, is_ssl=False, close_after=0):
`
2288
2301
`srv_ctx = None
`
2289
2302
`cli_ctx = None
`
2290
2303
`srv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
`
2291
``
`-
reduce recv socket buffer size to test on relative small data sets
`
2292
``
`-
srv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
`
2293
2304
`srv_sock.bind((support.HOST, port))
`
2294
2305
`server = self.run_loop(self.loop.create_server(
`
2295
2306
`lambda: srv_proto, sock=srv_sock, ssl=srv_ctx))
`
``
2307
`+
self.reduce_receive_buffer_size(srv_sock)
`
2296
2308
``
2297
2309
`if is_ssl:
`
2298
2310
`server_hostname = support.HOST
`
2299
2311
`else:
`
2300
2312
`server_hostname = None
`
2301
2313
`cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
`
2302
2314
`cli_sock.connect((support.HOST, port))
`
2303
``
`-
reduce send socket buffer size to test on relative small data sets
`
2304
``
`-
cli_sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
`
``
2315
+
2305
2316
`cli_proto = self.MySendfileProto(loop=self.loop)
`
2306
2317
`tr, pr = self.run_loop(self.loop.create_connection(
`
2307
2318
`lambda: cli_proto, sock=cli_sock,
`
2308
2319
`ssl=cli_ctx, server_hostname=server_hostname))
`
``
2320
`+
self.reduce_send_buffer_size(cli_sock, transport=tr)
`
2309
2321
``
2310
2322
`def cleanup():
`
2311
2323
`srv_proto.transport.close()
`
`@@ -2410,8 +2422,8 @@ def test_sendfile_for_closing_transp(self):
`
2410
2422
``
2411
2423
`def test_sendfile_pre_and_post_data(self):
`
2412
2424
`srv_proto, cli_proto = self.prepare_sendfile()
`
2413
``
`-
PREFIX = b'zxcvbnm' * 1024
`
2414
``
`-
SUFFIX = b'0987654321' * 1024
`
``
2425
`+
PREFIX = b'PREFIX__' * 1024 # 8 KiB
`
``
2426
`+
SUFFIX = b'--SUFFIX' * 1024 # 8 KiB
`
2415
2427
`cli_proto.transport.write(PREFIX)
`
2416
2428
`ret = self.run_loop(
`
2417
2429
`self.loop.sendfile(cli_proto.transport, self.file))
`