@@ -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 ))
0 commit comments