o
    4@Hhg                     @  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	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rd dl1m2Z2 d dl3m4Z4 ddl5m6Z6 ej7dkrd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>dsd d!Z?e?d"Z@e?d#ZAe?d$ZBe;rdtd'd(ZCndtd)d(ZCedud.d/ZDedud0d1ZEejFjGd2eDeEgd3d4gd5ZHe
d6ee! f ZIde9d7< eHdvd9d:ZJeHdvd;d<ZKeHdvd=d>ZLeHdvd?d@ZMeHdvdAdBZNe?dCZOeHdvdDdEZPeHdvdFdGZQdwdHdIZRdwdJdKZSe)dwdLdMZTeHdvdNdOZUdwdPdQZVeHdvdRdSZWejFjXe; dTdUeHdvdVdWZYejFjXe; dTdUeHdvdXdYZZe*dwdZd[Z[dwd\d]Z\dwd^d_Z]dxdbdcZ^ejFjXe; dddUdydgdhZ_dwdidjZ`ejFjXedka  dldUdwdmdnZbdxdodpZcdwdqdrZddS )z    )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codestrreturn	list[str]c                 C  s   t jddd|  gS )Nz-u-czimport sys; )sys
executable)r(    r/   [/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/trio/_tests/test_subprocess.pypythonB   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 )Nr   )r)   r2   r/   r/   r0   SLEEPL   s   r5   c                 C  s   t d|  dS )Nzimport time; time.sleep())r1   r4   r/   r/   r0   r5   Q   s   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)r7   r8   procr/   r/   r0   open_process_then_killU   s   r>   c               	   O s   t  4 I d H 4}|dd |ttg| R i |I d H }t|ts(J |}|V  |j	  W d   I d H  d S 1 I d H sCw   Y  d S )NcheckF)
r   open_nursery
setdefaultstartr   r   
isinstancer   cancel_scopecancel)r7   r8   nurseryvaluer=   r/   r/   r0   run_process_in_nurseryb   s   ".rH   background_processr   zrun_process in nursery)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   <trio.Process : exited with status 0>   <trio.Process {!r}: {}>exited with status 1)		EXIT_TRUEr<   rC   r   _pidfd
returncoderepr
EXIT_FALSEformatrI   r=   r/   r/   r0   
test_basic|   s    ((
rY   c              
     s@  t jddd | t4 I d H }|jd u sJ | I d H  W d   I d H  n1 I d H s0w   Y  t|ts<J |jd u sCJ |jdksJJ t|dt dksVJ | t	4 I d H }| I d H  W d   I d H  n1 I d H svw   Y  |jdksJ t|d
t	d	ksJ W d    d S 1 sw   Y  d S )
N#trio._subprocess.can_try_pidfd_openFnewr   rM   rN   rO   rP   rQ   )r   patchrR   rS   r<   rC   r   rT   rU   rV   rW   rX   r/   r/   r0   test_basic_no_pidfd   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'  runningexited)r5   rT   rU   r;   _procr<   rS   )rI   pr/   r/   r0   test_auto_update_returncode   s   
.rd   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   r@   
start_soonr<   r   rD   rE   r;   rI   r=   rF   r/   r/   r0   test_multi_wait   s"   (
*.rh   c                   sp  t jddd | 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 sJw   Y  t 4 I d H '}||j ||j ||j t I d H  |
  W d   I d H  n1 I d H sw   Y  W d   I d H  n1 I d H sw   Y  W d    d S W d    d S 1 sw   Y  d S )NrZ   Fr[   re   )r   r]   r5   r   r@   rf   r<   r   rD   rE   r;   rg   r/   r/   r0   test_multi_wait_no_pidfd   s*   (
**"ri   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 zd d fdd}ddd}jd us'J jd us.J t 4 I d H -}t d |j_	|
| |
|j  |
|j d d d  W d   I d H  n1 I d H siw   Y  |jjrtJ  I d H dksJ W d   I d H  d S 1 I d H sw   Y  d S )Nstdinstdoutstderrs+   the quick brown fox jumps over the lazy dogr*   rL   c                     s6   j d usJ j  I d H  j  I d H  d S r:   )rk   send_allacloser/   msgr=   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)rs   rt   seenchunkr/   r/   r0   check_output   s   
z test_pipes.<locals>.check_outputg      >@r   r*   rL   )rs   r!   rt   ru   r*   rL   )+COPY_STDIN_TO_STDOUT_AND_BACKWARD_TO_STDERR
subprocessPIPErl   rm   r   r@   current_timerD   deadlinerf   cancelled_caughtr<   )rI   rr   ry   rF   r/   rp   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
rj      
s   
idxr3   requestr*   rL   c              	     s   t  4 I d H ;}d fdd	}jd usJ jd usJ ||j|| d
  ||j|d
 | d
 d  W d   I d H  d S 1 I d H sJw   Y  d S )Nrs   r!   countr3   digitr*   rL   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   )receive_someencodelen)rs   r   r   result)newliner/   r0   	drain_one%  s    z3test_interactive.<locals>.expect.<locals>.drain_oner   rO   )rs   r!   r   r3   r   r3   r*   rL   )r   r@   rl   rm   rf   )r   r   rF   r   r   r=   r/   r0   expect"  s    .z test_interactive.<locals>.expect   s   12g?s   345r   i90  s   100s   200rO   d   r         0   s   999999   i?B     )r   r3   r   r3   r*   rL   )r1   r}   r~   r'   rk   rl   rm   r   rn   r   r   r   ro   r   r<   rT   )rI   r   scoper/   r   r0   test_interactive  sN   



*=r   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  d}t	j
t|d tttjdI d H  W d    n1 sw   Y  t	j
t|d tttjdI d H  W d    n1 sw   Y  t	j
t|dddd tttjdI d H  W d    n	1 sw   Y  t	j
tdd ttdtjdI d H  W d    n	1 s+w   Y  t	j
tdd ttdd dI d H  W d    d S 1 sNw   Y  d S )Nc                 s  s    | ]	}t d dV  qdS )r      N)randomrandint).0_r/   r/   r0   	<genexpr>R  s    ztest_run.<locals>.<genexpr>i   T)rk   capture_stdoutcapture_stderrr   r   r   rz   zoh no, it's textrk   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)rl   rl   rm   rO   )rm   z.^can't specify both stdout and capture_stdout$)r   rl   z.^can't specify both stderr and capture_stderr$)r   rm   )ru   ranger   CATr7   rT   rl   rm   r|   pytestraisesUnicodeError
ValueErrorr}   r~   replaceDEVNULL)datar   pipe_stdout_errorr/   r/   r0   test_runQ  sn   $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)rk   r   rO   s   test
F)r   r   r?   r   )r1   r   r   r}   CalledProcessErrorr   r   rG   cmdrT   rm   rl   r7   )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()   xi   r   r   )r   r-   r.   rT   rl   rm   )r   r/   r/   r0   test_run_with_broken_pipe  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 )Nrj   s   1234T   r   s   12344321r   )rk   r   rm   )rk   rm   i   )r|   r}   r~   STDOUTstdiorl   rm   rn   send_eofr   appendjoinrT   r   r   rk   ro   r<   r'   ospipecloseread)rI   r=   outputrx   r   rwr/   r/   r0   test_stderr_stdout  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 )	Nlszutf-8)encodingzunbuffered byte streamsz&the 'encoding' option is not supportedT)shellF)r   r   	TypeErrorr   r)   rG   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*   rL   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   r<   r   r'   rT   )r   r   r   r=   rI   r/   r0   test_one_signal  s   
(
z%test_signals.<locals>.test_one_signalr"   c                 S  s
   |  tS r:   )send_signalr&   r=   r/   r/   r0   <lambda>  s   
 ztest_signals.<locals>.<lambda>)r   r   r   r   r*   rL   )
r   r;   r$   	terminater%   r
   r'   r-   platformr&   )rI   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   r@   rf   r<   r   r;   r   rD   r   r   rT   rI   old_sigchldr=   rF   r/   r/   r0   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}zl| 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 sWw   Y  |jjrbJ |jdksiJ W d   I d H  n1 I d H syw   Y  W ttj| nttj| w W d    d S 1 sw   Y  d S )Nr"   rZ   Fr[   r   r   r   )r
   r-   r   r   r]   r   r   r   r5   r   r@   rf   r<   r   r;   r   rD   r   r   rT   r   r/   r/   r0   !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 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   3600sigr3   frameFrameType | Noner*   rL   c                   s   d    d S NT)r;   )r   r   	got_alarmsleeperr/   r0   on_alarm`  s   z#test_waitid_eintr.<locals>.on_alarmrO   )timeouti)r   r3   r   r   r*   rL   )_subprocess_platformr   r
   r-   r   
__module__endswithr   skip_subprocess_platform.waitidr   r}   Popenr   SIGALRMalarmpidr<   rT   r;   )r   r   r   old_sigalrmr/   r   r0   test_waitid_eintrJ  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 )NFr=   r   r*   rL   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   rT   r   custom_deliver_cancel_calledr/   r0   custom_deliver_cancelv  s   "z9test_custom_deliver_cancel.<locals>.custom_deliver_cancelr_   deliver_cancelr=   r   r*   rL   	r   r@   rf   r   r   r5   r   rD   rE   )r   rF   r/   r   r0   test_custom_deliver_cancels  s   (r   c                    s^   ddd d fdd} t t ttd	 tj| d
d W d    d S 1 s(w   Y  d S )Nr=   r   r*   rL   c                   s   |    td)Nfoo)r   r   r   r/   r/   r0   r     s   z6test_bad_deliver_cancel.<locals>.custom_deliver_cancelc               	     sr   t  4 I d H #} | tttd d t I d H  | j  W d   I d H  d S 1 I d H s2w   Y  d S )Nr_   r   r   )rF   r   r/   r0   do_stuff  s   .z)test_bad_deliver_cancel.<locals>.do_stuffz^foo$T)strict_exception_groupsr   r{   )r   r   r   r   run)r  r/   r  r0   test_bad_deliver_cancel  s
   
	"r  monkeypatchpytest.MonkeyPatchc              
     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)Nwhoops)OSError)r  original_terminater/   r0   broken_terminate  s   z>test_warn_on_failed_cancel_terminate.<locals>.broken_terminater   z
.*whoops.*r   r_   )r  r   r*   r   )r   r   setattrr   warnsRuntimeWarningr   r@   rf   r   r5   r   rD   rE   )r  r  rF   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/   )r7   r/   r/   r0   r     s    z8test_warn_on_cancel_SIGKILL_escalation.<locals>.<lambda>z.*ignored SIGTERM.*r   r_   )r  r   r   r  r  r   r@   rf   r   r5   r   rD   rE   )r  r  rF   r/   r/   r0   &test_warn_on_cancel_SIGKILL_escalation  s   *"r  c               
     s   t tj8 t 4 I d H } | ttI d H }t|t	s J |}W d   I d H  n1 I d H s2w   Y  W d    n1 sAw   Y  |j
dksMJ d S )NrO   )r   r}   r   r   r@   rB   r   rV   rC   r   rT   )rF   rG   r=   r/   r/   r0    test_run_process_background_fail  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 J tt	j
 ttI d H  W d    n1 s8w   Y  ttd | ksIJ tt tdgI d H  W d    n1 saw   Y  ttd | ksrJ d S )Nr  z	/dev/fd/0)gccollectsetSyncPathiterdirr   rR   r   r   r}   r   rV   PermissionError)starting_fdsr/   r/   r0   test_for_leaking_fds  s   r  c                   s^   ddd}|  tjd| ttt ttd	d
I d H  W d    d S 1 s(w   Y  d S )Nr7   objectr8   r*   r)   c                    s   dS )Noopsr/   )r7   r8   r/   r/   r0   very_broken_open  s   z9test_run_process_internal_error.<locals>.very_broken_openr   Tr   )r7   r  r8   r  r*   r)   )r  trio_subprocessr   AttributeErrorr   rR   )r  r   r/   r/   r0   test_run_process_internal_error  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 )Nr=   r   r*   rL   c                   s"   t   |  I d H     d S r:   )r   r<   r  r   noticed_exitr/   r0   wait_and_tell  s   z7test_subprocess_pidfd_unnotified.<locals>.wait_and_tellr_   r   z,child task wasn't woken after poll, DEADLOCKr   )r   r5   r   r@   rf   r   rC   r   r   r   rb   r<   pollr   is_set)r'  r=   rF   r/   r%  r0    test_subprocess_pidfd_unnotified  s$   


.r*  )r(   r)   r*   r+   )r2   r3   r*   r+   )r7   r   r8   r   r*   r9   )rI   rK   r*   rL   r{   )r  r  r*   rL   )r  r   r  r  r*   rL   )e
__future__r   r  r   r   r   r}   r-   collections.abcr   r   
contextlibr   r   	functoolsr   pathlibr   r  r	   typingr
   r   r   unittestr   r   r!  trio.testingr   r    r   r   r   r   r   r   r   r   _core._tests.tutilr   r   lowlevelr   testingr   r   r   typesr   typing_extensionsr    _abcr!   r   r#   __annotations__namer'   r$   r%   r&   r1   rR   rV   r   r5   r>   rH   markparametrizebackground_process_paramrK   rY   r^   rd   rh   ri   r|   r   r   r   r   r   r   r   r   skipifr   r   r   r   r  r  r  r  existsr  r$  r*  r/   r/   r/   r0   <module>   s    (





"
L
9	
E
(


	
