U
    ;gH                     @   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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# eoe oe Z$dd Z%G dd deZ&G d d! d!eZ'dS )"zeIterate over all process PIDs and for each one of them invoke and
test all psutil.Process() methods.
    N)AIX)BSD)FREEBSD)LINUX)MACOS)NETBSD)OPENBSD)OSX)POSIX)WINDOWS)PY3)FileNotFoundError)long)unicode)
CI_TESTING)PYTEST_PARALLEL)	QEMU_USER)VALID_PROC_STATUSES)PsutilTestCase)check_connection_ntuple)create_sockets)is_namedtuple)is_win_secure_system_proc)process_namespace)pytestc                    s(  t  fdd  fdd}ztW n$ tjk
rZ    i  Y S X zddg}W n  tjk
r    Y nX |d |d  dji}t}|j	|j
dd	D ]T\}}z| ||< W q tjk
r } z | W Y qW 5 d }~X Y qX q|  |S d S )
Nc                    s    | j  | jd k	r& | j| t| tjrd| | jd k	rz| jd  | j| nt| tj	rz
| t|  t|  d S Nr   )assertEqualpidname
isinstancepsutilZZombieProcessZassertProcessZombieppidZassertGreaterEqualNoSuchProcessassertProcessGonestrrepr)excprocr   r!   )r   tcase A/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_process_all.pycheck_exception7   s    



z"proc_info.<locals>.check_exceptionc               
      sN   dkrJz d W n2 tjk
rH }  z |  W 5 d } ~ X Y nX d S r   )waitr    Error)r&   )r+   r   r   r!   r'   r)   r*   do_waitE   s
    zproc_info.<locals>.do_waitr!   r   r   F)clear_cache)r   r    Processr"   ZassertPidGoneZas_dictr#   r   r   iterZgettersr-   )r   r.   dinfonsZfunZfun_namer&   r)   )r+   r   r   r!   r'   r(   r*   	proc_info4   s.    


r5   c                   @   s8  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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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLS )MTestFetchAllProcesseszTest which iterates over all running processes and performs
    some sanity checks against Process API's returned values.
    Uses a process pool to get info about all processes.
    c                 C   s   t d trt | _d S NF)r    
_set_debugUSE_PROC_POOLmultiprocessingZPoolpoolselfr)   r)   r*   setUpk   s    
zTestFetchAllProcesses.setUpc                 C   s&   t d tr"| j  | j  d S NT)r    r8   r9   r;   	terminatejoinr<   r)   r)   r*   tearDownr   s    

zTestFetchAllProcesses.tearDownc                 C   sJ   ddl m} tr"| j|t S g }t D ]}||| q.|S d S )Nr   )r5   )Zpsutil.tests.test_process_allr5   r9   r;   Zimap_unorderedr    pidsappend)r=   r5   Zlsr   r)   r)   r*   iter_proc_infox   s    z$TestFetchAllProcesses.iter_proc_infoc                 C   s   g }|   D ]}| D ]\}}t| |}z||| W nr tk
r   d}|d||d t||f 7 }|d7 }|dt  7 }ddd | D d }|	| Y qX |d	d
g d di fkr|st
|qq|r| d|d S )NzH
======================================================================
z+FAIL: name=test_%s, pid=%s, ret=%s
info=%s
r   zF----------------------------------------------------------------------z
%s
c                 s   s   | ]}d | V  qdS )z    Nr)   ).0ir)   r)   r*   	<genexpr>   s     z1TestFetchAllProcesses.test_all.<locals>.<genexpr>r            )rE   itemsgetattr	Exceptionr%   	traceback
format_excrA   
splitlinesrD   AssertionErrorZfail)r=   Zfailuresr3   r   valuemethsr)   r)   r*   test_all   s,    
zTestFetchAllProcesses.test_allc                 C   s*   t |tst|D ]}t |tstqd S N)r   listrR   r$   )r=   retr3   partr)   r)   r*   cmdline   s    zTestFetchAllProcesses.cmdlinec                 C   s   t |ttfst| |ks"t|rtr8|ds8d S tj	|sLt|t
rtj|rttdrttdrzt|tjstW n& tk
r   tj|rts Y nX d S )Nz.exeaccessX_OK)r   r$   r   rR   stripr   endswithospathisabsr
   isfilehasattrr\   r]   existsr   r=   rY   r3   r)   r)   r*   exe   s    zTestFetchAllProcesses.exec                 C   s   t |tst|dkstd S r   r   intrR   rf   r)   r)   r*   r      s    zTestFetchAllProcesses.pidc                 C   s*   t |ttfst|dkstt| d S r   )r   ri   r   rR   r5   rf   r)   r)   r*   r!      s    zTestFetchAllProcesses.ppidc                 C   sB   t |ttfsttr*|s*t|d r*d S ts>|s>tt|d S )Nr   )r   r$   r   rR   r   r   r   r%   rf   r)   r)   r*   r      s
    zTestFetchAllProcesses.namec                 C   s`   t |tstz|dkstW n* tk
rH   trB|d tjkrBn Y nX tdt| d S )Nr   statusz%Y %m %d %H:%M:%S)	r   floatrR   r   r    ZSTATUS_ZOMBIEtimestrftime	localtimerf   r)   r)   r*   create_time   s    z!TestFetchAllProcesses.create_timec                 C   s4   t |st|D ]}t|ts"t|dkstqd S r   )r   rR   r   ri   )r=   rY   r3   uidr)   r)   r*   uids   s    zTestFetchAllProcesses.uidsc                 C   s<   t |st|D ]&}t|ts"ttsts|dkstqd S r   )r   rR   r   ri   r   r   )r=   rY   r3   gidr)   r)   r*   gids   s
    zTestFetchAllProcesses.gidsc                 C   s.   t |tst| |kst| s*td S rW   )r   r$   rR   r^   rf   r)   r)   r*   username   s    zTestFetchAllProcesses.usernamec                 C   s>   t |tst|st|tr"d S |dks.t|tks:td S )N?)r   r$   rR   r   r   rf   r)   r)   r*   rj      s    zTestFetchAllProcesses.statusc                 C   s@   t |st|D ]*}t|ttfs&t|dkr|dkstqd S )Nr   r   rR   r   ri   r   )r=   rY   r3   fieldr)   r)   r*   io_counters   s
    z!TestFetchAllProcesses.io_countersc                 C   s   t rBt|jtstt|jts$t|jdks2t|jdks|tn:tjtjtj	tj
g}t|tsdt|dkspt||ks|td S r   )r   r   Zioclassri   rR   rS   r    ZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_NORMALZIOPRIO_HIGH)r=   rY   r3   choicesr)   r)   r*   ionice   s    zTestFetchAllProcesses.ionicec                 C   s:   t |tsttr*|dkr*t|d r*d S |dks6td S )Nr   r      )r   ri   rR   r   r   rf   r)   r)   r*   num_threads  s    z!TestFetchAllProcesses.num_threadsc                 C   sn   t |tst|D ]V}t|s"t|jdks0t|jdks>t|jdksLt|D ]}t |ttfsPtqPqd S r   )	r   rX   rR   r   idZ	user_timeZsystem_timeri   rk   )r=   rY   r3   trx   r)   r)   r*   threads  s    zTestFetchAllProcesses.threadsc                 C   s4   t |st|D ]}t|ts"t|dkstqd S r   )r   rR   r   rk   )r=   rY   r3   nr)   r)   r*   	cpu_times  s    zTestFetchAllProcesses.cpu_timesc                 C   s0   t |tstd|  kr"dks,n t|d S )NrJ   g      Y@r   rk   rR   rf   r)   r)   r*   cpu_percent%  s    z!TestFetchAllProcesses.cpu_percentc                 C   s^   t |tsttr|dkrd S |dks*tt dkrB|dksBt|ttt ksZtd S )Nrv   r   r|   )r   ri   rR   r   r    	cpu_countrX   rangerf   r)   r)   r*   cpu_num)  s    zTestFetchAllProcesses.cpu_numc                 C   s|   t |st|D ]"}t|ttfs&t|dkstqtrx|j|jksHt|j|j	ksXt|j
|jksht|j|jksxtd S r   )r   rR   r   ri   r   r   Z	peak_wsetZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpeak_pagefileZpagefiler=   rY   r3   rS   r)   r)   r*   memory_info2  s    z!TestFetchAllProcesses.memory_infoc                 C   s   t |stt j}|jD ]N}t||}t|tt	fs<t|dksHtt
strZ|dkrZq||kst|qt
r|j|jkstd S )Nr   )Zvmsdata)r   rR   r    Zvirtual_memorytotal_fieldsrM   r   ri   r   r   r	   ZpssZuss)r=   rY   r3   r   r   rS   r)   r)   r*   memory_full_info=  s    


z&TestFetchAllProcesses.memory_full_infoc              	   C   s$  t |tst|D ]
}t |jts(tt |jts8t|j |jksLttr`|jdkstnlt	rt |j
tsttt |jtstt |jtst|j
dkst|jdkst|jdkstntr|jsqtj|jst|zt|j}W n tk
r   Y qX t|jst|qd S )Nrv   r   )rwazr+za+)r   rX   rR   fdri   ra   r$   r^   r   r   positionmodeflagsr   r`   rb   statr   S_ISREGst_mode)r=   rY   r3   fstr)   r)   r*   
open_filesM  s,    

z TestFetchAllProcesses.open_filesc                 C   s   t |tst|dkstd S r   rh   rf   r)   r)   r*   num_fdsg  s    zTestFetchAllProcesses.num_fdsc              	   C   sL   t  < t|tt|ks t|D ]}t|s4tt| q$W 5 Q R X d S rW   )r   lensetrR   r   r   )r=   rY   r3   connr)   r)   r*   net_connectionsk  s
    z%TestFetchAllProcesses.net_connectionsc              
   C   s   t |ttfst| |ks"t|rtj|s:t|zt|}W nB t	k
r } z$t
rltj|rln|jtjkrz W 5 d }~X Y nX t|jstd S rW   )r   r$   r   rR   r^   r`   ra   rb   r   OSErrorr   r    Z_psplatformZis_permission_errerrnoENOENTS_ISDIRr   )r=   rY   r3   r   errr)   r)   r*   cwdr  s    zTestFetchAllProcesses.cwdc                 C   s0   t |tstd|  kr"dks,n t|d S )Nr   d   r   rf   r)   r)   r*   memory_percent  s    z$TestFetchAllProcesses.memory_percentc                 C   s   t |tstd S rW   )r   boolrR   rf   r)   r)   r*   
is_running  s    z TestFetchAllProcesses.is_runningc                 C   sR   t |tst|g kstttt }|D ]}t |ts@t||ks.tq.d S rW   )r   rX   rR   r   r    r   ri   )r=   rY   r3   Zcpusr   r)   r)   r*   cpu_affinity  s    z"TestFetchAllProcesses.cpu_affinityc                 C   sJ   t |ttd fst|d k	rFtj|s2t|tj|sFt|d S rW   )r   r$   typerR   r`   ra   rb   re   rf   r)   r)   r*   terminal  s    zTestFetchAllProcesses.terminalc                 C   s   |D ]}t |jtstt |jts(tt |jts8t|jD ]}t||}|dkrx|dst	j
|jst|jq>|dkr|stt|q>|dkrts|stt|q>t |ttfst|dks>tq>qd S )Nra   )[zanon_inode:addrpermsr   )r   r   r$   rR   r   ra   r   rM   
startswithr`   rb   r%   r   ri   r   )r=   rY   r3   ntfnamerS   r)   r)   r*   memory_maps  s     


z!TestFetchAllProcesses.memory_mapsc                 C   s   t |tst|dkstd S r   rh   rf   r)   r)   r*   num_handles  s    z!TestFetchAllProcesses.num_handlesc                 C   sx   t |tsttr2d|  kr&dkstn t|nBdd ttD }||ksPttrft |tjsttnt |tsttd S )Ni   c                 S   s    g | ]}| d rtt|qS )Z_PRIORITY_CLASS)r_   rM   r    )rG   xr)   r)   r*   
<listcomp>  s   
z.TestFetchAllProcesses.nice.<locals>.<listcomp>)	r   ri   rR   r
   dirr    r   enumIntEnum)r=   rY   r3   Z
prioritiesr)   r)   r*   nice  s     zTestFetchAllProcesses.nicec                 C   s8   t |st|D ]"}t|ttfs&t|dkstqd S r   rw   r   r)   r)   r*   num_ctx_switches  s    z&TestFetchAllProcesses.num_ctx_switchesc                 C   sB   t |tstt|dkst|d dks.t|d dks>td S )N   r   rv   r|   )r   tuplerR   r   rf   r)   r)   r*   rlimit  s    zTestFetchAllProcesses.rlimitc                 C   s@   t |tst| D ]$\}}t |ts,tt |tstqd S rW   )r   dictrR   rL   r$   )r=   rY   r3   kvr)   r)   r*   environ  s    zTestFetchAllProcesses.environN))__name__
__module____qualname____doc__r>   rB   rE   rV   r[   rg   r   r!   r   ro   rq   rs   rt   rj   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*   r6   e   sL   			
	r6   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestPidsRangea@  Given pid_exists() return value for a range of PIDs which may or
    may not exist, make sure that psutil.Process() and psutil.pids()
    agree with pid_exists(). This guarantees that the 3 APIs are all
    consistent with each other. See:
    https://github.com/giampaolo/psutil/issues/2359

    XXX - Note about Windows: it turns out there are some "hidden" PIDs
    which are not returned by psutil.pids() and are also not revealed
    by taskmgr.exe and ProcessHacker, still they can be instantiated by
    psutil.Process() and queried. One of such PIDs is "conhost.exe".
    Running as_dict() for it reveals that some Process() APIs
    erroneously raise NoSuchProcess, so we know we have problem there.
    Let's ignore this for now, since it's quite a corner case (who even
    imagined hidden PIDs existed on Windows?).
    c                 C   s   t d d S r7   r    r8   r<   r)   r)   r*   r>     s    zTestPidsRange.setUpc                 C   s   t d d S r?   r   r<   r)   r)   r*   rB     s    zTestPidsRange.tearDownc              
   C   sR   dd }dd }t ddD ]2}tr,||r,q| j|d || W 5 Q R X qd S )Nc              
   S   s   zt d|  d}W n tk
r(   Y dS X |J |D ]6}|dr4t| d }|| k  W  5 Q R  S q4tdW 5 Q R X d S )Nz/proc/%s/statusrbFs   Tgid:r|   z'Tgid' line not found)openr   r   ri   split
ValueError)r   r   lineZtgidr)   r)   r*   is_linux_tid  s    
z+TestPidsRange.test_it.<locals>.is_linux_tidc              	   S   s   d}t | }zb|r4t |  tsn| t  ksntn:tsZtt j	 t |  W 5 Q R X tsn| t  ksntW n, t j
tfk
r   |d8 }|dkr Y qX d S qd S )N   r|   r   )r    Z
pid_existsr0   r   rC   rR   r   r   Zraisesr"   r-   )r   r   re   r)   r)   r*   check  s"    

z$TestPidsRange.test_it.<locals>.checkr|   i  )r   )r   r   ZsubTest)r=   r   r   r   r)   r)   r*   test_it  s    zTestPidsRange.test_itN)r   r   r   r   r>   rB   r   r)   r)   r)   r*   r     s   r   )(r   r   r   r:   r`   r   rl   rO   r    r   r   r   r   r   r   r   r	   r
   r   Zpsutil._compatr   r   r   r   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r9   r5   r6   r   r)   r)   r)   r*   <module>   sN   1  q