
    iO                        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	Z	d dlm
Z
 d dl	mZ  eed          sde_         ee d          Ze j        d          dk    Zej        rdZnd	Z ee j        d
          Zeoej        Z ej        d           G d dej                              Z ej        d           G d dej                              Z G d dej                  Zedk    r ej                     dS dS )    N)mock)
subprocess	mswindowsFpypy_version_info   z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY); newlinesr   c                      e Zd ZdZd Zd Zd Zd Z ej	        d          d             Z
 ej        ej        d           ej        d	          d
                         Z ej        d          d             Z ej	        d          d             Z ej	        d          d             Z ej        d          d             Zd Z ej	        d          d             Z ej        d          d             Zej         ej        d          d                         Z ej	        d          d             Z ej        d          d             Z ej        ej        dd         dk     d          d             Zd Z dS ) 	TestPopenFc                     t          j        t          j        ddg          }|                     |                                d           d S )N-czimport sys; sys.exit(10)
   )r   Popensys
executableassertEqualwaitselfpopens     H/usr/local/lib/python3.11/dist-packages/gevent/tests/test__subprocess.py	test_exitzTestPopen.test_exit*   s@     #.$8R!STTr*****    c                     t          j        t          j        ddg          }t	          j        |g           |                     |                                d           d S )Nr   zimport sys; sys.exit(11)   )r   r   r   r   geventr   r   pollr   s     r   	test_waitzTestPopen.test_wait.   sR     #.$8R!STTUGr*****r   c                     |                      t                    5 }t          j        dg                                           d d d            n# 1 swxY w Y   |                     |j        j        d           d S )N*   )assertRaisesOSErrorr   r   r   r   	exceptionerrnor   excs     r   test_child_exceptionzTestPopen.test_child_exception3   s    w'' 	+3cU##((***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	,a00000s   (AAAc                 4   t          j                    }t          j        t          j        ddgt          j                  }|                                 |j        	                                 ~t          j                    }| 
                    ||           d S )Nr   zprint()stdout)	greentestget_number_open_filesr   r   r   r   PIPEr   r+   closer   )r   
num_beforep	num_afters       r   	test_leakzTestPopen.test_leak9   s    466
cndI>$.O5 5 5		355	Y/////r   hangsc                    t          j        t          j        ddddgt           j        t           j        t           j                  }|                    d          \  }}|                     |d           t          j                            d          r|                    d          sJ d S |                     |d           d S )	N-Wignorer   zNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read()))stdinr+   stderrs   bananaz-dbgs	   pineapple)	r   r   r   r   r.   communicater   endswith
startswithr   r1   r+   r9   s       r   test_communicatezTestPopen.test_communicateD   s    cndH"CD
 $.?$.O$.O5 5 5 ==33+++>""6** 	3$$\2222222V\22222r   zWindows does weird things herezSometimes segfaultsc                    t          j        t          j        ddddgt           j        t           j        t           j        d          }|                    d          \  }}|                     |t                     |                     |t                     |                     |d           |                     |d	           d S )
Nr6   r7   r   zfimport sys,os;sys.stderr.write("pineapple\r\n\xff\xff\xf2\xf9\r\n");sys.stdout.write(sys.stdin.read())T)r8   r+   r9   universal_newlinesu   banana
ÿÿòù
u   banana
ÿÿòù
u   pineapple
ÿÿòù
)	r   r   r   r   r.   r:   assertIsInstancestrr   r=   s       r   test_communicate_universalz$TestPopen.test_communicate_universalU   s    
 h5	 /??#
 
 
 ==)IJJfc***fc***5	7 	7 	7 	8	: 	: 	: 	: 	:r   z'Windows IO is weird; this doesn't raisec                 R   t          j        t          j        ddddgt           j        t           j        t           j        dd          5 }|                     t                    5  |                                 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr6   r7   r   z6import os, sys; os.write(sys.stdout.fileno(), b"\xff")T)r8   r+   r9   textr@   )r   r   r   r   r.   r"   UnicodeDecodeErrorr:   )r   r1   s     r   test_communicate_undecodablez&TestPopen.test_communicate_undecodableq   s#    N(>	 !ojo!d
 
 
 	  ""#566                                 	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s6   B#B8BB	BB	BB #B c                    t          j        t          j        ddt          z   dz   gt           j        dd          5 }|j                                        }t          r5t          s| 
                    |d           n-| 
                    |d           n| 
                    |d           d d d            d S # 1 swxY w Y   d S )	Nr   import sys,os;a	  sys.stdout.write("line1\n");sys.stdout.flush();sys.stdout.write("line2\r");sys.stdout.flush();sys.stdout.write("line3\r\n");sys.stdout.flush();sys.stdout.write("line4\r");sys.stdout.flush();sys.stdout.write("\nline5");sys.stdout.flush();sys.stdout.write("\nline6");   r+   r@   bufsize#line1
line2
line3
line4
line5
line6%line1
line2
line3

line4

line5
line6%line1
line2line3
line4
line5
line6r   r   r   r   	SETBINARYr.   r+   readpython_universal_newlines python_universal_newlines_brokenr   r   r1   r+   s      r   test_universal1zTestPopen.test_universal1   sN   ND$y0
44 "#$%
 
 
 !	Q& X]]__F( Q7 U$$V%OQ Q Q Q $$V%SU U U U   !OQ Q QA!	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q !	Q   A,B44B8;B8c                    t          j        t          j        ddt          z   dz   gt           j        dd          5 }|j                                        }t          r5t          s| 
                    |d           n-| 
                    |d           n| 
                    |d           d d d            d S # 1 swxY w Y   d S )	Nr   rI   zsys.stdout.write("line1\n");sys.stdout.flush();sys.stdout.write("line2\r");sys.stdout.flush();sys.stdout.write("line3\r\n");sys.stdout.flush();sys.stdout.write("line4\r\nline5");sys.stdout.flush();sys.stdout.write("\nline6");rJ   rK   rM   rN   rO   rP   rU   s      r   test_universal2zTestPopen.test_universal2   sM   ND$y04	4 "#$!
 
 
 	Q" X]]__F( Q7 U$$V%OQ Q Q Q $$V%SU U U U   !OQ Q Q=	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	QrW   zUses 'grep' commandc                    t          j                    \  }}t          j        |          }t          j        ddg|          5 }	 t          j        d           |                     |                                d            |                                |	                                 |
                                 t          j
        |           nU# |                                |	                                 |
                                 t          j
        |           w xY w	 d d d            d S # 1 swxY w Y   d S )NgreprE   )r8   皙?)ospiper   
FileObjectr   timesleepr   r   killr/   )r   rwr8   r1   s        r   test_nonblock_removedzTestPopen.test_nonblock_removed   sG    wyy1%a((vv.e<<< 	 
3  40006688#FFHHH 6688#FFHHH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s,   D5<CAD5AD$$D55D9<D9c                 <   t          d          D ]}|                     t                    5 }t          j        d          5  	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     |j        j        t          j                   d S )N   this_name_must_not_exist)	ranger"   r#   r   r   r   r$   r%   ENOENT)r   _r'   s      r   test_issue148zTestPopen.test_issue148   s   q 	@ 	@A""7++ s%&@AA                               S]0%,????	@ 	@s5   A&AA&AA&AA&&A*	-A*	c                     |                      t          j                  5 }t          j        t          j        ddg           d d d            n# 1 swxY w Y   |                     |j        j        d           d S )Nr   zimport sys; sys.exit(44),   )	r"   r   CalledProcessErrorcheck_outputr   r   r   r$   
returncoder&   s     r   test_check_output_keyword_errorz)TestPopen.test_check_output_keyword_error   s    z<== 	X#S^T;U$VWWW	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	1266666s   "AAAz!The default buffer changed in Py3c                 :   t          j        t          j        dddgt           j        t           j                  5 }|j                            d           |j                                        }d d d            n# 1 swxY w Y   | 	                    |d           d S )Nz-ur   z2import sys; sys.stdout.write(sys.stdin.readline())r8   r+   s   foobar
)
r   r   r   r   r.   r8   writer+   readliner   )r   r1   rc   s      r   test_popen_bufsizezTestPopen.test_popen_bufsize   s     tEG ojo
 
 
 	$ GMM+&&&!!##A	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	K(((((s   4A::A>A>zNot sure why?c                     ddl m} g |                    dd          } fd} ||          }|                                 |                                                      t                    d                                t          d         t                                                    d         j
        d         d           d S )	Nr   )monkey	threadingThreadc                                           t                    5 } t          j                            dd           d d d            n# 1 swxY w Y                       | j                   d S )Nzecho 123T)shell)r"   	TypeErrorr   r   r   appendr$   )r'   exr   s    r   fnz6TestPopen.test_subprocess_in_native_thread.<locals>.fn  s    ""9-- @!''
$'???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @IIcm$$$$$s   "A

AA)targetrJ   z5child watchers are only available on the default loop)r   ry   get_originalstartjoinr   len
assertTrue
isinstancer~   args)r   ry   r{   r   threadr   s   `    @r    test_subprocess_in_native_threadz*TestPopen.test_subprocess_in_native_thread   s    
 	"!!!!! $$[(;;	% 	% 	% 	% 	% 	%
 r"""R!$$$
2a5)44b999AA(_`````r   c                    t          j        t          j        ddgfdt           j        i|5 }|                                \  }}d d d            n# 1 swxY w Y   |                     ||           |                     |           d S )Nr   passr+   )r   r   r   r   r.   r:   rA   assertIsNone)r   kwargskindprocr+   r9   s         r   __test_no_outputzTestPopen.__test_no_output  s    v.
 
!
 
 
 	0 !--//NFF	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	fd+++&!!!!!s   AAAzGSometimes segfaults; https://travis-ci.org/gevent/gevent/jobs/327357682c                 @    |                      ddit                     d S )Nr@   T_TestPopen__test_no_outputrB   r   s    r   9test_universal_newlines_text_mode_no_output_is_always_strzCTestPopen.test_universal_newlines_text_mode_no_output_is_always_str%  s&     	3T:C@@@@@r   Nr!   )r      zNeed encoding argumentc                 @    |                      ddit                     d S )Nencodingzutf-8r   r   s    r   'test_encoded_text_mode_no_output_is_strz1TestPopen.test_encoded_text_mode_no_output_is_str-  s%    
 	z73S99999r   c                 <    |                      i t                     d S )N)r   bytesr   s    r   )test_default_mode_no_output_is_always_strz3TestPopen.test_default_mode_no_output_is_always_str4  s      	b%(((((r   )!__name__
__module____qualname__error_fatalr   r   r(   r3   r,   skipOnLibuvOnPyPyOnWinr>   skipIfr   r   skipOnLibuvOnCIOnPyPyrC   skipOnWindowsrG   rV   rY   re   rl   rr   	skipOnPy3rw   ignores_leakcheckr   r   r   r   version_infor   r    r   r   r   r   #   s       
 K+ + ++ + +
1 1 1	0 	0 	0 &Y%g..3 3 /.3  Yj*68 8$Y$%:;;: : <;8 8:2 YFGG    HG * &Y%g.."Q "Q /."QH &Y%g.. Q  Q /. QD Y233  43(@ @ @ &Y%g..7 7 /.7 Y<==
) 
) >=
)  Y_--a a .- ! a. &Y%g..	" 	" /.	" %Y$ &Z [ [A A[ [A Yc&rr*V35MNN: : ON:) ) ) ) )r   r   zTesting POSIX fd closingc                      e Zd Z ej        d           ej        d           ej        d          d                                     Z ej        d           ej        d          d                         Z ej        d           ej        d           ej        d           ej        d          d                                                 Z ej        d           ej        d	          d
                         Z ej        d           ej        d           ej        d	          d                                     Z	dS )TestFDszos.closerangez"gevent.subprocess._set_inheritablezgevent.subprocess.os_closec                 |   d}t           j                            |d            |                    t	          j        dd          t	          j        dt           j                  g           |                    t	          j        dd          t	          j        dd          g           |                    d           d S )N      rg   r   r      Tr   r   )r   r   _close_fds_brute_forceassert_has_callsr   callMAXFDassert_called_once_with)r   r/   set_inheritable
closerangekeeps        r   test_close_fds_brute_forcez"TestFDs.test_close_fds_brute_force=  s    
 	//d;;;##IaOOIa)**%
 	 	 	
 	((IaIa*
 	 	 	
 	%%a(((((r   z.gevent.subprocess.Popen._close_fds_brute_forcez
os.listdirc                     d|_         t          j                            dg d           |                    g d           d S )NzNot an Integerpath*   )return_valuer   r   _close_fds_from_pathr   )r   listdirbrute_forces      r   #test_close_fds_from_path_bad_valuesz+TestFDs.test_close_fds_from_path_bad_valuesU  sC      0--fb"===++B33333r   c                    d}g d|_         t          j                            d|d           |                     g |j                   |                    t          j        dd          t          j        dd          g           |                    t          j        d          t          j        d	          g           d S )
Nr   )1637r   r   r   Trg   r   %   )	r   r   r   r   r   
mock_callsr   r   r   )r   r/   r   r   r   r   s         r   test_close_fds_from_pathz TestFDs.test_close_fds_from_path]  s    

  0//--fdA>>>Z2333((IaIa*
 	 	 	
 	IaLLIbMM 
 	 	 	 	 	r   zos.path.isdirc                     d|_         t          j                            g d           |                    g d           |                    t          j        d          t          j        d          g           d S )NFr   /proc/self/fdz/dev/fd)r   r   r   
_close_fdsr   r   r   r   )r   isdirr   s      r   test_close_fds_no_dirzTestFDs.test_close_fds_no_dirx  s|     ###B+++++B333Io&&Ii   
 	 	 	 	 	r   z,gevent.subprocess.Popen._close_fds_from_pathc                     d|_         t          j                            dgd           |                     g |j                   |                    ddgd           d S )NTrg   r   r   )r   r   r   r   r   r   r   )r   r   r   	from_paths       r   test_close_fds_with_dirzTestFDs.test_close_fds_with_dir  s`     "##QC,,,[3444))/A3CCCCCr   N)
r   r   r   r   patchr   r   r   r   r   r   r   r   r   r   :  s        TZ  TZ455TZ,--) ) .- 65 ! )* TZ@AATZ4 4  BA4 TZTZ  TZ455TZ,--  .- 65 !  . TZ@AATZ    !  BA TZ>??TZ@AATZ  D D !  BA @?D D Dr   r   c                      e Zd Zej        Z ej        d          d             Zd Zd Z	d Z
d Z ej        d          d             Z ej        d          d	             Z ej        d          d
             Z ej        d          d             Z ej        d          d             Z ej        d          d             Zd Z ej        d          d             ZdS )RunFuncTestCaser   c                 D    t           j        d|g}t          j        |fi |S )z4Run Python code in a subprocess using subprocess.runr   )r   r   r   run)r   coder   argvs       r   
run_pythonzRunFuncTestCase.run_python  s*     d+~d--f---r   c                     |                      d          }|                     |j        d           |                     t          j                  5  |                                 d d d            d S # 1 swxY w Y   d S )Nimport sys; sys.exit(47)/   )r   r   rq   r"   r   ro   check_returncoder   cps     r   test_returncodezRunFuncTestCase.test_returncode  s    __788+++z<== 	" 	"!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   A22A69A6c                     |                      t          j                  5 }|                     dd           d d d            n# 1 swxY w Y   |                     |j        j        d           d S )Nr   Tcheckr   )r"   r   ro   r   r   r$   rq   r   cs     r   
test_checkzRunFuncTestCase.test_check  s    z<== 	DOO6dOCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D/44444s   AAAc                 j    |                      dd          }|                     |j        d           d S )Nzimport sys; sys.exit(0)Tr   r   )r   r   rq   r   s     r   test_check_zerozRunFuncTestCase.test_check_zero  s6    __6d_CC*****r   c                     |                      t          j                  5  |                     dd           d d d            d S # 1 swxY w Y   d S )Nzwhile True: passg-C6?)timeout)r"   r   TimeoutExpiredr   r   s    r   test_timeoutzRunFuncTestCase.test_timeout  s    
 z899 	@ 	@OO.O???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   AA	A	r4   c                 ~    |                      dt          j                  }|                     d|j                   d S )Nzprint('BDFL')r*      BDFLr   r   r.   assertInr+   r   s     r   test_capture_stdoutz#RunFuncTestCase.test_capture_stdout  s7     ___Z__EEgry)))))r   c                 ~    |                      dt          j                  }|                     d|j                   d S )Nz$import sys; sys.stderr.write('BDFL'))r9   r   )r   r   r.   r   r9   r   s     r   test_capture_stderrz#RunFuncTestCase.test_capture_stderr  s>    __C$.O  5 5gry)))))r   c                 ,   t          j                    5 }|                    d           |                    d           |                     d|t
          j                  }|                     d|j                   d d d            d S # 1 swxY w Y   d S )N   pearr   6import sys; sys.stdout.write(sys.stdin.read().upper())rt      PEAR)	tempfileTemporaryFileru   seekr   r   r.   r   r+   )r   tfr   s      r   test_check_output_stdin_argz+RunFuncTestCase.test_check_output_stdin_arg  s     #%% 	.HHWGGAJJJH ! 2 2B MM'29---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   A(B		BBc                     |                      ddt          j                  }|                     d|j                   d S )Nr   r   )inputr+   r   r   r   s     r   test_check_output_input_argz+RunFuncTestCase.test_check_output_input_arg  sD     __D*/  3 3 	gry)))))r   c                    t          j                    5 }|                    d           |                    d           |                     t
          d          5 }|                     d|d           d d d            n# 1 swxY w Y   |                     d|j        j	        d                    |                     d	|j        j	        d                    d d d            d S # 1 swxY w Y   d S )
Nr   r   z7Expected ValueError when stdin and input args supplied.)msgzprint('will not be run')s   hare)r8   r   r8   r   )
r   r   ru   r   r"   
ValueErrorr   r   r$   r   )r   r   r   s      r   &test_check_output_stdin_with_input_argz6RunFuncTestCase.test_check_output_stdin_with_input_arg  sk    #%% 	8HHWGGAJJJ"":'` # b b 9ef :&(   9 9 99 9 9 9 9 9 9 9 9 9 9 9 9 9 9 MM'1;#3A#6777MM'1;#3A#6777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s7   AC$B 4C$ B	C$B	AC$$C(+C(c                 8   |                      t          j                  5 }|                     ddt          j                   d d d            n# 1 swxY w Y   |                     |j        j        d           |                     |j        j        d           d S )NzMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)r   )r   r+   r   )	r"   r   r   r   r.   r   r$   outputr+   r   s     r   test_check_output_timeoutz)RunFuncTestCase.test_check_output_timeout  s    z899 
	3QOO' */  	3 	3 	3
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 
	3 	+W555+W55555s   #AAAc                     t           j                                        }d|d<   |                     d|          }|                     |j        d           d S )NbananaFRUITzCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31))env!   )r]   environcopyr   r   rq   )r   newenvr   s      r   test_run_kwargszRunFuncTestCase.test_run_kwargs  s]    """w__ U!'  ) ) 	+++++r   z)requires posix like 'sleep' shell commandc                     |                      d          5  |                     t          j                  5  t          j        dddd           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr\   zsleep 3T)r}   r   capture_output)runs_in_given_timer"   r   r   r   r   s    r   .test_run_with_shell_timeout_and_capture_outputz>RunFuncTestCase.test_run_with_shell_timeout_and_capture_output  s
    $$S)) 	4 	4"":#<== 4 4yc.24 4 4 44 4 4 4 4 4 4 4 4 4 4 4 4 4 4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s4    A3AA3A	A3"A	#A33A7:A7N)r   r   r   r,   LARGE_TIMEOUT__timeout__skipWithoutResourcer   r   r   r   r   r   r   r   r   r   r  r  r  r   r  r   r   r   r   r     s        )K"Y"<00. . 10.
" " "5 5 5
+ + +
@ @ @ &Y%g..* * /.*
 &Y%g..* * /.*
 &Y%g... . /.. &Y%g..* * /.* &Y%g..
8 
8 /.
8 &Y%g..6 6 /.6 , , , YHII4 4 JI4 4 4r   r   __main__)r   r]   r%   unittestr`   r   gevent.testingtestingr,   r   r   r   hasattrr   PYPYr   PY3rQ   r+   rS   rT   r  TestCaser   r   r   r   r   mainr   r   r   <module>r      s   



 				     " " " " " "             wz;'' ! J ws'((	qQ  RIII $GCJ
;;  $'#?:+?  |,,T) T) T) T) T)	" T) T) -,T)l 344RD RD RD RD RDh RD RD 54RDhs4 s4 s4 s4 s4i( s4 s4 s4j zIN r   