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))

`