@@ -2113,7 +2113,10 @@ async def connect(cmd=None, **kwds):
21132113
21142114class SendfileBase :
21152115
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
21172120
21182121 @classmethod
21192122 def setUpClass (cls ):
@@ -2171,30 +2174,40 @@ def tearDownClass(cls):
21712174 constants .SENDFILE_FALLBACK_READBUFFER_SIZE = cls .__old_bufsize
21722175 super ().tearDownClass ()
21732176
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-
21802177 def make_socket (self , cleanup = True ):
21812178 sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
21822179 sock .setblocking (False )
21832180 if cleanup :
21842181 self .addCleanup (sock .close )
21852182 return sock
21862183
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+
21872199 def prepare_socksendfile (self ):
2188- sock = self .make_socket ()
21892200 proto = self .MyProto (self .loop )
21902201 port = support .find_unused_port ()
21912202 srv_sock = self .make_socket (cleanup = False )
21922203 srv_sock .bind ((support .HOST , port ))
21932204 server = self .run_loop (self .loop .create_server (
21942205 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 ()
21962209 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 )
21982211
21992212 def cleanup ():
22002213 if proto .transport is not None :
@@ -2243,7 +2256,7 @@ def test_sock_sendfile_zero_size(self):
22432256 self .assertEqual (self .file .tell (), 0 )
22442257
22452258 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
22472260 sock , proto = self .prepare_socksendfile ()
22482261 self .run_loop (self .loop .sock_sendall (sock , buf ))
22492262 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):
22882301 srv_ctx = None
22892302 cli_ctx = None
22902303 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 )
22932304 srv_sock .bind ((support .HOST , port ))
22942305 server = self .run_loop (self .loop .create_server (
22952306 lambda : srv_proto , sock = srv_sock , ssl = srv_ctx ))
2307+ self .reduce_receive_buffer_size (srv_sock )
22962308
22972309 if is_ssl :
22982310 server_hostname = support .HOST
22992311 else :
23002312 server_hostname = None
23012313 cli_sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
23022314 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+
23052316 cli_proto = self .MySendfileProto (loop = self .loop )
23062317 tr , pr = self .run_loop (self .loop .create_connection (
23072318 lambda : cli_proto , sock = cli_sock ,
23082319 ssl = cli_ctx , server_hostname = server_hostname ))
2320+ self .reduce_send_buffer_size (cli_sock , transport = tr )
23092321
23102322 def cleanup ():
23112323 srv_proto .transport .close ()
@@ -2410,8 +2422,8 @@ def test_sendfile_for_closing_transp(self):
24102422
24112423 def test_sendfile_pre_and_post_data (self ):
24122424 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
24152427 cli_proto .transport .write (PREFIX )
24162428 ret = self .run_loop (
24172429 self .loop .sendfile (cli_proto .transport , self .file ))
0 commit comments