1
1
import asyncio
2
+ import logging
2
3
import socket
3
4
import uvloop
5
+ import ssl
6
+ import warnings
4
7
5
8
from uvloop import _testbase as tb
6
9
7
10
8
11
class _TestTCP :
9
12
def test_create_server_1 (self ):
10
13
CNT = 0 # number of clients that were successful
11
- TOTAL_CNT = 100 # total number of clients that test will create
14
+ TOTAL_CNT = 25 # total number of clients that test will create
12
15
TIMEOUT = 5.0 # timeout for this test
13
16
17
+ A_DATA = b'A' * 1024 * 1024
18
+ B_DATA = b'B' * 1024 * 1024
19
+
14
20
async def handle_client (reader , writer ):
15
21
nonlocal CNT
16
22
17
- data = await reader .readexactly (4 )
18
- self .assertEqual (data , b'AAAA' )
23
+ data = await reader .readexactly (len ( A_DATA ) )
24
+ self .assertEqual (data , A_DATA )
19
25
writer .write (b'OK' )
20
26
21
- data = await reader .readexactly (4 )
22
- self .assertEqual (data , b'BBBB' )
27
+ data = await reader .readexactly (len ( B_DATA ) )
28
+ self .assertEqual (data , B_DATA )
23
29
writer .writelines ([b'SP' , bytearray (b'A' ), memoryview (b'M' )])
24
30
25
31
await writer .drain ()
@@ -33,54 +39,43 @@ async def test_client(addr):
33
39
sock .setblocking (False )
34
40
await self .loop .sock_connect (sock , addr )
35
41
36
- await self .loop .sock_sendall (sock , b'AAAA' )
42
+ await self .loop .sock_sendall (sock , A_DATA )
37
43
data = await self .loop .sock_recv (sock , 2 )
38
44
self .assertEqual (data , b'OK' )
39
45
40
- await self .loop .sock_sendall (sock , b'BBBB' )
46
+ await self .loop .sock_sendall (sock , B_DATA )
41
47
data = await self .loop .sock_recv (sock , 4 )
42
48
self .assertEqual (data , b'SPAM' )
43
49
44
50
async def start_server ():
45
51
nonlocal CNT
46
52
CNT = 0
47
53
48
- try :
49
- srv = await asyncio .start_server (
50
- handle_client ,
51
- ('127.0.0.1' , 'localhost' ), 0 ,
52
- family = socket .AF_INET ,
53
- loop = self .loop )
54
-
55
- try :
56
- srv_socks = srv .sockets
57
- self .assertTrue (srv_socks )
54
+ srv = await asyncio .start_server (
55
+ handle_client ,
56
+ ('127.0.0.1' , 'localhost' ), 0 ,
57
+ family = socket .AF_INET ,
58
+ loop = self .loop )
58
59
59
- addr = srv_socks [0 ].getsockname ()
60
+ srv_socks = srv .sockets
61
+ self .assertTrue (srv_socks )
60
62
61
- tasks = []
62
- for _ in range (TOTAL_CNT ):
63
- tasks .append (test_client (addr ))
63
+ addr = srv_socks [0 ].getsockname ()
64
64
65
- try :
66
- await asyncio .wait_for (
67
- asyncio .gather (* tasks , loop = self .loop ),
68
- TIMEOUT , loop = self .loop )
69
- finally :
70
- self .loop .stop ()
65
+ tasks = []
66
+ for _ in range (TOTAL_CNT ):
67
+ tasks .append (test_client (addr ))
71
68
72
- finally :
73
- self .loop . call_soon ( srv . close )
74
- await srv . wait_closed ( )
69
+ await asyncio . wait_for (
70
+ asyncio . gather ( * tasks , loop = self .loop ),
71
+ TIMEOUT , loop = self . loop )
75
72
76
- # Check that the server cleaned-up proxy-sockets
77
- for srv_sock in srv_socks :
78
- self .assertEqual (srv_sock .fileno (), - 1 )
73
+ self .loop .call_soon (srv .close )
74
+ await srv .wait_closed ()
79
75
80
- except :
81
- self .loop .stop () # We don't want this test to stuck when
82
- # it fails.
83
- raise
76
+ # Check that the server cleaned-up proxy-sockets
77
+ for srv_sock in srv_socks :
78
+ self .assertEqual (srv_sock .fileno (), - 1 )
84
79
85
80
async def start_server_sock ():
86
81
nonlocal CNT
@@ -89,47 +84,35 @@ async def start_server_sock():
89
84
sock = socket .socket ()
90
85
sock .bind (('127.0.0.1' , 0 ))
91
86
addr = sock .getsockname ()
92
- try :
93
- srv = await asyncio .start_server (
94
- handle_client ,
95
- None , None ,
96
- family = socket .AF_INET ,
97
- loop = self .loop ,
98
- sock = sock )
99
87
100
- try :
101
- srv_socks = srv .sockets
102
- self .assertTrue (srv_socks )
103
-
104
- tasks = []
105
- for _ in range (TOTAL_CNT ):
106
- tasks .append (test_client (addr ))
107
-
108
- try :
109
- await asyncio .wait_for (
110
- asyncio .gather (* tasks , loop = self .loop ),
111
- TIMEOUT , loop = self .loop )
112
- finally :
113
- self .loop .stop ()
114
-
115
- finally :
116
- srv .close ()
117
-
118
- # Check that the server cleaned-up proxy-sockets
119
- for srv_sock in srv_socks :
120
- self .assertEqual (srv_sock .fileno (), - 1 )
121
-
122
- except :
123
- self .loop .stop () # We don't want this test to stuck when
124
- # it fails.
125
- raise
126
-
127
- self .loop .create_task (start_server ())
128
- self .loop .run_forever ()
88
+ srv = await asyncio .start_server (
89
+ handle_client ,
90
+ None , None ,
91
+ family = socket .AF_INET ,
92
+ loop = self .loop ,
93
+ sock = sock )
94
+
95
+ srv_socks = srv .sockets
96
+ self .assertTrue (srv_socks )
97
+
98
+ tasks = []
99
+ for _ in range (TOTAL_CNT ):
100
+ tasks .append (test_client (addr ))
101
+
102
+ await asyncio .wait_for (
103
+ asyncio .gather (* tasks , loop = self .loop ),
104
+ TIMEOUT , loop = self .loop )
105
+
106
+ srv .close ()
107
+
108
+ # Check that the server cleaned-up proxy-sockets
109
+ for srv_sock in srv_socks :
110
+ self .assertEqual (srv_sock .fileno (), - 1 )
111
+
112
+ self .loop .run_until_complete (start_server ())
129
113
self .assertEqual (CNT , TOTAL_CNT )
130
114
131
- self .loop .create_task (start_server_sock ())
132
- self .loop .run_forever ()
115
+ self .loop .run_until_complete (start_server_sock ())
133
116
self .assertEqual (CNT , TOTAL_CNT )
134
117
135
118
def test_create_connection_1 (self ):
@@ -185,8 +168,7 @@ def run(coro):
185
168
186
169
srv = tb .tcp_server (server ,
187
170
max_clients = TOTAL_CNT ,
188
- backlog = TOTAL_CNT ,
189
- timeout = 5 )
171
+ backlog = TOTAL_CNT )
190
172
srv .start ()
191
173
192
174
tasks = []
@@ -248,8 +230,7 @@ def run(coro):
248
230
249
231
srv = tb .tcp_server (server ,
250
232
max_clients = TOTAL_CNT ,
251
- backlog = TOTAL_CNT ,
252
- timeout = 5 )
233
+ backlog = TOTAL_CNT )
253
234
srv .start ()
254
235
255
236
tasks = []
@@ -403,3 +384,106 @@ class Test_UV_TCP(_TestTCP, tb.UVTestCase):
403
384
404
385
class Test_AIO_TCP (_TestTCP , tb .AIOTestCase ):
405
386
pass
387
+
388
+
389
+ class _TestSSL (tb .SSLTestCase ):
390
+
391
+ def test_create_server_ssl_1 (self ):
392
+ CNT = 0 # number of clients that were successful
393
+ TOTAL_CNT = 25 # total number of clients that test will create
394
+ TIMEOUT = 5.0 # timeout for this test
395
+
396
+ A_DATA = b'A' * 1024 * 1024
397
+ B_DATA = b'B' * 1024 * 1024
398
+
399
+ sslctx = self ._create_server_ssl_context (self .ONLYCERT , self .ONLYKEY )
400
+ client_sslctx = self ._create_client_ssl_context ()
401
+
402
+ clients = []
403
+
404
+ async def handle_client (reader , writer ):
405
+ nonlocal CNT
406
+
407
+ data = await reader .readexactly (len (A_DATA ))
408
+ self .assertEqual (data , A_DATA )
409
+ writer .write (b'OK' )
410
+
411
+ data = await reader .readexactly (len (B_DATA ))
412
+ self .assertEqual (data , B_DATA )
413
+ writer .writelines ([b'SP' , bytearray (b'A' ), memoryview (b'M' )])
414
+
415
+ await writer .drain ()
416
+ writer .close ()
417
+
418
+ CNT += 1
419
+
420
+ async def test_client (addr ):
421
+ fut = asyncio .Future (loop = self .loop )
422
+
423
+ def prog ():
424
+ try :
425
+ yield tb .starttls (client_sslctx )
426
+ yield tb .connect (addr )
427
+ yield tb .write (A_DATA )
428
+
429
+ data = yield tb .read (2 )
430
+ self .assertEqual (data , b'OK' )
431
+
432
+ yield tb .write (B_DATA )
433
+ data = yield tb .read (4 )
434
+ self .assertEqual (data , b'SPAM' )
435
+
436
+ yield tb .close ()
437
+
438
+ except Exception as ex :
439
+ self .loop .call_soon_threadsafe (fut .set_exception , ex )
440
+ else :
441
+ self .loop .call_soon_threadsafe (fut .set_result , None )
442
+
443
+ client = tb .tcp_client (prog )
444
+ client .start ()
445
+ clients .append (client )
446
+
447
+ await fut
448
+
449
+ async def start_server ():
450
+ srv = await asyncio .start_server (
451
+ handle_client ,
452
+ '127.0.0.1' , 0 ,
453
+ family = socket .AF_INET ,
454
+ ssl = sslctx ,
455
+ loop = self .loop )
456
+
457
+ try :
458
+ srv_socks = srv .sockets
459
+ self .assertTrue (srv_socks )
460
+
461
+ addr = srv_socks [0 ].getsockname ()
462
+
463
+ tasks = []
464
+ for _ in range (TOTAL_CNT ):
465
+ tasks .append (test_client (addr ))
466
+
467
+ await asyncio .wait_for (
468
+ asyncio .gather (* tasks , loop = self .loop ),
469
+ TIMEOUT , loop = self .loop )
470
+
471
+ finally :
472
+ self .loop .call_soon (srv .close )
473
+ await srv .wait_closed ()
474
+
475
+ with self ._silence_eof_received_warning ():
476
+ self .loop .run_until_complete (start_server ())
477
+
478
+ self .assertEqual (CNT , TOTAL_CNT )
479
+
480
+ for client in clients :
481
+ client .stop ()
482
+
483
+
484
+ class Test_UV_TCPSSL (_TestSSL , tb .UVTestCase ):
485
+ pass
486
+
487
+
488
+ class Test_AIO_TCPSSL (_TestSSL , tb .AIOTestCase ):
489
+ pass
0 commit comments