o
    ACeq                  
   @  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 d dl	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yR Z z
ee W Y dZ[ndZ[ww 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 Z e !dZ"e#ej$Z%e"&e% e#ej$Z'e (e' ej)j*ddej+dedgddgdZ,d_ddZ-eddddd`d d!Z.e,dad#d$Z/edbd'd(Z0dcd)d*Z1dcd+d,Z2dcd-d.Z3dcd/d0Z4dcd1d2Z5dcd3d4Z6dcd5d6Z7ddd8d9Z8ddd:d;Z9ddd<d=Z:ddd>d?Z;ddd@dAZ<dcdBdCZ=edcdDdEZ>dddFdGZ?dcdHdIZ@e,dedJdKZAej)BdLdcdMdNZCej)BdLdcdOdPZDej)BdLdcdQdRZEej)BdLdcdSdTZFdcdUdVZGdddWdXZHdddYdZZIdcd[d\ZJdcd]d^ZKdS )f    )annotationsN)AsyncGenerator)asynccontextmanager)count)NoReturn)skip_if_optional_else_raise)SSL)DTLSChannelDTLSEndpoint)FakeNet	UDPPacket   )
binds_ipv6gc_collect_harderslowzexample.comipv6FT)ZmarksZipv4)Zidskwargs
int | boolreturnr
   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   sock r   9usr/lib/python3.10/site-packages/trio/_tests/test_dtls.pyendpoint+   s   r    )
autocancelmtur   r!   boolr"   
int | None:AsyncGenerator[tuple[DTLSEndpoint, tuple[str, int]], None]c              
    s   t |da}|rdnd}|j|dfI d H  t 4 I d H ,}d fd	d
}||jt|I d H  ||j fV  | rB|j	
  W d   I d H  n1 I d H sRw   Y  W d    d S W d    d S 1 sjw   Y  d S )Nr   z::1	127.0.0.1r   dtls_channelr	   r   Nonec                   s   t d| jj d| j  d ur|   z/t d |  I d H  t d | 2 z3 d H W }t d|d| j | |I d H  q+6 W d S  tj	yW   t d Y d S w )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)r(   packetr"   r   r   echo_handler;   s*   

z&dtls_echo_server.<locals>.echo_handler)r(   r	   r   r)   )r    r   bindr   open_nurserystartserve
server_ctxr,   cancel_scopecancel)r!   r"   r   serverZ	localhostnurseryr3   r   r2   r   dtls_echo_server2   s   
*"r=   r)   c              
     s  t | d4 I d H \}}t| d}||t}ttj |  W d    n1 s.w   Y  |	 I d H  |
dI d H  | I d H dksMJ |
dI d H  | I d H dks`J tt |
dI d H  W d    n1 sxw   Y  |d | }|d | |ksJ |d | |ksJ W d    n1 sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nr&      hellos   goodbye    i  i  )r=   r    connect
client_ctxpytestraisesr   ZNeedHandshakeErrorget_cleartext_mtur.   r/   receive
ValueErrorr-   )r   server_endpointaddressclient_endpointZclient_channelZcleartext_mtu_1234r   r   r   
test_smokeU   s.   



.rJ   autojump_clocktrio.testing.MockClockc           
        s  d}t dt     d| _t 4 I d H \}}t 4 I d H d fdd	dfd
d}| _t	|D ]j}t
d t
d t
d t Q}||t}t
d | I d H  t
d t| }	 td}	||I d H  | I d H |ksJ W d    n1 sw   Y  |	jsnqjW d    n1 sw   Y  q<W d   I d H  n1 I d H sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nd   r   gMbP?r1   r   r   r)   c                   s   	 j g dg ddd }t| j d| j d|  |dkr#d S |d	kr- |  n/|d
kr>t d I d H  n|dksDJ t| j d| j d| j	    
|  d S q)NT)deliverdropdupedelay)gffffff?皙?rR   rR   )weightsr   r*   z: rO   rP   rQ      rN   z: delivered )choicesr+   sourceZdestinationZsend_packetr   sleeprandompayloadhexdeliver_packet)r1   op)fnrr   r   route_packet|   s0   
z:test_handshake_over_terrible_network.<locals>.route_packetc                   s(   z	  |  W d S  ty   Y d S w N)
start_soonRuntimeErrorr1   )r<   r_   r   r   route_packet_wrapper   s
   zBtest_handshake_over_terrible_network.<locals>.route_packet_wrapperzP################################################################################zclient starting do_handshakezclient finished do_handshakeT
   r1   r   r   r)   )rX   Randomr   enableZautojump_thresholdr=   r   r5   r_   ranger+   r    r@   rA   r.   strencodemove_on_afterr/   rE   cancelled_caught)
rK   Z
HANDSHAKES_rH   rd   irI   clientmsgcscoper   )r]   r<   r^   r_   r   $test_handshake_over_terrible_networkn   sF   
-*.rs   c               	     s   t  4 I d H :\} }t !}||t}|dI d H  | I d H dks(J W d    n1 s2w   Y  W d   I d H  d S 1 I d H sHw   Y  d S )N   xyz)r=   r    r@   rA   r/   rE   rn   rH   rI   rp   r   r   r   test_implicit_handshake   s   .rv   c                    sD  t  } t  x}| jdI d H  t 4 I d H T}d	dd}|| jt|I d H  || j	 t
}t 4 I d H }||jd ||j W d   I d H  n1 I d H sZw   Y  |j  W d   I d H  n1 I d H stw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )
Nr'   r   channelr	   r   r)   c              	     s^   t  4 I d H }|| jd || j W d   I d H  d S 1 I d H s(w   Y  d S )Ns   from server)r   r5   ra   r/   rE   )rx   r<   r   r   r   handler   s
   .z!test_full_duplex.<locals>.handlers   from clientrx   r	   r   r)   )r    r   r4   r   r5   r6   r7   r8   r@   r,   rA   ra   r/   rE   r9   r:   )rG   rI   Zserver_nurseryry   rp   r<   r   r   r   test_full_duplex   s"   

((Pr{   c               
     s  t  4 I d H x\} }t _}||t}| I d H  |  ttj	 |
dI d H  W d    n1 s9w   Y  ttj	 | I d H  W d    n1 sVw   Y  |  | I d H  W d    n1 spw   Y  W d   I d H  d S 1 I d H sw   Y  d S )N   abc)r=   r    r@   rA   r.   closerB   rC   r   ClosedResourceErrorr/   rE   acloseru   r   r   r   test_channel_closing   s    .r   c               	     sX   t dd4 I d H \} }|   W d   I d H  n1 I d H s!w   Y  |   d S )NF)r!   )r=   r}   )rG   rH   r   r   r   !test_serve_exits_cleanly_on_close   s
   
(r   c                    sR  t  4 I d H \} }t  4 I d H \} }t }||t}||t}|dI d H  |dI d H  | I d H dksAJ | I d H dksLJ |  tt	j
 |dI d H  W d    n1 siw   Y  tt	j
 | I d H  W d    n1 sw   Y  tt	j
 ||t W d    n1 sw   Y  t	 4 I d H 1}tt	j
 d
dd	}||jt|I d H  W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  W d   I d H  d S 1 I d H s"w   Y  d S )Nr|   rt      xxxrn   objectr   r)   c                      d S r`   r   rn   r   r   r   null_handler     z+test_client_multiplex.<locals>.null_handlerrn   r   r   r)   )r=   r    r@   rA   r/   rE   r}   rB   rC   r   r~   r5   r6   r7   r8   )rn   Zaddress1Zaddress2rI   client1client2r<   r   r   r   r   test_client_multiplex  s8   *
(\r   c               	     st   t j *} tt t|  W d    n1 sw   Y  W d    d S W d    d S 1 s3w   Y  d S r`   )r   r   rB   rC   rF   r
   )sr   r   r   test_dtls_over_dgram_only   s   
"r   c               
     sT  ddd} t  }|jdI d H  t 4 I d H <}||jt| I d H  t	tj
 ||jt| I d H  W d    n1 sCw   Y  |j  W d   I d H  n1 I d H s]w   Y  t 4 I d H }||jt| I d H  |j  W d   I d H  n1 I d H sw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nrn   r   r   r)   c                   r   r`   r   r   r   r   r   r   '  r   z'test_double_serve.<locals>.null_handlerrw   r   )r    r   r4   r   r5   r6   r7   r8   rB   rC   ZBusyResourceErrorr9   r:   )r   rG   r<   r   r   r   test_double_serve&  s$   
(*	"r   trio.abc.Clockc              
     s   t  }|  t W}t ;}|jdI d H  td}||j t	}|
 I d H  W d    n1 s9w   Y  |jsCJ W d    n1 sMw   Y  W d    d S W d    d S 1 sew   Y  d S )Nrw   rM   )r   rh   r    r   r4   r   rl   r@   r,   rA   r.   rm   )rK   r]   r   r   rr   rx   r   r   r   test_connect_to_non_server8  s   Pr   c           	   
     sB  t  }|  dD ]}t 4 I d H \}}t|df}|j|ks#J ||t}t|d D ]}|t	|
 I d H  tdI d H  q/| }|jdksQJ t|D ]}| I d H t	|
 ksfJ qU|dI d H  | I d H dkszJ W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  q
d S )N)re      )incoming_packets_buffer      s   buffer clear now)r   rh   r=   r    r   r@   rA   ri   r/   rj   rk   r   rW   
statisticsZ incoming_packets_dropped_in_triorE   )	rK   r]   buffer_sizern   rH   rI   rp   ro   Zstatsr   r   r   test_incoming_buffer_overflowD  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 4 I d H G\}}tjjtjjd(}dd|
|||||||f
D ]}|||I d H  tdI d H  qW d    n1 sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nr   )ContentTypeHandshakeFragmentHandshakeTypeProtocolVersionRecordencode_handshake_fragmentencode_recordre   )Zmsg_typeZmsg_lenZmsg_seqZfrag_offsetZfrag_lenfrag)content_typeversionZepoch_seqnorY                r   r?   #      r   rt   r   )r   rh   
trio._dtlsr   r   r   r   r   r   r   Z	handshakeZDTLS10client_hellobytes	bytearrayr=   r   r   r   sendtorW   )rK   r]   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_cookiern   rH   r   Z
bad_packetr   r   r   *test_server_socket_doesnt_crash_on_garbageW  s   $

	
	.r   c              
     s   t    ddlm m t Qtdd fdd	}|_t	 4 I d H %\}}	 t
 }||t}| I d H  W d    n1 sMw   Y  q21 I d H sYw   Y  W d    n1 shw   Y  jsrJ d S )Nr   )	BadPacketdecode_client_hello_untrustedr   r1   r   r   r)   c                   s   z
| j \}}}W n	  y   Y n/w t|dkrBt| j }t}|t|kr3t|d }  ||  dN  < tj| |d} |  d S )Nr   r   )rY   )rY   lenr   nextr:   attrZevolver[   )r1   rn   ZcookierY   offsetr   rr   r   r]   Zoffset_to_corruptr   r   r_     s   
z2test_invalid_cookie_rejected.<locals>.route_packetTrf   )r   rh   r   r   r   r   CancelScoper   r_   r=   r    r@   rA   r.   rm   )rK   r_   rn   rH   rp   rx   r   r   r   test_invalid_cookie_rejected  s$   
!r   c                   s  t  }|  t }t }|jdI d H  t 4 I d H r}dd fdd}||jt	|I d H  t
d	 t  ||j t}| I d H  W d    n1 sZw   Y   jsdJ t
d
 ||j t}| I d H dks|J tdI d H  |j  W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nrw   Trx   r	   r   r)   c                   s   r9dt d    tdI d H  t d ttj |  I d H  W d    d S 1 s2w   Y  d S 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 hellor>   )	r+   r:   r   rW   rB   rC   r0   r.   r/   rx   Zconnect_cscopeZ
first_timer   r   ry     s   "zAtest_client_cancels_handshake_and_starts_new_one.<locals>.handlerzclient: starting first connectzclient: starting second connectr>   re   rz   )r   rh   r    r   r4   r   r5   r6   r7   r8   r+   r   r@   r,   rA   r.   rm   rE   rW   r9   r:   )rK   r]   r;   rp   r<   ry   rx   r   r   r   0test_client_cancels_handshake_and_starts_new_one  s.   

(Pr   c                    s  t  } t  }| jdI d H  |jdI d H  ddd d fdd	}t 4 I d H }|| jt|I d H  ||jt I d H  || j	 t
}|d
I d H  | I d H d
ksbJ | |j	 t
}| I d H  ttj |dI d H  W d    n1 sw   Y  |dI d H  | I d H dksJ |j  W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nrw   rx   r	   r   r)   c                   s*   | 2 z3 d H W }|  |I d H  q6 d S r`   )r/   )rx   r1   r   r   r   r3   %  s   z-test_swap_client_server.<locals>.echo_handlerc                   sB   t tj  | I d H  W d    d S 1 sw   Y  d S r`   )rB   rC   r   r0   r   r3   r   r   crashing_echo_handler)     "z6test_swap_client_server.<locals>.crashing_echo_handlers   b as clients   association brokens   a as clientrz   )r    r   r4   r   r5   r6   r7   r8   r@   r,   rA   r/   rE   r.   rB   rC   r0   r9   r:   )abr   r<   Zb_to_aZa_to_br   r   r   test_swap_client_server   s.   
(Pr   c                    s  t    ddfdd} | _t 4 I d H c\} t Jt 4 I d H /}d fdd	}|| td
I d H  d|j	
dj	 I d H  W d   I d H  n1 I d H s`w   Y  W d    n1 sow   Y  W d   I d H  d S 1 I d H sw   Y  d S )NTr1   r   r   r)   c                   s*    r	t d|  d S t d|  |  d S )Nzdropped packetzdelivered packet)r+   r[   rc   
blackholedr]   r   r   r_   I  s
   

z@test_openssl_retransmit_doesnt_break_stuff.<locals>.route_packetc                    sJ     t} | jddI d H  | dI d H  |  I d H dks#J d S )Ng      ?Zinitial_retransmit_timeout   hi)r@   rA   r.   r/   rE   )rp   )rH   rI   r   r   	connecter]  s
   z=test_openssl_retransmit_doesnt_break_stuff.<locals>.connecterg?Fr   rf   r   r)   )r   rh   r_   r=   r    r   r5   ra   rW   r   r   r,   )r_   rG   r<   r   r   )rH   r   rI   r]   r   *test_openssl_retransmit_doesnt_break_stuff?  s(   

(.r   c           	   
     s   t    d d
 fdd}|_t 4 I d H G\}}dD ]6}t )}t }d ||t}|j	|d	I d H  t }|| |ksHJ W d    n1 sRw   Y  q!W d   I d H  d S 1 I d H siw   Y  d S )NTr1   r   r   r)   c                   s    rd d S  |  d S )NF)r[   rc   r   r   r   r_   {  s   zCtest_initial_retransmit_timeout_configuration.<locals>.route_packet)r   r      r   rf   )
r   rh   r_   r=   r    r   Zcurrent_timer@   rA   r.   )	rK   r_   rn   rH   trp   beforerx   afterr   r   r   -test_initial_retransmit_timeout_configurations  s&   .r   c               	     s   d t    d
 fdd} | _t d4 I d H F\}}t -}||t}|  | I d H  |	d	I d H  |
 I d H d	ksJJ W d    n1 sTw   Y  W d   I d H  d S 1 I d H sjw   Y  d S )Ni,  r1   r   r   r)   c                   sB   t d|   t dt| j  t| j ksJ |  d S )Ndelivering zpayload size: )r+   r   rY   r[   rc   ZMTUr]   r   r   r_     s   z9test_explicit_tiny_mtu_is_respected.<locals>.route_packetr2   r   rf   )r   rh   r_   r=   r    r@   rA   r-   r.   r/   rE   )r_   r;   rH   rp   rx   r   r   r   #test_explicit_tiny_mtu_is_respected  s   
.r   c              	     s   t      | rdndd fdd}| _t| d	4 I d H I\}}t| d	.}||t}|d
 |dI d H  |	 I d H dksIJ |
 dksQJ W d    n1 s[w   Y  W d   I d H  d S 1 I d H sqw   Y  d S )Ni  i$  r1   r   r   r)   c                   s<   t | jkrtd|   d S td|    |  d S )Nz	dropping r   )r   rY   r+   r[   rc   r]   r"   r   r   r_     s   z@test_handshake_handles_minimum_network_mtu.<locals>.route_packetr&   i'  rt   i(#  rf   )r   rh   r_   r=   r    r@   rA   r-   r/   rE   rD   )r   rK   r_   rn   rH   rI   rp   r   r   r   *test_handshake_handles_minimum_network_mtu  s   
.r   z$always:unclosed DTLS:ResourceWarningc                    s   t j j} ddd}tt | I d H }t j I d H  t	  W d    n1 s-w   Y  t j I d H  t j j}| |k sFJ | |ksLJ d S )Nr   intc               
     s   t  } tjjtjjdI}|dI d H  | | t}t 4 I d H }|	|j
 tj I d H  |j  W d   I d H  n1 I d H sJw   Y  W d    n1 sYw   Y  tj j}|S )Nr   rw   )r    r   r   r   r4   r@   r,   rA   r5   ra   r.   testingwait_all_tasks_blockedr9   r:   lowlevelcurrent_statisticstasks_living)er   cr<   during_tasksr   r   r   start_and_forget_endpoint  s   (zDtest_system_task_cleaned_up_on_gc.<locals>.start_and_forget_endpoint)r   r   )
r   r   r   r   rB   warnsResourceWarningr   r   r   )Zbefore_tasksr   r   Zafter_tasksr   r   r   !test_system_task_cleaned_up_on_gc  s   
r   c                    sN   t  } tt ~ t  W d    n1 sw   Y  tj I d H  d S r`   )r    rB   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@w   Y  tt ~t  W d    d S 1 sZw   Y  d S )Nrw   r   r   )r   rh   r    r   r4   Z_ensure_receive_loopr   r   r   r   r   r,   rB   r   r   r   )r]   r   r   r   r   r   test_gc_as_packet_received  s   "r   c                  C  sL   ddd} t | }tt ~t  W d    d S 1 sw   Y  d S )Nr   r
   c                    s   t  } |   t S r`   )r   rh   r    )r]   r   r   r   main  s   z&test_gc_after_trio_exits.<locals>.main)r   r
   )r   runrB   r   r   r   )r   r   r   r   r   test_gc_after_trio_exits  s   

	"r   c                    sH   t  } | j  tj I d H  W d    d S 1 sw   Y  d S r`   )r    r   r}   r   r   r   r   r   r   r   'test_already_closed_socket_doesnt_crash  s
   
"r   c              
     s   t      t 4 I d H N\}d fdd}| _t *}td ||t}|	 I d H  W d    n1 s>w   Y  W d    n1 sMw   Y  W d   I d H  d S 1 I d H scw   Y  d S )	Nr1   r   r   r)   c                   s     |  j  d S r`   )r[   r   r}   rc   r]   r;   r   r   r_   2  s   
zEtest_socket_closed_while_processing_clienthello.<locals>.route_packetre   rf   )
r   rh   r=   r_   r    r   rl   r@   rA   r.   )rK   rH   r_   rI   rp   r   r   r   /test_socket_closed_while_processing_clienthello(  s   .r   c                   s  t  }|  d
dd}||_t 4 I d H _\}}t F}||t t 4 I d H %}d fdd}|	| t
d	I d H  ||t W d   I d H  n1 I d H sWw   Y  W d    n1 sfw   Y  W d   I d H  d S 1 I d H s|w   Y  d S )Nr1   r   r   r)   c                 S  s   d S r`   r   rc   r   r   r   r_   D  s   zGtest_association_replaced_while_handshake_running.<locals>.route_packetc                     sB   t tj   I d H  W d    d S 1 sw   Y  d S r`   )rB   rC   r   r0   r.   r   c1r   r   doomed_handshakeN  r   zKtest_association_replaced_while_handshake_running.<locals>.doomed_handshakere   rf   r   )r   rh   r_   r=   r    r@   rA   r   r5   ra   rW   )rK   r]   r_   rn   rH   rI   r<   r   r   r   r   1test_association_replaced_while_handshake_running>  s"   

(.r   c               
     s   t  } |   ddd}|| _t 4 I d H J\}}t 1}||t}||t tt	j
 | I d H  W d    n1 sBw   Y  W d    n1 sQw   Y  W d   I d H  d S 1 I d H sgw   Y  d S )Nr1   r   r   r   c                 S  s   t  r`   )AssertionErrorrc   r   r   r   r_   ^  s   zGtest_association_replaced_before_handshake_starts.<locals>.route_packet)r1   r   r   r   )r   rh   r_   r=   r    r@   rA   rB   rC   r   r0   r.   )r]   r_   rn   rH   rI   r   r   r   r   1test_association_replaced_before_handshake_startsY  s   
.r   c                    s  t  4 I d H s\} }t Z}t 4 I d H ?}tddD ]}|d|ft}||j q||t}|	dI d H  |
 I d H dksGJ |j  W d   I d H  n1 I d H s\w   Y  W d    n1 skw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nr   re   r'   r   )r=   r    r   r5   ri   r@   rA   ra   r.   r/   rE   r9   r:   )rn   rH   rI   r<   ro   rx   r   r   r   test_send_to_closed_local_portk  s   (.r   )r   r   r   r
   )r!   r#   r"   r$   r   r#   r   r%   )r   r#   r   r)   )rK   rL   r   r)   r   )rK   r   r   r)   )r   r#   rK   r   r   r)   )L
__future__r   rX   collections.abcr   
contextlibr   	itertoolsr   typingr   r   rB   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   ZCAcaZ
issue_certZserver_certContextZDTLS_METHODr8   Zconfigure_certrA   Zconfigure_trustZmarkZparametrizeparamZparametrize_ipv6r    r=   rJ   rs   rv   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    



"
X










r
*
-
3

!
#




	

