a
    (ñ»jÈŒ  ã                
   @  sÌ  d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
Z
d dlZd dlmZ zd dlZd dlmZ W n, eyœ Z zeeƒ W Y dZ[n
dZ[0 0 d dlZd dlZd dlmZmZ d d	lmZmZ d
dlmZmZmZ eròd dlmZ e  ¡ Z!e! "d¡Z#ej$ddœdd„ƒZ%ddœdd„Z&ej$ddœdd„ƒZ'ej(j)ddej*ded�gddgd�Z+dddœdd „Z,edddd!œdd"d#d"d$d%œd&d'„ƒZ-e+d"ddd(d)œd*d+„ƒZ.ed,dd(d-œd.d/„ƒZ/ddd(d0œd1d2„Z0ddd(d0œd3d4„Z1ddd(d0œd5d6„Z2dd(d7œd8d9„Z3dd(d7œd:d;„Z4d(dœd<d=„Z5dd(d7œd>d?„Z6d@dd(dAœdBdC„Z7ej( )dDdEdFg¡d@dddGd(dHœdIdJ„ƒZ8d@dd(d-œdKdL„Z9d@ddd(dMœdNdO„Z:d@dd(d-œdPdQ„Z;dd(d7œdRdS„Z<eddd(d0œdTdU„ƒZ=d@dd(d-œdVdW„Z>ddd(d0œdXdY„Z?e+d"d@ddd(dZœd[d\„ƒZ@ej( Ad]¡dd(d^œd_d`„ƒZBej( Ad]¡d(dœdadb„ƒZCej( Ad]¡d(dœdcdd„ƒZDej( Ad]¡d(dœdedf„ƒZEd(dœdgdh„ZFd@ddd(dMœdidj„ZGd@dd(d-œdkdl„ZHdd(d7œdmdn„ZIdd(d7œdodp„ZJdS )qé    )ÚannotationsN)Úasynccontextmanager)Úcount)ÚTYPE_CHECKINGÚNoReturn)Úskip_if_optional_else_raise)ÚSSL)ÚDTLSChannelÚDTLSEndpoint)ÚFakeNetÚ	UDPPacketé   )Ú
binds_ipv6Úgc_collect_harderÚslow)ÚAsyncGeneratorzexample.comzSSL.Context©Úreturnc                  C  s   t  t j¡} t | ¡ | S ©N)r   ÚContextÚDTLS_METHODÚserver_certZconfigure_cert©Úctx© r   ú;E:\soccer\ml_env\Lib\site-packages\trio/_tests/test_dtls.pyÚ
server_ctx"   s    
r   c                  C  s   t  t j¡} t | ¡ | S r   )r   r   r   ÚcaZconfigure_trustr   r   r   r   Úclient_ctx_fn)   s    
r   c                   C  s   t ƒ S r   )r   r   r   r   r   Ú
client_ctx/   s    r   Úipv6FT)ZmarksZipv4)Zidsz
int | boolr
   )Úkwargsr   c                  K  sD   |   dd¡}|rtjjntjj}tjjtjj|d�}t|fi | ¤ŽS )Nr    F)ÚtypeÚfamily)ÚpopÚtrioÚsocketÚAF_INET6ÚAF_INETÚ
SOCK_DGRAMr
   )r!   r    r#   Úsockr   r   r   Úendpoint;   s    r+   )Ú
autocancelÚmtur    Úboolz
int | Nonez:AsyncGenerator[tuple[DTLSEndpoint, tuple[str, int]], None])r   r,   r-   r    r   c              
    sÔ   t |d��¶}|rdnd}|j |df¡I d H  t ¡ 4 I d H š^}dddœ‡ fdd	„}| |j| |¡I d H  ||j ¡ fV  |rˆ|j 	¡  W d   ƒI d H  q²1 I d H s¨0    Y  W d   ƒ n1 sÆ0    Y  d S )
N©r    z::1ú	127.0.0.1r   r	   ÚNone)Údtls_channelr   c                 “  s®   t d| jj ¡ ›d| j›�ƒ ˆ d ur0|  ˆ ¡ z\t dƒ |  ¡ I d H  t dƒ | 2 z23 d H W }t d|›d| j›�ƒ |  |¡I d H  qT6 W n tj	y¨   t dƒ Y n0 d S )Nzecho handler started: server z client zserver starting do_handshakezserver finished do_handshakezechoing ú -> zecho handler channel broken)
Úprintr+   r&   ÚgetsocknameZpeer_addressÚset_ciphertext_mtuÚdo_handshakeÚsendr%   ÚBrokenResourceError)r2   Úpacket©r-   r   r   Úecho_handlerO   s$    
ÿþÿ
z&dtls_echo_server.<locals>.echo_handler)
r+   r&   Úbindr%   Úopen_nurseryÚstartÚserver5   Úcancel_scopeÚcancel)r   r,   r-   r    ÚserverÚ	localhostÚnurseryr<   r   r;   r   Údtls_echo_serverB   s    rF   r1   )r    r   r   r   c              
   Ã  sž  t | |d�4 I d H �šl\}}t| d���2}| ||¡}t tj¡� | ¡  W d   ƒ n1 s`0    Y  | ¡ I d H  | 	d¡I d H  | 
¡ I d H dksžJ ‚| 	d¡I d H  | 
¡ I d H dksÄJ ‚tjtdd��  | 	d¡I d H  W d   ƒ n1 sø0    Y  | d¡ | ¡ }| d	¡ | ¡ |k�s0J ‚| d¡ | ¡ |k�sLJ ‚W d   ƒ n1 �sb0    Y  W d   ƒI d H  �qš1 I d H �s�0    Y  d S )
N©r    r   r/   ó   hellos   goodbyez4^openssl doesn't support sending empty DTLS packets$©Úmatchó    iÒ  iá  )rF   r+   ÚconnectÚpytestÚraisesr%   ZNeedHandshakeErrorÚget_cleartext_mtur7   r8   ÚreceiveÚ
ValueErrorr6   )r    r   r   Z_server_endpointÚaddressÚclient_endpointZclient_channelZcleartext_mtu_1234r   r   r   Ú
test_smokek   s.    &þ.


rT   ztrio.testing.MockClock)Úautojump_clockr   r   c                 ƒ  sÈ  d}t  d¡‰tƒ ‰ ˆ  ¡  d| _t|d�4 I d H �šv\}}t ¡ 4 I d H �š0‰dddœ‡ ‡fdd	„‰dddœ‡‡fd
d„}|ˆ _t	|ƒD ]Ü}t
dƒ t
dƒ t
dƒ tƒ �¨}| |tƒ ¡}t
dƒ | ¡ I d H  t
dƒ t|ƒ ¡ }	t d¡�8}
| |	¡I d H  | ¡ I d H |	k�sJ ‚W d   ƒ n1 �s00    Y  |
jsæ�qFqæW d   ƒ qŠ1 �s\0    Y  qŠW d   ƒI d H  �q–1 I d H �sŒ0    Y  W d   ƒI d H  �qÄ1 I d H �sº0    Y  d S )Néd   r   gü©ñÒMbP?©r   r   r1   ©r:   r   c                 “  s¸   ˆj g d¢g d¢d�d }t| j› d| j› d|› �ƒ |dkrBd S |dkrVˆ  | ¡ q |d	krxt ˆ ¡ d
 ¡I d H  q |dks„J ‚t| j› d| j› d| j 	¡ › �ƒ ˆ  
| ¡ q´q d S )N)ÚdeliverÚdropÚdupeÚdelay)gffffffæ?çš™™™™™¹?r]   r]   )Úweightsr   r3   z: rZ   r[   r\   é   rY   z: delivered )Úchoicesr4   ÚsourceZdestinationZsend_packetr%   ÚsleepÚrandomÚpayloadÚhexÚdeliver_packet)r:   Úop)ÚfnÚrr   r   Úroute_packet›   s*    þýÿÿ
z:test_handshake_over_terrible_network.<locals>.route_packetc                   s(   zˆ   ˆ| ¡ W n ty"   Y n0 d S r   )Ú
start_soonÚRuntimeError©r:   )rE   rj   r   r   Úroute_packet_wrapperÈ   s    zBtest_handshake_over_terrible_network.<locals>.route_packet_wrapperzP################################################################################zclient starting do_handshakezclient finished do_handshakeé
   )rc   ÚRandomr   ÚenableZautojump_thresholdrF   r%   r>   rj   Úranger4   r+   rL   r   r7   ÚstrÚencodeÚmove_on_afterr8   rP   Úcancelled_caught)rU   r   Z
HANDSHAKESÚ_rR   rn   ÚirS   ÚclientÚmsgÚcscoper   )rh   rE   ri   rj   r   Ú$test_handshake_over_terrible_networkŒ   s2    
-8r|   )r   r   r   c              	   Ã  sž   t | d�4 I d H šr\}}tƒ �B}| ||¡}| d¡I d H  | ¡ I d H dksRJ ‚W d   ƒ n1 sf0    Y  W d   ƒI d H  qš1 I d H s�0    Y  d S )NrW   ó   xyz)rF   r+   rL   r8   rP   ©r   r   rw   rR   rS   ry   r   r   r   Útest_implicit_handshakeæ   s
    r   c                 Ã  s<  t ƒ ��}t ƒ �ö}|j d¡I d H  t ¡ 4 I d H š®}dddœdd„}| |j| |¡I d H  | |j ¡ |¡}t ¡ 4 I d H š0}| 	|j
d¡ | 	|j¡ W d   ƒI d H  qÄ1 I d H sº0    Y  |j ¡  W d   ƒI d H  qø1 I d H sî0    Y  W d   ƒ n1 �s0    Y  W d   ƒ n1 �s.0    Y  d S )N©r0   r   r	   r1   ©Úchannelr   c              	   Ó  sZ   t  ¡ 4 I d H š0}| | jd¡ | | j¡ W d   ƒI d H  qV1 I d H sL0    Y  d S )Ns   from server)r%   r>   rk   r8   rP   )r‚   rE   r   r   r   Úhandlerù   s    z!test_full_duplex.<locals>.handlers   from client)r+   r&   r=   r%   r>   r?   r@   rL   r5   rk   r8   rP   rA   rB   )r   r   Úserver_endpointrS   Zserver_nurseryrƒ   ry   rE   r   r   r   Útest_full_duplexò   s    þ6r…   c              
   Ã  s  t | d�4 I d H šð\}}tƒ �¾}| ||¡}| ¡ I d H  | ¡  t tj¡�  | 	d¡I d H  W d   ƒ n1 st0    Y  t tj¡� | 
¡ I d H  W d   ƒ n1 s®0    Y  | ¡  | ¡ I d H  W d   ƒ n1 sâ0    Y  W d   ƒI d H  �q1 I d H �s0    Y  d S )NrW   ó   abc)rF   r+   rL   r7   ÚcloserM   rN   r%   ÚClosedResourceErrorr8   rP   Úacloser~   r   r   r   Útest_channel_closing  s    .,rŠ   )r   r   c              	   Ã  sX   t d| d�4 I d H š"\}}| ¡  W d   ƒI d H  qL1 I d H sB0    Y  | ¡  d S )NF)r,   r   )rF   r‡   )r   r„   Z_addressr   r   r   Ú!test_serve_exits_cleanly_on_close  s
    2r‹   c           	      Ã  sv  t | d�4 I d H �šF\}}t | d�4 I d H �šþ\}}tƒ ��È}| |tƒ ¡}| |tƒ ¡}| d¡I d H  | d¡I d H  | ¡ I d H dks�J ‚| ¡ I d H dks¦J ‚| ¡  t t	j
¡�  | d¡I d H  W d   ƒ n1 sà0    Y  t t	j
¡� | ¡ I d H  W d   ƒ n1 �s0    Y  t t	j
¡� | |tƒ ¡ W d   ƒ n1 �sX0    Y  dddœdd	„}t	 ¡ 4 I d H š\}t t	j
¡�& | |j| |¡I d H  W d   ƒ n1 �s¾0    Y  W d   ƒI d H  �qö1 I d H �sì0    Y  W d   ƒ n1 �s0    Y  W d   ƒI d H  �qD1 I d H �s:0    Y  W d   ƒI d H  �qr1 I d H �sh0    Y  d S )
NrW   r†   r}   ó   xxxÚobjectr1   ©rw   r   c                 Ó  s   d S r   r   ©rw   r   r   r   Únull_handlerA  s    z+test_client_multiplex.<locals>.null_handler)rF   r+   rL   r   r8   rP   r‡   rM   rN   r%   rˆ   r>   r?   r@   )	r   rw   Zaddress1Zaddress2rS   Úclient1Úclient2r�   rE   r   r   r   Útest_client_multiplex*  s0    ÿþ
...r“   c               	   Ã  sd   t j ¡ �F} tjtdd�� t| ƒ W d   ƒ n1 s80    Y  W d   ƒ n1 sV0    Y  d S )Nz#^DTLS requires a SOCK_DGRAM socket$rI   )r%   r&   rM   rN   rQ   r
   )Úsr   r   r   Útest_dtls_over_dgram_onlyI  s    r•   c              
   Ã  sN  dddœdd„}t ƒ �� }|j d¡I d H  t ¡ 4 I d H šx}| |j| |¡I d H  t tj	¡�& | |j| |¡I d H  W d   ƒ n1 sŒ0    Y  |j
 ¡  W d   ƒI d H  qÊ1 I d H sÀ0    Y  t ¡ 4 I d H š8}| |j| |¡I d H  |j
 ¡  W d   ƒI d H  �q*1 I d H �s 0    Y  W d   ƒ n1 �s@0    Y  d S )Nr�   r1   rŽ   c                 Ó  s   d S r   r   r�   r   r   r   r�   P  s    z'test_double_serve.<locals>.null_handlerr€   )r+   r&   r=   r%   r>   r?   r@   rM   rN   ZBusyResourceErrorrA   rB   )r   r�   r„   rE   r   r   r   Útest_double_serveO  s    
44r–   ztrio.abc.Clock)rU   r   r   c              
   Ã  sÄ   t ƒ }| ¡  tƒ �œ}tƒ �v}|j d¡I d H  t d¡�0}| |j ¡ |¡}| 	¡ I d H  W d   ƒ n1 sp0    Y  |j
s„J ‚W d   ƒ n1 s˜0    Y  W d   ƒ n1 s¶0    Y  d S )Nr€   rV   )r   rq   r+   r&   r=   r%   ru   rL   r5   r7   rv   )rU   r   rh   r‘   r’   r{   r‚   r   r   r   Útest_connect_to_non_servera  s    ,r—   Úbuffer_sizero   é   Úint)rU   r   r   r˜   r   c              	   Ã  sB  t ƒ }| ¡  t|d�4 I d H �š\}}t|d��Ì}|j|ksBJ ‚| ||¡}t|d ƒD ],}	| t|	ƒ 	¡ ¡I d H  t
 d¡I d H  qZ| ¡ }
|
jdksžJ ‚t|ƒD ]"}	| ¡ I d H t|	ƒ 	¡ ks¦J ‚q¦| d¡I d H  | ¡ I d H dksðJ ‚W d   ƒ n1 �s0    Y  W d   ƒI d H  �q>1 I d H �s40    Y  d S )NrW   )Úincoming_packets_bufferé   é   s   buffer clear now)r   rq   rF   r+   r›   rL   rr   r8   rs   rt   r%   rb   Ú
statisticsZ incoming_packets_dropped_in_triorP   )rU   r   r   r˜   rh   rw   rR   rS   ry   rx   Ústatsr   r   r   Útest_incoming_buffer_overflowo  s     r    c                 Ã  sô  t ƒ }| ¡  ddlm}m}m}m}m}m}m	}	 |	||j
|jd|||jddddtdƒd�ƒd�ƒ}
|
d }|
d d… }|
d d… }t|
ƒ}d	|d
< |	||j
|jd|||jddddtdƒd�ƒd�ƒ}|	||j
|jd|||jddddtdƒd�ƒd d�ƒ}|	||j
|jddd�ƒ}|	||j
|jdtdƒd d�ƒ}t|d�4 I d H š’\}}tjjtjjd��R}dd||||||||f
D ](}| ||¡I d H  t d¡I d H  �qxW d   ƒ n1 �s¸0    Y  W d   ƒI d H  �qð1 I d H �sæ0    Y  d S )Nr   )ÚContentTypeÚHandshakeFragmentÚHandshakeTypeÚProtocolVersionÚRecordÚencode_handshake_fragmentÚencode_recordro   )Úmsg_typeZmsg_lenZmsg_seqZfrag_offsetZfrag_lenÚfrag)Úcontent_typeÚversionZepoch_seqnord   ó    éÿÿÿÿé   éÿ   é   r™   rK   é#   ó   ÿrW   ©r"   r}   r�   )r   rq   Ú
trio._dtlsr¡   r¢   r£   r¤   r¥   r¦   r§   Ú	handshakeZDTLS10Úclient_helloÚbytesÚ	bytearrayrF   r%   r&   r)   Úsendtorb   )rU   r   rh   r¡   r¢   r£   r¤   r¥   r¦   r§   r¶   Zclient_hello_extendedZclient_hello_shortZclient_hello_really_shortZclient_hello_corrupt_record_lenZclient_hello_fragmentedZ$client_hello_trailing_data_in_recordZhandshake_emptyZ client_hello_truncated_in_cookierw   rR   r*   Z
bad_packetr   r   r   Ú*test_server_socket_doesnt_crash_on_garbage‡  s¸    $
úÿüÿúÿüÿúÿ
öüÿüÿ	
üÿ	örº   )rU   r   r   r   c              
   ƒ  s  t ƒ ‰ˆ ¡  ddlm‰ m‰ t ¡ �¾‰tdƒ‰dddœ‡ ‡‡‡‡fdd„}|ˆ_t	|d	�4 I d H š\\}}t
ƒ �*}| ||¡}| ¡ I d H  W d   ƒ qj1 s 0    Y  qjW d   ƒI d H  qÖ1 I d H sÌ0    Y  W d   ƒ n1 sê0    Y  ˆjsþJ ‚d S )
Nr   )Ú	BadPacketÚdecode_client_hello_untrustedr°   r   r1   rX   c                   s’   zˆ| j ƒ\}}}W n ˆ y&   Y n^0 t|ƒdkr„t| j ƒ}tˆƒ}|t|ƒkrft|ƒd }ˆ ¡  ||  dN  < tj| |d�} ˆ | ¡ d S )Nr   r�   )rd   )rd   Úlenr¸   ÚnextrB   ÚattrsZevolverf   )r:   rw   Úcookierd   Úoffset©r»   r{   r¼   rh   Zoffset_to_corruptr   r   rj     s    
z2test_invalid_cookie_rejected.<locals>.route_packetrW   )r   rq   r´   r»   r¼   r%   ÚCancelScoper   rj   rF   r+   rL   r7   rv   )rU   r   r   rj   rw   rR   ry   r‚   r   rÂ   r   Útest_invalid_cookie_rejectedù  s    
vrÄ   c                 ƒ  s’  t ƒ }| ¡  tƒ ��f}tƒ ��<}|j d¡I d H  t ¡ 4 I d H šò}d‰dddœ‡ ‡fdd„}| |j||¡I d H  t	dƒ t 
¡ �2‰ | |j ¡ tƒ ¡}| ¡ I d H  W d   ƒ n1 s¾0    Y  ˆ jsÒJ ‚t	d	ƒ | |j ¡ tƒ ¡}| ¡ I d H d
k�sJ ‚t d¡I d H  |j ¡  W d   ƒI d H  �qN1 I d H �sD0    Y  W d   ƒ n1 �sd0    Y  W d   ƒ n1 �s„0    Y  d S )Nr€   Tr	   r1   r�   c                 “  sˆ   ˆrld‰t dƒ ˆ  ¡  t d¡I d H  t dƒ t tj¡� |  ¡ I d H  W d   ƒ q„1 s`0    Y  nt dƒ |  d¡I d H  d S )NFz'handler: first time, cancelling connectg      à?z"handler: handshake should fail nowz&handler: not first time, sending hellorH   )	r4   rB   r%   rb   rM   rN   r9   r7   r8   ©r‚   ©Zconnect_cscopeZ
first_timer   r   rƒ   3  s    .zAtest_client_cancels_handshake_and_starts_new_one.<locals>.handlerzclient: starting first connectzclient: starting second connectrH   ro   )r   rq   r+   r&   r=   r%   r>   r?   r@   r4   rÃ   rL   r5   r   r7   rv   rP   rb   rA   rB   )rU   r   rh   rC   ry   rE   rƒ   r‚   r   rÆ   r   Ú0test_client_cancels_handshake_and_starts_new_one%  s$    
,
rÇ   c                 ƒ  sÚ  t ƒ ��¼}t ƒ ��’}|j d¡I d H  |j d¡I d H  dddœdd„‰ dddœ‡ fdd„}t ¡ 4 I d H �š}| |j| |¡I d H  | |j| ˆ ¡I d H  | |j ¡ t	ƒ ¡}| 
d	¡I d H  | ¡ I d H d	ksÖJ ‚| |j ¡ t	ƒ ¡}| ¡ I d H  t tj¡�  | 
d
¡I d H  W d   ƒ n1 �s,0    Y  | 
d¡I d H  | ¡ I d H dk�s^J ‚|j ¡  W d   ƒI d H  �q–1 I d H �sŒ0    Y  W d   ƒ n1 �s¬0    Y  W d   ƒ n1 �sÌ0    Y  d S )Nr€   r	   r1   r�   c                 Ó  s(   | 2 z3 d H W }|   |¡I d H  q6 d S r   )r8   )r‚   r:   r   r   r   r<   W  s    z-test_swap_client_server.<locals>.echo_handlerc                 “  s>   t  tj¡� ˆ | ƒI d H  W d   ƒ n1 s00    Y  d S r   )rM   rN   r%   r9   rÅ   ©r<   r   r   Úcrashing_echo_handler[  s    z6test_swap_client_server.<locals>.crashing_echo_handlers   b as clients   association brokens   a as client)r+   r&   r=   r%   r>   r?   r@   rL   r5   r   r8   rP   r7   rM   rN   r9   rA   rB   )r   ÚaÚbrÉ   rE   Zb_to_aZa_to_br   rÈ   r   Útest_swap_client_serverR  s$    0rÌ   c                 ƒ  s(  t ƒ ‰ˆ ¡  d‰dddœ‡‡fdd„}|ˆ_t| d�4 I d H šÌ\}‰ tƒ �š‰t ¡ 4 I d H šd}ddœ‡ ‡‡fd	d
„}| |¡ t d¡I d H  d‰|j	 
dˆj	 ¡ ¡I d H  W d   ƒI d H  qØ1 I d H sÎ0    Y  W d   ƒ n1 sì0    Y  W d   ƒI d H  �q$1 I d H �s0    Y  d S )NTr   r1   rX   c                   s*   ˆ rt d| ƒ d S t d| ƒ ˆ | ¡ d S )Nzdropped packetzdelivered packet)r4   rf   rm   ©Ú
blackholedrh   r   r   rj   }  s
    

z@test_openssl_retransmit_doesnt_break_stuff.<locals>.route_packetrW   r   c                  “  sH   ˆ  ˆ ˆ¡} | jdd�I d H  |  d¡I d H  |  ¡ I d H dksDJ ‚d S )Ng      ø?©Zinitial_retransmit_timeoutó   hi)rL   r7   r8   rP   )ry   )rR   r   rS   r   r   Ú	connecter‘  s    z=test_openssl_retransmit_doesnt_break_stuff.<locals>.connectergš™™™™™ñ?FrŒ   )r   rq   rj   rF   r+   r%   r>   rk   rb   r&   r¹   r5   )r   r   rj   r„   rE   rÑ   r   )rR   rÎ   r   rS   rh   r   Ú*test_openssl_retransmit_doesnt_break_stuffq  s     
þrÒ   c           
   
   ƒ  sè   t ƒ ‰ˆ ¡  d‰ dddœ‡ ‡fdd„}|ˆ_t|d�4 I d H šŽ\}}dD ]n}tƒ �T}t ¡ }d‰ | |tƒ ¡}|j	|d	�I d H  t ¡ }	|	| |ksšJ ‚W d   ƒ qJ1 s®0    Y  qJW d   ƒI d H  qä1 I d H sÚ0    Y  d S )
NTr   r1   rX   c                   s   ˆ r
d‰ n
ˆ  | ¡ d S )NF)rf   rm   rÍ   r   r   rj   °  s    zCtest_initial_retransmit_timeout_configuration.<locals>.route_packetrW   )r�   r   é   rÏ   )
r   rq   rj   rF   r+   r%   Úcurrent_timerL   r   r7   )
rU   r   rj   rw   rR   Útry   Úbeforer‚   Úafterr   rÍ   r   Ú-test_initial_retransmit_timeout_configuration¨  s    rØ   c              	   ƒ  sæ   d‰ t ƒ ‰ˆ ¡  dddœ‡ ‡fdd„}|ˆ_tˆ | d�4 I d H šŠ\}}tƒ �Z}| ||¡}| ˆ ¡ | ¡ I d H  | d¡I d H  | 	¡ I d H dksšJ ‚W d   ƒ n1 s®0    Y  W d   ƒI d H  qâ1 I d H sØ0    Y  d S )	Ni,  r   r1   rX   c                   sB   t d| › �ƒ t dt| jƒ› �ƒ t| jƒˆ ks4J ‚ˆ | ¡ d S )Núdelivering zpayload size: )r4   r½   rd   rf   rm   ©ZMTUrh   r   r   rj   Î  s    z9test_explicit_tiny_mtu_is_respected.<locals>.route_packet)r-   r   rÐ   )
r   rq   rj   rF   r+   rL   r6   r7   r8   rP   )r   r   rj   Z_serverrR   ry   r‚   r   rÚ   r   Ú#test_explicit_tiny_mtu_is_respectedÄ  s    
rÛ   )r    rU   r   r   r   c           	   	   ƒ  sô   t ƒ ‰ ˆ  ¡  | rdnd‰dddœ‡ ‡fdd„}|ˆ _t| |d�4 I d H š�\}}t| d	��\}| ||¡}| d
¡ | d¡I d H  | ¡ I d H dks˜J ‚| 	¡ dks¨J ‚W d   ƒ n1 s¼0    Y  W d   ƒI d H  qð1 I d H sæ0    Y  d S )NiÐ  i$  r   r1   rX   c                   s:   t | jƒˆkrtd| › �ƒ ntd| › �ƒ ˆ  | ¡ d S )Nz	dropping rÙ   )r½   rd   r4   rf   rm   ©rh   r-   r   r   rj   ì  s    z@test_handshake_handles_minimum_network_mtu.<locals>.route_packetrG   r/   i'  r}   i(#  )
r   rq   rj   rF   r+   rL   r6   r8   rP   rO   )	r    rU   r   r   rj   rw   rR   rS   ry   r   rÜ   r   Ú*test_handshake_handles_minimum_network_mtuß  s    
rÝ   z$always:unclosed DTLS:ResourceWarning)r   r   c                 ƒ  s¢   t j ¡ j}ddœ‡ fdd„}t t¡�2 |ƒ I d H }t j ¡ I d H  t	ƒ  W d   ƒ n1 s`0    Y  t j ¡ I d H  t j ¡ j}||k s’J ‚||ksžJ ‚d S )Nrš   r   c               
   “  sÊ   t ƒ } tjjtjjd��’}| d¡I d H  |  | ¡ ˆ ¡}t ¡ 4 I d H š<}| |j	¡ tj
 ¡ I d H  |j ¡  W d   ƒI d H  qœ1 I d H s’0    Y  W d   ƒ n1 s°0    Y  tj ¡ j}|S )Nr³   r€   )r+   r%   r&   r)   r=   rL   r5   r>   rk   r7   ÚtestingÚwait_all_tasks_blockedrA   rB   ÚlowlevelÚcurrent_statisticsÚtasks_living)Úer”   ÚcrE   Úduring_tasks©r   r   r   Ústart_and_forget_endpoint  s    RzDtest_system_task_cleaned_up_on_gc.<locals>.start_and_forget_endpoint)
r%   rà   rá   râ   rM   ÚwarnsÚResourceWarningrÞ   rß   r   )r   Zbefore_tasksrç   rå   Zafter_tasksr   ræ   r   Ú!test_system_task_cleaned_up_on_gc  s    $rê   c                  Ã  sL   t ƒ } t t¡� ~ tƒ  W d   ƒ n1 s.0    Y  tj ¡ I d H  d S r   )r+   rM   rè   ré   r   r%   rÞ   rß   ©rã   r   r   r   Ú!test_gc_before_system_task_starts(  s
    $rì   c                  Ã  s¾   t ƒ } |  ¡  tƒ }|j d¡I d H  | ¡  tj ¡ I d H  tjjtjj	d��(}| 
d|j ¡ ¡I d H  W d   ƒ n1 s~0    Y  t t¡� ~tƒ  W d   ƒ n1 s°0    Y  d S )Nr€   r³   rŒ   )r   rq   r+   r&   r=   Z_ensure_receive_loopr%   rÞ   rß   r)   r¹   r5   rM   rè   ré   r   )rh   rã   r”   r   r   r   Útest_gc_as_packet_received3  s    6rí   c                  C  sN   ddœdd„} t  | ¡}t t¡� ~tƒ  W d   ƒ n1 s@0    Y  d S )Nr
   r   c                  Ó  s   t ƒ } |  ¡  tƒ S r   )r   rq   r+   )rh   r   r   r   ÚmainJ  s    z&test_gc_after_trio_exits.<locals>.main)r%   ÚrunrM   rè   ré   r   )rî   rã   r   r   r   Útest_gc_after_trio_exitsH  s
    	
rð   c                  Ã  sD   t ƒ �*} | j ¡  tj ¡ I d H  W d   ƒ n1 s60    Y  d S r   )r+   r&   r‡   r%   rÞ   rß   rë   r   r   r   Ú'test_already_closed_socket_doesnt_crashY  s    
rñ   c              
   ƒ  sÚ   t ƒ ‰ ˆ  ¡  t|d�4 I d H š \‰}dddœ‡ ‡fdd„}|ˆ _tƒ �T}t d¡�* | ||¡}| ¡ I d H  W d   ƒ n1 s„0    Y  W d   ƒ n1 s¢0    Y  W d   ƒI d H  qÖ1 I d H sÌ0    Y  d S )NrW   r   r1   rX   c                   s   ˆ   | ¡ ˆj ¡  d S r   )rf   r&   r‡   rm   ©rh   rC   r   r   rj   l  s    
zEtest_socket_closed_while_processing_clienthello.<locals>.route_packetro   )	r   rq   rF   rj   r+   r%   ru   rL   r7   )rU   r   r   rR   rj   rS   ry   r   rò   r   Ú/test_socket_closed_while_processing_clienthellob  s    ró   c           	      ƒ  s  t ƒ }| ¡  dddœdd„}||_t|d�4 I d H šÆ\}}tƒ �”}| |tƒ ¡‰ t ¡ 4 I d H šP}ddœ‡ fdd	„}| 	|¡ t 
d
¡I d H  | |tƒ ¡ W d   ƒI d H  qÈ1 I d H s¾0    Y  W d   ƒ n1 sÜ0    Y  W d   ƒI d H  �q1 I d H �s
0    Y  d S )Nr   r1   rX   c                 S  s   d S r   r   rm   r   r   r   rj   ~  s    zGtest_association_replaced_while_handshake_running.<locals>.route_packetrW   r   c                   “  s>   t  tj¡� ˆ  ¡ I d H  W d   ƒ n1 s00    Y  d S r   )rM   rN   r%   r9   r7   r   ©Úc1r   r   Údoomed_handshake‰  s    zKtest_association_replaced_while_handshake_running.<locals>.doomed_handshakero   )r   rq   rj   rF   r+   rL   r   r%   r>   rk   rb   )	rU   r   rh   rj   rw   rR   rS   rE   rö   r   rô   r   Ú1test_association_replaced_while_handshake_runningx  s    
r÷   c              
   Ã  sæ   t ƒ }| ¡  dddœdd„}||_t| d�4 I d H š–\}}tƒ �f}| |tƒ ¡}| |tƒ ¡ t t	j
¡� | ¡ I d H  W d   ƒ n1 s�0    Y  W d   ƒ n1 s®0    Y  W d   ƒI d H  qâ1 I d H sØ0    Y  d S )Nr   r   rX   c                 S  s
   t ƒ ‚d S r   )ÚAssertionErrorrm   r   r   r   rj   ›  s    zGtest_association_replaced_before_handshake_starts.<locals>.route_packetrW   )r   rq   rj   rF   r+   rL   r   rM   rN   r%   r9   r7   )r   rh   rj   rw   rR   rS   rõ   r   r   r   Ú1test_association_replaced_before_handshake_starts”  s    rù   c                 Ã  s  t | d�4 I d H šê\}}tƒ �¸}t ¡ 4 I d H š‚}tddƒD ]"}| d|ftƒ ¡}| |j¡ q<| |tƒ ¡}| 	d¡I d H  | 
¡ I d H dks”J ‚|j ¡  W d   ƒI d H  qÈ1 I d H s¾0    Y  W d   ƒ n1 sÜ0    Y  W d   ƒI d H  �q1 I d H �s
0    Y  d S )NrW   r�   ro   r0   rŒ   )rF   r+   r%   r>   rr   rL   r   rk   r7   r8   rP   rA   rB   )r   rw   rR   rS   rE   rx   r‚   r   r   r   Útest_send_to_closed_local_port©  s    rú   )KÚ
__future__r   rc   Ú
contextlibr   Ú	itertoolsr   Útypingr   r   r¿   rM   Ztrio._tests.pytest_pluginr   ZtrustmeZOpenSSLr   ÚImportErrorÚerrorr%   Ztrio.testingr	   r
   Ztrio.testing._fake_netr   r   Z_core._tests.tutilr   r   r   Úcollections.abcr   ÚCAr   Z
issue_certr   Zfixturer   r   r   ÚmarkZparametrizeÚparamZparametrize_ipv6r+   rF   rT   r|   r   r…   rŠ   r‹   r“   r•   r–   r—   r    rº   rÄ   rÇ   rÌ   rÒ   rØ   rÛ   rÝ   Úfilterwarningsrê   rì   rí   rð   rñ   ró   r÷   rù   rú   r   r   r   r   Ú<module>   s”   
ýû( Yr,-6$
#



	