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