o
    US`c-O                     @   sd  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
Z
d dl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mZ ddlmZ dd	lmZmZ e jd
kZ e rhd dlm!Z!m"Z"m#Z# nd\Z!Z"Z#dd Z$e$dZ%e$dZ&e$dZ'e rdd Z(ndd Z(dd Z)edd Z*edd Z+e
j,j-de*e+gddgdZ.e.dd  Z/e.d!d" Z0e.d#d$ Z1d%d& Z2d'd( Z3e$d)Z4e.d*d+ Z5e.d,d- Z6d.d/ Z7d0d1 Z8ed2d3 Z9e.d4d5 Z:d6d7 Z;e.d8d9 Z<e
j,j=e  d:d;e.d<d= Z>ed>d? Z?d@dA Z@dBdC ZAe
j,j=e  dDd;dEdF ZBdGdH ZCe
j,j=e	dID  dJd;dKdL ZEdMdN ZFdS )O    N)partial)Path)asynccontextmanager   )	ClosedResourceErrorEventProcess_core
fail_aftermove_on_afterrun_processsleepsleep_forever)skip_if_fbsd_pipes_brokenslow)open_process)assert_no_checkpointswait_all_tasks_blockedposix)SIGKILLSIGTERMSIGUSR1)NNNc                 C   s   t jddd|  gS )Nz-u-czimport sys; )sys
executable)code r   E/usr/local/lib/python3.10/dist-packages/trio/tests/test_subprocess.pypython%   s   r   zsys.exit(0)zsys.exit(1)z0sys.stdout.buffer.write(sys.stdin.buffer.read())c                 C   s   dt | gS )Nz
/bin/sleep)strsecondsr   r   r   <lambda>.   s    r"   c                 C   s   t d| S )Nzimport time; time.sleep({}))r   formatr    r   r   r   r"   0   s    c                 C   s   t r| j| kS | jdkS )Nr   )r   
returncode)procsigr   r   r   
got_signal3   s   
r'   c                  O  sR   t | i |I d H }z|V  W |  | I d H  d S |  | I d H  w N)r   killwait)argskwargsr%   r   r   r   open_process_then_kill:   s   r-   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,   nurseryr%   r   r   r   run_process_in_nurseryD   s   ".r5   background_processr   zrun_process in nursery)idsc              	      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_TRUEr*   
isinstancer   _pidfdr$   repr
EXIT_FALSEr#   )r6   r%   r   r   r   
test_basicT   s   ((
r@   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'  runningZexited)SLEEPr$   r>   r)   _procr*   r=   )r6   pr   r   r   test_auto_update_returncodee   s   
.rF   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
   )	rC   r	   r/   
start_soonr*   r   r2   r3   r)   )r6   r%   r4   r   r   r   test_multi_waitr   s"   (
*.rI   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 tt |j	dI d H  W d    n1 sGw   Y  tt |j
 I d H  W d    d S 1 sew   Y  d S )N)stdinstdout   x)r   CAT
subprocessPIPEr$   pytestraisesr   rJ   send_allrK   receive_some)recwarnr%   r   r   r   !test_async_with_basics_deprecated   s   
("rU   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   rG   r9   zexited with signal 9r:   )r   r   rC   pollr3   r   cancelled_caughtr'   r   r>   r#   r   )rT   scoper%   r   r   r    test_kill_when_context_cancelled   s   
(

rZ   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 jd  f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 sYw   Y  |jjrdJ d	 I d H ksoJ W d   I d H  d S 1 I d H sw   Y  d S )
NrJ   rK   stderrs+   the quick brown fox jumps over the lazy dogc                      s(   j  I d H  j  I d H  d S r(   )rJ   rR   acloser   msgr%   r   r   
feed_input   s   ztest_pipes.<locals>.feed_inputc                    s4   t  }| 2 z
3 d H W }||7 }q6 ||ksJ d S r(   )	bytearray)streamexpectedseenchunkr   r   r   check_output   s   
z test_pipes.<locals>.check_outputg      >@r   )+COPY_STDIN_TO_STDOUT_AND_BACKWARD_TO_STDERRrN   rO   r	   r/   current_timer2   deadlinerH   rK   r\   rX   r*   )r6   r`   rf   r4   r   r^   r   
test_pipes   s(   
(.rk   c              
      s  | t dtjtjtjd4 I d H trdnd  fdd}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 sw   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
r[      
s   
c              	      s   t  4 I d H ,} 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 )Nc                    sz   |dkr'|  |I d H }|d|dt| ksJ |t|8 }|dks|dks-J |  t I d H  ks;J d S )Nr   z{}utf-8)rS   r#   encodelen)rb   countdigitresult)newliner   r   	drain_one   s    z3test_interactive.<locals>.expect.<locals>.drain_oner   r8   )r	   r/   rH   rK   r\   )idxrequestr4   rt   rs   r%   r   r   expect   s   
 .z test_interactive.<locals>.expect   s   12g?s   345r   i90  s   100s   200r8   rV   r         0   s   999999   i?B     )r   rN   rO   r   r
   rJ   rR   r   r   rX   r]   rK   rS   r\   r*   r$   )r6   rx   rY   r   rw   r   test_interactive   sH   



(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   r   	<genexpr>  s    ztest_run.<locals>.<genexpr>i   T)rJ   capture_stdoutcapture_stderrr   r~   )r   rg   zoh no, it's textrJ   )rK   )r\   )r   rK   )r   r\   )bytesranger   rM   r+   r$   rK   r\   rh   rP   rQ   UnicodeError
ValueErrorrN   rO   DEVNULL)datarr   r   r   r   test_run  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)rJ   r   r8   s   test
F)r   r   r.   r~   )r   rP   rQ   rN   CalledProcessErrorr   r   valuecmdr$   r\   rK   r+   )r   excinforr   r   r   r   test_run_check9  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()rL   i   r   r   )r   r   r   r$   rK   r\   )rr   r   r   r   test_run_with_broken_pipeK  s   $r   c              	      s  | t tjtjtjd4 I d H 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rAn|
| q3d|dksPJ W d   I d H  n1 I d H s`w   Y  |jdkslJ tt ddtjdI d H }|jdksJ |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rhzt \}}| t tj|tjd4 I d H Z}t| |jd u sJ |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s1J t|d
dks<J W d   I d H  n1 I d H sMw   Y  W t| d S W t| d S t| w d S )Nr[   s   1234T   r~   s   12344321r   )rJ   r   r\   )rJ   r\   i   )rh   rN   rO   STDOUTrK   r\   ZstdiorR   Zsend_eofrS   appendjoinr$   r   rM   rJ   r]   r*   r   ospipecloseread)r6   r%   outputre   rr   rwr   r   r   test_stderr_stdoutT  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lsrm   )encodingzunbuffered byte streamsz&the 'encoding' option is not supportedT)shellF)rP   rQ   	TypeErrorr   r   r   r   )r   r   r   r   test_errors  s   "r   c                    sR    fdd}|t jtI d H  |t jtI d H  tr'|dd tI d H  d S d S )Nc              
      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rQ|j| ksOJ d S |jdksXJ d S )N      ?  r   )r   rC   r*   rX   r   r$   )Zsend_itsignumrY   r%   r6   r   r   test_one_signal  s   
(
z%test_signals.<locals>.test_one_signalc                 S   s
   |  tS r(   )send_signalr   r%   r   r   r   r"     s   
 ztest_signals.<locals>.<lambda>)r   r)   r   	terminater   r   r   )r6   r   r   r   r   test_signals  s   r   zPOSIX specific)reasonc              
      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 sFw   Y  |jjrQJ |jdksXJ W d   I d H  n1 I d H shw   Y  W t  t j| d S W t  t j| d S t  t j| w )Nr   r   r   )signalSIGCHLDSIG_IGNrC   r	   r/   rH   r*   r   r)   ri   r2   rj   rX   r$   )r6   Zold_sigchldr%   r4   r   r   r   test_wait_reapable_fails  s    (*	"	r   c               
      s   ddl m}  | jdstd ddlm} d t	ddg fd	d
}t

t
j|}z+t
d |j jdddksCJ W jd u rQ    t

t
j| d S jd u rg    t

t
j| w )Nr   )wait_child_exitingwaitidzwaitid only)sync_wait_reapableFr   Z3600c                    s   d    d S NT)r)   )r&   frameZ	got_alarmZsleeperr   r   on_alarm  s   z#test_waitid_eintr.<locals>.on_alarmr8   )timeouti)Z_subprocess_platformr   
__module__endswithrP   skipZ_subprocess_platform.waitidr   rN   Popenr   SIGALRMalarmpidr*   r$   r)   )r   r   r   Zold_sigalrmr   r   r   test_waitid_eintr  s(   




r   c               	      s   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 s9w   Y   sBJ d S )NFc                    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   r   custom_deliver_cancel  s   "z9test_custom_deliver_cancel.<locals>.custom_deliver_cancelrA   )Zdeliver_cancel)	r	   r/   rH   r   r   rC   r   r2   r3   )r   r4   r   r   r   test_custom_deliver_cancel  s   (r   c              
      s   t j  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 sEw   Y  W d    d S W d    d S 1 s]w   Y  d S )Nc                    s    |  t d)NZwhoops)OSError)selfZoriginal_terminater   r   broken_terminate  s   z>test_warn_on_failed_cancel_terminate.<locals>.broken_terminater   z
.*whoops.*matchrA   )r   r   setattrrP   warnsRuntimeWarningr	   r/   rH   r   rC   r   r2   r3   )monkeypatchr   r4   r   r   r   $test_warn_on_failed_cancel_terminate
  s   *"r   z
posix onlyc              
      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   r   r"     s    z8test_warn_on_cancel_SIGKILL_escalation.<locals>.<lambda>z.*ignored SIGTERM.*r   rA   )r   r   rP   r   r   r	   r/   rH   r   rC   r   r2   r3   )Zautojump_clockr   r4   r   r   r   &test_warn_on_cancel_SIGKILL_escalation  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 )Nr8   )
rP   rQ   rN   r   r	   r/   r1   r   r?   r$   )r4   r%   r   r   r    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   r;   rP   rQ   rN   r   r?   PermissionError)Zstarting_fdsr   r   r   test_for_leaking_fds.  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 )Nreturnc                    s"   t   |  I d H     d S r(   )r   r*   r   r   Znoticed_exitr   r   wait_and_tellD  s   z7test_subprocess_pidfd_unnotified.<locals>.wait_and_tellrA   ry   z,child task wasn't woken after poll, DEADLOCK)r   N)r   rC   r	   r/   rH   r   r<   r   r   r   rD   r*   rW   r   is_set)r   r%   r4   r   r   r    test_subprocess_pidfd_unnotifiedA  s$   


.r   )Gr   r   r   rN   r   	functoolsr   pathlibr   r   rP   async_generatorr    r   r   r   r	   r
   r   r   r   r   Z_core.tests.tutilr   r   Zlowlevelr   testingr   r   namer   r   r   r   r   r;   r?   rM   rC   r'   r-   r5   markZparametrizeZbackground_process_paramr@   rF   rI   rU   rZ   rh   rk   r   r   r   r   r   r   r   Zskipifr   r   r   r   r   r   existsr   r   r   r   r   r   <module>   s    ,



	





F+

B



