a
    QIhg                     @  sp  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	m
Z
 d dlmZ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 d d	l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/m0Z0 erDd dl1m2Z2 d dl3m4Z4 ddl5m6Z6 ej7dkr^dZ8de9d< neZ8de9d< de9d< de9d< de9d< ej:dkZ;ese;sej7dkrd dlm<Z<m=Z=m>Z> n
d\Z<Z=Z>ddddd Z?e?d!Z@e?d"ZAe?d#ZBe;rd$dd%d&d'ZCnd$dd%d(d'ZCed)d)d*d+d,d-ZDed)d)d*d+d.d/ZEejFjGd0eDeEgd1d2gd3ZHe
d4ee! f ZIde9d5< eHd5d6d7d8d9ZJeHd5d6d7d:d;ZKeHd5d6d7d<d=ZLeHd5d6d7d>d?ZMeHd5d6d7d@dAZNe?dBZOeHd5d6d7dCdDZPeHd5d6d7dEdFZQd6dGdHdIZRd6dGdJdKZSe)d6dGdLdMZTeHd5d6d7dNdOZUd6dGdPdQZVeHd5d6d7dRdSZWejFjXe; dTdUeHd5d6d7dVdWZYejFjXe; dTdUeHd5d6d7dXdYZZe*d6dGdZd[Z[d6dGd\d]Z\d6dGd^d_Z]d`d6dadbdcZ^ejFjXe; dddUded`d6dfdgdhZ_d6dGdidjZ`ejFjXedka  dldUd6dGdmdnZbd`d6dadodpZcd6dGdqdrZddS )s    )annotationsN)AsyncIteratorCallable)AbstractAsyncContextManagerasynccontextmanager)partial)Path)Signals)TYPE_CHECKINGAnyNoReturn)mock)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.   U/var/www/html/venv_bot_3.9/lib/python3.9/site-packages/trio/_tests/test_subprocess.pypythonB   s    r0   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(   r2   r.   r.   r/   SLEEPL   s    r4   c                 C  s   t d|  dS )Nzimport time; time.sleep())r0   r3   r.   r.   r/   r4   Q   s    r   zAsyncIterator[Process]argskwargsr*   c                  O sR   t | i |I d H }z |V  W |  | I d H  n|  | I d H  0 d S N)r   killwait)r7   r8   procr.   r.   r/   open_process_then_killU   s    r=   c               	   O s   t  4 I d H f}|dd |ttg| R i |I d H }t|tsNJ |}|V  |j	  W d   I d H  q1 I d H s0    Y  d S )NcheckF)
r   open_nursery
setdefaultstartr   r   
isinstancer   cancel_scopecancel)r7   r8   nurseryvaluer<   r.   r.   r/   run_process_in_nurseryb   s    "rG   background_processr   zrun_process in nursery)Zids.BackgroundProcessTypeNone)rH   r*   c              	     s   | t 4 I d H $}| I d H  W d   I d H  qJ1 I d H s@0    Y  t|tsXJ |jd u sfJ |jdkstJ t|dt  dksJ | t4 I d H $}| I d H  W d   I d H  q1 I d H s0    Y  |jdksJ t|dtdksJ d S )Nr   <trio.Process : exited with status 0>   <trio.Process {!r}: {}>exited with status 1)		EXIT_TRUEr;   rB   r   _pidfd
returncoderepr
EXIT_FALSEformatrH   r<   r.   r.   r/   
test_basic|   s    88
rW   c              
     sD  t jddd | t4 I d H 2}|jd u s2J | I d H  W d   I d H  qj1 I d H s`0    Y  t|tsxJ |jd u sJ |jdksJ t|dt dksJ | t	4 I d H $}| I d H  W d   I d H  q1 I d H s0    Y  |jdksJ t|d
t	d	ks J W d    n1 s60    Y  d S )
N#trio._subprocess.can_try_pidfd_openFnewr   rK   rL   rM   rN   rO   )r   patchrP   rQ   r;   rB   r   rR   rS   rT   rU   rV   r.   r.   r/   test_basic_no_pidfd   s    88
r\   c              	     s   | t d4 I d H }|jd u s$J dt|v s4J |  |j  |jd usTJ dt|v sdJ |jd u srJ |jd usJ W d   I d H  q1 I d H s0    Y  d S )N'  runningZexited)r4   rR   rS   r:   _procr;   rQ   )rH   pr.   r.   r/   test_auto_update_returncode   s    
ra   c              
     s6  | t d4 I d H }t 4 I d H P}||j ||j ||j t I d H  |j  W d   I d H  q1 I d H s0    Y  t 4 I d H P}||j ||j ||j t I d H  |  W d   I d H  q1 I d H s0    Y  W d   I d H  q21 I d H s(0    Y  d S )N
   )	r4   r   r?   
start_soonr;   r   rC   rD   r:   rH   r<   rE   r.   r.   r/   test_multi_wait   s    4re   c                   sj  t jdddD | td4 I d H }t 4 I d H P}||j ||j ||j t I d H  |j	  W d   I d H  q1 I d H s0    Y  t 4 I d H P}||j ||j ||j t I d H  |
  W d   I d H  q1 I d H s0    Y  W d   I d H  qF1 I d H s<0    Y  W d    n1 s\0    Y  d S )NrX   FrY   rb   )r   r[   r4   r   r?   rc   r;   r   rC   rD   r:   rd   r.   r.   r/   test_multi_wait_no_pidfd   s    4rf   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 usZJ jd ushJ t 4 I d H Z}t d |j_	|
| |
|j  |
|j d d d  W d   I d H  q1 I d H s0    Y  |jjrJ  I d H dksJ W d   I d H  q:1 I d H s00    Y  d S )Nstdinstdoutstderrs+   the quick brown fox jumps over the lazy dogrJ   r*   c                     s4   j d usJ j  I d H  j  I d H  d S r9   )rh   send_allacloser.   msgr<   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.J d S r9   )	bytearray)rr   rs   seenchunkr.   r.   r/   check_output   s    z test_pipes.<locals>.check_outputg      >@r   )+COPY_STDIN_TO_STDOUT_AND_BACKWARD_TO_STDERR
subprocessPIPEri   rj   r   r?   current_timerC   deadlinerc   cancelled_caughtr;   )rH   rp   rw   rE   r.   rn   r/   
test_pipes   s&    
Dr   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 usXJ jd usfJ jd ustJ 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 sl0    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 s0    Y  W d   I d H  qH1 I d H s>0    Y  jdksXJ 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
rg      
s   
r1   rJ   )idxrequestr*   c              	     s   t  4 I d H ~}ddddd fdd}jd us8J jd usFJ ||j|| d  ||j|d | d d  W d   I d H  q1 I d H s0    Y  d S )	Nr!   r1   rJ   )rr   countdigitr*   c                   sl   |dkr@|  |I d H }||  t| ks2J |t|8 }q |dksLJ |  t I d H  kshJ d S )Nr   )receive_someencodelen)rr   r   r   result)newliner.   r/   	drain_one%  s    z3test_interactive.<locals>.expect.<locals>.drain_oner   rM   )r   r?   ri   rj   rc   )r   r   rE   r   r   r<   r.   r/   expect"  s    z test_interactive.<locals>.expect   s   12g?s   345r   i90  s   100s   200rM   d   r         0   s   999999   i?B     )r0   rz   r{   r'   rh   ri   rj   r   rl   r   r   r~   rm   r   r;   rR   )rH   r   scoper.   r   r/   test_interactive  sF    

0\r   rk   c                    s  t dd tdD } tt| dddI d H }|jtks:J |jdksHJ |j| ksVJ |jdksdJ ttddI d H }|jtksJ |jdksJ |jdksJ |jd u sJ tt| dddI d H }|jtksJ |jdksJ |j| ksJ |j| d d d	 ksJ t	
t" ttd
dI d H  W d    n1 s<0    Y  d}t	j
t|d$ tttjdI d H  W d    n1 s0    Y  t	j
t|d$ tttjdI d H  W d    n1 s0    Y  t	j
t|dddd$ tttjdI d H  W d    n1 s0    Y  t	j
tdd& ttdtjdI d H  W d    n1 s\0    Y  t	j
tdd$ ttdd dI d H  W d    n1 s0    Y  d S )Nc                 s  s   | ]}t d dV  qdS )r      N)randomrandint).0_r.   r.   r/   	<genexpr>R  r   ztest_run.<locals>.<genexpr>i   T)rh   capture_stdoutcapture_stderrr   r   r   rx   zoh no, it's textrh   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)ri   ri   rj   rM   )rj   z.^can't specify both stdout and capture_stdout$)r   ri   z.^can't specify both stderr and capture_stderr$)r   rj   )rq   ranger   CATr7   rR   ri   rj   ry   pytestraisesUnicodeError
ValueErrorrz   r{   replaceDEVNULL)datar   Zpipe_stdout_errorr.   r.   r/   test_runQ  s`    24446r   c                    s   t d} ttj&}t| tjddI d H  W d    n1 s@0    Y  |jj| ksZJ |jj	dksjJ |jj
dkszJ |jjd u sJ t| ddddI d H }|j| ksJ |jdksJ |j
dksJ |j	dksJ d S )	Nz/sys.stderr.buffer.write(b'test\n'); sys.exit(1)T)rh   r   rM   s   test
F)r   r   r>   r   )r0   r   r   rz   CalledProcessErrorr   r   rF   cmdrR   rj   ri   r7   )r   excinfor   r.   r.   r/   test_run_check  s"    4r   c                    sN   t tjddgdd dI d H } | jdks,J | j| j  u rDd u sJn J d S )Nr+   zimport sys; sys.stdin.close()   xi   r   r   )r   r,   r-   rR   ri   rj   )r   r.   r.   r/   test_run_with_broken_pipe  s    
r   c              	     s  | t tjtjtjd4 I d H }|jd us.J |jd us<J |jd u sJJ |jdI d H  |j I d H  g }|j	dI d H }|dkrq|
| qpd|dksJ W d   I d H  q1 I d H s0    Y  |jdksJ tt ddtjdI d H }|jdks
J |jdksJ |jd u s*J | ttjtjd	4 I d H V}|jd u sVJ |jd u sfJ |j I d H  | I d H  W d   I d H  q1 I d H s0    Y  |jdksJ trސzt \}}| t tj|tjd4 I d H }t| |jd u sJ |jd u s J |jd u s0J |jdI d H  |j I d H  | I d H dksjJ t|d
dksJ t|d
dksJ W d   I d H  q1 I d H s0    Y  W t| nt| 0 d S )Nrg   s   1234   r   s   12344321r   T)rh   r   rj   )rh   rj   i   )ry   rz   r{   STDOUTZstdiori   rj   rl   Zsend_eofr   appendjoinrR   r   r   rh   rm   r;   r'   ospipecloseread)rH   r<   outputrv   r   rwr.   r.   r/   test_stderr_stdout  sv    <<
Fr   c                    s   t t$} tdgddI d H  W d    n1 s40    Y  dt| jv sPJ dt| jv sbJ trt t$} tdgddI d H  W d    n1 s0    Y  t t"} tdddI d H  W d    n1 s0    Y  d S )	NZlszutf-8)encodingzunbuffered byte streamsz&the 'encoding' option is not supportedT)shellF)r   r   	TypeErrorr   r(   rF   r'   )r   r.   r.   r/   test_errors  s    22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 | NonerJ   )send_itsignumr*   c              
     s   t df} td4 I d H ,}| | | I d H  W d   I d H  q`1 I d H sV0    Y  W d    n1 st0    Y  |jrJ tr|d usJ |j| ksJ n|jdksJ d S )N      ?  r   )r   r4   r;   r~   r'   rR   )r   r   r   r<   rH   r.   r/   test_one_signal  s    
V
z%test_signals.<locals>.test_one_signalr"   c                 S  s
   |  tS r9   )send_signalr&   r<   r.   r.   r/   <lambda>  r   ztest_signals.<locals>.<lambda>)
r   r:   r$   	terminater%   r
   r'   r,   platformr&   )rH   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 }t 4 I d H F}|	|j
 t I d H  |  t d |j_W d   I d H  q1 I d H s0    Y  |jjrJ |jdksJ W d   I d H  q1 I d H s0    Y  W ttj| nttj| 0 d S )Nr"   r   r   r   )r
   r,   r   signalSIGCHLDSIG_IGNr4   r   r?   rc   r;   r   r:   r|   rC   r}   r~   rR   rH   Zold_sigchldr<   rE   r.   r.   r/   test_wait_reapable_fails  s    ::r   c                   sB  t rtjdkrd S tjddd
 ttjtj}z| td4 I d H }t	
 4 I d H F}||j t I d H  |  t	 d |j_W d   I d H  q1 I d H s0    Y  |jjrJ |jdksJ W d   I d H  q1 I d H s0    Y  W ttj| nttj| 0 W d    n1 s40    Y  d S )Nr"   rX   FrY   r   r   r   )r
   r,   r   r   r[   r   r   r   r4   r   r?   rc   r;   r   r:   r|   rC   r}   r~   rR   r   r.   r.   r/   !test_wait_reapable_fails_no_pidfd1  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|}zTtd |j jdddksJ W jd u rȈ    ttj| n*jd u r    ttj| 0 d S )Nr   )wait_child_exitingr"   darwinwaitidzwaitid only)sync_wait_reapableFr   Z3600r1   zFrameType | NonerJ   )sigframer*   c                   s   d    d S NT)r:   )r   r   Z	got_alarmZsleeperr.   r/   on_alarm`  s    z#test_waitid_eintr.<locals>.on_alarmrM   )timeouti)Z_subprocess_platformr   r
   r,   r   
__module__endswithr   skipZ_subprocess_platform.waitidr   rz   Popenr   SIGALRMalarmpidr;   rR   r:   )r   r   r   Zold_sigalrmr.   r   r/   test_waitid_eintrJ  s,    




r   c               	     s   d ddd fdd} t  4 I d H D}|tttd| d t I d H  |j  W d   I d H  q1 I d H sx0    Y   sJ d S )	NFr   rJ   r<   r*   c                   s@   d |    zt I d H  W | jd us<J n| jd us:J 0 d S r   )r   r   rR   r   Zcustom_deliver_cancel_calledr.   r/   custom_deliver_cancelv  s
    z9test_custom_deliver_cancel.<locals>.custom_deliver_cancelr]   Zdeliver_cancel	r   r?   rc   r   r   r4   r   rC   rD   )r   rE   r.   r   r/   test_custom_deliver_cancels  s    4r   c                    sf   ddddd dd fdd} t t ttd	 tj| d
d W d    n1 sX0    Y  d S )Nr   rJ   r   c                   s   |    tdd S )NZfoo)r   r   r   r.   r.   r/   r     s    z6test_bad_deliver_cancel.<locals>.custom_deliver_cancelrk   c               	     sn   t  4 I d H D} | tttd d t I d H  | j  W d   I d H  qj1 I d H s`0    Y  d S )Nr]   r   r   )rE   r   r.   r/   do_stuff  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_cancel  s    	r   zpytest.MonkeyPatch)monkeypatchr*   c              
     s   t j ddd fdd}| t d| tjtddr t 4 I d H <}|t	t
d	 t I d H  |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  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   r]   )r   r   setattrr   warnsRuntimeWarningr   r?   rc   r   r4   r   rC   rD   )r   r   rE   r.   r   r/   $test_warn_on_failed_cancel_terminate  s    r   z
posix onlyr   )autojump_clockr   r*   c              
     s   | tddd  tjtddr t 4 I d H <}|tt	d t
 I d H  |j  W d   I d H  q1 I d H sz0    Y  W d    n1 s0    Y  d S )Nr   c                  W  s   d S r9   r.   )r7   r.   r.   r/   r     r   z8test_warn_on_cancel_SIGKILL_escalation.<locals>.<lambda>z.*ignored SIGTERM.*r   r]   )r   r   r   r   r   r   r?   rc   r   r4   r   rC   rD   )r   r   rE   r.   r.   r/   &test_warn_on_cancel_SIGKILL_escalation  s    r   c               
     s   t tjp t 4 I d H :} | ttI d H }t|t	s>J |}W d   I d H  ql1 I d H sb0    Y  W d    n1 s0    Y  |j
dksJ d S )NrM   )r   rz   r   r   r?   rA   r   rT   rB   r   rR   )rE   rF   r<   r.   r.   r/    test_run_process_background_fail  s    L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>J tt	j
 ttI d H  W d    n1 sn0    Y  ttd | ksJ tt  tdgI d H  W d    n1 s0    Y  ttd | ksJ d S )Nr   z	/dev/fd/0)gcZcollectsetSyncPathiterdirr   rP   r   r   rz   r   rT   PermissionError)Zstarting_fdsr.   r.   r/   test_for_leaking_fds  s    ,.r  c                   sb   dddddd}|  tjd| ttt" ttddI d H  W d    n1 sT0    Y  d S )	Nobjectr(   r6   c                    s   dS )NZoopsr.   )r7   r8   r.   r.   r/   very_broken_open  s    z9test_run_process_internal_error.<locals>.very_broken_openr   Tr   )r   trioZ_subprocessr   AttributeErrorr   rP   )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sbJ |  t	 " |j
  |  W d    n1 s0    Y  td   I d H  W d    n1 s0    Y    sJ dW d   I d H  q1 I d H s0    Y  d S )	Nr   rJ   r   c                   s    t   |  I d H     d S r9   )r   r;   r   r   Znoticed_exitr.   r/   wait_and_tell  s    z7test_subprocess_pidfd_unnotified.<locals>.wait_and_tellr]   r   z,child task wasn't woken after poll, DEADLOCK)r   r4   r   r?   rc   r   rB   r   r   r   r_   r;   pollr   is_set)r
  r<   rE   r.   r	  r/    test_subprocess_pidfd_unnotified  s    
&
,r  )e
__future__r   r   r   r   r   rz   r,   collections.abcr   r   
contextlibr   r   	functoolsr   pathlibr   r   r	   typingr
   r   r   Zunittestr   r   r  Ztrio.testingr   r    r   r   r   r   r   r   r   r   Z_core._tests.tutilr   r   Zlowlevelr   testingr   r   r   typesr   Ztyping_extensionsr    _abcr!   r   r#   __annotations__namer'   r$   r%   r&   r0   rP   rT   r   r4   r=   rG   markZparametrizeZbackground_process_paramrI   rW   r\   ra   re   rf   ry   r   r   r   r   r   r   r   r   Zskipifr   r   r   r   r   r   r   r   existsr  r  r  r.   r.   r.   r/   <module>   s   (


"L9	E(	