a
    QIhG                     @   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yX    i  Y S 0 zddg}W n tjy    Y n0 |d |d  dji}t}|j	|j
dd	D ]Z\}}z| ||< W q tjy } z& | W Y d }~qW Y d }~qd }~0 0 q|  |S d S )
Nc                    s    | j  | jd ur& | j| t| tjrd| | jd u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 W/var/www/html/venv_bot_3.9/lib/python3.9/site-packages/psutil/tests/test_process_all.pycheck_exception2   s    



z"proc_info.<locals>.check_exceptionc               
      sP   dkrLz d W n4 tjyJ }  z |  W Y d } ~ n
d } ~ 0 0 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)clear_cache)r   r   Processr   ZassertPidGone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.    


$r1   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%   setUpf   s    
zTestFetchAllProcesses.setUpc                 C   s&   t d tr"| j  | j  d S NT)r   r4   r5   r7   	terminatejoinr8   r$   r$   r%   tearDownm   s    

zTestFetchAllProcesses.tearDownc                    s@   ddl m  tr"| j t S  fddt D }|S d S )Nr   r1   c                    s   g | ]} |qS r$   r$   ).0r   r?   r$   r%   
<listcomp>{       z8TestFetchAllProcesses.iter_proc_info.<locals>.<listcomp>)Zpsutil.tests.test_process_allr1   r5   r7   Zimap_unorderedr   pids)r9   Zlsr$   r?   r%   iter_proc_infos   s
    z$TestFetchAllProcesses.iter_proc_infoc                 C   s   g }|   D ]}| D ]\}}t| |}z||| W nr ty   d}|d||d t||7 }|d7 }|dt  7 }ddd |	 D d }|
| Y q0 |dd	g d d
i fvr|sJ |qq|r| 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>   rB   z1TestFetchAllProcesses.test_all.<locals>.<genexpr>r            )rD   itemsgetattr	Exceptionformatr    	traceback
format_excr=   
splitlinesappendZfail)r9   Zfailuresr/   r   valuemethsr$   r$   r%   test_all~   s0    
zTestFetchAllProcesses.test_allc                 C   s*   t |tsJ |D ]}t |tsJ qd S N)r   listr   )r9   retr/   partr$   r$   r%   cmdline   s    zTestFetchAllProcesses.cmdlinec                 C   s   t |tsJ | |ksJ |rtr4|ds4d S tj|sHJ |trtj	|rt
tdrt
tdrzt|tjsJ W n$ ty   tj|rts Y n0 d S )Nz.exeaccessX_OK)r   r   stripr   endswithospathisabsr
   isfilehasattrr[   r\   AssertionErrorexistsr   r9   rX   r/   r$   r$   r%   exe   s    zTestFetchAllProcesses.exec                 C   s   t |tsJ |dksJ d S r   r   intrf   r$   r$   r%   r      s    zTestFetchAllProcesses.pidc                 C   s&   t |tsJ |dksJ t| d S r   )r   ri   r1   rf   r$   r$   r%   r      s    zTestFetchAllProcesses.ppidc                 C   s>   t |tsJ tr&|s&t|d r&d S ts:|s:J t|d S )Nr   )r   r   r   r   r   r    rf   r$   r$   r%   r      s
    zTestFetchAllProcesses.namec                 C   s^   t |tsJ z|dksJ W n( tyF   tr@|d tjkr@n Y n0 tdt| d S )Nr   statusz%Y %m %d %H:%M:%S)	r   floatrd   r   r   ZSTATUS_ZOMBIEtimestrftime	localtimerf   r$   r$   r%   create_time   s    z!TestFetchAllProcesses.create_timec                 C   s4   t |sJ |D ]}t|ts"J |dksJ qd S r   r   r   ri   )r9   rX   r/   uidr$   r$   r%   uids   s    zTestFetchAllProcesses.uidsc                 C   s<   t |sJ |D ]&}t|ts"J tsts|dksJ qd S r   )r   r   ri   r   r   )r9   rX   r/   gidr$   r$   r%   gids   s
    zTestFetchAllProcesses.gidsc                 C   s.   t |tsJ | |ksJ | s*J d S rV   )r   r   r]   rf   r$   r$   r%   username   s    zTestFetchAllProcesses.usernamec                 C   s6   t |tsJ |sJ ||dks&J |tv s2J d S )N?)r   r   r   rf   r$   r$   r%   rj      s    zTestFetchAllProcesses.statusc                 C   s<   t |sJ |D ]&}t|ts"J |dkr|dksJ qd S )Nr   rp   )r9   rX   r/   fieldr$   r$   r%   io_counters   s
    z!TestFetchAllProcesses.io_countersc                 C   s   t rBt|jtsJ t|jts$J |jdks2J |jdks|J n:tjtjtjtj	g}t|tsdJ |dkspJ ||v s|J d S r   )
r   r   Zioclassri   rR   r   ZIOPRIO_VERYLOWZ
IOPRIO_LOWZIOPRIO_NORMALZIOPRIO_HIGH)r9   rX   r/   choicesr$   r$   r%   ionice   s    zTestFetchAllProcesses.ionicec                 C   s:   t |tsJ tr*|dkr*t|d r*d S |dks6J d S )Nr   r      )r   ri   r   r   rf   r$   r$   r%   num_threads  s    z!TestFetchAllProcesses.num_threadsc                 C   sn   t |tsJ |D ]V}t|s"J |jdks0J |jdks>J |jdksLJ |D ]}t |ttfsPJ qPqd S r   )r   rW   r   idZ	user_timeZsystem_timeri   rk   )r9   rX   r/   trx   r$   r$   r%   threads  s    zTestFetchAllProcesses.threadsc                 C   s4   t |sJ |D ]}t|ts"J |dksJ qd S r   )r   r   rk   )r9   rX   r/   nr$   r$   r%   	cpu_times  s    zTestFetchAllProcesses.cpu_timesc                 C   s0   t |tsJ d|  kr"dks,n J |d S )NrH   g      Y@r   rk   rf   r$   r$   r%   cpu_percent  s    z!TestFetchAllProcesses.cpu_percentc                 C   s^   t |tsJ tr|dkrd S |dks*J t dkrB|dksBJ |ttt v sZJ d S )Nrw   r   r|   )r   ri   r   r   	cpu_countrW   rangerf   r$   r$   r%   cpu_num!  s    zTestFetchAllProcesses.cpu_numc                 C   sx   t |sJ |D ]}t|ts"J |dksJ qtrt|j|jksDJ |j|jksTJ |j|j	ksdJ |j
|jkstJ d S r   )r   r   ri   r   Z	peak_wsetZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpeak_pagefileZpagefiler9   rX   r/   rR   r$   r$   r%   memory_info*  s    z!TestFetchAllProcesses.memory_infoc                 C   s   t |sJ t j}|jD ]J}t||}t|ts8J |dksDJ tst	rV|dv rVq||ksJ |qtr||j
|jks|J d S )Nr   >   dataZvms)r   r   Zvirtual_memorytotal_fieldsrK   r   ri   r   r	   ZpssZuss)r9   rX   r/   r   r   rR   r$   r$   r%   memory_full_info5  s    


z&TestFetchAllProcesses.memory_full_infoc              	   C   s"  t |tsJ |D ]}t |jts(J t |jts8J |j |jksLJ tr`|jdksJ nltrt |j	tstJ t |j
tsJ t |jtsJ |j	dksJ |j
dv sJ |jdksJ ntr|jsqtj|jsJ |zt|j}W n ty   Y q0 t|jsJ |qd S )Nrw   r   >   wzr+rza+a)r   rW   fdri   r`   r   r]   r   r   positionmodeflagsr   r_   ra   statFileNotFoundErrorS_ISREGst_mode)r9   rX   r/   fstr$   r$   r%   
open_filesE  s,    

z TestFetchAllProcesses.open_filesc                 C   s   t |tsJ |dksJ d S r   rh   rf   r$   r$   r%   num_fds_  s    zTestFetchAllProcesses.num_fdsc                 C   s`   t  F t|tt|ks J |D ]}t|s4J t| q$W d    n1 sR0    Y  d S rV   )r   lensetr   r   )r9   rX   r/   connr$   r$   r%   net_connectionsc  s
    z%TestFetchAllProcesses.net_connectionsc              
   C   s   t |tsJ | |ksJ |rtj|s6J |zt|}W nD ty } z,trft	j
|rfn|jtjkrt W Y d }~nd }~0 0 t|jsJ d S rV   )r   r   r]   r_   r`   ra   r   OSErrorr   r   Z_psplatformZis_permission_errerrnoENOENTS_ISDIRr   )r9   rX   r/   r   errr$   r$   r%   cwdj  s    zTestFetchAllProcesses.cwdc                 C   s0   t |tsJ d|  kr"dks,n J |d S )Nr   d   r   rf   r$   r$   r%   memory_percentz  s    z$TestFetchAllProcesses.memory_percentc                 C   s   t |tsJ d S rV   )r   boolrf   r$   r$   r%   
is_running~  s    z TestFetchAllProcesses.is_runningc                 C   sR   t |tsJ |g ksJ ttt }|D ]}t |ts@J ||v s.J q.d S rV   )r   rW   r   r   r   ri   )r9   rX   r/   Zcpusr   r$   r$   r%   cpu_affinity  s    z"TestFetchAllProcesses.cpu_affinityc                 C   sJ   t |ttd fsJ |d urFtj|s2J |tj|sFJ |d S rV   )r   r   typer_   r`   ra   re   rf   r$   r$   r%   terminal  s    zTestFetchAllProcesses.terminalc                 C   s   |D ]}t |jtsJ t |jts(J t |jts8J |jD ]}t||}|dkr|dr`q>trn|dkrnq>t	j
|jsJ |jq>|dkr|sJ t|q>|dkrts|sJ t|q>t |tsJ |dks>J q>qd S )Nr`   )[zanon_inode:Zpvclockaddrpermsr   )r   r   r   r   r`   r   rK   
startswithr   r_   ra   r    r   ri   )r9   rX   r/   ntfnamerR   r$   r$   r%   memory_maps  s&    


z!TestFetchAllProcesses.memory_mapsc                 C   s   t |tsJ |dksJ d S r   rh   rf   r$   r$   r%   num_handles  s    z!TestFetchAllProcesses.num_handlesc                 C   sd   t |tsJ tr2d|  kr&dks`n J |n.dd ttD }||v sPJ t |tjs`J d S )Ni   c                 S   s    g | ]}| d rtt|qS )Z_PRIORITY_CLASS)r^   rK   r   )r@   xr$   r$   r%   rA     s   
z.TestFetchAllProcesses.nice.<locals>.<listcomp>)r   ri   r
   dirr   enumIntEnum)r9   rX   r/   Z
prioritiesr$   r$   r%   nice  s     zTestFetchAllProcesses.nicec                 C   s4   t |sJ |D ]}t|ts"J |dksJ qd S r   rp   r   r$   r$   r%   num_ctx_switches  s    z&TestFetchAllProcesses.num_ctx_switchesc                 C   sB   t |tsJ t|dksJ |d dks.J |d dks>J d S )N   r   rw   r|   )r   tupler   rf   r$   r$   r%   rlimit  s    zTestFetchAllProcesses.rlimitc                 C   s@   t |tsJ | D ]$\}}t |ts,J t |tsJ qd S rV   )r   dictrJ   r   )r9   rX   r/   kvr$   r$   r%   environ  s    zTestFetchAllProcesses.environN))__name__
__module____qualname____doc__r:   r>   rD   rU   rZ   rg   r   r   r   ro   rr   rt   ru   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%   r2   `   sL   		
	r2   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 r3   r   r4   r8   r$   r$   r%   r:     s    zTestPidsRange.setUpc                 C   s   t d d S r;   r   r8   r$   r$   r%   r>     s    zTestPidsRange.tearDownc              	   C   sf   dd }dd }t ddD ]F}tr,||r,q| j|d || W d    q1 sV0    Y  qd S )Nc                 S   s   zt d|  dd}W n ty*   Y dS 0 |V |D ]8}|dr6t| d }|| k  W  d    S q6tdW d    n1 s0    Y  d S )Nz/proc/z/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 | }zv|r4t |  ts| t  v sJ nNtsntt j t |  W d    n1 sd0    Y  ts| t  vsJ W n* t j	t
fy   |d8 }|dkr Y q0 d S qd S )N   r|   r   )r   Z
pid_existsr+   r   rC   r   r   Zraisesr   r(   rd   )r   r   re   r$   r$   r%   check  s"    

(z$TestPidsRange.test_it.<locals>.checkr|   i  )r   )r   r   ZsubTest)r9   r   r   r   r$   r$   r%   test_it  s    zTestPidsRange.test_itN)r   r   r   r   r:   r>   r   r$   r$   r$   r%   r     s   r   )"r   r   r   r6   r_   r   rl   rN   r   r   r   r   r   r   r   r   r	   r
   r   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r5   r1   r2   r   r$   r$   r$   r%   <module>   sD   1  n