
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    =_7                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl m"Z" ddl m#Z# ddl m$Z$ ddl m%Z% ddl m&Z& ddl m'Z' ddl m(Z( ddl m)Z) ddl m*Z* ddl m+Z+ ddl m,Z, ddl m-Z- ddl m.Z. dd l m/Z/ dd!l m0Z0 dd"l m1Z1 dd#l m2Z2 dd$l m3Z3 dd%l m4Z4 dd&l m5Z5 dd'l m6Z6 dd(l m7Z7 dd)l m8Z8 dd*l m9Z9 dd+l m:Z: dd,l m;Z; dd-l m<Z< G d.d/ d/e2Z=ere> dkrG d0d1 d1e=Z?G d2d3 d3e2Z@eAd4krdd5lBmCZC eCeD dS )6Tests for psutil.Process class.    N)AIX)BSD)LINUX)MACOS)NETBSD)OPENBSD)OSX)POSIX)SUNOS)WINDOWS)	open_text)FileNotFoundError)long)PY3)super)APPVEYOR)
call_until)
CI_TESTING)copyload_shared_lib)
create_exe)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)mock)process_namespace)PsutilTestCase)PYPY)
PYTHON_EXEreap_children)retry_on_failure)sh)skip_on_access_denied)skip_on_not_implemented)
ThreadTask)unittest)wait_for_pidc                   @   s  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	
e ddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Ze	
e d!d"d# Zd$d% Ze	
e d&d'd( Ze	
e d!eed)d*d+ Ze	
e d!e	
e d,d-d. Ze	
e d!e	
e  d/d0d1 Z!e	
e" d!d2d3 Z#e	
e" d!d4d5 Z$e	
e" d!d6d7 Z%e	
e" d!d8d9 Z&e	
e" d!d:d; Z'd<d= Z(e	
e  d>d?d@ Z)e	
e* d!dAdB Z+e, e-e.d)e	
e* d!dCdD Z/e, dEdF Z0dGdH Z1e	
e2 d!dIdJ Z3e	
e2 d!dKdL Z4dMdN Z5dOdP Z6dQdR Z7dSdT Z8e	
e9dUdVdW Z:dXdY Z;e	
e9dZd[d\ Z<e	
e=d]e	
e>d^e	
e9dUd_d` Z?e	
e d&dadb Z@e	
e d&dcdd ZAdedf ZBdgdh ZCdidj ZDdkdl ZEdmdn ZFe	
eG d!dodp ZHe	
eG d!dqdr ZIe	
eG d!dsdt ZJe	
eKdue	
eLdvdwdx ZMe	
eKdue	
eLdvdydz ZNe	
e d&d{d| ZOeed)e	
ePpeQd}d~d ZRdd ZSdd ZTdd ZUdd ZVe, dd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbe	
e d&dd Zce	
e d&dd Zde	
e d&dd Zedd Zfe	
eg d!dd Zhe	
eg d!e	
e d&dd ZidS )TestProcessr   c                 O   s   | j ||}t|jS N)spawn_testprocpsutilProcesspid)selfargskwargssproc r9   L/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_process.pyspawn_psprocN   s    zTestProcess.spawn_psprocc              	   C   s:   t  }| |jt  | t d|_W 5 Q R X d S )N!   )r2   r3   assertEqualr4   osgetpidassertRaisesAttributeErrorr5   pr9   r9   r:   test_pidT   s    zTestProcess.test_pidc                 C   sJ   |   }|  | }tr,| |tj n| |tj  | | d S r0   )	r;   killwaitr   r=   signalSIGTERMSIGKILLassertProcessGoner5   rC   coder9   r9   r:   	test_killZ   s    zTestProcess.test_killc                 C   sJ   |   }|  | }tr,| |tj n| |tj  | | d S r0   )r;   	terminaterF   r   r=   rG   rH   rJ   rK   r9   r9   r:   test_terminated   s    zTestProcess.test_terminatec                 C   sX   t r
tjntj}|  }|| | }tr<| || n| ||  | 	| d S r0   )
r
   rG   rI   rH   r;   send_signalrF   r   r=   rJ   )r5   sigrC   rL   r9   r9   r:   test_send_signaln   s    
zTestProcess.test_send_signalz	not POSIXc              	   C   s   t j}|  }tjdttjdd | t	j
|j| W 5 Q R X |  }tjdttjdd | t	j|j| W 5 Q R X d S )Nzpsutil.os.kill side_effect)rG   rH   r;   r!   patchOSErrorerrnoZESRCHr@   r2   NoSuchProcessrP   EPERMAccessDenied)r5   rQ   rC   r9   r9   r:   test_send_signal_mockedy   s    

z#TestProcess.test_send_signal_mockedc                 C   s   t ddg}| |}| }| |d | | t ddg}| j|tjd}| }| |d | | t ddg}| |}| }| |d | | t dd	g}| |}| }| |d | | d S )
N-cpassr   z1 / 0)stderr   zimport sys; sys.exit(5);   zimport os; os._exit(5);)r%   r;   rF   r=   rJ   
subprocessPIPE)r5   cmdrC   rL   r9   r9   r:   test_wait_exited   s(    









zTestProcess.test_wait_exitedc                 C   s   |   }tr|tj | jtj|jdd |tj	 | jtj|jdd |tj
 | | tj
  | | tj
  nd|  | jtj|jdd |  | jtj|jdd |  | | tj
 | | tj
 d S )NMbP?)timeout)r;   r
   rP   rG   SIGSTOPr@   r2   TimeoutExpiredrF   SIGCONTrH   r=   suspendresumerN   rB   r9   r9   r:   test_wait_stopped   s     zTestProcess.test_wait_stoppedc                 C   s   |   \}}| tj|jd | tj|jd |  |  | }| }trr| |tj	  | |d  n| |tj	 | |tj	 d S )N{Gz?)
spawn_children_pairr@   r2   ri   rF   rN   r
   r=   rG   rH   )r5   child
grandchildZ	child_retZgrandchild_retr9   r9   r:   test_wait_non_children   s    z"TestProcess.test_wait_non_childrenc                 C   sH   |   }|  | tj|jd | tj|jd | t|jd d S )Nrn   r   )r;   namer@   r2   ri   rF   
ValueErrorrB   r9   r9   r:   test_wait_timeout   s
    zTestProcess.test_wait_timeoutc                 C   s   |   }| tj|jd |  t t }t |k rfz|d}W qpW q. tjk
rb   Y q.X q.| dt	r| 
|tj  n| 
|tj | | d S )Nr   rg   )r;   r@   r2   ri   rF   rE   timer   failr
   r=   rG   rI   rH   rJ   )r5   rC   Zstop_atrL   r9   r9   r:   test_wait_timeout_nonblocking   s    

z)TestProcess.test_wait_timeout_nonblockingc              	   C   sx   t  }|jdd |jdd tdD ](}|jd d}| |t | |d q(| t |jdd W 5 Q R X d S )Nrf   )intervald           rs   )	r2   r3   cpu_percentrangeassertIsInstancefloatassertGreaterEqualr@   ru   )r5   rC   xpercentr9   r9   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!   rV   r2   r3   r}   calledAssertionError)r5   mr9   r9   r:   test_cpu_percent_numcpus_none   s    z)TestProcess.test_cpu_percent_numcpus_nonec              	   C   s   t   }|jdks(|jdks(t||jdks:t||jdksLt|trb|j	dksbt||j
D ]}tdtt|| qhd S )Nr|   z%H:%M:%S)r2   r3   	cpu_timesusersystemr   children_userchildren_systemr   Ziowait_fieldsrw   strftime	localtimegetattr)r5   timesrt   r9   r9   r:   test_cpu_times   s    
zTestProcess.test_cpu_timesc                 C   s   t   d d \}}t d d \}}t||gt||g dkrZ| d||f  t||gt||g dkr| d||f  d S )N   皙?zexpected: %s, found: %s)r2   r3   r   r>   r   maxminrx   )r5   	user_timeZkernel_timeutimeZktimer9   r9   r:   test_cpu_times_2  s    zTestProcess.test_cpu_times_2znot supportedc                 C   sP   t  }| }| |d t  dkr4| |d | | tt   d S Nr   r`   )r2   r3   Zcpu_numr   	cpu_countr=   assertInr~   )r5   rC   numr9   r9   r:   test_cpu_num  s    zTestProcess.test_cpu_numc                 C   sZ   |   }t }| }t|| }|dkr@| d|||f  tdt|  d S )Nr   z'expected: %s, found: %s, difference: %sz%Y %m %d %H:%M:%S)r;   rw   create_timeabsrx   r   r   )r5   rC   nowr   
differencer9   r9   r:   test_create_time  s    zTestProcess.test_create_timez
POSIX onlyc                 C   s4   t   }|d k	r0tjtd}| || d S )Ntty)r2   r3   terminalr>   pathrealpathr)   r=   )r5   r   r   r9   r9   r:   test_terminal'  s    zTestProcess.test_terminal)Zonly_ifc              	   C   s  t  }| }ttd}|  W 5 Q R X | }tsts| |j	|j	 | 
|j|j tr| |j|j | 
|j|j n | |j|j | |j|j | }t|  d.}tr|tdd d n|dd  W 5 Q R X | }| |j|j | |j|j | |j	|j	 | |j|j tr\| |j|j | |j|j tt|D ]:}tr|dkrqh| || d | || d qhd S )Nrbwbr   i@B asciir   r   )r2   r3   Zio_countersopenr%   readr   r   assertGreater
read_countr=   write_countr   Z
read_charsZwrite_charsr   
read_byteswrite_bytes
get_testfnr   writebytesr~   len)r5   rC   Zio1fZio2ir9   r9   r:   test_io_counters.  s>    zTestProcess.test_io_countersz
linux onlyc              
   C   s  t  }ts"| | d t j | t jd | t jd | t jd | t jd | }z4|t j | t	| t jdf | 
t |jt jdd W 5 Q R X |t j | t	| t jdf |jt jdd | t	| t jdf | 
t |jt jdd W 5 Q R X z|jt jdd W n t jk
rT   Y nX | td|jt jd | td|jt jd | jtd	|jdd W 5 |\}}|t jkrd}||| X d S )
Nr   r`   r         value   zioclass accepts no valuez$'ioclass' argument must be specified)r2   r3   r   r=   ioniceZIOPRIO_CLASS_NONEZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLEtupler@   ru   r[   assertRaisesRegex)r5   rC   initioclassr   r9   r9   r:   test_ionice_linuxY  s^            
zTestProcess.test_ionice_linuxz!not supported on this win versionc              	   C   s   t  }ts| | t j | }z|t j | | t j |t j | | t j z|t j W n t j	k
r   Y nX | | t j | j
td|jt jdd | 
td|jt jd  W 5 || X d S )Nz&value argument not accepted on Windowsr`   r   zis not a valid priority)r2   r3   r   r=   r   ZIOPRIO_NORMALZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_HIGHr[   r   	TypeErrorru   )r5   rC   r   r9   r9   r:   test_ionice_win  s8         zTestProcess.test_ionice_winc                 C   s   dd l }tt }dd ttD }|s4t||D ]}tt|}| |d |t|kr| 	|t|| t
rvq8| 	|||| q8||}| 	t|d | |d d | |d d q8d S )Nr   c                 S   s   g | ]}| d r|qS )ZRLIMIT
startswith.0r   r9   r9   r:   
<listcomp>  s     
 z/TestProcess.test_rlimit_get.<locals>.<listcomp>r   rs   r`   )resourcer2   r3   r>   r?   dirr   r   r   r=   r$   rlimitZ	getrlimitr   )r5   r   rC   namesrt   r   retr9   r9   r:   test_rlimit_get  s     

zTestProcess.test_rlimit_getc              	   C   s   |   }|tjd | |tjd trX| td tj	dd W 5 Q R X | 
t |tjd W 5 Q R X d S )N)ra   ra   zcan't use prlimitr   )ra   ra   ra   )r;   r   r2   ZRLIMIT_NOFILEr=   r   r   ru   Z_psplatformr3   r@   rB   r9   r9   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|d}|d W 5 Q R X W 5 Q R X | t
r|jjn|jd tj W 5 |t j||f | |t j||f X d S )N   r   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   )r2   r3   r   r   RLIMIT_FSIZEr=   r   r   r@   IOErrorr   	exceptionrX   ZEFBIG)r5   rC   testfnsofthardr   excr9   r9   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 X d S )Nr   r   s   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)	r2   r3   r   r   r=   RLIM_INFINITYr   r   r   )r5   rC   r   r   r   r9   r9   r:   test_rlimit_infinity  s    z TestProcess.test_rlimit_infinityc                 C   s<   t  }|t j\}}| t j| |t j||f d S r0   )r2   r3   r   r   r=   r   )r5   rC   r   r   r9   r9   r:   test_rlimit_infinity_value  s    z&TestProcess.test_rlimit_infinity_valuec              	   C   sr   t  }tr<z| }W qD t jk
r8   tdY qDX n| }t  | }| ||d  W 5 Q R X d S )N$on OpenBSD this requires root accessr`   )	r2   r3   r   num_threadsr[   r-   SkipTestr,   r=   )r5   rC   step1step2r9   r9   r:   test_num_threads  s    zTestProcess.test_num_threadszWINDOWS onlyc                 C   s   t  }| | d d S Nr   )r2   r3   r   Znum_handlesrB   r9   r9   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  |d }| |j
|d  | |j|d  | |j|d  W 5 Q R X d S )Nr   r`   r   r   )r2   r3   r   threadsr[   r-   r   r,   r=   r   idr   system_time)r5   rC   r   r   Zathreadr9   r9   r:   test_threads  s    zTestProcess.test_threadsc                 C   s   |   }tr:z|  W n  tjk
r8   tdY nX | j| j	t
dd | D dd | j| jt
dd | D dd d S )Nr   c                 S   s   g | ]
}|j qS r9   )r   r   r9   r9   r:   r   -  s     z.TestProcess.test_threads_2.<locals>.<listcomp>r   )deltac                 S   s   g | ]
}|j qS r9   )r   r   r9   r9   r:   r   0  s     )r;   r   r   r2   r[   r-   r   ZassertAlmostEqualr   r   sumr   rB   r9   r9   r:   test_threads_2   s$    
  zTestProcess.test_threads_2c                 C   s   t  }| d d \}}| }| |d | |d d gd }| d d \}}| }| || | || | || ~tr| }	| |	j|	j	 | |	j
|	j | }	|	jD ]}
| t|	|
d qd S )Nr   r   i` )r2   r3   Zmemory_infomemory_percentr   r   r   r=   ZrssZwsetvmsZpagefiler   r   )r5   rC   Zrss1Zvms1Zpercent1ZmemarrZrss2Zvms2Zpercent2memrt   r9   r9   r:   test_memory_info2  s&    

zTestProcess.test_memory_infoc                 C   s   t  }t  j}| }|jD ]J}t||}| j|d||fd |dkrNts t	rTq | j
|||||fd q t	sxtsxtr| |jd t	r| |jd | |jd d S )Nr   )msgr   )r2   r3   Zvirtual_memorytotalZmemory_full_infor   r   r   r	   r   ZassertLessEqualr   r   ussZpssZswap)r5   rC   r   r   rt   r   r9   r9   r:   test_memory_full_infoQ  s    


z!TestProcess.test_memory_full_infoc                 C   s  t  }| }dd |D }| t|tt| |jdd}|D ]}|jdsFtj	|jsnt
|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 qFdtj|jkrFzt|j}W n tk
r    Y qFX t|jsFt
|jqF|D ]j}|jD ]\}	t||	}
|	d	krfqHn<|	d
kr|
st
|
n"| |
ttf |
dksHt
|
qHq>d S )Nc                 S   s   g | ]}|qS r9   r9   r   r9   r9   r:   r   e  s     z0TestProcess.test_memory_maps.<locals>.<listcomp>F)Zgrouped[z/proc/self/smapsz%s (deleted)Z64r   )addrZpermsr   )r2   r3   memory_mapsr=   r   setr   r   r>   isabsr   r
   existsislinkr   r   r   basenamestatr   S_ISREGst_moder   r   r   intr   )r5   rC   mapspathsZext_mapsntr   datastfnamer   r9   r9   r:   test_memory_mapsa  sJ    





zTestProcess.test_memory_mapsc              	      sL   t  }t 4}dd   fdd| D }|  || W 5 Q R X d S )Nc                 S   s   t jt j| S r0   )r>   r   r   normcase)rC   r9   r9   r:   normpath  s    z8TestProcess.test_memory_maps_lists_lib.<locals>.normpathc                    s   g | ]} |j qS r9   )r   r   r  r9   r:   r     s   z:TestProcess.test_memory_maps_lists_lib.<locals>.<listcomp>)r2   r3   r   r   r   )r5   rC   r   Zlibpathsr9   r  r:   test_memory_maps_lists_lib  s    
z&TestProcess.test_memory_maps_lists_libc                 C   s>   t  }|  | jt|jdd ts.ts.tr:|jdd d S )Nz?!?)Zmemtyper   )r2   r3   r   r@   ru   r   r   r   rB   r9   r9   r:   test_memory_percent  s
    zTestProcess.test_memory_percentc                 C   sL   |   }| st| s t|  |  | r<t| rHtd S r0   )r;   
is_runningr   rE   rF   rB   r9   r9   r:   test_is_running  s    zTestProcess.test_is_runningc                 C   s   |   }| }z| |t W n tk
r   trbt|ttkrbtjj	}| |||t nNdt
jd t
jd f }z | ||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`   rS   r]   zimport os; print('hey')Zhey)r;   exer=   r%   r   r   r   r>   r   r
  sysversion_inforeplacer)   )r5   rC   r  r
  veroutr9   r9   r:   test_exe  s"    
zTestProcess.test_exec                 C   sV   t ddg}| |}ts ts tr6| | d t  n| d| d| d S )Nr]   zimport time; time.sleep(60)r    )r%   r;   r   r   r   r=   cmdlinejoin)r5   r  rC   r9   r9   r:   test_cmdline  s
    

zTestProcess.test_cmdlinezbroken on PYPYc                 C   s>   |   }t| |gdgd  }| |}| | | d S )N
0123456789   )r   r   r;   r=   r  )r5   r   r  rC   r9   r9   r:   test_long_cmdline  s
    
zTestProcess.test_long_cmdlinec                 C   sJ   |  t}|  }tjtjtj	 }|
|sFt||fd S r0   )r;   r%   rt   lowerr>   r   r   r   r  
executabler   r   )r5   rC   rt   Zpyexer9   r9   r:   	test_name  s    
zTestProcess.test_namezunreliable on PYPYc                 C   s:   | j dd}t| | |}| | tj| d S )NZ01234567890123456789suffix)r   r   r;   r=   rt   r>   r   r   )r5   r   rC   r9   r9   r:   test_long_name  s    
zTestProcess.test_long_namezbroken on SUNOSzbroken on AIXc                 C   s|   | j dd}t| |ddddddg}| |}| | | | | tj| | tj	|
 tj	| d S )Nz	foo bar )r"  r]   z9import time; [time.sleep(0.01) for x in range(3000)];arg1Zarg2rS   Zarg3)r   r   r;   r=   r  rt   r>   r   r   r
  r  )r5   Z
funky_pathr  rC   r9   r9   r:   test_prog_w_funky_name  s       

z"TestProcess.test_prog_w_funky_namec                 C   sX   t  }| \}}}| |t  | |t  ttdrT| t |  d S N	getresuid)	r2   r3   uidsr=   r>   getuidgeteuidhasattrr'  r5   rC   real	effectivesavedr9   r9   r:   	test_uids  s    
zTestProcess.test_uidsc                 C   sX   t  }| \}}}| |t  | |t  ttdrT| t |  d S r&  )	r2   r3   gidsr=   r>   getgidgetegidr+  	getresgidr,  r9   r9   r:   	test_gids	  s    
zTestProcess.test_gidsc                 C   sv  t  }| t|jd | }z$trt jt jt j	t j
t jt jfD ]R}| j|d< z|| W n t jk
rz   Y nX | | | W 5 Q R X qDnzttdr| ttjt |  |d | | d ttdr| ttjt |  ts(|d | | d W n t jk
rB   Y nX W 5 z|| W n t jk
rn   Y nX X d S )Nstr)priogetpriorityr`   r   )r2   r3   r@   r   nicer[   r   ZNORMAL_PRIORITY_CLASSZIDLE_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZREALTIME_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZABOVE_NORMAL_PRIORITY_CLASSZsubTestr=   r+  r>   r8  PRIO_PROCESSr?   r   )r5   rC   r   r7  r9   r9   r:   	test_nice  sP    



zTestProcess.test_nicec                 C   s   t  }| | t j d S r0   )r2   r3   r=   statusSTATUS_RUNNINGrB   r9   r9   r:   test_statusC  s    zTestProcess.test_statusc                 C   sd   |   }| }trP|d\}}| |t  dtjkr`| |tjd  n| |t  d S )N\Z
USERDOMAIN)	r;   usernamer   splitr=   getpassZgetuserr>   environ)r5   rC   r@  domainr9   r9   r:   test_usernameG  s    
zTestProcess.test_usernamec                 C   s    |   }| | t  d S r0   )r;   r=   cwdr>   getcwdrB   r9   r9   r:   test_cwdR  s    zTestProcess.test_cwdc                 C   s$   t ddg}| |}t|jd d S )Nr]   z/import os, time; os.chdir('..'); time.sleep(60)z#ret == os.path.dirname(os.getcwd()))r%   r;   r   rF  )r5   rd   rC   r9   r9   r:   
test_cwd_2V  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}|D ]j}||g | | |g ttdr| | tt	|j
 t|dr| | d |  q|g  tr| | |j  n| | | ttdrL| | tt	|j
 | t|jd || |t| |t| d S )Nsched_getaffinityTZpercpunum_cpur   r`   )r2   r3   cpu_affinityr   
addCleanupr+  r>   r=   listrJ  r4   r   r   r~   r}   rL  r   _procZ_get_eligible_cpusr@   r   r   )r5   rC   initialZall_cpusnr9   r9   r:   test_cpu_affinity\  s:    






zTestProcess.test_cpu_affinityc                 C   sp   |   }ttjddd g}| t|j| | t|jtdd | t|jddg | t|jddg d S )	NTrK  
   i'  i*  r   1rs   )	r;   r   r2   r   r@   ru   rM  r~   r   )r5   rC   Zinvalid_cpur9   r9   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dt|d D ](}t||D ]}|rh|	t
| qhqX|D ]&}|| | t| t| qd S )N   r   r`   )r2   r3   rM  r   rN  r   r~   	itertoolscombinationsappendrO  r=   sorted)r5   rC   rQ  Zcombosr   Zsubsetcombor9   r9   r:   "test_cpu_affinity_all_combinations  s    
z.TestProcess.test_cpu_affinity_all_combinationszbroken on BSDzunreliable on APPVEYORc           	   	   C   sT  t  }|  }| }| || t|dt}|d |  t|jdt	| }dd |D }| 
tj|| tr|D ]}|j|kr| |jd qW 5 Q R X |D ]}tj|jst|qd| }| td|g}td	D ]0}d
d | D }||kr q.td q| 
tj|| |D ]}tj|s2t|q2d S )Nr   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzlen(ret) != %ic                 S   s   g | ]}t j|jqS r9   r>   r   r
  r   r9   r9   r:   r     s     z/TestProcess.test_open_files.<locals>.<listcomp>r   z2import time; f = open(r'%s', 'r'); time.sleep(60);r]   r{   c                 S   s   g | ]}t j|jqS r9   r^  r   r9   r9   r:   r     s     rn   )r2   r3   r   
open_filesassertNotInr   r   flushr   r   r   r>   r   r
  r   r=   positionisfiler   r;   r%   r~   rw   sleep)	r5   rC   r   filesr   	filenamesfiler  r   r9   r9   r:   test_open_files  s4    


zTestProcess.test_open_filesc              	   C   s   t  }tjj}|  }t|d}| D ]*}||j||jksR|j	|
 kr, qnq,| dt|   | ||j||j tr| |j	d n| |j	|
  | d }| |d |j | |d |j	 | |j|  W 5 Q R X d S )Nwzno file found; files=%srs   r   r`   )r2   r3   r>   r   r
  r   r   r_  rt   fdfilenorx   reprr=   r   r`  )r5   rC   r
  r   fileobjrg  Zntupler9   r9   r:   test_open_files_2  s$    zTestProcess.test_open_files_2c                 C   s   t  }|  }| }t|d}| |j | | |d  t }| |j | | |d  |  |  | | | d S )Nri  r`   r   )	r2   r3   r   Znum_fdsr   rN  closer=   socket)r5   rC   r   startrg  sockr9   r9   r:   test_num_fds  s    
zTestProcess.test_num_fdsz not reliable on OPENBSD & NETBSDc                 C   sJ   t  }t| }tdD ]}t| }||kr d S q| d d S )Ni  z7num ctx switches still the same after 50.000 iterations)r2   r3   r   Znum_ctx_switchesr~   rx   )r5   rC   beforer   afterr9   r9   r:   test_num_ctx_switches  s    z!TestProcess.test_num_ctx_switchesc                 C   sN   t  }ttdr&| | t  |  }| | t  t	rJd S d S )Ngetppid)
r2   r3   r+  r>   r=   ppidrw  r;   r?   r   rB   r9   r9   r:   	test_ppid  s    
zTestProcess.test_ppidc                 C   sB   |   }| | jt  t d }| t	|  d S r   )
r;   r=   parentr4   r>   r?   r2   pidsassertIsNoner3   )r5   rC   Z
lowest_pidr9   r9   r:   test_parent  s    zTestProcess.test_parentc                 C   s8   t  }|  \}}| | | | | | d S r0   )r2   r3   ro   r=   rz  r5   rz  rp   rq   r9   r9   r:   test_parent_multi  s    zTestProcess.test_parent_multic              	   C   s<   |   }tjdtddd | |  W 5 Q R X d S )Npsutil.Processr   foorT   )r;   r!   rV   r2   rY   r|  rz  rB   r9   r9   r:   test_parent_disappeared  s
    
z#TestProcess.test_parent_disappearedc                 C   s`   t  }| st|  \}}| | d | | | d | | | d | d S r   )r2   r3   parentsr   ro   r=   r~  r9   r9   r:   test_parents  s    zTestProcess.test_parentsc                 C   s   t  }| | g  | |jddg  | jdd}| }|jdd}||fD ]>}| t|d | |d j|j | |d  |j qTd S )NT	recursiver   )creationflagsr`   )r2   r3   r=   childrenr;   r   r4   rx  )r5   rz  rp   Z	children1Z	children2r  r9   r9   r:   test_children%  s    zTestProcess.test_childrenc                 C   sf   t  }|  \}}| | |g | |jdd||g |  |  | |jddg  d S )NTr  )r2   r3   ro   r=   r  rN   rF   r~  r9   r9   r:   test_children_recursive4  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rz| 
dt|}z|jdd	}W n tjk
r   Y nX | t|tt| d S )
Nr`   c                 S   s   | d S )Nr`   r9   )r   r9   r9   r:   <lambda>J      z6TestProcess.test_children_duplicates.<locals>.<lambda>)keyrs   r   zPID 0Tr  )collectionsdefaultdictr  r2   process_iterrx  Errorr[  itemsr   ZskipTestr3   r  r[   r=   r   r   )r5   tablerC   r4   cr9   r9   r:   test_children_duplicatesA  s    


z$TestProcess.test_children_duplicatesc                 C   s|   t  }|  \}}|jdd}| t|d | |d | | |d | | }| |d | | |d | d S )NTr  r   r   r`   )r2   r3   ro   r  r=   r   r  )r5   rz  rp   rq   r  r  r9   r9   r:   test_parents_and_childrenU  s    z%TestProcess.test_parents_and_childrenc                 C   sX   |   }|  tdD ] }| tjkr. q:td q|  | 	| tj d S )Nr{   rn   )
r;   rk   r~   r<  r2   STATUS_STOPPEDrw   rd  rl   assertNotEqual)r5   rC   r   r9   r9   r:   test_suspend_resumeb  s    zTestProcess.test_suspend_resumec                 C   s$   |  ttjd |  ttjd d S )NrU  rs   )r@   r   r2   r3   ru   r5   r9   r9   r:   test_invalid_pidl  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 5 Q R X t
jddt |jdd	 | jt j|jd
gd W 5 Q R X t
jddt |jdd	" | |jd
gddd
di W 5 Q R X t
jddtd	F | }| d
t	|  | t |jd
gd W 5 Q R X W 5 Q R X | t |d W 5 Q R X | t |dg W 5 Q R X | t |ddg W 5 Q R X d S )Nr  rt   )attrsZconnectionsr  )r  Zad_valuezpsutil.Process.niceT)createrU   r9  r`   Zbar)r2   r3   as_dictr=   r[  keysr   r{  
isinstancerO  r!   rV   r[   rY   r4   r@   ZombieProcessNotImplementedErrorr`  r   ru   )r5   rC   dr9   r9   r:   test_as_dictp  sT        "zTestProcess.test_as_dictc              
   C   s   t  }td8}|  |  |  W 5 Q R X | |jd W 5 Q R X td}|  |  W 5 Q R X | |jd d S )N$psutil._psplatform.Process.cpu_timesr`   r   r2   r3   r!   rV   oneshotr   r=   Z
call_countr5   rC   r   r9   r9   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 | |jd W 5 Q R X W 5 Q R X td}|  |  W 5 Q R X | |jd d S )Nr  z(psutil._psplatform.Process.oneshot_enterr`   r   r  )r5   rC   m1m2r   r9   r9   r:   test_oneshot_twice  s    

"zTestProcess.test_oneshot_twicec              	   C   s   |   \}}| }| }| || | & | | | | | | W 5 Q R X | & | | | | | | W 5 Q R X d S r0   )ro   rx  r  r  r=   )r5   p1p2Zp1_ppidZp2_ppidr9   r9   r:   test_oneshot_cache  s    

zTestProcess.test_oneshot_cachec                    s    fdd}   }|  |  tr:ttjd|j   | t	|}|
|jD ]\}}||| qXtrtstjj} || |t d 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  rt   z+%r didn't raise NSP and returned %r instead)r2   r  rY   r[   r   r   rx   )funZfun_namer   r  r9   r:   assert_raises_nsp  s    
zFTestProcess.test_halfway_terminated_process.<locals>.assert_raises_nspz%s not in ret)r;   rN   rF   r   r   r2   r{  r4   rJ   r"   iterallr   r>   r   r
  r=   r  r%   )r5   r  rC   nsr  rt   r
  r9   r  r:   test_halfway_terminated_process  s    
z+TestProcess.test_halfway_terminated_processc                 C   s   dd }|   \}}t|j}| | tj | s>t|	  t
|}||jD ]\}}|| qZt|js|t| |jt  | |jdd t D  i t_| |jdd t D  d S )Nc              	   S   s*   z|  W S  t jt jfk
r$   Y nX d S r0   )r2   r  r[   )r  r9   r9   r:   succeed_or_zombie_p_exc  s    z@TestProcess.test_zombie_process.<locals>.succeed_or_zombie_p_excc                 S   s   g | ]
}|j qS r9   r4   r   r9   r9   r:   r     s     z3TestProcess.test_zombie_process.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r9   r  r   r9   r9   r:   r     s     )Zspawn_zombier2   r3   r4   r=   r<  STATUS_ZOMBIEr  r   r  r"   r  r  
pid_existsr   r{  r  Z_pmap)r5   r  rz  zombieZzprocr  r  rt   r9   r9   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 )Nr  r   rT   )r2   r3   r!   rV   r  r  r   r   r  r9   r9   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 |js:t	W 5 Q R X d S )Nz!psutil._psplatform.Process.statusr   rT   )
r2   r3   r!   rV   r  r=   r<  r  r   r   r  r9   r9   r:    test_zombie_process_status_w_exc'  s    z,TestProcess.test_zombie_process_status_w_excc              	   C   s~  dt  krF| t jt jd t dr,t| t d d d S t d}t	rZt j
nt}| ||j | ||j | ||j | ||j | ||j | ||jtj t|}||j|j D ]\}}z
| }W n t j
k
r   Y qX |dkr| |jd q|dkr>t	r(dnd}| | | q|dkr|st|qtsz| dt   t dsztd S )Nr   r`   )r(  r1  r@  zNT AUTHORITY\SYSTEMrootrt   )r2   r{  r@   rY   r3   r  r   r=   rx  r   r[   ru   rF   rN   rk   rl   rE   rP   rG   rH   r"   r  ZgettersZsettersr-  r@  r   r   )r5   rC   r   r  r  rt   r   r   r9   r9   r:   
test_pid_01  s:    



zTestProcess.test_pid_0c                 C   sH   dd }d | _ t }|| }|tj }tsDtrD| || 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_TESTING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 )rS   
)r  )r   kvr9   r9   r:   r   d  s   z@TestProcess.test_environ.<locals>.clean_dict.<locals>.<listcomp>)popr   dictr  )r  r9   r9   r:   
clean_dictZ  s    z,TestProcess.test_environ.<locals>.clean_dict)	ZmaxDiffr2   r3   rC  r>   copyr	   r   r=   )r5   r  rC   Zd1Zd2r9   r9   r:   test_environX  s    zTestProcess.test_environc                 C   s   t d}|  }t||d | j|gtjtjd}t|j	}t
|j	 | sVt| |j d trtrz| }W q tjk
r   Y d S X n| }| |ddd |  | |jd d S )	Na  
            #include <unistd.h>
            #include <fcntl.h>
            char * const argv[] = {"cat", 0};
            char * const envp[] = {"A=1", "X", "C=3", 0};
            int main(void) {
                /* Close stderr on exec so parent can wait for the execve to
                 * finish. */
                if (fcntl(2, F_SETFD, FD_CLOEXEC) != 0)
                    return 0;
                return execve("/bin/cat", argv, envp);
            }
            )Zc_code)stdinr_   r  rU  3)ACr   )textwrapdedentr   r   r1   rb   rc   r2   r3   r4   r.   r  r   r=   r_   r   r   r   rC  r[   communicate
returncode)r5   rL   r   r8   rC   envr9   r9   r:   test_weird_environo  s*    
  

zTestProcess.test_weird_environN)j__name__
__module____qualname____doc__r;   rD   rM   rO   rR   r-   skipIfr
   r\   re   rm   rr   rv   ry   r   r   r   r   r   r   r   r   r   r+   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r(   r*   r   r   r   r   r   r	  r  r  r  r  r  r$   r  r!  r$  r   r   r%  r0  r5  r;  r>  rE  rH  rI  r   rS  rV  r]  r   r   rh  rn  rs  r   r   rv  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r9   r9   r9   r:   r/   K   s   




)*








-

	








,
'



"


	

.*
$
	
	'
r/   c                       sn   e Zd ZdZeedr&e Ze Z	 fddZ
 fddZ fddZd	d
 Zedddd Z  ZS )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.
        r)  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   r9   r9   r:   r     s     
 z0LimitedUserTestCase.__init__.<locals>.<listcomp>c                    s&   z
   W n t jk
r    Y nX d S r0   )r2   r[   r  methr9   r:   test_  s    
z+LimitedUserTestCase.__init__.<locals>.test_)r   __init__r   r   setattrtypes
MethodType)r5   r6   r7   attrr  	__class__r  r:   r    s
    
zLimitedUserTestCase.__init__c                    s"   t    td td d S )Ni  )r   setUpr>   setegidseteuidr  r  r9   r:   r    s    

zLimitedUserTestCase.setUpc                    s&   t | j t | j t   d S r0   )r>   r  PROCESS_UIDr  PROCESS_GIDr   tearDownr  r  r9   r:   r    s    zLimitedUserTestCase.tearDownc                 C   s8   zt  d W n t jk
r(   Y nX | d d S )Nrs   zexception not raised)r2   r3   r9  r[   rx   r  r9   r9   r:   r;    s
    zLimitedUserTestCase.test_nicer`   zcauses problem as rootc                 C   s   d S r0   r9   r  r9   r9   r:   r    s    z'LimitedUserTestCase.test_zombie_process)r  r  r  r  r+  r>   r)  r  r2  r  r  r  r  r;  r-   r  r  __classcell__r9   r9   r  r:   r    s   

r  c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )	TestPopenzTests for psutil.Popen class.c                 C   s
   t   d S r0   r&   )clsr9   r9   r:   tearDownClass  s    zTestPopen.tearDownClassc              	   C   s   t ddg}tj|tjtjdB}|  |  |j | t	| | 
tt|d |  W 5 Q R X tr| |dtj  n| |dtj d S )Nr]   import time; time.sleep(60);stdoutr_   r  ra   )r%   r2   Popenrb   rc   rt   r   r  Z
assertTruer   r@   rA   r   rN   r
   r=   rF   rG   rH   r5   rd   procr9   r9   r:   	test_misc  s    

zTestPopen.test_miscc              	   C   sf   t jtdgtjtjtjd}|  W 5 Q R X |jjs<t|j	jsHt|j
jsTt| |jd d S )Nz-V)r  r_   r  r   )r2   r  r%   rb   rc   r  r  closedr   r_   r  r=   r  )r5   r  r9   r9   r:   test_ctx_manager  s    
zTestPopen.test_ctx_managerc              	   C   s   t ddg}tj|tjtjd}|  |  | tj|j | tj|j	 | tj|j
tj trtjdkr| tj|j
tj | tj|j
tj W 5 Q R X d S )Nr]   r  r  )r   r   )r%   r2   r  rb   rc   rN   rF   r@   rY   rE   rP   rG   rH   r   r  r  ZCTRL_C_EVENTZCTRL_BREAK_EVENTr  r9   r9   r:   test_kill_terminate  s&    

zTestPopen.test_kill_terminateN)	r  r  r  r  classmethodr  r  r  r  r9   r9   r9   r:   r    s   
r  __main__)run_from_name)Er  r  rX   rB  rX  r>   rG   rp  r   rb   r  r  rw   r  r2   r   r   r   r   r   r   r	   r
   r   r   Zpsutil._commonr   Zpsutil._compatr   r   r   r   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r'   r(   r)   r*   r+   r,   r-   r.   r/   r)  r  r  r  Zpsutil.tests.runnerr  __file__r9   r9   r9   r:   <module>   s             [48
