
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    xeº_T8  ã                   @   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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+ ddlZddl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�rzdd5l5m6Z6 e6e7ƒ dS )6z3
Tests for testing utils (psutil.tests namespace).
é    N)ÚFREEBSD)ÚNETBSD)ÚPOSIX)Úopen_binary)Ú	open_text)Úsupports_ipv6)Úbind_socket)Úbind_unix_socket)Ú
call_until)Úchdir)Ú
CI_TESTING)Úcreate_sockets)Úget_free_port)ÚHAS_CONNECTIONS_UNIX)Úis_namedtuple)Úmock)Úprocess_namespace)ÚPsutilTestCase)Ú
PYTHON_EXE)Úreap_children)Úretry)Úretry_on_failure)Ú
safe_mkdir)Úsafe_rmpath)Ú	serialrun)Úsystem_namespace)Útcp_socketpair)Ú	terminate)ÚTestMemoryLeak)Ú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ÚintervalZlogfunc                      s   ˆ rˆ   ¡  dd  q dS ©Nr%   r   ©Úpop© ©Úqueuer,   úN/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_testutils.pyÚfooC   s    
z2TestRetryDecorator.test_retry_success.<locals>.fooé   )r   ÚlistÚrangeÚassertEqualÚ
call_count©ÚselfÚsleepr0   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/   r0   Q   s    
z2TestRetryDecorator.test_retry_failure.<locals>.fooé   )r   r2   r3   ÚassertRaisesÚZeroDivisionErrorr4   r5   r6   r,   r-   r/   Útest_retry_failureN   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/   r0   ^   s    z2TestRetryDecorator.test_exception_arg.<locals>.foor   )r   Ú
ValueErrorr;   r@   r4   r5   r6   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/   r0   i   s    z4TestRetryDecorator.test_no_interval_arg.<locals>.foor   ©r   r;   r<   r4   r5   r6   r,   r,   r/   Útest_no_interval_arge   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/   r0   s   s    z0TestRetryDecorator.test_retries_arg.<locals>.foorC   r6   r,   r,   r/   Útest_retries_argp   s    
z#TestRetryDecorator.test_retries_argc                 C   s   | j ttddd� d S )Nr$   r%   )r'   Útimeout)r;   rA   r   )r7   r8   r,   r,   r/   Útest_retries_and_timeout_argsz   s    z0TestRetryDecorator.test_retries_and_timeout_argsN)Ú__name__Ú
__module__Ú__qualname__r   Úpatchr9   r=   rB   rD   rE   rG   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   rK   Úiterr;   ÚNoSuchProcess)r7   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Úwr0   ©Ú
get_testfnÚopenÚwriter!   rO   ÚpathÚexistsÚAssertionError©r7   Ú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 )NrV   T)Úempty)rX   rY   r!   rO   r[   r\   r]   ©r7   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 )NrM   r   rN   )rX   r   rK   rS   r;   ÚIOErrorr!   rc   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 )NrV   r0   F)ÚdeleterW   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
   r4   )r7   Úretr,   r,   r/   Útest_call_until¡   s    z!TestSyncTestUtils.test_call_untilN)	rH   rI   rJ   rU   ra   rd   rf   rh   rl   r,   r,   r,   r/   rL      s   rL   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__r4   Úmode©r7   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   ro   r4   rp   rq   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?   )rX   r   rO   r[   Úisdirr]   rc   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 )NrV   zpsutil.tests.os.statÚ )Úside_effect)rX   rY   Úcloser   rO   r[   r\   r]   Úmkdirr   rK   ÚOSErrorÚerrnoÚEINVALr;   Úcalled)r7   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?   )rX   rO   Úgetcwdrz   r   r4   r[   Újoin)r7   r_   Úbaser,   r,   r/   Ú
test_chdirÊ   s    

$zTestFSTestUtils.test_chdirN)rH   rI   rJ   rr   rt   rv   r€   r„   r,   r,   r,   r/   rm   ¦   s
   rm   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_testprocrR   ÚProcessÚpidÚ
is_runningr]   r   ÚtestsZ_pids_startedZ_subprocesses_started)r7   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]   rR   r‡   Úchildrenr4   ÚlenZassertInÚppidrO   rP   r   )r7   Ú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_zombier4   ÚstatusrR   ÚSTATUS_ZOMBIE)r7   Ú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assertProcessGonerR   r‡   rˆ   r   ÚPopenÚ
subprocessÚPIPEr   r–   )r7   r‹   Úcmdrˆ   r™   rš   r,   r,   r/   Útest_terminateø   s.    






zTestProcessUtils.test_terminateN)
rH   rI   rJ   rŒ   r”   r   Ú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 )Nrw   ©Úaddrr%   )r   Ú
contextlibÚclosingr   r4   Úgetsockname)r7   Ú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)rX   r	   r§   r¨   r4   ÚfamilyÚsocketÚAF_UNIXr¬   ÚSOCK_STREAMr©   rO   r[   r\   r]   ÚstatÚS_ISSOCKÚst_modeÚ
SOCK_DGRAM)r7   Ú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¨   r4   r©   Úgetpeernamer�   )r7   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Ž   )rR   r‡   Únum_fdsZconnectionsr]   rX   r    ry   rO   r[   r\   r±   r²   r³   r4   r‘   r©   r¹   )r7   r‹   r¿   rµ   rº   r»   r,   r,   r/   Útest_unix_socketpair9  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´   )r7   ZsocksZfamsÚtypesr«   r,   r,   r/   Útest_create_socketsM  s    

z TestNetUtils.test_create_socketsN)rH   rI   rJ   r   r   r£   r   r·   r¼   r   r   rÀ   rÉ   r,   r,   r,   r/   r¤     s   

ÿr¤   c                   @   sN   e Zd Z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/   Úfunb  s    z(TestMemLeakClass.test_times.<locals>.funrË   r   é
   é   )ÚtimesÚwarmup_timesé   )Úexecuter4   ©r7   rÍ   r,   rÌ   r/   Ú
test_timesa  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/   ri   i  rj   z1TestMemLeakClass.test_param_err.<locals>.<lambda>r   ©rÐ   c                   S   s   dS rÖ   r,   r,   r,   r,   r/   ri   j  rj   éÿÿÿÿc                   S   s   dS rÖ   r,   r,   r,   r,   r/   ri   k  rj   )rÑ   c                   S   s   dS rÖ   r,   r,   r,   r,   r/   ri   l  rj   )Ú	tolerancec                   S   s   dS rÖ   r,   r,   r,   r,   r/   ri   m  rj   )r'   )r;   rA   rÓ   ©r7   r,   r,   r/   Útest_param_errh  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Í   t  s    z+TestMemLeakClass.test_leak_mem.<locals>.funz	extra-memé2   r×   )ÚassertRaisesRegexr]   rÓ   )r7   rà   rÍ   r,   r,   r/   Útest_leak_memo  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?   )rY   ro   Z
addCleanupry   rÞ   )r`   ©Zboxr7   r,   r/   rÍ     s    z1TestMemLeakClass.test_unclosed_files.<locals>.funÚfdÚhandlez	unclosed )r   râ   r]   rÓ   )r7   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Ó   r4   r‘   )r7   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;   r{   r]   rÔ   r,   r,   r/   Útest_execute_w_exc’  s    z#TestMemLeakClass.test_execute_w_excN)rH   rI   rJ   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   )rR   r‡   r   ÚtestrS   Úgettersr4   r’   )r7   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   rS   rñ   r4   rR   rô   )r7   rò   rÍ   r,   r,   r/   Útest_system_namespace¨  s    z&TestTestingUtils.test_system_namespaceN)rH   rI   rJ   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 )Nr0   za b cr%   rŽ   r1   )r   rÁ   Ú
namedtupler]   ÚtuplerÚ   r,   r,   r/   Útest_is_namedtuple°  s    z!TestOtherUtils.test_is_namedtupleN)rH   rI   rJ   rù   r,   r,   r,   r/   rö   ®  s   rö   Ú__main__)Úrun_from_name)8Ú__doc__rÁ   r§   r|   rO   r®   r±   rŸ   rR   r   r   r   Zpsutil._commonr   r   r   Zpsutil.testsr   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#   rL   rm   r…   r¤   rÊ   rë   rö   rH   Zpsutil.tests.runnerrû   ro   r,   r,   r,   r/   Ú<module>   sl   B'-DG@
