U
    ;gn                     @   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? dd0l"m@Z@ dd1l"mAZA dd2l"mBZB G d3d4 d4e4ZCereD dkrG d5d6 d6eCZEG d7d8 d8e4ZFdS )9Tests for psutil.Process class.    N)AIX)BSD)LINUX)MACOS)NETBSD)OPENBSD)OSX)POSIX)SUNOS)WINDOWS)	open_text)PY3)FileNotFoundError)long)redirect_stderr)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)	QEMU_USER)PsutilTestCase)
ThreadTask)
call_until)copyload_shared_lib)create_c_exe)create_py_exe)mock)process_namespace)pytest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	j
je dddd Zdd Ze	j
jedddd Zdd Zdd Zdd Zdd Zdd Ze	j
jeddd d! Ze	j
jeddd"d# Ze	j
je d$dd%d& Zd'd( Ze	j
je d)dd*d+ Ze	j
je d$deed,d-d. Z e	j
je! d$de	j
je d/dd0d1 Z"e	j
je! d$de	j
je# d2dd3d4 Z$e	j
je% d$dd5d6 Z&e	j
je% d$dd7d8 Z'e	j
je% d$dd9d: Z(e	j
je% d$dd;d< Z)e	j
je% d$dd=d> Z*d?d@ Z+e	j
je# dAddBdC Z,e	j
je- d$ddDdE Z.e/ e0e1d,e	j
je- d$ddFdG Z2e/ dHdI Z3dJdK Z4e	j
je5 d$ddLdM Z6e	j
je5 d$ddNdO Z7dPdQ Z8dRdS Z9e	j
jedddTdU Z:dVdW Z;e	j
je<dXddYdZ Z=d[d\ Z>e	j
je<ped]de	j
jed^dd_d` Z?e	j
je@dade	j
jeAdbde	j
je<dXde	j
jedcdddde ZBe	j
je d)ddfdg ZCe	j
je d)ddhdi ZDdjdk ZEe	j
jedddldm ZFdndo ZGdpdq ZHdrds ZIe	j
jeJ d$ddtdu ZKe	j
jeJ d$ddvdw ZLe	j
jeJ d$ddxdy ZMe	j
jeNdzde	j
jeOd{dd|d} ZPe	j
jeNdzde	j
jeOd{dd~d ZQe	j
je d)ddd ZReed,e	j
jeSpedddd ZTdd ZUdd ZVdd ZWe	j
jedde/ dd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zce	j
je d)ddd Zde	j
je d)ddd Zee	j
je d)ddd Zfdd Zgdd Zhe	j
jei d$ddd Zje	j
jei d$de	j
je d)de	j
jekdde	j
jedddd ZldS )TestProcessr   c                 O   sD   | j ||}zt|jW S  tjk
r>   | |j  Y nX d S N)spawn_testprocpsutilProcesspidNoSuchProcessZassertPidGone)selfargskwargssproc r?   =/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_process.pyspawn_psprocS   s    zTestProcess.spawn_psprocc              	   C   s:   t  }|jt ksttt d|_W 5 Q R X d S )N!   )	r7   r8   r9   osgetpidAssertionErrorr,   raisesAttributeErrorr;   pr?   r?   r@   test_pid]   s    zTestProcess.test_pidc                 C   sJ   |   }|  | }tr,|tjks<tn|tj ks<t| | d S r5   )	rA   killwaitr   signalSIGTERMrE   SIGKILLassertProcessGoner;   rI   coder?   r?   r@   	test_killc   s    zTestProcess.test_killc                 C   sJ   |   }|  | }tr,|tjks<tn|tj ks<t| | d S r5   )rA   	terminaterL   r   rM   rN   rE   rP   rQ   r?   r?   r@   test_terminatem   s    zTestProcess.test_terminatec                 C   sX   t r
tjntj}|  }|| | }tr<||ksJtn|| ksJt| 	| d S r5   )
r
   rM   rO   rN   rA   send_signalrL   r   rE   rP   )r;   sigrI   rR   r?   r?   r@   test_send_signalw   s    
zTestProcess.test_send_signalz	not POSIXreasonc              
   C   s   t j}|  }tjdttjdd( t	t
j || W 5 Q R X W 5 Q R X |  }tjdttjdd( t	t
j || W 5 Q R X W 5 Q R X d S )Nzpsutil.os.kill side_effect)rM   rN   rA   r*   patchOSErrorerrnoZESRCHr,   rF   r7   r:   rV   EPERMAccessDenied)r;   rW   rI   r?   r?   r@   test_send_signal_mocked   s     
 
z#TestProcess.test_send_signal_mockedc                 C   s   t ddg}| |}| }|dks(t| | t ddg}| j|tjd}| }|dks`t| | t ddg}| |}| }|dkst| | t dd	g}| |}| }|dkst| | d S )
N-cpassr   z1 / 0)stderr   zimport sys; sys.exit(5);   zimport os; os._exit(5);)r!   rA   rL   rE   rP   
subprocessPIPE)r;   cmdrI   rR   r?   r?   r@   test_wait_exited   s(    









zTestProcess.test_wait_exitedzfails on NETBSDc              	   C   s.  |   }tr|tj ttj |j	dd W 5 Q R X |tj
 ttj |j	dd W 5 Q R X |tj |	 tj kst|	 tj kstn|  ttj |j	dd W 5 Q R X |  ttj |j	dd W 5 Q R X |  |	 tjkst|	 tjks*td S )NMbP?)timeout)rA   r
   rV   rM   SIGSTOPr,   rF   r7   TimeoutExpiredrL   SIGCONTrN   rE   suspendresumerT   rH   r?   r?   r@   test_wait_stopped   s(    zTestProcess.test_wait_stoppedc              	   C   s   |   \}}ttj |d W 5 Q R X ttj |d W 5 Q R X |  |  | }| }tr|tj	 kst
|d kst
n|tj	kst
|tj	kst
d S )N{Gz?)spawn_children_pairr,   rF   r7   rp   rL   rT   r
   rM   rN   rE   )r;   child
grandchildZ	child_retZgrandchild_retr?   r?   r@   test_wait_non_children   s    z"TestProcess.test_wait_non_childrenc              	   C   sx   |   }|  ttj |d W 5 Q R X ttj |d W 5 Q R X tt |d W 5 Q R X d S )Nru   r   )rA   namer,   rF   r7   rp   rL   
ValueErrorrH   r?   r?   r@   test_wait_timeout   s    zTestProcess.test_wait_timeoutc              	   C   s   |   }ttj |d W 5 Q R X |  t t }t |k rvz|d}W qW q> tjk
rr   Y q>X q>| 	dt
r|tj kstn|tjkst| | d S )Nr   rn   )rA   r,   rF   r7   rp   rL   rK   timer   failr
   rM   rO   rE   rN   rP   )r;   rI   Zstop_atrR   r?   r?   r@   test_wait_timeout_nonblocking   s     

z)TestProcess.test_wait_timeout_nonblockingc              	   C   sz   t  }|jdd |jdd tdD ]*}|jd d}t|tsFt|dks(tq(tt	 |jdd W 5 Q R X d S )Nrm   )intervald           rz   )
r7   r8   cpu_percentrange
isinstancefloatrE   r,   rF   r|   )r;   rI   _percentr?   r?   r@   test_cpu_percent   s    zTestProcess.test_cpu_percentc              	   C   s4   t jdd d}t   |js&tW 5 Q R X d S )Nzpsutil.cpu_count)Zreturn_value)r*   r^   r7   r8   r   calledrE   )r;   mr?   r?   r@   test_cpu_percent_numcpus_none  s    z)TestProcess.test_cpu_percent_numcpus_nonezQEMU user not supportedc              	   C   s   t   }|jdkst||jdks0t||jdksBt||jdksTt|trj|j	dksjt||j
D ]}tdtt|| qpd S )Nr   z%H:%M:%S)r7   r8   	cpu_timesuserrE   systemchildren_userchildren_systemr   Ziowait_fieldsr~   strftime	localtimegetattr)r;   timesr{   r?   r?   r@   test_cpu_times  s    
zTestProcess.test_cpu_timesc                 C   s   t   d d \}}t d d \}}t||gt||g dkrZ| d||f t||gt||g dkr| d||f d S )N   皙?zexpected: %s, found: %s)r7   r8   r   rC   r   maxminr   )r;   	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kstt  dkr4|dks4t| tt  ksLtd S Nr   rg   )r7   r8   Zcpu_numrE   	cpu_countr   )r;   rI   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)rA   r~   create_timeabsr   r   r   )r;   rI   nowr   
differencer?   r?   r@   test_create_time2  s    zTestProcess.test_create_timez
POSIX onlyc                 C   sX   t   }|d k	rTztjtd}W n tk
rF   t	dY nX ||ksTt
d S )Nttyzcan't rely on `tty` CLI)r7   r8   terminalrC   pathrealpathr0   RuntimeErrorr,   skiprE   )r;   r   r   r?   r?   r@   test_terminalD  s    zTestProcess.test_terminal)Zonly_ifc              	   C   s  t  }| }ttd}|  W 5 Q R X | }tsts|j|jksNt	|j
|j
ks^t	tr|j|jksrt	|j|jkst	n |j|jkst	|j|jkst	| }t|  d.}tr|tdd d n|dd  W 5 Q R X | }|j
|j
kst	|j|jkst	|j|jks,t	|j|jks>t	trh|j|jksVt	|j|jksht	tt|D ]>}tr|dkrqt|| dkst	|| dkstt	qtd S )Nrbwbxi@B asciir   r   )r7   r8   Zio_countersopenr!   readr   r   Z
read_countrE   Zwrite_countr   Z
read_charsZwrite_chars
read_byteswrite_bytes
get_testfnr   writebytesr   len)r;   rI   Zio1fZio2ir?   r?   r@   test_io_countersP  s>    zTestProcess.test_io_countersz
linux onlyc              	      s   fdd}t   ts.  d t jks.tt jdks<tt jdksJtt jdksXtt jdksft  }| 	||  t j t
  t jdfksttt  jt jdd W 5 Q R X  t j t
  t jdfkst jt jdd t
  t jdfksttt  jt jd	d W 5 Q R X z jt jdd W n t jk
rj   Y nX tjtd
d  t jd W 5 Q R X tjtd
d  t jd W 5 Q R X tjtdd  jdd W 5 Q R X d S )Nc                    s&   | \}}|t jkrd} || d S Nr   )r7   IOPRIO_CLASS_NONEionice)initZioclassvaluerI   r?   r@   cleanup~  s    
z.TestProcess.test_ionice_linux.<locals>.cleanupr   rg   r         r      zioclass accepts no valuematchz$'ioclass' argument must be specified)r7   r8   r   r   r   rE   ZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLE
addCleanuptupler,   rF   r|   rb   )r;   r   r   r?   r   r@   test_ionice_linux{  sB     zTestProcess.test_ionice_linuxz!not supported on this win versionc              	   C   s  t  }ts| t jkst| }| |j| |t j | t jksRt|t j | t jksptz|t j	 W n t j
k
r   Y nX | t j	ksttjtdd |jt jdd W 5 Q R X tjtdd |t j	d  W 5 Q R X d S )Nz&value argument not accepted on Windowsr   rg   r   zis not a valid priority)r7   r8   r   r   ZIOPRIO_NORMALrE   r   ZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_HIGHrb   r,   rF   	TypeErrorr|   )r;   rI   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 }|s4t||D ]}tt|}|dksRt|t|kr|t||kspttrvq8|	||
|kstq8|	|}t|dkst|d dkst|d dks8tq8d S )Nr   c                 S   s   g | ]}| d r|qS )ZRLIMIT
startswith.0r   r?   r?   r@   
<listcomp>  s     
 z/TestProcess.test_rlimit_get.<locals>.<listcomp>r   rz   rg   )resourcer7   r8   rC   rD   dirrE   r   r    rlimitZ	getrlimitr   )r;   r   rI   namesr{   r   retr?   r?   r@   test_rlimit_get  s     

zTestProcess.test_rlimit_getc              	   C   s   |   }|tjd |tjdks*ttrZtjtdd tj	
dd W 5 Q R X tt |tjd W 5 Q R X d S )N)rh   rh   zcan't use prlimitr   r   )rh   rh   rh   )rA   r   r7   ZRLIMIT_NOFILErE   r   r,   rF   r|   Z_psplatformr8   rH   r?   r?   r@   test_rlimit_set  s    zTestProcess.test_rlimit_setc                 C   s   t  }|  }|t j\}}z|t jd|f t|d}|d W 5 Q R X t	t
&}t|d}|d W 5 Q R X W 5 Q R X tr|jjn|jd tjkstW 5 |t j||f |t j||fkstX d S )N   r   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   )r7   r8   r   r   RLIMIT_FSIZErE   r   r   r,   rF   IOErrorr   r   r`   ZEFBIG)r;   rI   testfnsofthardr   excr?   r?   r@   test_rlimit  s    $zTestProcess.test_rlimitc                 C   s   t  }|t j\}}zN|t jd|f |t jt j|f t|  d}|d W 5 Q R X W 5 |t j||f |t j||fkstX d S )Nr   r   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)	r7   r8   r   r   rE   RLIM_INFINITYr   r   r   )r;   rI   r   r   r   r?   r?   r@   test_rlimit_infinity  s    z TestProcess.test_rlimit_infinityc                 C   s<   t  }|t j\}}|t jks&t|t j||f d S r5   )r7   r8   r   r   r   rE   )r;   rI   r   r   r?   r?   r@   test_rlimit_infinity_value  s    z&TestProcess.test_rlimit_infinity_valuec              	   C   sr   t  }tr<z| }W qD t jk
r8   tdY qDX n| }t  | }||d ksdtW 5 Q R X d S )N$on OpenBSD this requires root accessrg   )	r7   r8   r   num_threadsrb   r,   r   r%   rE   )r;   rI   step1step2r?   r?   r@   test_num_threads  s    zTestProcess.test_num_threadszWINDOWS onlyc                 C   s   t  }| dkstd S r   )r7   r8   Znum_handlesrE   rH   r?   r?   r@   test_num_handles*  s    zTestProcess.test_num_handlesc              	   C   s   t  }tr<z| }W qD t jk
r8   tdY qDX n| }t d | }t|t|d kslt	|d }|j
|d kst	|j|d kst	|j|d kst	W 5 Q R X d S )Nr   rg   r   r   )r7   r8   r   threadsrb   r,   r   r%   r   rE   idr   system_time)r;   rI   r   r   Zathreadr?   r?   r@   test_threads0  s    zTestProcess.test_threadsc                 C   s   |   }tr:z|  W n  tjk
r8   tdY nX t| j	t
dd | D  dk sftt| jt
dd | D  dk std S )Nr   c                 S   s   g | ]
}|j qS r?   )r   r   r?   r?   r@   r   O  s     z.TestProcess.test_threads_2.<locals>.<listcomp>r   c                 S   s   g | ]
}|j qS r?   )r   r   r?   r?   r@   r   U  s     )rA   r   r   r7   rb   r,   r   r   r   r   sumrE   r   rH   r?   r?   r@   test_threads_2D  s$    "zTestProcess.test_threads_2c                 C   s   t  }| d d \}}| }|dks0t|dks<td gd }| d d \}}| }||ksnt||kszt||kst~tr| }	|	j|	jkst|	j|	j	kst| }	|	j
D ]}
t|	|
dkstqd S )Nr   r   i` )r7   r8   Zmemory_infomemory_percentrE   r   ZrssZwsetvmsZpagefiler   r   )r;   rI   Zrss1Zvms1Zpercent1ZmemarrZrss2Zvms2Zpercent2memr{   r?   r?   r@   test_memory_infoZ  s&    

zTestProcess.test_memory_infoc                 C   s   t  }t  j}| }|jD ]8}t||}|dks:t|dkrFts t	rLq ||ks tq t	sft
sftrt|jdksttt	r|jdkst|jdkstd S )Nr   r   )r7   r8   Zvirtual_memorytotalZmemory_full_infor   r   rE   r	   r   r   r   ussZpssZswap)r;   rI   r   r   r{   r   r?   r?   r@   test_memory_full_infoy  s    


z!TestProcess.test_memory_full_infoc           
      C   s  t  }| }t|tt|ks(t|jdd}|D ]}|jds8trZd|jkrZq8t	j
|jsrt|jtrz*t	j|jst	j|jst|jW nH tk
r   ts n,td}| }W 5 Q R X d|j |kr Y nX q8dt	j|jkr8zt	|j}W n tk
r$   Y q8X t|js8t|jq8|D ]l}|jD ]^}t||}	|dkrhqL|d	kr|	st|	n&t|	ttfst|	d
ksLt|	qLqBd S )NF)Zgrouped[z
/bin/qemu-z/proc/self/smapsz%s (deleted)Z64r   )addrZpermsr   )r7   r8   memory_mapsr   setrE   r   r   r#   rC   isabsr
   existsislinkr   r   r   basenamestatr   S_ISREGst_moder   r   r   intr   )
r;   rI   mapsZext_mapsntr   datastfnamer   r?   r?   r@   test_memory_maps  sL    






zTestProcess.test_memory_mapsc              	      sL   t  }t 4}dd   fdd| D } ||ks>tW 5 Q R X d S )Nc                 S   s   t jt j| S r5   )rC   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>)r7   r8   r'   r   rE   )r;   rI   r   Zlibpathsr?   r  r@   test_memory_maps_lists_lib  s
    z&TestProcess.test_memory_maps_lists_libc              	   C   sN   t  }|  tt |jdd W 5 Q R X ts>ts>trJ|jdd d S )Nz?!?)Zmemtyper   )	r7   r8   r   r,   rF   r|   r   r   r   rH   r?   r?   r@   test_memory_percent  s    zTestProcess.test_memory_percentc                 C   sL   |   }| st| s t|  |  | r<t| rHtd S r5   )rA   
is_runningrE   rK   rL   rH   r?   r?   r@   test_is_running  s    zTestProcess.test_is_runningc                 C   s   |   }| }z|tkstW n tk
r   trbt|ttkrbtjj}|||tkstnNdt	j
d t	j
d f }z ||dt|dkstW n tk
r   Y nX Y nX t|ddg}|dkstd S )Nz%s.%sr   rg   r[   rd   zimport os; print('hey')Zhey)rA   exer!   rE   r   r   rC   r   r  sysversion_inforeplacer0   )r;   rI   r  r  veroutr?   r?   r@   test_exe  s     zTestProcess.test_exec                 C   s   t ddg}| |}tr.| g kr.tdts:ts:trP| d t kstnt	rt
r| d }|t krd| dd  d|dd  kstd S trd| dd  d|kstd S d| d|kstd S )Nrd   2import time; [time.sleep(0.1) for x in range(100)]OPENBSD: returned EBUSYr    rg   r   )r!   rA   r   cmdliner,   r   r   r   rE   r   r   joinr#   )r;   r  rI   pyexer?   r?   r@   test_cmdline  s$    

,$zTestProcess.test_cmdlinezbroken on PYPYc                 C   s   t g}|dgd  |ddg | |}trjz| |ksDtW q tjk
rf   t	dY qX nHt
r| dd  |kstn*| }tr|g krt	d||kstd S )Nz-v2   rd   r  z#OPENBSD: process turned into zombier   r  )r!   extendrA   r   r  rE   r7   ZombieProcessr,   r   r#   r   )r;   r  rI   r   r?   r?   r@   test_long_cmdline  s"    

zTestProcess.test_long_cmdlinec                 C   sH   |   }|  }tjtjtj }|	|sDt
||fd S r5   )rA   r{   lowerrC   r   r  r   r  
executabler   rE   )r;   rI   r{   r   r?   r?   r@   	test_name(  s    zTestProcess.test_namezunreliable on PYPYzunreliable on QEMU userc                 C   s   t | jtjd d}|ddg}| |}trz| tj	|ksHt
W q t
k
r   | tjkrtj	|| st
n Y qX n| tj	|kst
d S )Nr   suffixrd   r  )r)   r   stringdigitsrA   r   r{   rC   r   r  rE   statusr7   STATUS_ZOMBIEr   r;   r   r  rI   r?   r?   r@   test_long_name.  s    

zTestProcess.test_long_namezbroken on SUNOSzbroken on AIXzbroken on QEMU userc                 C   sp   t | jdd}|ddg}| |}| |ks4t| tj|ksLttj	|
 tj	|ksltd S )Nz	foo bar )r)  rd   r  )r)   r   rA   r  rE   r{   rC   r   r  r  r  r/  r?   r?   r@   test_prog_w_funky_nameK  s    
z"TestProcess.test_prog_w_funky_namec                 C   sX   t  }| \}}}|t ks&t|t ks6tttdrTt | ksTtd S N	getresuid)	r7   r8   uidsrC   getuidrE   geteuidhasattrr3  r;   rI   realZ	effectiveZ_savedr?   r?   r@   	test_uids^  s    
zTestProcess.test_uidsc                 C   sX   t  }| \}}}|t ks&t|t ks6tttdrTt | ksTtd S r2  )	r7   r8   gidsrC   getgidrE   getegidr7  	getresgidr8  r?   r?   r@   	test_gidsl  s    
zTestProcess.test_gidsc              
      s   fdd}t   tt  d W 5 Q R X   }| || trd }t jt j	t j
t jt jt jfD ]}| j|dv z | W n t jk
r   Y nLX   }|t jt jt jfkr||ks|d kr|}||kstn||kstW 5 Q R X qlnzttdr*ttjt   ks*t d   dksFtttdrrttjt   ksrtts d   dkstW n t jk
r   Y nX d S )Nc                    s*   z  |  W n tjk
r$   Y nX d S r5   )nicer7   rb   )r   r   r?   r@   r   {  s    z&TestProcess.test_nice.<locals>.cleanupstr)priogetpriorityrg   r   )r7   r8   r,   rF   r   r@  r   r   ZIDLE_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZNORMAL_PRIORITY_CLASSZABOVE_NORMAL_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZREALTIME_PRIORITY_CLASSsubTestrb   rE   r7  rC   rC  PRIO_PROCESSrD   r   )r;   r   r   Zhighest_priorB  Znew_prior?   r   r@   	test_nicez  s`    

zTestProcess.test_nicec                 C   s   t  }| t jkstd S r5   )r7   r8   r-  ZSTATUS_RUNNINGrE   rH   r?   r?   r@   test_status  s    zTestProcess.test_statusc                 C   s|   |   }| }trh|d\}}t }|dr>td||ksJt	dt
jkrx|t
jd ksxt	n|t ksxt	d S )N\$zrunning as service accountZ
USERDOMAIN)rA   usernamer   splitgetpassgetuserendswithr,   r   rE   rC   environ)r;   rI   rJ  domainZgetpass_userr?   r?   r@   test_username  s    


zTestProcess.test_usernamec                 C   s    |   }| t kstd S r5   )rA   cwdrC   getcwdrE   rH   r?   r?   r@   test_cwd  s    zTestProcess.test_cwdc                    s(   t ddg}| | t fdd d S )Nrd   zFimport os, time; os.chdir('..'); [time.sleep(0.1) for x in range(100)]c                      s      tjt kS r5   )rR  rC   r   dirnamerS  r?   r   r?   r@   <lambda>      z(TestProcess.test_cwd_2.<locals>.<lambda>)r!   rA   r&   )r;   rk   r?   r   r@   
test_cwd_2  s    
zTestProcess.test_cwd_2c              	   C   s  t  }| }|st|| |j| ttdrL|tt|j	ksLtt
|t
t|ksdtttt
t jdd}|D ]j}||g | |gkstttdr| tt|j	kstt|dr| d | kstq|g  tr| |j ks(tn| |ks(tttdrR| tt|j	ksRttt |d W 5 Q R X || |t| |t| d S )Nsched_getaffinityTZpercpunum_cpur   rg   )r7   r8   cpu_affinityrE   r   r7  rC   listrY  r9   r   r   r   r   r[  r   _procZ_get_eligible_cpusr,   rF   r   r   )r;   rI   initialZall_cpusnr?   r?   r@   test_cpu_affinity  s4    




zTestProcess.test_cpu_affinityc              	   C   s   |   }ttjddd g}tt || W 5 Q R X tt |tdd W 5 Q R X tt	 |ddg W 5 Q R X tt |ddg W 5 Q R X d S )	NTrZ  
   i'  i*  r   1rz   )
rA   r   r7   r   r,   rF   r|   r\  r   r   )r;   rI   Zinvalid_cpur?   r?   r@   test_cpu_affinity_errs	  s    z"TestProcess.test_cpu_affinity_errsc                 C   s   t  }| }|st|| |j| t|dkrB|d d }g }tt|d D ](}t||D ]}|rf|	t
| qfqV|D ]&}|| t| t|kstqd S )N   rg   )r7   r8   r\  rE   r   r   r   	itertoolscombinationsappendr]  sorted)r;   rI   r_  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              	      s\  t  |  }  | ks$tt|dz}|d |  t fdd   dd  D }t	j
||ks~ttr D ]}|j
|kr|jdkstqW 5 Q R X  D ]}t	j
|j
st|qd| }| td	|gtd
D ]0}dd  D }||kr q6td qt	j
||ks6t|D ]}t	j
|s:t|q:d S )Nr   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc                      s   t  t  kS r5   )r   
open_filesr?   filesrI   r?   r@   rV  7  rW  z-TestProcess.test_open_files.<locals>.<lambda>c                 S   s   g | ]}t j|jqS r?   rC   r   r  r   r?   r?   r@   r   9  s     z/TestProcess.test_open_files.<locals>.<listcomp>r   zIimport time; f = open(r'%s', 'r'); [time.sleep(0.1) for x in range(100)];rd   r   c                 S   s   g | ]}t j|jqS r?   rn  r   r?   r?   r@   r   J  s     ru   )r7   r8   r   rk  rE   r   r   flushr&   rC   r   r  r   positionisfilerA   r!   r   r~   sleep)r;   r   r   	filenamesfiler  r   r?   rl  r@   test_open_files+  s<    


zTestProcess.test_open_filesc              	   C   s   t  }tjj}|  }t|d}| D ]*}||j||jksR|j	|
 kr, qnq,| dt|  ||j||jksttr|j	dkstn|j	|
 kst| d }|d |jkst|d |j	kst|j| kstW 5 Q R X d S )Nwzno file found; files=%srz   r   rg   )r7   r8   rC   r   r  r   r   rk  r{   fdfilenor   reprrE   r   )r;   rI   r  r   fileobjrt  Zntupler?   r?   r@   test_open_files_2T  s*    zTestProcess.test_open_files_2c                 C   s   t  }|  }| }t|d}| |j | |d ksBtt }| |j | |d ksjt|  |  | |kstd S )Nrv  rg   r   )	r7   r8   r   Znum_fdsr   r   closerE   socket)r;   rI   r   startrt  sockr?   r?   r@   test_num_fdss  s    
zTestProcess.test_num_fdsz not reliable on OPENBSD & NETBSDc                 C   sT   t  }t| }tdD ](}td t| }||kr d S q| dd S )Nr   g?z2num ctx switches still the same after 2 iterations)r7   r8   r   Znum_ctx_switchesr   r~   rr  r   )r;   rI   beforer   afterr?   r?   r@   test_num_ctx_switches  s    
z!TestProcess.test_num_ctx_switchesc                 C   sF   t  }ttdr&| t ks&t|  }| t ksBtd S )Ngetppid)	r7   r8   r7  rC   ppidr  rE   rA   rD   rH   r?   r?   r@   	test_ppid  s
    
zTestProcess.test_ppidc                 C   sD   |   }| jt kstt d }t| d ks@td S r   )	rA   parentr9   rC   rD   rE   r7   pidsr8   )r;   rI   Z
lowest_pidr?   r?   r@   test_parent  s    zTestProcess.test_parentc                 C   s8   t  }|  \}}| |ks$t| |ks4td S r5   )r7   r8   rv   r  rE   r;   r  rw   rx   r?   r?   r@   test_parent_multi  s    zTestProcess.test_parent_multic                 C   s`   t  }| st|  \}}| d |ks4t| d |ksHt| d |ks\td S r   )r7   r8   parentsrE   rv   r  r?   r?   r@   test_parents  s    zTestProcess.test_parentsc                 C   s   t  }| g kst|jddg ks,t| jdd}| }|jdd}||fD ]>}t|dksht|d j|jks|t|d  |jksTtqTd S )NT	recursiver   )creationflagsrg   )r7   r8   childrenrE   rA   r   r9   r  )r;   r  rw   Z	children1Z	children2r  r?   r?   r@   test_children  s    zTestProcess.test_childrenc                 C   sf   t  }|  \}}| |gks&t|jdd||gks>t|  |  |jddg ksbtd S )NTr  )r7   r8   rv   r  rE   rT   rL   r  r?   r?   r@   test_children_recursive  s    z#TestProcess.test_children_recursivec              	   C   s   t t}t D ]4}z||   d7  < W q tjk
rD   Y qX qt| dd dd d }t	rz|dkrzt
dt|}z|jdd	}W n tjk
r   Y nX t|tt|kstd S )
Nrg   c                 S   s   | d S )Nrg   r?   )r   r?   r?   r@   rV    rW  z6TestProcess.test_children_duplicates.<locals>.<lambda>)keyrz   r   zPID 0Tr  )collectionsdefaultdictr  r7   process_iterr  Errorri  itemsr   r,   r   r8   r  rb   r   r   rE   )r;   tablerI   r9   cr?   r?   r@   test_children_duplicates  s    


z$TestProcess.test_children_duplicatesc                 C   s|   t  }|  \}}|jdd}t|dks0t|d |ks@t|d |ksPt| }|d |ksht|d |ksxtd S )NTr  r   r   rg   )r7   r8   rv   r  r   rE   r  )r;   r  rw   rx   r  r  r?   r?   r@   test_parents_and_children  s    z%TestProcess.test_parents_and_childrenc                 C   sX   |   }|  tdD ] }| tjkr. q:td q|  | tjksTt	d S )Nr   ru   )
rA   rr   r   r-  r7   ZSTATUS_STOPPEDr~   rr  rs   rE   )r;   rI   r   r?   r?   r@   test_suspend_resume  s    zTestProcess.test_suspend_resumec              	   C   sD   t t td W 5 Q R X t t td W 5 Q R X d S )Nrc  rz   )r,   rF   r   r7   r8   r|   r;   r?   r?   r@   test_invalid_pid  s    zTestProcess.test_invalid_pidc              
   C   s  t  }|jddgd}t| ddgks0tt tt  }|jdgdd}t|d t	sp|d dksptt
jddt jd	" |jd
gddd
dikstW 5 Q R X t
jddt |jdd	, tt j |jd
gd W 5 Q R X W 5 Q R X t
jddt |jdd	$ |jd
gddd
diks0tW 5 Q R X t
jddtd	H | }d
t	| ksjttt |jd
gd W 5 Q R X W 5 Q R X tt |d W 5 Q R X tt |dg W 5 Q R X tt |ddg W 5 Q R X d S )Nr  r{   )attrsZnet_connectionsfoo)r  Zad_valuezpsutil.Process.niceT)creater]   r@  rg   bar)r7   r8   Zas_dictri  keysrE   r   r  r   r]  r*   r^   rb   r:   r9   r,   rF   r$  NotImplementedErrorr   r|   )r;   rI   dr?   r?   r@   test_as_dict  sR      &"(  "zTestProcess.test_as_dictc              
   C   s   t  }td8}|  |  |  W 5 Q R X |jdksFtW 5 Q R X td}|  |  W 5 Q R X |jdkstd S )N$psutil._psplatform.Process.cpu_timesrg   r   r7   r8   r*   r^   oneshotr   Z
call_countrE   r;   rI   r   r?   r?   r@   test_oneshot/  s    
zTestProcess.test_oneshotc                 C   s   t  }td}tdj}| : |  |  |  |  |  W 5 Q R X W 5 Q R X |jdksvt|jdkstW 5 Q R X W 5 Q R X td}|  |  W 5 Q R X |jdkstd S )Nr  z(psutil._psplatform.Process.oneshot_enterrg   r   r  )r;   rI   m1m2r   r?   r?   r@   test_oneshot_twice<  s    

"zTestProcess.test_oneshot_twicec              	   C   s   |   \}}| }| }||ks(t| & | |ksBt| |ksRtW 5 Q R X | & | |ksvt| |kstW 5 Q R X d S r5   )rv   r  rE   r  )r;   p1p2Zp1_ppidZp2_ppidr?   r?   r@   test_oneshot_cacheP  s    

zTestProcess.test_oneshot_cachec                    sn   fdd}         tr8t fdd   t }||jD ]\}}||| qVd S )Nc                    s   z
|  }W nT t jk
r"    Y n` t jk
r6   Y nL t jk
r^   trX|dkrXY d S  Y n$X trp|dkrpd S  d| |f d S )N)r   r   )r  r{   z+%r didn't raise NSP and returned %r instead)r7   r$  r:   rb   r   r   r   )funZfun_namer   r  r?   r@   assert_raises_nspg  s    

zFTestProcess.test_halfway_terminated_process.<locals>.assert_raises_nspc                      s    j t kS r5   )r9   r7   r  r?   r   r?   r@   rV  ~  rW  z=TestProcess.test_halfway_terminated_process.<locals>.<lambda>)	rA   rT   rL   r   r&   rP   r+   iterall)r;   r  nsr  r{   r?   )rI   r;   r@   test_halfway_terminated_process_  s    
z+TestProcess.test_halfway_terminated_processc                 C   s   |   \}}| | d S r5   )Zspawn_zombieZassertProcessZombie)r;   _parentZzombier?   r?   r@   test_zombie_process  s    zTestProcess.test_zombie_processc              	   C   sB   t  }tjdt dd}| s*t|js4tW 5 Q R X d S )Nzpsutil.Processr   r\   )r7   r8   r*   r^   r$  r  rE   r   r  r?   r?   r@   $test_zombie_process_is_running_w_exc  s     z0TestProcess.test_zombie_process_is_running_w_excc              	   C   sH   t  }tjdt dd"}| t jks0t|js:tW 5 Q R X d S )Nz!psutil._psplatform.Process.statusr   r\   )	r7   r8   r*   r^   r$  r-  r.  rE   r   r  r?   r?   r@    test_zombie_process_status_w_exc  s    z,TestProcess.test_zombie_process_status_w_excc           	      C   s  t rddlm} nddlm} |  }t|j}|j| d f|_t	t
  |jtjksbt| rnttjtjdd( t| }t	t
  W 5 Q R X W 5 Q R X d|j | kst|jtjkst|t|jkstd}t|}|j|j|j dd	D ]D\}}| j|d
( tjtj|d |  W 5 Q R X W 5 Q R X q
dt|ksbtdt|kstttjtj|d |  W 5 Q R X tjtj|d |  W 5 Q R X tjtj|d |   W 5 Q R X tjtj|d |!  W 5 Q R X d S )Nr   )StringIOr   ZPSUTIL_DEBUGTz-refreshing Process instance for reused PID %sz4process no longer exists and its PID has been reusedF)clear_cache)r{   r   zterminated + PID reused)"r   ior  r6   r7   r8   r9   r   _identr]  r  Z_pmaprE   r  r*   r^   objectZ_commonr   getvaluer+   r  settersZkillersrD  r,   rF   r:   rA  ry  r  r  r  r  )	r;   r  ZsubprI   r   msgr  r  r{   r?   r?   r@   test_reused_pid  sD     zTestProcess.test_reused_pidc              	   C   s  dt  krVtt j t d W 5 Q R X t dr<tt d dksRtd S t d}t	rjt j
nt}t| |  W 5 Q R X t| |  W 5 Q R X t| |  W 5 Q R X t| |  W 5 Q R X t| |  W 5 Q R X t| |tj W 5 Q R X t|}||j|j D ]\}}z
| }W n t j
k
rj   Y nbX |dkr|jdkstnD|dkrt	rdnd}| |kstn|dkr@|s@t|q@tsdt  kstt dstd S )Nr   rg   )r4  r;  rJ  zNT AUTHORITY\SYSTEMrootr{   )r7   r  r,   rF   r:   r8   Z
pid_existsrE   r  r   rb   r|   rL   rT   rr   rs   rK   rV   rM   rN   r+   r  Zgettersr  r9  rJ  r   )r;   rI   r   r  r  r{   r   r   r?   r?   r@   
test_pid_0  sH    




zTestProcess.test_pid_0c                 C   sH   dd }d | _ t }|| }|tj }tsDtrD||ksDtd S )Nc                 S   sN   ddddg}t r"|ddddg |D ]}| |d  q&tdd	 |  D S )
NPLATHOMEZPYTEST_CURRENT_TESTZPYTEST_VERSIONZ__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 )r[   
)r  )r   kvr?   r?   r@   r   
  s   z@TestProcess.test_environ.<locals>.clean_dict.<locals>.<listcomp>)r   r#  popdictr  )r  excluder{   r?   r?   r@   
clean_dict  s    z,TestProcess.test_environ.<locals>.clean_dict)	ZmaxDiffr7   r8   rO  rC   copyr	   r   rE   )r;   r  rI   d1Zd2r?   r?   r@   test_environ  s    zTestProcess.test_environz<macOS 11+ can't get another process environment, issue #2084z(sometimes fails on `assert is_running()`c                 C   s   t d}t|  |d}| j|gtjtjd}t|j	}t
|j	 | sRt|j dksdttrtrz| }W q tjk
r   Y d S X n| }|dddkst|  |jdkst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)stdinrf   rW  rc  3)ACr   )textwrapdedentr(   r   r6   ri   rj   r7   r8   r9   r3   r  rE   rf   r   r   r   rO  rb   communicate
returncode)r;   rR   Zcexer>   rI   envr?   r?   r@   test_weird_environ  s(    
  

zTestProcess.test_weird_environN)m__name__
__module____qualname____doc__rA   rJ   rS   rU   rX   r,   markskipifr
   rc   rl   r   rt   ry   r}   r   r   r   r#   r   r   r   r   r   r   r   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r1   r   r   r   r   r   r  r  r  r  r  r!  r    r%  r(  r0  r   r   r1  r:  r?  rF  rG  rQ  rT  rX  r   ra  rd  rj  r   r   ru  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@   r4   P   s&  









)+ 








/
	



B

&

&
 

4&



..
 r4   c                       sr   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jjddddd Z  ZS )LimitedUserTestCasezRepeat the previous tests by using a limited user.
        Executed only on UNIX and only if the user who run the test script
        is root.
        r5  c                    sT   t  j|| dd t| D D ].}t| |  fdd}t| |t||  q d S )Nc                 S   s   g | ]}| d r|qS )testr   r   r?   r?   r@   r   `  s     
 z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                    s&   z
   W n t jk
r    Y nX d S r5   )r7   rb   r  methr?   r@   test_c  s    
z+LimitedUserTestCase.__init__.<locals>.test_)r   __init__r   r   setattrtypes
MethodType)r;   r<   r=   attrr  	__class__r  r@   r  \  s
    
zLimitedUserTestCase.__init__c                    s"   t    td td d S )Ni  )r   setUprC   setegidseteuidr  r  r?   r@   r  k  s    

zLimitedUserTestCase.setUpc                    s&   t | j t | j t   d S r5   )rC   r  PROCESS_UIDr  PROCESS_GIDr   tearDownr  r  r?   r@   r  p  s    zLimitedUserTestCase.tearDownc                 C   s8   zt  d W n t jk
r(   Y nX | dd S )Nrz   zexception not raised)r7   r8   r@  rb   r   r  r?   r?   r@   rF  u  s
    zLimitedUserTestCase.test_niceTzcauses problem as rootrY   c                 C   s   d S r5   r?   r  r?   r?   r@   r  }  s    z'LimitedUserTestCase.test_zombie_process)r  r  r  r  r7  rC   r5  r  r<  r  r  r  r  rF  r,   r  r  r  __classcell__r?   r?   r  r@   r  Q  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 r5   r-   )clsr?   r?   r@   tearDownClass  s    zTestPopen.tearDownClassc              
   C   s   t ddg}tj|tjtjtdL}|  |  |j t	|sDt
tt |j W 5 Q R X |  W 5 Q R X tr|dtj kst
n|dtjkst
d S )Nrd   3import time; [time.sleep(0.1) for x in range(100)];stdoutrf   r  rh   )r!   r7   Popenri   rj   r"   r{   r   r  r   rE   r,   rF   rG   r  rT   r
   rL   rM   rN   r;   rk   procr?   r?   r@   	test_misc  s*    zTestPopen.test_miscc              	   C   sh   t jtdgtjtjtjtd}|  W 5 Q R X |jjs>t	|j
jsJt	|jjsVt	|jdksdt	d S )Nz-V)r  rf   r  r  r   )r7   r  r!   ri   rj   r"   r  r  closedrE   rf   r  r  )r;   r  r?   r?   r@   test_ctx_manager  s    zTestPopen.test_ctx_managerc              
   C   s   t ddg}tj|tjtjtd}|  |  t	tj
 |  W 5 Q R X t	tj
 |  W 5 Q R X t	tj
 |tj W 5 Q R X trt	tj
 |tj W 5 Q R X t	tj
 |tj W 5 Q R X W 5 Q R X d S )Nrd   r  r  )r!   r7   r  ri   rj   r"   rT   rL   r,   rF   r:   rK   rV   rM   rN   r   ZCTRL_C_EVENTZCTRL_BREAK_EVENTr   r?   r?   r@   test_kill_terminate  s0    zTestPopen.test_kill_terminateN)	r  r  r  r  classmethodr  r  r  r  r?   r?   r?   r@   r    s   
r  )Gr  r  r`   rL  rf  rC   rM   r}  r  r+  ri   r  r  r~   r  r7   r   r   r   r   r   r   r	   r
   r   r   Zpsutil._commonr   Zpsutil._compatr   r   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/   r0   r1   r2   r3   r4   r5  r  r  r?   r?   r?   r@   <module>   s               6