o
    ACeY                     @  sr  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 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mZmZ d
dlmZmZmZmZm Z m!Z!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,m-Z-m.Z.m/Z/ erd dl0m1Z1 ej2dkrdZ3de4d< neZ3de4d< de4d< de4d< de4d< ej5dkZ6ese6sej2dkrd dlm7Z7m8Z8m9Z9 nd\Z7Z8Z9dsddZ:e:d Z;e:d!Z<e:d"Z=e6rdtd%d&Z>ndtd'd&Z>dud,d-Z?edvd2d3Z@edvd4d5ZAejBjCd6e@eAgd7d8gd9ZDed:ee f ZEde4d;< eDdwd=d>ZFeDdwd?d@ZGeDdwdAdBZHdxdEdFZIdxdGdHZJe:dIZKeDdwdJdKZLeDdwdLdMZMdydNdOZNdydPdQZOe(dydRdSZPeDdwdTdUZQdydVdWZReDdwdXdYZSejBjTe6 dZd[eDdwd\d]ZUe)dyd^d_ZVdyd`daZWdzdddeZXejBjTe6 dfd[d{didjZYdydkdlZZejBjTedm[  dnd[dydodpZ\dydqdrZ]dS )|    )annotationsN)asynccontextmanager)partial)Path)Signals)	FrameType)TYPE_CHECKINGAnyAsyncContextManagerAsyncIteratorCallableNoReturn)MonkeyPatchWarningsRecorder   )	ClosedResourceErrorEventProcess_core
fail_aftermove_on_afterrun_processsleepsleep_forever)Stream)skip_if_fbsd_pipes_brokenslow)open_process)	MockClockassert_no_checkpointswait_all_tasks_blocked)	TypeAliaswin32r!   
SignalTypeSIGKILLSIGTERMSIGUSR1posix)r$   r%   r&   )NNNcodestrreturn	list[str]c                 C  s   t jddd|  gS )Nz-u-czimport sys; )sys
executable)r(    r/   ?usr/lib/python3.10/site-packages/trio/_tests/test_subprocess.pypython?   s   r1   zsys.exit(0)zsys.exit(1)z0sys.stdout.buffer.write(sys.stdin.buffer.read())secondsintc                 C  s   dt | gS )Nz
/bin/sleep)r)   r2   r/   r/   r0   SLEEPI   s   r5   c                 C  s   t d|  dS )Nzimport time; time.sleep())r1   r4   r/   r/   r0   r5   N   s   procr   sigboolc                 C  s(   t sts	tjdkr| j| kS | jdkS )Nr"   r   )r   r'   r-   platform
returncode)r7   r8   r/   r/   r0   
got_signalR   s   
r<   argsr	   kwargsAsyncIterator[Process]c                  O sR   t | i |I d H }z|V  W |  | I d H  d S |  | I d H  w N)r   killwait)r=   r>   r7   r/   r/   r0   open_process_then_killY   s   rC   c               	   O s   t  4 I d H +}|dd |ttg| R i |I d H }|V  |j  W d   I d H  d S 1 I d H s:w   Y  d S )NcheckF)r   open_nursery
setdefaultstartr   r   cancel_scopecancel)r=   r>   nurseryr7   r/   r/   r0   run_process_in_nurseryc   s   ".rK   background_processr   zrun_process in nursery)Zids.BackgroundProcessTypeNonec              	     s  | t 4 I d H }| I d H  W d   I d H  n1 I d H s!w   Y  t|ts-J |jd u s4J |jdks;J t|dt  dksGJ | t4 I d H }| I d H  W d   I d H  n1 I d H sgw   Y  |jdkssJ t|dtdksJ d S )Nr   z<trio.Process z: exited with status 0>   <trio.Process {!r}: {}>exited with status 1)		EXIT_TRUErB   
isinstancer   _pidfdr;   repr
EXIT_FALSEformat)rL   r7   r/   r/   r0   
test_basicu   s   ((
rX   c              	     s   | t d4 I d H A}|jd u sJ dt|v sJ |  |j  |jd us+J dt|v s3J |jd u s:J |jd usAJ W d   I d H  d S 1 I d H sRw   Y  d S )N'  ZrunningZexited)r5   r;   rU   rA   _procrB   rT   )rL   pr/   r/   r0   test_auto_update_returncode   s   
.r\   c              
     s2  | t d4 I d H }t 4 I d H (}||j ||j ||j t I d H  |j  W d   I d H  n1 I d H sBw   Y  t 4 I d H '}||j ||j ||j t I d H  |  W d   I d H  n1 I d H s|w   Y  W d   I d H  d S 1 I d H sw   Y  d S )N
   )	r5   r   rE   
start_soonrB   r    rH   rI   rA   )rL   r7   rJ   r/   r/   r0   test_multi_wait   s"   (
*.r_   recwarnr   c              	     s   t ttjtjdI d H 4 I d H }W d   I d H  n1 I d H s"w   Y  |jd us.J |jd us5J |jd us<J tt	 |j
dI d H  W d    n1 sUw   Y  tt	 |j I d H  W d    d S 1 ssw   Y  d S )N)stdinstdout   x)r   CAT
subprocessPIPEr;   ra   rb   pytestraisesr   send_allreceive_some)r`   r7   r/   r/   r0   !test_async_with_basics_deprecated   s    
("rk   c              
     s   t d=}ttdI d H 4 I d H }| d u sJ |  t I d H  W d   I d H  n1 I d H s6w   Y  W d    n1 sEw   Y  |jsOJ t|tsVJ t	|d
tdtrbdndkshJ d S )Nd   r]   rP   zexited with signal 9rQ   )r   r   r5   pollrI   r   cancelled_caughtr<   r$   rU   rW   r'   )r`   scoper7   r/   r/   r0    test_kill_when_context_cancelled   s   
(

rp   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 ld d fdd}ddd}t 4 I d H -}t d |j_|| ||j	  ||j
 d d d  W d   I d H  n1 I d H s[w   Y  |jjrfJ  I d H dksqJ W d   I d H  d S 1 I d H sw   Y  d S )Nra   rb   stderrs+   the quick brown fox jumps over the lazy dogr*   rN   c                     s6   j d usJ j  I d H  j  I d H  d S r@   )ra   ri   acloser/   msgr7   r/   r0   
feed_input   s   ztest_pipes.<locals>.feed_inputstreamr   expectedbytesc                   s4   t  }| 2 z
3 d H W }||7 }q6 ||ksJ d S r@   )	bytearray)rw   rx   seenchunkr/   r/   r0   check_output   s   
z test_pipes.<locals>.check_outputg      >@r   r*   rN   )rw   r   rx   ry   r*   rN   )+COPY_STDIN_TO_STDOUT_AND_BACKWARD_TO_STDERRre   rf   r   rE   current_timerH   deadliner^   rb   rr   rn   rB   )rL   rv   r}   rJ   r/   rt   r0   
test_pipes   s(   

(.r   c              
     sF  | t dtjtjtjd4 I d H trdnd d fd
d}jd us(J jd us/J jd us6J td 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 d    n1 sw   Y  |jsJ j I d H  |ddI d H  j I d H  jdI d H dksJ jdI d H dksJ  I d H  W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  jdks!J 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
rq      
s   
idxr3   requestr*   rN   c              	     s   t  4 I d H -}d fdd	}||j|| d
  ||j|d
 | d
 d  W d   I d H  d S 1 I d H s<w   Y  d S )Nrw   r   countr3   digitr*   rN   c                   st   |dkr$|  |I d H }||  t| ksJ |t|8 }|dks|dks*J |  t I d H  ks8J d S )Nr   )rj   encodelen)rw   r   r   result)newliner/   r0   	drain_one  s    z3test_interactive.<locals>.expect.<locals>.drain_oner   rO   )rw   r   r   r3   r   r3   r*   rN   )r   rE   r^   rb   rr   )r   r   rJ   r   r   r7   r/   r0   expect  s    .z test_interactive.<locals>.expect   s   12g?s   345r   i90  s   100s   200rO   rl   r         0   s   999999   i?B     )r   r3   r   r3   r*   rN   )r1   re   rf   r'   ra   rb   rr   r   ri   r   r   rn   rs   rj   rB   r;   )rL   r   ro   r/   r   r0   test_interactive   sN   



*7r   c                    s  t dd tdD } tt| dddI d H }|jtksJ |jdks%J |j| ks,J |jdks3J ttddI d H }|jtksCJ |jdksJJ |jdksQJ |jd u sXJ tt| dddI d H }|jtksjJ |jdksqJ |j| ksxJ |j| d d d	 ksJ t	
t ttd
dI d H  W d    n1 sw   Y  t	
t tttjdI d H  W d    n1 sw   Y  t	
t tttjdI d H  W d    n1 sw   Y  t	
t tttjdI d H  W d    n1 sw   Y  t	
t ttdtjdI d H  W d    n	1 sw   Y  t	
t ttdd dI d H  W d    d S 1 s<w   Y  d S )Nc                 s  s    | ]	}t d dV  qdS )r      N)randomrandint).0_r/   r/   r0   	<genexpr>5  s    ztest_run.<locals>.<genexpr>i   T)ra   capture_stdoutcapture_stderrr   r   )r   r~   zoh no, it's textra   )rb   )rr   )r   rb   )r   rr   )ry   ranger   rd   r=   r;   rb   rr   r   rg   rh   UnicodeError
ValueErrorre   rf   DEVNULL)datar   r/   r/   r0   test_run4  sT   $r   c                    s   t d} ttj}t| tjddI d H  W d    n1 s!w   Y  |jj| ks.J |jj	dks6J |jj
dks>J |jjd u sFJ t| ddddI d H }|j| ksXJ |jdks_J |j
dksfJ |j	dksmJ d S )	Nz/sys.stderr.buffer.write(b'test\n'); sys.exit(1)T)ra   r   rO   s   test
F)r   r   rD   r   )r1   rg   rh   re   CalledProcessErrorr   r   valuecmdr;   rr   rb   r=   )r   excinfor   r/   r/   r0   test_run_check_  s    r   c                    sR   t tjddgdd dI d H } | jdksJ | j| j  u r$d u s'J  J d S )Nr,   zimport sys; sys.stdin.close()rc   i   r   r   )r   r-   r.   r;   rb   rr   )r   r/   r/   r0   test_run_with_broken_pipeq  s   $r   c              	     s  | t tjtjtjd4 I d H Q}|jd usJ |jd usJ |jd u s&J |jdI d H  |j I d H  g }	 |j	dI d H }|dkrHn|
| q:d|dksWJ W d   I d H  n1 I d H sgw   Y  |jdkssJ tt ddtjdI d H }|jdksJ |jdksJ |jd u sJ | ttjtjd	4 I d H (}|jd u sJ |jd u sJ |j I d H  | I d H  W d   I d H  n1 I d H sw   Y  |jdksJ trpzt \}}| t tj|tjd4 I d H [}t| |jd u sJ |jd u s	J |jd u sJ |jdI d H  |j I d H  | I d H dks.J t|d
dks9J t|d
dksDJ W d   I d H  n1 I d H sUw   Y  W t| d S W t| d S t| w d S )Nrq   s   1234T   r   s   12344321r   )ra   r   rr   )ra   rr   i   )r   re   rf   STDOUTZstdiorb   rr   ri   Zsend_eofrj   appendjoinr;   r   rd   ra   rs   rB   r'   ospipecloseread)rL   r7   outputr|   r   rwr/   r/   r0   test_stderr_stdoutz  s   
(
(
,r   c                    s   t t} tdgddI d H  W d    n1 sw   Y  dt| jv s)J dt| jv s2J trtt t} tdgddI d H  W d    n1 sNw   Y  t t} tdddI d H  W d    d S 1 smw   Y  d S d S )	NZlszutf-8)encodingzunbuffered byte streamsz&the 'encoding' option is not supportedT)shellF)rg   rh   	TypeErrorr   r)   r   r'   )r   r/   r/   r0   test_errors  s   "r   c                   sb   d fdd}|t jtI d H  |t jtI d H  tsts#tjd	kr/|d
d t	I d H  d S d S )Nsend_itCallable[[Process], None]signumsignal.Signals | Noner*   rN   c              
     s   t d3} td4 I d H }| | | I d H  W d   I d H  n1 I d H s,w   Y  W d    n1 s;w   Y  |jrEJ trW|d usMJ |j| ksUJ d S |jdks^J d S )N      ?  r   )r   r5   rB   rn   r'   r;   )r   r   ro   r7   rL   r/   r0   test_one_signal  s   
(
z%test_signals.<locals>.test_one_signalr"   c                 S  s
   |  tS r@   )send_signalr&   r7   r/   r/   r0   <lambda>  s   
 ztest_signals.<locals>.<lambda>)r   r   r   r   r*   rN   )
r   rA   r$   	terminater%   r   r'   r-   r:   r&   )rL   r   r/   r   r0   test_signals  s   r   zPOSIX specific)reasonc              
     s$  t r
tjdkr
d S ttjtj}zw| td4 I d H N}t 4 I d H #}|	|j
 t I d H  |  t d |j_W d   I d H  n1 I d H sOw   Y  |jjrZJ |jdksaJ W d   I d H  n1 I d H sqw   Y  W ttj| d S W ttj| d S ttj| w )Nr"   r   r   r   )r   r-   r:   signalSIGCHLDSIG_IGNr5   r   rE   r^   rB   r    rA   r   rH   r   rn   r;   )rL   Zold_sigchldr7   rJ   r/   r/   r0   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 fdd}ttj|}z+td |j jdddksRJ W jd u r`    ttj| d S jd u rv    ttj| w )Nr   )wait_child_exitingr"   darwinwaitidzwaitid only)sync_wait_reapableFr   Z3600r8   r3   frameFrameType | Noner*   rN   c                   s   d    d S NT)rA   )r8   r   Z	got_alarmZsleeperr/   r0   on_alarm  s   z#test_waitid_eintr.<locals>.on_alarmrO   )timeouti)r8   r3   r   r   r*   rN   )Z_subprocess_platformr   r   r-   r:   
__module__endswithrg   skipZ_subprocess_platform.waitidr   re   Popenr   SIGALRMalarmpidrB   r;   rA   )r   r   r   Zold_sigalrmr/   r   r0   test_waitid_eintr  s,   




r   c               	     s   d d
 fdd} t  4 I d H "}|tttd| d	 t I d H  |j  W d   I d H  n1 I d H s:w   Y   sCJ d S )NFr7   r   r*   rN   c                   s@   d |    zt I d H  W | jd usJ d S | jd usJ w r   )r   r   r;   r   Zcustom_deliver_cancel_calledr/   r0   custom_deliver_cancel+  s   "z9test_custom_deliver_cancel.<locals>.custom_deliver_cancelrY   )Zdeliver_cancelr7   r   r*   rN   )	r   rE   r^   r   r   r5   r    rH   rI   )r   rJ   r/   r   r0   test_custom_deliver_cancel(  s   (r   monkeypatchr   c              
     s   t j d fdd}| t d| tjtdd	B t 4 I d H }|t	t
d
 t I d H  |j  W d   I d H  n1 I d H sFw   Y  W d    d S W d    d S 1 s^w   Y  d S )Nselfr   r*   r   c                   s    |  t d)NZwhoops)OSError)r   Zoriginal_terminater/   r0   broken_terminateC  s   z>test_warn_on_failed_cancel_terminate.<locals>.broken_terminater   z
.*whoops.*matchrY   )r   r   r*   r   )r   r   setattrrg   warnsRuntimeWarningr   rE   r^   r   r5   r    rH   rI   )r   r   rJ   r/   r   r0   $test_warn_on_failed_cancel_terminate@  s   *"r   z
posix onlyautojump_clockr   c              
     s   | tddd  tjtddB t 4 I d H }|tt	d t
 I d H  |j  W d   I d H  n1 I d H s>w   Y  W d    d S W d    d S 1 sVw   Y  d S )Nr   c                  W  s   d S r@   r/   )r=   r/   r/   r0   r   T  s    z8test_warn_on_cancel_SIGKILL_escalation.<locals>.<lambda>z.*ignored SIGTERM.*r   rY   )r   r   rg   r   r   r   rE   r^   r   r5   r    rH   rI   )r   r   rJ   r/   r/   r0   &test_warn_on_cancel_SIGKILL_escalationP  s   *"r   c               
     s   t tj/ t 4 I d H } | ttI d H }W d   I d H  n1 I d H s*w   Y  W d    n1 s9w   Y  |j	dksEJ d S )NrO   )
rg   rh   re   r   r   rE   rG   r   rV   r;   )rJ   r7   r/   r/   r0    test_run_process_background_fail_  s   (r   /dev/fdz,requires a way to iterate through open filesc                    s   t td } ttI d H  t td | ksJ ttj tt	I d H  W d    n1 s4w   Y  t td | ksEJ tt
 tdgI d H  W d    n1 s]w   Y  t td | ksnJ d S )Nr   z	/dev/fd/0)setSyncPathiterdirr   rR   rg   rh   re   r   rV   PermissionError)Zstarting_fdsr/   r/   r0   test_for_leaking_fdsh  s   r   c               	     s  d  d
 fdd} t tdI d H }t 4 I d H b}|| | t I d H  t ts/J |  t	  |j
  |  W d    n1 sJw   Y  td   I d H  W d    n1 sew   Y    srJ d	W d   I d H  d S 1 I d H sw   Y  d S )Nr7   r   r*   rN   c                   s"   t   |  I d H     d S r@   )r   rB   r   r   Znoticed_exitr/   r0   wait_and_tell~  s   z7test_subprocess_pidfd_unnotified.<locals>.wait_and_tellrY   r   z,child task wasn't woken after poll, DEADLOCKr   )r   r5   r   rE   r^   r    rS   r   r   r   rZ   rB   rm   r   is_set)r   r7   rJ   r/   r   r0    test_subprocess_pidfd_unnotified{  s$   


.r   )r(   r)   r*   r+   )r2   r3   r*   r+   )r7   r   r8   r#   r*   r9   )r=   r	   r>   r	   r*   r?   )rL   rM   r*   rN   )r`   r   r*   rN   r   )r   r   r*   rN   )r   r   r   r   r*   rN   )^
__future__r   r   r   r   re   r-   
contextlibr   	functoolsr   pathlibr   r   r   typesr   typingr   r	   r
   r   r   r   rg   r   r    r   r   r   r   r   r   r   r   r   _abcr   Z_core._tests.tutilr   r   Zlowlevelr   testingr   r   r    typing_extensionsr!   r:   r#   __annotations__namer'   r$   r%   r&   r1   rR   rV   rd   r5   r<   rC   rK   ZmarkZparametrizeZbackground_process_paramrM   rX   r\   r_   rk   rp   r   r   r   r   r   r   r   r   r   Zskipifr   r   r   r   r   r   existsr   r   r/   r/   r/   r0   <module>   s     	,





	


F
+
C
(

	