o
    äÇÌaåì  ã                   @   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/e/ƒZ=e�rVe >¡ dk�rVG d0d1„ d1e=ƒZ?G d2d3„ d3e/ƒZ@eAd4k�rodd5lBmCZC eCeDƒ dS dS )6úTests for psutil.Process class.é    N)ÚAIX)ÚBSD)ÚLINUX)ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚOSX)ÚPOSIX)ÚSUNOS)ÚWINDOWS)Ú	open_text)ÚPY3)ÚFileNotFoundError)Úlong)Úsuper)ÚAPPVEYOR)Ú
CI_TESTING)Ú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)ÚPYPY)Ú
PYTHON_EXE)ÚPsutilTestCase)Ú
ThreadTask)Ú
call_until)Úcopyload_shared_lib)Ú
create_exe)Úmock)Úprocess_namespace©Úreap_children)Úretry_on_failure)Úsh)Úskip_on_access_denied)Úskip_on_not_implemented)Ú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§„ Zfd¨d©„ Zge	 
eh d!¡dªd«„ ƒZie	 
eh d!¡e	 
e d&¡d¬d­„ ƒƒZjd®S )¯ÚTestProcessr   c                 O   s   | j |i |¤Ž}t |j¡S ©N)Úspawn_testprocÚpsutilÚProcessÚpid)ÚselfÚargsÚkwargsÚsproc© r9   ú;/usr/lib/python3/dist-packages/psutil/tests/test_process.pyÚspawn_psprocM   s   zTestProcess.spawn_psprocc                 C   sP   t  ¡ }|  |jt ¡ ¡ |  t¡� d|_W d   ƒ d S 1 s!w   Y  d S )Né!   )r2   r3   ÚassertEqualr4   ÚosÚgetpidÚassertRaisesÚAttributeError©r5   Úpr9   r9   r:   Útest_pidS   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_killY   ó   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_terminatec   rN   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_signalm   s   
zTestProcess.test_send_signalz	not POSIXc                 C   s¬   t j}|  ¡ }tjdttjdƒd�� |  t	j
|j|¡ W d   ƒ n1 s&w   Y  |  ¡ }tjdttjdƒd�� |  t	j|j|¡ W d   ƒ d S 1 sOw   Y  d S )Nzpsutil.os.killÚ ©Úside_effect)rG   rH   r;   r%   ÚpatchÚOSErrorÚerrnoÚESRCHr@   r2   ÚNoSuchProcessrQ   ÚEPERMÚAccessDenied)r5   rR   rC   r9   r9   r:   Útest_send_signal_mockedx   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rB| tj¡ | jtj|jdd� | tj	¡ | jtj|jdd� | tj
¡ |  | ¡ tj
 ¡ |  | ¡ tj
 ¡ d S | ¡  | jtj|jdd� | ¡  | jtj|jdd� | ¡  |  | ¡ tj
¡ |  | ¡ tj
¡ d S )Nçü©ñÒMbP?)Útimeout)r;   r
   rQ   rG   ÚSIGSTOPr@   r2   ÚTimeoutExpiredrF   ÚSIGCONTrH   r=   ÚsuspendÚresumerO   rB   r9   r9   r:   Útest_wait_stopped    s    zTestProcess.test_wait_stoppedc                 C   s”   |   ¡ \}}|  tj|jd¡ |  tj|jd¡ | ¡  | ¡  | ¡ }| ¡ }tr:|  |tj	 ¡ |  |d ¡ d S |  |tj	¡ |  |tj	¡ d S )Nç{®Gáz„?)
Úspawn_children_pairr@   r2   rk   rF   rO   r
   r=   rG   rH   )r5   ÚchildÚ
grandchildÚ	child_retÚ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 )Nrp   r   éÿÿÿÿ)r;   Únamer@   r2   rk   rF   Ú
ValueErrorrB   r9   r9   r:   Útest_wait_timeoutÊ   s
   zTestProcess.test_wait_timeoutc                 C   s¦   |   ¡ }|  tj|jd¡ | ¡  t ¡ t }t ¡ |k r5z| d¡}W n tjy.   Y nw t ¡ |k s|  d¡‚t	rE|  
|tj ¡ n|  
|tj¡ |  |¡ d S )Nr   ri   )r;   r@   r2   rk   rF   rE   Útimer   Úfailr
   r=   rG   rI   rH   rJ   )r5   rC   Ústop_atrL   r9   r9   r:   Útest_wait_timeout_nonblockingÑ   s"   
ÿü
z)TestProcess.test_wait_timeout_nonblockingc                 C   sŽ   t  ¡ }|jdd� |jdd� tdƒD ]}|jd d�}|  |t¡ |  |d¡ q|  t¡� |jdd� W d   ƒ d S 1 s@w   Y  d S )Nrh   )Úintervaléd   ç        rw   )	r2   r3   Úcpu_percentÚrangeÚassertIsInstanceÚfloatÚassertGreaterEqualr@   ry   )r5   rC   ÚxÚpercentr9   r9   r:   Útest_cpu_percentä   s   "ÿzTestProcess.test_cpu_percentc                 C   sJ   t jdd d��}t ¡  ¡  |jsJ ‚W d   ƒ d S 1 sw   Y  d S )Nzpsutil.cpu_count)Úreturn_value)r%   rW   r2   r3   r‚   Úcalled)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J |ƒ‚|jdksJ |ƒ‚|jdks&J |ƒ‚tr1|jdks1J |ƒ‚|j	D ]}t
 dt
 t||ƒ¡¡ q4d S )Nr�   z%H:%M:%S)r2   r3   Ú	cpu_timesÚuserÚsystemÚchildren_userÚchildren_systemr   ÚiowaitÚ_fieldsr{   ÚstrftimeÚ	localtimeÚgetattr)r5   Útimesrx   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r-|  d||f ¡ t||gƒt||gƒ dkrF|  d||f ¡ d S d S )Né   çš™™™™™¹?zexpected: %s, found: %s)r2   r3   rŽ   r>   r˜   ÚmaxÚminr|   )r5   Ú	user_timeÚkernel_timeÚutimeÚktimer9   r9   r:   Útest_cpu_times_2   s   ÿzTestProcess.test_cpu_times_2znot supportedc                 C   sP   t  ¡ }| ¡ }|  |d¡ t  ¡ dkr|  |d¡ |  | ¡ tt  ¡ ƒ¡ d S ©Nr   rb   )r2   r3   Ú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;   r{   Úcreate_timeÚabsr|   r•   r–   )r5   rC   Únowr©   Ú
differencer9   r9   r:   Útest_create_time  s   ÿzTestProcess.test_create_timez
POSIX onlyc                 C   s8   t  ¡  ¡ }|d urtj tdƒ¡}|  ||¡ d S d S )NÚtty)r2   r3   Úterminalr>   ÚpathÚrealpathr*   r=   )r5   r¯   r®   r9   r9   r:   Útest_terminal&  s
   þzTestProcess.test_terminal)Úonly_ifc                 C   sÆ  t  ¡ }| ¡ }ttdƒ�}| ¡  W d   ƒ n1 sw   Y  | ¡ }tsLtsL|  |j	|j	¡ |  
|j|j¡ trK|  |j|j¡ |  
|j|j¡ n|  |j|j¡ |  |j|j¡ | ¡ }t|  ¡ dƒ�}tru| tdd dƒ¡ n| dd ¡ W d   ƒ n1 s†w   Y  | ¡ }|  |j|j¡ |  |j|j¡ |  |j	|j	¡ |  |j|j¡ trÁ|  |j|j¡ |  |j|j¡ tt|ƒƒD ]}trÐ|dkrÐqÇ|  || d¡ |  || d¡ qÇd S )NÚrbÚwbr‡   i@B Úasciirš   r   )r2   r3   Úio_countersÚopenr   Úreadr   r   ÚassertGreaterÚ
read_countr=   Úwrite_countr   Ú
read_charsÚwrite_charsr†   Ú
read_bytesÚwrite_bytesÚ
get_testfnr   ÚwriteÚbytesrƒ   Úlen)r5   rC   Úio1ÚfÚio2Úir9   r9   r:   Útest_io_counters-  sH   
ÿ€€üû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¡ | ¡ }z¾| t j¡ |  t	| ¡ ƒt jdf¡ |  
t¡� |jt jdd� W d   ƒ n1 s]w   Y  | t j¡ |  t	| ¡ ƒt jdf¡ |jt jdd� |  t	| ¡ ƒt jdf¡ |  
t¡� |jt jdd� W d   ƒ n1 s¢w   Y  z
|jt jdd� W n
 t jy»   Y nw |  td|jt jd¡ |  td|jt jd¡ | jtd	|jdd� W |\}}|t jkrèd}| ||¡ d S |\}}|t jkrûd}| ||¡ w )
Nr   rb   rš   é   é   ©Úvalueé   zioclass accepts no valuez$'ioclass' argument must be specified)r2   r3   r   r=   ÚioniceÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚtupler@   ry   r]   ÚassertRaisesRegex)r5   rC   ÚinitÚioclassrÍ   r9   r9   r:   Útest_ionice_linuxX  s\   ÿÿÿ
þ
þþ
ý
zTestProcess.test_ionice_linuxz!not supported on this win versionc              	   C   sè   t  ¡ }ts|  | ¡ t j¡ | ¡ }zZ| t j¡ |  | ¡ t j¡ | t j¡ |  | ¡ t j¡ z| t j¡ W n
 t j	yD   Y n
w |  | ¡ t j¡ | j
td|jt jdd� |  
td|jt jd ¡ W | |¡ d S | |¡ w )Nz&value argument not accepted on Windowsrb   rÌ   zis not a valid priority)r2   r3   r   r=   rÏ   ÚIOPRIO_NORMALÚIOPRIO_VERYLOWÚ
IOPRIO_LOWÚIOPRIO_HIGHr]   rÕ   Ú	TypeErrorry   )r5   rC   rÖ   r9   r9   r:   Útest_ionice_win„  s0   ÿ
þþzTestProcess.test_ionice_winc                 C   sÐ   dd l }t t ¡ ¡}dd„ ttƒD ƒ}|sJ |ƒ‚|D ]I}tt|ƒ}|  |d¡ |t|ƒv rH|  |t||ƒ¡ t	r;q|  | 
|¡| |¡¡ q| 
|¡}|  t|ƒd¡ |  |d d¡ |  |d d¡ qd S )Nr   c                 S   ó   g | ]	}|  d ¡r|‘qS )ÚRLIMIT©Ú
startswith©Ú.0r‡   r9   r9   r:   Ú
<listcomp>¥  ó    z/TestProcess.test_rlimit_get.<locals>.<listcomp>rš   rw   rb   )Úresourcer2   r3   r>   r?   Údirr—   r†   r=   r   ÚrlimitÚ	getrlimitrÄ   )r5   rç   rC   Únamesrx   rÍ   Úretr9   r9   r:   Útest_rlimit_get¡  s"   

ñzTestProcess.test_rlimit_getc                 C   sª   |   ¡ }| tjd¡ |  | tj¡d¡ tr6|  td¡� tj 	d¡ d¡ W d   ƒ n1 s1w   Y  |  
t¡� | tjd¡ W d   ƒ d S 1 sNw   Y  d S )N)rc   rc   zcan't use prlimitr   )rc   rc   rc   )r;   ré   r2   ÚRLIMIT_NOFILEr=   r   rÕ   ry   Ú_psplatformr3   r@   rB   r9   r9   r:   Útest_rlimit_set¸  s   ÿ"ÿzTestProcess.test_rlimit_setc                 C   sB  t  ¡ }|  ¡ }| t j¡\}}zz| t jd|f¡ t|dƒ�}| d¡ W d   ƒ n1 s/w   Y  |  t¡�"}t|dƒ�}| d¡ W d   ƒ n1 sOw   Y  W d   ƒ n1 s^w   Y  |  	t
rk|jjn|jd tj¡ W | t j||f¡ |  	| t j¡||f¡ d S | t j||f¡ |  	| t j¡||f¡ w )Né   rµ   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   )r2   r3   rÁ   ré   ÚRLIMIT_FSIZEr¸   rÂ   r@   ÚIOErrorr=   r   Ú	exceptionrY   ÚEFBIG)r5   rC   ÚtestfnÚsoftÚhardrÆ   Úexcr9   r9   r:   Útest_rlimitÅ  s*   ÿÿ€ÿÿÿzTestProcess.test_rlimitc                 C   s  t  ¡ }| t j¡\}}z_| t jd|f¡ | t jt j|f¡ t|  ¡ dƒ�}| d¡ W d   ƒ n 1 s7w   Y  W | t j||f¡ |  | t j¡||f¡ d S W | t j||f¡ |  | t j¡||f¡ d S | t j||f¡ |  | t j¡||f¡ w )Nrñ   rµ   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)	r2   r3   ré   rò   ÚRLIM_INFINITYr¸   rÁ   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   s€   t  ¡ }trz| ¡ }W n t jy   t d¡‚w | ¡ }tƒ � | ¡ }|  ||d ¡ W d   ƒ d S 1 s9w   Y  d S )Nú$on OpenBSD this requires root accessrb   )	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º   Únum_handlesrB   r9   r9   r:   Útest_num_handles  s   zTestProcess.test_num_handlesc                 C   sÆ   t  ¡ }trz| ¡ }W n t jy   t d¡‚w | ¡ }tƒ �8 | ¡ }|  t	|ƒt	|ƒd ¡ |d }|  |j
|d ¡ |  |j|d ¡ |  |j|d ¡ W d   ƒ d S 1 s\w   Y  d S )Nrþ   rb   r   rš   )r2   r3   r   Úthreadsr]   r-   r   r!   r=   rÄ   Úidrž   Úsystem_time)r5   rC   r  r  Úathreadr9   r9   r:   Útest_threads  s    
ÿ"ùzTestProcess.test_threadsc                 C   sˆ   |   ¡ }trz| ¡  W n tjy   t d¡‚w | j| ¡ j	t
dd„ | ¡ D ƒƒdd� | j| ¡ jt
dd„ | ¡ D ƒƒdd� d S )Nrþ   c                 S   ó   g | ]}|j ‘qS r9   )rž   rã   r9   r9   r:   rå   ,  ó    z.TestProcess.test_threads_2.<locals>.<listcomp>r›   )Údeltac                 S   r  r9   )r	  rã   r9   r9   r:   rå   /  r  )r;   r   r  r2   r]   r-   r   Ú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rZ| ¡ }	|  |	j|	j	¡ |  |	j
|	j¡ | ¡ }	|	jD ]}
|  t|	|
ƒd¡ qad S )Nrš   r   i`ã )r2   r3   Úmemory_infoÚmemory_percentrº   r†   r   r=   ÚrssÚwsetÚvmsÚpagefiler”   r—   )r5   rC   Úrss1Úvms1Úpercent1ÚmemarrÚrss2Úvms2Úpercent2Úmemrx   r9   r9   r:   Útest_memory_info1  s(   

ÿzTestProcess.test_memory_infoc                 C   s®   t  ¡ }t  ¡ j}| ¡ }|jD ]%}t||ƒ}| j|d||fd� |dkr'ts)t	r*q| j
|||||fd� qt	s<ts<trC|  |jd¡ t	rU|  |jd¡ |  |jd¡ d S d S )Nr   )Úmsgr  )r2   r3   Úvirtual_memoryÚtotalÚmemory_full_infor”   r—   r†   r	   r   ÚassertLessEqualr   r   ÚussÚpssÚswap)r5   rC   r#  r  rx   rÍ   r9   r9   r:   Útest_memory_full_infoP  s   


þz!TestProcess.test_memory_full_infoc                 C   s¨  t  ¡ }| ¡ }dd„ |D ƒ}|  t|ƒtt|ƒƒ¡ |jdd�}|D ]~}|j d¡s¡tj 	|j¡s7J |jƒ‚t
r{ztj |j¡sMtj |j¡sMJ |jƒ‚W q# tyz   tsX‚ tdƒ�}| ¡ }W d   ƒ n1 skw   Y  d|j |vrx‚ Y q#w dtj |j¡vr¡zt |j¡}W n	 ty•   Y q#w t |j¡s¡J |jƒ‚q#|D ]-}|jD ]'}	t||	ƒ}
|	d	krµq©|	d
v rÀ|
s¿J |
ƒ‚q©|  |
ttf¡ |
dksÐJ |
ƒ‚q©q¤d S )Nc                 S   s   g | ]}|‘qS r9   r9   rã   r9   r9   r:   rå   d  s    z0TestProcess.test_memory_maps.<locals>.<listcomp>F)Úgroupedú[z/proc/self/smapsz%s (deleted)Ú64r°   )ÚaddrÚpermsr   )r2   r3   Úmemory_mapsr=   rÄ   Úsetr°   râ   r>   Úisabsr
   ÚexistsÚislinkÚAssertionErrorr   r   r¹   ÚbasenameÚstatr   ÚS_ISREGÚst_moder”   r—   r„   Úintr   )r5   rC   ÚmapsÚpathsÚext_mapsÚntrÆ   ÚdataÚstÚfnamerÍ   r9   r9   r:   Útest_memory_maps`  sZ   ÿÿ€

ÿÿùÿ€

øÿzTestProcess.test_memory_mapsc                    sb   t  ¡ }tƒ � }dd„ ‰ ‡ fdd„| ¡ D ƒ}|  ˆ |ƒ|¡ W d   ƒ d S 1 s*w   Y  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ã   ©rC  r9   r:   rå   •  s    ÿz:TestProcess.test_memory_maps_lists_lib.<locals>.<listcomp>)r2   r3   r#   r/  r¦   )r5   rC   r°   Úlibpathsr9   rD  r:   Útest_memory_maps_lists_libŽ  s   
ÿ"ûz&TestProcess.test_memory_maps_lists_libc                 C   sB   t  ¡ }| ¡  | jt|jdd� tststr|jdd� d S d S )Nz?!?)Úmemtyper&  )r2   r3   r  r@   ry   r   r   r   rB   r9   r9   r:   Útest_memory_percent™  s   ÿzTestProcess.test_memory_percentc                 C   sL   |   ¡ }| ¡ s
J ‚| ¡ sJ ‚| ¡  | ¡  | ¡ rJ ‚| ¡ r$J ‚d S r0   )r;   Ú
is_runningrE   rF   rB   r9   r9   r:   Útest_is_running   s   zTestProcess.test_is_runningc                 C   sÐ   |   ¡ }| ¡ }z|  |t¡ W nH tyX   tr0t|ƒttƒkr0tjj	}|  ||ƒ|tƒ¡ n&dt
jd t
jd f }z|  | |d¡t |d¡¡ W n	 tyU   Y nw Y nw t|ddgƒ}|  |d¡ d S )Nz%s.%sr   rb   rT   r_   zimport os; print('hey')Úhey)r;   Úexer=   r   r4  r   rÄ   r>   r°   rB  ÚsysÚversion_infoÚreplacer*   )r5   rC   rL  rB  ÚverÚoutr9   r9   r:   Útest_exe©  s(   
ÿþ€ðzTestProcess.test_exec                 C   s¤   t ddg}|  |¡}tststr|  | ¡ d t ¡ d S trBtrB| ¡ d }|t krB|  d 	| ¡ dd … ¡d 	|dd … ¡¡ d S |  d 	| ¡ ¡d 	|¡¡ d S )Nr_   zimport time; time.sleep(60)r   ú rb   )
r   r;   r   r   r   r=   Úcmdliner   r   Újoin)r5   rT  rC   Úpyexer9   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=   rT  )r5   rö   rT  rC   r9   r9   r:   Útest_long_cmdlineØ  s
   
zTestProcess.test_long_cmdlinec                 C   sJ   |   t¡}| ¡  ¡ }tj tj tj	¡¡ ¡ }| 
|¡s#J ||fƒ‚d S r0   )r;   r   rx   Úlowerr>   r°   r5  r±   rM  Ú
executablerâ   )r5   rC   rx   rV  r9   r9   r:   Ú	test_nameà  s   
zTestProcess.test_namezunreliable on PYPYc                 C   s:   | j dd�}t|ƒ |  |¡}|  | ¡ tj |¡¡ d S )NÚ01234567890123456789©Úsuffix)rÁ   r$   r;   r=   rx   r>   r°   r5  )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)];arg1Úarg2rT   Úarg3)rÁ   r$   r;   r=   rT  rx   r>   r°   r5  rB  rL  )r5   Ú
funky_pathrT  rC   r9   r9   r:   Útest_prog_w_funky_nameî  s   þ

ÿz"TestProcess.test_prog_w_funky_namec                 C   ó\   t  ¡ }| ¡ \}}}|  |t ¡ ¡ |  |t ¡ ¡ ttdƒr,|  t ¡ | ¡ ¡ d S d S ©NÚ	getresuid)	r2   r3   Úuidsr=   r>   ÚgetuidÚgeteuidÚhasattrrh  ©r5   rC   ÚrealÚ	effectiveÚsavedr9   r9   r:   Ú	test_uids   ó   
ÿzTestProcess.test_uidsc                 C   rf  rg  )	r2   r3   Úgidsr=   r>   ÚgetgidÚgetegidrl  Ú	getresgidrm  r9   r9   r:   Ú	test_gids  rr  zTestProcess.test_gidsc                 C   sš  t  ¡ }|  t|jd¡ | ¡ }zªtrUt jt jt jt j	t j
t jfD ]2}| j|d��" z| |¡ W n
 t jy;   Y n	w |  | ¡ |¡ W d   ƒ n1 sNw   Y  q!nQzFttdƒrj|  t tjt ¡ ¡| ¡ ¡ | d¡ |  | ¡ d¡ ttdƒr‹|  t tjt ¡ ¡| ¡ ¡ tsš| d¡ |  | ¡ d¡ W n
 t jy¥   Y nw W z| |¡ W d S  t jyº   Y d S w z| |¡ W w  t jyÌ   Y w w )NÚstr)ÚprioÚgetpriorityrb   r   )r2   r3   r@   rÝ   Únicer   ÚNORMAL_PRIORITY_CLASSÚIDLE_PRIORITY_CLASSÚBELOW_NORMAL_PRIORITY_CLASSÚREALTIME_PRIORITY_CLASSÚHIGH_PRIORITY_CLASSÚABOVE_NORMAL_PRIORITY_CLASSÚsubTestr]   r=   rl  r>   rz  ÚPRIO_PROCESSr?   r   )r5   rC   rÖ   ry  r9   r9   r:   Ú	test_nice  sl   ûÿ€ú€ú
þ

þ
€ÿ€ÿþÿzTestProcess.test_nicec                 C   s   t  ¡ }|  | ¡ t j¡ d S r0   )r2   r3   r=   ÚstatusÚSTATUS_RUNNINGrB   r9   r9   r:   Útest_statusH  s   zTestProcess.test_statusc                 C   sj   |   ¡ }| ¡ }tr+| d¡\}}|  |t ¡ ¡ dtjv r)|  |tjd ¡ d S d S |  |t ¡ ¡ d S )Nú\Ú
USERDOMAIN)	r;   Úusernamer   Úsplitr=   ÚgetpassÚgetuserr>   Úenviron)r5   rC   rŠ  Údomainr9   r9   r:   Útest_usernameL  s   
ÿzTestProcess.test_usernamec                 C   s    |   ¡ }|  | ¡ t ¡ ¡ d S r0   )r;   r=   Úcwdr>   ÚgetcwdrB   r9   r9   r:   Útest_cwdW  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"   r‘  )r5   rf   rC   r9   r9   r:   Ú
test_cwd_2[  s
   ÿ
zTestProcess.test_cwd_2c                 C   s‚  t  ¡ }| ¡ }|sJ |ƒ‚|  |j|¡ ttdƒr&|  |tt |j	¡ƒ¡ |  t
|ƒt
t|ƒƒ¡ ttt
t jdd�ƒƒƒ}|D ]5}| |g¡ |  | ¡ |g¡ ttdƒrd|  | ¡ tt |j	¡ƒ¡ t|dƒru|  | ¡ d | ¡ ¡ q@| g ¡ tr‰|  | ¡ |j ¡ ¡ n|  | ¡ |¡ ttdƒr¤|  | ¡ tt |j	¡ƒ¡ |  t|jd¡ | |¡ | t|ƒ¡ | t|ƒ¡ d S )NÚsched_getaffinityT©ÚpercpuÚnum_cpur   rb   )r2   r3   Úcpu_affinityÚ
addCleanuprl  r>   r=   Úlistr•  r4   rÄ   r0  rƒ   r‚   r˜  r   Ú_procÚ_get_eligible_cpusr@   rÝ   rÔ   )r5   rC   ÚinitialÚall_cpusÚnr9   r9   r:   Útest_cpu_affinitya  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 )	NTr–  é
   i'  iø*  r   Ú1rw   )	r;   rÄ   r2   rŽ   r@   ry   r™  rƒ   rÝ   )r5   rC   Úinvalid_cpur9   r9   r:   Útest_cpu_affinity_errs‰  s   z"TestProcess.test_cpu_affinity_errsc                 C   s²   t  ¡ }| ¡ }|sJ |ƒ‚|  |j|¡ t|ƒdkr!|d d… }g }tdt|ƒd ƒD ]}t ||¡D ]}|r?| t	|ƒ¡ q4q,|D ]}| |¡ |  
t| ¡ ƒt|ƒ¡ qCd S )Né   r   rb   )r2   r3   r™  rš  rÄ   rƒ   Ú	itertoolsÚcombinationsÚappendr›  r=   Úsorted)r5   rC   rž  ÚcombosrÈ   ÚsubsetÚcombor9   r9   r:   Ú"test_cpu_affinity_all_combinations’  s"   €þ
þz.TestProcess.test_cpu_affinity_all_combinationszbroken on BSDzunreliable on APPVEYORc           	      C   s`  t  ¡ }|  ¡ }| ¡ }|  ||¡ t|dƒ�?}| d¡ | ¡  t|jdt	|ƒ ƒ}dd„ |D ƒ}|  
tj |¡|¡ trO|D ]}|j|krN|  |jd¡ q@W d   ƒ n1 sYw   Y  |D ]}tj |j¡smJ |ƒ‚q`d| }|  td|g¡}td	ƒD ]}d
d„ | ¡ D ƒ}||v r� nt d¡ q~|  
tj |¡|¡ |D ]}tj |¡s­J |ƒ‚q¡d S )Nrµ   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzlen(ret) != %ic                 S   ó   g | ]	}t j |j¡‘qS r9   ©r>   r°   rB  rã   r9   r9   r:   rå   ´  ræ   z/TestProcess.test_open_files.<locals>.<listcomp>rñ   z2import time; f = open(r'%s', 'r'); time.sleep(60);r_   r€   c                 S   r¯  r9   r°  rã   r9   r9   r:   rå   Â  ræ   rp   )r2   r3   rÁ   Ú
open_filesÚassertNotInr¸   rÂ   Úflushr"   rÄ   r¦   r>   r°   rB  r   r=   ÚpositionÚisfiler;   r   rƒ   r{   Úsleep)	r5   rC   rö   ÚfilesrÆ   Ú	filenamesÚfilerT  r‡   r9   r9   r:   Útest_open_files§  s:   

€öÿzTestProcess.test_open_filesc                 C   s  t  ¡ }tjj}|  ¡ }t|dƒ�n}| ¡ D ]}||jƒ||jƒks)|j	| 
¡ kr+ nq|  dt| ¡ ƒ ¡ |  ||jƒ||jƒ¡ trM|  |j	d¡ n	|  |j	| 
¡ ¡ | ¡ d }|  |d |j¡ |  |d |j	¡ |  |j| ¡ ¡ W d   ƒ d S 1 s‚w   Y  d S )NÚwzno file found; files=%srw   r   rb   )r2   r3   r>   r°   rB  rÁ   r¸   r±  rx   ÚfdÚfilenor|   Úreprr=   r   r²  )r5   rC   rB  rö   Úfileobjr¹  Ú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 )Nr»  rb   rš   )	r2   r3   rÁ   Únum_fdsr¸   rš  Úcloser=   Úsocket)r5   rC   rö   Ústartr¹  Ú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  Únum_ctx_switchesrƒ   r|   )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	r%d S d S )NÚgetppid)
r2   r3   rl  r>   r=   ÚppidrÌ  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   Ú
lowest_pidr9   r9   r:   Útest_parent  s   zTestProcess.test_parentc                 C   s8   t  ¡ }|  ¡ \}}|  | ¡ |¡ |  | ¡ |¡ d S r0   )r2   r3   rq   r=   rÏ  ©r5   rÏ  rr   rs   r9   r9   r:   Útest_parent_multi  s   zTestProcess.test_parent_multic                 C   sR   |   ¡ }tjdt dd¡d�� |  | ¡ ¡ W d   ƒ d S 1 s"w   Y  d S )Núpsutil.Processr   ÚfoorU   )r;   r%   rW   r2   r[   rÑ  rÏ  rB   r9   r9   r:   Útest_parent_disappeared  s   
ÿ"þz#TestProcess.test_parent_disappearedc                 C   s`   t  ¡ }| ¡ s
J ‚|  ¡ \}}|  | ¡ d |¡ |  | ¡ d |¡ |  | ¡ d |¡ d S r£   )r2   r3   Úparentsrq   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¡ q*d S )NT©Ú	recursiver   )Úcreationflagsrb   )r2   r3   r=   Úchildrenr;   rÄ   r4   rÍ  )r5   rÏ  rr   Ú	children1Ú	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   rq   r=   rÞ  rO   rF   rÔ  r9   r9   r:   Útest_children_recursive9  s   z#TestProcess.test_children_recursivec              	   C   sÄ   t  t¡}t ¡ D ]}z|| ¡   d7  < W q	 tjy!   Y q	w t| ¡ dd„ d�d d }t	r;|dkr;|  
d¡‚t |¡}z|jdd	�}W n tjyS   Y d S w |  t|ƒtt|ƒƒ¡ d S )
Nrb   c                 S   s   | d S )Nrb   r9   )r‡   r9   r9   r:   Ú<lambda>O  s    z6TestProcess.test_children_duplicates.<locals>.<lambda>)Úkeyrw   r   zPID 0TrÛ  )ÚcollectionsÚdefaultdictr9  r2   Úprocess_iterrÍ  ÚErrorrª  Úitemsr   ÚskipTestr3   rÞ  r]   r=   rÄ   r0  )r5   ÚtablerC   r4   Úcr9   r9   r:   Útest_children_duplicatesF  s"   
ÿ

ÿz$TestProcess.test_children_duplicatesc                 C   s|   t  ¡ }|  ¡ \}}|jdd�}|  t|ƒd¡ |  |d |¡ |  |d |¡ | ¡ }|  |d |¡ |  |d |¡ d S )NTrÛ  rš   r   rb   )r2   r3   rq   rÞ  r=   rÄ   rÙ  )r5   rÏ  rr   rs   rÞ  rÙ  r9   r9   r:   Útest_parents_and_childrenZ  s   z%TestProcess.test_parents_and_childrenc                 C   sX   |   ¡ }| ¡  tdƒD ]}| ¡ tjkr nt d¡ q| ¡  |  	| ¡ tj¡ d S )Nr€   rp   )
r;   rm   rƒ   r…  r2   ÚSTATUS_STOPPEDr{   r¶  rn   ÚassertNotEqual)r5   rC   r‡   r9   r9   r:   Útest_suspend_resumeg  s   zTestProcess.test_suspend_resumec                 C   s$   |   ttjd¡ |   ttjd¡ d S )Nr£  rw   )r@   rÝ   r2   r3   ry   ©r5   r9   r9   r:   Útest_invalid_pidq  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	ƒs8|  |d d¡ t
jddt jd	�� |  |jd
gdd�d
di¡ W d   ƒ n1 sZw   Y  t
jddt  |jd¡d	�� | jt j|jd
gd� W d   ƒ n1 s‚w   Y  t
jddt  |jd¡d	�� |  |jd
gdd�d
di¡ W d   ƒ n1 s­w   Y  t
jddtd	��2 | ¡ }|  d
t	| ¡ ƒ¡ |  t¡� |jd
gd� W d   ƒ n1 sàw   Y  W d   ƒ n1 sïw   Y  |  t¡� | d¡ W d   ƒ n	1 �s
w   Y  |  t¡� | dg¡ W d   ƒ n	1 �s&w   Y  |  t¡� | ddg¡ W d   ƒ d S 1 �sDw   Y  d S )NrL  rx   )ÚattrsÚconnectionsr×  )rô  Úad_valuezpsutil.Process.niceT)ÚcreaterV   r{  rb   Úbar)r2   r3   Úas_dictr=   rª  Úkeysr�   rÐ  Ú
isinstancer›  r%   rW   r]   r[   r4   r@   ÚZombieProcessÚNotImplementedErrorr²  rÝ   ry   )r5   rC   Údr9   r9   r:   Útest_as_dictu  s^   ÿÿþÿÿþÿÿþÿÿ€û	ÿÿ$ÿzTestProcess.test_as_dictc              	   C   sÄ   t  ¡ }t d¡�+}| ¡ � | ¡  | ¡  W d   ƒ n1 s!w   Y  |  |jd¡ W d   ƒ n1 s7w   Y  t d¡�}| ¡  | ¡  W d   ƒ n1 sTw   Y  |  |jd¡ d S )Nú$psutil._psplatform.Process.cpu_timesrb   rš   ©r2   r3   r%   rW   ÚoneshotrŽ   r=   Ú
call_count©r5   rC   rŒ   r9   r9   r:   Útest_oneshot£  s   

þü
þzTestProcess.test_oneshotc                 C   s4  t  ¡ }t d¡�c}t d¡�N}| ¡ �, | ¡  | ¡  | ¡ � | ¡  | ¡  W d   ƒ n1 s4w   Y  W d   ƒ n1 sCw   Y  |  |jd¡ |  |jd¡ W d   ƒ n1 s`w   Y  W d   ƒ n1 sow   Y  t d¡�}| ¡  | ¡  W d   ƒ n1 sŒw   Y  |  |jd¡ d S )Nr   z(psutil._psplatform.Process.oneshot_enterrb   rš   r  )r5   rC   Úm1Úm2rŒ   r9   r9   r:   Útest_oneshot_twice°  s,   


þ€ýø€ÿ
þzTestProcess.test_oneshot_twicec                 C   s¾   |   ¡ \}}| ¡ }| ¡ }|  ||¡ | ¡ � |  | ¡ |¡ |  | ¡ |¡ W d   ƒ n1 s3w   Y  | ¡ � |  | ¡ |¡ |  | ¡ |¡ W d   ƒ d S 1 sXw   Y  d S r0   )rq   rÍ  rð  r  r=   )r5   Úp1Úp2Úp1_ppidÚ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 ]	\}}|||ƒ q,trLtsNtjj}ˆ  || ¡ ƒ|tƒ¡ d S d S d S )Nc                    sv   z| ƒ }W n$ t jy   ‚  t jy   Y d S  t jy)   tr(|dv r(Y d S ‚ w tr2|dv r2d S ˆ  d| |f ¡‚)N)r  rÿ   )rL  rx   z+%r didn't raise NSP and returned %r instead)r2   rü  r[   r]   r   r   r|   )ÚfunÚfun_namerì   rò  r9   r:   Úassert_raises_nspÛ  s    
ýÿzFTestProcess.test_halfway_terminated_process.<locals>.assert_raises_nspz%s not in ret)r;   rO   rF   r   r"   r2   rÐ  r4   rJ   r&   ÚiterÚallr   r>   r°   rB  r=   rL  r   )r5   r  rC   Únsr  rx   rB  r9   rò  r:   Útest_halfway_terminated_processÓ  s   
þz+TestProcess.test_halfway_terminated_processc                 C   sÐ   dd„ }|   ¡ \}}t |j¡}|  | ¡ tj¡ | ¡ sJ ‚| ¡  t	|ƒ}| 
|j¡D ]\}}||ƒ q-t |j¡s>J ‚|  |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y   Y d S w 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   r  r9   ©r4   rã   r9   r9   r:   rå     r  z3TestProcess.test_zombie_process.<locals>.<listcomp>c                 S   r  r9   r  rã   r9   r9   r:   rå      r  )Úspawn_zombier2   r3   r4   r=   r…  ÚSTATUS_ZOMBIErI  rù  r&   r  r  Ú
pid_existsr¦   rÐ  rç  Ú_pmap)r5   r  rÏ  ÚzombieÚzprocr  r  rx   r9   r9   r:   Útest_zombie_processý  s   
 zTestProcess.test_zombie_processc                 C   sX   t  ¡ }tjdt  d¡d��}| ¡ sJ ‚|jsJ ‚W d   ƒ d S 1 s%w   Y  d S )NrÖ  r   rU   )r2   r3   r%   rW   rü  rI  r‹   r  r9   r9   r:   Ú$test_zombie_process_is_running_w_exc"  s   ÿ"ýz0TestProcess.test_zombie_process_is_running_w_excc                 C   s^   t  ¡ }tjdt  d¡d��}|  | ¡ t j¡ |jsJ ‚W d   ƒ d S 1 s(w   Y  d S )Nz!psutil._psplatform.Process.statusr   rU   )	r2   r3   r%   rW   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ª   |   ¡ }t |j¡}|j| ¡ d f|_| ¡ rJ ‚|t |j¡ks$J ‚d}|  tj||j	¡ |  tj||j
¡ |  tj||j¡ |  tj||j¡ |  tj||j¡ d S )Nr€   z4process no longer exists and its PID has been reused)r1   r2   r3   r4   r©   Ú_identrI  rÕ   r[   rm   rn   rO   rE   rÞ  )r5   ÚsubprC   r!  r9   r9   r:   Útest_reused_pid6  s   zTestProcess.test_reused_pidc              	   C   sv  dt  ¡ vr#|  t jt jd¡ t  d¡rJ ‚|  t  d¡ ¡ d¡ d S t  d¡}tr-t j	nt
}|  ||j¡ |  ||j¡ |  ||j¡ |  ||j¡ |  ||j¡ |  ||jtj¡ t|ƒ}| |j|j ¡D ]=\}}z|ƒ }W n
 t j	y{   Y qhw |dv rˆ|  |jd¡ qh|dkr›tr�dnd}|  | ¡ |¡ qh|dkr¥|s¥J |ƒ‚qhts·|  dt  ¡ ¡ t  d¡s¹J ‚d S d S )Nr   rb   )ri  rs  rŠ  zNT AUTHORITY\SYSTEMÚrootrx   )r2   rÐ  r@   r[   r3   r  r=   rÍ  r   r]   ry   rF   rO   rm   rn   rE   rQ   rG   rH   r&   r  ÚgettersÚsettersrn  rŠ  r   r¦   )r5   rC   rù   r  r  rx   rì   r�   r9   r9   r:   Ú
test_pid_0D  sB   

ÿ€þzTestProcess.test_pid_0c                 C   sP   dd„ }d | _ t ¡ }|| ¡ ƒ}|tj ¡ ƒ}ts$tr&|  ||¡ d S d S d S )Nc                 S   sV   |   dd ¡ |   dd ¡ tr |   dd ¡ |   dd ¡ |   dd ¡ tdd„ |  ¡ D ƒƒS )NÚPLATÚHOMEÚ__CF_USER_TEXT_ENCODINGÚVERSIONER_PYTHON_PREFER_32_BITÚVERSIONER_PYTHON_VERSIONc                 S   s8   g | ]\}}|  d d¡  dd¡|  d d¡  dd¡f‘qS )úrT   Ú
)rO  )rä   ÚkÚvr9   r9   r:   rå   v  s
    þÿz@TestProcess.test_environ.<locals>.clean_dict.<locals>.<listcomp>)Úpopr   Údictré  )rþ  r9   r9   r:   Ú
clean_dictm  s   þÿz,TestProcess.test_environ.<locals>.clean_dict)	ÚmaxDiffr2   r3   rŽ  r>   Úcopyr	   r   r=   )r5   r2  rC   Úd1Úd2r9   r9   r:   Útest_environk  s   ÿzTestProcess.test_environc                 C   sÈ   t  d¡}|  ¡ }t||d� | j|gtjtjd�}t |j	¡}t
|j	ƒ | ¡ s+J ‚|  |j ¡ d¡ trJtrJz| ¡ }W n tjyI   Y d S w | ¡ }|  |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);
            }
            )Úc_code)Ústdinra   ó    r£  Ú3)ÚAÚCr   )ÚtextwrapÚdedentrÁ   r$   r1   rd   re   r2   r3   r4   r.   rI  r=   ra   r¹   r   r   rŽ  r]   ÚcommunicateÚ
returncode)r5   rL   r°   r8   rC   Úenvr9   r9   r:   Útest_weird_environ�  s(   
ÿ
ýzTestProcess.test_weird_environN)kÚ__name__Ú
__module__Ú__qualname__Ú__doc__r;   rD   rM   rP   rS   r-   ÚskipIfr
   r^   rg   ro   rv   rz   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   rA  rF  rH  rJ  rR  rW  r   rZ  r]  ra  r   r   re  rq  rw  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   r7  rC  r9   r9   r9   r:   r/   J   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.
        rj  c                    sX   t ƒ j|i |¤Ž dd„ t| ƒD ƒD ]}t| |ƒ‰ ‡ fdd„}t| |t || ¡ƒ qd S )Nc                 S   rß   )Útestrá   rã   r9   r9   r:   rå   À  ræ   z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                    s$   zˆ ƒ  W d S  t jy   Y d S w r0   )r2   r]   rò  ©Úmethr9   r:   Útest_Ã  s
   ÿz+LimitedUserTestCase.__init__.<locals>.test_)r   Ú__init__rè   r—   ÚsetattrÚtypesÚ
MethodType)r5   r6   r7   ÚattrrM  ©Ú	__class__rK  r:   rN  ¼  s   
øzLimitedUserTestCase.__init__c                    s"   t ƒ  ¡  t d¡ t d¡ d S )Niè  )r   ÚsetUpr>   ÚsetegidÚseteuidrò  rS  r9   r:   rU  Ê  s   

zLimitedUserTestCase.setUpc                    s&   t  | j¡ t  | j¡ tƒ  ¡  d S r0   )r>   rV  ÚPROCESS_UIDrW  ÚPROCESS_GIDr   ÚtearDownrò  rS  r9   r:   rZ  Ï  s   zLimitedUserTestCase.tearDownc                 C   s8   z	t  ¡  d¡ W n t jy   Y d S w |  d¡ d S )Nrw   zexception not raised)r2   r3   r{  r]   r|   rò  r9   r9   r:   r„  Ô  s   ÿzLimitedUserTestCase.test_nicerb   zcauses problem as rootc                 C   s   d S r0   r9   rò  r9   r9   r:   r  Ü  s   z'LimitedUserTestCase.test_zombie_process)rD  rE  rF  rG  rl  r>   rj  rX  rt  rY  rN  rU  rZ  r„  r-   rH  r  Ú__classcell__r9   r9   rS  r:   rI  ²  s    

rI  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��&}| ¡  | ¡  |j |  t	|ƒ¡ |  
tt|d¡ | ¡  W d   ƒ n1 s8w   Y  trL|  | d¡tj ¡ d S |  | d¡tj¡ d S )Nr_   úimport time; time.sleep(60);©Ústdoutra   r×  rc   )r   r2   ÚPopenrd   re   rx   rŽ   r9  Ú
assertTruerè   r@   rA   r—   rO   r
   r=   rF   rG   rH   ©r5   rf   Úprocr9   r9   r:   Ú	test_miscí  s   

ÿ
ùzTestPopen.test_miscc                 C   sz   t jtdgtjtjtjd��}| ¡  W d   ƒ n1 sw   Y  |jjs(J ‚|jjs.J ‚|j	js4J ‚|  
|jd¡ d S )Nz-V)ra  ra   r9  r   )r2   rb  r   rd   re   r@  ra  Úclosedra   r9  r=   rA  )r5   re  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��V}| ¡  | ¡  |  tj|j¡ |  tj|j	¡ |  tj|j
tj¡ trUtjdkr]|  tj|j
tj¡ |  tj|j
tj¡ W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 shw   Y  d S )Nr_   r_  r`  )rš   rË   )r   r2   rb  rd   re   rO   rF   r@   r[   rE   rQ   rG   rH   r   rM  rN  ÚCTRL_C_EVENTÚCTRL_BREAK_EVENTrd  r9   r9   r:   Útest_kill_terminate
  s0   

ÿÿÿÿõø"øzTestPopen.test_kill_terminateN)	rD  rE  rF  rG  Úclassmethodr^  rf  rh  rk  r9   r9   r9   r:   r\  æ  s    
r\  Ú__main__)Úrun_from_name)ErG  rå  rY   rŒ  r§  r>   rG   rÄ  r6  rd   rM  r>  r{   rP  r2   r   r   r   r   r   r   r	   r
   r   r   Úpsutil._commonr   Úpsutil._compatr   r   r   r   Ú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/   rj  rI  r\  rD  Úpsutil.tests.runnerrn  Ú__file__r9   r9   r9   r:   Ú<module>   s˜             p4
8þ