
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    Œ=Ý_7é  ã                   @   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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 m0Z0 dd"l m1Z1 dd#l m2Z2 dd$l m3Z3 dd%l m4Z4 dd&l m5Z5 dd'l m6Z6 dd(l m7Z7 dd)l m8Z8 dd*l m9Z9 dd+l m:Z: dd,l m;Z; dd-l m<Z< G d.d/„ d/e2ƒZ=e�r¬e >¡ dk�r¬G d0d1„ d1e=ƒZ?G d2d3„ d3e2ƒZ@eAd4k�rÚdd5lBmCZC eCeDƒ dS )6úTests for psutil.Process class.é    N)ÚAIX)ÚBSD)ÚLINUX)ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚOSX)ÚPOSIX)ÚSUNOS)ÚWINDOWS)Ú	open_text)ÚFileNotFoundError)Úlong)ÚPY3)Úsuper)ÚAPPVEYOR)Ú
call_until)Ú
CI_TESTING)Úcopyload_shared_lib)Ú
create_exe)ÚGITHUB_ACTIONS)ÚGLOBAL_TIMEOUT)ÚHAS_CPU_AFFINITY)ÚHAS_ENVIRON)Ú
HAS_IONICE)ÚHAS_MEMORY_MAPS)ÚHAS_PROC_CPU_NUM)ÚHAS_PROC_IO_COUNTERS)Ú
HAS_RLIMIT)ÚHAS_THREADS)Úmock)Úprocess_namespace)ÚPsutilTestCase)ÚPYPY)Ú
PYTHON_EXE©Úreap_children)Úretry_on_failure)Úsh)Úskip_on_access_denied)Úskip_on_not_implemented)Ú
ThreadTask)Úunittest)Úwait_for_pidc                   @   sÒ  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	 
e d¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Ze	 
e d!¡d"d#„ ƒZd$d%„ Ze	 
e d&¡d'd(„ ƒZe	 
e d!¡eed)�d*d+„ ƒƒZe	 
e d!¡e	 
e d,¡d-d.„ ƒƒZe	 
e d!¡e	 
e  d/¡d0d1„ ƒƒZ!e	 
e" d!¡d2d3„ ƒZ#e	 
e" d!¡d4d5„ ƒZ$e	 
e" d!¡d6d7„ ƒZ%e	 
e" d!¡d8d9„ ƒZ&e	 
e" d!¡d:d;„ ƒZ'd<d=„ Z(e	 
e  d>¡d?d@„ ƒZ)e	 
e* d!¡dAdB„ ƒZ+e,ƒ e-e.d)�e	 
e* d!¡dCdD„ ƒƒƒZ/e,ƒ dEdF„ ƒZ0dGdH„ Z1e	 
e2 d!¡dIdJ„ ƒZ3e	 
e2 d!¡dKdL„ ƒZ4dMdN„ Z5dOdP„ Z6dQdR„ Z7dSdT„ Z8e	 
e9dU¡dVdW„ ƒZ:dXdY„ Z;e	 
e9dZ¡d[d\„ ƒZ<e	 
e=d]¡e	 
e>d^¡e	 
e9dU¡d_d`„ ƒƒƒZ?e	 
e d&¡dadb„ ƒZ@e	 
e d&¡dcdd„ ƒZAdedf„ ZBdgdh„ ZCdidj„ ZDdkdl„ ZEdmdn„ ZFe	 
eG d!¡dodp„ ƒZHe	 
eG d!¡dqdr„ ƒZIe	 
eG d!¡dsdt„ ƒZJe	 
eKdu¡e	 
eLdv¡dwdx„ ƒƒZMe	 
eKdu¡e	 
eLdv¡dydz„ ƒƒZNe	 
e d&¡d{d|„ ƒZOeed)�e	 
eP�p´eQd}¡d~d„ ƒƒZRd€d�„ ZSd‚dƒ„ ZTd„d…„ ZUd†d‡„ ZVe,ƒ dˆd‰„ ƒZWdŠd‹„ ZXdŒd�„ ZYdŽd�„ ZZd�d‘„ Z[d’d“„ Z\d”d•„ Z]d–d—„ Z^d˜d™„ Z_dšd›„ Z`dœd�„ ZadždŸ„ Zbe	 
e d&¡d d¡„ ƒZce	 
e d&¡d¢d£„ ƒZde	 
e d&¡d¤d¥„ ƒZed¦d§„ Zfe	 
eg d!¡d¨d©„ ƒZhe	 
eg d!¡e	 
e d&¡dªd«„ ƒƒZid¬S )­ÚTestProcessr   c                 O   s   | j ||Ž}t |j¡S ©N)Úspawn_testprocÚpsutilÚProcessÚpid)ÚselfÚargsÚkwargsÚsproc© r9   úL/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_process.pyÚspawn_psprocN   s    zTestProcess.spawn_psprocc              	   C   s:   t  ¡ }|  |jt ¡ ¡ |  t¡� d|_W 5 Q R X d S )Né!   )r2   r3   ÚassertEqualr4   ÚosÚgetpidÚassertRaisesÚAttributeError©r5   Úpr9   r9   r:   Útest_pidT   s    zTestProcess.test_pidc                 C   sJ   |   ¡ }| ¡  | ¡ }tr,|  |tj¡ n|  |tj ¡ |  |¡ d S r0   )	r;   ÚkillÚwaitr   r=   ÚsignalÚSIGTERMÚSIGKILLÚassertProcessGone©r5   rC   Úcoder9   r9   r:   Ú	test_killZ   s    zTestProcess.test_killc                 C   sJ   |   ¡ }| ¡  | ¡ }tr,|  |tj¡ n|  |tj ¡ |  |¡ d S r0   )r;   Ú	terminaterF   r   r=   rG   rH   rJ   rK   r9   r9   r:   Útest_terminated   s    zTestProcess.test_terminatec                 C   sX   t r
tjntj}|  ¡ }| |¡ | ¡ }tr<|  ||¡ n|  || ¡ |  	|¡ d S r0   )
r
   rG   rI   rH   r;   Úsend_signalrF   r   r=   rJ   )r5   ÚsigrC   rL   r9   r9   r:   Útest_send_signaln   s    
zTestProcess.test_send_signalz	not POSIXc              	   C   s‚   t j}|  ¡ }tjdttjdƒd�� |  t	j
|j|¡ W 5 Q R X |  ¡ }tjdttjdƒd�� |  t	j|j|¡ W 5 Q R X d S )Nzpsutil.os.killÚ ©Úside_effect)rG   rH   r;   r!   ÚpatchÚOSErrorÚerrnoZESRCHr@   r2   ÚNoSuchProcessrP   ÚEPERMÚAccessDenied)r5   rQ   rC   r9   r9   r:   Útest_send_signal_mockedy   s    
ÿ
ÿz#TestProcess.test_send_signal_mockedc                 C   sÒ   t ddg}|  |¡}| ¡ }|  |d¡ |  |¡ t ddg}| j|tjd�}| ¡ }|  |d¡ |  |¡ t ddg}|  |¡}| ¡ }|  |d¡ |  |¡ t dd	g}|  |¡}| ¡ }|  |d¡ |  |¡ d S )
Nú-cÚpassr   z1 / 0)Ústderré   zimport sys; sys.exit(5);é   zimport os; os._exit(5);)r%   r;   rF   r=   rJ   Ú
subprocessÚPIPE)r5   ÚcmdrC   rL   r9   r9   r:   Útest_wait_exited†   s(    









zTestProcess.test_wait_exitedc                 C   sê   |   ¡ }tr‚| tj¡ | jtj|jdd� | tj	¡ | jtj|jdd� | tj
¡ |  | ¡ tj
 ¡ |  | ¡ tj
 ¡ nd| ¡  | jtj|jdd� | ¡  | jtj|jdd� | ¡  |  | ¡ tj
¡ |  | ¡ tj
¡ d S )Nçü©ñÒMbP?)Útimeout)r;   r
   rP   rG   ÚSIGSTOPr@   r2   ÚTimeoutExpiredrF   ÚSIGCONTrH   r=   ÚsuspendÚresumerN   rB   r9   r9   r:   Útest_wait_stopped¡   s     zTestProcess.test_wait_stoppedc                 C   s’   |   ¡ \}}|  tj|jd¡ |  tj|jd¡ | ¡  | ¡  | ¡ }| ¡ }trr|  |tj	 ¡ |  |d ¡ n|  |tj	¡ |  |tj	¡ d S )Nç{®Gáz„?)
Úspawn_children_pairr@   r2   ri   rF   rN   r
   r=   rG   rH   )r5   ÚchildÚ
grandchildZ	child_retZgrandchild_retr9   r9   r:   Útest_wait_non_children¶   s    z"TestProcess.test_wait_non_childrenc                 C   sH   |   ¡ }| ¡  |  tj|jd¡ |  tj|jd¡ |  t|jd¡ d S )Nrn   r   éÿÿÿÿ)r;   Únamer@   r2   ri   rF   Ú
ValueErrorrB   r9   r9   r:   Útest_wait_timeoutË   s
    zTestProcess.test_wait_timeoutc                 C   s¢   |   ¡ }|  tj|jd¡ | ¡  t ¡ t }t ¡ |k rfz| d¡}W qpW q. tjk
rb   Y q.X q.|  d¡‚t	r†|  
|tj ¡ n|  
|tj¡ |  |¡ d S )Nr   rg   )r;   r@   r2   ri   rF   rE   Útimer   Úfailr
   r=   rG   rI   rH   rJ   )r5   rC   Zstop_atrL   r9   r9   r:   Útest_wait_timeout_nonblockingÒ   s    

z)TestProcess.test_wait_timeout_nonblockingc              	   C   sx   t  ¡ }|jdd� |jdd� tdƒD ](}|jd d�}|  |t¡ |  |d¡ q(|  t¡� |jdd� W 5 Q R X d S )Nrf   )Úintervaléd   ç        rs   )	r2   r3   Úcpu_percentÚrangeÚassertIsInstanceÚfloatÚassertGreaterEqualr@   ru   )r5   rC   ÚxÚpercentr9   r9   r:   Útest_cpu_percentå   s    zTestProcess.test_cpu_percentc              	   C   s4   t jdd d��}t ¡  ¡  |js&t‚W 5 Q R X d S )Nzpsutil.cpu_count)Zreturn_value)r!   rV   r2   r3   r}   ÚcalledÚAssertionError)r5   Úmr9   r9   r:   Útest_cpu_percent_numcpus_noneð   s    z)TestProcess.test_cpu_percent_numcpus_nonec              	   C   sŠ   t  ¡  ¡ }|jdks(|jdks(t|ƒ‚|jdks:t|ƒ‚|jdksLt|ƒ‚trb|j	dksbt|ƒ‚|j
D ]}t dt t||ƒ¡¡ qhd S )Nr|   z%H:%M:%S)r2   r3   Ú	cpu_timesÚuserÚsystemr†   Úchildren_userÚchildren_systemr   ZiowaitÚ_fieldsrw   ÚstrftimeÚ	localtimeÚgetattr)r5   Útimesrt   r9   r9   r:   Útest_cpu_timesö   s    
zTestProcess.test_cpu_timesc                 C   sŒ   t  ¡  ¡ d d… \}}t ¡ d d… \}}t||gƒt||gƒ dkrZ|  d||f ¡ t||gƒt||gƒ dkrˆ|  d||f ¡ d S )Né   çš™™™™™¹?zexpected: %s, found: %s)r2   r3   r‰   r>   r’   ÚmaxÚminrx   )r5   Ú	user_timeZkernel_timeÚutimeZktimer9   r9   r:   Útest_cpu_times_2  s    zTestProcess.test_cpu_times_2znot supportedc                 C   sP   t  ¡ }| ¡ }|  |d¡ t  ¡ dkr4|  |d¡ |  | ¡ tt  ¡ ƒ¡ d S ©Nr   r`   )r2   r3   Zcpu_numr�   Ú	cpu_countr=   ÚassertInr~   )r5   rC   Únumr9   r9   r:   Útest_cpu_num  s    zTestProcess.test_cpu_numc                 C   sZ   |   ¡ }t ¡ }| ¡ }t|| ƒ}|dkr@|  d|||f ¡ t dt | ¡ ¡¡ d S )Nr”   z'expected: %s, found: %s, difference: %sz%Y %m %d %H:%M:%S)r;   rw   Úcreate_timeÚabsrx   r�   r�   )r5   rC   Únowr    Ú
differencer9   r9   r:   Útest_create_time  s    ÿzTestProcess.test_create_timez
POSIX onlyc                 C   s4   t  ¡  ¡ }|d k	r0tj tdƒ¡}|  ||¡ d S )NÚtty)r2   r3   Úterminalr>   ÚpathÚrealpathr)   r=   )r5   r¦   r¥   r9   r9   r:   Útest_terminal'  s    zTestProcess.test_terminal)Zonly_ifc              	   C   s¨  t  ¡ }| ¡ }ttdƒ�}| ¡  W 5 Q R X | ¡ }ts„ts„|  |j	|j	¡ |  
|j|j¡ tr¤|  |j|j¡ |  
|j|j¡ n |  |j|j¡ |  |j|j¡ | ¡ }t|  ¡ dƒ�.}trÖ| tdd dƒ¡ n| dd ¡ W 5 Q R X | ¡ }|  |j|j¡ |  |j|j¡ |  |j	|j	¡ |  |j|j¡ t�r\|  |j|j¡ |  |j|j¡ tt|ƒƒD ]:}t�r€|dk�r€�qh|  || d¡ |  || d¡ �qhd S )NÚrbÚwbr‚   i@B Úasciir”   r   )r2   r3   Zio_countersÚopenr%   Úreadr   r   ÚassertGreaterÚ
read_countr=   Úwrite_countr   Z
read_charsZwrite_charsr�   Ú
read_bytesÚwrite_bytesÚ
get_testfnr   ÚwriteÚbytesr~   Úlen)r5   rC   Zio1ÚfZio2Úir9   r9   r:   Útest_io_counters.  s>    zTestProcess.test_io_countersz
linux onlyc              
   C   sÄ  t  ¡ }ts"|  | ¡ d t j¡ |  t jd¡ |  t jd¡ |  t jd¡ |  t jd¡ | ¡ }�z4| t j¡ |  t	| ¡ ƒt jdf¡ |  
t¡� |jt jdd� W 5 Q R X | t j¡ |  t	| ¡ ƒt jdf¡ |jt jdd� |  t	| ¡ ƒt jdf¡ |  
t¡� |jt jdd� W 5 Q R X z|jt jdd� W n t jk
�rT   Y nX |  td|jt jd¡ |  td|jt jd¡ | jtd	|jdd� W 5 |\}}|t jk�r²d}| ||¡ X d S )
Nr   r`   r”   é   é   ©Úvalueé   zioclass accepts no valuez$'ioclass' argument must be specified)r2   r3   r   r=   ÚioniceZIOPRIO_CLASS_NONEZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLEÚtupler@   ru   r[   ÚassertRaisesRegex)r5   rC   ÚinitÚioclassr¾   r9   r9   r:   Útest_ionice_linuxY  s^       þ   þ  þ
zTestProcess.test_ionice_linuxz!not supported on this win versionc              	   C   sâ   t  ¡ }ts|  | ¡ t j¡ | ¡ }zª| t j¡ |  | ¡ t j¡ | t j¡ |  | ¡ t j¡ z| t j¡ W n t j	k
rŠ   Y nX |  | ¡ t j¡ | j
td|jt jdd� |  
td|jt jd ¡ W 5 | |¡ X d S )Nz&value argument not accepted on Windowsr`   r½   zis not a valid priority)r2   r3   r   r=   rÀ   ZIOPRIO_NORMALZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_HIGHr[   rÂ   Ú	TypeErrorru   )r5   rC   rÃ   r9   r9   r:   Útest_ionice_win…  s8       þ  þzTestProcess.test_ionice_winc                 C   sÐ   dd l }t t ¡ ¡}dd„ ttƒD ƒ}|s4t|ƒ‚|D ]’}tt|ƒ}|  |d¡ |t|ƒkr�|  	|t||ƒ¡ t
rvq8|  	| |¡| |¡¡ q8| |¡}|  	t|ƒd¡ |  |d d¡ |  |d d¡ q8d S )Nr   c                 S   s   g | ]}|  d ¡r|‘qS )ZRLIMIT©Ú
startswith©Ú.0r‚   r9   r9   r:   Ú
<listcomp>¦  s     
 z/TestProcess.test_rlimit_get.<locals>.<listcomp>r”   rs   r`   )Úresourcer2   r3   r>   r?   Údirr†   r‘   r�   r=   r$   ÚrlimitZ	getrlimitr·   )r5   rÍ   rC   Únamesrt   r¾   Úretr9   r9   r:   Útest_rlimit_get¢  s     

zTestProcess.test_rlimit_getc              	   C   s€   |   ¡ }| tjd¡ |  | tj¡d¡ trX|  td¡� tj 	d¡ d¡ W 5 Q R X |  
t¡� | tjd¡ W 5 Q R X d S )N)ra   ra   zcan't use prlimitr   )ra   ra   ra   )r;   rÏ   r2   ZRLIMIT_NOFILEr=   r   rÂ   ru   Z_psplatformr3   r@   rB   r9   r9   r:   Útest_rlimit_set¹  s    zTestProcess.test_rlimit_setc                 C   sÞ   t  ¡ }|  ¡ }| t j¡\}}zŒ| t jd|f¡ t|dƒ�}| d¡ W 5 Q R X |  t	¡�&}t|dƒ�}| d¡ W 5 Q R X W 5 Q R X |  t
rš|jjn|jd tj¡ W 5 | t j||f¡ |  | t j¡||f¡ X d S )Né   r«   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   )r2   r3   r´   rÏ   ÚRLIMIT_FSIZEr=   r­   rµ   r@   ÚIOErrorr   Ú	exceptionrX   ZEFBIG)r5   rC   ÚtestfnÚsoftÚhardr¸   Úexcr9   r9   r:   Útest_rlimitÆ  s    ÿzTestProcess.test_rlimitc                 C   s˜   t  ¡ }| t j¡\}}zN| t jd|f¡ | t jt j|f¡ t|  ¡ dƒ�}| d¡ W 5 Q R X W 5 | t j||f¡ |  | t j¡||f¡ X d S )NrÔ   r«   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)	r2   r3   rÏ   rÕ   r=   ÚRLIM_INFINITYr­   r´   rµ   )r5   rC   rÙ   rÚ   r¸   r9   r9   r:   Útest_rlimit_infinityÚ  s    z TestProcess.test_rlimit_infinityc                 C   s<   t  ¡ }| t j¡\}}|  t j|¡ | t j||f¡ d S r0   )r2   r3   rÏ   rÕ   r=   rÝ   )r5   rC   rÙ   rÚ   r9   r9   r:   Útest_rlimit_infinity_valueé  s    z&TestProcess.test_rlimit_infinity_valuec              	   C   sr   t  ¡ }tr<z| ¡ }W qD t jk
r8   t d¡‚Y qDX n| ¡ }tƒ � | ¡ }|  ||d ¡ W 5 Q R X d S )Nú$on OpenBSD this requires root accessr`   )	r2   r3   r   Únum_threadsr[   r-   ÚSkipTestr,   r=   )r5   rC   Ústep1Ústep2r9   r9   r:   Útest_num_threadsõ  s    zTestProcess.test_num_threadszWINDOWS onlyc                 C   s   t  ¡ }|  | ¡ d¡ d S ©Nr   )r2   r3   r¯   Znum_handlesrB   r9   r9   r:   Útest_num_handles  s    zTestProcess.test_num_handlesc              	   C   s¸   t  ¡ }tr<z| ¡ }W qD t jk
r8   t d¡‚Y qDX n| ¡ }tƒ �d | ¡ }|  t	|ƒt	|ƒd ¡ |d }|  |j
|d ¡ |  |j|d ¡ |  |j|d ¡ W 5 Q R X d S )Nrà   r`   r   r”   )r2   r3   r   Úthreadsr[   r-   râ   r,   r=   r·   Úidr˜   Úsystem_time)r5   rC   rã   rä   Zathreadr9   r9   r:   Útest_threads  s    zTestProcess.test_threadsc                 C   sŽ   |   ¡ }tr:z| ¡  W n  tjk
r8   t d¡‚Y nX | j| ¡ j	t
dd„ | ¡ D ƒƒdd� | j| ¡ jt
dd„ | ¡ D ƒƒdd� d S )Nrà   c                 S   s   g | ]
}|j ‘qS r9   )r˜   rÊ   r9   r9   r:   rÌ   -  s     z.TestProcess.test_threads_2.<locals>.<listcomp>r•   )Údeltac                 S   s   g | ]
}|j ‘qS r9   )rê   rÊ   r9   r9   r:   rÌ   0  s     )r;   r   rè   r2   r[   r-   râ   ZassertAlmostEqualr‰   rŠ   Úsumr‹   rB   r9   r9   r:   Útest_threads_2   s$    ÿ
 þ þzTestProcess.test_threads_2c                 C   sÞ   t  ¡ }| ¡ d d… \}}| ¡ }|  |d¡ |  |d¡ d gd }| ¡ d d… \}}| ¡ }|  ||¡ |  ||¡ |  ||¡ ~tr´| ¡ }	|  |	j|	j	¡ |  |	j
|	j¡ | ¡ }	|	jD ]}
|  t|	|
ƒd¡ qÂd S )Nr”   r   i`ã )r2   r3   Zmemory_infoÚmemory_percentr¯   r�   r   r=   ZrssZwsetÚvmsZpagefilerŽ   r‘   )r5   rC   Zrss1Zvms1Zpercent1ZmemarrZrss2Zvms2Zpercent2Úmemrt   r9   r9   r:   Útest_memory_info2  s&    

zTestProcess.test_memory_infoc                 C   sª   t  ¡ }t  ¡ j}| ¡ }|jD ]J}t||ƒ}| j|d||fd� |dkrNts t	rTq | j
|||||fd� q t	sxtsxtr†|  |jd¡ t	r¦|  |jd¡ |  |jd¡ d S )Nr   )Úmsgrð   )r2   r3   Zvirtual_memoryÚtotalZmemory_full_inforŽ   r‘   r�   r	   r   ZassertLessEqualr   r   ÚussZpssZswap)r5   rC   rô   rñ   rt   r¾   r9   r9   r:   Útest_memory_full_infoQ  s    


z!TestProcess.test_memory_full_infoc                 C   s®  t  ¡ }| ¡ }dd„ |D ƒ}|  t|ƒtt|ƒƒ¡ |jdd�}|D ]ò}|j d¡sFtj 	|j¡snt
|jƒ‚trèz*tj |j¡sštj |j¡sšt
|jƒ‚W nH t
k
rä   ts´‚ n,tdƒ�}| ¡ }W 5 Q R X d|j |krà‚ Y nX qFdtj |j¡krFzt |j¡}W n tk
�r    Y qFX t |j¡sFt
|jƒ‚qF|D ]j}|jD ]\}	t||	ƒ}
|	d	k�rf�qHn<|	d
k�r€|
�s¢t
|
ƒ‚n"|  |
ttf¡ |
dk�sHt
|
ƒ‚�qH�q>d S )Nc                 S   s   g | ]}|‘qS r9   r9   rÊ   r9   r9   r:   rÌ   e  s     z0TestProcess.test_memory_maps.<locals>.<listcomp>F)Zgroupedú[z/proc/self/smapsz%s (deleted)Z64r§   )ÚaddrZpermsr   )r2   r3   Úmemory_mapsr=   r·   Úsetr§   rÉ   r>   Úisabsr†   r
   ÚexistsÚislinkr   r   r®   ÚbasenameÚstatr   ÚS_ISREGÚst_moderŽ   r‘   r   Úintr   )r5   rC   ÚmapsÚpathsZext_mapsÚntr¸   ÚdataÚstÚfnamer¾   r9   r9   r:   Útest_memory_mapsa  sJ    ÿÿ





zTestProcess.test_memory_mapsc              	      sL   t  ¡ }tƒ �4}dd„ ‰ ‡ fdd„| ¡ D ƒ}|  ˆ |ƒ|¡ W 5 Q R X d S )Nc                 S   s   t j t j | ¡¡S r0   )r>   r§   r¨   Únormcase)rC   r9   r9   r:   Únormpath”  s    z8TestProcess.test_memory_maps_lists_lib.<locals>.normpathc                    s   g | ]}ˆ |j ƒ‘qS r9   )r§   rÊ   ©r  r9   r:   rÌ   –  s   ÿz:TestProcess.test_memory_maps_lists_lib.<locals>.<listcomp>)r2   r3   r   rù   r�   )r5   rC   r§   Zlibpathsr9   r  r:   Útest_memory_maps_lists_lib�  s    
ÿz&TestProcess.test_memory_maps_lists_libc                 C   s>   t  ¡ }| ¡  | jt|jdd� ts.ts.tr:|jdd� d S )Nz?!?)Zmemtyperõ   )r2   r3   rï   r@   ru   r   r   r   rB   r9   r9   r:   Útest_memory_percentš  s
    zTestProcess.test_memory_percentc                 C   sL   |   ¡ }| ¡ st‚| ¡ s t‚| ¡  | ¡  | ¡ r<t‚| ¡ rHt‚d S r0   )r;   Ú
is_runningr†   rE   rF   rB   r9   r9   r:   Útest_is_running¡  s    zTestProcess.test_is_runningc                 C   sÔ   |   ¡ }| ¡ }z|  |t¡ W n” tk
r´   trbt|ƒttƒkrbtjj	}|  ||ƒ|tƒ¡ nNdt
jd t
jd f }z |  | |d¡t |d¡¡ W n tk
r®   Y nX Y nX t|ddgƒ}|  |d¡ d S )Nz%s.%sr   r`   rS   r]   zimport os; print('hey')Zhey)r;   Úexer=   r%   r†   r   r·   r>   r§   r
  ÚsysÚversion_infoÚreplacer)   )r5   rC   r  r
  ÚverÚoutr9   r9   r:   Útest_exeª  s"    
ÿzTestProcess.test_exec                 C   sV   t ddg}|  |¡}ts ts tr6|  | ¡ d t ¡ n|  d | ¡ ¡d |¡¡ d S )Nr]   zimport time; time.sleep(60)r   ú )r%   r;   r   r   r   r=   ÚcmdlineÚjoin)r5   r  rC   r9   r9   r:   Útest_cmdlineÆ  s
    

zTestProcess.test_cmdlinezbroken on PYPYc                 C   s>   |   ¡ }t|ƒ |gdgd  }|  |¡}|  | ¡ |¡ d S )NÚ
0123456789é   )r´   r   r;   r=   r  )r5   rØ   r  rC   r9   r9   r:   Útest_long_cmdlineÓ  s
    
zTestProcess.test_long_cmdlinec                 C   sJ   |   t¡}| ¡  ¡ }tj tj tj	¡¡ ¡ }| 
|¡sFt||fƒ‚d S r0   )r;   r%   rt   Úlowerr>   r§   rþ   r¨   r  Ú
executablerÉ   r†   )r5   rC   rt   Zpyexer9   r9   r:   Ú	test_nameÛ  s    
zTestProcess.test_namezunreliable on PYPYc                 C   s:   | j dd�}t|ƒ |  |¡}|  | ¡ tj |¡¡ d S )NZ01234567890123456789©Úsuffix)r´   r   r;   r=   rt   r>   r§   rþ   )r5   rØ   rC   r9   r9   r:   Útest_long_nameá  s    
zTestProcess.test_long_namezbroken on SUNOSzbroken on AIXc                 C   s|   | j dd�}t|ƒ |ddddddg}|  |¡}|  | ¡ |¡ |  | ¡ tj |¡¡ |  tj 	| 
¡ ¡tj 	|¡¡ d S )Nz	foo bar )r"  r]   z9import time; [time.sleep(0.01) for x in range(3000)];arg1Zarg2rS   Zarg3)r´   r   r;   r=   r  rt   r>   r§   rþ   r
  r  )r5   Z
funky_pathr  rC   r9   r9   r:   Útest_prog_w_funky_nameé  s       þ

ÿz"TestProcess.test_prog_w_funky_namec                 C   sX   t  ¡ }| ¡ \}}}|  |t ¡ ¡ |  |t ¡ ¡ ttdƒrT|  t ¡ | ¡ ¡ d S ©NÚ	getresuid)	r2   r3   Úuidsr=   r>   ÚgetuidÚgeteuidÚhasattrr'  ©r5   rC   ÚrealÚ	effectiveÚsavedr9   r9   r:   Ú	test_uidsû  s    
zTestProcess.test_uidsc                 C   sX   t  ¡ }| ¡ \}}}|  |t ¡ ¡ |  |t ¡ ¡ ttdƒrT|  t ¡ | ¡ ¡ d S r&  )	r2   r3   Úgidsr=   r>   ÚgetgidÚgetegidr+  Ú	getresgidr,  r9   r9   r:   Ú	test_gids	  s    
zTestProcess.test_gidsc                 C   sv  t  ¡ }|  t|jd¡ | ¡ }�z$tršt jt jt j	t j
t jt jfD ]R}| j|d��< z| |¡ W n t jk
rz   Y nX |  | ¡ |¡ W 5 Q R X qDnªz�ttdƒrÄ|  t tjt ¡ ¡| ¡ ¡ | d¡ |  | ¡ d¡ ttdƒ�r|  t tjt ¡ ¡| ¡ ¡ t�s(| d¡ |  | ¡ d¡ W n t jk
�rB   Y nX W 5 z| |¡ W n t jk
�rn   Y nX X d S )NÚstr)ÚprioÚgetpriorityr`   r   )r2   r3   r@   rÆ   Únicer[   r   ZNORMAL_PRIORITY_CLASSZIDLE_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZREALTIME_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZABOVE_NORMAL_PRIORITY_CLASSZsubTestr=   r+  r>   r8  ÚPRIO_PROCESSr?   r   )r5   rC   rÃ   r7  r9   r9   r:   Ú	test_nice  sP    û
þ
þ

zTestProcess.test_nicec                 C   s   t  ¡ }|  | ¡ t j¡ d S r0   )r2   r3   r=   ÚstatusÚSTATUS_RUNNINGrB   r9   r9   r:   Útest_statusC  s    zTestProcess.test_statusc                 C   sd   |   ¡ }| ¡ }trP| d¡\}}|  |t ¡ ¡ dtjkr`|  |tjd ¡ n|  |t ¡ ¡ d S )Nú\Z
USERDOMAIN)	r;   Úusernamer   Úsplitr=   ÚgetpassZgetuserr>   Úenviron)r5   rC   r@  Údomainr9   r9   r:   Útest_usernameG  s    
zTestProcess.test_usernamec                 C   s    |   ¡ }|  | ¡ t ¡ ¡ d S r0   )r;   r=   Úcwdr>   ÚgetcwdrB   r9   r9   r:   Útest_cwdR  s    zTestProcess.test_cwdc                 C   s$   t ddg}|  |¡}t|jdƒ d S )Nr]   z/import os, time; os.chdir('..'); time.sleep(60)z#ret == os.path.dirname(os.getcwd()))r%   r;   r   rF  )r5   rd   rC   r9   r9   r:   Ú
test_cwd_2V  s
    ÿ
zTestProcess.test_cwd_2c                 C   s†  t  ¡ }| ¡ }|st|ƒ‚|  |j|¡ ttdƒrL|  |tt 	|j
¡ƒ¡ |  t|ƒtt|ƒƒ¡ tttt jdd�ƒƒƒ}|D ]j}| |g¡ |  | ¡ |g¡ ttdƒrÈ|  | ¡ tt 	|j
¡ƒ¡ t|dƒr€|  | ¡ d | ¡ ¡ q€| g ¡ t�r|  | ¡ |j ¡ ¡ n|  | ¡ |¡ ttdƒ�rL|  | ¡ tt 	|j
¡ƒ¡ |  t|jd¡ | |¡ | t|ƒ¡ | t|ƒ¡ d S )NÚsched_getaffinityT©ZpercpuÚnum_cpur   r`   )r2   r3   Úcpu_affinityr†   Ú
addCleanupr+  r>   r=   ÚlistrJ  r4   r·   rú   r~   r}   rL  r   Ú_procZ_get_eligible_cpusr@   rÆ   rÁ   )r5   rC   ÚinitialZall_cpusÚnr9   r9   r:   Útest_cpu_affinity\  s:    


ÿ


ÿ
zTestProcess.test_cpu_affinityc                 C   sp   |   ¡ }ttjdd�ƒd g}|  t|j|¡ |  t|jtddƒ¡ |  t|jddg¡ |  t|jddg¡ d S )	NTrK  é
   i'  iø*  r   Ú1rs   )	r;   r·   r2   r‰   r@   ru   rM  r~   rÆ   )r5   rC   Zinvalid_cpur9   r9   r:   Útest_cpu_affinity_errs„  s    z"TestProcess.test_cpu_affinity_errsc                 C   s²   t  ¡ }| ¡ }|st|ƒ‚|  |j|¡ t|ƒdkrB|d d… }g }tdt|ƒd ƒD ](}t ||¡D ]}|rh| 	t
|ƒ¡ qhqX|D ]&}| |¡ |  t| ¡ ƒt|ƒ¡ q†d S )Né   r   r`   )r2   r3   rM  r†   rN  r·   r~   Ú	itertoolsÚcombinationsÚappendrO  r=   Úsorted)r5   rC   rQ  Zcombosr¹   ZsubsetÚcombor9   r9   r:   Ú"test_cpu_affinity_all_combinations�  s    
z.TestProcess.test_cpu_affinity_all_combinationszbroken on BSDzunreliable on APPVEYORc           	   	   C   sT  t  ¡ }|  ¡ }| ¡ }|  ||¡ t|dƒ�t}| d¡ | ¡  t|jdt	|ƒ ƒ}dd„ |D ƒ}|  
tj |¡|¡ trž|D ]}|j|kr€|  |jd¡ q€W 5 Q R X |D ]}tj |j¡s¬t|ƒ‚q¬d| }|  td|g¡}td	ƒD ]0}d
d„ | ¡ D ƒ}||k�r �q.t d¡ qè|  
tj |¡|¡ |D ]}tj |¡�s2t|ƒ‚�q2d S )Nr«   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzlen(ret) != %ic                 S   s   g | ]}t j |j¡‘qS r9   ©r>   r§   r
  rÊ   r9   r9   r:   rÌ   ¯  s     z/TestProcess.test_open_files.<locals>.<listcomp>rÔ   z2import time; f = open(r'%s', 'r'); time.sleep(60);r]   r{   c                 S   s   g | ]}t j |j¡‘qS r9   r^  rÊ   r9   r9   r:   rÌ   ½  s     rn   )r2   r3   r´   Ú
open_filesÚassertNotInr­   rµ   Úflushr   r·   r�   r>   r§   r
  r   r=   ÚpositionÚisfiler†   r;   r%   r~   rw   Úsleep)	r5   rC   rØ   Úfilesr¸   Ú	filenamesÚfiler  r‚   r9   r9   r:   Útest_open_files¢  s4    


zTestProcess.test_open_filesc              	   C   sü   t  ¡ }tjj}|  ¡ }t|dƒ�Ð}| ¡ D ]*}||jƒ||jƒksR|j	| 
¡ kr, qnq,|  dt| ¡ ƒ ¡ |  ||jƒ||jƒ¡ trš|  |j	d¡ n|  |j	| 
¡ ¡ | ¡ d }|  |d |j¡ |  |d |j	¡ |  |j| ¡ ¡ W 5 Q R X d S )NÚwzno file found; files=%srs   r   r`   )r2   r3   r>   r§   r
  r´   r­   r_  rt   ÚfdÚfilenorx   Úreprr=   r   r`  )r5   rC   r
  rØ   Úfileobjrg  Zntupler9   r9   r:   Útest_open_files_2Ç  s$    ÿzTestProcess.test_open_files_2c                 C   sŽ   t  ¡ }|  ¡ }| ¡ }t|dƒ}|  |j¡ |  | ¡ |d ¡ t ¡ }|  |j¡ |  | ¡ |d ¡ | ¡  | ¡  |  | ¡ |¡ d S )Nri  r`   r”   )	r2   r3   r´   Znum_fdsr­   rN  Úcloser=   Úsocket)r5   rC   rØ   Ústartrg  Úsockr9   r9   r:   Útest_num_fdsâ  s    
zTestProcess.test_num_fdsz not reliable on OPENBSD & NETBSDc                 C   sJ   t  ¡ }t| ¡ ƒ}tdƒD ]}t| ¡ ƒ}||kr d S q|  d¡ d S )Ni ¡ z7num ctx switches still the same after 50.000 iterations)r2   r3   rí   Znum_ctx_switchesr~   rx   )r5   rC   Úbeforer‚   Úafterr9   r9   r:   Útest_num_ctx_switchesñ  s    z!TestProcess.test_num_ctx_switchesc                 C   sN   t  ¡ }ttdƒr&|  | ¡ t ¡ ¡ |  ¡ }|  | ¡ t ¡ ¡ t	rJd S d S )NÚgetppid)
r2   r3   r+  r>   r=   Úppidrw  r;   r?   r   rB   r9   r9   r:   Ú	test_ppidü  s    
zTestProcess.test_ppidc                 C   sB   |   ¡ }|  | ¡ jt ¡ ¡ t ¡ d }|  t 	|¡ ¡ ¡ d S ræ   )
r;   r=   Úparentr4   r>   r?   r2   ÚpidsÚassertIsNoner3   )r5   rC   Z
lowest_pidr9   r9   r:   Útest_parent  s    zTestProcess.test_parentc                 C   s8   t  ¡ }|  ¡ \}}|  | ¡ |¡ |  | ¡ |¡ d S r0   )r2   r3   ro   r=   rz  ©r5   rz  rp   rq   r9   r9   r:   Útest_parent_multi  s    zTestProcess.test_parent_multic              	   C   s<   |   ¡ }tjdt dd¡d�� |  | ¡ ¡ W 5 Q R X d S )Núpsutil.Processr   ÚfoorT   )r;   r!   rV   r2   rY   r|  rz  rB   r9   r9   r:   Útest_parent_disappeared  s
    
ÿz#TestProcess.test_parent_disappearedc                 C   s`   t  ¡ }| ¡ st‚|  ¡ \}}|  | ¡ d |¡ |  | ¡ d |¡ |  | ¡ d |¡ d S r›   )r2   r3   Úparentsr†   ro   r=   r~  r9   r9   r:   Útest_parents  s    zTestProcess.test_parentsc                 C   s˜   t  ¡ }|  | ¡ g ¡ |  |jdd�g ¡ | jdd�}| ¡ }|jdd�}||fD ]>}|  t|ƒd¡ |  |d j|j¡ |  |d  ¡ |j¡ qTd S )NT©Ú	recursiver   )Úcreationflagsr`   )r2   r3   r=   Úchildrenr;   r·   r4   rx  )r5   rz  rp   Z	children1Z	children2rˆ  r9   r9   r:   Útest_children%  s    zTestProcess.test_childrenc                 C   sf   t  ¡ }|  ¡ \}}|  | ¡ |g¡ |  |jdd�||g¡ | ¡  | ¡  |  |jdd�g ¡ d S )NTr…  )r2   r3   ro   r=   rˆ  rN   rF   r~  r9   r9   r:   Útest_children_recursive4  s    z#TestProcess.test_children_recursivec              	   C   sÈ   t  t¡}t ¡ D ]4}z|| ¡   d7  < W q tjk
rD   Y qX qt| ¡ dd„ d�d d }t	rz|dkrz|  
d¡‚t |¡}z|jdd	�}W n tjk
rª   Y nX |  t|ƒtt|ƒƒ¡ d S )
Nr`   c                 S   s   | d S )Nr`   r9   )r‚   r9   r9   r:   Ú<lambda>J  ó    z6TestProcess.test_children_duplicates.<locals>.<lambda>)Úkeyrs   r   zPID 0Tr…  )ÚcollectionsÚdefaultdictr  r2   Úprocess_iterrx  ÚErrorr[  Úitemsr   ZskipTestr3   rˆ  r[   r=   r·   rú   )r5   ÚtablerC   r4   Úcr9   r9   r:   Útest_children_duplicatesA  s    


z$TestProcess.test_children_duplicatesc                 C   s|   t  ¡ }|  ¡ \}}|jdd�}|  t|ƒd¡ |  |d |¡ |  |d |¡ | ¡ }|  |d |¡ |  |d |¡ d S )NTr…  r”   r   r`   )r2   r3   ro   rˆ  r=   r·   rƒ  )r5   rz  rp   rq   rˆ  rƒ  r9   r9   r:   Útest_parents_and_childrenU  s    z%TestProcess.test_parents_and_childrenc                 C   sX   |   ¡ }| ¡  tdƒD ] }| ¡ tjkr. q:t d¡ q| ¡  |  	| ¡ tj¡ d S )Nr{   rn   )
r;   rk   r~   r<  r2   ÚSTATUS_STOPPEDrw   rd  rl   ÚassertNotEqual)r5   rC   r‚   r9   r9   r:   Útest_suspend_resumeb  s    zTestProcess.test_suspend_resumec                 C   s$   |   ttjd¡ |   ttjd¡ d S )NrU  rs   )r@   rÆ   r2   r3   ru   ©r5   r9   r9   r:   Útest_invalid_pidl  s    zTestProcess.test_invalid_pidc              
   C   sî  t  ¡ }|jddgd�}|  t| ¡ ƒddg¡ t  tt  ¡ ƒ¡}|jdgdd�}t|d t	ƒsp|  |d d¡ t
jddt jd	��" |  |jd
gdd�d
di¡ W 5 Q R X t
jddt  |jd¡d	�� | jt j|jd
gd� W 5 Q R X t
jddt  |jd¡d	��" |  |jd
gdd�d
di¡ W 5 Q R X t
jddtd	��F | ¡ }|  d
t	| ¡ ƒ¡ |  t¡� |jd
gd� W 5 Q R X W 5 Q R X |  t¡� | d¡ W 5 Q R X |  t¡� | dg¡ W 5 Q R X |  t¡� | ddg¡ W 5 Q R X d S )Nr  rt   )ÚattrsZconnectionsr�  )rœ  Zad_valuezpsutil.Process.niceT)ÚcreaterU   r9  r`   Zbar)r2   r3   Úas_dictr=   r[  Úkeysr—   r{  Ú
isinstancerO  r!   rV   r[   rY   r4   r@   ÚZombieProcessÚNotImplementedErrorr`  rÆ   ru   )r5   rC   Údr9   r9   r:   Útest_as_dictp  sT    ÿ ÿÿ  ÿÿ ÿÿ"zTestProcess.test_as_dictc              
   C   sˆ   t  ¡ }t d¡�8}| ¡ � | ¡  | ¡  W 5 Q R X |  |jd¡ W 5 Q R X t d¡�}| ¡  | ¡  W 5 Q R X |  |jd¡ d S )Nú$psutil._psplatform.Process.cpu_timesr`   r”   ©r2   r3   r!   rV   Úoneshotr‰   r=   Z
call_count©r5   rC   r‡   r9   r9   r:   Útest_oneshotž  s    
zTestProcess.test_oneshotc                 C   sÐ   t  ¡ }t d¡�€}t d¡�j}| ¡ �: | ¡  | ¡  | ¡ � | ¡  | ¡  W 5 Q R X W 5 Q R X |  |jd¡ |  |jd¡ W 5 Q R X W 5 Q R X t d¡�}| ¡  | ¡  W 5 Q R X |  |jd¡ d S )Nr¥  z(psutil._psplatform.Process.oneshot_enterr`   r”   r¦  )r5   rC   Úm1Úm2r‡   r9   r9   r:   Útest_oneshot_twice«  s    

"zTestProcess.test_oneshot_twicec              	   C   s”   |   ¡ \}}| ¡ }| ¡ }|  ||¡ | ¡ �& |  | ¡ |¡ |  | ¡ |¡ W 5 Q R X | ¡ �& |  | ¡ |¡ |  | ¡ |¡ W 5 Q R X d S r0   )ro   rx  r˜  r§  r=   )r5   Úp1Úp2Zp1_ppidZp2_ppidr9   r9   r:   Útest_oneshot_cache¿  s    

zTestProcess.test_oneshot_cachec                    s˜   ‡ fdd„}ˆ   ¡ }| ¡  | ¡  tr:ttjd|j ƒ ˆ  |¡ t	|ƒ}| 
|j¡D ]\}}|||ƒ qXtr”ts”tjj}ˆ  || ¡ ƒ|tƒ¡ d S )Nc                    s†   z
| ƒ }W nT t jk
r"   ‚ Y n` t jk
r6   Y nL t jk
r^   trX|dkrXY d S ‚ Y n$X trp|dkrpd S ˆ  d| |f ¡‚d S )N)rè   rá   )r  rt   z+%r didn't raise NSP and returned %r instead)r2   r¡  rY   r[   r   r   rx   )ÚfunZfun_namerÑ   rš  r9   r:   Úassert_raises_nspÖ  s    
ÿzFTestProcess.test_halfway_terminated_process.<locals>.assert_raises_nspz%s not in ret)r;   rN   rF   r   r   r2   r{  r4   rJ   r"   ÚiterÚallr   r>   r§   r
  r=   r  r%   )r5   r±  rC   Únsr°  rt   r
  r9   rš  r:   Útest_halfway_terminated_processÎ  s    
z+TestProcess.test_halfway_terminated_processc                 C   sÐ   dd„ }|   ¡ \}}t |j¡}|  | ¡ tj¡ | ¡ s>t‚| 	¡  t
|ƒ}| |j¡D ]\}}||ƒ qZt |j¡s|t‚|  |jt ¡ ¡ |  |jdd„ t ¡ D ƒ¡ i t_|  |jdd„ t ¡ D ƒ¡ d S )Nc              	   S   s*   z| ƒ W S  t jt jfk
r$   Y nX d S r0   )r2   r¡  r[   )r°  r9   r9   r:   Úsucceed_or_zombie_p_excú  s    z@TestProcess.test_zombie_process.<locals>.succeed_or_zombie_p_excc                 S   s   g | ]
}|j ‘qS r9   ©r4   rÊ   r9   r9   r:   rÌ     s     z3TestProcess.test_zombie_process.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r9   r·  rÊ   r9   r9   r:   rÌ     s     )Zspawn_zombier2   r3   r4   r=   r<  ÚSTATUS_ZOMBIEr  r†   rž  r"   r²  r³  Ú
pid_existsr�   r{  r�  Z_pmap)r5   r¶  rz  ÚzombieZzprocr´  r°  rt   r9   r9   r:   Útest_zombie_processø  s    
zTestProcess.test_zombie_processc              	   C   sB   t  ¡ }tjdt  d¡d��}| ¡ s*t‚|js4t‚W 5 Q R X d S )Nr€  r   rT   )r2   r3   r!   rV   r¡  r  r†   r…   r¨  r9   r9   r:   Ú$test_zombie_process_is_running_w_exc  s    ÿz0TestProcess.test_zombie_process_is_running_w_excc              	   C   sH   t  ¡ }tjdt  d¡d��"}|  | ¡ t j¡ |js:t	‚W 5 Q R X d S )Nz!psutil._psplatform.Process.statusr   rT   )
r2   r3   r!   rV   r¡  r=   r<  r¸  r…   r†   r¨  r9   r9   r:   Ú test_zombie_process_status_w_exc'  s    ÿz,TestProcess.test_zombie_process_status_w_excc              	   C   s~  dt  ¡ krF|  t jt jd¡ t  d¡r,t‚|  t  d¡ ¡ d¡ d S t  d¡}t	rZt j
nt}|  ||j¡ |  ||j¡ |  ||j¡ |  ||j¡ |  ||j¡ |  ||jtj¡ t|ƒ}| |j|j ¡D ]‚\}}z
|ƒ }W n t j
k
rø   Y qÐX |dk�r|  |jd¡ qÐ|dk�r>t	�r(dnd}|  | ¡ |¡ qÐ|dkrÐ|sÐt|ƒ‚qÐt�sz|  dt  ¡ ¡ t  d¡�szt‚d S )Nr   r`   )r(  r1  r@  zNT AUTHORITY\SYSTEMÚrootrt   )r2   r{  r@   rY   r3   r¹  r†   r=   rx  r   r[   ru   rF   rN   rk   rl   rE   rP   rG   rH   r"   r²  ZgettersZsettersr-  r@  r   r�   )r5   rC   rÛ   r´  r°  rt   rÑ   rŠ   r9   r9   r:   Ú
test_pid_01  s:    



zTestProcess.test_pid_0c                 C   sH   dd„ }d | _ t ¡ }|| ¡ ƒ}|tj ¡ ƒ}tsDtrD|  ||¡ d S )Nc                 S   sb   |   dd ¡ |   dd ¡ |   dd ¡ trL|   dd ¡ |   dd ¡ |   dd ¡ tdd„ |  ¡ D ƒƒS )	NZPSUTIL_TESTINGÚPLATÚHOMEZ__CF_USER_TEXT_ENCODINGZVERSIONER_PYTHON_PREFER_32_BITZVERSIONER_PYTHON_VERSIONc                 S   s8   g | ]0\}}|  d d¡  dd¡|  d d¡  dd¡f‘qS )úrS   Ú
)r  )rË   ÚkÚvr9   r9   r:   rÌ   d  s   þÿz@TestProcess.test_environ.<locals>.clean_dict.<locals>.<listcomp>)Úpopr   Údictr’  )r£  r9   r9   r:   Ú
clean_dictZ  s    þÿz,TestProcess.test_environ.<locals>.clean_dict)	ZmaxDiffr2   r3   rC  r>   Úcopyr	   r   r=   )r5   rÈ  rC   Zd1Zd2r9   r9   r:   Útest_environX  s    zTestProcess.test_environc                 C   sÌ   t  d¡}|  ¡ }t||d� | j|gtjtjd�}t |j	¡}t
|j	ƒ | ¡ sVt‚|  |j ¡ d¡ tr˜tr˜z| ¡ }W q  tjk
r”   Y d S X n| ¡ }|  |dddœ¡ | ¡  |  |jd¡ d S )	Na×  
            #include <unistd.h>
            #include <fcntl.h>
            char * const argv[] = {"cat", 0};
            char * const envp[] = {"A=1", "X", "C=3", 0};
            int main(void) {
                /* Close stderr on exec so parent can wait for the execve to
                 * finish. */
                if (fcntl(2, F_SETFD, FD_CLOEXEC) != 0)
                    return 0;
                return execve("/bin/cat", argv, envp);
            }
            )Zc_code)Ústdinr_   rŒ  rU  Ú3)ÚAÚCr   )ÚtextwrapÚdedentr´   r   r1   rb   rc   r2   r3   r4   r.   r  r†   r=   r_   r®   r   r   rC  r[   ÚcommunicateÚ
returncode)r5   rL   r§   r8   rC   Úenvr9   r9   r:   Útest_weird_environo  s*    
  ÿ

zTestProcess.test_weird_environN)jÚ__name__Ú
__module__Ú__qualname__Ú__doc__r;   rD   rM   rO   rR   r-   ÚskipIfr
   r\   re   rm   rr   rv   ry   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ö   r   r	  r  r  r  r  r  r$   r  r!  r$  r   r   r%  r0  r5  r;  r>  rE  rH  rI  r   rS  rV  r]  r   r   rh  rn  rs  r   r   rv  ry  r}  r  r‚  r„  r‰  rŠ  r•  r–  r™  r›  r¤  r©  r¬  r¯  rµ  r»  r¼  r½  r¿  r   rÊ  rÔ  r9   r9   r9   r:   r/   K   sú   




)*








-

	








,
'



"


	

.*
$
	
	'
r/   c                       sn   e Zd ZdZeedƒr&e ¡ Ze ¡ Z	‡ fdd„Z
‡ fdd„Z‡ fdd„Zd	d
„ Ze dd¡dd„ ƒZ‡  ZS )ÚLimitedUserTestCasez—Repeat the previous tests by using a limited user.
        Executed only on UNIX and only if the user who run the test script
        is root.
        r)  c                    sT   t ƒ j||Ž dd„ t| ƒD ƒD ].}t| |ƒ‰ ‡ fdd„}t| |t || ¡ƒ q d S )Nc                 S   s   g | ]}|  d ¡r|‘qS )ÚtestrÈ   rÊ   r9   r9   r:   rÌ   ¬  s     
 z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                    s&   z
ˆ ƒ  W n t jk
r    Y nX d S r0   )r2   r[   rš  ©Úmethr9   r:   Útest_¯  s    
z+LimitedUserTestCase.__init__.<locals>.test_)r   Ú__init__rÎ   r‘   ÚsetattrÚtypesÚ
MethodType)r5   r6   r7   ÚattrrÞ  ©Ú	__class__rÜ  r:   rß  ¨  s
    
zLimitedUserTestCase.__init__c                    s"   t ƒ  ¡  t d¡ t d¡ d S )Niè  )r   ÚsetUpr>   ÚsetegidÚseteuidrš  rä  r9   r:   ræ  ¶  s    

zLimitedUserTestCase.setUpc                    s&   t  | j¡ t  | j¡ tƒ  ¡  d S r0   )r>   rç  ÚPROCESS_UIDrè  ÚPROCESS_GIDr   ÚtearDownrš  rä  r9   r:   rë  »  s    zLimitedUserTestCase.tearDownc                 C   s8   zt  ¡  d¡ W n t jk
r(   Y nX |  d¡ d S )Nrs   zexception not raised)r2   r3   r9  r[   rx   rš  r9   r9   r:   r;  À  s
    zLimitedUserTestCase.test_nicer`   zcauses problem as rootc                 C   s   d S r0   r9   rš  r9   r9   r:   r»  È  s    z'LimitedUserTestCase.test_zombie_process)rÕ  rÖ  r×  rØ  r+  r>   r)  ré  r2  rê  rß  ræ  rë  r;  r-   rÙ  r»  Ú__classcell__r9   r9   rä  r:   rÚ  ž  s   

rÚ  c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )Ú	TestPopenzTests for psutil.Popen class.c                 C   s
   t ƒ  d S r0   r&   )Úclsr9   r9   r:   ÚtearDownClassÕ  s    zTestPopen.tearDownClassc              	   C   sš   t ddg}tj|tjtjd��B}| ¡  | ¡  |j |  t	|ƒ¡ |  
tt|d¡ | ¡  W 5 Q R X tr‚|  | d¡tj ¡ n|  | d¡tj¡ d S )Nr]   úimport time; time.sleep(60);©Ústdoutr_   r�  ra   )r%   r2   ÚPopenrb   rc   rt   r‰   rË  Z
assertTruerÎ   r@   rA   r‘   rN   r
   r=   rF   rG   rH   ©r5   rd   Úprocr9   r9   r:   Ú	test_miscÙ  s    

ÿzTestPopen.test_miscc              	   C   sf   t jtdgtjtjtjd��}| ¡  W 5 Q R X |jjs<t‚|j	jsHt‚|j
jsTt‚|  |jd¡ d S )Nz-V)rò  r_   rË  r   )r2   ró  r%   rb   rc   rÑ  rò  Úclosedr†   r_   rË  r=   rÒ  )r5   rõ  r9   r9   r:   Útest_ctx_managerë  s    
ýzTestPopen.test_ctx_managerc              	   C   s¨   t ddg}tj|tjtjd��€}| ¡  | ¡  |  tj|j¡ |  tj|j	¡ |  tj|j
tj¡ trštjdkrš|  tj|j
tj¡ |  tj|j
tj¡ W 5 Q R X d S )Nr]   rð  rñ  )r”   r¼   )r%   r2   ró  rb   rc   rN   rF   r@   rY   rE   rP   rG   rH   r   r  r  ZCTRL_C_EVENTZCTRL_BREAK_EVENTrô  r9   r9   r:   Útest_kill_terminateö  s&    

ÿÿÿÿzTestPopen.test_kill_terminateN)	rÕ  rÖ  r×  rØ  Úclassmethodrï  rö  rø  rù  r9   r9   r9   r:   rí  Ò  s   
rí  Ú__main__)Úrun_from_name)ErØ  rŽ  rX   rB  rX  r>   rG   rp  rÿ   rb   r  rÏ  rw   rá  r2   r   r   r   r   r   r   r	   r
   r   r   Zpsutil._commonr   Zpsutil._compatr   r   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.   r/   r)  rÚ  rí  rÕ  Zpsutil.tests.runnerrü  Ú__file__r9   r9   r9   r:   Ú<module>   s”             [48
