U
    (Ûc[8  ã                   @   sz  d 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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	mZ ddlmZ ddlmZ ddlmZ dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
m Z  ddl
m!Z! ddl
m"Z" ddl
m#Z# ddl
m$Z$ ddl
m%Z% ddl
m&Z& ddl
m'Z' ddl
m(Z( dd l
m)Z) dd!l
m*Z* dd"l
m+Z+ G d#d$„ d$eƒZ,G d%d&„ d&eƒZ-G d'd(„ d(eƒZ.G d)d*„ d*eƒZ/G d+d,„ d,eƒZ0e%G d-d.„ d.eƒƒZ1G d/d0„ d0eƒZ2G d1d2„ d2eƒZ3e4d3krvdd4l5m6Z6 e6e7ƒ dS )5z3
Tests for testing utils (psutil.tests namespace).
é    N)ÚFREEBSD)ÚNETBSD)ÚPOSIX)Úopen_binary)Ú	open_text)Úsupports_ipv6)Ú
CI_TESTING)ÚHAS_CONNECTIONS_UNIX)Ú
PYTHON_EXE)ÚPsutilTestCase)ÚTestMemoryLeak)Úbind_socket)Úbind_unix_socket)Ú
call_until)Úchdir)Úcreate_sockets)Úget_free_port)Úis_namedtuple)Úmock)Úprocess_namespace)Úreap_children)Úretry)Úretry_on_failure)Ú
safe_mkdir)Úsafe_rmpath)Ú	serialrun)Úsystem_namespace)Útcp_socketpair)Ú	terminate)Úunix_socketpair)Úwait_for_file)Úwait_for_pidc                   @   sx   e Z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S )ÚTestRetryDecoratorz
time.sleepc                    sF   t ddd d‡ fdd„ƒ}ttdƒƒ‰ |  |ƒ d¡ |  |jd¡ d S )Né   é   ©ÚretriesÚintervalZlogfunc                      s   ˆ rˆ   ¡  dd  q dS ©Nr$   r   ©Úpop© ©Úqueuer+   ú?/tmp/pip-unpacked-wheel-l83rk7k5/psutil/tests/test_testutils.pyÚfooD   s    
z2TestRetryDecorator.test_retry_success.<locals>.fooé   )r   ÚlistÚrangeÚassertEqualÚ
call_count©ÚselfÚsleepr/   r+   r,   r.   Útest_retry_success@   s
    z%TestRetryDecorator.test_retry_successc                    sD   t ddd d‡ fdd„ƒ}ttdƒƒ‰ |  t|¡ |  |jd¡ d S )Nr#   r$   r%   c                      s   ˆ rˆ   ¡  dd  q dS r(   r)   r+   r,   r+   r.   r/   R   s    
z2TestRetryDecorator.test_retry_failure.<locals>.fooé   )r   r1   r2   ÚassertRaisesÚZeroDivisionErrorr3   r4   r5   r+   r,   r.   Útest_retry_failureO   s
    z%TestRetryDecorator.test_retry_failurec                 C   s2   t tdddd„ ƒ}|  t|¡ |  |jd¡ d S )Nr$   )Ú	exceptionr'   c                   S   s   t ‚d S ©N)Ú	TypeErrorr+   r+   r+   r.   r/   _   s    z2TestRetryDecorator.test_exception_arg.<locals>.foor   )r   Ú
ValueErrorr:   r?   r3   r4   r5   r+   r+   r.   Útest_exception_arg]   s    

z%TestRetryDecorator.test_exception_argc                 C   s4   t dd d ddd„ ƒ}|  t|¡ |  |jd¡ d S )Nr#   r%   c                   S   s   dd  d S r(   r+   r+   r+   r+   r.   r/   j   s    z4TestRetryDecorator.test_no_interval_arg.<locals>.foor   ©r   r:   r;   r3   r4   r5   r+   r+   r.   Útest_no_interval_argf   s    
z'TestRetryDecorator.test_no_interval_argc                 C   s4   t ddd ddd„ ƒ}|  t|¡ |  |jd¡ d S )Nr#   r$   r%   c                   S   s   dd  d S r(   r+   r+   r+   r+   r.   r/   t   s    z0TestRetryDecorator.test_retries_arg.<locals>.foorB   r5   r+   r+   r.   Útest_retries_argq   s    
z#TestRetryDecorator.test_retries_argc                 C   s   | j ttddd d S )Nr#   r$   )r&   Útimeout)r:   r@   r   )r6   r7   r+   r+   r.   Útest_retries_and_timeout_args{   s    z0TestRetryDecorator.test_retries_and_timeout_argsN)Ú__name__Ú
__module__Ú__qualname__r   Úpatchr8   r<   rA   rC   rD   rF   r+   r+   r+   r.   r"   >   s   





	r"   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestSyncTestUtilsc              	   C   sP   t t ¡ ƒ tt ¡ ƒd }tjdtdgƒd |  	tj
t |¡ W 5 Q R X d S )NiŸ† úpsutil.tests.retry.__iter__r   ©Zreturn_value)r!   ÚosÚgetpidÚmaxÚpsutilZpidsr   rJ   Úiterr:   ZNoSuchProcess)r6   Znopidr+   r+   r.   Útest_wait_for_pid‚   s    z#TestSyncTestUtils.test_wait_for_pidc              	   C   sD   |   ¡ }t|dƒ}| d¡ W 5 Q R X t|ƒ tj |¡r@t‚d S )NÚwr/   ©Ú
get_testfnÚopenÚwriter    rN   ÚpathÚexistsÚAssertionError©r6   ÚtestfnÚfr+   r+   r.   Útest_wait_for_fileˆ   s
    z$TestSyncTestUtils.test_wait_for_filec              	   C   s>   |   ¡ }t|dƒ W 5 Q R X t|dd tj |¡r:t‚d S )NrT   T)Úempty)rV   rW   r    rN   rY   rZ   r[   ©r6   r]   r+   r+   r.   Útest_wait_for_file_empty   s
    
z*TestSyncTestUtils.test_wait_for_file_emptyc              	   C   s:   |   ¡ }tjdtdgƒd |  tt|¡ W 5 Q R X d S )NrL   r   rM   )rV   r   rJ   rR   r:   ÚIOErrorr    ra   r+   r+   r.   Útest_wait_for_file_no_file–   s    z,TestSyncTestUtils.test_wait_for_file_no_filec              	   C   sH   |   ¡ }t|dƒ}| d¡ W 5 Q R X t|dd tj |¡sDt‚d S )NrT   r/   F)ÚdeleterU   r\   r+   r+   r.   Útest_wait_for_file_no_delete›   s
    z.TestSyncTestUtils.test_wait_for_file_no_deletec                 C   s   t dd„ dƒ}|  |d¡ d S )Nc                   S   s   dS )Nr$   r+   r+   r+   r+   r.   Ú<lambda>£   ó    z3TestSyncTestUtils.test_call_until.<locals>.<lambda>zret == 1r$   )r   r3   )r6   Úretr+   r+   r.   Útest_call_until¢   s    z!TestSyncTestUtils.test_call_untilN)	rG   rH   rI   rS   r_   rb   rd   rf   rj   r+   r+   r+   r.   rK   €   s   rK   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestFSTestUtilsc              	   C   s&   t tƒ}|  |jd¡ W 5 Q R X d S )NÚrt)r   Ú__file__r3   Úmode©r6   r^   r+   r+   r.   Útest_open_text©   s    
zTestFSTestUtils.test_open_textc              	   C   s&   t tƒ}|  |jd¡ W 5 Q R X d S )NÚrb)r   rm   r3   rn   ro   r+   r+   r.   Útest_open_binary­   s    
z TestFSTestUtils.test_open_binaryc                 C   s<   |   ¡ }t|ƒ tj |¡s t‚t|ƒ tj |¡s8t‚d S r>   )rV   r   rN   rY   Úisdirr[   ra   r+   r+   r.   Útest_safe_mkdir±   s
    zTestFSTestUtils.test_safe_mkdirc              
   C   s¦   |   ¡ }t|dƒ ¡  t|ƒ tj |¡r.t‚t|ƒ t |¡ t|ƒ tj |¡rXt‚t	j
dttjdƒd.}|  t¡ t|ƒ W 5 Q R X |js˜t‚W 5 Q R X d S )NrT   zpsutil.tests.os.statÚ )Zside_effect)rV   rW   Úcloser   rN   rY   rZ   r[   Úmkdirr   rJ   ÚOSErrorÚerrnoÚEINVALr:   Úcalled)r6   r]   Úmr+   r+   r.   Útest_safe_rmpath¸   s    

ÿz TestFSTestUtils.test_safe_rmpathc              	   C   s\   |   ¡ }t ¡ }t |¡ t|ƒ  |  t ¡ tj ||¡¡ W 5 Q R X |  t ¡ |¡ d S r>   )rV   rN   Úgetcwdrw   r   r3   rY   Újoin)r6   r]   Úbaser+   r+   r.   Ú
test_chdirË   s    

$zTestFSTestUtils.test_chdirN)rG   rH   rI   rp   rr   rt   r}   r   r+   r+   r+   r.   rk   §   s
   rk   c                   @   s:   e Zd Zdd„ Zdd„ Ze e d¡dd„ ƒZdd	„ Z	d
S )ÚTestProcessUtilsc                 C   sN   |   ¡ }t |j¡}| ¡ s t‚tƒ  | ¡ r2t‚tjjr>t‚tjj	rJt‚d S r>   )
Úspawn_testprocrQ   ÚProcessÚpidÚ
is_runningr[   r   ÚtestsZ_pids_startedZ_subprocesses_started)r6   ZsubpÚpr+   r+   r.   Útest_reap_childrenÖ   s    z#TestProcessUtils.test_reap_childrenc                 C   sä   |   ¡ \}}|  |j|j¡ | ¡ s(t‚| ¡ s4t‚t ¡  ¡ }|  ||g¡ t ¡ jdd}|  t	|ƒd¡ |  
||¡ |  
||¡ |  | ¡ t ¡ ¡ |  | ¡ |j¡ t|ƒ | ¡ rÀt‚| ¡ sÌt‚t|ƒ | ¡ ràt‚d S )NT)Ú	recursiveé   )Zspawn_children_pairÚassertNotEqualr…   r†   r[   rQ   r„   Úchildrenr3   ÚlenZassertInÚppidrN   rO   r   )r6   ÚchildZ
grandchildr   r+   r+   r.   Útest_spawn_children_pairß   s"    z)TestProcessUtils.test_spawn_children_pairú
POSIX onlyc                 C   s"   |   ¡ \}}|  | ¡ tj¡ d S r>   )Úspawn_zombier3   ÚstatusrQ   ZSTATUS_ZOMBIE)r6   ÚparentÚzombier+   r+   r.   Útest_spawn_zombieô   s    z"TestProcessUtils.test_spawn_zombiec                 C   sà   |   ¡ }t|ƒ |  |¡ t|ƒ t |   ¡ j¡}t|ƒ |  |¡ t|ƒ tddg}tj|tj	tj	d}t|ƒ |  |¡ t|ƒ |   ¡ j}t|ƒ |  |¡ t|ƒ t
rÜ|  ¡ \}}t|ƒ t|ƒ |  |¡ |  |¡ d S )Nz-czimport time; time.sleep(60);)ÚstdoutÚstderr)rƒ   r   ZassertProcessGonerQ   r„   r…   r
   ÚPopenÚ
subprocessÚPIPEr   r“   )r6   rˆ   Úcmdr…   r•   r–   r+   r+   r.   Útest_terminateù   s.    






zTestProcessUtils.test_terminateN)
rG   rH   rI   r‰   r‘   ÚunittestÚskipIfr   r—   rž   r+   r+   r+   r.   r‚   Ô   s
   	
r‚   c                   @   s`   e Zd Zdd„ Ze e d¡dd„ ƒZdd„ Ze e d¡e e	pDe
d¡d	d
„ ƒƒZdd„ ZdS )ÚTestNetUtilsc              	   C   s>   t ƒ }t td|fd¡}|  | ¡ d |¡ W 5 Q R X d S )Nru   ©Úaddrr$   )r   Ú
contextlibÚclosingr   r3   Úgetsockname)r6   ÚportÚsr+   r+   r.   r     s    zTestNetUtils.bind_socketr’   c              	   C   s¼   |   ¡ }t|ƒ}t |¡\ |  |jtj¡ |  |jtj	¡ |  | 
¡ |¡ tj |¡s\t‚t t |¡j¡srt‚W 5 Q R X |   ¡ }t|tjd}t |¡ |  |jtj¡ W 5 Q R X d S )N)Útype)rV   r   r¤   r¥   r3   ÚfamilyÚsocketÚAF_UNIXr©   ÚSOCK_STREAMr¦   rN   rY   rZ   r[   ÚstatÚS_ISSOCKÚst_modeÚ
SOCK_DGRAM)r6   ÚnameÚsockr+   r+   r.   Útest_bind_unix_socket  s     z"TestNetUtils.test_bind_unix_socketc              
   C   s|   dt ƒ f}ttj|d\}}t |¡L t |¡6 |  | ¡ |¡ |  | ¡ |¡ |  	| ¡ |¡ W 5 Q R X W 5 Q R X d S )Nz	127.0.0.1r¢   )
r   r   r«   ÚAF_INETr¤   r¥   r3   r¦   ÚgetpeernamerŒ   )r6   r£   ÚserverÚclientr+   r+   r.   Útcp_tcp_socketpair/  s    
zTestNetUtils.tcp_tcp_socketpairz*/var/run/log UNIX socket opened by defaultc                 C   sÂ   t  ¡ }| ¡ }|jddr t‚|  ¡ }t|ƒ\}}zvtj	 
|¡sFt‚t t |¡j¡s\t‚|  | ¡ | d¡ |  t|jddƒd¡ |  | ¡ |¡ |  | ¡ |¡ W 5 | ¡  | ¡  X d S )NÚunix)Úkindr‹   )rQ   r„   Únum_fdsÚconnectionsr[   rV   r   rv   rN   rY   rZ   r®   r¯   r°   r3   rŽ   r¦   r¶   )r6   rˆ   r¼   r²   r·   r¸   r+   r+   r.   Útest_unix_socketpair:  s    z!TestNetUtils.test_unix_socketpairc              	   C   sÊ   t ƒ º}t t¡}t t¡}|D ]2}||j  d7  < || tjtj¡  d7  < q |  	|tj
 d¡ tƒ r~|  	|tj d¡ tr˜tr˜|  	|tj d¡ |  	|tj d¡ |  	|tj d¡ W 5 Q R X d S )Nr$   r‹   )r   ÚcollectionsÚdefaultdictÚintrª   Ú
getsockoptr«   Ú
SOL_SOCKETÚSO_TYPEZassertGreaterEqualrµ   r   ÚAF_INET6r   r	   r¬   r­   r±   )r6   ÚsocksZfamsÚtypesr¨   r+   r+   r.   Útest_create_socketsN  s    

z TestNetUtils.test_create_socketsN)rG   rH   rI   r   rŸ   r    r   r´   r¹   r   r   r¾   rÈ   r+   r+   r+   r.   r¡     s   

ÿr¡   c                   @   sT   e Zd Zeƒ dd„ ƒZdd„ Zeƒ e ed¡dd„ ƒƒZ	dd	„ Z
d
d„ Zdd„ ZdS )ÚTestMemLeakClassc                    s8   ‡ fdd„}ddi‰ | j |ddd |  ˆ d d¡ d S )	Nc                      s   ˆ d  d7  < d S )NÚcntr$   r+   r+   ©rÊ   r+   r.   Úfund  s    z(TestMemLeakClass.test_times.<locals>.funrÊ   r   é
   é   )ÚtimesÚwarmup_timesé   )Úexecuter3   ©r6   rÌ   r+   rË   r.   Ú
test_timesb  s    zTestMemLeakClass.test_timesc                 C   s|   | j t| jdd„ dd | j t| jdd„ dd | j t| jdd„ dd | j t| jd	d„ dd
 | j t| jdd„ dd d S )Nc                   S   s   dS ©Nr   r+   r+   r+   r+   r.   rg   k  rh   z1TestMemLeakClass.test_param_err.<locals>.<lambda>r   ©rÏ   c                   S   s   dS rÕ   r+   r+   r+   r+   r.   rg   l  rh   éÿÿÿÿc                   S   s   dS rÕ   r+   r+   r+   r+   r.   rg   m  rh   )rÐ   c                   S   s   dS rÕ   r+   r+   r+   r+   r.   rg   n  rh   )Ú	tolerancec                   S   s   dS rÕ   r+   r+   r+   r+   r.   rg   o  rh   )r&   )r:   r@   rÒ   ©r6   r+   r+   r.   Útest_param_errj  s
    zTestMemLeakClass.test_param_errzskipped on CIc                 C   s4   g }|fdd„}z| j td| j|dd W 5 ~X d S )Nc                 S   s   |   dd ¡ d S ©NZxxxxxxxxxxxxxxxxxxxxxxxxi   ©Úappend©Úlsr+   r+   r.   rÌ   v  s    z+TestMemLeakClass.test_leak_mem.<locals>.funz	extra-memé2   rÖ   )ÚassertRaisesRegexr[   rÒ   )r6   rß   rÌ   r+   r+   r.   Útest_leak_memq  s      ÿ
zTestMemLeakClass.test_leak_memc                    s8   ‡ ‡fdd„}g ‰ t rdnd}ˆ td| ˆj|¡ d S )Nc                     s"   t tƒ} ˆ | j¡ ˆ  | ¡ d S r>   )rW   rm   Z
addCleanuprv   rÝ   )r^   ©Zboxr6   r+   r.   rÌ     s    z1TestMemLeakClass.test_unclosed_files.<locals>.funÚfdÚhandlez	unclosed )r   rá   r[   rÒ   )r6   rÌ   r»   r+   rã   r.   Útest_unclosed_files€  s     ÿz$TestMemLeakClass.test_unclosed_filesc                    s>   ‡ fdd„}g ‰ d}| j ||ddd |  tˆ ƒ|d ¡ d S )Nc                      s   ˆ   dd ¡ d S rÛ   rÜ   r+   rÞ   r+   r.   rÌ   Œ  s    z,TestMemLeakClass.test_tolerance.<locals>.funéd   r   i  €)rÏ   rÐ   rØ   r$   )rÒ   r3   rŽ   )r6   rÌ   rÏ   r+   rÞ   r.   Útest_tolerance‹  s    
ÿzTestMemLeakClass.test_tolerancec              	   C   sd   dd„ }|   t|¡ |  t¡ |   t|¡ W 5 Q R X dd„ }|  t¡ |   t|¡ W 5 Q R X d S )Nc                   S   s   dd  d S r(   r+   r+   r+   r+   r.   rÌ   •  s    z0TestMemLeakClass.test_execute_w_exc.<locals>.func                   S   s   d S r>   r+   r+   r+   r+   r.   rÌ   ›  s    )Zexecute_w_excr;   r:   rx   r[   rÓ   r+   r+   r.   Útest_execute_w_exc”  s    z#TestMemLeakClass.test_execute_w_excN)rG   rH   rI   r   rÔ   rÚ   rŸ   r    r   râ   ræ   rè   ré   r+   r+   r+   r.   rÉ   _  s   

	rÉ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestTestingUtilsc                 C   sL   t  ¡ }t|ƒ}| ¡  dd„ | |j¡D ƒd d }|  |ƒ | ¡ ¡ d S )Nc                 S   s   g | ]}|d  dkr|‘qS )r$   r   r+   ©Ú.0Úxr+   r+   r.   Ú
<listcomp>§  s      z;TestTestingUtils.test_process_namespace.<locals>.<listcomp>r   )rQ   r„   r   ÚtestrR   Úgettersr3   r   )r6   rˆ   ÚnsrÌ   r+   r+   r.   Útest_process_namespace£  s
    z'TestTestingUtils.test_process_namespacec                 C   s:   t ƒ }dd„ | |j¡D ƒd d }|  |ƒ t ¡ ¡ d S )Nc                 S   s   g | ]}|d  dkr|‘qS )r$   Únet_if_addrsr+   rë   r+   r+   r.   rî   ¬  s      z:TestTestingUtils.test_system_namespace.<locals>.<listcomp>r   )r   rR   rð   r3   rQ   ró   )r6   rñ   rÌ   r+   r+   r.   Útest_system_namespaceª  s    z&TestTestingUtils.test_system_namespaceN)rG   rH   rI   rò   rô   r+   r+   r+   r.   rê   ¡  s   rê   c                   @   s   e Zd Zdd„ ZdS )ÚTestOtherUtilsc                 C   s.   t t dd¡dddƒƒst‚t tƒ ƒr*t‚d S )Nr/   za b cr$   r‹   r0   )r   r¿   Ú
namedtupler[   ÚtuplerÙ   r+   r+   r.   Útest_is_namedtuple²  s    z!TestOtherUtils.test_is_namedtupleN)rG   rH   rI   rø   r+   r+   r+   r.   rõ   °  s   rõ   Ú__main__)Úrun_from_name)8Ú__doc__r¿   r¤   ry   rN   r«   r®   r›   rŸ   rQ   Zpsutil.testsr   r   r   Zpsutil._commonr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   rK   rk   r‚   r¡   rÉ   rê   rõ   rG   Zpsutil.tests.runnerrú   rm   r+   r+   r+   r.   Ú<module>   sl   B'-DGA
