o
    ˆ¶¹am8  ã                   @   s‚  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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* 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 d0d1„ d1eƒZ2G d2d3„ d3eƒZ3e4d4k�r?dd5l5m6Z6 e6e7ƒ dS dS )6z3
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)Úunittest)Ú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ÚintervalÚlogfunc                      ó   ˆ rˆ   ¡  dd  ˆ sdS ©Nr%   r   ©Úpop© ©Úqueuer.   ú=/usr/lib/python3/dist-packages/psutil/tests/test_testutils.pyÚfooD   ó
   þz2TestRetryDecorator.test_retry_success.<locals>.fooé   )r   ÚlistÚrangeÚassertEqualÚ
call_count©ÚselfÚsleepr2   r.   r/   r1   Ú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                      r*   r+   r,   r.   r/   r.   r1   r2   R   r3   z2TestRetryDecorator.test_retry_failure.<locals>.fooé   )r   r5   r6   ÚassertRaisesÚZeroDivisionErrorr7   r8   r9   r.   r/   r1   Ú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 ‚©N)Ú	TypeErrorr.   r.   r.   r1   r2   _   s   z2TestRetryDecorator.test_exception_arg.<locals>.foor   )r   Ú
ValueErrorr>   rC   r7   r8   r9   r.   r.   r1   Ú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   ó   dd  d S r+   r.   r.   r.   r.   r1   r2   j   ó   z4TestRetryDecorator.test_no_interval_arg.<locals>.foor   ©r   r>   r?   r7   r8   r9   r.   r.   r1   Ú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   rF   r+   r.   r.   r.   r.   r1   r2   t   rG   z0TestRetryDecorator.test_retries_arg.<locals>.foorH   r9   r.   r.   r1   Útest_retries_argq   s   
z#TestRetryDecorator.test_retries_argc                 C   s   | j ttddd� d S )Nr$   r%   )r'   Útimeout)r>   rD   r   )r:   r;   r.   r.   r1   Útest_retries_and_timeout_args{   s   z0TestRetryDecorator.test_retries_and_timeout_argsN)Ú__name__Ú
__module__Ú__qualname__r   Úpatchr<   r@   rE   rI   rJ   rL   r.   r.   r.   r1   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   sf   t t ¡ ƒ tt ¡ ƒd }tjdtdgƒd�� |  	tj
t |¡ W d   ƒ d S 1 s,w   Y  d S )NiŸ† úpsutil.tests.retry.__iter__r   ©Úreturn_value)r"   ÚosÚgetpidÚmaxÚpsutilÚpidsr   rP   Úiterr>   ÚNoSuchProcess)r:   Únopidr.   r.   r1   Útest_wait_for_pid‚   s
   "ÿz#TestSyncTestUtils.test_wait_for_pidc                 C   sX   |   ¡ }t|dƒ�}| d¡ W d   ƒ n1 sw   Y  t|ƒ tj |¡r*J ‚d S )NÚwr2   ©Ú
get_testfnÚopenÚwriter!   rU   ÚpathÚexists©r:   ÚtestfnÚfr.   r.   r1   Útest_wait_for_fileˆ   s   ÿz$TestSyncTestUtils.test_wait_for_filec                 C   sR   |   ¡ }t|dƒ� W d   ƒ n1 sw   Y  t|dd� tj |¡r'J ‚d S )Nr^   T)Úempty)r`   ra   r!   rU   rc   rd   ©r:   rf   r.   r.   r1   Útest_wait_for_file_empty�   s   ÿz*TestSyncTestUtils.test_wait_for_file_emptyc                 C   sP   |   ¡ }tjdtdgƒd�� |  tt|¡ W d   ƒ d S 1 s!w   Y  d S )NrR   r   rS   )r`   r   rP   rZ   r>   ÚIOErrorr!   rj   r.   r.   r1   Útest_wait_for_file_no_file–   s   "ÿz,TestSyncTestUtils.test_wait_for_file_no_filec                 C   s\   |   ¡ }t|dƒ�}| d¡ W d   ƒ n1 sw   Y  t|dd� tj |¡s,J ‚d S )Nr^   r2   F)Údeleter_   re   r.   r.   r1   Ú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   ó   dS )Nr%   r.   r.   r.   r.   r1   Ú<lambda>£   ó    z3TestSyncTestUtils.test_call_until.<locals>.<lambda>zret == 1r%   )r   r7   )r:   Úretr.   r.   r1   Útest_call_until¢   s   z!TestSyncTestUtils.test_call_untilN)	rM   rN   rO   r]   rh   rk   rm   ro   rt   r.   r.   r.   r1   rQ   €   s    rQ   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   ó<   t tƒ�}|  |jd¡ W d   ƒ d S 1 sw   Y  d S )NÚrt)r   Ú__file__r7   Úmode©r:   rg   r.   r.   r1   Útest_open_text©   ó   
"ÿzTestFSTestUtils.test_open_textc                 C   rv   )NÚrb)r   rx   r7   ry   rz   r.   r.   r1   Útest_open_binary­   r|   z TestFSTestUtils.test_open_binaryc                 C   s<   |   ¡ }t|ƒ tj |¡sJ ‚t|ƒ tj |¡sJ ‚d S rB   )r`   r   rU   rc   Úisdirrj   r.   r.   r1   Útest_safe_mkdir±   s
   zTestFSTestUtils.test_safe_mkdirc              	   C   sÐ   |   ¡ }t|dƒ ¡  t|ƒ tj |¡rJ ‚t|ƒ t |¡ t|ƒ tj |¡r,J ‚tj	dt
tjdƒd��'}|  t
¡� t|ƒ W d   ƒ n1 sLw   Y  |jsVJ ‚W d   ƒ d S 1 saw   Y  d S )Nr^   zpsutil.tests.os.statÚ )Úside_effect)r`   ra   Úcloser   rU   rc   rd   Úmkdirr   rP   ÚOSErrorÚerrnoÚEINVALr>   Úcalled)r:   rf   Úmr.   r.   r1   Útest_safe_rmpath¸   s"   

ÿ
ÿ"üz TestFSTestUtils.test_safe_rmpathc                 C   sp   |   ¡ }t ¡ }t |¡ t|ƒ� |  t ¡ tj ||¡¡ W d   ƒ n1 s)w   Y  |  t ¡ |¡ d S rB   )r`   rU   Úgetcwdr„   r   r7   rc   Újoin)r:   rf   Úbaser.   r.   r1   Ú
test_chdirË   s   

ÿzTestFSTestUtils.test_chdirN)rM   rN   rO   r{   r~   r€   rŠ   rŽ   r.   r.   r.   r1   ru   §   s    ru   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J ‚tƒ  | ¡ rJ ‚tjjrJ ‚tjjr%J ‚d S rB   )	Úspawn_testprocrX   ÚProcessÚpidÚ
is_runningr   ÚtestsÚ_pids_startedÚ_subprocesses_started)r:   ÚsubpÚpr.   r.   r1   Útest_reap_childrenÖ   s   z#TestProcessUtils.test_reap_childrenc                 C   sä   |   ¡ \}}|  |j|j¡ | ¡ sJ ‚| ¡ sJ ‚t ¡  ¡ }|  ||g¡ t ¡ jdd�}|  t|ƒd¡ |  	||¡ |  	||¡ |  | 
¡ t ¡ ¡ |  | 
¡ |j¡ t|ƒ | ¡ r`J ‚| ¡ sfJ ‚t|ƒ | ¡ rpJ ‚d S )NT)Ú	recursiveé   )Úspawn_children_pairÚassertNotEqualr’   r“   rX   r‘   Úchildrenr7   ÚlenÚassertInÚppidrU   rV   r   )r:   ÚchildÚ
grandchildrž   r.   r.   r1   Útest_spawn_children_pairß   s"   z)TestProcessUtils.test_spawn_children_pairú
POSIX onlyc                 C   s"   |   ¡ \}}|  | ¡ tj¡ d S rB   )Úspawn_zombier7   ÚstatusrX   ÚSTATUS_ZOMBIE)r:   ÚparentÚzombier.   r.   r1   Ú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
rp|  ¡ \}}t|ƒ t|ƒ |  |¡ |  |¡ d S d S )Nz-czimport time; time.sleep(60);)ÚstdoutÚstderr)r�   r   ÚassertProcessGonerX   r‘   r’   r
   ÚPopenÚ
subprocessÚPIPEr   r¦   )r:   r˜   Úcmdr’   r©   rª   r.   r.   r1   Útest_terminateù   s0   






ûzTestProcessUtils.test_terminateN)
rM   rN   rO   r™   r¤   r   ÚskipIfr   r«   r³   r.   r.   r.   r1   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	p"e
d¡d	d
„ ƒƒZdd„ ZdS )ÚTestNetUtilsc                 C   sT   t ƒ }t td|fd�¡�}|  | ¡ d |¡ W d   ƒ d S 1 s#w   Y  d S )Nr�   ©Úaddrr%   )r   Ú
contextlibÚclosingr   r7   Úgetsockname)r:   ÚportÚsr.   r.   r1   r     s   "ÿzTestNetUtils.bind_socketr¥   c                 C   sæ   |   ¡ }t|ƒ}t |¡�3 |  |jtj¡ |  |jtj	¡ |  | 
¡ |¡ tj |¡s.J ‚t t |¡j¡s9J ‚W d   ƒ n1 sCw   Y  |   ¡ }t|tjd�}t |¡� |  |jtj¡ W d   ƒ d S 1 slw   Y  d S )N)Útype)r`   r   r¸   r¹   r7   ÚfamilyÚsocketÚAF_UNIXr½   ÚSOCK_STREAMrº   rU   rc   rd   ÚstatÚS_ISSOCKÚst_modeÚ
SOCK_DGRAM)r:   ÚnameÚsockr.   r.   r1   Útest_bind_unix_socket  s   û"ÿz"TestNetUtils.test_bind_unix_socketc              	   C   s¶   dt ƒ f}ttj|d�\}}t |¡�> t |¡�  |  | ¡ |¡ |  | ¡ |¡ |  	| ¡ |¡ W d   ƒ n1 s<w   Y  W d   ƒ d S W d   ƒ d S 1 sTw   Y  d S )Nz	127.0.0.1r¶   )
r   r   r¿   ÚAF_INETr¸   r¹   r7   rº   Úgetpeernamer�   )r:   r·   ÚserverÚclientr.   r.   r1   Útcp_tcp_socketpair/  s   
ûÿ"ÿzTestNetUtils.tcp_tcp_socketpairz*/var/run/log UNIX socket opened by defaultc                 C   sÐ   t  ¡ }| ¡ }|jdd�rJ ‚|  ¡ }t|ƒ\}}zDtj |¡s#J ‚t	 
t 	|¡j¡s.J ‚|  | ¡ | d¡ |  t|jdd�ƒd¡ |  | ¡ |¡ |  | ¡ |¡ W | ¡  | ¡  d S | ¡  | ¡  w )NÚunix)Úkindr›   )rX   r‘   Únum_fdsÚconnectionsr`   r    rU   rc   rd   rÂ   rÃ   rÄ   r7   rŸ   rº   rÊ   rƒ   )r:   r˜   rÐ   rÆ   rË   rÌ   r.   r.   r1   Útest_unix_socketpair:  s    ÿ
z!TestNetUtils.test_unix_socketpairc                 C   sà   t ƒ �c}t t¡}t t¡}|D ]}||j  d7  < || tjtj¡  d7  < q|  	|tj
 d¡ tƒ r?|  	|tj d¡ trLtrL|  	|tj d¡ |  	|tj d¡ |  	|tj d¡ W d   ƒ d S 1 siw   Y  d S )Nr%   r›   )r   ÚcollectionsÚdefaultdictÚintr¾   Ú
getsockoptr¿   Ú
SOL_SOCKETÚSO_TYPEÚassertGreaterEqualrÉ   r   ÚAF_INET6r   r	   rÀ   rÁ   rÅ   )r:   ÚsocksÚfamsÚtypesr¼   r.   r.   r1   Útest_create_socketsN  s   

"óz TestNetUtils.test_create_socketsN)rM   rN   rO   r   r   r´   r   rÈ   rÍ   r   r   rÒ   rÞ   r.   r.   r.   r1   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.   r1   Úfund  s   z(TestMemLeakClass.test_times.<locals>.funrà   r   é
   é   )ÚtimesÚwarmup_timesé   )Úexecuter7   ©r:   râ   r.   rá   r1   Ú
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   rp   ©Nr   r.   r.   r.   r.   r1   rq   k  rr   z1TestMemLeakClass.test_param_err.<locals>.<lambda>r   ©rå   c                   S   rp   rë   r.   r.   r.   r.   r1   rq   l  rr   éÿÿÿÿc                   S   rp   rë   r.   r.   r.   r.   r1   rq   m  rr   )ræ   c                   S   rp   rë   r.   r.   r.   r.   r1   rq   n  rr   )Ú	tolerancec                   S   rp   rë   r.   r.   r.   r.   r1   rq   o  rr   )r'   )r>   rD   rè   ©r:   r.   r.   r1   Ú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 ~d S ~w )Nc                 S   s   |   dd ¡ d S ©NÚxxxxxxxxxxxxxxxxxxxxxxxxi   ©Úappend©Úlsr.   r.   r1   râ   v  ó   z+TestMemLeakClass.test_leak_mem.<locals>.funz	extra-memé2   rì   )ÚassertRaisesRegexÚAssertionErrorrè   )r:   rö   râ   r.   r.   r1   Ú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 rB   )ra   rx   Ú
addCleanuprƒ   rô   )rg   ©Úboxr:   r.   r1   râ   �  s   z1TestMemLeakClass.test_unclosed_files.<locals>.funÚfdÚhandlez	unclosed )r   rù   rú   rè   )r:   râ   rÏ   r.   rý   r1   Ú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.   r1   râ   Œ  r÷   z,TestMemLeakClass.test_tolerance.<locals>.funéd   r   i  €)rå   ræ   rî   r%   )rè   r7   rŸ   )r:   râ   rå   r.   rõ   r1   Útest_tolerance‹  s   
ÿzTestMemLeakClass.test_tolerancec                 C   sŽ   dd„ }|   t|¡ |  t¡� |   t|¡ W d   ƒ n1 s w   Y  dd„ }|  t¡� |   t|¡ W d   ƒ d S 1 s@w   Y  d S )Nc                   S   rF   r+   r.   r.   r.   r.   r1   râ   •  s   z0TestMemLeakClass.test_execute_w_exc.<locals>.func                   S   s   d S rB   r.   r.   r.   r.   r1   râ   ›  s   )Úexecute_w_excr?   r>   r…   rú   ré   r.   r.   r1   Útest_execute_w_exc”  s   ÿ"ÿz#TestMemLeakClass.test_execute_w_excN)rM   rN   rO   r   rê   rð   r   r´   r   rû   r  r  r  r.   r.   r.   r1   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   ó   g | ]
}|d  dkr|‘qS )r%   r¡   r.   ©Ú.0Úxr.   r.   r1   Ú
<listcomp>§  ó    z;TestTestingUtils.test_process_namespace.<locals>.<listcomp>r   )rX   r‘   r   ÚtestrZ   Úgettersr7   r¡   )r:   r˜   Únsrâ   r.   r.   r1   Útest_process_namespace£  s
   z'TestTestingUtils.test_process_namespacec                 C   s:   t ƒ }dd„ | |j¡D ƒd d }|  |ƒ t ¡ ¡ d S )Nc                 S   r  )r%   Únet_if_addrsr.   r  r.   r.   r1   r  ¬  r  z:TestTestingUtils.test_system_namespace.<locals>.<listcomp>r   )r   rZ   r  r7   rX   r  )r:   r  râ   r.   r.   r1   Útest_system_namespaceª  s   z&TestTestingUtils.test_system_namespaceN)rM   rN   rO   r  r  r.   r.   r.   r1   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J ‚t tƒ ƒrJ ‚d S )Nr2   za b cr%   r›   r4   )r   rÓ   Ú
namedtupleÚtuplerï   r.   r.   r1   Útest_is_namedtuple²  s   z!TestOtherUtils.test_is_namedtupleN)rM   rN   rO   r  r.   r.   r.   r1   r  °  s    r  Ú__main__)Úrun_from_name)8Ú__doc__rÓ   r¸   r†   rU   r¿   rÂ   r°   rX   Úpsutil.testsr   r   r   Ú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"   r#   rQ   ru   r�   rµ   rß   r  r  rM   Úpsutil.tests.runnerr  rx   r.   r.   r.   r1   Ú<module>   sp   B'-DGA
þ