B
    ÐH/\(J  ã               @   s  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Zd dlmZ	 d dl
Z
d dlmZ d dl
mZ eedƒstd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G dd„ de	jƒZe	 d¡G dd„ dejƒƒZG dd„ de	jƒZedkre	 ¡  dS )é    N)Úmock)Ú
subprocessÚ	mswindowsFZpypy_version_infoé   z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);Ú Únewlinesc                   s,  e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Ze 	d¡dd„ ƒZ
e ejd¡e d¡dd„ ƒƒZe 	d¡dd„ ƒZe 	d¡dd„ ƒZejdkrœdd„ Zdd„ Ze 	d¡dd„ ƒZdd„ Zeje d¡d d!„ ƒƒZe 	d¡d"d#„ ƒZe d$¡d%d&„ ƒZe ejd'd(… d)k d*¡d+d,„ ƒZd-d.„ Z‡  Z S )/ÚTestc                s"   t t| ƒ ¡  t ¡  t ¡  d S )N)Úsuperr   ÚsetUpÚgcÚcollect)Úself)Ú	__class__© ú<lib/python3.7/site-packages/gevent/tests/test__subprocess.pyr
   '   s    z
Test.setUpc             C   s&   t  tjddg¡}|  | ¡ d¡ d S )Nz-czimport sys; sys.exit(10)é
   )r   ÚPopenÚsysÚ
executableÚassertEqualÚwait)r   Úpopenr   r   r   Ú	test_exit,   s    zTest.test_exitc             C   s2   t  tjddg¡}t |g¡ |  | ¡ d¡ d S )Nz-czimport sys; sys.exit(11)é   )r   r   r   r   Úgeventr   r   Úpoll)r   r   r   r   r   Ú	test_wait0   s    zTest.test_waitc          
   C   sV   yt  dg¡ ¡  W n4 tk
rH } z|jdks8t|ƒ‚W d d }~X Y n
X tdƒ‚d S )NÚ*é   z5Expected OSError: [Errno 2] No such file or directory)r   r   r   ÚOSErrorÚerrnoÚAssertionError)r   Úexr   r   r   Útest_child_exception5   s
    $zTest.test_child_exceptionc             C   s`   t  ¡ }tjtjddgtjd}| ¡  |j 	¡  ~t
rHt ¡  t ¡  t  ¡ }|  ||¡ d S )Nz-czprint())Ústdout)Ú	greentestZget_number_open_filesr   r   r   r   ÚPIPEr   r$   ÚcloseÚPYPYr   r   r   )r   Z
num_beforeÚpZ	num_afterr   r   r   Ú	test_leak=   s    

zTest.test_leakÚhangsc             C   sj   t jtjddddgt jt jt jd}| d¡\}}|  |d¡ tj d¡rZ| d¡sft	‚n|  |d¡ d S )	Nz-WÚignorez-czNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read()))Ústdinr$   Ústderrs   bananaz-dbgs	   pineapple)
r   r   r   r   r&   Úcommunicater   ÚendswithÚ
startswithr!   )r   r)   r$   r.   r   r   r   Útest_communicateK   s    
zTest.test_communicatezWindows does weird things herezSometimes segfaultsc             C   sh   t jtjddddgt jt jt jdd}| d¡\}}|  |t¡ |  |t¡ |  |d¡ |  |d	¡ d S )
Nz-Wr,   z-czfimport sys,os;sys.stderr.write("pineapple\r\n\xff\xff\xf2\xf9\r\n");sys.stdout.write(sys.stdin.read())T)r-   r$   r.   Úuniversal_newlinesu   banana
Ã¿Ã¿Ã²Ã¹
u   banana
Ã¿Ã¿Ã²Ã¹
u   pineapple
Ã¿Ã¿Ã²Ã¹
)	r   r   r   r   r&   r/   ÚassertIsInstanceÚstrr   )r   r)   r$   r.   r   r   r   Útest_communicate_universal\   s     zTest.test_communicate_universalc             C   st   t jtjddt d gt jddd}z>|j ¡ }trTt	sF|  
|d¡ q`|  
|d¡ n|  
|d¡ W d |j ¡  X d S )	Nz-cz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$   r3   Úbufsizez#line1
line2
line3
line4
line5
line6z%line1
line2
line3

line4

line5
line6z%line1
line2line3
line4
line5
line6)r   r   r   r   Ú	SETBINARYr&   r$   ÚreadÚpython_universal_newlinesÚ python_universal_newlines_brokenr   r'   )r   r)   r$   r   r   r   Útest_universal1w   s"    


zTest.test_universal1c             C   st   t jtjddt d gt jddd}z>|j ¡ }trTt	sF|  
|d¡ q`|  
|d¡ n|  
|d¡ W d |j ¡  X d S )	Nz-czimport sys,os;zá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\nline5");sys.stdout.flush();sys.stdout.write("\nline6");r7   )r$   r3   r8   z#line1
line2
line3
line4
line5
line6z%line1
line2
line3

line4

line5
line6z%line1
line2line3
line4
line5
line6)r   r   r   r   r9   r&   r$   r:   r;   r<   r   r'   )r   r)   r$   r   r   r   Útest_universal2›   s"    
	

zTest.test_universal2Zwin32c          	   C   st   t  ¡ \}}t |¡}tjddg|d}zt d¡ |  | ¡ d ¡ W d | ¡ d kr\| 	¡  | 
¡  t  
|¡ X d S )NZgrepÚtext)r-   gš™™™™™¹?)ÚosÚpiper   Z
FileObjectr   ÚtimeZsleepr   r   Úkillr'   )r   ÚrÚwr-   r)   r   r   r   Útest_nonblock_removed¿   s    

zTest.test_nonblock_removedc             C   s^   xXt dƒD ]L}yt d¡ W n0 tk
rL } z|jtjkr<‚ W d d }~X Y q
X tdƒ‚q
W d S )Né   Zthis_name_must_not_existzmust fail with ENOENT)Úranger   r   r   r    ZENOENTr!   )r   Ú_r"   r   r   r   Útest_issue148Ó   s    zTest.test_issue148c          
   C   sV   yt  tjddg¡ W n2 t jk
rH } z|  |jd¡ W d d }~X Y n
X tdƒ‚d S )Nz-czimport sys; sys.exit(44)é,   z!must fail with CalledProcessError)r   Zcheck_outputr   r   ÚCalledProcessErrorr   Ú
returncoder!   )r   Úer   r   r   Útest_check_output_keyword_errorÝ   s
     z$Test.test_check_output_keyword_errorc             C   sL   t rd S tjtjdddgtjtjd}|j d¡ |j 	¡ }|  
|d¡ d S )Nz-uz-cz2import sys; sys.stdout.write(sys.stdin.readline()))r-   r$   s   foobar
)ÚPY3r   r   r   r   r&   r-   Úwriter$   Úreadliner   )r   r)   rD   r   r   r   Útest_popen_bufsizeæ   s    
zTest.test_popen_bufsizezNot sure why?c                s„   ddl m} g ‰ | dd¡}‡ ‡fdd„}||d}| ¡  | ¡  ˆ tˆ ƒd¡ ˆ tˆ d t	ƒˆ ¡ ˆ ˆ d j
d d	¡ d S )
Nr   )ÚmonkeyZ	threadingÚThreadc           	      s>   ˆ  t¡} tjjddd tdƒ‚W d Q R X ˆ  | j¡ d S )Nzecho 123T)Úshellz%Should not be able to construct Popen)ÚassertRaisesÚ	TypeErrorr   r   r   r!   ÚappendÚ	exception)Úexc)r"   r   r   r   Úfnþ   s    z1Test.test_subprocess_in_native_thread.<locals>.fn)Útargetr7   z5child watchers are only available on the default loop)r   rT   Zget_originalÚstartÚjoinr   ÚlenZ
assertTrueÚ
isinstancerX   Úargs)r   rT   rU   r\   Zthreadr   )r"   r   r   Ú test_subprocess_in_native_threadó   s    
z%Test.test_subprocess_in_native_threadc             C   sF   t jtjddgfdt ji|—Ž}| ¡ \}}|  ||¡ |  |¡ d S )Nz-cÚpassr$   )r   r   r   r   r&   r/   r4   ZassertIsNone)r   ÚkwargsZkindÚprocr$   r.   r   r   r   Z__test_no_output  s    zTest.__test_no_outputzGSometimes segfaults; https://travis-ci.org/gevent/gevent/jobs/327357682c             C   s   |   ddit¡ d S )Nr3   T)Ú_Test__test_no_outputr5   )r   r   r   r   Ú9test_universal_newlines_text_mode_no_output_is_always_str  s    z>Test.test_universal_newlines_text_mode_no_output_is_always_strNr   )r   é   zNeed encoding argumentc             C   s   |   ddit¡ d S )NÚencodingzutf-8)rg   r5   )r   r   r   r   Ú'test_encoded_text_mode_no_output_is_str  s    z,Test.test_encoded_text_mode_no_output_is_strc             C   s   |   i t¡ d S )N)rg   Úbytes)r   r   r   r   Ú)test_default_mode_no_output_is_always_str&  s    z.Test.test_default_mode_no_output_is_always_str)!Ú__name__Ú
__module__Ú__qualname__r
   r   r   r#   r*   r%   ÚskipOnLibuvOnPyPyOnWinr2   ZskipIfr   r   ZskipOnLibuvOnCIOnPyPyr6   r=   r>   r   ÚplatformrF   rJ   rO   rS   Zignores_leakcheckÚskipOnWindowsrc   rg   rh   Úversion_infork   rm   Ú__classcell__r   r   )r   r   r   %   s,   $"

	
"r   zTesting POSIX fd closingc               @   sÀ   e Zd Ze d¡e d¡e d¡dd„ ƒƒƒZe d¡e d¡dd	„ ƒƒZe d¡e d¡e d¡e d¡d
d„ ƒƒƒƒZe d¡e d¡dd„ ƒƒZe d¡e d¡e d¡dd„ ƒƒƒZ	dS )ÚTestFDszos.closerangez"gevent.subprocess._set_inheritablezos.closec             C   s^   d}t j |d ¡ | t dd¡t dt j¡g¡ | t dd¡t dd¡g¡ | d¡ d S )N)é   é   rG   r   rw   é   Trx   ri   )r   r   Z_close_fds_brute_forceÚassert_has_callsr   ÚcallZMAXFDÚassert_called_once_with)r   r'   Úset_inheritableÚ
closerangeÚkeepr   r   r   Útest_close_fds_brute_force/  s    

z"TestFDs.test_close_fds_brute_forcez.gevent.subprocess.Popen._close_fds_brute_forcez
os.listdirc             C   s&   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_forcer   r   r   Ú#test_close_fds_from_path_bad_valuesG  s    z+TestFDs.test_close_fds_from_path_bad_valuesc             C   sj   d}dddg|_ tj d|d¡ |  g |j¡ | t dd¡t d	d¡g¡ | t d
¡t d¡g¡ d S )N)rw   rx   rG   Ú1Ú6Z37r   rx   rw   TrG   ri   é%   )	rƒ   r   r   r„   r   Ú
mock_callsrz   r   r{   )r   r'   r}   r~   r…   r   r   r   r   Útest_close_fds_from_pathO  s    
z TestFDs.test_close_fds_from_pathzos.path.isdirc             C   s>   d|_ tj g d¡ | g d¡ | t d¡t d¡g¡ d S )NFr‚   z/proc/self/fdz/dev/fd)rƒ   r   r   Ú
_close_fdsr|   rz   r   r{   )r   Úisdirr†   r   r   r   Útest_close_fds_no_dirj  s    zTestFDs.test_close_fds_no_dirz,gevent.subprocess.Popen._close_fds_from_pathc             C   s8   d|_ tj dgd¡ |  g |j¡ | ddgd¡ d S )NTrG   r‚   z/proc/self/fd)rƒ   r   r   r   r   r‹   r|   )r   rŽ   r†   Z	from_pathr   r   r   Útest_close_fds_with_dirv  s    zTestFDs.test_close_fds_with_dirN)
rn   ro   rp   r   Zpatchr€   r‡   rŒ   r   r   r   r   r   r   rv   ,  s   rv   c               @   s®   e Zd ZejZdd„ Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
e d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZdd„ ZdS )ÚRunFuncTestCasec             K   s   t jd|g}tj|f|ŽS )z4Run Python code in a subprocess using subprocess.runz-c)r   r   r   Úrun)r   Úcodere   Úargvr   r   r   Ú
run_python†  s    zRunFuncTestCase.run_pythonc          	   C   s<   |   d¡}|  |jd¡ |  tj¡ | ¡  W d Q R X d S )Nzimport sys; sys.exit(47)é/   )r•   r   rM   rW   r   rL   Zcheck_returncode)r   Úcpr   r   r   Útest_returncode‹  s    
zRunFuncTestCase.test_returncodec          	   C   s:   |   tj¡}| jddd W d Q R X |  |jjd¡ d S )Nzimport sys; sys.exit(47)T)Úcheckr–   )rW   r   rL   r•   r   rZ   rM   )r   Úcr   r   r   Ú
test_check’  s    zRunFuncTestCase.test_checkc             C   s    | j ddd}|  |jd¡ d S )Nzimport sys; sys.exit(0)T)r™   r   )r•   r   rM   )r   r—   r   r   r   Útest_check_zero—  s    zRunFuncTestCase.test_check_zeroc          	   C   s*   |   tj¡ | jddd W d Q R X d S )Nzwhile True: passg-Cëâ6?)Útimeout)rW   r   ÚTimeoutExpiredr•   )r   r   r   r   Útest_timeoutœ  s    zRunFuncTestCase.test_timeoutr+   c             C   s"   | j dtjd}|  d|j¡ d S )Nzprint('BDFL'))r$   s   BDFL)r•   r   r&   ÚassertInr$   )r   r—   r   r   r   Útest_capture_stdout¤  s    z#RunFuncTestCase.test_capture_stdoutc             C   s"   | j dtjd}|  d|j¡ d S )Nz$import sys; sys.stderr.write('BDFL'))r.   s   BDFL)r•   r   r&   r    r.   )r   r—   r   r   r   Útest_capture_stderrª  s    
z#RunFuncTestCase.test_capture_stderrc          	   C   sL   t  ¡ :}| d¡ | d¡ | jd|tjd}|  d|j¡ W d Q R X d S )Ns   pearr   z6import sys; sys.stdout.write(sys.stdin.read().upper()))r-   r$   s   PEAR)	ÚtempfileÚTemporaryFilerQ   Úseekr•   r   r&   r    r$   )r   Útfr—   r   r   r   Útest_check_output_stdin_arg°  s    


z+RunFuncTestCase.test_check_output_stdin_argc             C   s$   | j ddtjd}|  d|j¡ d S )Nz6import sys; sys.stdout.write(sys.stdin.read().upper())s   pear)Úinputr$   s   PEAR)r•   r   r&   r    r$   )r   r—   r   r   r   Útest_check_output_input_arg»  s    z+RunFuncTestCase.test_check_output_input_argc          
   C   s~   t  ¡ l}| d¡ | d¡ | jtdd}| jd|dd W d Q R X |  d|jj	d ¡ |  d	|jj	d ¡ W d Q R X d S )
Ns   pearr   z7Expected ValueError when stdin and input args supplied.)Úmsgzprint('will not be run')s   hare)r-   r¨   r-   r¨   )
r£   r¤   rQ   r¥   rW   Ú
ValueErrorr•   r    rZ   rb   )r   r¦   rš   r   r   r   Ú&test_check_output_stdin_with_input_argÃ  s    



z6RunFuncTestCase.test_check_output_stdin_with_input_argc          	   C   sN   |   tj¡}| jddtjd W d Q R X |  |jjd¡ |  |jjd¡ d S )NzMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)r   )r   r$   s   BDFL)	rW   r   rž   r•   r&   r   rZ   Úoutputr$   )r   rš   r   r   r   Útest_check_output_timeoutÐ  s    z)RunFuncTestCase.test_check_output_timeoutc             C   s2   t j ¡ }d|d< | jd|d}|  |jd¡ d S )NZbananaZFRUITzCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31))Úenvé!   )r@   ÚenvironÚcopyr•   r   rM   )r   Znewenvr—   r   r   r   Útest_run_kwargsá  s
    
zRunFuncTestCase.test_run_kwargsN)rn   ro   rp   r%   ZLARGE_TIMEOUTZ__timeout__r•   r˜   r›   rœ   rŸ   rq   r¡   r¢   r§   r©   r¬   r®   r³   r   r   r   r   r‘     s   r‘   Ú__main__)r   r@   r    ZunittestrB   r   r£   Zgevent.testingZtestingr%   r   r   r   Úhasattrr   r(   rt   rP   r9   r$   r;   r<   ZTestCaser   rs   rv   r‘   rn   Úmainr   r   r   r   Ú<module>   s6   


  	
Ti
