o
    aÝdfì9  ã                   @   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
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
m-Z- dd%l
m.Z. G d&d'„ d'eƒZ/G d(d)„ d)eƒZ0G d*d+„ d+eƒZ1G d,d-„ d-eƒZ2G d.d/„ d/eƒZ3e(G d0d1„ d1eƒƒZ4G d2d3„ d3eƒZ5G d4d5„ d5eƒZ6e7d6krOdd7l8m9Z9 e9e:ƒ dS dS )8z1Tests for testing utils (psutil.tests namespace).é    N)ÚFREEBSD)ÚNETBSD)ÚPOSIX)Úopen_binary)Ú	open_text)Úsupports_ipv6)Ú
CI_TESTING)ÚCOVERAGE)ÚHAS_CONNECTIONS_UNIX)Ú
PYTHON_EXE)ÚPYTHON_EXE_ENV)ÚPsutilTestCase)ÚTestMemoryLeak)Úbind_socket)Úbind_unix_socket)Ú
call_until)Úchdir)Úcreate_sockets)Úfilter_proc_connections)Ú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                      ó   ˆ rˆ   ¡  dd  ˆ sdS ©Nr'   r   ©Úpop© ©Úqueuer/   úd/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/psutil/tests/test_testutils.pyÚfooD   ó
   þz2TestRetryDecorator.test_retry_success.<locals>.fooé   )r   ÚlistÚrangeÚassertEqualÚ
call_count©ÚselfÚsleepr3   r/   r0   r2   Ú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/   r0   r/   r2   r3   R   r4   z2TestRetryDecorator.test_retry_failure.<locals>.fooé   )r   r6   r7   ÚassertRaisesÚZeroDivisionErrorr8   r9   r:   r/   r0   r2   Ú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/   r2   r3   _   s   z2TestRetryDecorator.test_exception_arg.<locals>.foor   )r   Ú
ValueErrorr?   rD   r8   r9   r:   r/   r/   r2   Ú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/   r2   r3   j   ó   z4TestRetryDecorator.test_no_interval_arg.<locals>.foor   ©r   r?   r@   r8   r9   r:   r/   r/   r2   Ú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   rG   r,   r/   r/   r/   r/   r2   r3   s   rH   z0TestRetryDecorator.test_retries_arg.<locals>.foorI   r:   r/   r/   r2   Útest_retries_argq   s   
z#TestRetryDecorator.test_retries_argc                 C   s   | j ttddd d S )Nr&   r'   )r)   Útimeout)r?   rE   r   )r;   r<   r/   r/   r2   Útest_retries_and_timeout_argsz   s   z0TestRetryDecorator.test_retries_and_timeout_argsN)Ú__name__Ú
__module__Ú__qualname__r   Úpatchr=   rA   rF   rJ   rK   rM   r/   r/   r/   r2   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ÚpsutilZpidsr   rQ   Úiterr?   ZNoSuchProcess)r;   Znopidr/   r/   r2   Ú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Úwr3   ©Ú
get_testfnÚopenÚwriter#   rV   ÚpathÚexists©r;   ÚtestfnÚfr/   r/   r2   Ú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^   r_   r#   rV   ra   rb   ©r;   rd   r/   r/   r2   Ú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 )NrS   r   rT   )r^   r   rQ   rZ   r?   ÚIOErrorr#   rh   r/   r/   r2   Ú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\   r3   F)Údeleter]   rc   r/   r/   r2   Ú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/   r2   Ú<lambda>¡   ó    z3TestSyncTestUtils.test_call_until.<locals>.<lambda>zret == 1r'   )r   r8   )r;   Úretr/   r/   r2   Útest_call_until    s   z!TestSyncTestUtils.test_call_untilN)	rN   rO   rP   r[   rf   ri   rk   rm   rr   r/   r/   r/   r2   rR      s    rR   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Úr)r   Ú__file__r8   Úmode©r;   re   r/   r/   r2   Útest_open_text¦   ó   
"ÿzTestFSTestUtils.test_open_textc                 C   rt   )NÚrb)r   rv   r8   rw   rx   r/   r/   r2   Útest_open_binaryª   rz   z TestFSTestUtils.test_open_binaryc                 C   s<   |   ¡ }t|ƒ tj |¡sJ ‚t|ƒ tj |¡sJ ‚d S rC   )r^   r   rV   ra   Úisdirrh   r/   r/   r2   Ú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Ú )Zside_effect)r^   r_   Úcloser   rV   ra   rb   Úmkdirr   rQ   ÚOSErrorÚerrnoÚEINVALr?   Úcalled)r;   rd   Úmr/   r/   r2   Ú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 rC   )r^   rV   Úgetcwdr   r   r8   ra   Újoin)r;   rd   Úbaser/   r/   r2   Ú
test_chdirÉ   s   

ÿzTestFSTestUtils.test_chdirN)rN   rO   rP   ry   r|   r~   r‡   r‹   r/   r/   r/   r2   rs   ¥   s    rs   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 rC   )	Úspawn_testprocrY   ÚProcessÚpidÚ
is_runningr   ÚtestsZ_pids_startedZ_subprocesses_started)r;   ZsubpÚpr/   r/   r2   Ú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é   )Zspawn_children_pairÚassertNotEqualr   r   rY   rŽ   Úchildrenr8   ÚlenZassertInÚppidrV   rW   r!   )r;   ÚchildZ
grandchildr—   r/   r/   r2   Útest_spawn_children_pairÜ   s"   z)TestProcessUtils.test_spawn_children_pairú
POSIX onlyc                 C   s"   |   ¡ \}}|  | ¡ tj¡ d S rC   )Úspawn_zombier8   ÚstatusrY   ZSTATUS_ZOMBIE)r;   ÚparentÚzombier/   r/   r2   Útest_spawn_zombieñ   s   z"TestProcessUtils.test_spawn_zombiec                 C   sò   |   ¡ }t|ƒ |  |j¡ t|ƒ t |   ¡ j¡}t|ƒ |  |j¡ t|ƒ tddg}tj|tj	tj	t
d}t|ƒ |  |j¡ t|ƒ |   ¡ j}t|ƒ |  |j¡ t|ƒ trw|  ¡ \}}t|ƒ t|ƒ |  |j¡ |  |j¡ d S d S )Nz-czimport time; time.sleep(60);)ÚstdoutÚstderrÚenv)r   r!   ZassertPidGoner   rY   rŽ   r   ÚPopenÚ
subprocessÚPIPEr   r   r   )r;   r’   Úcmdr   rŸ   r    r/   r/   r2   Útest_terminateö   s:   
ü
ûzTestProcessUtils.test_terminateN)
rN   rO   rP   r“   r›   ÚunittestÚskipIfr   r¡   r©   r/   r/   r/   r2   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   r8   Úgetsockname)r;   ÚportÚsr/   r/   r2   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°   r8   ÚfamilyÚsocketÚAF_UNIXr´   ÚSOCK_STREAMr±   rV   ra   rb   ÚstatÚS_ISSOCKÚst_modeÚ
SOCK_DGRAM)r;   ÚnameÚsockr/   r/   r2   Ú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°   r8   r±   Úgetpeernamer–   )r;   r®   ÚserverÚclientr/   r/   r2   Útcp_tcp_socketpair0  s   
ûÿ"ÿzTestNetUtils.tcp_tcp_socketpairz*/var/run/log UNIX socket opened by defaultc                 C   sÜ   t  ¡ }| ¡ }|  t|jddƒg ¡ |  ¡ }t|ƒ\}}zFtj	 
|¡s'J ‚t t |¡j¡s2J ‚|  | ¡ | d¡ |  tt|jddƒƒd¡ |  | ¡ |¡ |  | ¡ |¡ W | ¡  | ¡  d S | ¡  | ¡  w )NÚunix)Úkindr•   )rY   rŽ   Únum_fdsr8   r   Úconnectionsr^   r"   rV   ra   rb   r¹   rº   r»   r˜   r±   rÁ   r€   )r;   r’   rÇ   r½   rÂ   rÃ   r/   r/   r2   Ú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_TYPEZassertGreaterEqualrÀ   r   ÚAF_INET6r   r
   r·   r¸   r¼   )r;   ÚsocksZfamsÚtypesr³   r/   r/   r2   Útest_create_socketsT  s   

"óz TestNetUtils.test_create_socketsN)rN   rO   rP   r   rª   r«   r   r¿   rÄ   r   r   rÉ   rÓ   r/   r/   r/   r2   r¬     s    
ÿr¬   c                   @   s`   e Zd Zeƒ dd„ ƒZdd„ Zeƒ e ed¡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/   r2   Úfuni  s   z(TestMemLeakClass.test_times.<locals>.funrÕ   r   é
   é   )ÚtimesÚwarmup_timesé   )Úexecuter8   )r;   r×   r/   rÖ   r2   Ú
test_timesg  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   rn   ©Nr   r/   r/   r/   r/   r2   ro   q  rp   z1TestMemLeakClass.test_param_err.<locals>.<lambda>r   ©rÚ   c                   S   rn   rß   r/   r/   r/   r/   r2   ro   r  rp   éÿÿÿÿc                   S   rn   rß   r/   r/   r/   r/   r2   ro   s  rp   )rÛ   c                   S   rn   rß   r/   r/   r/   r/   r2   ro   t  rp   )Ú	tolerancec                   S   rn   rß   r/   r/   r/   r/   r2   ro   u  rp   )r)   )r?   rE   rÝ   ©r;   r/   r/   r2   Útest_param_errp  s
   zTestMemLeakClass.test_param_errzskipped on CIzskipped during test coveragec                 C   s4   g }|fdd„}z| j td| j|dd W ~d S ~w )Nc                 S   s   |   dd ¡ d S )NZ|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxé   ©Úappend©Úlsr/   r/   r2   r×   }  ó   z+TestMemLeakClass.test_leak_mem.<locals>.funz	extra-memé2   rà   )ÚassertRaisesRegexÚAssertionErrorrÝ   )r;   ré   r×   r/   r/   r2   Útest_leak_memw  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 rC   )r_   rv   Z
addCleanupr€   rç   )re   ©Úboxr;   r/   r2   r×   ‰  s   z1TestMemLeakClass.test_unclosed_files.<locals>.funÚfdÚhandlez	unclosed )r   rì   rí   rÝ   )r;   r×   rÆ   r/   rï   r2   Ú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 )NZxxxxxxxxxxxxxxxxxxxxxxxxrå   ræ   r/   rè   r/   r2   r×   •  rê   z,TestMemLeakClass.test_tolerance.<locals>.funéd   r   i  €)rÚ   rÛ   râ   r'   )rÝ   r8   r˜   )r;   r×   rÚ   r/   rè   r2   Ú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   rG   r,   r/   r/   r/   r/   r2   Úfun_1   s   z2TestMemLeakClass.test_execute_w_exc.<locals>.fun_1c                   S   s   d S rC   r/   r/   r/   r/   r2   Úfun_2§  s   z2TestMemLeakClass.test_execute_w_exc.<locals>.fun_2)Zexecute_w_excr@   r?   r‚   rí   )r;   rö   r÷   r/   r/   r2   Útest_execute_w_excŸ  s   ÿ"ÿz#TestMemLeakClass.test_execute_w_excN)rN   rO   rP   r   rÞ   rä   rª   r«   r   r	   rî   ró   rõ   rø   r/   r/   r/   r2   rÔ   e  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/   r2   Ú
<listcomp>³  ó    z;TestTestingUtils.test_process_namespace.<locals>.<listcomp>r   )rY   rŽ   r   ÚtestrZ   Úgettersr8   r™   )r;   r’   Únsr×   r/   r/   r2   Ú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/   r2   rþ   ¸  rÿ   z:TestTestingUtils.test_system_namespace.<locals>.<listcomp>r   )r   rZ   r  r8   rY   r  )r;   r  r×   r/   r/   r2   Útest_system_namespace¶  s   z&TestTestingUtils.test_system_namespaceN)rN   rO   rP   r  r  r/   r/   r/   r2   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 )Nr3   za b cr'   r•   r5   )r   rÊ   Ú
namedtupleÚtuplerã   r/   r/   r2   Útest_is_namedtuple½  s   z!TestOtherUtils.test_is_namedtupleN)rN   rO   rP   r	  r/   r/   r/   r2   r  ¼  s    r  Ú__main__)Úrun_from_name);Ú__doc__rÊ   r¯   rƒ   rV   r¶   r¹   r¦   rª   rY   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"   r#   r$   r%   rR   rs   rŒ   r¬   rÔ   rù   r  rN   Zpsutil.tests.runnerr  rv   r/   r/   r/   r2   Ú<module>   sv   @&-HKH
ý