bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_… · python/cpython@f0749da (original) (raw)

`@@ -494,17 +494,14 @@ async def client(addr):

`

494

494

``

495

495

`def test_start_tls_server_1(self):

`

496

496

`HELLO_MSG = b'1' * self.PAYLOAD_SIZE

`

``

497

`+

ANSWER = b'answer'

`

497

498

``

498

499

`server_context = test_utils.simple_server_sslcontext()

`

499

500

`client_context = test_utils.simple_client_sslcontext()

`

500

``

`-

if sys.platform.startswith('freebsd') or sys.platform.startswith('win'):

`

501

``

`-

bpo-35031: Some FreeBSD and Windows buildbots fail to run this test

`

502

``

`-

as the eof was not being received by the server if the payload

`

503

``

`-

size is not big enough. This behaviour only appears if the

`

504

``

`-

client is using TLS1.3.

`

505

``

`-

client_context.options |= ssl.OP_NO_TLSv1_3

`

``

501

`+

answer = None

`

506

502

``

507

503

`def client(sock, addr):

`

``

504

`+

nonlocal answer

`

508

505

`sock.settimeout(self.TIMEOUT)

`

509

506

``

510

507

`sock.connect(addr)

`

`@@ -513,33 +510,36 @@ def client(sock, addr):

`

513

510

``

514

511

`sock.start_tls(client_context)

`

515

512

`sock.sendall(HELLO_MSG)

`

516

``

-

517

``

`-

sock.shutdown(socket.SHUT_RDWR)

`

``

513

`+

answer = sock.recv_all(len(ANSWER))

`

518

514

`sock.close()

`

519

515

``

520

516

`class ServerProto(asyncio.Protocol):

`

521

``

`-

def init(self, on_con, on_eof, on_con_lost):

`

``

517

`+

def init(self, on_con, on_con_lost):

`

522

518

`self.on_con = on_con

`

523

``

`-

self.on_eof = on_eof

`

524

519

`self.on_con_lost = on_con_lost

`

525

520

`self.data = b''

`

``

521

`+

self.transport = None

`

526

522

``

527

523

`def connection_made(self, tr):

`

``

524

`+

self.transport = tr

`

528

525

`self.on_con.set_result(tr)

`

529

526

``

``

527

`+

def replace_transport(self, tr):

`

``

528

`+

self.transport = tr

`

``

529

+

530

530

`def data_received(self, data):

`

531

531

`self.data += data

`

532

``

-

533

``

`-

def eof_received(self):

`

534

``

`-

self.on_eof.set_result(1)

`

``

532

`+

if len(self.data) >= len(HELLO_MSG):

`

``

533

`+

self.transport.write(ANSWER)

`

535

534

``

536

535

`def connection_lost(self, exc):

`

``

536

`+

self.transport = None

`

537

537

`if exc is None:

`

538

538

`self.on_con_lost.set_result(None)

`

539

539

`else:

`

540

540

`self.on_con_lost.set_exception(exc)

`

541

541

``

542

``

`-

async def main(proto, on_con, on_eof, on_con_lost):

`

``

542

`+

async def main(proto, on_con, on_con_lost):

`

543

543

`tr = await on_con

`

544

544

`tr.write(HELLO_MSG)

`

545

545

``

`@@ -550,16 +550,16 @@ async def main(proto, on_con, on_eof, on_con_lost):

`

550

550

`server_side=True,

`

551

551

`ssl_handshake_timeout=self.TIMEOUT)

`

552

552

``

553

``

`-

await on_eof

`

``

553

`+

proto.replace_transport(new_tr)

`

``

554

+

554

555

`await on_con_lost

`

555

556

`self.assertEqual(proto.data, HELLO_MSG)

`

556

557

`new_tr.close()

`

557

558

``

558

559

`async def run_main():

`

559

560

`on_con = self.loop.create_future()

`

560

``

`-

on_eof = self.loop.create_future()

`

561

561

`on_con_lost = self.loop.create_future()

`

562

``

`-

proto = ServerProto(on_con, on_eof, on_con_lost)

`

``

562

`+

proto = ServerProto(on_con, on_con_lost)

`

563

563

``

564

564

`server = await self.loop.create_server(

`

565

565

`lambda: proto, '127.0.0.1', 0)

`

`@@ -568,11 +568,12 @@ async def run_main():

`

568

568

`with self.tcp_client(lambda sock: client(sock, addr),

`

569

569

`timeout=self.TIMEOUT):

`

570

570

`await asyncio.wait_for(

`

571

``

`-

main(proto, on_con, on_eof, on_con_lost),

`

``

571

`+

main(proto, on_con, on_con_lost),

`

572

572

`timeout=self.TIMEOUT)

`

573

573

``

574

574

`server.close()

`

575

575

`await server.wait_closed()

`

``

576

`+

self.assertEqual(answer, ANSWER)

`

576

577

``

577

578

`self.loop.run_until_complete(run_main())

`

578

579

``