U
    gAQ                     @  s  d dl mZ d dlZd dlmZ d dlZd dlmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ dd	lmZ dd
lT ddlmZ ddlmZ erd dlmZ d dlmZmZ ddddZdddddZddddZ dddddZ!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(Z'ddd)d*Z(ddd+d,Z)ddd-d.Z*ddd/d0Z+ddd1d2Z,ddd3d4Z-ddd5d6Z.ddd7d8Z/ddd9d:Z0dS );    )annotationsN)TYPE_CHECKING)RaisesGroup   )_coresleepsocket)can_bind_ipv6)StapledStreamaclose_forcefully)SocketListener)*)_assert_raises)_UnboundedByteQueue)Nursery)ReceiveStream
SendStreamNonereturnc               
     s   g  dd fdd} dd fdd}t  4 I d H $}||  || || W 5 Q I d H R X g  dd fdd}t  4 I d H }|| |j  W 5 Q I d H R X  d	gkstd S )
Nr   r   c                    s*   t dD ]} t I d H  q d d S )N
   zbusy bee exhausted)ranger   
checkpointappend)_record </tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_testing.pybusy_bee   s    z-test_wait_all_tasks_blocked.<locals>.busy_beec                     s   t  I d H   d d S )Nzquiet at last!wait_all_tasks_blockedr   r   r   r   r   waiting_for_bee_to_leave    s    z=test_wait_all_tasks_blocked.<locals>.waiting_for_bee_to_leavec                     s6   zt  I d H  W n  tjk
r0    d Y nX d S )Nok)r!   r   	Cancelledr   r   r   r   r   cancelled_while_waiting,   s    z<test_wait_all_tasks_blocked.<locals>.cancelled_while_waitingr#   )r   open_nursery
start_sooncancel_scopecancelAssertionError)r   r"   nurseryr%   r   r   r   test_wait_all_tasks_blocked   s    


r,   	MockClock)
mock_clockr   c              
     s   g  dd fdd}t  4 I d H P}|| t I d H   dgksLt| d t I d H   ddgksrtW 5 Q I d H R X d S )Nr   r   c                     s&     d tdI d H    d d S )Ntt start   tt finishedr   r   r   r   r   r   timeout_task;   s    
z?test_wait_all_tasks_blocked_with_timeouts.<locals>.timeout_taskr/   r   r1   )r   r&   r'   r!   r*   Zjump)r.   r3   r+   r   r   r   )test_wait_all_tasks_blocked_with_timeouts8   s    

r4   c               
     s   g  dd fdd} dd fdd}dd fdd}dd fd	d
}t  4 I d H 8}||  || || || || W 5 Q I d H R X  ddddddgkstd S )Nr   r   c                     sB     d tdI d H  tdI d H  tdI d H    d d S )Nblink startg{Gz?	blink endr2   r   r   r   r   blinkL   s
    
z7test_wait_all_tasks_blocked_with_cushion.<locals>.blinkc                     s   t  I d H   d d S )Nwait_no_cushion endr    r   r   r   r   wait_no_cushionS   s    zAtest_wait_all_tasks_blocked_with_cushion.<locals>.wait_no_cushionc                     s   t dI d H   d d S )Ng{Gz?wait_small_cushion endr    r   r   r   r   wait_small_cushionW   s    zDtest_wait_all_tasks_blocked_with_cushion.<locals>.wait_small_cushionc                     s   t dI d H   d d S )NgQ?wait_big_cushion endr    r   r   r   r   wait_big_cushion[   s    zBtest_wait_all_tasks_blocked_with_cushion.<locals>.wait_big_cushionr5   r8   r6   r:   r<   )r   r&   r'   r*   )r7   r9   r;   r=   r+   r   r   r   (test_wait_all_tasks_blocked_with_cushionI   s&    



r>   zpytest.WarningsRecorder)recwarnr   c                   s   t   t I d H  W 5 Q R X tt t   W 5 Q R X W 5 Q R X tjtjfD ]@}t| tt$ t   | I d H  W 5 Q R X W 5 Q R X qTt  " t I d H  t I d H  W 5 Q R X d S N)	assert_checkpointsr   r   pytestraisesr*   checkpoint_if_cancelledcancel_shielded_checkpointprintr?   Zpartial_yieldr   r   r   test_assert_checkpointss   s    "rH   c                   s   t   W 5 Q R X tt& t   t I d H  W 5 Q R X W 5 Q R X tjtjfD ]@}t| tt$ t   | I d H  W 5 Q R X W 5 Q R X qTtt4 t  " t I d H  t I d H  W 5 Q R X W 5 Q R X d S r@   )	Zassert_no_checkpointsrB   rC   r*   r   r   rD   rE   rF   rG   r   r   r   test_assert_no_checkpoints   s     
""rI   c                    s(  g  ddd fdddddfdd	} dddfd
d}t  }t 4 I d H b}|| | ||| |d4 I d H  t I d H  W 5 Q I d H R X  dddddgkstW 5 Q I d H R X t  }|d4 I d H  W 5 Q I d H R X tt( |d4 I d H  W 5 Q I d H R X W 5 Q R X d S )Nobjectr   )valr   c                   s   t |   |  d S r@   )rF   r   )rK   r   r   r   t   s    ztest_Sequencer.<locals>.t	Sequencer)seqr   c              
     s   | d4 I d H   d W 5 Q I d H R X | d4 I d H   d W 5 Q I d H R X | d4 I d H   d W 5 Q I d H R X d S )N   f1rO      rQ   rR      rQ   rT   r   rN   rL   r   r   rQ      s    ztest_Sequencer.<locals>.f1c              
     sX   | d4 I d H   d W 5 Q I d H R X | d4 I d H   d W 5 Q I d H R X d S )Nr   f2r   r   rY   r   r   rV   rW   r   r   rY      s    ztest_Sequencer.<locals>.f2r0   rX   rP   rZ   rS   rU   r   )	rM   r   r&   r'   r!   r*   rB   rC   RuntimeError)rQ   rY   rN   r+   r   )r   rL   r   test_Sequencer   s"    &r\   c                    s   g  t  ddd fdd} t 4 I d H @}|| d || d d4 I d H  W 5 Q I d H R X W 5 Q I d H R X  d	d
gksttt( d4 I d H  W 5 Q I d H R X W 5 Q R X d S )Nintr   )ir   c                   sv   t  d}| dkr|  z&| 4 I d H  W 5 Q I d H R X W n& tk
rf    d|  d Y nX W 5 Q R X d S )NrO   zseq(z) RuntimeError)r   ZCancelScoper)   r[   r   )r^   Zscoper   rN   r   r   child   s    
z$test_Sequencer_cancel.<locals>.childrO   r   r   zseq(1) RuntimeErrorzseq(2) RuntimeErrorrR   )rM   r   r&   r'   r*   rB   rC   r[   )r`   r+   r   r_   r   test_Sequencer_cancel   s    
 ra   c                
     sx   t t tt W 5 Q R X W 5 Q R X t t" tt dd  W 5 Q R X W 5 Q R X tt
 tW 5 Q R X d S )NZfoorO   )rB   rC   r*   r   r[   	TypeErrorr   r   r   r   test__assert_raises   s    


rc   c                    s  t    d  d  ddks,t ddks>t d   dksXtttj  d W 5 Q R X ttj    W 5 Q R X tt  d W 5 Q R X  d	 t	   
dI d H d	kstW 5 Q R X  d
  d t	    
dI d H dks$tW 5 Q R X t	   
 I d H dksNtW 5 Q R X ddd fdd} ddd fdd}t 4 I d H }||d || d W 5 Q I d H R X ttj@ t 4 I d H }||d ||d W 5 Q I d H R X W 5 Q R X    ttj  d W 5 Q R X  ddksHt  dksZt 
dI d H dkstt 
 I d H dkst   t  ddfdd}t 4 I d H }||d || W 5 Q I d H R X d S )N   123   456rO      1r   s   23456   789string   abc   defs   ghi   ds   efghibytesr   datar   c                   s   t  I d H   |  d S r@   )r!   putrn   ubqr   r   putter  s    z'test__UnboundeByteQueue.<locals>.putter)expectr   c              	     s,   t     I d H | kstW 5 Q R X d S r@   )rA   getr*   )rt   rq   r   r   getter  s    z'test__UnboundeByteQueue.<locals>.getter   xyzs   asdf   ---    r   c                     s   t  I d H     d S r@   )r!   closer   )ubq2r   r   closer=  s    z'test__UnboundeByteQueue.<locals>.closer)r   ro   
get_nowaitr*   rB   rC   r   
WouldBlockrb   rA   ru   r&   r'   r   BusyResourceErrorrz   ClosedResourceError)rs   rv   r+   r|   r   )rr   r{   r   test__UnboundeByteQueue   sX    



"

$"&r   c               
     s  t  dddfdd  dI d H  ddks:t d	ksJtt   I d H  W 5 Q R X ttj   W 5 Q R X ttj d
 W 5 Q R X  dI d H  t  	 I d H dkstW 5 Q R X ddd fdd} t
 4 I d H }||  ||  W 5 Q I d H R X dks>tt   I d H  W 5 Q R X 	 I d H dksvt	 I d H dkstttj  dI d H  W 5 Q R X jd kstjd kstjd kstg ddfdd}ddfdd}ddfdd}t |||j|ks<tj|ksLtj|ks\tdI d H   I d H  tI d H    ddddgkstd S )Nrl   r   rm   c              	     s&   t    | I d H  W 5 Q R X d S r@   )rA   send_allrp   )mssr   r   do_send_allI  s    z*test_MemorySendStream.<locals>.do_send_allrd   rO   rf   s   23r   re   r   r   c                     s6   z dI d H  W n t jk
r0   d7 Y nX d S )N   xxxrO   )r   r   r   )r   resource_busy_countr   r   do_send_all_count_resourcebusyc  s    z=test_MemorySendStream.<locals>.do_send_all_count_resourcebusyr   ry   rx   c                     s      dkstd d S )Nri   send_all_hook)get_data_nowaitr*   r   r   )mss2r   r   r   r     s    z,test_MemorySendStream.<locals>.send_all_hookc                     s     d d S )N"wait_send_all_might_not_block_hookr   r   r   r   r   r     s    zAtest_MemorySendStream.<locals>.wait_send_all_might_not_block_hookc                     s     d d S )N
close_hookr   r   r   r   r   r     s    z)test_MemorySendStream.<locals>.close_hookri   r   r   r   )MemorySendStreamr   r*   rA   Zwait_send_all_might_not_blockrB   rC   r   r~   get_datar&   r'   acloser   r   r   r   r   r   rz   )r   r+   r   r   r   r   )r   r   r   r   r   r   test_MemorySendStreamF  sf     
r   c                    s  t   ddd fdd}  d | dI d H dks:t| d	I d H d
ksPt d | d I d H dksptttj@ t 4 I d H }|| d	 || d	 W 5 Q I d H R X W 5 Q R X  jd kst d  	   	  | d	I d H dkst| d	I d H dkst| d	I d H dks.tt
tj  d W 5 Q R X ddfdd}g ddfdd}t ||j|kstj|kstd d	I d H dkstd	I d H dkstd	I d H dkstd d _d	I d H dks$td t   I d H  W 5 Q R X dgks^tt
tj d	I d H  W 5 Q R X d S )Nz
int | Nonerl   )	max_bytesr   c              
     s.   t    | I d H W  5 Q R  S Q R X d S r@   )rA   receive_somer   )mrsr   r   do_receive_some  s    z1test_MemoryReceiveStream.<locals>.do_receive_someri   rO      ar   s   bcrj   ry   rx   r   r   c                     s     d d S )Nr   )put_datar   )mrs2r   r   receive_some_hook  s    z3test_MemoryReceiveStream.<locals>.receive_some_hookc                     s     d d S )Nclosedr   r   r   r   r   r     s    z,test_MemoryReceiveStream.<locals>.close_hooks   yyys   yyyxxxr   s   zzzs   lost on closer   )MemoryReceiveStreamr   r*   r   r   r   r&   r'   r   Zput_eofrB   rC   r   r   r   rA   r   )r   r+   r   r   r   )r   r   r   r   test_MemoryReceiveStream  sN    

&




r   c               	     s   t  } |   ttj | dI d H dks4tW 5 Q R X |   ttj | d W 5 Q R X t  }|d |  ttj |dI d H  W 5 Q R X d S )Nr   ry   rd   rw   )	r   rz   rB   rC   r   r   r   r*   r   )r   r   r   r   r   test_MemoryRecvStream_closing  s    "
r   c                    s   t  } t }t| | | dI d H  t| | |dI d H dksHt| dI d H  t| |ddsjt|dI d H dkstt| |ddstt| |ddstt| |ddrt|dI d H dkst|   t| | |dI d H dkstd S )	Nrd   r   re   rO   r      4s   56ry   )r   r   Zmemory_stream_pumpr   r   r*   rz   )r   r   r   r   r   test_memory_stream_pump  s     


r   c               
     s  t  \}  | jd k	st| jd ks&t| jd k	s4t jd ksBt| dI d H   dI d H dksjtddd fdd}t	 4 I d H .}|
|d t I d H  | dI d H  W 5 Q I d H R X t	 4 I d H ,}|
|d	 t I d H  |  I d H  W 5 Q I d H R X t  \}  t	 4 I d H &}|
|d	 t I d H  |   W 5 Q I d H R X t  \}  | j}d | _| d
I d H  ddddd}dd fdd}t	 4 I d H }|
|| |
| W 5 Q I d H R X || _| dI d H   dI d H dkstd S )Nrd   r   rl   r   )expectedr   c                   s     dI d H | kstd S Nr   r   r*   )r   rr   r   receiver  s    z1test_memory_stream_one_way_pair.<locals>.receiverri   ry   re   r   )r+   r   c                   s   t  I d H  | j  d S r@   )r!   r(   r)   )r+   r   r   r   cancel_after_idle0  s    z:test_memory_stream_one_way_pair.<locals>.cancel_after_idler   c                	     s,   t tj  dI d H  W 5 Q R X d S r   )rB   rC   r   r$   r   r   r   r   r   check_for_cancel4  s    z9test_memory_stream_one_way_pair.<locals>.check_for_cancelrg   s   456789)memory_stream_one_way_pairr   r*   r   r   r   r   r   r   r&   r'   r!   r   rz   )sr   r+   oldr   r   r   r   r   test_memory_stream_one_way_pair  sB    
 

r   c               
     s   t  \  dI d H  dI d H  dI d H dksBt dI d H dksZt  I d H  dI d H dkst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 )Nrd   ri   r   ry   r   r   c                     s    t  I d H   dI d H  d S )Nrw   )r!   r   r   )br   r   senderM  s    z'test_memory_stream_pair.<locals>.senderc                     s     dI d H dkstd S )Nr   rw   r   r   )ar   r   r   Q  s    z)test_memory_stream_pair.<locals>.receiver)memory_stream_pairr   r   r*   Zsend_eofr   r&   r'   )r   r   r+   r   )r   r   r   test_memory_stream_pairC  s    

r   c                    s@   dddd} t | d I d H  dddd}t|d I d H  d S )Nz,tuple[MemorySendStream, MemoryReceiveStream]r   c                     s   t  S r@   )r   r   r   r   r   one_way_stream_makerZ  s    zDtest_memory_streams_with_generic_tests.<locals>.one_way_stream_makerzqtuple[StapledStream[MemorySendStream, MemoryReceiveStream], StapledStream[MemorySendStream, MemoryReceiveStream]]c                     s   t  S r@   )r   r   r   r   r   half_closeable_stream_maker_  s    zKtest_memory_streams_with_generic_tests.<locals>.half_closeable_stream_maker)check_one_way_streamZcheck_half_closeable_stream)r   r   r   r   r   &test_memory_streams_with_generic_testsY  s    r   c                    s@   dddd} t | | I d H  dddd}t||I d H  d S )Nz tuple[SendStream, ReceiveStream]r   c                     s   t  S r@   )Zlockstep_stream_one_way_pairr   r   r   r   r   i  s    zFtest_lockstep_streams_with_generic_tests.<locals>.one_way_stream_makerzYtuple[StapledStream[SendStream, ReceiveStream], StapledStream[SendStream, ReceiveStream]]c                     s   t  S r@   )Zlockstep_stream_pairr   r   r   r   two_way_stream_makern  s    zFtest_lockstep_streams_with_generic_tests.<locals>.two_way_stream_maker)r   Zcheck_two_way_stream)r   r   r   r   r   (test_lockstep_streams_with_generic_testsh  s    r   c               	     s  ddddd} t  }|dI d H  |d | t|I d H  t  }|dI d H  |d | t|I d H  trt jt jd	}|d
I d H  |d | t|I d H  tt drt jt jd	}t	
 <}| d}||I d H  |d | t|I d H  W 5 Q R X d S )Nr   r   )listenerr   c                   s   | 4 I d H  t | I d H }|4 I d H Z |  I d H }|4 I d H . |dI d H  |dI d H dksntW 5 Q I d H R X W 5 Q I d H R X W 5 Q I d H R X d S )N   xrO   )Zopen_stream_to_socket_listeneracceptr   r   r*   )r   Zclient_streamZserver_streamr   r   r   checkx  s    z2test_open_stream_to_socket_listener.<locals>.check)z	127.0.0.1r   r   )z0.0.0.0r   )family)z::r   AF_UNIXz/sock)tsocketr   bindlistenr   r	   AF_INET6hasattrr   tempfileTemporaryDirectory)r   sockZtmpdirpathr   r   r   #test_open_stream_to_socket_listenerw  s*    






r   c               	   C  sH   dddddd} t jtdd t| t tdd	d
 W 5 Q R X d S )NrJ   r   )r.   autojump_clockr   c                   s   d S r@   r   r.   r   r   r   r   busy_kitchen  s    z$test_trio_test.<locals>.busy_kitchenz"^too many clocks spoil the broth!$)matchr   )Zautojump_thresholdr   )rB   rC   
ValueErrorZ	trio_testr-   )r   r   r   r   test_trio_test  s    r   )1
__future__r   r   typingr   rB   Ztrio.testingr    r   r   r   r   Z_core._tests.tutilr	   Z_highlevel_genericr
   r   Z_highlevel_socketr   ZtestingZtesting._check_streamsr   Ztesting._memory_streamsr   Ztrior   Ztrio.abcr   r   r,   r4   r>   rH   rI   r\   ra   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sB    *&H\=8*