o
    aÝdf_ð  ã                   @   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> dd/l!m?Z? G d0d1„ d1e2ƒZ@erfe A¡ dkrfG d2d3„ d3e@ƒZBG d4d5„ d5e2ƒZCeDd6krdd7lEmFZF eFeGƒ dS dS )8ú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_c_exe)Úcreate_py_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†„ ZUe-ƒ d‡dˆ„ ƒZVd‰dŠ„ ZWd‹dŒ„ ZXddŽ„ ZYdd„ ZZd‘d’„ Z[d“d”„ Z\d•d–„ Z]d—d˜„ Z^d™dš„ Z_d›dœ„ Z`ddž„ Zae	 
e d'¡dŸd „ ƒZbe	 
e d'¡d¡d¢„ ƒZce	 
e d'¡d£d¤„ ƒZdd¥d¦„ Zed§d¨„ Zfe	 
eg d"¡d©dª„ ƒZhe	 
eg d"¡e	 
e d'¡e	 
eid«¡d¬d­„ ƒƒƒZjd®S )¯ÚTestProcessr   c                 O   s>   | j |i |¤Ž}zt |j¡W S  tjy   |  |j¡ ‚ w ©N)Úspawn_testprocÚpsutilÚProcessÚpidÚNoSuchProcessZassertPidGone)ÚselfÚargsÚkwargsÚsproc© r<   úb/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/psutil/tests/test_process.pyÚspawn_psprocP   s   þzTestProcess.spawn_psprocc                 C   sP   t  ¡ }|  |jt ¡ ¡ |  t¡ d|_W d   ƒ d S 1 s!w   Y  d S )Né!   )r4   r5   ÚassertEqualr6   ÚosÚgetpidÚassertRaisesÚAttributeError©r8   Úpr<   r<   r=   Útest_pidZ   s
   "ÿzTestProcess.test_pidc                 C   sJ   |   ¡ }| ¡  | ¡ }tr|  |tj¡ n|  |tj ¡ |  |¡ d S r2   )	r>   ÚkillÚwaitr   r@   ÚsignalÚSIGTERMÚSIGKILLÚassertProcessGone©r8   rF   Úcoder<   r<   r=   Ú	test_kill`   ó   zTestProcess.test_killc                 C   sJ   |   ¡ }| ¡  | ¡ }tr|  |tj¡ n|  |tj ¡ |  |¡ d S r2   )r>   Ú	terminaterI   r   r@   rJ   rK   rM   rN   r<   r<   r=   Útest_terminatej   rQ   zTestProcess.test_terminatec                 C   sX   t rtjntj}|  ¡ }| |¡ | ¡ }tr|  ||¡ n|  || ¡ |  	|¡ d S r2   )
r
   rJ   rL   rK   r>   Úsend_signalrI   r   r@   rM   )r8   ÚsigrF   rO   r<   r<   r=   Útest_send_signalt   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)rJ   rK   r>   r(   ÚpatchÚOSErrorÚerrnoZESRCHrC   r4   r7   rT   ÚEPERMÚAccessDenied)r8   rU   rF   r<   r<   r=   Útest_send_signal_mocked   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>   rI   r@   rM   Ú
subprocessÚPIPE)r8   ÚcmdrF   rO   r<   r<   r=   Útest_wait_exitedŽ   s(   









zTestProcess.test_wait_exitedzfails on NETBSDc                 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
   rT   rJ   ÚSIGSTOPrC   r4   ÚTimeoutExpiredrI   ÚSIGCONTrK   r@   ÚsuspendÚresumerR   rE   r<   r<   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_pairrC   r4   rl   rI   rR   r
   r@   rJ   rK   )r8   Ú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 )Nrq   r   éÿÿÿÿ)r>   ÚnamerC   r4   rl   rI   Ú
ValueErrorrE   r<   r<   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   rj   )r>   rC   r4   rl   rI   rH   Útimer   Úfailr
   r@   rJ   rL   rK   rM   )r8   rF   Zstop_atrO   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   ƒ d S 1 s@w   Y  d S )Nri   )Úintervaléd   ç        rv   )	r4   r5   Úcpu_percentÚrangeÚassertIsInstanceÚfloatÚassertGreaterEqualrC   rx   )r8   rF   Ú_Úpercentr<   r<   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(   rZ   r4   r5   r€   Úcalled)r8   Ú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s&J |ƒ‚tr1|jdks1J |ƒ‚|j	D ]}t
 dt
 t||ƒ¡¡ q4d S )Nr   z%H:%M:%S)r4   r5   Ú	cpu_timesÚuserÚsystemÚchildren_userÚchildren_systemr   ZiowaitÚ_fieldsrz   ÚstrftimeÚ	localtimeÚgetattr)r8   Útimesrw   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r-|  d||f ¡‚t||gƒt||gƒ dkrD|  d||f ¡‚d S )Né   çš™™™™™¹?zexpected: %s, found: %s)r4   r5   rŒ   rA   r•   ÚmaxÚminr{   )r8   Ú	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r|  |d¡ |  | ¡ tt  ¡ ƒ¡ d S ©Nr   rc   )r4   r5   Zcpu_numr„   Ú	cpu_countr@   ÚassertInr   )r8   rF   Ú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>   rz   Úcreate_timeÚabsr{   r’   r“   )r8   rF   Únowr£   Ú
differencer<   r<   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)r4   r5   ÚterminalrA   ÚpathÚrealpathr-   r@   )r8   r©   r¨   r<   r<   r=   Útest_terminal2  s
   þzTestProcess.test_terminal)Z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ÚwbÚxi@B Úasciir—   r   )r4   r5   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)r8   rF   Zio1ÚfZio2Úir<   r<   r=   Útest_io_counters9  sH   
ÿ€€üûzTestProcess.test_io_countersz
linux onlyc                    sB  ‡ fdd„}t  ¡ ‰ ts|  ˆ  ¡ d t j¡ |  t jd¡ |  t jd¡ |  t jd¡ |  t jd¡ ˆ  ¡ }|  	||¡ ˆ  t j¡ |  t
ˆ  ¡ ƒt jdf¡ |  t¡ ˆ jt jdd W d   ƒ n1 shw   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
¡ ˆ  t jd¡ W d   ƒ n1 sßw   Y  |  td
¡ ˆ  t jd¡ W d   ƒ n1 süw   Y  |  td¡ ˆ jdd W d   ƒ d S 1 sw   Y  d S )Nc                    s&   | \}}|t jkrd}ˆ  ||¡ d S ©Nr   )r4   ÚIOPRIO_CLASS_NONEÚionice)ÚinitZioclassÚvalue©rF   r<   r=   Úcleanupg  s   
z.TestProcess.test_ionice_linux.<locals>.cleanupr   rc   r—   é   é   ©rÁ   é   zioclass accepts no valuez$'ioclass' argument must be specified)r4   r5   r   r@   r¿   r¾   ZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLEÚ
addCleanupÚtuplerC   rx   r^   ÚassertRaisesRegex)r8   rÃ   rÀ   r<   rÂ   r=   Útest_ionice_linuxd  sL   ÿÿÿÿÿÿ$ýzTestProcess.test_ionice_linuxz!not supported on this win versionc                 C   s&  t  ¡ }ts|  | ¡ t j¡ | ¡ }|  |j|¡ | t j¡ |  | ¡ t j¡ | t j¡ |  | ¡ t j¡ z| t j	¡ W n
 t j
yJ   Y n
w |  | ¡ t j	¡ |  td¡ |jt jdd W d   ƒ n1 smw   Y  |  td¡ | t j	d ¡ W d   ƒ d S 1 sŒw   Y  d S )Nz&value argument not accepted on Windowsrc   rÆ   zis not a valid priority)r4   r5   r   r@   r¿   ZIOPRIO_NORMALrÈ   ZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_HIGHr^   rÊ   Ú	TypeErrorrx   )r8   rF   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 ƒ}|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 )ZRLIMIT©Ú
startswith©Ú.0r¯   r<   r<   r=   Ú
<listcomp>²  ó    z/TestProcess.test_rlimit_get.<locals>.<listcomp>r—   rv   rc   )Úresourcer4   r5   rA   rB   Údirr”   r„   r@   r   ÚrlimitZ	getrlimitr¹   )r8   rÕ   rF   Únamesrw   rÁ   Úretr<   r<   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)rd   rd   zcan't use prlimitr   )rd   rd   rd   )r>   r×   r4   ZRLIMIT_NOFILEr@   r   rÊ   rx   Z_psplatformr5   rC   rE   r<   r<   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   )r4   r5   r¶   r×   ÚRLIMIT_FSIZEr±   r·   rC   ÚIOErrorr@   r   Ú	exceptionr\   ZEFBIG)r8   rF   ÚtestfnÚsoftÚhardrº   Úexcr<   r<   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)	r4   r5   r×   rÝ   ÚRLIM_INFINITYr±   r¶   r·   r@   )r8   rF   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 r2   )r4   r5   r×   rÝ   r@   rå   )r8   rF   rá   râ   r<   r<   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 accessrc   )	r4   r5   r   Únum_threadsr^   ÚunittestÚSkipTestr#   r@   )r8   rF   Ústep1Ústep2r<   r<   r=   Útest_num_threads  s   
ÿ"þzTestProcess.test_num_threadszWINDOWS onlyc                 C   s   t  ¡ }|  | ¡ d¡ d S r½   )r4   r5   r³   Znum_handlesrE   r<   r<   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è   rc   r   r—   )r4   r5   r   Úthreadsr^   rê   rë   r#   r@   r¹   Úidr›   Úsystem_time)r8   rF   rì   rí   Zathreadr<   r<   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 r<   )r›   rÑ   r<   r<   r=   rÓ   9  ó    z.TestProcess.test_threads_2.<locals>.<listcomp>r˜   )Údeltac                 S   rô   r<   )rò   rÑ   r<   r<   r=   rÓ   >  rõ   )r>   r   rð   r4   r^   rê   rë   ZassertAlmostEqualrŒ   r   ÚsumrŽ   rE   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rZ| ¡ }	|  |	j|	j	¡ |  |	j
|	j¡ | ¡ }	|	jD ]}
|  t|	|
ƒd¡ qad S )Nr—   r   i`ã )r4   r5   Zmemory_infoÚmemory_percentr³   r„   r   r@   ZrssZwsetÚvmsZpagefiler‘   r”   )r8   rF   Zrss1Zvms1Zpercent1ZmemarrZrss2Zvms2Zpercent2Úmemrw   r<   r<   r=   Útest_memory_infoB  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ú   )r4   r5   Zvirtual_memoryÚtotalZmemory_full_infor‘   r”   r„   r	   r   ZassertLessEqualr   r   ÚussZpssZswap)r8   rF   rþ   rû   rw   rÁ   r<   r<   r=   Útest_memory_full_infoa  s   


þz!TestProcess.test_memory_full_infoc           
      C   sš  t  ¡ }| ¡ }|  t|ƒtt|ƒƒ¡ |jdd}|D ]~}|j d¡sštj 	|j¡s0J |jƒ‚t
rtztj |j¡sFtj |j¡sFJ |jƒ‚W q tys   tsQ‚ tdƒ}| ¡ }W d   ƒ n1 sdw   Y  d|j |vrq‚ 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¢qd S )
NF)Úgroupedú[z/proc/self/smapsz%s (deleted)Z64rª   )ÚaddrZpermsr   )r4   r5   Úmemory_mapsr@   r¹   Úsetrª   rÐ   rA   Úisabsr
   ÚexistsÚislinkÚAssertionErrorr   r   r²   ÚbasenameÚstatr   ÚS_ISREGÚst_moder‘   r”   r‚   Úintr   )
r8   rF   ÚmapsZext_mapsÚntrº   ÚdataÚstÚfnamerÁ   r<   r<   r=   Útest_memory_mapsq  sX   ÿþ€

ÿÿùÿ€

øÿ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 r2   )rA   rª   r«   ÚnormcaserÂ   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>)r4   r5   r%   r  r    )r8   rF   rª   Zlibpathsr<   r  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?!?)Zmemtyperÿ   )r4   r5   rù   rC   rx   r   r   r   rE   r<   r<   r=   Útest_memory_percent«  s   ÿzTestProcess.test_memory_percentc                 C   sL   |   ¡ }| ¡ s
J ‚| ¡ sJ ‚| ¡  | ¡  | ¡ rJ ‚| ¡ r$J ‚d S r2   )r>   Ú
is_runningrH   rI   rE   r<   r<   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   rc   rW   r`   zimport os; print('hey')Zhey)r>   Úexer@   r    r	  r   r¹   rA   rª   r  ÚsysÚversion_infoÚreplacer-   )r8   rF   r  r  ÚverÚoutr<   r<   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   ú rc   )
r    r>   r   r   r   r@   Úcmdliner   r   Újoin)r8   r$  rF   Úpyexer<   r<   r=   Útest_cmdlineØ  s   

$ÿ zTestProcess.test_cmdlinezbroken on PYPYc                 C   sx   t g}| dgd ¡ | ddg¡ |  |¡}tr2z|  | ¡ |¡ W d S  tjy1   |  d¡‚w |  | ¡ |¡ d S )Nz-vé2   r`   úimport time; time.sleep(10)z#OPENBSD: process turned into zombie)	r    Úextendr>   r   r@   r$  r4   ÚZombieProcessÚskipTest)r8   r$  rF   r<   r<   r=   Útest_long_cmdlineì  s   

ÿzTestProcess.test_long_cmdlinec                 C   sH   |   ¡ }| ¡  ¡ }tj tj tj¡¡ ¡ }| 	|¡s"J ||fƒ‚d S r2   )
r>   rw   ÚlowerrA   rª   r
  r«   r  Ú
executablerÐ   )r8   rF   rw   r&  r<   r<   r=   Ú	test_nameü  s   zTestProcess.test_namezunreliable on PYPYc                 C   s¤   t | jddƒ}|ddg}|  |¡}trDz|  | ¡ tj |¡¡ W d S  t	yC   | 
¡ tjkr?tj |¡ | ¡ ¡s>J ‚n‚ Y d S w |  | ¡ tj |¡¡ d S )NZ01234567890123456789©Úsuffixr`   r)  )r'   r¶   r>   r   r@   rw   rA   rª   r
  r	  Ústatusr4   ÚSTATUS_ZOMBIErÐ   ©r8   r&  r$  rF   r<   r<   r=   Útest_long_name  s   

þþzTestProcess.test_long_namezbroken on SUNOSzbroken on AIXc                 C   sp   t | jddƒ}|ddg}|  |¡}|  | ¡ |¡ |  | ¡ tj |¡¡ |  tj 	| 
¡ ¡tj 	|¡¡ d S )Nz	foo bar )r1  r`   r)  )r'   r¶   r>   r@   r$  rw   rA   rª   r
  r  r  r5  r<   r<   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)	r4   r5   Úuidsr@   rA   ÚgetuidÚgeteuidÚhasattrr:  ©r8   rF   ÚrealZ	effectiveÚsavedr<   r<   r=   Ú	test_uids(  ó   
ÿzTestProcess.test_uidsc                 C   r8  r9  )	r4   r5   Úgidsr@   rA   ÚgetgidÚgetegidr>  Ú	getresgidr?  r<   r<   r=   Ú	test_gids6  rC  zTestProcess.test_gidsc              
      s¬  ‡ fdd„}t  ¡ ‰ |  tˆ jd¡ ˆ  ¡ }|  ||¡ tr€d }t jt jt j	t j
t jt jfD ]O}| j|d? zˆ  |¡ W n
 t jyH   Y n&w ˆ  ¡ }|t j
t jt jfv rh||ks_|d u rg|}|  ||¡ n|  ||¡ W d   ƒ n1 sxw   Y  q.d S zJttdƒr•|  t tjt ¡ ¡ˆ  ¡ ¡ ˆ  d¡ |  ˆ  ¡ d¡ ttdƒr¶|  t tjt ¡ ¡ˆ  ¡ ¡ tsÈˆ  d¡ |  ˆ  ¡ d¡ W d S W d S  t jyÕ   Y d S w )Nc                    s(   zˆ   | ¡ W d S  tjy   Y d S w r2   )Únicer4   r^   )rÀ   rÂ   r<   r=   rÃ   E  s
   ÿz&TestProcess.test_nice.<locals>.cleanupÚstr)ÚprioÚgetpriorityrc   r   )r4   r5   rC   rÌ   rI  rÈ   r   ZIDLE_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZNORMAL_PRIORITY_CLASSZABOVE_NORMAL_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZREALTIME_PRIORITY_CLASSÚsubTestr^   r@   r>  rA   rL  ÚPRIO_PROCESSrB   r   )r8   rÃ   rÀ   Zhighest_priorK  Znew_prior<   rÂ   r=   Ú	test_niceD  sj   úÿý€€ì€ø
ÿ

ÿ
þÿzTestProcess.test_nicec                 C   s   t  ¡ }|  | ¡ t j¡ d S r2   )r4   r5   r@   r3  ZSTATUS_RUNNINGrE   r<   r<   r=   Útest_statusƒ  s   zTestProcess.test_statusc                 C   s‚   |   ¡ }| ¡ }tr7| d¡\}}t ¡ }| d¡rt d¡‚|  	||¡ dt
jv r5|  	|t
jd ¡ d S d S |  	|t ¡ ¡ d S )Nú\ú$zrunning as service accountZ
USERDOMAIN)r>   Úusernamer   ÚsplitÚgetpassÚgetuserÚendswithrê   rë   r@   rA   Úenviron)r8   rF   rS  ÚdomainZgetpass_userr<   r<   r=   Útest_username‡  s   


ÿzTestProcess.test_usernamec                 C   s    |   ¡ }|  | ¡ t ¡ ¡ d S r2   )r>   r@   ÚcwdrA   ÚgetcwdrE   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$   r[  )r8   rg   rF   r<   r<   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©ZpercpuÚnum_cpur   rc   )r4   r5   Úcpu_affinityrÈ   r>  rA   r@   Úlistr_  r6   r¹   r  r   r€   ra  r   Ú_procZ_get_eligible_cpusrC   rÌ   rÉ   )r8   rF   Ú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 )	NTr`  é
   i'  iø*  r   Ú1rv   )	r>   r¹   r4   rŒ   rC   rx   rb  r   rÌ   )r8   rF   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r!|d d… }g }tt|ƒd ƒD ]}t ||¡D ]}|r>| t	|ƒ¡ q3q+|D ]}| |¡ |  
t| ¡ ƒt|ƒ¡ qBd S )Né   rc   )r4   r5   rb  rÈ   r¹   r   Ú	itertoolsÚcombinationsÚappendrc  r@   Úsorted)r8   rF   re  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   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 r<   ©rA   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   rq  r<   rr  rÑ   r<   r<   r=   rÓ     rÔ   rq   )r4   r5   r¶   Ú
open_filesÚassertNotInr±   r·   Úflushr$   r¹   r    rA   rª   r  r   r@   ÚpositionÚisfiler>   r    r   rz   Úsleep)	r8   rF   rà   Úfilesrº   Ú	filenamesÚfiler$  r¯   r<   r<   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=%srv   r   rc   )r4   r5   rA   rª   r  r¶   r±   rs  rw   ÚfdÚfilenor{   Úreprr@   r   rt  )r8   rF   r  rà   Úfileobjr{  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 )Nr}  rc   r—   )	r4   r5   r¶   Znum_fdsr±   rÈ   Úcloser@   Úsocket)r8   rF   rà   Ústartr{  Úsockr<   r<   r=   Útest_num_fds1  s   
zTestProcess.test_num_fdsz not reliable on OPENBSD & NETBSDc                 C   sP   t  ¡ }t| ¡ ƒ}tdƒD ]}t d¡ t| ¡ ƒ}||kr" d S q|  d¡‚)Nr—   gš™™™™™©?z2num ctx switches still the same after 2 iterations)r4   r5   r÷   Znum_ctx_switchesr   rz   rx  r{   )r8   rF   Úbeforer…   Úafterr<   r<   r=   Útest_num_ctx_switches@  s   
ÿ
z!TestProcess.test_num_ctx_switchesc                 C   sF   t  ¡ }ttdƒr|  | ¡ t ¡ ¡ |  ¡ }|  | ¡ t ¡ ¡ d S )NÚgetppid)	r4   r5   r>  rA   r@   Úppidr‹  r>   rB   rE   r<   r<   r=   Ú	test_ppidL  s
   
zTestProcess.test_ppidc                 C   sB   |   ¡ }|  | ¡ jt ¡ ¡ t ¡ d }|  t 	|¡ ¡ ¡ d S r½   )
r>   r@   Úparentr6   rA   rB   r4   ÚpidsZassertIsNoner5   )r8   rF   Z
lowest_pidr<   r<   r=   Útest_parentS  s   zTestProcess.test_parentc                 C   s8   t  ¡ }|  ¡ \}}|  | ¡ |¡ |  | ¡ |¡ d S r2   )r4   r5   rr   r@   rŽ  ©r8   rŽ  rs   rt   r<   r<   r=   Útest_parent_multiZ  s   zTestProcess.test_parent_multic                 C   s`   t  ¡ }| ¡ s
J ‚|  ¡ \}}|  | ¡ d |¡ |  | ¡ d |¡ |  | ¡ d |¡ d S rž   )r4   r5   Úparentsrr   r@   r‘  r<   r<   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   )Úcreationflagsrc   )r4   r5   r@   Úchildrenr>   r¹   r6   rŒ  )r8   rŽ  rs   Z	children1Z	children2r˜  r<   r<   r=   Útest_childreni  s   ýzTestProcess.test_childrenc                 C   sf   t  ¡ }|  ¡ \}}|  | ¡ |g¡ |  |jdd||g¡ | ¡  | ¡  |  |jddg ¡ d S )NTr•  )r4   r5   rr   r@   r˜  rR   rI   r‘  r<   r<   r=   Útest_children_recursivex  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 )
Nrc   c                 S   s   | d S )Nrc   r<   )r¯   r<   r<   r=   Ú<lambda>Ž  s    z6TestProcess.test_children_duplicates.<locals>.<lambda>)Úkeyrv   r   zPID 0Tr•  )ÚcollectionsÚdefaultdictr  r4   Zprocess_iterrŒ  ÚErrorro  Úitemsr   r,  r5   r˜  r^   r@   r¹   r  )r8   ÚtablerF   r6   Úcr<   r<   r=   Útest_children_duplicates…  s"   
ÿ

ÿz$TestProcess.test_children_duplicatesc                 C   s|   t  ¡ }|  ¡ \}}|jdd}|  t|ƒd¡ |  |d |¡ |  |d |¡ | ¡ }|  |d |¡ |  |d |¡ d S )NTr•  r—   r   rc   )r4   r5   rr   r˜  r@   r¹   r“  )r8   rŽ  rs   rt   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 nt d¡ q| ¡  |  	| ¡ tj¡ d S )Nr~   rq   )
r>   rn   r   r3  r4   ZSTATUS_STOPPEDrz   rx  ro   ÚassertNotEqual)r8   rF   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 )Nri  rv   )rC   rÌ   r4   r5   rx   ©r8   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	ƒ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 )Nr  rw   )ÚattrsÚconnectionsÚfoo)r©  Zad_valuezpsutil.Process.niceT)ÚcreaterY   rI  rc   Úbar)r4   r5   Úas_dictr@   ro  Úkeysrš   r  Ú
isinstancerc  r(   rZ   r^   r7   r6   rC   r+  ÚNotImplementedErrorrt  rÌ   rx   )r8   rF   Údr<   r<   r=   Útest_as_dict´  sb   ÿÿýýûýÿûÿÿ€ú
ÿÿ$ÿ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_timesrc   r—   ©r4   r5   r(   rZ   ÚoneshotrŒ   r@   Z
call_count©r8   rF   rŠ   r<   r<   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_enterrc   r—   rµ  )r8   rF   Úm1Úm2rŠ   r<   r<   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 r2   )rr   rŒ  r¥  r¶  r@   )r8   Úp1Úp2Zp1_ppidZp2_ppidr<   r<   r=   Útest_oneshot_cache  s   
þ
"þzTestProcess.test_oneshot_cachec                    sp   ‡ fdd„}ˆ   ¡ }| ¡  | ¡  trttjd|j ƒ ˆ  |¡ t	|ƒ}| 
|j¡D ]	\}}|||ƒ q,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é   )r  rw   z+%r didn't raise NSP and returned %r instead)r4   r+  r7   r^   r   r   r{   )ÚfunZfun_namerÙ   r§  r<   r=   Úassert_raises_nsp#  s    
ý
ÿzFTestProcess.test_halfway_terminated_process.<locals>.assert_raises_nspz%s not in ret)r>   rR   rI   r   r$   r4   r  r6   rM   r)   ÚiterÚall)r8   rÀ  rF   Únsr¿  rw   r<   r§  r=   Útest_halfway_terminated_process  s   
ÿz+TestProcess.test_halfway_terminated_processc                 C   s   |   ¡ \}}|  |¡ d S r2   )Zspawn_zombieZassertProcessZombie)r8   rŽ  Úzombier<   r<   r=   Útest_zombie_processA  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 )Nzpsutil.Processr   rX   )r4   r5   r(   rZ   r+  r  r‰   r·  r<   r<   r=   Ú$test_zombie_process_is_running_w_excF  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   rX   )	r4   r5   r(   rZ   r+  r@   r3  r4  r‰   r·  r<   r<   r=   Ú test_zombie_process_status_w_excQ  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	|j
 ddD ]"\}}| j|d |  tj||¡ W d   ƒ n1 sRw   Y  q5|  tj||j¡ |  tj||j¡ |  tj||j¡ |  tj||j¡ d S )Nr~   z4process no longer exists and its PID has been reusedF)Úclear_cache)rw   )r3   r4   r5   r6   r£   Ú_identr  r)   rÁ  ÚsettersZkillersrM  rÊ   r7   rŒ  rŽ  r“  r˜  )r8   ZsubprF   rý   rÃ  r¿  rw   r<   r<   r=   Útest_reused_pid]  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rdnd}|  | ¡ |¡ qh|dkr¥|s¥J |ƒ‚qhts·|  dt  ¡ ¡ t  d¡s¹J ‚d S d S )Nr   rc   )r;  rD  rS  zNT AUTHORITY\SYSTEMÚrootrw   )r4   r  rC   r7   r5   Z
pid_existsr@   rŒ  r   r^   rx   rI   rR   rn   ro   rH   rT   rJ   rK   r)   rÁ  ZgettersrË  r@  rS  r   r    )r8   rF   rã   rÃ  r¿  rw   rÙ   r   r<   r<   r=   Ú
test_pid_0n  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 )NZPLATÚHOMEZ__CF_USER_TEXT_ENCODINGZVERSIONER_PYTHON_PREFER_32_BITZVERSIONER_PYTHON_VERSIONc                 S   s8   g | ]\}}|  d d¡  dd¡|  d d¡  dd¡f‘qS )úrW   Ú
)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maxDiffr4   r5   rX  rA   Úcopyr	   r   r@   )r8   rÖ  rF   Z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	ƒ | ¡ s)J ‚|  |j ¡ d¡ trHtrHz| ¡ }W n tjyG   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);
            }
            )Zc_code)Ústdinrb   ó    ri  Ú3)ÚAÚCr   )ÚtextwrapÚdedentr&   r¶   r3   re   rf   r4   r5   r6   r0   r  r@   rb   r²   r   r   rX  r^   ÚcommunicateÚ
returncode)r8   rO   Zcexer;   rF   Úenvr<   r<   r=   Útest_weird_environ®  s&   
ÿ
ýzTestProcess.test_weird_environN)kÚ__name__Ú
__module__Ú__qualname__Ú__doc__r>   rG   rP   rS   rV   rê   ÚskipIfr
   r_   rh   r   rp   ru   ry   r|   r‡   r‹   r–   r   r   r¢   r§   r¬   r   r/   r   r¼   r   rË   r   rÍ   r   rÚ   rÛ   rä   ræ   rç   rî   rï   r   ró   r,   r.   r   rø   rü   r   r   r  r  r  r  r"  r'  r   r-  r0  r6  r   r   r7  rB  rH  rO  rP  rZ  r]  r^  r   rg  rj  rp  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=   r1   M   s   







)+








-
	








?	
)




"




7&



'
þr1   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   rÎ   )ÚtestrÏ   rÑ   r<   r<   r=   rÓ   ò  rÔ   z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                    s$   zˆ ƒ  W d S  t jy   Y d S w r2   )r4   r^   r§  ©Úmethr<   r=   Útest_õ  s
   ÿz+LimitedUserTestCase.__init__.<locals>.test_)r   Ú__init__rÖ   r”   ÚsetattrÚtypesÚ
MethodType)r8   r9   r:   Úattrrí  ©Ú	__class__rë  r=   rî  î  s   
÷zLimitedUserTestCase.__init__c                    s"   t ƒ  ¡  t d¡ t d¡ d S )Niè  )r   ÚsetUprA   ÚsetegidÚseteuidr§  ró  r<   r=   rõ  ý  s   

zLimitedUserTestCase.setUpc                    s&   t  | j¡ t  | j¡ tƒ  ¡  d S r2   )rA   rö  ÚPROCESS_UIDr÷  ÚPROCESS_GIDr   ÚtearDownr§  ró  r<   r=   rú    s   zLimitedUserTestCase.tearDownc                 C   s4   z	t  ¡  d¡ W n t jy   Y d S w |  d¡‚)Nrv   zexception not raised)r4   r5   rI  r^   r{   r§  r<   r<   r=   rO    s   ÿ
zLimitedUserTestCase.test_nicerc   zcauses problem as rootc                 C   s   d S r2   r<   r§  r<   r<   r=   rÆ    s   z'LimitedUserTestCase.test_zombie_process)rä  rå  ræ  rç  r>  rA   r<  rø  rE  rù  rî  rõ  rú  rO  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 r2   r*   )Úclsr<   r<   r=   ÚtearDownClass  s   
zTestPopen.tearDownClassc                 C   s²   t ddg}tj|tjtjtd&}| ¡  | ¡  |j |  	t
|ƒ¡ |  tt|d¡ | ¡  W d   ƒ n1 s9w   Y  trM|  | d¡tj ¡ d S |  | d¡tj¡ d S )Nr`   úimport time; time.sleep(60);©Ústdoutrb   râ  r«  rd   )r    r4   ÚPopenre   rf   r!   rw   rŒ   rÙ  Ú
assertTruerÖ   rC   rD   r”   rR   r
   r@   rI   rJ   rK   ©r8   rg   Ú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w   Y  |jjs)J ‚|j	js/J ‚|j
js5J ‚|  |jd¡ d S )Nz-V)r  rb   rÙ  râ  r   )r4   r  r    re   rf   r!   rà  r  Úclosedrb   rÙ  r@   rá  )r8   r  r<   r<   r=   Útest_ctx_manager6  s   û
ùzTestPopen.test_ctx_managerc                 C   sÆ   t ddg}tj|tjtjtdI}| ¡  | ¡  |  tj	|j¡ |  tj	|j
¡ |  tj	|jtj¡ trQ|  tj	|jtj¡ |  tj	|jtj¡ W d   ƒ d S W d   ƒ d S 1 s\w   Y  d S )Nr`   rÿ  r   )r    r4   r  re   rf   r!   rR   rI   rC   r7   rH   rT   rJ   rK   r   ZCTRL_C_EVENTZCTRL_BREAK_EVENTr  r<   r<   r=   Útest_kill_terminateD  s6   
üÿÿýï"ózTestPopen.test_kill_terminateN)	rä  rå  ræ  rç  Úclassmethodrþ  r  r  r	  r<   r<   r<   r=   rü    s    
rü  Ú__main__)Úrun_from_name)Hrç  r  r\   rU  rl  rA   rJ   r„  r  re   r  rÞ  rz   rð  rê   r4   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   r1   r<  ré  rü  rä  Zpsutil.tests.runnerr  Ú__file__r<   r<   r<   r=   Ú<module>   s               6
Hý