o
    hG                     @   sp  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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)
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y,    i  Y S w z	ddg}W n tjyF    Y d S w |d |d dji}t}|j	|j
dd	D ]%\}}z| ||< W qa tjy } z | W Y d }~qad }~ww |  |S )
Nc                    s    | j  | jd ur | j| t| tjr2| | jd ur1| jd  | j| nt| tj	r=
| t|  t|  d S Nr   )assertEqualpidname
isinstancepsutilZombieProcessassertProcessZombieppidassertGreaterEqualNoSuchProcessassertProcessGonestrrepr)excprocr   r   )r   tcase Q/var/www/vscode/kcb/lib/python3.10/site-packages/psutil/tests/test_process_all.pycheck_exception2   s   



z"proc_info.<locals>.check_exceptionc               
      sT   dkr(z d W d S  tjy' }  z |  W Y d } ~ d S d } ~ ww 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    assertPidGoneas_dictr!   r   r   itergettersr+   )r   r,   dinfonsfunfun_namer$   r'   )r)   r   r   r   r%   r&   r(   	proc_info/   s6   

r8   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 d S NF)r   
_set_debugUSE_PROC_POOLmultiprocessingPoolpoolselfr'   r'   r(   setUpf   s   
zTestFetchAllProcesses.setUpc                 C   s*   t d tr| j  | j  d S d S NT)r   r;   r<   r?   	terminatejoinr@   r'   r'   r(   tearDownm   s
   

zTestFetchAllProcesses.tearDownc                    s<   ddl m  tr| j t S  fddt D }|S )Nr   r8   c                    s   g | ]} |qS r'   r'   ).0r   rG   r'   r(   
<listcomp>{   s    z8TestFetchAllProcesses.iter_proc_info.<locals>.<listcomp>)psutil.tests.test_process_allr8   r<   r?   imap_unorderedr   pids)rA   lsr'   rG   r(   iter_proc_infos   s
   z$TestFetchAllProcesses.iter_proc_infoc                 C   s   g }|   D ]a}| D ]Z\}}t| |}z||| W n9 tyU   d}|d||d t||7 }|d7 }|dt  7 }ddd |	 D d }|
| Y qw |dd	g d d
i fvrf|sfJ |qq|rr| d
|d S )NzH
======================================================================
z+FAIL: name=test_{}, pid={}, ret={}
info={}
r   zF----------------------------------------------------------------------
c                 s   s    | ]}d | V  qdS )z    Nr'   )rH   ir'   r'   r(   	<genexpr>   s    z1TestFetchAllProcesses.test_all.<locals>.<genexpr>r            )rN   itemsgetattr	Exceptionformatr#   	traceback
format_excrE   
splitlinesappendfail)rA   failuresr4   r   valuemethsr'   r'   r(   test_all~   s8   
zTestFetchAllProcesses.test_allc                 C   s*   t |tsJ |D ]	}t |tsJ q	d S N)r   listr"   )rA   retr4   partr'   r'   r(   cmdline   s   zTestFetchAllProcesses.cmdlinec                 C   s   t |tsJ | |ksJ |rYtr|dsd S tj|s$J |tr[tj	|r]t
tdr_t
tdrazt|tjs@J W d S  tyX   tj|rRtsU Y d S Y d S w d S d S d S d S d S )Nz.exeaccessX_OK)r   r"   stripr   endswithospathisabsr
   isfilehasattrrg   rh   AssertionErrorexistsr   rA   rd   r4   r'   r'   r(   exe   s$   zTestFetchAllProcesses.exec                 C      t |tsJ |dksJ d S r   r   intrr   r'   r'   r(   r         zTestFetchAllProcesses.pidc                 C   s&   t |tsJ |dksJ t| d S r   )r   rv   r8   rr   r'   r'   r(   r      s   zTestFetchAllProcesses.ppidc                 C   sB   t |tsJ tr|st|d rd S ts|sJ t|d S d S )Nr   )r   r"   r   r   r   r#   rr   r'   r'   r(   r      s   zTestFetchAllProcesses.namec                 C   s^   t |tsJ z|dksJ W n ty#   tr |d tjkr n Y nw tdt| d S )Nr   statusz%Y %m %d %H:%M:%S)	r   floatrp   r   r   STATUS_ZOMBIEtimestrftime	localtimerr   r'   r'   r(   create_time   s   
z!TestFetchAllProcesses.create_timec                 C   4   t |sJ |D ]}t|tsJ |dksJ qd S r   r   r   rv   )rA   rd   r4   uidr'   r'   r(   uids   
   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   rv   r   r   )rA   rd   r4   gidr'   r'   r(   gids   s   zTestFetchAllProcesses.gidsc                 C   s.   t |tsJ | |ksJ | sJ d S rb   )r   r"   ri   rr   r'   r'   r(   username   s   zTestFetchAllProcesses.usernamec                 C   s6   t |tsJ |sJ ||dksJ |tv sJ d S )N?)r   r"   r   rr   r'   r'   r(   rx      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   r   )rA   rd   r4   fieldr'   r'   r(   io_counters   s   z!TestFetchAllProcesses.io_countersc                 C   s   t r"t|jts
J t|jtsJ |jdksJ |jdks J d S tjtjtjtj	g}t|ts3J |dks9J ||v s?J d S r   )
r   r   ioclassrv   r^   r   IOPRIO_VERYLOW
IOPRIO_LOWIOPRIO_NORMALIOPRIO_HIGH)rA   rd   r4   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sJ d S )Nr   r      )r   rv   r   r   rr   r'   r'   r(   num_threads  s   z!TestFetchAllProcesses.num_threadsc                 C   sn   t |tsJ |D ]+}t|sJ |jdksJ |jdksJ |jdks&J |D ]}t |ttfs3J q(q	d S r   )r   rc   r   id	user_timesystem_timerv   ry   )rA   rd   r4   tr   r'   r'   r(   threads  s   zTestFetchAllProcesses.threadsc                 C   r   r   )r   r   ry   )rA   rd   r4   nr'   r'   r(   	cpu_times  r   zTestFetchAllProcesses.cpu_timesc                 C   6   t |tsJ d|  krdksJ | J |d S )NrR   g      Y@r   ry   rr   r'   r'   r(   cpu_percent     (z!TestFetchAllProcesses.cpu_percentc                 C   s^   t |tsJ tr|dkrd S |dksJ t dkr!|dks!J |ttt v s-J d S )Nr   r   r   )r   rv   r   r   	cpu_countrc   rangerr   r'   r'   r(   cpu_num!  s   zTestFetchAllProcesses.cpu_numc                 C   s|   t |sJ |D ]}t|tsJ |dksJ qtr:|j|jks"J |j|jks*J |j|j	ks2J |j
|jks<J d S d S r   )r   r   rv   r   	peak_wsetwsetpeak_paged_pool
paged_poolpeak_nonpaged_poolnonpaged_poolpeak_pagefilepagefilerA   rd   r4   r^   r'   r'   r(   memory_info*  s   z!TestFetchAllProcesses.memory_infoc                 C   s   t |sJ t j}|jD ]%}t||}t|tsJ |dks"J ts*t	r+|dv r+q||ks3J |qtr>|j
|jks@J d S d S )Nr   >   vmsdata)r   r   virtual_memorytotal_fieldsrU   r   rv   r   r	   pssuss)rA   rd   r4   r   r   r^   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sJ |j |jks%J tr/|jdks.J n6tr_t |j	ts9J t |j
tsAJ t |jtsIJ |j	dksPJ |j
dv sWJ |jdks^J ntre|jseq	tj|jspJ |zt|j}W n	 ty   Y q	w t|jsJ |q	d S )Nr   r   >   a+r+arw)r   rc   fdrv   rl   r"   ri   r   r   positionmodeflagsr   rk   rm   statFileNotFoundErrorS_ISREGst_mode)rA   rd   r4   fstr'   r'   r(   
open_filesE  s0   
z TestFetchAllProcesses.open_filesc                 C   rt   r   ru   rr   r'   r'   r(   num_fds_  rw   zTestFetchAllProcesses.num_fdsc                 C   sb   t  $ t|tt|ksJ |D ]}t|sJ t| qW d    d S 1 s*w   Y  d S rb   )r   lensetr   r   )rA   rd   r4   connr'   r'   r(   net_connectionsc  s   
"z%TestFetchAllProcesses.net_connectionsc              
   C   s   t |tsJ | |ksJ |rUtj|sJ |zt|}W n* tyL } ztr3t	j
|r3n|jtjkr: W Y d }~d S W Y d }~d S d }~ww t|jsWJ d S d S rb   )r   r"   ri   rk   rl   rm   r   OSErrorr   r   _psplatformis_permission_errerrnoENOENTS_ISDIRr   )rA   rd   r4   r   errr'   r'   r(   cwdj  s$   zTestFetchAllProcesses.cwdc                 C   r   )Nr   d   r   rr   r'   r'   r(   memory_percentz  r   z$TestFetchAllProcesses.memory_percentc                 C   s   t |tsJ d S rb   )r   boolrr   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 rb   )r   rc   r   r   r   rv   )rA   rd   r4   cpusr   r'   r'   r(   cpu_affinity  s   z"TestFetchAllProcesses.cpu_affinityc                 C   sN   t |ttd fsJ |d ur#tj|sJ |tj|s%J |d S d S rb   )r   r"   typerk   rl   rm   rq   rr   r'   r'   r(   terminal  s   zTestFetchAllProcesses.terminalc                 C   s   |D ]l}t |jtsJ t |jtsJ t |jtsJ |jD ]N}t||}|dkrD|dr0qtr7|dkr7qt	j
|jsCJ |jq|dkrQ|sPJ t|q|dkr`ts_|s_J t|qt |tsgJ |dksmJ qqd S )Nrl   )[zanon_inode:pvclockaddrpermsr   )r   r   r"   r   rl   r   rU   
startswithr   rk   rm   r#   r   rv   )rA   rd   r4   ntfnamer^   r'   r'   r(   memory_maps  s,   


z!TestFetchAllProcesses.memory_mapsc                 C   rt   r   ru   rr   r'   r'   r(   num_handles  rw   z!TestFetchAllProcesses.num_handlesc                 C   sl   t |tsJ trd|  krdksJ | J |d S dd ttD }||v s,J t |tjs4J d S )Ni   c                 S   s    g | ]}| d rtt|qS )_PRIORITY_CLASS)rj   rU   r   )rH   xr'   r'   r(   rI     s    z.TestFetchAllProcesses.nice.<locals>.<listcomp>)r   rv   r
   dirr   enumIntEnum)rA   rd   r4   
prioritiesr'   r'   r(   nice  s   (zTestFetchAllProcesses.nicec                 C   r   r   r   r   r'   r'   r(   num_ctx_switches  r   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   r   r   )r   tupler   rr   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 rb   )r   dictrT   r"   )rA   rd   r4   kvr'   r'   r(   environ  s
   zTestFetchAllProcesses.environN))__name__
__module____qualname____doc__rB   rF   rN   ra   rf   rs   r   r   r   r~   r   r   r   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'   r'   r'   r(   r9   `   sN    		
	r9   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      t d d S r:   r   r;   r@   r'   r'   r(   rB        zTestPidsRange.setUpc                 C   r   rC   r   r@   r'   r'   r(   rF     r   zTestPidsRange.tearDownc              	   C   sf   dd }dd }t ddD ]#}tr||rq| j|d || W d    n1 s+w   Y  qd S )Nc                 S   s   zt d|  dd}W n
 ty   Y dS w |$ |D ]}|dr7t| d }|| k  W  d    S qtd1 s?w   Y  d S )Nz/proc/z/statusrbFs   Tgid:r   z'Tgid' line not found)openr   r   rv   split
ValueError)r   r   linetgidr'   r'   r(   is_linux_tid  s   

z+TestPidsRange.test_it.<locals>.is_linux_tidc              	   S   s   d}	 t | }zD|r t |  ts| t  v sJ W d S W d S ts=tt j t |  W d    n1 s8w   Y  tsG| t  vsJJ W d S W d S  t j	t
fya   |d8 }|dkr_ Y nw q)N   Tr   r   )r   
pid_existsr.   r   rL   r   r   raisesr    r+   rp   )r   r   rq   r'   r'   r(   check  s:   

z$TestPidsRange.test_it.<locals>.checkr   i  )r   )r   r   subTest)rA   r   r  r   r'   r'   r(   test_it  s   
zTestPidsRange.test_itN)r   r   r   r   rB   rF   r  r'   r'   r'   r(   r     s
    r   )"r   r   r   r=   rk   r   r{   rX   r   r   r   r   r   r   r   r   r	   r
   r   psutil.testsr   r   r   r   r   r   r   r   r   r   r<   r8   r9   r   r'   r'   r'   r(   <module>   sF   1  n