U
    g\                     @  s   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Zd dlm	Z	 d dl
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 d dlZd dlZd dlmZmZ d	d
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d	dl%m&Z&m'Z' d	dl(m)Z) d	dl*m+Z+m,Z,m-Z- er0d dl.m/Z/ d dl0m1Z1 d	dl2m3Z3 ej4dkrJdZ5de6d< neZ5de6d< de6d< de6d< de6d< ej7dkZ8ese8sej4dkrd dlm9Z9m:Z:m;Z; n
d\Z9Z:Z;dddddZ<e<dZ=e<d Z>e<d!Z?e8rd"dd#d$d%Z@nd"dd#d&d%Z@d'dd(d)d*d+ZAe	d,d,d-d.d/d0ZBe	d,d,d-d.d1d2ZCejDjEd3eBeCgd4d5gd6ZFed7ee f ZGde6d8< eFd8d9d:d;d<ZHeFd8d9d:d=d>ZIeFd8d9d:d?d@ZJe<dAZKeFd8d9d:dBdCZLeFd8d9d:dDdEZMd9dFdGdHZNd9dFdIdJZOe&d9dFdKdLZPeFd8d9d:dMdNZQd9dFdOdPZReFd8d9d:dQdRZSejDjTe8 dSdTeFd8d9d:dUdVZUe'd9dFdWdXZVd9dFdYdZZWd9dFd[d\ZXd]d9d^d_d`ZYejDjTe8 dadTdbd]d9dcdddeZZd9dFdfdgZ[ejDjTedh\  didTd9dFdjdkZ]d]d9d^dldmZ^d9dFdndoZ_dS )p    )annotationsN)asynccontextmanager)partial)Path)Signals)TYPE_CHECKINGAnyAsyncContextManagerAsyncIteratorCallableNoReturn)MatcherRaisesGroup   )EventProcess_core
fail_aftermove_on_afterrun_processsleepsleep_forever)skip_if_fbsd_pipes_brokenslow)open_process)	MockClockassert_no_checkpointswait_all_tasks_blocked)	FrameType)	TypeAlias)ReceiveStreamwin32r   
SignalTypeSIGKILLSIGTERMSIGUSR1posix)r#   r$   r%   )NNNstrz	list[str])codereturnc                 C  s   t jddd|  gS )Nz-u-czimport sys; )sys
executable)r(    r-   ?/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_subprocess.pypythonC   s    r/   zsys.exit(0)zsys.exit(1)z0sys.stdout.buffer.write(sys.stdin.buffer.read())int)secondsr)   c                 C  s   dt | gS )Nr   )r'   r1   r-   r-   r.   SLEEPM   s    r3   c                 C  s   t d|  dS )Nzimport time; time.sleep())r/   r2   r-   r-   r.   r3   R   s    r   bool)procsigr)   c                 C  s,   t ststjdkr| j| kS | jdkS d S )Nr!   r   )r   r&   r+   platform
returncode)r6   r7   r-   r-   r.   
got_signalV   s    r:   r   zAsyncIterator[Process]argskwargsr)   c                  O s8   t | |I d H }z
|V  W 5 |  | I d H  X d S N)r   killwait)r<   r=   r6   r-   r-   r.   open_process_then_kill]   s
    
rA   c               
   O s^   t  4 I d H >}|dd |ttf| |I d H }|V  |j  W 5 Q I d H R X d S )NcheckF)r   open_nursery
setdefaultstartr   r   cancel_scopecancel)r<   r=   nurseryr6   r-   r-   r.   run_process_in_nurseryg   s
    rI   background_processr   zrun_process in nursery)ids.BackgroundProcessTypeNone)rJ   r)   c              
     s   | t 4 I d H }| I d H  W 5 Q I d H R X t|ts>t|jd ksLt|jdksZtt|dt  dksrt| t4 I d H }| I d H  W 5 Q I d H R X |jdkstt|d	tdkstd S )Nr   z<trio.Process z: exited with status 0>   z<trio.Process {!r}: {}>zexited with status 1)
	EXIT_TRUEr@   
isinstancer   AssertionError_pidfdr9   repr
EXIT_FALSEformat)rJ   r6   r-   r-   r.   
test_basicy   s    
rV   c              
     s   | t d4 I d H p}|jd ks$tdt|ks4t|  |j  |jd k	sTtdt|ksdt|jd ksrt|jd k	stW 5 Q I d H R X d S )N'  ZrunningZexited)r3   r9   rQ   rS   r?   _procr@   rR   )rJ   pr-   r-   r.   test_auto_update_returncode   s    
rZ   c                   s   | t d4 I d H }t 4 I d H @}||j ||j ||j t I d H  |j  W 5 Q I d H R X t 4 I d H >}||j ||j ||j t I d H  |  W 5 Q I d H R X W 5 Q I d H R X d S )N
   )	r3   r   rC   
start_soonr@   r   rF   rG   r?   )rJ   r6   rH   r-   r-   r.   test_multi_wait   s    r]   zbdata = sys.stdin.buffer.read(); sys.stdout.buffer.write(data); sys.stderr.buffer.write(data[::-1])c                   s  | t tjtjtjd4 I d H ԉd dd fdd}dddd	d
d}jd k	sXtjd k	sftt 4 I d H J}t d |j	_
|| ||j  ||j d d d  W 5 Q I d H R X |j	jrt I d H dkstW 5 Q I d H R X d S )Nstdinstdoutstderrs+   the quick brown fox jumps over the lazy dogrM   r)   c                     s4   j d k	stj  I d H  j  I d H  d S r>   )r_   rQ   send_allacloser-   msgr6   r-   r.   
feed_input   s    ztest_pipes.<locals>.feed_inputr    bytes)streamexpectedr)   c                   s2   t  }| 2 z3 d H W }||7 }q
6 ||ks.td S r>   )	bytearrayrQ   )ri   rj   seenchunkr-   r-   r.   check_output   s    z test_pipes.<locals>.check_outputg      >@r   )+COPY_STDIN_TO_STDOUT_AND_BACKWARD_TO_STDERR
subprocessPIPEr`   rQ   ra   r   rC   current_timerF   deadliner\   cancelled_caughtr@   )rJ   rg   rn   rH   r-   re   r.   
test_pipes   s&    
*rv   c                   s  | t dtjtjtjd4 I d H Ήtr.dnd dddd fdd	}jd k	sXtjd k	sftjd k	stttd
j j	dI d H  t
dI d H  j	d  I d H  |ddI d H  j	d  d   I d H  |ddI d H  |ddI d H  j	d  I d H  |ddI d H  j	dI d H  td}|ddI d H  W 5 Q R X |jsltj	 I d H  |ddI d H  j I d H  jdI d H dkstjdI d H dkst I d H  W 5 Q R X W 5 Q I d H R X jdkstd S )Nzidx = 0
while True:
    line = sys.stdin.readline()
    if line == '': break
    request = int(line.strip())
    print(str(idx * 2) * request)
    print(str(idx * 2 + 1) * request * 2, file=sys.stderr)
    idx += 1
r^      
s   
r0   rM   )idxrequestr)   c              
     s   t  4 I d H n}ddddd fdd}jd k	s8tjd k	sFt||j|| d  ||j|d | d d  W 5 Q I d H R X d S )	Nr    r0   rM   )ri   countdigitr)   c                   sl   |dkr@|  |I d H }||  t| ks2t|t|8 }q |dksLt|  t I d H  kshtd S )Nr   )receive_someencodelenrQ   )ri   rz   r{   result)newliner-   r.   	drain_one   s    z3test_interactive.<locals>.expect.<locals>.drain_oner   rN   )r   rC   r`   rQ   ra   r\   )rx   ry   rH   r   r   r6   r-   r.   expect   s    z test_interactive.<locals>.expect   s   12g?s   345r   i90  s   100s   200rN   d   r         0   s   999999   i?B     )r/   rq   rr   r&   r_   rQ   r`   ra   r   rc   r   r   ru   rd   r|   r@   r9   )rJ   r   scoper-   r   r.   test_interactive   sF    

(r   rb   c               	     s*  t dd tdD } tt| dddI d H }|jtks:t|jdksHt|j| ksVt|jdksdtttddI d H }|jtkst|jdkst|jdkst|jd ksttt	| dddI d H }|jt	kst|jdkst|j| kst|j| d d d	 kstt
t ttd
dI d H  W 5 Q R X d}t
jt|d tttjdI d H  W 5 Q R X t
jt|d tttjdI d H  W 5 Q R X t
jt|dddd tttjdI d H  W 5 Q R X t
jtdd ttdtjdI d H  W 5 Q R X t
jtdd ttdd dI d H  W 5 Q R X d S )Nc                 s  s   | ]}t d dV  qdS )r      N)randomrandint).0_r-   r-   r.   	<genexpr>&  s     ztest_run.<locals>.<genexpr>i   T)r_   capture_stdoutcapture_stderrr   r   r   ro   zoh no, it's textr_   z^stdout=subprocess\.PIPE is only valid with nursery\.start, since that's the only way to access the pipe(; use nursery\.start or pass the data you want to write directly)*$match)r`   r`   ra   rN   )ra   z.^can't specify both stdout and capture_stdout$)r   r`   z.^can't specify both stderr and capture_stderr$)r   ra   )rh   ranger   CATr<   rQ   r9   r`   ra   rp   pytestraisesUnicodeError
ValueErrorrq   rr   replaceDEVNULL)datar   Zpipe_stdout_errorr-   r-   r.   test_run%  s`     r   c               	     s   t d} ttj}t| tjddI d H  W 5 Q R X |jj| ksFt	|jj
dksVt	|jjdksft	|jjd ksvt	t| ddddI d H }|j| kst	|jdkst	|jdkst	|j
dkst	d S )	Nz/sys.stderr.buffer.write(b'test\n'); sys.exit(1)T)r_   r   rN   s   test
F)r   r   rB   r   )r/   r   r   rq   CalledProcessErrorr   r   valuecmdrQ   r9   ra   r`   r<   )r   excinfor   r-   r-   r.   test_run_check^  s"     r   c                    sN   t tjddgdd dI d H } | jdks,t| j| j  krDd ksJn td S )Nr*   zimport sys; sys.stdin.close()   xi   r   r   )r   r+   r,   r9   rQ   r`   ra   )r   r-   r-   r.   test_run_with_broken_pipes  s    
r   c              
     s|  | t tjtjtjd4 I d H }|jd k	s.t|jd k	s<t|jd ksJt|jdI d H  |j	 I d H  g }|j
dI d H }|dkrq|| qpd|dkstW 5 Q I d H R X |jdksttt ddtjdI d H }|jdkst|jdkst|jd kst| ttjtjd	4 I d H D}|jd ks8t|jd ksHt|j I d H  | I d H  W 5 Q I d H R X |jdksttrxzt \}}| t tj|tjd4 I d H }t| |jd kst|jd kst|jd kst|jdI d H  |j I d H  | I d H dks,tt|d
dksBtt|d
dksXtW 5 Q I d H R X W 5 t| X d S )Nr^   s   1234   r   s   12344321r   T)r_   r   ra   )r_   ra   i   )rp   rq   rr   STDOUTZstdiorQ   r`   ra   rc   Zsend_eofr|   appendjoinr9   r   r   r_   rd   r@   r&   osclosepiperead)rJ   r6   outputrm   r   rwr-   r-   r.   test_stderr_stdout}  sv    "
*r   c               	     s   t t} tdgddI d H  W 5 Q R X dt| jks<tdt| jksNttrt t} tdgddI d H  W 5 Q R X t t} tdddI d H  W 5 Q R X d S )	NZlszutf-8)encodingzunbuffered byte streamsz&the 'encoding' option is not supportedT)shellF)r   r   	TypeErrorr   r'   r   rQ   r&   )r   r-   r-   r.   test_errors  s    r   c                   sd   dddd fdd}|t jtI d H  |t jtI d H  tsBtsLtjdkr`|dd	 t	I d H  d S )
NzCallable[[Process], None]zsignal.Signals | NonerM   )send_itsignumr)   c                   s   t dB} td4 I d H }| | | I d H  W 5 Q I d H R X W 5 Q R X |jrZttr||d k	sjt|j| kstn|jdkstd S )N      ?  r   )r   r3   r@   ru   rQ   r&   r9   )r   r   r   r6   rJ   r-   r.   test_one_signal  s    
(
z%test_signals.<locals>.test_one_signalr!   c                 S  s
   |  tS r>   )send_signalr%   r6   r-   r-   r.   <lambda>  r   ztest_signals.<locals>.<lambda>)
r   r?   r#   	terminater$   r   r&   r+   r8   r%   )rJ   r   r-   r   r.   test_signals  s
    r   zPOSIX specific)reasonc                   s   t rtjdkrd S ttjtj}z| td4 I d H r}t 4 I d H 6}|	|j
 t I d H  |  t d |j_W 5 Q I d H R X |jjrt|jdkstW 5 Q I d H R X W 5 ttj| X d S )Nr!   r   r   r   )r   r+   r8   signalSIGCHLDSIG_IGNr3   r   rC   r\   r@   r   r?   rs   rF   rt   ru   rQ   r9   )rJ   Zold_sigchldr6   rH   r-   r-   r.   test_wait_reapable_fails  s     "r   c               
     s   ddl m}  tr(tjdks$tjdkr(d S | jds>td ddl	m
} d td	d
gdddd fdd}ttj|}z,td |j jdddkstW 5 jd krʈ    ttj| X d S )Nr   )wait_child_exitingr!   darwinwaitidzwaitid only)sync_wait_reapableFr   Z3600r0   zFrameType | NonerM   )r7   framer)   c                   s   d    d S NT)r?   )r7   r   Z	got_alarmZsleeperr-   r.   on_alarm  s    z#test_waitid_eintr.<locals>.on_alarmrN   )timeouti)Z_subprocess_platformr   r   r+   r8   
__module__endswithr   skipZ_subprocess_platform.waitidr   rq   Popenr   SIGALRMr9   r?   r@   alarmpidrQ   )r   r   r   Zold_sigalrmr-   r   r.   test_waitid_eintr  s$    



r   c               
     st   d ddd fdd} t  4 I d H 4}|tttd| d t I d H  |j  W 5 Q I d H R X  spt	d S )	NFr   rM   r6   r)   c                   s2   d |    zt I d H  W 5 | jd k	s,tX d S r   )r   r9   rQ   r   r   Zcustom_deliver_cancel_calledr-   r.   custom_deliver_cancel1  s
    z9test_custom_deliver_cancel.<locals>.custom_deliver_cancelrW   Zdeliver_cancel)
r   rC   r\   r   r   r3   r   rF   rG   rQ   )r   rH   r-   r   r.   test_custom_deliver_cancel.  s    r   c               	     sR   ddddd dd fdd} t t ttd	 tj| d
d W 5 Q R X d S )Nr   rM   r   c                   s   |    tdd S )NZfoo)r   r   r   r-   r-   r.   r   G  s    z6test_bad_deliver_cancel.<locals>.custom_deliver_cancelrb   c               
     sT   t  4 I d H 4} | tttd d t I d H  | j  W 5 Q I d H R X d S )NrW   r   )	r   rC   r\   r   r   r3   r   rF   rG   )rH   r   r-   r.   do_stuffK  s    z)test_bad_deliver_cancel.<locals>.do_stuffz^foo$T)Zstrict_exception_groups)r   r   r   r   run)r   r-   r   r.   test_bad_deliver_cancelF  s    	r   zpytest.MonkeyPatch)monkeypatchr)   c                   s   t j ddd fdd}| t d| tjtddN t 4 I d H ,}|t	t
d	 t I d H  |j  W 5 Q I d H R X W 5 Q R X d S )
Nr   r   )selfr)   c                   s    |  t dd S )NZwhoops)OSError)r   Zoriginal_terminater-   r.   broken_terminate[  s    z>test_warn_on_failed_cancel_terminate.<locals>.broken_terminater   z
.*whoops.*r   rW   )r   r   setattrr   warnsRuntimeWarningr   rC   r\   r   r3   r   rF   rG   )r   r   rH   r-   r   r.   $test_warn_on_failed_cancel_terminateX  s    r   z
posix onlyr   )autojump_clockr   r)   c                   sx   | tddd  tjtddN t 4 I d H ,}|tt	d t
 I d H  |j  W 5 Q I d H R X W 5 Q R X d S )Nr   c                  W  s   d S r>   r-   )r<   r-   r-   r.   r   m  r   z8test_warn_on_cancel_SIGKILL_escalation.<locals>.<lambda>z.*ignored SIGTERM.*r   rW   )r   r   r   r   r   r   rC   r\   r   r3   r   rF   rG   )r   r   rH   r-   r-   r.   &test_warn_on_cancel_SIGKILL_escalationh  s    r   c                    s\   t tj: t 4 I d H } | ttI d H }W 5 Q I d H R X W 5 Q R X |jdksXt	d S )NrN   )
r   rq   r   r   rC   rE   r   rT   r9   rQ   )rH   r6   r-   r-   r.    test_run_process_background_failx  s    ,r   /dev/fdz,requires a way to iterate through open filesc               	     s   t   ttd } ttI d H  ttd | ks>tt	t
j ttI d H  W 5 Q R X ttd | ks|tt	t tdgI d H  W 5 Q R X ttd | kstd S )Nr   z	/dev/fd/0)gcZcollectsetSyncPathiterdirr   rO   rQ   r   r   rq   r   rT   PermissionError)Zstarting_fdsr-   r-   r.   test_for_leaking_fds  s    r   c              	     sN   dddddd}|  tjd| ttt ttddI d H  W 5 Q R X d S )	Nobjectr'   r;   c                    s   dS )NZoopsr-   )r<   r=   r-   r-   r.   very_broken_open  s    z9test_run_process_internal_error.<locals>.very_broken_openr   Tr   )r   trioZ_subprocessr   AttributeErrorr   rO   )r   r   r-   r-   r.   test_run_process_internal_error  s    r   c               
     s   d  ddd fdd} t tdI d H }t 4 I d H }|| | t I d H  t tsbt|	  t
  |j  |  W 5 Q R X td   I d H  W 5 Q R X   stdW 5 Q I d H R X d S )	Nr   rM   r   c                   s    t   |  I d H     d S r>   )r   r@   r   r   Znoticed_exitr-   r.   wait_and_tell  s    z7test_subprocess_pidfd_unnotified.<locals>.wait_and_tellrW   r   z,child task wasn't woken after poll, DEADLOCK)r   r3   r   rC   r\   r   rP   r   rQ   r   r   rX   r@   pollr   is_set)r   r6   rH   r-   r   r.    test_subprocess_pidfd_unnotified  s    

r   )`
__future__r   r   r   r   r   rq   r+   
contextlibr   	functoolsr   pathlibr   r   r   typingr   r   r	   r
   r   r   r   r   Ztrio.testingr   r    r   r   r   r   r   r   r   r   Z_core._tests.tutilr   r   Zlowlevelr   Ztestingr   r   r   typesr   Ztyping_extensionsr   _abcr    r8   r"   __annotations__namer&   r#   r$   r%   r/   rO   rT   r   r3   r:   rA   rI   markZparametrizeZbackground_process_paramrL   rV   rZ   r]   rp   rv   r   r   r   r   r   r   r   Zskipifr   r   r   r   r   r   r   existsr   r   r   r-   r-   r-   r.   <module>   s     	(


	"L9	E(