U
    !hAG                     @   st  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 eoFe oFe 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)
CI_TESTING)PYTEST_PARALLEL)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  kst| jd k	r&| j|ks&tt| tjrd| | jd k	rz| jdksTt| j|ksztnt| tjrz	| t
|  t|  d S Nr   )pidAssertionErrorname
isinstancepsutilZZombieProcessZassert_proc_zombieppidNoSuchProcessassert_proc_gonestrrepr)excprocr   r   )r   tcase C./venv/lib/python3.8/site-packages/psutil/tests/test_process_all.pycheck_exception1   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_wait?   s
    zproc_info.<locals>.do_waitr   r   r   F)Zclear_cache)r   r   Processr   Zassert_pid_goneZas_dictr   r   r   iterZgettersr(   )r   r)   dinfonsZfunZfun_namer!   r$   )r&   r   r   r   r"   r#   r%   	proc_info.   s.    


r/   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%   setUpe   s    
zTestFetchAllProcesses.setUpc                 C   s&   t d tr"| j  | j  d S NT)r   r2   r3   r5   Z	terminatejoinr6   r$   r$   r%   tearDownl   s    

zTestFetchAllProcesses.tearDownc                    s@   ddl m  tr"| j t S  fddt D }|S d S )Nr   r/   c                    s   g | ]} |qS r$   r$   ).0r   r<   r$   r%   
<listcomp>z   s     z8TestFetchAllProcesses.iter_proc_info.<locals>.<listcomp>)Zpsutil.tests.test_process_allr/   r3   r5   Zimap_unorderedr   pids)r7   Zlsr$   r<   r%   iter_proc_infor   s
    z$TestFetchAllProcesses.iter_proc_infoc                 C   s   g }|   D ]}| D ]\}}t| |}z||| W nt tk
r   d}|d||d t||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|rtd
|d S )NzH
======================================================================
z+FAIL: name=test_{}, pid={}, ret={}
info={}
r   zF----------------------------------------------------------------------
c                 s   s   | ]}d | V  qdS )z    Nr$   )r=   ir$   r$   r%   	<genexpr>   s     z1TestFetchAllProcesses.test_all.<locals>.<genexpr>r            )r@   itemsgetattr	Exceptionformatr    	traceback
format_excr:   
splitlinesappendr   r   Zfail)r7   Zfailuresr-   r   valuemethsr$   r$   r%   test_all}   s0    
zTestFetchAllProcesses.test_allc                 C   s*   t |tst|D ]}t |tstqd S N)r   listr   r   )r7   retr-   partr$   r$   r%   cmdline   s    zTestFetchAllProcesses.cmdlinec                 C   s   t |tst| |kst|rtr4|ds4d S tj|sHt|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   stripr   endswithospathisabsr
   isfilehasattrrW   rX   existsr   r7   rT   r-   r$   r$   r%   exe   s    zTestFetchAllProcesses.exec                 C   s   t |tst|dkstd S r   r   intr   ra   r$   r$   r%   r      s    zTestFetchAllProcesses.pidc                 C   s&   t |tst|dkstt| d S r   )r   rd   r   r/   ra   r$   r$   r%   r      s    zTestFetchAllProcesses.ppidc                 C   s>   t |tsttr&|s&t|d r&d S ts:|s:tt|d S )Nr   )r   r   r   r   r   r   r    ra   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   floatr   r   r   ZSTATUS_ZOMBIEtimestrftime	localtimera   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   r   r   rd   )r7   rT   r-   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   r   r   rd   r   r   )r7   rT   r-   gidr$   r$   r%   gids   s
    zTestFetchAllProcesses.gidsc                 C   s.   t |tst| |kst| s*td S rR   )r   r   r   rY   ra   r$   r$   r%   username   s    zTestFetchAllProcesses.usernamec                 C   s6   t |tst|st||dks&t|tks2td S )N?)r   r   r   r   ra   r$   r$   r%   re      s    zTestFetchAllProcesses.statusc                 C   s<   t |st|D ]&}t|ts"t|dkr|dkstqd S )Nr   rk   )r7   rT   r-   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ioclassrd   r   rN   r   ZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_NORMALZIOPRIO_HIGH)r7   rT   r-   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   rd   r   r   r   ra   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   rS   r   r   idZ	user_timeZsystem_timerd   rf   )r7   rT   r-   trs   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   r   r   rf   )r7   rT   r-   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 )NrD   g      Y@r   rf   r   ra   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 )Nrr   r   rw   )r   rd   r   r   r   	cpu_countrS   rangera   r$   r$   r%   cpu_num   s    zTestFetchAllProcesses.cpu_numc                 C   sx   t |st|D ]}t|ts"t|dkstqtrt|j|jksDt|j|jksTt|j	|j
ksdt|j|jksttd S r   )r   r   r   rd   r   Z	peak_wsetZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpeak_pagefileZpagefiler7   rT   r-   rN   r$   r$   r%   memory_info)  s    z!TestFetchAllProcesses.memory_infoc                 C   s   t |stt j}|jD ]J}t||}t|ts8t|dksDtt	st
rV|dkrVq||kst|qt	r||j|jks|td S )Nr   >   vmsdata)r   r   r   Zvirtual_memorytotal_fieldsrG   r   rd   r   r	   ZpssZuss)r7   rT   r-   r   r   rN   r$   r$   r%   memory_full_info4  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 )Nrr   r   >   r+aa+rw)r   rS   r   fdrd   r\   r   rY   r   r   Zpositionmodeflagsr   r[   r]   statFileNotFoundErrorS_ISREGst_mode)r7   rT   r-   fstr$   r$   r%   
open_filesD  s,    

z TestFetchAllProcesses.open_filesc                 C   s   t |tst|dkstd S r   rc   ra   r$   r$   r%   num_fds^  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 rR   )r   lensetr   r   r   )r7   rT   r-   Zconnr$   r$   r%   net_connectionsb  s
    z%TestFetchAllProcesses.net_connectionsc              
   C   s   t |tst| |kst|rtj|s6t|zt|}W nB tk
r } z$t	rht
j|rhn|jtjkrv W 5 d }~X Y nX t|jstd S rR   )r   r   r   rY   r[   r\   r]   r   OSErrorr   r   Z_psplatformZis_permission_errerrnoENOENTS_ISDIRr   )r7   rT   r-   r   errr$   r$   r%   cwdi  s    zTestFetchAllProcesses.cwdc                 C   s0   t |tstd|  kr"dks,n t|d S )Nr   d   r~   ra   r$   r$   r%   memory_percenty  s    z$TestFetchAllProcesses.memory_percentc                 C   s   t |tstd S rR   )r   boolr   ra   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 rR   )r   rS   r   r   r   r   rd   )r7   rT   r-   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 rR   )r   r   typer   r[   r\   r]   r`   ra   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r|dr`q>t	rn|dkrnq>t
j|jst|jq>|dkr|stt|q>|dkrts|stt|q>t |tst|dks>tq>qd S )Nr\   )[zanon_inode:Zpvclockaddrpermsr   )r   r   r   r   r   r\   r   rG   
startswithr   r[   r]   r    r   rd   )r7   rT   r-   ntfnamerN   r$   r$   r%   memory_maps  s&    


z!TestFetchAllProcesses.memory_mapsc                 C   s   t |tst|dkstd S r   rc   ra   r$   r$   r%   num_handles  s    z!TestFetchAllProcesses.num_handlesc                 C   sd   t |tsttr2d|  kr&dks`n t|n.dd ttD }||ksPtt |tjs`td S )Ni   c                 S   s    g | ]}| d rtt|qS )Z_PRIORITY_CLASS)rZ   rG   r   )r=   xr$   r$   r%   r>     s   
z.TestFetchAllProcesses.nice.<locals>.<listcomp>)r   rd   r   r
   dirr   enumIntEnum)r7   rT   r-   Z
prioritiesr$   r$   r%   nice  s     zTestFetchAllProcesses.nicec                 C   s4   t |st|D ]}t|ts"t|dkstqd S r   rk   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   rr   rw   )r   tupler   r   ra   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 rR   )r   dictr   rF   r   )r7   rT   r-   kvr$   r$   r%   environ  s    zTestFetchAllProcesses.environN))__name__
__module____qualname____doc__r8   r;   r@   rQ   rV   rb   r   r   r   rj   rm   ro   rp   re   rt   rv   rx   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   _   sL   		
	r0   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 r1   r   r2   r6   r$   r$   r%   r8     s    zTestPidsRange.setUpc                 C   s   t d d S r9   r   r6   r$   r$   r%   r;     s    zTestPidsRange.tearDownc                 C   s:   dd }dd }t ddD ]}tr,||r,q|| qd S )Nc              
   S   s   zt d|  dd}W n tk
r,   Y dS X |J |D ]6}|dr8t| d }|| k  W  5 Q R  S q8tdW 5 Q R X d S )Nz/proc/z/statusrbFs   Tgid:rw   z'Tgid' line not found)openr   r   rd   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   rw   r   )r   Z
pid_existsr*   r   r?   r   r   r   Zraisesr   r(   )r   r   r`   r$   r$   r%   check  s"    

z$TestPidsRange.test_it.<locals>.checkrw   i  )r   r   )r7   r   r   r   r$   r$   r%   test_it  s    zTestPidsRange.test_itN)r   r   r   r   r8   r;   r   r$   r$   r$   r%   r     s   r   )"r   r   r   r4   r[   r   rg   rJ   r   r   r   r   r   r   r   r   r	   r
   r   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r3   r/   r0   r   r$   r$   r$   r%   <module>   sD   1  n