a
    þdnö  ã                   @   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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< dd-l!m=Z= dd.l!m>Z> G d/d0„ d0e2ƒZ?erÀe @¡ dkrÀG d1d2„ d2e?ƒZAG d3d4„ d4e2ƒZBeCd5krîdd6lDmEZE eEeFƒ dS )7ú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)ÚMACOS_11PLUS)ÚPYPY)Ú
PYTHON_EXE)ÚPYTHON_EXE_ENV)Ú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)Ú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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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! d0¡d1d2„ ƒƒZ"e	 
e# d"¡d3d4„ ƒZ$e	 
e# d"¡d5d6„ ƒZ%e	 
e# d"¡d7d8„ ƒZ&e	 
e# d"¡d9d:„ ƒZ'e	 
e# d"¡d;d<„ ƒZ(d=d>„ Z)e	 
e! d?¡d@dA„ ƒZ*e	 
e+ d"¡dBdC„ ƒZ,e-ƒ e.e/d*e	 
e+ d"¡dDdE„ ƒƒƒZ0e-ƒ dFdG„ ƒZ1dHdI„ Z2e	 
e3 d"¡dJdK„ ƒZ4e	 
e3 d"¡dLdM„ ƒZ5dNdO„ Z6dPdQ„ Z7dRdS„ Z8dTdU„ Z9e	 
e:dV¡dWdX„ ƒZ;dYdZ„ Z<e	 
e:d[¡d\d]„ ƒZ=e	 
e>d^¡e	 
e?d_¡e	 
e:dV¡d`da„ ƒƒƒZ@e	 
e d'¡dbdc„ ƒZAe	 
e d'¡ddde„ ƒZBdfdg„ ZCdhdi„ ZDdjdk„ ZEdldm„ ZFdndo„ ZGe	 
eH d"¡dpdq„ ƒZIe	 
eH d"¡drds„ ƒZJe	 
eH d"¡dtdu„ ƒZKe	 
eLdv¡e	 
eMdw¡dxdy„ ƒƒZNe	 
eLdv¡e	 
eMdw¡dzd{„ ƒƒZOe	 
e d'¡d|d}„ ƒZPeed*e	 
eQpÀed~¡dd€„ ƒƒZRdd‚„ ZSdƒd„„ ZTd…d†„ ZUd‡dˆ„ ZVe-ƒ d‰dŠ„ ƒZWd‹dŒ„ ZXddŽ„ ZYdd„ ZZd‘d’„ Z[d“d”„ Z\d•d–„ Z]d—d˜„ Z^d™dš„ Z_d›dœ„ Z`ddž„ 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'¡e	 
ejd­¡d®d¯„ ƒƒƒZkd°S )±ÚTestProcessr   c                 O   s   | j |i |¤Ž}t |j¡S ©N)Úspawn_testprocÚpsutilÚProcessÚpid)ÚselfÚargsÚkwargsÚsproc© r:   úb/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/psutil/tests/test_process.pyÚspawn_psprocO   s    zTestProcess.spawn_psprocc                 C   sN   t  ¡ }|  |jt ¡ ¡ |  t¡ d|_W d   ƒ n1 s@0    Y  d S )Né!   )r3   r4   ÚassertEqualr5   ÚosÚgetpidÚassertRaisesÚAttributeError©r6   Úpr:   r:   r;   Útest_pidU   s    zTestProcess.test_pidc                 C   sJ   |   ¡ }| ¡  | ¡ }tr,|  |tj¡ n|  |tj ¡ |  |¡ d S r1   )	r<   ÚkillÚwaitr   r>   ÚsignalÚSIGTERMÚSIGKILLÚassertProcessGone©r6   rD   Úcoder:   r:   r;   Ú	test_kill[   s    zTestProcess.test_killc                 C   sJ   |   ¡ }| ¡  | ¡ }tr,|  |tj¡ n|  |tj ¡ |  |¡ d S r1   )r<   Ú	terminaterG   r   r>   rH   rI   rK   rL   r:   r:   r;   Útest_terminatee   s    zTestProcess.test_terminatec                 C   sX   t r
tjntj}|  ¡ }| |¡ | ¡ }tr<|  ||¡ n|  || ¡ |  	|¡ d S r1   )
r
   rH   rJ   rI   r<   Úsend_signalrG   r   r>   rK   )r6   ÚsigrD   rM   r:   r:   r;   Útest_send_signalo   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 sL0    Y  |  ¡ }tjdttjdƒd" |  t	j|j|¡ W d   ƒ n1 sœ0    Y  d S )Nzpsutil.os.killÚ ©Úside_effect)rH   rI   r<   r'   ÚpatchÚOSErrorÚerrnoZESRCHrA   r3   ÚNoSuchProcessrQ   ÚEPERMÚAccessDenied)r6   rR   rD   r:   r:   r;   Útest_send_signal_mockedz   s    
ÿ0
ÿ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<   rG   r>   rK   Ú
subprocessÚPIPE)r6   ÚcmdrD   rM   r:   r:   r;   Útest_wait_exited‡   s(    









zTestProcess.test_wait_exitedzfails on NETBSDc                 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
   rQ   rH   ÚSIGSTOPrA   r3   ÚTimeoutExpiredrG   ÚSIGCONTrI   r>   ÚsuspendÚresumerO   rC   r:   r:   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_pairrA   r3   rj   rG   rO   r
   r>   rH   rI   )r6   ÚchildÚ
grandchildZ	child_retZgrandchild_retr:   r:   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 )Nro   r   éÿÿÿÿ)r<   ÚnamerA   r3   rj   rG   Ú
ValueErrorrC   r:   r:   r;   Útest_wait_timeoutÍ   s
    zTestProcess.test_wait_timeoutc                 C   s    |   ¡ }|  tj|jd¡ | ¡  t ¡ t }t ¡ |k rdz| d¡}W qnW q. tjy`   Y q.0 q.|  d¡‚t	r„|  
|tj ¡ n|  
|tj¡ |  |¡ d S )Nr   rh   )r<   rA   r3   rj   rG   rF   Útimer   Úfailr
   r>   rH   rJ   rI   rK   )r6   rD   Zstop_atrM   r:   r:   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   ƒ n1 s~0    Y  d S )Nrg   )Úintervaléd   ç        rt   )	r3   r4   Úcpu_percentÚrangeÚassertIsInstanceÚfloatÚassertGreaterEqualrA   rv   )r6   rD   Ú_Úpercentr:   r:   r;   Útest_cpu_percentç   s    zTestProcess.test_cpu_percentc                 C   sH   t jdd d&}t ¡  ¡  |js&J ‚W d   ƒ n1 s:0    Y  d S )Nzpsutil.cpu_count)Zreturn_value)r'   rW   r3   r4   r~   Úcalled)r6   Úmr:   r:   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sLJ |ƒ‚trb|jdksbJ |ƒ‚|j	D ]}t
 dt
 t||ƒ¡¡ qhd S )Nr}   z%H:%M:%S)r3   r4   Ú	cpu_timesÚuserÚsystemÚchildren_userÚchildren_systemr   ZiowaitÚ_fieldsrx   ÚstrftimeÚ	localtimeÚgetattr)r6   Útimesru   r:   r:   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)r3   r4   r‰   r?   r’   ÚmaxÚminry   )r6   Ú	user_timeZkernel_timeÚutimeZktimer:   r:   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   ra   )r3   r4   Zcpu_numr‚   Ú	cpu_countr>   ÚassertInr   )r6   rD   Únumr:   r:   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<   rx   Úcreate_timeÚabsry   r   r   )r6   rD   Únowr    Ú
differencer:   r:   r;   Útest_create_time  s    ÿzTestProcess.test_create_timez
POSIX onlyc                 C   s4   t  ¡  ¡ }|d ur0tj tdƒ¡}|  ||¡ d S )NÚtty)r3   r4   Úterminalr?   ÚpathÚrealpathr,   r>   )r6   r¦   r¥   r:   r:   r;   Útest_terminal)  s    zTestProcess.test_terminal)Zonly_ifc                 C   sÒ  t  ¡ }| ¡ }ttdƒ}| ¡  W d   ƒ n1 s80    Y  | ¡ }ts˜ts˜|  |j	|j	¡ |  
|j|j¡ tr¸|  |j|j¡ |  
|j|j¡ n |  |j|j¡ |  |j|j¡ | ¡ }t|  ¡ dƒ8}trê| tdd dƒ¡ n| dd ¡ W d   ƒ n1 s0    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ÚwbÚxi@B Úasciir”   r   )r3   r4   Zio_countersÚopenr    Úreadr   r   ÚassertGreaterZ
read_countr>   Zwrite_countr   Z
read_charsZwrite_charsr‚   Ú
read_bytesÚwrite_bytesÚ
get_testfnr   ÚwriteÚbytesr   Úlen)r6   rD   Zio1ÚfZio2Úir:   r:   r;   Útest_io_counters0  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¡ | ¡ }z€| t j¡ |  t	| ¡ ƒt jdf¡ |  
t¡  |jt jdd W d   ƒ n1 s¼0    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 sH0    Y  z|jt jdd W n t jy|   Y n0 |  td|jt jd¡ |  td|jt jd¡ | jtd	|jdd W |\}}|t jkrØd}| ||¡ n&|\}}|t jkrþd}| ||¡ 0 d S )
Nr   ra   r”   é   é   ©Úvalueé   zioclass accepts no valuez$'ioclass' argument must be specified)r3   r4   r   r>   ÚioniceZIOPRIO_CLASS_NONEZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLEÚtuplerA   rv   r\   ÚassertRaisesRegex)r6   rD   ÚinitZioclassr½   r:   r:   r;   Útest_ionice_linux[  sV    .0
þ
þþý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	yˆ   Y n0 |  | ¡ t j¡ | j
td|jt jdd |  
td|jt jd ¡ W | |¡ n| |¡ 0 d S )Nz&value argument not accepted on Windowsra   r¼   zis not a valid priority)r3   r4   r   r>   r¿   ZIOPRIO_NORMALZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_HIGHr\   rÁ   Ú	TypeErrorrv   )r6   rD   rÂ   r:   r:   r;   Útest_ionice_win‡  s.    
þþzTestProcess.test_ionice_winc                 C   sÐ   dd l }t t ¡ ¡}dd„ ttƒD ƒ}|s4J |ƒ‚|D ]’}tt|ƒ}|  |d¡ |t|ƒv 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¬   r:   r:   r;   Ú
<listcomp>¨  ó    z/TestProcess.test_rlimit_get.<locals>.<listcomp>r”   rt   ra   )Úresourcer3   r4   r?   r@   Údirr‘   r‚   r>   r   ÚrlimitZ	getrlimitr¶   )r6   rÌ   rD   Únamesru   r½   Úretr:   r:   r;   Útest_rlimit_get¤  s     

zTestProcess.test_rlimit_getc                 C   s¨   |   ¡ }| tjd¡ |  | tj¡d¡ trl|  td¡" tj 	d¡ d¡ W d   ƒ n1 sb0    Y  |  
t¡ | tjd¡ W d   ƒ n1 sš0    Y  d S )N)rb   rb   zcan't use prlimitr   )rb   rb   rb   )r<   rÎ   r3   ZRLIMIT_NOFILEr>   r   rÁ   rv   Z_psplatformr4   rA   rC   r:   r:   r;   Útest_rlimit_set»  s    0zTestProcess.test_rlimit_setc                 C   sD  t  ¡ }|  ¡ }| t j¡\}}zò| t jd|f¡ t|dƒ}| d¡ W d   ƒ n1 s^0    Y  |  t¡D}t|dƒ}| d¡ W d   ƒ n1 sž0    Y  W d   ƒ n1 s¼0    Y  |  	t
rÖ|jjn|jd tj¡ W | t j||f¡ |  	| t j¡||f¡ n,| t j||f¡ |  	| t j¡||f¡ 0 d S )Né   r«   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   )r3   r4   r³   rÎ   ÚRLIMIT_FSIZEr®   r´   rA   ÚIOErrorr>   r   Ú	exceptionrY   ZEFBIG)r6   rD   ÚtestfnÚsoftÚhardr·   Úexcr:   r:   r;   Útest_rlimitÈ  s"    (Fÿÿ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 sn0    Y  W | t j||f¡ |  | t j¡||f¡ n,| t j||f¡ |  | t j¡||f¡ 0 d S )NrÓ   r«   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)	r3   r4   rÎ   rÔ   ÚRLIM_INFINITYr®   r³   r´   r>   )r6   rD   rØ   rÙ   r·   r:   r:   r;   Útest_rlimit_infinityÜ  s    *ÿz TestProcess.test_rlimit_infinityc                 C   s<   t  ¡ }| t j¡\}}|  t j|¡ | t j||f¡ d S r1   )r3   r4   rÎ   rÔ   r>   rÜ   )r6   rD   rØ   rÙ   r:   r:   r;   Útest_rlimit_infinity_valueë  s    z&TestProcess.test_rlimit_infinity_valuec                 C   s„   t  ¡ }tr:z| ¡ }W qB t jy6   t d¡‚Y qB0 n| ¡ }tƒ ( | ¡ }|  ||d ¡ W d   ƒ n1 sv0    Y  d S )Nú$on OpenBSD this requires root accessra   )	r3   r4   r   Únum_threadsr\   ÚunittestÚSkipTestr#   r>   )r6   rD   Ústep1Ústep2r:   r:   r;   Útest_num_threads÷  s    zTestProcess.test_num_threadszWINDOWS onlyc                 C   s   t  ¡ }|  | ¡ d¡ d S ©Nr   )r3   r4   r°   Znum_handlesrC   r:   r:   r;   Útest_num_handles  s    zTestProcess.test_num_handlesc                 C   sÊ   t  ¡ }tr:z| ¡ }W qB t jy6   t d¡‚Y qB0 n| ¡ }tƒ n | ¡ }|  t	|ƒt	|ƒd ¡ |d }|  |j
|d ¡ |  |j|d ¡ |  |j|d ¡ W d   ƒ n1 s¼0    Y  d S )Nrß   ra   r   r”   )r3   r4   r   Úthreadsr\   rá   râ   r#   r>   r¶   Úidr˜   Úsystem_time)r6   rD   rã   rä   Zathreadr:   r:   r;   Útest_threads  s    zTestProcess.test_threadsc                 C   sŒ   |   ¡ }tr8z| ¡  W n tjy6   t d¡‚Y n0 | 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 r:   )r˜   rÈ   r:   r:   r;   rÊ   /  rË   z.TestProcess.test_threads_2.<locals>.<listcomp>r•   )Údeltac                 S   s   g | ]
}|j ‘qS r:   )rê   rÈ   r:   r:   r;   rÊ   2  rË   )r<   r   rè   r3   r\   rá   râ   ZassertAlmostEqualr‰   rŠ   Úsumr‹   rC   r:   r:   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`ã )r3   r4   Zmemory_infoÚmemory_percentr°   r‚   r   r>   ZrssZwsetÚvmsZpagefilerŽ   r‘   )r6   rD   Zrss1Zvms1Zpercent1ZmemarrZrss2Zvms2Zpercent2Úmemru   r:   r:   r;   Útest_memory_info4  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ð   )r3   r4   Zvirtual_memoryÚtotalZmemory_full_inforŽ   r‘   r‚   r	   r   ZassertLessEqualr   r   ÚussZpssZswap)r6   rD   rô   rñ   ru   r½   r:   r:   r;   Útest_memory_full_infoS  s    


z!TestProcess.test_memory_full_infoc           
      C   s²  t  ¡ }| ¡ }|  t|ƒtt|ƒƒ¡ |jdd}|D ]}|j d¡s8tj 	|j¡sbJ |jƒ‚t
rîz*tj |j¡sŽtj |j¡sŽJ |jƒ‚W nZ tyê   ts¦‚ n@tdƒ}| ¡ }W d   ƒ n1 sÌ0    Y  d|j |vræ‚ Y n0 q8dtj |j¡vr8zt |j¡}W n ty$   Y q80 t |j¡s8J |jƒ‚q8|D ]j}|jD ]\}t||ƒ}	|dkrjqLn<|dv r„|	s¦J |	ƒ‚n"|  |	ttf¡ |	d	ksLJ |	ƒ‚qLqBd S )
NF)Zgroupedú[z/proc/self/smapsz%s (deleted)Z64r§   )ÚaddrZpermsr   )r3   r4   Úmemory_mapsr>   r¶   Úsetr§   rÇ   r?   Úisabsr
   ÚexistsÚislinkÚAssertionErrorr   r   r¯   ÚbasenameÚstatr   ÚS_ISREGÚst_moderŽ   r‘   r€   Úintr   )
r6   rD   ÚmapsZext_mapsÚntr·   ÚdataÚstÚfnamer½   r:   r:   r;   Útest_memory_mapsc  sH    
ÿÿ
&




zTestProcess.test_memory_mapsc                    s`   t  ¡ }tƒ >}dd„ ‰ ‡ fdd„| ¡ D ƒ}|  ˆ |ƒ|¡ W d   ƒ n1 sR0    Y  d S )Nc                 S   s   t j t j | ¡¡S r1   )r?   r§   r¨   Únormcase)rD   r:   r:   r;   Únormpath•  s    z8TestProcess.test_memory_maps_lists_lib.<locals>.normpathc                    s   g | ]}ˆ |j ƒ‘qS r:   )r§   rÈ   ©r  r:   r;   rÊ   —  s   ÿz:TestProcess.test_memory_maps_lists_lib.<locals>.<listcomp>)r3   r4   r%   rù   r   )r6   rD   r§   Zlibpathsr:   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õ   )r3   r4   rï   rA   rv   r   r   r   rC   r:   r:   r;   Útest_memory_percent›  s
    zTestProcess.test_memory_percentc                 C   sL   |   ¡ }| ¡ sJ ‚| ¡ s J ‚| ¡  | ¡  | ¡ r<J ‚| ¡ rHJ ‚d S r1   )r<   Ú
is_runningrF   rG   rC   r:   r:   r;   Útest_is_running¢  s    zTestProcess.test_is_runningc                 C   sÐ   |   ¡ }| ¡ }z|  |t¡ W n ty°   tr`t|ƒttƒkr`tjj	}|  ||ƒ|tƒ¡ nLdt
jd t
jd f }z |  | |d¡t |d¡¡ W n tyª   Y n0 Y n0 t|ddgƒ}|  |d¡ d S )Nz%s.%sr   ra   rT   r^   zimport os; print('hey')Zhey)r<   Úexer>   r    rþ   r   r¶   r?   r§   r
  ÚsysÚversion_infoÚreplacer,   )r6   rD   r  r
  ÚverÚoutr:   r:   r;   Útest_exe«  s"    
ÿzTestProcess.test_exec                 C   s¢   t ddg}|  |¡}ts ts tr6|  | ¡ d t ¡ nhtr‚tr‚| ¡ d }|t kr‚|  d 	| ¡ dd … ¡d 	|dd … ¡¡ d S |  d 	| ¡ ¡d 	|¡¡ d S )Nr^   zimport time; time.sleep(60)r   ú ra   )
r    r<   r   r   r   r>   Úcmdliner   r   Újoin)r6   r  rD   Úpyexer:   r:   r;   Útest_cmdlineÇ  s    

ÿzTestProcess.test_cmdlinezbroken on PYPYc                 C   sx   |   ¡ }t|ƒ |gdgd  }|  |¡}trdz|  | ¡ |¡ W qt tjy`   |  d¡‚Y qt0 n|  | ¡ |¡ d S )NÚ
0123456789é   z#OPENBSD: process turned into zombie)	r³   r&   r<   r   r>   r  r3   ÚZombieProcessÚskipTest)r6   r×   r  rD   r:   r:   r;   Útest_long_cmdlineÚ  s    
zTestProcess.test_long_cmdlinec                 C   sJ   |   t¡}| ¡  ¡ }tj tj tj	¡¡ ¡ }| 
|¡sFJ ||fƒ‚d S r1   )r<   r    ru   Úlowerr?   r§   rÿ   r¨   r  Ú
executablerÇ   )r6   rD   ru   r  r:   r:   r;   Ú	test_nameê  s    
zTestProcess.test_namezunreliable on PYPYc                 C   sœ   | j dd}t|ƒ |  |¡}tr€z|  | ¡ tj |¡¡ W q˜ t	y|   | 
¡ tjkrvtj |¡ | ¡ ¡sxJ ‚n‚ Y q˜0 n|  | ¡ tj |¡¡ d S )NZ01234567890123456789©Úsuffix)r³   r&   r<   r   r>   ru   r?   r§   rÿ   rþ   Ústatusr3   ÚSTATUS_ZOMBIErÇ   )r6   r×   rD   r:   r:   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arg2rT   Zarg3)r³   r&   r<   r>   r  ru   r?   r§   rÿ   r
  r  )r6   Z
funky_pathr  rD   r:   r:   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)	r3   r4   Úuidsr>   r?   ÚgetuidÚgeteuidÚhasattrr,  ©r6   rD   ÚrealZ	effectiveZsavedr:   r:   r;   Ú	test_uids  s    
zTestProcess.test_uidsc                 C   sX   t  ¡ }| ¡ \}}}|  |t ¡ ¡ |  |t ¡ ¡ ttdƒrT|  t ¡ | ¡ ¡ d S r+  )	r3   r4   Úgidsr>   r?   ÚgetgidÚgetegidr0  Ú	getresgidr1  r:   r:   r;   Ú	test_gids(  s    
zTestProcess.test_gidsc                 C   sÚ  t  ¡ }|  t|jd¡ | ¡ }zŠtrÚd }t jt jt jt j	t j
t jfD ]Ž}| j|dn z| |¡ W n t jy|   Y n<0 | ¡ }tr¬||ksš|d u rž|}|  ||¡ n|  ||¡ W d   ƒ qH1 sÌ0    Y  qHnªz’ttdƒr|  t tjt ¡ ¡| ¡ ¡ | d¡ |  | ¡ d¡ ttdƒrJ|  t tjt ¡ ¡| ¡ ¡ tsj| d¡ |  | ¡ d¡ W n t jy‚   Y n0 W z| |¡ W n t jyª   Y n0 n(z| |¡ W n t jyÒ   Y n0 0 d S )NÚstr)ÚprioÚgetpriorityra   r   )r3   r4   rA   rÄ   Únicer   ZIDLE_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZNORMAL_PRIORITY_CLASSZABOVE_NORMAL_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZREALTIME_PRIORITY_CLASSZsubTestr\   r   r>   r0  r?   r;  ÚPRIO_PROCESSr@   r   )r6   rD   rÂ   Zhighest_prior:  Znew_prior:   r:   r;   Ú	test_nice6  sd    û.þ
þ
ýzTestProcess.test_nicec                 C   s   t  ¡ }|  | ¡ t j¡ d S r1   )r3   r4   r>   r'  ZSTATUS_RUNNINGrC   r:   r:   r;   Útest_statusl  s    zTestProcess.test_statusc                 C   s|   |   ¡ }| ¡ }trh| d¡\}}t ¡ }| d¡r>t d¡‚|  	||¡ dt
jv rx|  	|t
jd ¡ n|  	|t ¡ ¡ d S )Nú\ú$zrunning as service accountZ
USERDOMAIN)r<   Úusernamer   ÚsplitÚgetpassÚgetuserÚendswithrá   râ   r>   r?   Úenviron)r6   rD   rB  ÚdomainZgetpass_userr:   r:   r;   Útest_usernamep  s    


zTestProcess.test_usernamec                 C   s    |   ¡ }|  | ¡ t ¡ ¡ d S r1   )r<   r>   Úcwdr?   ÚgetcwdrC   r:   r:   r;   Útest_cwd  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$   rJ  )r6   re   rD   r:   r:   r;   Ú
test_cwd_2…  s
    ÿ
zTestProcess.test_cwd_2c                 C   s†  t  ¡ }| ¡ }|sJ |ƒ‚|  |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   ra   )r3   r4   Úcpu_affinityÚ
addCleanupr0  r?   r>   ÚlistrN  r5   r¶   rú   r   r~   rP  r   Ú_procZ_get_eligible_cpusrA   rÄ   rÀ   )r6   rD   ÚinitialZall_cpusÚnr:   r:   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 )	NTrO  é
   i'  iø*  r   Ú1rt   )	r<   r¶   r3   r‰   rA   rv   rQ  r   rÄ   )r6   rD   Zinvalid_cpur:   r:   r;   Útest_cpu_affinity_errs³  s    z"TestProcess.test_cpu_affinity_errsc                 C   s²   t  ¡ }| ¡ }|sJ |ƒ‚|  |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   ra   )r3   r4   rQ  rR  r¶   r   Ú	itertoolsÚcombinationsÚappendrS  r>   Úsorted)r6   rD   rU  Zcombosr¸   ZsubsetZcombor:   r:   r;   Ú"test_cpu_affinity_all_combinations¼  s    
z.TestProcess.test_cpu_affinity_all_combinationszbroken on BSDzunreliable on APPVEYORc           	      C   sh  t  ¡ }|  ¡ }| ¡ }|  ||¡ t|dƒ~}| d¡ | ¡  t|jdt	|ƒ ƒ}dd„ |D ƒ}|  
tj |¡|¡ trž|D ]}|j|kr€|  |jd¡ q€W d   ƒ n1 s²0    Y  |D ]}tj |j¡sÀJ |ƒ‚qÀd| }|  td|g¡}td	ƒD ]0}d
d„ | ¡ D ƒ}||v r" qBt d¡ qü|  
tj |¡|¡ |D ]}tj |¡sFJ |ƒ‚qFd S )Nr«   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzlen(ret) != %ic                 S   s   g | ]}t j |j¡‘qS r:   ©r?   r§   r
  rÈ   r:   r:   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   s   g | ]}t j |j¡‘qS r:   ra  rÈ   r:   r:   r;   rÊ   ì  rË   ro   )r3   r4   r³   Ú
open_filesÚassertNotInr®   r´   Úflushr$   r¶   r   r?   r§   r
  r   r>   ÚpositionÚisfiler<   r    r   rx   Úsleep)	r6   rD   r×   Úfilesr·   Ú	filenamesÚfiler  r¬   r:   r:   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 d   ƒ n1 s0    Y  d S )NÚwzno file found; files=%srt   r   ra   )r3   r4   r?   r§   r
  r³   r®   rb  ru   ÚfdÚfilenory   Úreprr>   r   rc  )r6   rD   r
  r×   Úfileobjrj  Zntupler:   r:   r;   Útest_open_files_2ö  s(    ÿ
ÿzTestProcess.test_open_files_2c                 C   sŽ   t  ¡ }|  ¡ }| ¡ }t|dƒ}|  |j¡ |  | ¡ |d ¡ t ¡ }|  |j¡ |  | ¡ |d ¡ | ¡  | ¡  |  | ¡ |¡ d S )Nrl  ra   r”   )	r3   r4   r³   Znum_fdsr®   rR  Úcloser>   Úsocket)r6   rD   r×   Ústartrj  Úsockr:   r:   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)r3   r4   rí   Znum_ctx_switchesr   ry   )r6   rD   Úbeforerƒ   Úafterr:   r:   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)
r3   r4   r0  r?   r>   Úppidrz  r<   r@   r   rC   r:   r:   r;   Ú	test_ppid-  s    
zTestProcess.test_ppidc                 C   sB   |   ¡ }|  | ¡ jt ¡ ¡ t ¡ d }|  t 	|¡ ¡ ¡ d S ræ   )
r<   r>   Úparentr5   r?   r@   r3   ÚpidsÚassertIsNoner4   )r6   rD   Z
lowest_pidr:   r:   r;   Útest_parent9  s    zTestProcess.test_parentc                 C   s8   t  ¡ }|  ¡ \}}|  | ¡ |¡ |  | ¡ |¡ d S r1   )r3   r4   rp   r>   r}  ©r6   r}  rq   rr   r:   r:   r;   Útest_parent_multi@  s    zTestProcess.test_parent_multic                 C   sP   |   ¡ }tjdt dd¡d |  | ¡ ¡ W d   ƒ n1 sB0    Y  d S )Núpsutil.Processr   ÚfoorU   )r<   r'   rW   r3   rZ   r  r}  rC   r:   r:   r;   Útest_parent_disappearedF  s
    
ÿz#TestProcess.test_parent_disappearedc                 C   s`   t  ¡ }| ¡ sJ ‚|  ¡ \}}|  | ¡ d |¡ |  | ¡ d |¡ |  | ¡ d |¡ d S r›   )r3   r4   Úparentsrp   r>   r  r:   r:   r;   Útest_parentsM  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   )Úcreationflagsra   )r3   r4   r>   Úchildrenr<   r¶   r5   r{  )r6   r}  rq   Z	children1Z	children2r‹  r:   r:   r;   Útest_childrenV  s    zTestProcess.test_childrenc                 C   sf   t  ¡ }|  ¡ \}}|  | ¡ |g¡ |  |jdd||g¡ | ¡  | ¡  |  |jddg ¡ d S )NTrˆ  )r3   r4   rp   r>   r‹  rO   rG   r  r:   r:   r;   Útest_children_recursivee  s    z#TestProcess.test_children_recursivec              	   C   sÄ   t  t¡}t ¡ D ]2}z|| ¡   d7  < W q tjyB   Y q0 qt| ¡ dd„ dd d }t	rx|dkrx|  
d¡‚t |¡}z|jdd	}W n tjy¦   Y n0 |  t|ƒtt|ƒƒ¡ d S )
Nra   c                 S   s   | d S )Nra   r:   )r¬   r:   r:   r;   Ú<lambda>{  rË   z6TestProcess.test_children_duplicates.<locals>.<lambda>)Úkeyrt   r   zPID 0Trˆ  )ÚcollectionsÚdefaultdictr  r3   Úprocess_iterr{  ÚErrorr_  Úitemsr   r   r4   r‹  r\   r>   r¶   rú   )r6   ÚtablerD   r5   Úcr:   r:   r;   Útest_children_duplicatesr  s    


z$TestProcess.test_children_duplicatesc                 C   s|   t  ¡ }|  ¡ \}}|jdd}|  t|ƒd¡ |  |d |¡ |  |d |¡ | ¡ }|  |d |¡ |  |d |¡ d S )NTrˆ  r”   r   ra   )r3   r4   rp   r‹  r>   r¶   r†  )r6   r}  rq   rr   r‹  r†  r:   r:   r;   Útest_parents_and_children†  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|   ro   )
r<   rl   r   r'  r3   ZSTATUS_STOPPEDrx   rg  rm   ÚassertNotEqual)r6   rD   rƒ   r:   r:   r;   Útest_suspend_resume“  s    zTestProcess.test_suspend_resumec                 C   s$   |   ttjd¡ |   ttjd¡ d S )NrY  rt   )rA   rÄ   r3   r4   rv   ©r6   r:   r:   r;   Útest_invalid_pid  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 d   ƒ n1 s´0    Y  t
jddt  |jd¡d	& | jt j|jd
gd W d   ƒ n1 s0    Y  t
jddt  |jd¡d	, |  |jd
gddd
di¡ W d   ƒ n1 s^0    Y  t
jddtd	f | ¡ }|  d
t	| ¡ ƒ¡ |  t¡ |jd
gd W d   ƒ n1 sÆ0    Y  W d   ƒ n1 sæ0    Y  |  t¡ | d¡ W d   ƒ n1 s0    Y  |  t¡ | dg¡ W d   ƒ n1 sT0    Y  |  t¡ | ddg¡ W d   ƒ n1 sŽ0    Y  d S )Nr  ru   )ÚattrsÚconnectionsr„  )r  Zad_valuezpsutil.Process.niceT)ÚcreaterV   r<  ra   Úbar)r3   r4   Úas_dictr>   r_  Úkeysr—   r~  Ú
isinstancerS  r'   rW   r\   rZ   r5   rA   r  ÚNotImplementedErrorrc  rÄ   rv   )r6   rD   Údr:   r:   r;   Útest_as_dict¡  sL    ÿÿ"ÿÿ&ÿÿ$ÿN*,zTestProcess.test_as_dictc              	   C   sÄ   t  ¡ }t d¡V}| ¡   | ¡  | ¡  W d   ƒ n1 sB0    Y  |  |jd¡ W d   ƒ n1 sn0    Y  t d¡ }| ¡  | ¡  W d   ƒ n1 s¨0    Y  |  |jd¡ d S )Nú$psutil._psplatform.Process.cpu_timesra   r”   ©r3   r4   r'   rW   Úoneshotr‰   r>   Z
call_count©r6   rD   r‡   r:   r:   r;   Útest_oneshotÏ  s    
&,&zTestProcess.test_oneshotc                 C   s6  t  ¡ }t d¡Æ}t d¡œ}| ¡ X | ¡  | ¡  | ¡   | ¡  | ¡  W d   ƒ n1 sh0    Y  W d   ƒ n1 s†0    Y  |  |jd¡ |  |jd¡ W d   ƒ n1 sÀ0    Y  W d   ƒ n1 sÞ0    Y  t d¡ }| ¡  | ¡  W d   ƒ n1 s0    Y  |  |jd¡ d S )Nr§  z(psutil._psplatform.Process.oneshot_enterra   r”   r¨  )r6   rD   Úm1Úm2r‡   r:   r:   r;   Útest_oneshot_twiceÜ  s    

DJ(zTestProcess.test_oneshot_twicec                 C   s¼   |   ¡ \}}| ¡ }| ¡ }|  ||¡ | ¡ 0 |  | ¡ |¡ |  | ¡ |¡ W d   ƒ n1 sf0    Y  | ¡ 0 |  | ¡ |¡ |  | ¡ |¡ W d   ƒ n1 s®0    Y  d S r1   )rp   r{  r™  r©  r>   )r6   Úp1Úp2Zp1_ppidZp2_ppidr:   r:   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 nN t jy    ‚ Y n\ t jy2   Y nJ t jyX   trR|dv rRY d S ‚ Y n$0 trj|dv rjd S ˆ  d| |f ¡‚d S )N)rè   rà   )r  ru   z+%r didn't raise NSP and returned %r instead)r3   r  rZ   r\   r   r   ry   )ÚfunZfun_namerÐ   r›  r:   r;   Úassert_raises_nsp  s    
ÿzFTestProcess.test_halfway_terminated_process.<locals>.assert_raises_nspz%s not in ret)r<   rO   rG   r   r$   r3   r~  r5   rK   r(   ÚiterÚallr   r?   r§   r
  r>   r  r    )r6   r³  rD   Únsr²  ru   r
  r:   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 ]\}}||ƒ qZt |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 n0 d S r1   )r3   r  r\   )r²  r:   r:   r;   Úsucceed_or_zombie_p_exc+  s    z@TestProcess.test_zombie_process.<locals>.succeed_or_zombie_p_excc                 S   s   g | ]
}|j ‘qS r:   ©r5   rÈ   r:   r:   r;   rÊ   J  rË   z3TestProcess.test_zombie_process.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r:   r¹  rÈ   r:   r:   r;   rÊ   L  rË   )Zspawn_zombier3   r4   r5   r>   r'  r(  r  r¡  r(   r´  rµ  Ú
pid_existsr   r~  r’  Z_pmap)r6   r¸  r}  ZzombieZzprocr¶  r²  ru   r:   r:   r;   Útest_zombie_process)  s    
zTestProcess.test_zombie_processc                 C   sV   t  ¡ }tjdt  d¡d&}| ¡ s*J ‚|js4J ‚W d   ƒ n1 sH0    Y  d S )Nrƒ  r   rU   )r3   r4   r'   rW   r  r  r†   rª  r:   r:   r;   Ú$test_zombie_process_is_running_w_excN  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   ƒ n1 sN0    Y  d S )Nz!psutil._psplatform.Process.statusr   rU   )	r3   r4   r'   rW   r  r>   r'  r(  r†   rª  r:   r:   r;   Ú test_zombie_process_status_w_excX  s    ÿz,TestProcess.test_zombie_process_status_w_excc                 C   sª   |   ¡ }t |j¡}|j| ¡ d f|_| ¡ r4J ‚|t |j¡ksHJ ‚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)r2   r3   r4   r5   r    Ú_identr  rÁ   rZ   rl   rm   rO   rF   r‹  )r6   ZsubprD   ró   r:   r:   r;   Útest_reused_pidb  s    zTestProcess.test_reused_pidc              	   C   s|  dt  ¡ vrF|  t jt jd¡ t  d¡r,J ‚|  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	yö   Y qÐ0 |dv r|  |jd¡ qÐ|dkr<tr&dnd}|  | ¡ |¡ qÐ|dkrÐ|sÐJ |ƒ‚qÐtsx|  dt  ¡ ¡ t  d¡sxJ ‚d S )Nr   ra   )r-  r4  rB  zNT AUTHORITY\SYSTEMÚrootru   )r3   r~  rA   rZ   r4   rº  r>   r{  r   r\   rv   rG   rO   rl   rm   rF   rQ   rH   rI   r(   r´  ZgettersZsettersr2  rB  r   r   )r6   rD   rÚ   r¶  r²  ru   rÐ   rŠ   r:   r:   r;   Ú
test_pid_0p  s:    



zTestProcess.test_pid_0c                 C   sH   dd„ }d | _ t ¡ }|| ¡ ƒ}|tj ¡ ƒ}tsDtrD|  ||¡ d S )Nc                 S   sV   |   dd ¡ |   dd ¡ tr@|   dd ¡ |   dd ¡ |   dd ¡ tdd„ |  ¡ D ƒƒS )NÚ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 )úrT   Ú
)r  )rÉ   ÚkÚvr:   r:   r;   rÊ   ¢  s   þÿz@TestProcess.test_environ.<locals>.clean_dict.<locals>.<listcomp>)Úpopr   Údictr”  )r¥  r:   r:   r;   Ú
clean_dict™  s    þÿz,TestProcess.test_environ.<locals>.clean_dict)	ZmaxDiffr3   r4   rG  r?   Úcopyr	   r   r>   )r6   rÊ  rD   Úd1Zd2r:   r:   r;   Útest_environ—  s    zTestProcess.test_environz<macOS 11+ can't get another process environment, issue #2084c                 C   sÊ   t  d¡}|  ¡ }t||d | j|gtjtjd}t |j	¡}t
|j	ƒ | ¡ sVJ ‚|  |j ¡ d¡ tr–tr–z| ¡ }W qž tjy’   Y d S 0 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Ë   rY  Ú3)ÚAÚCr   )ÚtextwrapÚdedentr³   r&   r2   rc   rd   r3   r4   r5   r/   r  r>   r`   r¯   r   r   rG  r\   ÚcommunicateÚ
returncode)r6   rM   r§   r9   rD   Úenvr:   r:   r;   Útest_weird_environ­  s&    
ÿ

zTestProcess.test_weird_environN)lÚ__name__Ú
__module__Ú__qualname__Ú__doc__r<   rE   rN   rP   rS   rá   ÚskipIfr
   r]   rf   r   rn   rs   rw   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	  r  r  r  r  r  r   r!  r$  r)  r   r   r*  r3  r8  r>  r?  rI  rL  rM  r   rW  rZ  r`  r   r   rk  rq  rv  r   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;   r0   L   s  






)*








,

	








6
'



"





.*
$
	
	'
þr0   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                    sX   t ƒ j|i |¤Ž dd„ t| ƒD ƒD ].}t| |ƒ‰ ‡ fdd„}t| |t || ¡ƒ q$d S )Nc                 S   s   g | ]}|  d ¡r|‘qS )ÚtestrÆ   rÈ   r:   r:   r;   rÊ   ð  rË   z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                    s$   z
ˆ ƒ  W n t jy   Y n0 d S r1   )r3   r\   r›  ©Úmethr:   r;   Útest_ó  s    
z+LimitedUserTestCase.__init__.<locals>.test_)r   Ú__init__rÍ   r‘   ÚsetattrÚtypesÚ
MethodType)r6   r7   r8   Úattrrá  ©Ú	__class__rß  r;   râ  ì  s
    
zLimitedUserTestCase.__init__c                    s"   t ƒ  ¡  t d¡ t d¡ d S )Niè  )r   ÚsetUpr?   ÚsetegidÚseteuidr›  rç  r:   r;   ré  ú  s    

zLimitedUserTestCase.setUpc                    s&   t  | j¡ t  | j¡ tƒ  ¡  d S r1   )r?   rê  ÚPROCESS_UIDrë  ÚPROCESS_GIDr   ÚtearDownr›  rç  r:   r;   rî  ÿ  s    zLimitedUserTestCase.tearDownc                 C   s6   zt  ¡  d¡ W n t jy&   Y n0 |  d¡‚d S )Nrt   zexception not raised)r3   r4   r<  r\   ry   r›  r:   r:   r;   r>    s
    zLimitedUserTestCase.test_nicera   zcauses problem as rootc                 C   s   d S r1   r:   r›  r:   r:   r;   r»    s    z'LimitedUserTestCase.test_zombie_process)rØ  rÙ  rÚ  rÛ  r0  r?   r.  rì  r5  rí  râ  ré  rî  r>  rá   rÜ  r»  Ú__classcell__r:   r:   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 r1   r)   )Úclsr:   r:   r;   ÚtearDownClass  s    zTestPopen.tearDownClassc                 C   s°   t ddg}tj|tjtjtdL}| ¡  | ¡  |j |  	t
|ƒ¡ |  tt|d¡ | ¡  W d   ƒ n1 sr0    Y  tr˜|  | d¡tj ¡ n|  | d¡tj¡ d S )Nr^   úimport time; time.sleep(60);©Ústdoutr`   rÖ  r„  rb   )r    r3   ÚPopenrc   rd   r!   ru   r‰   rÎ  Ú
assertTruerÍ   rA   rB   r‘   rO   r
   r>   rG   rH   rI   ©r6   re   Úprocr:   r:   r;   Ú	test_misc  s    

ÿ&zTestPopen.test_miscc                 C   s|   t jtdgtjtjtjtd}| ¡  W d   ƒ n1 s<0    Y  |jjsRJ ‚|j	js^J ‚|j
jsjJ ‚|  |jd¡ d S )Nz-V)rõ  r`   rÎ  rÖ  r   )r3   rö  r    rc   rd   r!   rÔ  rõ  Úclosedr`   rÎ  r>   rÕ  )r6   rù  r:   r:   r;   Útest_ctx_manager/  s    
ý&zTestPopen.test_ctx_managerc                 C   s´   t ddg}tj|tjtjtd€}| ¡  | ¡  |  tj	|j¡ |  tj	|j
¡ |  tj	|jtj¡ tr’|  tj	|jtj¡ |  tj	|jtj¡ W d   ƒ n1 s¦0    Y  d S )Nr^   ró  rô  )r    r3   rö  rc   rd   r!   rO   rG   rA   rZ   rF   rQ   rH   rI   r   ZCTRL_C_EVENTZCTRL_BREAK_EVENTrø  r:   r:   r;   Útest_kill_terminate:  s&    

ÿÿÿÿzTestPopen.test_kill_terminateN)	rØ  rÙ  rÚ  rÛ  Úclassmethodrò  rú  rü  rý  r:   r:   r:   r;   rð    s   
rð  Ú__main__)Úrun_from_name)GrÛ  r  rY   rD  r\  r?   rH   rs  r   rc   r  rÒ  rx   rä  rá   r3   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/   r0   r.  rÝ  rð  rØ  Zpsutil.tests.runnerr   Ú__file__r:   r:   r:   r;   Ú<module>   sš              48
