U
    g                  
   @  sx  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ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m Z m!Z!m"Z"m#Z# zd dl$Z$d dl%m&Z& W n, e'k
r Z( zee( W 5 dZ([(X Y nX d dlZddl)m*Z*mZ+ ddl,m-Z- ddl*m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZCmDZDmEZE erd dlFmGZG d dlHmIZI d dlJmKZK ddlLmMZM e$N ZOeOPdZQeRejSjTZUeVedr0eU jWejX M  _WeQYeU ejZdddgd d!d"d#d$d%Z[d&d'd(d)d*d+d,d-Z\e	d.d/d0d1d2Z]e	d3d.d4d5d6d7Z^G d8d9 d9e-Z_d*d:d;d<Z`e
d3d.d=d5d>d?Zaddd@d3dAdAdBdBdCdDdEdFZbee"e!f ZcdGeddH< d3d.dId5dJdKZeeeef ZfdGeddL< d3d.dMd5dNdOZgd3d*dPdQdRZhd3d*dPdSdTZid3d*dPdUdVZjd3d*dPdWdXZkd3d*dPdYdZZle1d[d3d*d\d]d^Zmd3d*dPd_d`Znd*d:dadbZoejpjqejrdckoejsddkdedfd3d*dPdgdhZtd3d*dPdidjZuejpvdkd&dlgd3d)d*dmdndoZwd3d*dPdpdqZxd3d*dPdrdsZyd3d*dPdtduZzd3d*dPdvdwZ{d3d*dPdxdyZ|d3d*dPdzd{Z}d*d:d|d}Z~d3d*dPd~dZd3d*dPddZd3d*dPddZd3d*dPddZd3d*dPddZd3d*dPddZd3d*dPddZd3d*dPddZejpddd3d*dPddZd3d*dPddZd3d*dPddZd3d*dPddZd3d*dPddZdS )    )annotationsN)asynccontextmanagercontextmanagersuppress)partial)
SSLContext)TYPE_CHECKINGAnyAsyncIterator	AwaitableCallableIteratorNoReturn)StapledStream)skip_if_optional_else_raise)ReceiveStream
SendStream)MatcherMemoryReceiveStreamMemorySendStreamRaisesGroup)SSL   )_coresocket)Stream)BrokenResourceErrorClosedResourceError)slow)aclose_forcefully)open_tcp_stream)SocketListenerSocketStream)NeedHandshakeErrorSSLListener	SSLStream_is_eof)ConflictDetector)	Sequencerassert_checkpointscheck_two_way_streamlockstep_stream_pairmemory_stream_pair)	TypeAlias)	MockClock)T_Stream)CancelScopetrio-test-1.example.orgOP_IGNORE_UNEXPECTED_EOFmoduletls13tls12)Zscopeparamszpytest.FixtureRequestzssl.SSLContext)requestreturnc                 C  s^   t  }tt dr$| jt j M  _t| | jdkr<|S | jdkrTt jj	|_
|S t d S )Nr2   )defaultr4   r5   )sslcreate_default_contexthasattroptionsr2   TRIO_TEST_CAZconfigure_trustparam
TLSVersionTLSv1_2maximum_versionAssertionError)r7   ctx rE   8/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_ssl.py
client_ctxd   s    




rG   Fexpect_failzstdlib_socket.socketboolNone)sockrI   r8   c             
   C  s   zzztj| ddd}|\ |  |d}|sdtttj |	  W 5 Q R X W 5 Q R  W W d S |
| q"W 5 Q R X W nZ ttfk
r   Y W Rd S  tk
r } z |rtd| ntd|  W 5 d }~X Y nX |rtdW 5 |    X d S )NTF)server_sidesuppress_ragged_eofsi   z*ssl_echo_serve_sync got error as expected:z)ssl_echo_serve_sync got unexpected error:zfailed to fail?)close
SERVER_CTXwrap_socketdo_handshakerecvr   BrokenPipeErrorr:   SSLZeroReturnErrorunwrapsendallConnectionResetErrorConnectionAbortedError	ExceptionprintRuntimeError)rL   rI   wrappeddataexcrE   rE   rF   ssl_echo_serve_syncv   s0    


r`   r	   zAsyncIterator[SocketStream]kwargsr8   c                  K s|   t  \}}t 4 I d H P}|@ |0 |tjjtt|f|  t	t
|V  W 5 Q R X W 5 Q R X W 5 Q I d H R X d S N)stdlib_socket
socketpairtrioopen_nursery
start_soonZ	to_threadZrun_syncr   r`   r"   tsocketfrom_stdlib_socket)rb   abnurseryrE   rE   rF   ssl_echo_server_raw   s    rn   r   z AsyncIterator[SSLStream[Stream]])rG   rb   r8   c              
   K s8   t f |4 I d H }t|| ddV  W 5 Q I d H R X d S Nr1   server_hostname)rn   r%   )rG   rb   rL   rE   rE   rF   ssl_echo_server   s    rr   c                   @  sx   e Zd ZddddddZddddZd	dd
dZddddZddddZdddddZddddddZ	dS )PyOpenSSLEchoStreamNrK   )sleeperr8   c                 C  s   t t j}ddlm} | }t|jdr8||jj tt drFt	t
| t |d | _| j  t | _t | _td| _td| _|d krddd	d
d}|| _n|| _d S )Nr   )BindingSSL_OP_NO_TLSv1_3ZOP_NO_TLSv1_4z2simultaneous calls to PyOpenSSLEchoStream.send_allz6simultaneous calls to PyOpenSSLEchoStream.receive_someobjectrK   _r8   c                   s   d S rc   rE   ry   rE   rE   rF   no_op_sleeper   s    z3PyOpenSSLEchoStream.__init__.<locals>.no_op_sleeper)r   ContextZSSLv23_METHODZ,cryptography.hazmat.bindings.openssl.bindingru   r<   libZset_optionsrv   rC   TRIO_TEST_1_CERTconfigure_cert
Connection_connZset_accept_stater   Z
ParkingLot_lot	bytearray_pending_cleartextr'   _send_all_conflict_detector_receive_some_conflict_detectorrt   )selfrt   rD   ru   rl   r{   rE   rE   rF   __init__   s*    


zPyOpenSSLEchoStream.__init__r8   c                   s   | j   d S rc   )r   Zbio_shutdownr   rE   rE   rF   aclose  s    zPyOpenSSLEchoStream.acloserJ   c                 C  s
   | j  S rc   )r   renegotiate_pendingr   rE   rE   rF   r   
  s    z'PyOpenSSLEchoStream.renegotiate_pendingc                 C  s   | j  std S rc   )r   renegotiaterC   r   rE   rE   rF   r     s    zPyOpenSSLEchoStream.renegotiatec              	     sB   | j 2 t I d H  t I d H  | dI d H  W 5 Q R X d S )Nwait_send_all_might_not_block)r   r   
checkpointrt   r   rE   rE   rF   r     s    z1PyOpenSSLEchoStream.wait_send_all_might_not_blockbytesr^   r8   c              	     s   t d | j t I d H  t I d H  | dI d H  | j| | dI d H  z| jd}W nL tj	k
r   | j
  t d| j  Y qY qH tjk
r   Y qY qHX |  j|7  _qH| j  | dI d H  t d W 5 Q R X d S )Nz  --> transport_stream.send_allsend_all   zrenegotiations:z(  <-- transport_stream.send_all finished)r[   r   r   r   rt   r   Z	bio_writerS   r   ZZeroReturnErrorshutdownZtotal_renegotiationsWantReadErrorr   r   Z
unpark_allr   r^   rE   rE   rF   r     s&    


zPyOpenSSLEchoStream.send_all
int | None)nbytesr8   c                   s  t d |d krd}| j^ z:t I d H  t I d H  | dI d H  z | j|W W  W  5 Q R  S  tjk
rT   | j	r8t d| j	 z"| j	dd }| j
t| W np tjk
r(   z&| j|W  Y  Y W vW  5 Q R  S  tjk
r"   t d | j I d H  Y nX Y nX | j	dd= nt d	 | j I d H  Y q>X q>W 5 | dI d H  t d X W 5 Q R X d S )
Nz#  --> transport_stream.receive_somei   receive_somez,  <-- transport_stream.receive_some finishedz
    tryingr   r   zparking (a)zparking (b))r[   r   rt   r   r   r   Zbio_readr   r   r   sendr   r   Zpark)r   r   Z	next_byterE   rE   rF   r   /  s6    
 &z PyOpenSSLEchoStream.receive_some)N)N)
__name__
__module____qualname__r   r   r   r   r   r   r   rE   rE   rE   rF   rs      s   9rs   r   c                    sj   dddddddd} | ddddI d H  | ddd	d
I d H  | d	d
d	d
I d H  | ddddI d H  d S )Nstrztuple[object, ...]rK   )func1args1func2args2r8   c                   st   t  }tttjdT t 4 I d H 2}|jt|| f|  |jt||f|  W 5 Q I d H R X W 5 Q R X d S )NZsimultaneous)rs   r   r   r   BusyResourceErrorrg   rh   getattr)r   r   r   r   srm   rE   rE   rF   do_testn  s
    zDtest_PyOpenSSLEchoStream_gives_resource_busy_errors.<locals>.do_testr   )   xr   rE   r   )r   rE   )r   rE   rE   rF   3test_PyOpenSSLEchoStream_gives_resource_busy_errorsg  s    
r   z(Iterator[SSLStream[PyOpenSSLEchoStream]]c                 k  s   t f |}t|| ddV  d S ro   )rs   r%   )rG   rb   ZfakesockrE   rE   rF   virtual_ssl_echo_server  s    
r   client_kwargsserver_kwargsr/   zdict[str, Any] | Nonez/tuple[SSLStream[T_Stream], SSLStream[T_Stream]])rG   client_transportserver_transportr   r   r8   c                C  sL   |d kri }|d kri }t || fddi|}t |tfddi|}||fS )Nrq   r1   rM   T)r%   rP   )rG   r   r   r   r   
client_ssl
server_sslrE   rE   rF   ssl_wrap_pair  s*    r   r-   MemoryStapledStreamEtuple[SSLStream[MemoryStapledStream], SSLStream[MemoryStapledStream]]c                 K  s   t  \}}t| ||f|S rc   )r,   r   rG   rb   r   r   rE   rE   rF   ssl_memory_stream_pair  s    
r   MyStapledStream=tuple[SSLStream[MyStapledStream], SSLStream[MyStapledStream]]c                 K  s   t  \}}t| ||f|S rc   )r+   r   r   rE   rE   rF   ssl_lockstep_stream_pair  s    
r   )rG   r8   c              
     s^  t | 4 I d H F}|jrt|dI d H  |dI d H dksDt| I d H  W 5 Q I d H R X tdd4 I d H `}t }t	||dd}|jrtt
t}|dI d H  W 5 Q R X t|jjtjstW 5 Q I d H R X tdd4 I d H \}t	|| dd}|jrtt
t}|dI d H  W 5 Q R X t|jjtjsJtW 5 Q I d H R X d S )Nr   r   TrH   r1   rp   ztrio-test-2.example.org)rr   rM   rC   r   r   r   rn   r:   r;   r%   pytestraisesr   
isinstancevalue	__cause__SSLErrorCertificateError)rG   r   rL   Zbad_client_ctxexcinforE   rE   rF   test_ssl_client_basics  s$    

$r   c              
     s   t  \ }  | t|}tt|tdd}|js>tdd fdd}t	j
|d}|  |dI d H d	ks~t|d
I d H  |dI d H dkst|dI d H dkst| I d H  |  W 5 Q R X W 5 Q R X d S )NTrM   rK   r   c               	     sL   j  dd4} | d | ddks,t| d |   W 5 Q R X d S )Nr1   rp   r   r      y   z)rQ   rW   rS   rC   rV   )Zclient_sockrk   rG   rE   rF   client  s    

z&test_ssl_server_basics.<locals>.client)targetr   r   r   r       )rd   re   ri   rj   r%   r"   rP   rM   rC   	threadingThreadstartr   r   r   join)rG   rl   Zserver_sockr   r   trE   r   rF   test_ssl_server_basics  s$    


r   c              
     s>  t dd4 I d H }| }t }t||dd}|j|ks>t|j|ksLt|jdksZt|jdkshtt	
t |j W 5 Q R X dt|kstdt|kstt	
t d|_W 5 Q R X t	
t d|_W 5 Q R X ||_|j|kstt	
t}| I d H  W 5 Q R X t|jjtjs*tW 5 Q I d H R X d S )	NTrH   r1   rp   Ftransport_streamcontextZasdf)rn   r:   r;   r%   r   rC   r   rM   rq   r   r   AttributeErrorZ
asfdasdfsadirr   rR   r   r   r   r   )rG   rL   Zgood_ctxZbad_ctxr   r   rE   rE   rF   test_attributes  s*    r   c                   s   d d  t  t  ddd fdd}dddfdd	}t| 4 I d H f}t 4 I d H 6}||| ||| ||j ||j W 5 Q I d H R X | I d H  W 5 Q I d H R X tt  krksn tkstd S )
N   i   r   rK   r   r8   c                   s@   t  D ]2}t| t|g }|7 | |I d H  qd S rc   )ranger[   r   r   )r   ichunk)CHUNKS
CHUNK_SIZEsentrE   rF   senderJ  s
    z'test_full_duplex_basics.<locals>.senderc                   s.   t k r*|  d I d H }|7 q d S )Nr   )lenr   )r   r   )r   EXPECTEDreceivedrE   rF   receiverR  s    z)test_full_duplex_basics.<locals>.receiver)	r   rr   r   rg   rh   rR   r   r   rC   )rG   r   r   r   rm   rE   )r   r   r   r   r   rF   test_full_duplex_basicsB  s     "r   c              	     s   t | |}| I d H  |j  |dI d H  |dI d H dksJt|dI d H  |dI d H dksrt| I d H  W 5 Q R X d S )N   ar      b)r   rR   r   r   r   r   rC   r   rG   r   rE   rE   rF   test_renegotiation_simpleg  s    

r   r.   )
mock_clockrG   r8   c                   sT  d| _ dd l}|ddddfdd}dd fdd	}d
ddfddd
ddfdd t||d I d H  dI d H  j   dI d H  | I d H  tdD ]}t|d g}td| d g}j  t	
 4 I d H }|| | | W 5 Q I d H R X t	
 4 I d H }| | || W 5 Q I d H R X | I d H  qtdD ]}t|d g}td| d g}|I d H  j   |I d H  t	
 4 I d H }| | || W 5 Q I d H R X | I d H  qzW 5 Q R X ddddd}	ddfdd}
t||	dpdI d H  j  t	
 4 I d H }| d ||
 W 5 Q I d H R X | I d H   I d H  W 5 Q R X ddddd}t||drdI d H  j  t	
 4 I d H }| d |j W 5 Q I d H R X | I d H   I d H  W 5 Q R X d S )Nr   rw   rK   rx   c                   s   t  ddI d H  d S )Nr   
   )rf   sleepuniformrz   )rrE   rF   rt     s    z.test_renegotiation_randomized.<locals>.sleeperr   c                	     sX   j  rLt  dI d H  W 5 Q R X t   dI d H  W 5 Q R X q td d S )N   -z-- clear --)r   r   r)   r[   rE   )expectr   r   rE   rF   clear  s    
z,test_renegotiation_randomized.<locals>.clearr   )byter8   c              	     sB    j dI d H  td|  t   | I d H  W 5 Q R X d S )Nz
outer sendzcalling SSLStream.send_all)r   rt   r[   r)   r   )r   r   rE   rF   r     s    
z+test_renegotiation_randomized.<locals>.send)expectedr8   c              	     sZ    j dI d H  td|  t| dks,tt   dI d H | ksLtW 5 Q R X d S )Nr   z)calling SSLStream.receive_some, expectingr   )r   rt   r[   r   rC   r)   r   )r   r   rE   rF   r     s
    
z-test_renegotiation_randomized.<locals>.expect)rt   r   d      r   r   )methodr8   c                   s   | dkrt dI d H  d S )Nr   順 rf   r   r   rE   rE   rF   sleeper_with_slow_send_all  s    zAtest_renegotiation_randomized.<locals>.sleeper_with_slow_send_allc                     s"   t dI d H    I d H  d S )N  )rf   r   r   rE   r   rE   rF   sleep_then_wait_writable  s    z?test_renegotiation_randomized.<locals>.sleep_then_wait_writabler   c                   s6   | dkrt dI d H  n| dkr2t dI d H  d S )Nr   r   r   r   r   r   rE   rE   rF   *sleeper_with_slow_wait_writable_and_expect  s    zQtest_renegotiation_randomized.<locals>.sleeper_with_slow_wait_writable_and_expect)Zautojump_thresholdrandomRandomr   rR   r   r   r   r   r   rg   rh   r   r   )r   rG   r   rt   r   r   Zb1Zb2rm   r   r   r   rE   )r   r   r   r   rF   test_renegotiation_randomizedx  sr    



	

r   c                   s   t jt jt jjt jjf  }ddddd}ddddd}ddddd	}d
d
dd fdd}|||I d H  |||I d H  |||I d H  |||I d H  d S )NSrK   r   c              	     s&   t   | dI d H  W 5 Q R X d S )Nr   )r)   r   r   rE   rE   rF   do_send_all  s    z.test_resource_busy_errors.<locals>.do_send_allc              	     s&   t   | dI d H  W 5 Q R X d S Nr   )r)   r   r   rE   rE   rF   do_receive_some  s    z2test_resource_busy_errors.<locals>.do_receive_somec              	     s$   t   |  I d H  W 5 Q R X d S rc   )r)   r   r   rE   rE   rF    do_wait_send_all_might_not_block  s    zCtest_resource_busy_errors.<locals>.do_wait_send_all_might_not_blockzCallable[[S], Awaitable[None]])r   r   r8   c                   sf   t  \}}tttjd@ t 4 I d H }|| | ||| W 5 Q I d H R X W 5 Q R X d S )Nzanother task)r   r   r   r   r   rg   rh   )r   r   r   ry   rm   rG   rE   rF   r     s
    z*test_resource_busy_errors.<locals>.do_test)rf   r%   r   abcr   r   )rG   r   r   r  r  r   rE   r  rF   test_resource_busy_errors  s    
r  c                    sP   g  G  fdddt } t }t|  |dd}| I d H   dgksLtd S )Nc                      sN   e Zd Zdd fddZddddZddd	d
ddZdddddZdS )zEtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStreamrK   r   c                   s     d d S )Nok)appendr   recordrE   rF   r     s    zctest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.wait_send_all_might_not_blockc                   s   t dd S NzShould not get calledrC   r   rE   rE   rF   r     s    zLtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.acloseNr   zbytes | bytearray)	max_bytesr8   c                   s   t dd S r
  r  )r   r  rE   rE   rF   r     s    zRtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.receive_somezbytes | bytearray | memoryviewr   c                   s   t dd S r
  r  r   rE   rE   rF   r      s    zNtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.send_all)N)r   r   r   r   r   r   r   rE   r  rE   rF   
NotAStream  s   r  xrp   r  )r   r:   r;   r%   r   rC   )r  rD   r   rE   r  rF   1test_wait_writable_calls_underlying_wait_writable  s    r  nt)   r   z)frequently fails on Windows + Python 3.10)reasonc              
     s  t | 4 I d H }t  | I d H  W 5 Q R X t  | I d H  W 5 Q R X t  | I d H  W 5 Q R X t  |dI d H  W 5 Q R X t  |dI d H  W 5 Q R X t  |dI d H  W 5 Q R X t  |dI d H  W 5 Q R X t  | I d H  W 5 Q R X W 5 Q I d H R X t | 4 I d H 4}| I d H  t  | I d H  W 5 Q R X W 5 Q I d H R X d S )Ns   xxxr   )rr   r)   rR   r   r   r   rV   r   r   rE   rE   rF   test_checkpoints)  s*    (r  c              
     s   t | 4 I d H }| I d H  t  |dI d H  W 5 Q R X t  |dI d H  W 5 Q R X |dI d H  |dI d H dkst| I d H  W 5 Q I d H R X d S )Nr   r   r   )rr   rR   r)   r   r   rC   r   r   rE   rE   rF   test_send_all_empty_stringJ  s    r  https_compatibleT)rG   r  r8   c                   s:   dd fdd}dd fdd}t ||I d H  d S )Nr   r   c                     s   t  dididS )Nr  r   )r   rE   rG   r  rE   rF   stream_maker_  s
    z,test_SSLStream_generic.<locals>.stream_makerr   c               
     sN   t  \} }t 4 I d H }|| j ||j W 5 Q I d H R X | |fS rc   )r   r   rg   rh   rR   )r   serverrm   r  rE   rF   clogged_stream_makeri  s
    z4test_SSLStream_generic.<locals>.clogged_stream_maker)r*   )rG   r  r  r  rE   r  rF   test_SSLStream_genericZ  s    
r  c              
     s   t | \  jjt dd fdd}ddfdd}t 4 I d H }|| || W 5 Q I d H R X d S )NrK   r   c               
     s     I d H   dI d H   dI d H dks6t dI d H  d4 I d H  jj} d j_W 5 Q I d H R X  dI d H dkst jkst  I d H \}}|kst|dkst jd kst|dI d H  | j_j I d H  d S )Nr   r   r   r   r   r      trailing)rR   r   r   rC   send_streamsend_all_hookr   rV   )r  rawtrailing)r   r   seqrE   rF   r     s     ztest_unwrap.<locals>.clientc               
     s     I d H  dI d H dks&tdI d H  dI d H dksNt d4 I d H   I d H \} }W 5 Q I d H R X | kst|dkstjd kstd S )Nr   r   r   r   r  )rR   r   rC   r   rV   r   )r  r  )r   r   r   rE   rF   r    s    "ztest_unwrap.<locals>.server)r   r   r(   r   rg   rh   rG   r   r  rm   rE   )r   r   r   r   r   rF   test_unwrap|  s    
r"  c              
     s  t | \  j}dd fdd}ddfdd}t 4 I d H }|| || W 5 Q I d H R X tt |dI d H  W 5 Q R X t	   
 I d H  W 5 Q R X t	   
 I d H  W 5 Q R X tt dI d H  W 5 Q R X tt   dI d H d	kstW 5 Q R X tt   I d H  W 5 Q R X tt   I d H  W 5 Q R X t | \ ddfd
d}t 4 I d H }| j
 || W 5 Q I d H R X d S )NrK   r   c                	     s$   t     I d H  W 5 Q R X d S rc   )r)   r   rE   )r   rE   rF   client_closer  s    z-test_closing_nice_case.<locals>.client_closerc                	     sT     dI d H dkst  dI d H dks0tt    I d H  W 5 Q R X d S Nr   r   )r   rC   r)   r   rE   r   rE   rF   server_closer  s    z-test_closing_nice_case.<locals>.server_closers   123r   r   c                	     sN   t    dI d H dks tW 5 Q R X t     I d H  W 5 Q R X d S r$  )r)   r   rC   r   rE   r%  rE   rF   expect_eof_server  s    "z1test_closing_nice_case.<locals>.expect_eof_server)r   r   r   rg   rh   r   r   r   r   r)   r   r   rC   rV   rR   )rG   r   r#  r&  rm   r'  rE   )r   r   rF   test_closing_nice_case  s4    
$r(  c              
     s   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X dddd}||jj_t	t
 |dI d H  W 5 Q R X t	t | I d H  W 5 Q R X d dd fdd	}||jj_||jj_| I d H   d
kstd S )Nr   r   c                     s   t d S rc   KeyErrorrE   rE   rE   rF   bad_hook  s    z3test_send_all_fails_in_the_middle.<locals>.bad_hookr   r   rK   c                     s    d7  d S r   rE   rE   closedrE   rF   
close_hook  s    z5test_send_all_fails_in_the_middle.<locals>.close_hookr   )r   r   rg   rh   rR   r   r  r  r   r   r*  r   r   r   r.  receive_streamr   rC   )rG   r   r  rm   r+  r.  rE   r,  rF   !test_send_all_fails_in_the_middle  s     


r0  c              
     s   t  \}}t|| dd}t|tdd}t|| dd t|tdddd fdd}ddfd	d
}t 4 I d H }|| || W 5 Q I d H R X d S )Nr1   rp   Tr   rK   r   c                     s,     dI d H   dI d H dks(td S )N   hir      bye)r   r   rC   rE   )client_2rE   rF   r      s    z!test_ssl_over_ssl.<locals>.clientc                     s,     dI d H dkst dI d H  d S )Nr   r1  r2  )r   rC   r   rE   )server_2rE   rF   r  $  s    z!test_ssl_over_ssl.<locals>.server)r,   r%   rP   r   rg   rh   )rG   Zclient_0Zserver_0Zclient_1Zserver_1r   r  rm   rE   )r3  r4  rF   test_ssl_over_ssl  s$    

r5  c              
     s   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X t|I d H  tt	 |
dI d H  W 5 Q R X tt	 |dI d H  W 5 Q R X | I d H  d S )Nr   
   xxxxxxxxxx)r   r   rg   rh   rR   rf   r   r   r   r   r   r   r   r!  rE   rE   rF   test_ssl_bad_shutdown-  s    r7  c              
     s   t | ddiddid\}}t 4 I d H }||j ||j W 5 Q I d H R X t|I d H  |dI d H dks|tt	
t |dI d H  W 5 Q R X | I d H  d S )Nr  Tr   r   r   r   r6  )r   r   rg   rh   rR   rf   r   r   rC   r   r   r   r   r   r!  rE   rE   rF    test_ssl_bad_shutdown_but_its_ok>  s    
r9  c               
     sb   t dd4 I d H @} t }t| |dd}tt | I d H  W 5 Q R X W 5 Q I d H R X d S )NTrH   r1   rp   )rn   r:   r;   r%   r   r   r   r   )rL   rG   r   rE   rE   rF   (test_ssl_handshake_failure_during_acloseR  s
    r:  c              
     s   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X |jjj ddd fdd}||jj_t	t
 | I d H  W 5 Q R X dkstd S )Nr   r   r   c                     s"    d k	st    d7 td S r   )rC   r*  rE   Zclient_orig_close_hookZtransport_close_countrE   rF   r.  q  s    z4test_ssl_only_closes_stream_once.<locals>.close_hookr   )r   r   rg   rh   rR   r   r  r.  r   r   r*  r   rC   )rG   r   r  rm   r.  rE   r;  rF    test_ssl_only_closes_stream_oncee  s    

r<  c              
     s   t | ddiddid\} t 4 I d H }||j | j W 5 Q I d H R X dd fdd}t 4 I d H }||j || W 5 Q I d H R X d S )	Nr  FTr8  rK   r   c               	     s:   t t}  dI d H  W 5 Q R X t| jjs6td S )Nr   )r   r   r   r   r&   r   r   rC   )r   r  rE   rF   receive_and_expect_error  s    zKtest_ssl_https_compatibility_disagreement.<locals>.receive_and_expect_error)r   r   rg   rh   rR   r   )rG   r   rm   r>  rE   r=  rF   )test_ssl_https_compatibility_disagreement  s    
r?  c              
     sh   t | ddiddid\} dd fdd}t 4 I d H }||j || W 5 Q I d H R X d S )Nr  Tr8  rK   r   c                     s     dI d H dkstd S r$  )r   rC   rE   r=  rE   rF   server_expect_clean_eof  s    zEtest_https_mode_eof_before_handshake.<locals>.server_expect_clean_eof)r   r   rg   rh   r   )rG   r   r@  rm   rE   r=  rF   $test_https_mode_eof_before_handshake  s    
rA  c              
     s   t | \}}dddd}||jj_tt& t  | I d H  W 5 Q R X W 5 Q R X tt	& t  | I d H  W 5 Q R X W 5 Q R X d S )Nr   r   c                     s   t d S rc   r)  rE   rE   rE   rF   r+    s    z2test_send_error_during_handshake.<locals>.bad_hook)
r   r   r  r  r   r   r*  r)   rR   r   )rG   r   r  r+  rE   rE   rF    test_send_error_during_handshake  s    
"rB  c              
     s   t | \ }dddd}| jj_ddd fdd	}t 4 I d H  }|||j ||j W 5 Q I d H R X t	
t& t    I d H  W 5 Q R X W 5 Q R X d S )
Nr   r   c                     s   t d S rc   r)  rE   rE   rE   rF   r+    s    z5test_receive_error_during_handshake.<locals>.bad_hookr0   rK   )cancel_scoper8   c              
     sB   t t& t    I d H  W 5 Q R X W 5 Q R X |   d S rc   )r   r   r*  r)   rR   cancel)rC  r   rE   rF   client_side  s    "z8test_receive_error_during_handshake.<locals>.client_side)r   r   r/  Zreceive_some_hookr   rg   rh   rC  rR   r   r   r   r)   )rG   r  r+  rF  rm   rE   rE  rF   #test_receive_error_during_handshake  s    
rG  c              	     sL   t | \}}tt |  W 5 Q R X tt |  W 5 Q R X d S rc   )r   r   r   r#   selected_alpn_protocolrG   r   r  rE   rE   rF   ,test_selected_alpn_protocol_before_handshake  s
    rJ  c              
     s~   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X | d ksVt| d ksft| | ksztd S rc   )r   r   rg   rh   rR   rH  rC   r!  rE   rE   rF   (test_selected_alpn_protocol_when_not_set  s    rK  c              	     sL   t | \}}tt |  W 5 Q R X tt |  W 5 Q R X d S rc   )r   r   r   r#   selected_npn_protocolrI  rE   rE   rF   +test_selected_npn_protocol_before_handshake  s
    rM  zCignore: ssl module. NPN is deprecated, use ALPN instead:UserWarningzAignore:ssl NPN is deprecated, use ALPN instead:DeprecationWarningc              
     s~   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X | d ksVt| d ksft| | ksztd S rc   )r   r   rg   rh   rR   rL  rC   r!  rE   rE   rF   'test_selected_npn_protocol_when_not_set  s    rN  c              	     sL   t | \}}tt |  W 5 Q R X tt |  W 5 Q R X d S rc   )r   r   r   r#   get_channel_bindingrI  rE   rE   rF   )test_get_channel_binding_before_handshake  s
    rP  c              
     s~   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X | d k	sVt| d k	sft| | ksztd S rc   )r   r   rg   rh   rR   rO  rC   r!  rE   rE   rF   (test_get_channel_binding_after_handshake  s    rQ  c              
     sz   t | \}}t 4 I d H }||j ||j W 5 Q I d H R X | d ksVtt|  d| d ksvtd S )N)DNSr1   subjectAltName)r   r   rg   rh   rR   getpeercertrC   r[   r!  rE   rE   rF   test_getpeercert  s    rU  c                   s0  ddd fdd}| I d H \}}}|4 I d H  |  I d H }|4 I d H J |jrZtt 4 I d H }||j ||j W 5 Q I d H R X W 5 Q I d H R X | I d H  | dkstW 5 Q I d H R X |ddI d H \}}}|  I d H }|jstt	|I d H  t	|I d H  t	|I d H  d S )	Nr	   zMtuple[tsocket.SocketType, SSLListener[SocketStream], SSLStream[SocketStream]]ra   c                    sb   t  }|dI d H  |d t|}t|tf| }t|  I d H }t	| dd}|||fS )N)z	127.0.0.1r   r   r1   rp   )
ri   r   bindlistenr!   r$   rP   r    getsocknamer%   )rb   listen_sockZsocket_listenerssl_listenerZtransport_client
ssl_clientr  rE   rF   setup)  s    
ztest_SSLListener.<locals>.setupT)r  )
acceptZ_https_compatiblerC   r   rg   rh   rR   r   filenor   )rG   r\  rY  rZ  r[  Z
ssl_serverrm   ry   rE   r  rF   test_SSLListener(  s"    
, r`  )
__future__r   osr   rd   r:   sysr   
contextlibr   r   r   	functoolsr   r   typingr   r	   r
   r   r   r   r   r   rf   r   Ztrio._tests.pytest_pluginr   Ztrio.abcr   r   Ztrio.testingr   r   r   r   ZtrustmeZOpenSSLr   ImportErrorerror r   ri   _abcr   r   r   Z_core._tests.tutilr   Z_highlevel_genericr   Z_highlevel_open_tcp_streamr    Z_highlevel_socketr!   r"   _sslr#   r$   r%   r&   Z_utilr'   Ztestingr(   r)   r*   r+   r,   Ztyping_extensionsr-   Z
trio._corer.   Z	trio._sslr/   Z
_core._runr0   CAr>   Zissue_server_certr~   r;   PurposeCLIENT_AUTHrP   r<   r=   r2   r   ZfixturerG   r`   rn   rr   rs   r   r   r   r   __annotations__r   r   r   r   r   r   r   r   r   r  r  markZskipifnameversion_infor  r  Zparametrizer  r"  r(  r0  r5  r7  r9  r:  r<  r?  rA  rB  rG  rJ  rK  rM  filterwarningsrN  rP  rQ  rU  r`  rE   rE   rE   rF   <module>   s    $


	7 !E%x!!6>


