B
    çÚ†\ôò  ã               @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' ddlm(Z( ddlm)Z) ddlm*Z* ddlm+Z+ ddlm,Z, ddlm-Z- ddlm.Z. dd lm/Z/ dd!lm0Z0 dd"lm1Z1 dd#lm2Z2 dd$lm3Z3 dd%lm4Z4 dd&lm5Z5 dd'lm6Z6 dd(lm7Z7 dd)lm8Z8 dd*lm9Z9 dd+lm:Z: dd,lm;Z; dd-lm<Z< dd.lm=Z= dd/lm>Z> dd0lm?Z? dd1lm@Z@ G d2d3„ d3e>jAƒZBerÞe C¡ dkrÞG d4d5„ d5eBƒZDG d6d7„ d7e>jAƒZEeFd8kre5eGƒ dS )9zTests for psutil.Process class.é    N)ÚAIX)ÚBSD)ÚLINUX)ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚOSX)ÚPOSIX)ÚSUNOS)ÚWINDOWS)Ú	open_text)Úlong)ÚPY3)ÚAPPVEYOR)Ú
call_until)Úcopyload_shared_lib)Ú
create_exe)Úcreate_proc_children_pair)Úcreate_zombie_proc)Úenum)Úget_test_subprocess)Ú
get_winver)ÚHAS_CPU_AFFINITY)ÚHAS_ENVIRON)Ú
HAS_IONICE)ÚHAS_MEMORY_MAPS)ÚHAS_PROC_CPU_NUM)ÚHAS_PROC_IO_COUNTERS)Ú
HAS_RLIMIT)ÚHAS_THREADS)Úmock)ÚPYPY)Ú
PYTHON_EXE)Úreap_children)Úretry_before_failing)Úrun_test_module_by_name)Úsafe_rmpath)Úsh)Úskip_on_access_denied)Úskip_on_not_implemented)ÚTESTFILE_PREFIX)ÚTESTFN)Ú
ThreadTask)ÚTRAVIS)Úunittest)Úwait_for_pid)Ú	WIN_VISTAc               @   s’  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze e d¡dd„ ƒZ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oðeƒ e k d¡d(d)„ ƒƒZ!e e d¡e eoeƒ e k d¡d*d+„ ƒƒZ"e e# d¡d,d-„ ƒZ$e e# d¡d.d/„ ƒZ%e e# d¡d0d1„ ƒZ&e e# d¡d2d3„ ƒZ'e e# d¡d4d5„ ƒZ(d6d7„ Z)e e d8¡d9d:„ ƒZ*e e+ d¡d;d<„ ƒZ,e-ƒ e.e/d%e e+ d¡d=d>„ ƒƒƒZ0d?d@„ Z1dAdB„ Z2e e3 d¡dCdD„ ƒZ4e e3 d¡dEdF„ ƒZ5dGdH„ Z6dIdJ„ Z7dKdL„ Z8dMdN„ Z9dOdP„ Z:e e;dQ¡e e<dR¡dSdT„ ƒƒZ=e e d!¡dUdV„ ƒZ>e e d!¡dWdX„ ƒZ?dYdZ„ Z@d[d\„ ZAd]d^„ ZBd_d`„ ZCdadb„ ZDe eE d¡dcdd„ ƒZFe eE d¡dedf„ ƒZGe eE d¡dgdh„ ƒZHe eIdi¡e eJdj¡dkdl„ ƒƒZKe eIdi¡e eJdj¡dmdn„ ƒƒZLe e d!¡dodp„ ƒZMeed%e eNpzeOdq¡drds„ ƒƒZPdtdu„ ZQdvdw„ ZRdxdy„ ZSdzd{„ ZTd|d}„ ZUd~d„ ZVd€d„ ZWd‚dƒ„ ZXd„d…„ ZYd†d‡„ ZZdˆd‰„ Z[dŠd‹„ Z\dŒd„ Z]dŽd„ Z^dd‘„ Z_d’d“„ Z`e e d!¡d”d•„ ƒZae e d!¡d–d—„ ƒZbe e d!¡d˜d™„ ƒZcdšd›„ Zde ee d¡dœd„ ƒZfe ee d¡e e d!¡dždŸ„ ƒƒZgd S )¡ÚTestProcesszTests for psutil.Process class.c             C   s   t tƒ d S )N)r&   r+   )Úself© r3   ú8lib/python3.7/site-packages/psutil/tests/test_process.pyÚsetUpQ   s    zTestProcess.setUpc             C   s
   t ƒ  d S )N)r#   )r2   r3   r3   r4   ÚtearDownT   s    zTestProcess.tearDownc          	   C   sX   t  ¡ }|  |jt ¡ ¡ tƒ }|  t  |j¡j|j¡ |  t¡ d|_W d Q R X d S )Né!   )	ÚpsutilÚProcessÚassertEqualÚpidÚosÚgetpidr   ÚassertRaisesÚAttributeError)r2   ÚpÚsprocr3   r3   r4   Útest_pidW   s    zTestProcess.test_pidc             C   sN   t ƒ }|j}t |¡}| ¡  | ¡ }|  t |¡¡ trJ|  	|t
j ¡ d S )N)r   r;   r8   r9   ÚkillÚwaitÚassertFalseÚ
pid_existsr	   r:   ÚsignalÚSIGKILL)r2   rA   rB   r@   Úsigr3   r3   r4   Ú	test_kill_   s    
zTestProcess.test_killc             C   sN   t ƒ }|j}t |¡}| ¡  | ¡ }|  t |¡¡ trJ|  	|t
j ¡ d S )N)r   r;   r8   r9   Ú	terminaterD   rE   rF   r	   r:   rG   ÚSIGTERM)r2   rA   rB   r@   rI   r3   r3   r4   Útest_terminatei   s    
zTestProcess.test_terminatec          
   C   sL  t r
tjntj}tƒ }t |j¡}| |¡ | 	¡ }|  
t |j¡¡ t rH|  || ¡ tƒ }t |j¡}| |¡ tjdttjdƒd( |  tj¡ | |¡ W d Q R X W d Q R X tƒ }t |j¡}| |¡ tjdttjdƒd, |  tj¡ t ¡  |¡ W d Q R X W d Q R X dt ¡ krHt d¡}|  t|jtj¡ d S )Nzpsutil.os.killÚ )Úside_effectr   )r	   rG   rH   rL   r   r8   r9   r;   Úsend_signalrD   rE   rF   r:   r    ÚpatchÚOSErrorÚerrnoZESRCHr>   ÚNoSuchProcessZEPERMÚAccessDeniedÚpidsÚ
ValueError)r2   rI   rA   r@   Zexit_sigr3   r3   r4   Útest_send_signals   s2    


"
zTestProcess.test_send_signalc             C   s^  t ƒ }t |j¡}| ¡  | ¡ }tr8|  |tj	 ¡ n|  |tj
¡ |  | ¡ ¡ t ƒ }t |j¡}| ¡  | ¡ }trŒ|  |tj
 ¡ n|  |tj
¡ |  | ¡ ¡ d}t td|gƒ}t |j¡}|  | ¡ d¡ |  | ¡ ¡ t td|gƒ}t |j¡}|  | ¡ d¡ |  | ¡ d¡ t ƒ }t |j¡}| ¡  |  tj|jd¡ |  t|jd¡ d S )Nz0import time, sys; time.sleep(0.01); sys.exit(5);z-cé   )rY   Ng{®Gáz„?éÿÿÿÿ)r   r8   r9   r;   rC   rD   r	   r:   rG   rH   rL   rE   Ú
is_runningrK   r"   ÚassertInÚnamer>   ÚTimeoutExpiredrW   )r2   rA   r@   Úcoder3   r3   r4   Ú	test_wait“   s<    zTestProcess.test_waitc             C   s   t ƒ \}}|  tj|jd¡ |  tj|jd¡ | ¡  | ¡  | ¡ }| ¡ }trp|  |tj	 ¡ |  |d ¡ n|  |tj	¡ |  |tj	¡ d S )Ng{®Gáz„?)
r   r>   r8   r^   rD   rK   r	   r:   rG   rL   )r2   Úp1Úp2Zret1Zret2r3   r3   r4   Útest_wait_non_childrenÂ   s    
z"TestProcess.test_wait_non_childrenc             C   sª   t ƒ }t |j¡}|  tj|jd¡ | ¡  t ¡ d }x:y| d¡}W n$ tjk
rl   t ¡ |krh‚ Y q:X P q:W t	rŠ|  
|tj ¡ n|  
|tj¡ |  | ¡ ¡ d S )Nr   é   )r   r8   r9   r;   r>   r^   rD   rC   Útimer	   r:   rG   rH   rL   rE   r[   )r2   rA   r@   Zstop_atr_   r3   r3   r4   Útest_wait_timeout_0×   s     zTestProcess.test_wait_timeout_0c          	   C   s|   t  ¡ }|jdd |jdd x4tdƒD ](}|jd d}|  |t¡ |  |d¡ q*W |  t¡ |jdd W d Q R X d S )Ngü©ñÒMbP?)Zintervaléd   g        rZ   )	r8   r9   Úcpu_percentÚrangeÚassertIsInstanceÚfloatÚassertGreaterEqualr>   rW   )r2   r@   ÚxZpercentr3   r3   r4   Útest_cpu_percentë   s    zTestProcess.test_cpu_percentc          	   C   s4   t jdd d}t ¡  ¡  |js&t‚W d Q R X d S )Nzpsutil.cpu_count)Zreturn_value)r    rQ   r8   r9   rh   ÚcalledÚAssertionError)r2   Úmr3   r3   r4   Útest_cpu_percent_numcpus_noneö   s    z)TestProcess.test_cpu_percent_numcpus_nonec          	   C   sx   t  ¡  ¡ }|jdks(|jdks(t|ƒ‚|jdks:t|ƒ‚|jdksLt|ƒ‚x&|jD ]}t	 
dt	 t||ƒ¡¡ qTW d S )Ng        z%H:%M:%S)r8   r9   Ú	cpu_timesÚuserÚsystemrp   Úchildren_userÚchildren_systemÚ_fieldsre   ÚstrftimeÚ	localtimeÚgetattr)r2   Útimesr]   r3   r3   r4   Ú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 )Nrd   gš™™™™™¹?zexpected: %s, found: %s)r8   r9   rs   r<   r|   ÚmaxÚminÚfail)r2   Ú	user_timeZkernel_timeÚutimeZktimer3   r3   r4   Ú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   é   )r8   r9   Zcpu_numrl   Ú	cpu_countr:   r\   ri   )r2   r@   Znumr3   r3   r4   Útest_cpu_num  s    zTestProcess.test_cpu_numc             C   sd   t ƒ }t ¡ }t |j¡}| ¡ }t|| ƒ}|dkrJ|  d|||f ¡ t dt 	| ¡ ¡¡ d S )Nrd   z'expected: %s, found: %s, difference: %sz%Y %m %d %H:%M:%S)
r   re   r8   r9   r;   Úcreate_timeÚabsr€   ry   rz   )r2   rA   Znowr@   r‡   Ú
differencer3   r3   r4   Útest_create_time  s    zTestProcess.test_create_timez
POSIX onlyznot reliable on TRAVISc             C   sL   t  ¡  ¡ }tj ¡ s tj ¡ r>tj 	t
dƒ¡}|  ||¡ n
|  |¡ d S )NÚtty)r8   r9   ÚterminalÚsysÚstdinÚisattyÚstdoutr<   ÚpathÚrealpathr'   r:   ÚassertIsNone)r2   rŒ   r‹   r3   r3   r4   Útest_terminal,  s
    zTestProcess.test_terminal)Zonly_ifc          	   C   sª  t  ¡ }| ¡ }ttdƒ}| ¡  W d Q R X | ¡ }ts„ts„|  |j	|j	¡ |  
|j|j¡ tr¤|  |j|j¡ |  
|j|j¡ n |  |j|j¡ |  |j|j¡ | ¡ }tjtd.}trÔ| tdd dƒ¡ n| dd ¡ W d Q R X | ¡ }|  |j|j¡ |  |j|j¡ |  |j	|j	¡ |  |j|j¡ trZ|  |j|j¡ |  |j|j¡ xJtt|ƒƒD ]:}tr€|dkr€qh|  || d¡ |  || d¡ qhW d S )NÚrb)Úprefixrm   i@B Úasciird   r   )r8   r9   Zio_countersÚopenr"   Úreadr   r   ÚassertGreaterZ
read_countr:   Zwrite_countr   Z
read_charsZwrite_charsrl   Z
read_bytesZwrite_bytesÚtempfileZTemporaryFiler*   r   ÚwriteÚbytesri   Úlen)r2   r@   Zio1ÚfZio2Úir3   r3   r4   Útest_io_counters6  s>    zTestProcess.test_io_countersc       	   	   C   sš  t r<ddlm}m}m}m} |  |d¡ |  |d¡ |  |d¡ |  |d¡ t ¡ }zÖ| d¡ | ¡ \}}t	d k	r„|  
|t	j¡ |  |d¡ |  |d¡ | d¡ | ¡ \}}|  |d¡ |  |d¡ | dd¡ | ¡ \}}|  |d¡ |  |d¡ | dd¡ | ¡ \}}|  |d¡ |  |d¡ W d | |¡ X nZt ¡ }| ¡ }|  
|t¡ z0d}||krld}| |¡ |  | ¡ |¡ W d | |¡ X d S )Nr   )ÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEr„   rd   é   é   é   )r   r8   r¢   r£   r¤   r¥   r:   r9   Úionicer   rj   ÚIntEnumÚint)	r2   r¢   r£   r¤   r¥   r@   ZioclassÚvalueZoriginalr3   r3   r4   Útest_ioniceb  sJ    



zTestProcess.test_ionicec             C   sÄ   t ƒ }t |j¡}trž|  t|jdd¡ |  t|jdd¡ |  t|jd¡ |  t|jdd¡ |  	td|jtj
d¡ |  	td|jtjd¡ | j	td	|jdd
 n"|  t|jd¡ |  t|jdd¡ d S )Nrd   é
   rZ   r§   Úfooz*can't specify value with IOPRIO_CLASS_NONEr„   z*can't specify value with IOPRIO_CLASS_IDLEz$'ioclass' argument must be specified)r¬   r¦   )r   r8   r9   r;   r   r>   rW   r©   Ú	TypeErrorZassertRaisesRegexr¢   r¥   )r2   rA   r@   r3   r3   r4   Útest_ionice_errs‘  s$    zTestProcess.test_ionice_errsc             C   sÔ   dd l }t t ¡ ¡}dd„ ttƒD ƒ}|s4t|ƒ‚xš|D ]’}tt|ƒ}|  |d¡ |t|ƒkr’|  	|t||ƒ¡ t
rxq:|  	| |¡| |¡¡ q:| |¡}|  	t|ƒd¡ |  |d d¡ |  |d d¡ q:W d S )Nr   c             S   s   g | ]}|  d ¡r|‘qS )ZRLIMIT)Ú
startswith)Ú.0rm   r3   r3   r4   ú
<listcomp>¬  s    z/TestProcess.test_rlimit_get.<locals>.<listcomp>rd   rZ   r„   )Úresourcer8   r9   r<   r=   Údirrp   r{   rl   r:   r!   ÚrlimitZ	getrlimitrž   )r2   rµ   r@   Únamesr]   r¬   Úretr3   r3   r4   Útest_rlimit_get¨  s     


zTestProcess.test_rlimit_getc          	   C   s„   t ƒ }t |j¡}| tjd¡ |  | tj¡d¡ |  t¡ tj	 d¡ d¡ W d Q R X |  t¡ | tjd¡ W d Q R X d S )N)rY   rY   r   )rY   rY   rY   )
r   r8   r9   r;   r·   ÚRLIMIT_NOFILEr:   r>   rW   Z_psplatform)r2   rA   r@   r3   r3   r4   Útest_rlimit_set¿  s    zTestProcess.test_rlimit_setc             C   sÖ   t  ¡ }| t j¡\}}zŒ| t jd|f¡ ttdƒ}| d¡ W d Q R X |  t¡&}ttdƒ}| d¡ W d Q R X W d Q R X |  	t
r’|jjn|jd tj¡ W d | t j||f¡ |  	| t j¡||f¡ X d S )Ni   Úwbs   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   )r8   r9   r·   ÚRLIMIT_FSIZEr˜   r+   rœ   r>   ÚIOErrorr:   r   Z	exceptionrS   ZEFBIG)r2   r@   ÚsoftÚhardrŸ   Úexcr3   r3   r4   Útest_rlimitÌ  s    zTestProcess.test_rlimitc             C   s”   t  ¡ }| t j¡\}}zJ| t jd|f¡ | t jt j|f¡ ttdƒ}| d¡ W d Q R X W d | t j||f¡ |  | t j¡||f¡ X d S )Ni   r½   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)	r8   r9   r·   r¾   ÚRLIM_INFINITYr˜   r+   rœ   r:   )r2   r@   rÀ   rÁ   rŸ   r3   r3   r4   Útest_rlimit_infinityß  s    z TestProcess.test_rlimit_infinityc             C   s<   t  ¡ }| t j¡\}}|  t j|¡ | t j||f¡ d S )N)r8   r9   r·   r¾   r:   rÄ   )r2   r@   rÀ   rÁ   r3   r3   r4   Útest_rlimit_infinity_valueî  s    z&TestProcess.test_rlimit_infinity_valuec          	   C   sr   t  ¡ }tr<y| ¡ }W qD t jk
r8   t d¡‚Y qDX n| ¡ }tƒ  | ¡ }|  ||d ¡ W d Q R X d S )Nz$on OpenBSD this requires root accessr„   )	r8   r9   r   Únum_threadsrU   r.   ÚSkipTestr,   r:   )r2   r@   Ústep1Ústep2r3   r3   r4   Útest_num_threadsú  s    zTestProcess.test_num_threadszWINDOWS onlyc             C   s   t  ¡ }|  | ¡ d¡ d S )Nr   )r8   r9   rš   Znum_handles)r2   r@   r3   r3   r4   Útest_num_handles  s    zTestProcess.test_num_handlesc          	   C   s¸   t  ¡ }tr<y| ¡ }W qD t jk
r8   t d¡‚Y qDX n| ¡ }tƒ d | ¡ }|  t	|ƒt	|ƒd ¡ |d }|  |j
|d ¡ |  |j|d ¡ |  |j|d ¡ W d Q R X d S )Nz$on OpenBSD this requires root accessr„   r   rd   )r8   r9   r   ÚthreadsrU   r.   rÈ   r,   r:   rž   Úidr   Úsystem_time)r2   r@   rÉ   rÊ   Zathreadr3   r3   r4   Útest_threads  s    zTestProcess.test_threadsc             C   s˜   t ƒ }t |j¡}trDy| ¡  W n  tjk
rB   t d¡‚Y nX | j	| 
¡ jtdd„ | ¡ D ƒƒdd | j	| 
¡ jtdd„ | ¡ D ƒƒdd d S )Nz$on OpenBSD this requires root accessc             S   s   g | ]
}|j ‘qS r3   )r   )r³   rm   r3   r3   r4   r´   3  s    z.TestProcess.test_threads_2.<locals>.<listcomp>gš™™™™™¹?)Zdeltac             S   s   g | ]
}|j ‘qS r3   )rÏ   )r³   rm   r3   r3   r4   r´   6  s    )r   r8   r9   r;   r   rÍ   rU   r.   rÈ   ZassertAlmostEqualrs   rt   Úsumru   )r2   rA   r@   r3   r3   r4   Ú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¡ | ¡ }	x |	jD ]}
|  t|	|
ƒd¡ qÄW d S )Nrd   r   i`ã )r8   r9   Zmemory_infoÚmemory_percentrš   rl   r   r:   ZrssZwsetÚvmsZpagefilerx   r{   )r2   r@   Zrss1Zvms1Zpercent1ZmemarrZrss2Zvms2Zpercent2Úmemr]   r3   r3   r4   Útest_memory_info8  s&    
zTestProcess.test_memory_infoc             C   sª   t  ¡ j}t  ¡  ¡ }xT|jD ]J}t||ƒ}| j|d||fd |dkrLtst	rRq| j
|||||fd qW t	sxtsxtr†|  |jd¡ t	r¦|  |jd¡ |  |jd¡ d S )Nr   )ÚmsgrÔ   )r8   Zvirtual_memoryÚtotalr9   Zmemory_full_inforx   r{   rl   r   r   ZassertLessEqualr   r   ÚussZpssZswap)r2   rØ   rÕ   r]   r¬   r3   r3   r4   Útest_memory_full_infoV  s    

z!TestProcess.test_memory_full_infoc       
      C   s”  t  ¡ }| ¡ }dd„ |D ƒ}|  t|ƒtt|ƒƒ¡ |jdd}xÔ|D ]Ì}|j d¡sHtj 	|j¡spt
|jƒ‚trêy*tj |j¡sœtj |j¡sœt
|jƒ‚W nH t
k
ræ   ts¶‚ n,tdƒ}| ¡ }W d Q R X d|j |krâ‚ Y nX qHdtj |j¡krHtj |j¡sHt
|jƒ‚qHW xv|D ]n}xf|jD ]\}t||ƒ}	|d	krHq*n<|d
krb|	s„t
|	ƒ‚n"|  |	ttf¡ |	dks*t
|	ƒ‚q*W qW d S )Nc             S   s   g | ]}|‘qS r3   r3   )r³   rm   r3   r3   r4   r´   i  s    z0TestProcess.test_memory_maps.<locals>.<listcomp>F)Zgroupedú[z/proc/self/smapsz%s (deleted)Z64r‘   )ZaddrZpermsr   )r8   r9   Úmemory_mapsr:   rž   Úsetr‘   r²   r<   Úisabsrp   r	   ÚexistsÚislinkr   r   r™   Úbasenamerx   r{   rj   r«   r   )
r2   r@   ÚmapsÚpathsZext_mapsÚntrŸ   ÚdataÚfnamer¬   r3   r3   r4   Útest_memory_mapse  s<    






zTestProcess.test_memory_mapsc          	      sH   t ƒ 8}dd„ ‰ ‡ fdd„t ¡  ¡ D ƒ}|  ˆ |ƒ|¡ W d Q R X d S )Nc             S   s   t j t j | ¡¡S )N)r<   r‘   r’   Únormcase)r@   r3   r3   r4   Únormpath’  s    z8TestProcess.test_memory_maps_lists_lib.<locals>.normpathc                s   g | ]}ˆ |j ƒ‘qS r3   )r‘   )r³   rm   )ré   r3   r4   r´   ”  s   z:TestProcess.test_memory_maps_lists_lib.<locals>.<listcomp>)r   r8   r9   rÜ   r\   )r2   r‘   Zlibpathsr3   )ré   r4   Ú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Ù   )r8   r9   rÓ   r>   rW   r   r   r   )r2   r@   r3   r3   r4   Útest_memory_percent˜  s
    zTestProcess.test_memory_percentc             C   sV   t ƒ }t |j¡}| ¡ st‚| ¡ s*t‚| ¡  | ¡  | ¡ rFt‚| ¡ rRt‚d S )N)r   r8   r9   r;   r[   rp   rC   rD   )r2   rA   r@   r3   r3   r4   Útest_is_runningŸ  s    zTestProcess.test_is_runningc             C   sÚ   t ƒ }t |j¡ ¡ }y|  |t¡ W n” tk
rº   trht	|ƒt	tƒkrht
jj}|  ||ƒ|tƒ¡ nNdtjd tjd f }y |  | |d¡t |d¡¡ W n tk
r´   Y nX Y nX t|ddgƒ}|  |d¡ d S )Nz%s.%sr   r„   rN   z-czimport os; print('hey')Zhey)r   r8   r9   r;   Úexer:   r"   rp   r   rž   r<   r‘   rè   r   Úversion_infoÚreplacer'   )r2   rA   rí   rè   ZverÚoutr3   r3   r4   Útest_exe©  s     zTestProcess.test_exec             C   s€   t ddg}t|ƒ}y(|  d t |j¡ ¡ ¡d |¡¡ W n@ tk
rz   t	sVt
sVtrt|  t |j¡ ¡ d t ¡ n‚ Y nX d S )Nz-czimport time; time.sleep(60)ú r   )r"   r   r:   Újoinr8   r9   r;   Úcmdlinerp   r   r   r   )r2   rô   rA   r3   r3   r4   Útest_cmdlineÅ  s    
zTestProcess.test_cmdlinec             C   sP   t tƒ}t |j¡ ¡  ¡ }tj 	tj 
tj¡¡ ¡ }| |¡sLt||fƒ‚d S )N)r   r"   r8   r9   r;   r]   Úlowerr<   r‘   rá   r’   r   Ú
executabler²   rp   )r2   rA   r]   Zpyexer3   r3   r4   Ú	test_name×  s    zTestProcess.test_namezbroken on SUNOSzbroken on AIXc                s¦   ‡ fdd„}t d ‰ tˆ ƒ |  |¡ ˆ ddddddg}t|ƒ}t |j¡}trZt|jƒ |  	| 
¡ |¡ |  	| ¡ tj ˆ ¡¡ |  	tj | ¡ ¡tj ˆ ¡¡ d S )	Nc                  s&   yt ˆ ƒ W n tk
r    Y nX d S )N)r&   rR   r3   )Ú
funky_pathr3   r4   Úrmå  s    z.TestProcess.test_prog_w_funky_name.<locals>.rmz	foo bar )z-cz9import time; [time.sleep(0.01) for x in range(3000)];arg1Zarg2rN   Zarg3)r+   r   Ú
addCleanupr   r8   r9   r;   r-   r/   r:   rô   r]   r<   r‘   rá   rè   rí   )r2   rú   rô   rA   r@   r3   )rù   r4   Ú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)	r8   r9   Úuidsr:   r<   ÚgetuidÚgeteuidÚhasattrrý   )r2   r@   ÚrealÚ	effectiveÚsavedr3   r3   r4   Ú	test_uidsþ  s    
zTestProcess.test_uidsc             C   sX   t  ¡ }| ¡ \}}}|  |t ¡ ¡ |  |t ¡ ¡ ttdƒrT|  t ¡ | ¡ ¡ d S )Nrý   )	r8   r9   Úgidsr:   r<   ÚgetgidÚgetegidr  Ú	getresgid)r2   r@   r  r  r  r3   r3   r4   Ú	test_gids  s    
zTestProcess.test_gidsc             C   s  t  ¡ }|  t|jd¡ trªz|| ¡ }tjdkr@|  |t	j
¡ n|  |t¡ |  |t j¡ | t j¡ |  | ¡ t j¡ | t j¡ |  | ¡ t j¡ W d | t j¡ X nâ| ¡ }z®yttdƒrÞ|  t tjt ¡ ¡| ¡ ¡ | d¡ |  | ¡ d¡ ttdƒr"|  t tjt ¡ ¡| ¡ ¡ tsB| d¡ |  | ¡ d¡ W n t jk
r\   Y nX W d y| |¡ W n t jk
rˆ   Y nX X d S )NÚstr)r¦   r§   Úgetpriorityr„   r   )r8   r9   r>   r°   Únicer   r   rî   rj   r   rª   r«   r:   ÚNORMAL_PRIORITY_CLASSZHIGH_PRIORITY_CLASSr  r<   r  ÚPRIO_PROCESSr=   r   rU   )r2   r@   ZinitZ
first_nicer3   r3   r4   Ú	test_nice  sB    




zTestProcess.test_nicec             C   s   t  ¡ }|  | ¡ t j¡ d S )N)r8   r9   r:   ÚstatusZSTATUS_RUNNING)r2   r@   r3   r3   r4   Útest_statusC  s    zTestProcess.test_statusc             C   sn   t ƒ }t |j¡}| ¡ }trZ| d¡\}}|  |t 	¡ ¡ dt
jkrj|  |t
jd ¡ n|  |t 	¡ ¡ d S )Nú\Z
USERDOMAIN)r   r8   r9   r;   Úusernamer   Úsplitr:   ÚgetpassZgetuserr<   Úenviron)r2   rA   r@   r  Zdomainr3   r3   r4   Útest_usernameG  s    
zTestProcess.test_usernamec             C   s*   t ƒ }t |j¡}|  | ¡ t ¡ ¡ d S )N)r   r8   r9   r;   r:   Úcwdr<   Úgetcwd)r2   rA   r@   r3   r3   r4   Útest_cwdS  s    zTestProcess.test_cwdc             C   s.   t ddg}t|ƒ}t |j¡}t|jdƒ d S )Nz-cz/import os, time; os.chdir('..'); time.sleep(60)z#ret == os.path.dirname(os.getcwd()))r"   r   r8   r9   r;   r   r  )r2   ÚcmdrA   r@   r3   r3   r4   Ú
test_cwd_2X  s
    zTestProcess.test_cwd_2c             C   s˜  t  ¡ }| ¡ }|st|ƒ‚|  |j|¡ ttdƒrL|  |tt 	|j
¡ƒ¡ |  t|ƒtt|ƒƒ¡ tttt jddƒƒƒ}xzts†|n|D ]j}| |g¡ |  | ¡ |g¡ ttdƒrÒ|  | ¡ tt 	|j
¡ƒ¡ t|dƒrŠ|  | ¡ d | ¡ ¡ qŠW | g ¡ tr |  | ¡ |j ¡ ¡ n|  | ¡ |¡ ttdƒrX|  | ¡ tt 	|j
¡ƒ¡ |  t|jd¡ | |¡ ts”| t|ƒ¡ | t|ƒ¡ d S )NÚsched_getaffinityT)ÚpercpuÚnum_cpur   r„   )r8   r9   Úcpu_affinityrp   rû   r  r<   r:   Úlistr  r;   rž   rÝ   ri   rh   r-   r   r   Ú_procZ_get_eligible_cpusr>   r°   Útuple)r2   r@   ÚinitialZall_cpusÚnr3   r3   r4   Útest_cpu_affinity_  s8    






zTestProcess.test_cpu_affinityc             C   sz   t ƒ }t |j¡}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 )	NT)r  r®   i'  iø*  r   Ú1rZ   )r   r8   r9   r;   rž   rs   r>   rW   r!  ri   r°   )r2   rA   r@   Zinvalid_cpur3   r3   r4   Útest_cpu_affinity_errsŠ  s    z"TestProcess.test_cpu_affinity_errsc             C   sž   t  ¡ }| ¡ }|st|ƒ‚|  |j|¡ g }xBtdt|ƒd ƒD ],}x&t ||¡D ]}|rT| 	t
|ƒ¡ qTW qBW x&|D ]}| |¡ |  | ¡ |¡ qxW d S )Nr   r„   )r8   r9   r!  rp   rû   ri   rž   Ú	itertoolsÚcombinationsÚappendr"  r:   )r2   r@   r%  ZcombosÚlZsubsetZcombor3   r3   r4   Ú"test_cpu_affinity_all_combinations”  s    

z.TestProcess.test_cpu_affinity_all_combinationszbroken on BSDzunreliable on APPVEYORc       	   	   C   sN  t  ¡ }| ¡ }|  t|k¡ ttdƒj}| d¡ | ¡  t|jdt	|ƒ ƒ}x<|D ]"}|j
tkrVtrv|  |jd¡ P qVW |  dt|ƒ ¡ W d Q R X x"|D ]}tj
 |j
¡sžt|ƒ‚qžW dt }ttd|gƒ}t  |j¡}xDtdƒD ],}d	d
„ | ¡ D ƒ}t|kr
P t d¡ qèW |  t|¡ x$|D ]}tj
 |¡s*t|ƒ‚q*W d S )Nr½   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzlen(ret) != %ii   zno file found; files=%sz2import time; f = open(r'%s', 'r'); time.sleep(60);z-crg   c             S   s   g | ]
}|j ‘qS r3   )r‘   )r³   rm   r3   r3   r4   r´   Ä  s    z/TestProcess.test_open_files.<locals>.<listcomp>g{®Gáz„?)r8   r9   Ú
open_filesrE   r+   r˜   rœ   Úflushr   rž   r‘   r   r:   Zpositionr€   Úreprr<   Úisfilerp   r   r"   r;   ri   re   Úsleepr\   )	r2   r@   ÚfilesrŸ   Úfilerô   rA   rm   Ú	filenamesr3   r3   r4   Útest_open_files§  s4    





zTestProcess.test_open_filesc          	   C   sÞ   t tdƒÊ}t ¡ }xB| ¡ D ] }|j|jks<|j| ¡ krP qW |  	dt
| ¡ ƒ ¡ |  |j|j¡ tr||  |jd¡ n|  |j| ¡ ¡ | ¡ d }|  |d |j¡ |  |d |j¡ |  |j| ¡ ¡ W d Q R X d S )NÚwzno file found; files=%srZ   r   r„   )r˜   r+   r8   r9   r/  r‘   r]   ÚfdÚfilenor€   r1  r:   r   ÚassertNotIn)r2   Zfileobjr@   r5  Zntupler3   r3   r4   Útest_open_files_2Î  s    zTestProcess.test_open_files_2c             C   s†   t  ¡ }| ¡ }ttdƒ}|  |j¡ |  | ¡ |d ¡ t ¡ }|  |j¡ |  | ¡ |d ¡ | ¡  | ¡  |  | ¡ |¡ d S )Nr8  r„   rd   )	r8   r9   Znum_fdsr˜   r+   rû   Úcloser:   Úsocket)r2   r@   Ústartr5  Zsockr3   r3   r4   Útest_num_fdsæ  s    
zTestProcess.test_num_fdsz not reliable on OPENBSD & NETBSDc             C   sL   t  ¡ }t| ¡ ƒ}x(tdƒD ]}t| ¡ ƒ}||krd S qW |  d¡ d S )Ni ¡ z7num ctx switches still the same after 50.000 iterations)r8   r9   rÑ   Znum_ctx_switchesri   r€   )r2   r@   Zbeforerm   Zafterr3   r3   r4   Útest_num_ctx_switchesô  s    z!TestProcess.test_num_ctx_switchesc             C   s–   t tdƒr"|  t ¡  ¡ t ¡ ¡ t ¡ }tƒ }t |j	¡}|  | ¡ |¡ t
dd tr^d S x2t ¡ D ]&}|j	|j	krzqh| j| ¡ ||d qhW d S )NÚgetppidT)Ú	recursive)r×   )r  r<   r:   r8   r9   ÚppidrB  r=   r   r;   r#   r   Úprocess_iterÚassertNotEqual)r2   Úthis_parentrA   r@   r3   r3   r4   Ú	test_ppidÿ  s    

zTestProcess.test_ppidc             C   sP   t  ¡ }tƒ }t |j¡}|  | ¡ j|¡ t ¡ d }|  	t |¡ ¡ ¡ d S )Nr   )
r<   r=   r   r8   r9   r;   r:   ÚparentrV   r“   )r2   rG  rA   r@   Ú
lowest_pidr3   r3   r4   Útest_parent  s    zTestProcess.test_parentc             C   s2   t ƒ \}}|  | ¡ |¡ |  | ¡ t ¡ ¡ d S )N)r   r:   rI  r8   r9   )r2   ra   rb   r3   r3   r4   Útest_parent_multi  s    
zTestProcess.test_parent_multic          	   C   sF   t ƒ }t |j¡}tjdt dd¡d |  | ¡ ¡ W d Q R X d S )Nzpsutil.Processr   r¯   )rO   )	r   r8   r9   r;   r    rQ   rT   r“   rI  )r2   rA   r@   r3   r3   r4   Útest_parent_disappeared!  s
    z#TestProcess.test_parent_disappearedc             C   sž   t  ¡  ¡ st‚tƒ \}}|  | ¡ d t  ¡ ¡ |  | ¡ d |¡ |  | ¡ d t  ¡ ¡ tršt  ¡ d }|  | ¡ d j|¡ |  | ¡ d j|¡ d S )Nr   r„   rZ   )	r8   r9   Úparentsrp   r   r:   r	   rV   r;   )r2   ra   rb   rJ  r3   r3   r4   Útest_parents)  s    
zTestProcess.test_parentsc             C   s¦   t dd t ¡ }|  | ¡ g ¡ |  |jddg ¡ tdd}| ¡ }|jdd}xL||fD ]@}|  t|ƒd¡ |  |d j|j¡ |  |d  ¡ t	 
¡ ¡ q^W d S )NT)rC  r   )Zcreationflagsr„   )r#   r8   r9   r:   Úchildrenr   rž   r;   rD  r<   r=   )r2   r@   rA   Z	children1Z	children2rP  r3   r3   r4   Útest_children4  s    

zTestProcess.test_childrenc             C   sd   t ƒ \}}t ¡ }|  | ¡ |g¡ |  |jdd||g¡ | ¡  | ¡  |  |jddg ¡ d S )NT)rC  )r   r8   r9   r:   rP  rK   rD   )r2   ra   rb   r@   r3   r3   r4   Útest_children_recursiveD  s    
z#TestProcess.test_children_recursivec          	   C   s¶   t  t¡}x@t ¡ D ]4}y|| ¡   d7  < W q tjk
rF   Y qX qW t| ¡ dd„ dd d }t 	|¡}y|j
dd}W n tjk
r˜   Y nX |  t|ƒtt|ƒƒ¡ d S )	Nr„   c             S   s   | d S )Nr„   r3   )rm   r3   r3   r4   Ú<lambda>Z  s    z6TestProcess.test_children_duplicates.<locals>.<lambda>)ÚkeyrZ   r   T)rC  )ÚcollectionsÚdefaultdictr«   r8   rE  rD  ÚErrorÚsortedÚitemsr9   rP  rU   r:   rž   rÝ   )r2   Útabler@   r;   Úcr3   r3   r4   Útest_children_duplicatesQ  s    


z$TestProcess.test_children_duplicatesc             C   sz   t ƒ \}}t ¡ }|jdd}|  t|ƒd¡ |  |d |¡ |  |d |¡ | ¡ }|  |d |¡ |  |d |¡ d S )NT)rC  rd   r   r„   )r   r8   r9   rP  r:   rž   rN  )r2   ra   rb   ÚmerP  rN  r3   r3   r4   Útest_parents_and_childrenc  s    
z%TestProcess.test_parents_and_childrenc             C   sd   t ƒ }t |j¡}| ¡  x*tdƒD ]}| ¡ tjkr8P t 	d¡ q$W | 
¡  |  | ¡ tj¡ d S )Nrg   g{®Gáz„?)r   r8   r9   r;   Úsuspendri   r  ZSTATUS_STOPPEDre   r3  ÚresumerF  )r2   rA   r@   rm   r3   r3   r4   Útest_suspend_resumep  s    zTestProcess.test_suspend_resumec             C   s$   |   ttjd¡ |   ttjd¡ d S )Nr(  rZ   )r>   r°   r8   r9   rW   )r2   r3   r3   r4   Ú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 Q R X t
jddt  |jd¡d	 | jt j|jd
gd W d Q R X t
jddt  |jd¡d	" |  |jd
gddd
di¡ W d Q R X t
jddtd	F | ¡ }|  d
t	| ¡ ƒ¡ |  t¡ |jd
gd W d Q R X W d Q R X |  t¡ | d¡ W d Q R X |  t¡ | dg¡ W d Q R X |  t¡ | ddg¡ W d Q R X d S )Nrí   r]   )ÚattrsZconnectionsr¯   )rc  Zad_valuezpsutil.Process.niceT)ZcreaterO   r  r„   Zbar)r8   r9   Úas_dictr:   rX  Úkeysr   rV   Ú
isinstancer"  r    rQ   rU   rT   r;   r>   ÚZombieProcessÚNotImplementedErrorr;  r°   rW   )r2   r@   Údr3   r3   r4   Útest_as_dict  s>    ""
"zTestProcess.test_as_dictc          
   C   sˆ   t  d¡@}t ¡ }| ¡  | ¡  | ¡  W d Q R X |  |jd¡ W d Q R X t  d¡}| ¡  | ¡  W d Q R X |  |jd¡ d S )Nz$psutil._psplatform.Process.cpu_timesr„   rd   )r    rQ   r8   r9   Úoneshotrs   r:   Ú
call_count)r2   rq   r@   r3   r3   r4   Útest_oneshot­  s    
zTestProcess.test_oneshotc             C   sÐ   t  d¡ˆ}t  d¡r}t ¡ }| ¡ : | ¡  | ¡  | ¡  | ¡  | ¡  W d Q R X W d Q R X |  |jd¡ |  |jd¡ W d Q R X W d Q R X t  d¡}| ¡  | ¡  W d Q R X |  |jd¡ d S )Nz$psutil._psplatform.Process.cpu_timesz(psutil._psplatform.Process.oneshot_enterr„   rd   )r    rQ   r8   r9   rk  rs   r:   rl  )r2   Zm1Zm2r@   rq   r3   r3   r4   Útest_oneshot_twiceº  s    

"zTestProcess.test_oneshot_twicec          	   C   s’   t ƒ \}}| ¡ }| ¡ }|  ||¡ | ¡ & |  | ¡ |¡ |  | ¡ |¡ W d Q R X | ¡ & |  | ¡ |¡ |  | ¡ |¡ W d Q R X d S )N)r   rD  rF  rk  r:   )r2   ra   rb   Zp1_ppidZp2_ppidr3   r3   r4   Útest_oneshot_cacheÎ  s    


zTestProcess.test_oneshot_cachec          	   C   s  t ƒ }t |j¡}| ¡  | ¡  tr8ttjd|j ƒ | 	¡ rDt
‚tr|  tj¡ | tj¡ W d Q R X |  tj¡ | tj¡ W d Q R X ddddddg}tr²ts²| d¡ xZt|ƒD ]L}| d	¡s¾||krØq¾y¦t||ƒ}|d
krtrü|dƒ}n
|tjƒ}nt|dkr"|ƒ }|dƒ}nZ|dkrD|tjƒ}|tjdƒ}n8|dkr`|ƒ }|dgƒ}n|dkrv|tjƒ}n|ƒ }W nz tjk
r¤   |  d| ¡ Y q¾ tjk
rº   Y q¾ tjk
rä   trÞ|dkrÞn‚ Y q¾ tk
rø   Y q¾X |  d||f ¡ q¾W d S )Nz%s not in retr;   r[   rD   r‡   rk  Zmemory_info_exr·   Ú_r  r„   r©   rd   )rY   rY   r!  r   rP   z/ZombieProcess for %r was not supposed to happen)rÍ   rÇ   z4NoSuchProcess exception not raised for %r, retval=%s) r   r8   r9   r;   rK   rD   r   r   rV   r[   rp   r>   rT   rP   rG   ÚCTRL_C_EVENTÚCTRL_BREAK_EVENTr   r   r,  r¶   r²   r{   r	   r  r»   rL   rg  r€   rU   r   rh  )r2   rA   r@   Zexcluded_namesr]   Úmethr¹   r3   r3   r4   Útest_halfway_terminated_processÝ  sh    











z+TestProcess.test_halfway_terminated_processc          
   C   sÞ  dd„ }t ƒ }| jtdd t |¡}|  | ¡ tj¡ |  | 	¡ ¡ | 
¡  ||jƒ}|d k	rl|  |g ¡ t|dƒr”||jtjƒ ||jtjdƒ ||jƒ t|dƒröy||jdgƒ W n: tk
rô } ztrâtrâd	t|ƒkrân‚ W d d }~X Y nX ||jdƒ t|d
ƒr0tr$||jddƒ n||jdƒ t|dƒrL||jtjdƒ ||jƒ ||jƒ ||jƒ ||jƒ |  t |¡¡ tsÚtrÚ|  |t ¡ ¡ |  |dd„ t ¡ D ƒ¡ i t_|  |dd„ t ¡ D ƒ¡ d S )Nc          	   _   s,   y
| ||ŽS  t jt jfk
r&   Y nX d S )N)r8   rg  rU   )ZfunÚargsÚkwargsr3   r3   r4   Úsucceed_or_zombie_p_exc#  s    
z@TestProcess.test_zombie_process.<locals>.succeed_or_zombie_p_excT)rC  r·   )rY   rY   r!  r   znot eligibler©   rd   c             S   s   g | ]
}|j ‘qS r3   )r;   )r³   rm   r3   r3   r4   r´   f  s    z3TestProcess.test_zombie_process.<locals>.<listcomp>c             S   s   g | ]
}|j ‘qS r3   )r;   )r³   rm   r3   r3   r4   r´   h  s    ) r   rû   r#   r8   r9   r:   r  ÚSTATUS_ZOMBIEÚ
assertTruer[   rd  r_  r  r·   r»   rI  r!  rW   r-   r   r  r  r©   r`  rK   rC   rF   r   r\   rV   rE  Z_pmap)r2   rw  ZzpidZzprocr¹   Úerrr3   r3   r4   Útest_zombie_process!  sP    










zTestProcess.test_zombie_processc          	   C   sB   t  ¡ }tjdt  d¡d}| ¡ s*t‚|js4t‚W d Q R X d S )Nzpsutil.Processr   )rO   )r8   r9   r    rQ   rg  r[   rp   ro   )r2   r@   rq   r3   r3   r4   Ú$test_zombie_process_is_running_w_excj  s
    z0TestProcess.test_zombie_process_is_running_w_excc          	   C   sH   t  ¡ }tjdt  d¡d"}|  | ¡ t j¡ |js:t	‚W d Q R X d S )Nz!psutil._psplatform.Process.statusr   )rO   )
r8   r9   r    rQ   rg  r:   r  rx  ro   rp   )r2   r@   rq   r3   r3   r4   Ú test_zombie_process_status_w_exct  s
    z,TestProcess.test_zombie_process_status_w_excc          	   C   s:  dt  ¡ kr"|  t jt jd¡ d S t  d¡}x¤t jD ]š}|dkrBq4t||ƒ}y
|ƒ }W n t jk
rl   Y q4X |dkr†|  |j	d¡ q4|dkrºt
r¤|  | ¡ d¡ qÎtrÎ|  | ¡ d¡ q4|dkr4|s4t|ƒ‚q4W t|dƒry| t j¡ W n t jk
r   Y nX | ¡  ts6|  dt  ¡ ¡ |  t  d¡¡ d S )	Nr   r;   )rþ   r  r  ÚrootzNT AUTHORITY\SYSTEMr]   r·   )r8   rV   r>   rT   r9   Z_as_dict_attrnamesr{   rU   r:   r  r	   r  r   rp   r  r·   r¾   rd  r   r\   ry  rF   )r2   r@   r]   rs  r¹   r3   r3   r4   Ú
test_pid_0~  s<    


zTestProcess.test_pid_0c             C   s@   dd„ }d | _ t ¡ }|| ¡ ƒ}|tj ¡ ƒ}|  ||¡ d S )Nc             S   sb   |   dd ¡ |   dd ¡ |   dd ¡ trL|   dd ¡ |   dd ¡ |   dd ¡ tdd„ |  ¡ D ƒƒS )	NZPSUTIL_TESTINGZ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 )úrN   Ú
)rï   )r³   ÚkÚvr3   r3   r4   r´   ±  s   z@TestProcess.test_environ.<locals>.clean_dict.<locals>.<listcomp>)Úpopr   ÚdictrY  )ri  r3   r3   r4   Ú
clean_dict§  s    z,TestProcess.test_environ.<locals>.clean_dict)ZmaxDiffr8   r9   r  r<   Úcopyr:   )r2   r‡  r@   Zd1Zd2r3   r3   r4   Útest_environ¥  s    zTestProcess.test_environc             C   s    t  d¡}t}t||d |  t|¡ t|gtjtjd}t	 
|j¡}t|jƒ |  | ¡ ¡ |  |j ¡ d¡ |  | ¡ 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)rŽ   Ústderró    r(  Ú3)ÚAÚCr   )ÚtextwrapÚdedentr+   r   rû   r&   r   Ú
subprocessÚPIPEr8   r9   r;   r/   ry  r[   r:   rŠ  r™   r  ÚcommunicateÚ
returncode)r2   r_   r‘   rA   r@   r3   r3   r4   Útest_weird_environ»  s    

zTestProcess.test_weird_environN)hÚ__name__Ú
__module__Ú__qualname__Ú__doc__r5   r6   rB   rJ   rM   rX   r`   rc   rf   rn   rr   r}   rƒ   r.   ZskipIfr   r†   rŠ   r	   r-   r”   r   r)   r   r¡   r   r   r   r0   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   r7  r<  r@  r   r   rA  rH  rK  rL  rM  rO  rQ  rR  r\  r^  ra  rb  rj  rm  rn  ro  rt  r{  r|  r}  r  r   r‰  r•  r3   r3   r3   r4   r1   N   s¬   

 /			+ .")


)+

%

	.DI

'r1   c               @   sR   e Zd ZdZeedƒr&e ¡ Ze ¡ Z	dd„ Z
dd„ Zdd„ Zd	d
„ Zdd„ Zd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                s\   t j| f|ž|Ž xDdd„ t| ƒD ƒD ].}t| |ƒ‰ ‡ fdd„}t| |t || ¡ƒ q&W d S )Nc             S   s   g | ]}|  d ¡r|‘qS )Ztest)r²   )r³   rm   r3   r3   r4   r´   ð  s    z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                s&   y
ˆ ƒ  W n t jk
r    Y nX d S )N)r8   rU   )r2   )rs  r3   r4   Útest_ó  s    
z+LimitedUserTestCase.__init__.<locals>.test_)r1   Ú__init__r¶   r{   ÚsetattrÚtypesÚ
MethodType)r2   ru  rv  Úattrr›  r3   )rs  r4   rœ  ì  s
    
zLimitedUserTestCase.__init__c             C   s*   t tƒ t | ¡ t d¡ t d¡ d S )Niè  )r&   r+   r1   r5   r<   ÚsetegidÚseteuid)r2   r3   r3   r4   r5   ú  s    

zLimitedUserTestCase.setUpc             C   s&   t  | j¡ t  | j¡ t | ¡ d S )N)r<   r¡  ÚPROCESS_UIDr¢  ÚPROCESS_GIDr1   r6   )r2   r3   r3   r4   r6      s    zLimitedUserTestCase.tearDownc             C   s8   yt  ¡  d¡ W n t jk
r(   Y nX |  d¡ d S )NrZ   zexception not raised)r8   r9   r  rU   r€   )r2   r3   r3   r4   r    s
    zLimitedUserTestCase.test_nicec             C   s   d S )Nr3   )r2   r3   r3   r4   r{    s    z'LimitedUserTestCase.test_zombie_processN)r–  r—  r˜  r™  r  r<   rÿ   r£  r  r¤  rœ  r5   r6   r  r{  r3   r3   r3   r4   rš  â  s   
rš  c               @   s0   e Zd ZdZ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 )N)r#   )r2   r3   r3   r4   r6     s    zTestPopen.tearDownc          	   C   sj   t ddg}tj|tjtjdB}| ¡  | ¡  |j |  t	|ƒ¡ |  
tt|d¡ | ¡  W d Q R X d S )Nz-czimport time; time.sleep(60);)r   rŠ  r¯   )r"   r8   ÚPopenr‘  r’  r]   rs   rŽ   ry  r¶   r>   r?   r{   rK   )r2   r  Úprocr3   r3   r4   Ú	test_misc  s    

zTestPopen.test_miscc          	   C   sf   t jtdgtjtjtjd}| ¡  W d Q R X |jjs<t‚|j	jsHt‚|j
jsTt‚|  |jd¡ d S )Nz-V)r   rŠ  rŽ   r   )r8   r¦  r"   r‘  r’  r“  r   Úclosedrp   rŠ  rŽ   r:   r”  )r2   r§  r3   r3   r4   Útest_ctx_manager+  s    
zTestPopen.test_ctx_managerc          	   C   s¨   t ddg}tj|tjtjd€}| ¡  | ¡  |  tj|j¡ |  tj|j	¡ |  tj|j
tj¡ trštjdkrš|  tj|j
tj¡ |  tj|j
tj¡ W d Q R X d S )Nz-czimport time; time.sleep(60);)r   rŠ  )rd   r¨   )r"   r8   r¦  r‘  r’  rK   rD   r>   rT   rC   rP   rG   rL   r   r   rî   rq  rr  )r2   r  r§  r3   r3   r4   Útest_kill_terminate6  s    

zTestPopen.test_kill_terminateN)r–  r—  r˜  r™  r6   r¨  rª  r«  r3   r3   r3   r4   r¥    s
   r¥  Ú__main__)Hr™  rU  rS   r  r*  r<   rG   r>  r‘  r   r›   r  re   rž  r8   r   r   r   r   r   r   r   r	   r
   r   Zpsutil._commonr   Zpsutil._compatr   r   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   ZTestCaser1   rÿ   rš  r¥  r–  Ú__file__r3   r3   r3   r4   Ú<module>   sœ              53
