U
    gg'                  	   @  s  d dl mZ d dlZd dlZd dl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 ddlmZmZ ejdkZejje d	d
ZerejdksterddlmZ n"ee ddlmZ W 5 Q R X ddddZ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$d%Z%d"dd#d&d'Z&ejjej'd(d)d
ddd*d+Z(eddd,d-Z)dS ).    )annotationsN)TYPE_CHECKING   )_core)gc_collect_harderskip_if_fbsd_pipes_broken)check_one_way_streamwait_all_tasks_blockedposixz
posix only)reasonunix)FdStreamztuple[FdStream, FdStream]returnc                    s   t  \} }t|t| fS )zMakes a new pair of pipes.)ospiper   )rw r   ?/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_unix_pipes.py	make_pipe   s    r   c                    sX   t  I d H \} }z*ttdd}t|  d| d  qW n tk
rN   Y nX | |fS )NPIPE_BUFi       xr   )r   getattrselectr   writefilenoBlockingIOError)sr   buf_sizer   r   r   make_clogged_pipe!   s    r    Nonec               
     sp   t  \} }t|4 I d H D}| |ks.t|dI d H  t | ddksRtt |  W 5 Q I d H R X d S Ns   123   )r   r   r   r   AssertionErrorsend_allreadclose)r   r   sendr   r   r   test_send_pipe;   s    r)   c               
     sp   t  \} }t| 4 I d H D}| | ks.tt |d |dI d H dksRtt | W 5 Q I d H R X d S r"   )r   r   r   r   r$   r   receive_somer'   )r   r   recvr   r   r   test_receive_pipeE   s    r,   c               
     s   t  I d H \d dd fdd} dd fdd}t 4 I d H }||  || W 5 Q I d H R X  I d H   I d H  d S )Ni   r!   r   c                    s   t  } | I d H  d S N)	bytearrayr%   )big)countr   r   r   senderS   s    z#test_pipes_combined.<locals>.senderc                    sB   t  I d H  d} |  k r2| tdI d H 7 } q|  ks>td S )Nr   i   )r	   lenr*   r$   )Zreceived)r0   r&   r   r   readerW   s
    z#test_pipes_combined.<locals>.reader)r   r   open_nursery
start_soonaclose)r1   r3   nr   )r0   r&   r   r   test_pipes_combinedO   s    
r8   c               
     s   t t td  W 5 Q R X t \} }t| t| 4 I d H 0}t jtdd |dI d H  W 5 Q R X W 5 Q I d H R X d S )Nz ^max_bytes must be integer >= 1$matchr   )	pytestraises	TypeErrorr   r   r   r'   
ValueErrorr*   )r   r   r   r   r   r   test_pipe_errorsg   s    
r?   c               	     s   t  I d H \} }|  |  }}~ ~t  tjtdd}t| W 5 Q R X |jj	t	j
ksbttjtdd}t| W 5 Q R X |jj	t	j
kstd S )NBad file descriptor$r9   )r   r   r   r;   r<   OSErrorr   r'   valueerrnoEBADFr$   )r   r   f1f2excinfor   r   r   test_delr   s    rH   c                    s   t  I d H \} }| 4 I d H $ |4 I d H  W 5 Q I d H R X W 5 Q I d H R X |  dks\t| dkslttjtdd}t|   W 5 Q R X |jj	t	j
ksttjtdd}t|  W 5 Q R X |jj	t	j
kstd S )Nr@   r9   )r   r   r$   r;   r<   rA   r   r'   rB   rC   rD   )r   r   rG   r   r   r   test_async_with   s     rJ   c                    s  t  I d H \} }| }|  I d H  | I d H  t \}}||kr^t|| t| t|4 I d H    |kstdd fdd}t	
 4 I d H @}|| t I d H  | I d H  t I d H  t| W 5 Q I d H R X W 5 Q I d H R X d S )Nr!   r   c                     s     dI d H dkstd S )N
       )r*   r$   r   Zr2r   r   
expect_eof   s    z6test_misdirected_aclose_regression.<locals>.expect_eof)r   r   r6   r   r   dup2r'   r   r$   r   r4   r5   r	   )r   r   Zold_r_fdZr2_fdZw2_fdrN   nurseryr   rM   r   "test_misdirected_aclose_regression   s"    

rQ   zpytest.MonkeyPatch)monkeypatchr   c                   s   ddfdd}t jjj dd fdd}| t jjd| t I d H \}|4 I d H l 4 I d H N t  4 I d H ,}|| t I d H  |	dI d H  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 )	Nr!   r   c                	     s,   t tj  dI d H  W 5 Q R X d S )NrK   )r;   r<   r   ClosedResourceErrorr*   r   )r   r   r   expect_closedresourceerror   s    zKtest_close_at_bad_time_for_receive_some.<locals>.expect_closedresourceerrorc                    s"    | |I d H    I d H  d S r-   r6   argskwargsZorig_wait_readabler   r   r   patched_wait_readable   s    zFtest_close_at_bad_time_for_receive_some.<locals>.patched_wait_readablewait_readabler   )
r   _runTheIOManagerr[   setattrr   r4   r5   r	   r%   )rR   rT   rZ   r   rP   r   rY   r   'test_close_at_bad_time_for_receive_some   s    


r_   c                   s   ddfdd}t jjj dd fdd}| t jjd| t I d H \}4 I d H  |4 I d H d t  4 I d H B}|| t I d H  |	dI d H }|r|	dI d H }qW 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 )	Nr!   r   c                	     s,   t tj  dI d H  W 5 Q R X d S )Nsd   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)r;   r<   r   rS   r%   r   )r   r   r   rT      s    zGtest_close_at_bad_time_for_send_all.<locals>.expect_closedresourceerrorc                    s"    | |I d H    I d H  d S r-   rU   rV   Zorig_wait_writabler   r   r   patched_wait_writable   s    zBtest_close_at_bad_time_for_send_all.<locals>.patched_wait_writablewait_writablei'  )
r   r\   r]   rb   r^   r    r4   r5   r	   r*   )rR   rT   ra   r   rP   Zreceived_datar   r`   r   #test_close_at_bad_time_for_send_all   s    

rc   Zfreebsdz7no way to make read() return a bizarro error on FreeBSDc                    s   t  I d H \} }| 4 I d H ~ |4 I d H ` tdtjd}z<t||  tt	j
 |dI d H  W 5 Q R X W 5 t| X W 5 Q I d H R X W 5 Q I d H R X d S )N/r   rK   )r   r   openO_DIRECTORYr'   rO   r   r;   r<   r   ZBrokenResourceErrorr*   )r   r   dir_fdr   r   r   !test_bizarro_OSError_from_receive  s    rh   c                     s   t ttI d H  d S r-   )r   r   r    r   r   r   r   test_pipe_fully  s    ri   )*
__future__r   rC   r   r   systypingr   r;    r   Z_core._tests.tutilr   r   Ztestingr   r	   namer
   markZskipifZ
pytestmarkplatformr$   Z_unix_pipesr   r<   ImportErrorr   r    r)   r,   r8   r?   rH   rJ   rQ   r_   rc   
startswithrh   ri   r   r   r   r   <module>   sD   


&+
