
    /hh                     F   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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Zn# e $ r dZY nw xY w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/ e'rddl0m1Z1 g dZ2dej3        v Z4de
j5        v pde
j5        v Z6e6Z7de
j5        v Z8de
j5        v Z9ej:        dk    Z; ej<                    dk    Z=e-d             Z>e$r e>            dk    Z? e>            dk    Z@ndZ?dZ@d ZAd!ZBd"ZCd#ZDe7reAd$z  ZAeDd$z  ZDeBd%z  ZBeCd$z  ZCe
jE        d&k    rd' e
jF                     d(ZGnd) e
jF                     d(ZGd*ZHd+I                    d,d-          ZJ ejK                    L                                d.v ZMe
jN        O                    e
jN        P                    e
jN        Q                    eR          d/d/                    ZSe
j5        T                    d0e
jN        P                    eSd1                    ZUe
jN        O                    e
jN        Q                    eR                    ZV eWe!jX        d2          ZY eWe!d3          ZZ eWe!jX        d4          Z[ eWe!d5          Z\ eWe!jX        d6          Z] eWe!jX        d7          Z^e'oe( Z_ eWe!d8          Z` eWe!jX        d9          Za eWe!jX        d:          Zb eWe!jX        d;          Zc eWe!d<          Zd	 edo ee e!jf                              Zgn# eh$ r dZgY nw xY w eWe!d=          Zi eWe!d>          Zj eWe!jX        d?          Zke$se"o e
jl                    dk    Zmd@ Zn en            \  ZoZp eqe
jr        dA          Zs ejt        esju                   dB  eve!          D             Zw exedC ey                      Zz e{            Z| e{            Z} G dD dEej~                  ZdF ZeddG            ZedH             ZdI ZedJ             ZedK             Zej        eDfdLZddMZdN ZdO Z G dP dQ          Z ee!j        deDdRS          dT             Z eeefdeDdRS          ddV            Z eedeDdRS          dW             ZdX ZdY Zej        dZ             Zd[ Zdd\Zdd^Z G d_ d`          ZeeZ G da dbej                  Zej                            e4dcd           G de dfe                      Zdg Zdh Zdi Z G dj dk          Z G dl dm          ZeAfdnZddoZddpZddrZeedfdsZej        fdtZddvZdw Zej        dx             Zdy Zdz Zd{ Zd| Zd} Zd~ Zd Ze'rej        dd            Znej        dd            Zejt        d             Ze'r ej        ej        d            dS dS )zTest utilities.    N)AF_INET)AF_INET6)SOCK_STREAM)AIX)LINUX)MACOS)NETBSD)OPENBSD)POSIX)SUNOS)WINDOWS)bytes2human)debug)memoize)print_color)supports_ipv6)wait_pid)KDEVNULLGLOBAL_TIMEOUTTOLERANCE_SYS_MEM
NO_RETRIESPYPY
PYTHON_EXEPYTHON_EXE_ENVROOT_DIRSCRIPTS_DIRTESTFN_PREFIXUNICODE_SUFFIXINVALID_UNICODE_SUFFIX
CI_TESTINGVALID_PROC_STATUSESTOLERANCE_DISK_USAGEIS_64BITHAS_CPU_AFFINITYHAS_CPU_FREQHAS_ENVIRONHAS_PROC_IO_COUNTERS
HAS_IONICEHAS_MEMORY_MAPSHAS_PROC_CPU_NUM
HAS_RLIMITHAS_SENSORS_BATTERYHAS_BATTERYHAS_SENSORS_FANSHAS_SENSORS_TEMPERATURESHAS_NET_CONNECTIONS_UNIXMACOS_11PLUSMACOS_12PLUSCOVERAGEAARCH64PYTEST_PARALLELpyrun	terminatereap_childrenspawn_testprocspawn_zombiespawn_children_pair
ThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespaceprint_sysinfois_win_secure_system_procfake_pytestchdirsafe_rmpathcreate_py_execreate_c_exe
get_testfn
get_winverkernel_version
call_untilwait_for_pidwait_for_filecheck_net_addressfilter_proc_net_connectionsget_free_portbind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_socketsreload_moduleimport_module_by_pathwarncopyload_shared_libis_namedtuple__pypy__GITHUB_ACTIONSCIBUILDWHEELCOVERAGE_RUNPYTEST_XDIST_WORKERl        aarch64c                     t          j                    d         } t          t          t          |                     d          d d                             }|dk    rdt          j        t          j	        dddgdd	id
          } t          t          t          |                     d          d d                             }|S )Nr   .   )
      z-sS-cz-import platform; print(platform.mac_ver()[0])SYSTEM_VERSION_COMPAT0T)envuniversal_newlines)
platformmac_vertuplemapintsplit
subprocesscheck_outputsys
executable)version_strversions     H/var/www/html/venv/lib/python3.11/site-packages/psutil/tests/__init__.pymacos_versionr|   z   s    "$$Q'KC[..s33BQB78899G( !-?	 )#.#	
 	
 	
 C!2!23!7!7!;<<==N    )rh      )   r   Frh   i  P i            javaz$psutil--z@psutil-u   -ƒőős   futf8surrogateescape>   us-asciiasciiz..PSUTIL_SCRIPTS_DIRscriptscpu_affinitycpu_freqenviron
getloadavgionicememory_mapsnet_io_counterscpu_numio_countersrlimitsensors_batterysensors_fanssensors_temperaturesthreadsc            	      .   d } t           j                                        }t          t          dd           }t
          r%t          j        dk    r|t          j        |d<   ||fS t          rt          j        |fS t          r | t          j                  p | t           j
                            t          j                            pd | t          j         dj        t          j        d d                              p- | t          j                                                              }|st%          d          ||fS t           j
                            t          j                  }t           j
                            |          s
J |            ||fS )Nc                     	 t          j        | dgt           j        t           j                   | S # t           j        $ r Y d S w xY w)Nz-V)stdoutstderr)ru   
check_callPIPECalledProcessError)exes    r{   attemptz_get_py_exe.<locals>.attempt   s^    	!dJOJO    J , 	 	 	44	s   -1 AA_base_executable)r      __PYVENV_LAUNCHER__zpython{}.{}rg   z"can't find python exe real abspath)osr   copygetattrrw   r   version_inforx   r`   r   pathrealpathshutilwhichformatpsutilProcessr   
ValueErrorexists)r   rm   baser   s       r{   _get_py_exer      s      *//

C 3*D11D 3#v--$2B &)^!"Sy	 ~s""	 GCN## /wrw''7788/w1]133CBQB3GHII /
 wv~''++--.. 	  	CABBBCxgs~..w~~c""''C'''Cxr}   zr+c                 b    g | ],}|                     d           t          t          |          -S )STATUS_
startswithr   r   .0xs     r{   
<listcomp>r     sC       q||I/F/FFA  r}   AF_UNIXc                   F     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
 xZS )	r<   z6A thread task which does nothing expect staying alive.c                     t                                                       d| _        d| _        t	          j                    | _        d S )NFMbP?)super__init___running	_interval	threadingEvent_flag)self	__class__s    r{   r   zThreadTask.__init__  s:    _&&


r}   c                 X    | j         j        }d| d| j         dt          |           ddS )N<z	 running=z at z#x>)r   __name__r   idr   names     r{   __repr__zThreadTask.__repr__  s8    ~&C4CC$-CCRXXCCCCCr}   c                 .    |                                   | S N)startr   s    r{   	__enter__zThreadTask.__enter__#  s    

r}   c                 .    |                                   d S r   )stop)r   argskwargss      r{   __exit__zThreadTask.__exit__'  s    		r}   c                     | j         rt          d          t          j                            |            | j                                         dS )zStart thread and keep it running until an explicit
        stop() request. Polls for shutdown every 'timeout' seconds.
        zalready startedN)r   r   r   Threadr   r   waitr   s    r{   r   zThreadTask.start*  sL     = 	0.///t$$$
r}   c                     d| _         | j                                         | j         r"t          j        | j                   | j          d S d S )NT)r   r   settimesleepr   r   s    r{   runzThreadTask.run3  sW    
m 	'Jt~&&& m 	' 	' 	' 	' 	'r}   c                 h    | j         st          d          d| _         |                                  dS )z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)r   r   joinr   s    r{   r   zThreadTask.stop9  s3    } 	0.///		r}   )r   
__module____qualname____doc__r   r   r   r   r   r   r   __classcell__)r   s   @r{   r<   r<     s        @@' ' ' ' 'D D D      ' ' '      r}   r<   c                 F     t          j                    fd            }|S )Nc                  P    	  | i |S # t           $ r t                        w xY wr   )	Exceptionr8   )r   r   funs     r{   wrapperz&_reap_children_on_err.<locals>.wrapperG  sD    	3'''' 	 	 	OOO	s    %	functoolswraps)r   r   s   ` r{   _reap_children_on_errr   F  s8    _S     Nr}   c                    |                     dt                     |                     dt                     |                     dt          j                               |                     dt                     t
          rd}|                     d|           | t          t          j                              }	 t          |           d	| d
}t          d|g} t          j
        | fi |}t                              |           t          |dd           t          |           nT# t          |           w xY wt          j
        | fi |}t                              |           t          |j                   |S )a  Create a python subprocess which does nothing for some secs and
    return it as a subprocess.Popen instance.
    If "cmd" is specified that is used instead of python.
    By default stdin and stdout are redirected to /dev/null.
    It also attempts to make sure the process is in a reasonably
    initialized state.
    The process is registered for cleanup on reap_children().
    stdinr   cwdrm      creationflagsNdirzimport time;open(r'z6', 'w').close();[time.sleep(0.1) for x in range(100)];rj   Tdeleteempty)
setdefaultr   r   getcwdr   r   rL   rI   r   ru   Popen_subprocesses_startedaddrQ   rP   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r{   r9   r9   R  s~    	OOGW%%%OOHg&&&OOE29;;'''OOE>*** ; %)9:::
{	,,,	 9 9 9 9 
 tV,C$S11D11E!%%e,,,&T::::K ----!!%(((UYLs   <AD) )D:c                     d} t          t          j                              }	 t          j        dt          j                            |           dt           d          }t          rt          |d          \  }} nt          |          \  }} t          j        |j                  }t          t          |dd	
                    }t                              |           t          j        |          }||ft#          |           | t#          |            S S # t#          |           | t#          |            w w xY w)a  Create a subprocess which creates another one as in:
    A (us) -> B (child) -> C (grandchild).
    Return a (child, grandchild) tuple.
    The 2 processes are fully initialized and will live for 60 secs
    and are registered for cleanup on reap_children().
    Nr   zl            import subprocess, os, sys, time
            s = "import os, time;"
            s += "f = open('z', 'w');"
            s += "f.write(str(os.getpid()));"
            s += "f.close();"
            s += "[time.sleep(0.1) for x in range(100 * 6)];"
            p = subprocess.Popen([r'z.', '-c', s])
            p.wait()
            r   )r   TFr   )rL   r   r   textwrapdedentr   basenamer   r   r6   r   r   r  rs   rQ   _pids_startedr   rI   )tfiler  ssubpchildgrandchild_pid
grandchilds          r{   r;   r;   |  sP    EBIKK(((FO 	  W--f55	 	 &0	 	 	 	 	  	#333KD%%((KD%tx((]6$eLLLMM.)))^N33
z"F  	F s   CD #D>c                  z   t           j        sJ t                      } t          j        d|  d          }d}t          |           }	 |                    t                     t          |          \  }}|	                                \  }}	 t          j
        |                                gg g t                     t          |                    d                    }t                              |           t          j        |          t#          fd           |f|                                 |                                 t'          |            |t'          |           S S # |                                 w xY w# |                                 t'          |            |t'          |           w w xY w)zCreate a zombie process and return a (parent, zombie) process tuple.
    In order to kill the zombie parent must be terminate()d first, then
    zombie must be wait()ed on.
    a          import os, sys, time, socket, contextlib
        child_pid = os.fork()
        if child_pid > 0:
            time.sleep(3000)
        else:
            # this is the zombie process
            with socket.socket(socket.AF_UNIX) as s:
                s.connect('za')
                pid = bytes(str(os.getpid()), 'ascii')
                s.sendall(pid)
        N   c                  H                                      t          j        k    S r   )statusr   STATUS_ZOMBIE)zombies   r{   <lambda>zspawn_zombie.<locals>.<lambda>  s    v}}&2FF r}   )r   r   rL   r	  r
  rV   
settimeoutr   r6   acceptselectfilenors   recvr  r   r   rO   closerI   )		unix_filesrcr  sockparentconn_zpidr  s	           @r{   r:   r:     s   
 <I
/  &    C EI&&D'''c

++--a	M4;;==/2r>BBBtyy''Dd###^D))FFFFFGGGF#JJLLL

I 	 JJLLLL

I s&   AF BE*  F *F  F 7F:c                    |                     dd           |                     dd           t                      }	 t          |d          5 }|                    |            ddd           n# 1 swxY w Y   t	          t
          |j        gfi |}t          |j                   ||fS # t          $ r t          |            w xY w)zRun python 'src' code string in a separate interpreter.
    Returns a subprocess.Popen instance and the test file where the source
    code was written.
    r   Nr   w)r   rL   openwriter9   r   r   rP   r  r   rI   )r!  r  srcfilefr  s        r{   r6   r6     s    	OOHd###OOHd###llG'3 	1GGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	z162;;d;;TXg   Gs/   B* A."B* .A22B* 5A263B* *Cc                 t   t           rdnd}|                    dt          j                   |                    dt          j                   |                    dd           |                    d|           t	          | t
                    rt          j        |           } t          j        | fi |}t          
                    |           |                    t                    \  }}|j        dk    rt          ||z             |rt          |           |                    d	          r
|d
d         }|S )zURun cmd in a subprocess and return its output.
    raises RuntimeError on error.
    r   r   r   r   rn   Tr   timeout
N)r   r   ru   r   
isinstancestrshlexrt   r   r   r   communicater   
returncodeRuntimeErrorr\   endswith)r  r  flagspr   r   s         r{   shr;    s#    !'IIaEOOHjo...OOHjo...OO($///OOOU+++#s k#%%%%Aa   ]]>]::NFF|q6F?+++ Vt Mr}   c                   	
 d 
d 
fd}
fd		fd}d }| }	 t          |t                    ry |||          t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            S t          |t          j        t          j        f          ry 	||          t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            S t          |t          j                  ry |||          t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            S t          d|          # t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            w xY w)a  Terminate a process and wait() for it.
    Process can be a PID or an instance of psutil.Process(),
    subprocess.Popen() or psutil.Popen().
    If it's a subprocess.Popen() or psutil.Popen() instance also closes
    its stdin / stdout / stderr fds.
    PID is wait()ed even if the process is already gone (kills zombies).
    Does nothing if the process does not exist.
    Return process exit status.
    c                     |                      |           t          r]t          | t          j                  rE	 t          j        | j                                       |          S # t
          j        $ r Y d S w xY wd S d S r   )	r   r   r2  ru   r   r   r   r  NoSuchProcess)procr/  s     r{   r   zterminate.<locals>.wait  s    		' 	z$
(899 	~dh//44W==='   		 	 	 	s   +A$ $A76A7c                     t           rt          rt          j        }t          r/|t          j        k    r|                     t          j                   |                     |           d S r   )r   r`   signalSIGKILLr   send_signalSIGCONT)r?  sigs     r{   sendsigzterminate.<locals>.sendsig  s^     	!^ 	!.C  	-SFN**V^,,,r}   c                     	  |            n1# t           $ r Y n%t          $ r}t          r|j        dk    r	  d }~ww xY w | |          S )N   )ProcessLookupErrorOSErrorr   winerror)r?  r/  errrF  rE  r   s      r{   term_subprocess_procz'terminate.<locals>.term_subprocess_proc  s    	GD#! 	 	 	D 	 	 	 3<1,,	 tD'"""s    
>	>9>c                 b    	  |            n# t           j        $ r Y nw xY w | |          S r   )r   r>  )r?  r/  rF  rE  r   s     r{   term_psutil_procz#terminate.<locals>.term_psutil_proc"  sR    	GD## 	 	 	D	tD'"""s    ""c                     	 t          j        |           } ||          S # t           j        $ r t          rt	          | |          cY S Y d S w xY wr   )r   r   r>  r   r   )r  r/  r?  rO  s      r{   term_pidzterminate.<locals>.term_pid)  sy    	3>#&&D $#D'222 # 	. 	. 	. .W-----. . .	.s   # &AAc                     | j         r| j                                          | j        r| j                                         | j        r| j                                         d S d S r   )r   r  r   r   )r?  s    r{   flush_popenzterminate.<locals>.flush_popen3  sl    ; 	 K; 	 K: 	J	 	r}   zwrong type )	r2  rs   ru   r   r   r  
pid_existsr   	TypeError)proc_or_pidrE  wait_timeoutrM  rQ  rS  r:  r  rF  rO  r   s    `      @@@r{   r7   r7     s       	# 	# 	# 	# 	# 	# 	## # # # # # #3 3 3 3 3   	A/a 	18A|,, a**FL9:: 	KNNNa%%0aa15$S))..3.... FNFL9:: 	1##A|44 a**FL9:: 	KNNNa%%0aa15$S))..3.... :+,, 	1''<88 a**FL9:: 	KNNNa%%0aa15$S))..3.... /!//000a**FL9:: 	KNNNa%%0aa15$S))..3.......s    G6 21G6 %G6 $G6 6A/I%c                    t          j                                        |           }t          r/t                                          }t          |           t          /t          r/t                                          }t          |           t          /|rg|D ]}t          |d           t          j        |t                    \  }}|D ]2}t          d|d           t          |t          j                   1dS dS )a  Terminate and wait() any subprocess started by this test suite
    and any children currently running, ensuring that no processes stick
    around to hog resources.
    If recursive is True it also tries to terminate and wait()
    all grandchildren started by this process.
    	recursiveN)rW  r.  zcouldn't terminate process z; attempting kill())rE  )r   r   childrenr   popr7   r  
wait_procsr   r\   rA  rB  )rZ  r[  r  r  r:  r%  alives          r{   r8   r8   M  s    ~((9(==H   $((**$   
  !!#  
  - 	, 	,Aad+++++$X~FFF5 	- 	-AGqGGGHHHaV^,,,,,- -	- 	-r}   c                     t           st          d          d} t          j                    d         }|D ]"}|                                s|dk    r| |z  } " | st          d|          d}d}|                     d          }t          |d                   }t          |          dk    rt          |d                   }t          |          dk    rt          |d                   }|||fS )	z"Return a tuple such as (2, 6, 36).z	not POSIX rg   rf   zcan't parse r      r   )	r   NotImplementedErrorr   unameisdigitr   rt   rs   len)r  rc  cminormicronumsmajors          r{   rN   rN   r  s     /!+...
AHJJqME  99;; 	!s((FAA 3111222EE773<<DQLLE
4yyA~~DG
4yyA~~DG5%  r}   c                      t           st          d          t          j                    } | j        pd}| d         | d         |fS )Nznot WINDOWSr   ra  )r   rb  rw   getwindowsversionservice_pack_major)wvsps     r{   rM   rM     sH     1!-000			 	 B			#!BqE2a5"r}   c                   6    e Zd ZdZeddddfdZd Zd Zd ZdS )retryzA retry decorator.Nr   c                 r    |r|rt          d          || _        || _        || _        || _        || _        d S )Nz/timeout and retries args are mutually exclusive)r   	exceptionr/  retriesintervallogfun)r   rs  r/  rt  ru  rv  s         r{   r   zretry.__init__  sK      	Pw 	PNOOO" r}   c              #   
  K   | j         rQt          j                    | j         z   }t          j                    |k     rd V  t          j                    |k     d S d S | j        rt          | j                  D ]}d V  d S 	 d V  r   )r/  r   rt  range)r   stop_atr%  s      r{   __iter__zretry.__iter__  s      < 		ikkDL0G)++'' )++''''''\ 	4<((   r}   c                 J    | j         t          j        | j                    d S d S r   )ru  r   r   r   s    r{   r   zretry.sleep  s*    =$Jt}%%%%% %$r}   c                 X     t          j                   fd            } |_        |S )Nc                      d }D ]U}	  | i |c S # j         $ r<}|}j                            |                                            Y d }~Nd }~ww xY w|r   )rs  rv  r   )r   r   excr%  r   r   s       r{   r   zretry.__call__.<locals>.wrapper  s    C  3//////~   C{.C(((JJLLLHHHH Is   
A2AA)r   r   	decorator)r   r   r   s   `` r{   __call__zretry.__call__  sF    				 	 	 	 	 
		  !r}   )	r   r   r   r   r   r   rz  r   r   r}   r{   rq  rq    sl             
 
 
& & &    r}   rq  r   )rs  rv  r/  ru  c                     | t          j                    vrt          j        |           t          j        |            dS )zWait for pid to show up in the process list then return.
    Used in the test suite to give time the sub process to initialize.
    N)r   pidsr>  r   r  s    r{   rP   rP     s<     &+--"3'''
N3r}   Tc                     t          | d          5 }|                                }ddd           n# 1 swxY w Y   |s|sJ |rt          |            |S )z8Wait for a file to be written on disk with some content.rbN)r)  readrI   )fnamer   r   r,  datas        r{   rQ   rQ     s     
eT		 avvxx                EKs   266c                 "     |             }|sJ |S )z1Keep calling function until it evaluates to True.r  )r   rets     r{   rO   rO     s     #%%CJJJJr}   c                 D   d }	 t          j        |           }t          j        |j                  r t	          j        t          j        |           }nt	          j        t           j        |           }t          r |             dS  ||           dS # t          $ r Y dS w xY w)z?Convenience function for removing temporary test files or dirs.c                 B   t          j                     t          z   }t          j                     |k     rl	  |             S # t          $ r Y n*t          $ r}|}t	          d|            Y d }~nd }~ww xY wt          j        d           t          j                     |k     l|)Nz	ignoring g{Gz?)r   r   FileNotFoundErrorrJ  r\   r   )r   ry  r%  rL  s       r{   	retry_funzsafe_rmpath.<locals>.retry_fun  s    
 )++.ikkG##(suu$    ( ( (&&&''''''''( Jt ikkG## 	s   	> 
A1
	A1A,,A1N)r   statS_ISDIRst_moder   partialr   rmtreeremover   r  )r   r  str   s       r{   rI   rI     s      "WT]]<
## 	5#FM488CC#BIt44C 	CEEEEEIcNNNNN   s   A=B B 
BBc                 R    	 t          j        |            dS # t          $ r Y dS w xY w)z.Convenience function for creating a directory.N)r   mkdirFileExistsErrorr   s    r{   
safe_mkdirr  $  s:    
   s    
&&c              #      K   t          j                    }	 t          j        |            dV  t          j        |           dS # t          j        |           w xY w)z@Context manager which temporarily changes the current directory.N)r   r   rH   )dirnamecurdirs     r{   rH   rH   ,  s]       Y[[F

s   A Ac                 D   t           j                            |           r
J |             t          j        t
          |            t          j        t          |            t          r;t          j
        |           }t          j        | |j        t          j        z             | S )z6Create a Python executable file in the given location.)r   r   r   atexitregisterrI   r   copyfiler   r   r  chmodr  S_IEXEC)r   r  s     r{   rJ   rJ   7  s}    w~~d##))T)))
OK&&&
OJ%%% 2WT]]
rzDL0111Kr}   c                 v   t           j                            |           r
J |             t          j        d          st          j        d          |t          j        d          }nt          |t                    s
J |            t          j        t          |            t          t          d          d          5 }|                    |           ddd           n# 1 swxY w Y   	 t#          j        d|j        d| g           t          |j                   n# t          |j                   w xY w| S )	z5Create a compiled C executable in the given location.gcczgcc is not installedNz
            #include <unistd.h>
            int main() {
                pause();
                return 1;
            }
            z.csuffixr(  z-o)r   r   r   r   r   pytestskipr	  r
  r2  r3  r  r  rI   r)  rL   r*  ru   r   r   )r   c_coder,  s      r{   rK   rK   B  sa   w~~d##))T)))< 2k0111~ "   &#&&.....
OK&&&	j%%%s	+	+ q	              uafdD9:::AFAFKs    C""C&)C&.D   D6r`  c                     	 t          j        t          | |          }t          j                            |          s;t          j                            |          }t          j        t          |           |S w)zReturn an absolute pathname of a file or dir that did not
    exist at the time this call is made. Also schedule it for safe
    deletion at interpreter exit. It's technically racy but probably
    not really due to the time variant.
    T)prefixr  r   )
tempfilemktempr   r   r   r   r   r  r  rI   )r  r   r   r   s       r{   rL   rL   \  sd    mFLLLw~~d## 	7##D))DOK...Kr}   c                       e Zd ZdZed             Zed
d            Zed
d            Zedd            Z G d d	          Z	dS )rG   zA class that mimics some basic pytest APIs. This is meant for
    when unit tests are run in production, where pytest may not be
    installed. Still, the user can test psutil installation via:

        $ python3 -m psutil.tests
    c                      t          j                                        t                    }t          j        d                              |           t          j        dt          d           |S )zMimics pytest.main(). It has the same effect as running
        `python3 -m unittest -v` from the project root directory.
        rg   )	verbosityz<Fake pytest module was used. Test results may be inaccurate.ra  
stacklevel)	r=   
TestLoaderdiscoverHERETextTestRunnerr   warningsr\   UserWarning)r   kwsuites      r{   mainzfake_pytest.mainw  sk    
 #%%..t44!,,,00777J	
 	
 	
 	

 r}   Nc                 h     G d d          t           j        dfd	            } || |          S )zMimics `pytest.raises`.c                   (    e Zd ZdZed             ZdS ))fake_pytest.raises.<locals>.ExceptionInfoNc                     | j         S r   )_excr   s    r{   valuez/fake_pytest.raises.<locals>.ExceptionInfo.value  s
    y r}   )r   r   r   r  propertyr  r  r}   r{   ExceptionInfor    s2        D! ! X! ! !r}   r  Nc              3      K                }	 |V  t          | d          # | $ rN}|r:t          j        |t          |                    sd| d| d}t          |          ||_        Y d }~d S d }~ww xY w)Nz not raised"z" does not match ")AssertionErrorresearchr3  r  )r~  matcheinforL  msgr  s        r{   contextz#fake_pytest.raises.<locals>.context  s      !MOOE< %%:%:%:;;;  ! ! ! .5#c((!;!; .=e==s===C(--- 






	!s   % A8AA33A8)r  r   )
contextlibcontextmanager)r~  r  r  r  s      @r{   raiseszfake_pytest.raises  sp    	! 	! 	! 	! 	! 	! 	! 	! 
	"
	< 
	< 
	< 
	< 
	< 
#	"
	< ws%((((r}   c                     |r't          j                                        | |          S t          j                                        |           S )zMimics `pytest.warns`.)r=   TestCaseassertWarnsRegexassertWarns)warningr  s     r{   warnszfake_pytest.warns  sI      	H$&&77GGG ""..w777r}   r`  c                 *    t          j        |           )zMimics `unittest.SkipTest`.)r=   SkipTestreasons    r{   r  zfake_pytest.skip  s     '''r}   c                   @    e Zd Zedd            Z G d d          ZdS )fake_pytest.markr`  c                 ,    t          j        | |          S )z'Mimics `@pytest.mark.skipif` decorator.)r=   skipIf)	conditionr  s     r{   skipifzfake_pytest.mark.skipif  s     ?9f555r}   c                        e Zd ZdZddZd ZdS )fake_pytest.mark.xdist_groupz4Mimics `@pytest.mark.xdist_group` decorator (no-op).Nc                     d S r   r  r   s     r{   r   z%fake_pytest.mark.xdist_group.__init__  s    r}   c                     |S r   r  )r   cls_or_meths     r{   r  z%fake_pytest.mark.xdist_group.__call__  s    ""r}   r   )r   r   r   r   r   r  r  r}   r{   xdist_groupr    s=        FF   # # # # #r}   r  Nr`  )r   r   r   staticmethodr  r  r  r}   r{   markr    sZ        		6 	6 	6 
	6	# 	# 	# 	# 	# 	# 	# 	# 	# 	#r}   r  r   r  )
r   r   r   r   r  r  r  r  r  r  r  r}   r{   rG   rG   o  s            \ ) ) ) \)2 8 8 8 \8 ( ( ( \(# # # # # # # # # #r}   rG   c                   J    e Zd ZdZddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd ZdS )rB   zTest class providing auto-cleanup wrappers on top of process
    test utilities. All test classes should derive from this one, even
    if we use pytest.
    r`  Nc                 ^    t          ||          }|                     t          |           |S )N)r  r   )rL   
addCleanuprI   )r   r  r   r  s       r{   rL   zPsutilTestCase.get_testfn  s-    &c222U+++r}   c                 T    t          |i |}|                     t          |           |S r   )r9   r  r7   )r   r   r  r  s       r{   r9   zPsutilTestCase.spawn_testproc  s-    ---	5)))r}   c                     t                      \  }}|                     t          |           |                     t          |           ||fS r   )r;   r  r7   )r   child1child2s      r{   r;   z"PsutilTestCase.spawn_children_pair  sD    ,..	6***	6***r}   c                     t                      \  }}|                     t          |           |                     t          |           ||fS r   )r:   r  r7   )r   r#  r  s      r{   r:   zPsutilTestCase.spawn_zombie  sB    %	6***	6***r}   c                     t          |i |\  }}|                     t          |           |                     t          |           |S r   )r6   r  rI   r7   )r   r   r  r  r+  s        r{   r6   zPsutilTestCase.pyrun  sE    ---wW---	5)))r}   c                 b   t          |t          j                  sJ |j        |j        k    sJ |j        |j        k    sJ |j        r	|j        sJ t          |t          j                  r&|j        |j        k    sJ |j        |j        dk    sJ t          |           t          |           d S Nr   )r2  r   Errorr  r   _nameZombieProcessppid_ppidr3  repr)r   r?  r~  s      r{   _check_proc_exczPsutilTestCase._check_proc_exc  s    #v|,,,,,w$(""""x4:%%%%8 	8OOOc6/00 	%8tz))))x#x1}}}}CS					r}   c                    t          j        t          j                  5 }	 t          j        |           n"# t          j        $ r t          d          w xY w	 d d d            n# 1 swxY w Y   |j        j        |k    sJ |j        j	        J t          j
        |          r
J |            |t          j                    vsJ |d t          j                    D             vsJ d S )Nz&wasn't supposed to raise ZombieProcessc                     g | ]	}|j         
S r  r  r   s     r{   r   z0PsutilTestCase.assertPidGone.<locals>.<listcomp>  s    @@@Q15@@@r}   )r  r  r   r>  r   r  r  r  r  r   rT  r  process_iter)r   r  cms      r{   assertPidGonezPsutilTestCase.assertPidGone  sR   ]6/00 	OBOs####' O O O$%MNNNO $	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O
 x|s""""x}$$$$S))..3...&+--''''@@&*=*?*?@@@@@@@@@s%   A%6A%AA%%A),A)c                    |                      |j                   t          |          }|                    |j        d          D ]\  }}|                     ||          5  	  |            }d| d|}t          |          # t          j        $ r  t          j	        $ r }| 
                    ||           Y d }~nd }~ww xY w	 d d d            n# 1 swxY w Y   |                    d           d S )NTclear_cacher?  r   zProcess.z!() didn't raise NSP and returned r   r.  )r   r  rC   iterallsubTestr  r   r  r>  r  r   )r   r?  nsr   r   r  r  r~  s           r{   assertProcessGonez PsutilTestCase.assertProcessGone  sy   48$$$t$$T:: 	. 	.IC4d33 . ..#%%C$4 $ $$ $  )--- +   + 4 4 4((s3333333343. . . . . . . . . . . . . . . 			!	s<   "C$
B.CC#B>9C>CCC	C	c                    t          j        |j                  }||k    sJ t          s)t          s"t          |          t          |          k    sJ |                                t           j        k    sJ |                                sJ t          j	        |j                  sJ |
                                 |j        t          j                    v sJ |j        d t          j                    D             v sJ i t           _        |j        d t          j                    D             v sJ t          |          }|                    |j        d          D ]~\  }}|                     ||          5  	  |             n># t           j        t           j        f$ r }|                     ||           Y d }~nd }~ww xY wd d d            n# 1 swxY w Y   t*          r/t-          j        t           j                  5 }|                                 d d d            n# 1 swxY w Y   |                     ||j                   t-          j        t           j                  5 }|                                 d d d            n# 1 swxY w Y   |                     ||j                   t-          j        t           j                  5 }|                                 d d d            n# 1 swxY w Y   |                     ||j                   |                                 |                                 |                                 |                                 |                                sJ t          j	        |j                  sJ |j        t          j                    v sJ |j        d t          j                    D             v sJ i t           _        |j        d t          j                    D             v sJ d S )Nc                     g | ]	}|j         
S r  r  r   s     r{   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>      AAAaAEAAAr}   c                     g | ]	}|j         
S r  r  r   s     r{   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>!  r  r}   Tr  r  c                     g | ]	}|j         
S r  r  r   s     r{   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>=  r  r}   c                     g | ]	}|j         
S r  r  r   s     r{   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>?  r  r}   ) r   r   r  r
   r	   hashr  r  
is_runningrT  as_dictr  r  _pmaprC   r  r  r  r  AccessDeniedr  r   r  r  cmdliner  r   r   suspendresumer7   kill)r   r?  cloner  r   r   r~  r  s           r{   assertProcessZombiez"PsutilTestCase.assertProcessZombie  s   tx(( u}}}} 	-6 	-::e,,,,{{}} 44444      *****x6;==((((xAA6+>+@+@AAAAAAAxAA6+>+@+@AAAAAAAt$$T:: 	4 	4IC4d33 4 44CEEEE,f.AB 4 4 4((s3333333344 4 4 4 4 4 4 4 4 4 4 4 4 4 4
  
	1v344                 rx000v344 


                rx000v344 #  """# # # # # # # # # # # # # # #  rx000		      *****x6;==((((xAA6+>+@+@AAAAAAAxAA6+>+@+@AAAAAAAAAsr   6G8
FGF>F94G9F>>GG	G	?H  H$'H$$JJ	J		K**K.1K.r`  N)r   r   r   r   rL   r9   r;   r:   r6   r  r   r	  r  r  r}   r{   rB   rB     s         
   
  
              
A 
A 
A  &1B 1B 1B 1B 1Br}   rB   zunreliable on PYPYr  c                       e Zd ZdZdZdZdZerdndZdZ	 e
j                    Z e ej        d                    Zed             Zed	             Zd
 Zd Zd Zd Zd Zd Zd Z	 ddZd ZdS )rA   a  Test framework class for detecting function memory leaks,
    typically functions implemented in C which forgot to free() memory
    from the heap. It does so by checking whether the process memory
    usage increased before and after calling the function many times.

    Note that this is hard (probably impossible) to do reliably, due
    to how the OS handles memory, the GC and so on (memory can even
    decrease!). In order to avoid false positives, in case of failure
    (mem > 0) we retry the test for up to 5 times, increasing call
    repetitions each time. If the memory keeps increasing then it's a
    failure.

    If available (Linux, OSX, Windows), USS memory is used for comparison,
    since it's supposed to be more precise, see:
    https://gmpy.dev/blog/2016/real-process-memory-and-environ-in-python
    If not, RSS memory is used. mallinfo() on Linux and _heapwalk() on
    Windows may give even more precision, but at the moment are not
    implemented.

    PyPy appears to be completely unstable for this framework, probably
    because of its JIT, so tests on PYPY are skipped.

    Usage:

        class TestLeaks(psutil.tests.TestMemoryLeak):

            def test_fun(self):
                self.execute(some_function)
       rh   r   r   TPSUTIL_DEBUGc                 .    t          j        d           d S )NF)r   
_set_debugclss    r{   
setUpClasszTestMemoryLeak.setUpClassy  s    %     r}   c                 8    t          j        | j                   d S r   )r   r   _psutil_debug_origr!  s    r{   tearDownClasszTestMemoryLeak.tearDownClass}  s    #011111r}   c                 `    | j                                         }t          |d|j                  S )Nuss)	_thisprocmemory_full_infor   rss)r   mems     r{   _get_memzTestMemoryLeak._get_mem  s+     n--//sE37+++r}   c                 t    t           r| j                                        S | j                                        S r   )r   r)  num_fdsnum_handlesr   s    r{   _get_num_fdszTestMemoryLeak._get_num_fds  s2     	0>))+++>--///r}   c                 P    | j         rt          |dt          j                   d S d S )Nyellow)colorfile)verboser   rw   r   )r   r  s     r{   _logzTestMemoryLeak._log  s3    < 	>8#*======	> 	>r}   c                 B   |                                  }|                     |           |                                  }||z
  }|dk     rd|d}|                     |          |dk    r5t          rdnd}|dk    r|dz  }| d| d	|}|                     |          d
S )zMakes sure num_fds() (POSIX) or num_handles() (Windows) does
        not increase after calling a function.  Used to discover forgotten
        close(2) and CloseHandle syscalls.
        r   znegative diff z8 (gc probably collected a resource from a previous test)fdhandlera  r  z
 unclosed z after calling N)r1  callfailr   )r   r   beforeafterdiffr  type_s          r{   
_check_fdszTestMemoryLeak._check_fds  s    
 ""$$		#!!##v~!882 2 2 2  ))C.. !88!/DDxEaxxBBUBB3BBC))C..  8r}   c                 *   t          j        d           |                                 }t          |          D ]}|                     |          }~~t          j        d           |                                 }t           j        g k    sJ ||z
  }|S )zGet 2 distinct memory samples, before and after having
        called fun repeatedly, and return the memory difference.
        ra  )
generation)gccollectr-  rx  r;  garbage)r   r   timesmem1r   r  mem2r?  s           r{   _call_ntimeszTestMemoryLeak._call_ntimes  s     	
a    }}u 	 	A))C..C33

a    }}zRd{r}   c           	         g }d}|}t          d|dz             D ]}|                     ||          }	d                    |t          |	          t          |	|z            |          }
|                    |
           |	|k    p|	|k    }|r|dk    r|                     |
            d S |dk    rt                       |                     |
           ||z  }|	}|                     d                    |                    )Nr   ra  z,Run #{}: extra-mem={}, per-call={}, calls={}z. )	rx  rJ  r   r   appendr7  printr<  r   )r   r   rG  rt  	tolerancemessagesprev_memincreaseidxr,  r  successs               r{   
_check_memzTestMemoryLeak._check_mem  s   GaK(( 	 	C##C//C@GGC  C%K((	 C OOC   Y&9#/G 	77IIcNNN!88GGG		#!ii		(++,,,r}   c                      |            S r   r  )r   r   s     r{   r;  zTestMemoryLeak.call  s    suur}   Nc                    ||n| j         }||n| j        }||n| j        }||n| j        }	 |dk    s
J d            |dk    s
J d            |dk    s
J d            |dk    s
J d            n.# t          $ r!}t          t          |                    d}~ww xY w|                     ||           |                     |           | 	                    ||||           dS )	zTest a callable.Nra  ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rG  rt  rN  )
rG  warmup_timesrt  rN  r  r   r3  rJ  rA  rT  )r   r   rG  rW  rt  rN  rL  s          r{   executezTestMemoryLeak.execute  s$    *
(4LL$:K 	 %0''dl!*!6IIDN		'A:::3:::1$$$&A$$$a<<<!7<<<>>>#;>>>> 	' 	' 	'SXX&&&	' 	#|,,,5'YOOOOOs   A A/ /
B9BBc                 6      fd}  j         |fi | dS )znConvenience method to test a callable while making sure it
        raises an exception on every call.
        c                  4                                     d S r   )assertRaises)r~  r   r   s   r{   r;  z*TestMemoryLeak.execute_w_exc.<locals>.call  s    c3'''''r}   N)rX  )r   r~  r   r   r;  s   ```  r{   execute_w_exczTestMemoryLeak.execute_w_exc  sJ    
	( 	( 	( 	( 	( 	( 	( 	T$$V$$$$$r}   )NNNN)r   r   r   r   rG  rW  rN  r    rt  r6  r   r   r)  boolr   getenvr%  classmethodr#  r&  r-  r1  r7  rA  rJ  rT  r;  rX  r\  r  r}   r{   rA   rA   P  s8        > ELI%bbAGG  Iibi7788! ! [! 2 2 [2, , ,0 0 0> > >! ! !,  - - -8   KOP P P P,% % % % %r}   rA   c                     dd l } dd l}dd l}dd l}dd l}	 dd l}n# t          $ r d }Y nw xY w	 dd l}n# t          $ r d }Y nw xY w|                                 }t          j
        r't          j        d          rt          d          |d<   nt          j        r dt          j                    d          |d<   nt          j        rydd                    t'          t(          t          j                                        z   |d<   t-          t          d          r$|dxx         d	t          j                    z   z  cc<   n,t          j                     dt          j                     |d<   d	                    t5          t          j                              t          j                    gz             |d
<   t          j        rt          j                    d         |d<   d	                    t          j                    t          j                     t          j!                    g          |d<   tE          |dd          |d<   ||dxx         d|j#         dz  cc<   t          j        rvt          j        d          r=t          ddg          }t)          |          $                    d          d         |d<   nd|d<   t          j%                    d         }	|	r|	|d<   tM          j'                    |d<   |(                                }
|
d          d	|
d          |d<   |j        )                    t          j*                              +                    d          |d<   |j        ,                                +                    d          |d<   |-                                |d<   t\          j/        0                    d          |d<   t]          j1                    |d <   td          |d!<   t          j3                    |d"<   t]          j4                    |d#<   t          j5                    |d$<    d%j6        to          d& t          j8                    D                        |d'<   t          j9                    }d(6                    tu          |j;                  ty          |j=                  ty          |j>                            |d)<   t          j?                    }d(6                    tu          |j;                  ty          |j=                  ty          |j>                            |d*<   t          t          jA                              |d+<   t          jB                    C                                }|D                    d,d            |E                    |          |d-<   t          d.tL          jG        /           |H                                D ]7\  }}t          d06                    |d1z   |          tL          jG        /           8t          d.tL          jG        /           tL          jI        J                                 tL          jI        J                                 d S )2Nr   lsb_releasezlsb_release -d -sOSzDarwin zWindows  win32_editionz, archrg   kernelpython__version__znot installedpipz (wheel=)r  z	--versionr0  ra  glibczfs-encodinglangz%Y-%m-%d %H:%M:%Sz	boot-timer   user~homer   pyexehostnamePIDcpusz{:.1f}%, {:.1f}%, {:.1f}%c              3   H   K   | ]}|t          j                    z  d z  V  dS )d   N)r   	cpu_countr   s     r{   	<genexpr>z print_sysinfo.<locals>.<genexpr>@  s5      IIq6#%%%+IIIIIIr}   loadavgz{}%%, used={}, total={}memoryswapr  r   r?  zF======================================================================r5  z	{:<17} {}:)Kcollectionsdatetimegetpasslocalepprintri  ImportErrorwheelOrderedDictr   r   r   r   r;  OSXro   rp   r   r   rr   r3  	win32_verhasattrrd  systemrz   listarchitecturemachiner   rc  python_implementationpython_versionpython_compilerr   rh  rt   libc_verrw   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserr   r   nodegetpidrv  r   rq   r   virtual_memoryrs   percentr   usedtotalswap_memoryre  r  r   r  r\  pformatrM  r   itemsr   flush)r}  r~  r  r  r  ri  r  infooutr  rl  r,  rz  pinfokvs                   r{   rE   rE     s   OOONNNMMMMMM



       ""$$D | 	A]33 	A+,,T

	 A6x/11!466T

	 A#((3sH4F4H4H+I+I"J"JJT
8_-- 	:JJJ$!7!9!999JJJ ))@@H,<,>,>@@T
99X"$$%%)9););(<< DL | -!))!,X YY&((!! ""   DN
 #}o>>DKU6%"36666 | < 	*e[)**Cc((....q1DKK)DK" 	DM 355DD1g**a**DL )77 h"## 	 $((**334GHHDL??$$DL7%%c**DL)++DKDM}D)++DK #%%DL818	IIV5F5H5HIII	I	IDO 

!
!C.55CKCHCI DN
 D,33DLDIDJ DL
 v{}}%%DLN$$&&E	IImT""">>%((DL	($$$$

 ? ?1k  S!,,3:>>>>>	($$$$J Js    **3 AAc                 n    t           d             }	  |            |          dk    S # t          $ r Y dS w xY w)Nc                      i } t          d          }|                                dd          D ]C}d |                    d          D             }|d         t          |d                   }}|| |<   D| S )Nztasklist.exe /NH /FO csvra  c                 :    g | ]}|                     d d          S )r  r`  )replacer   s     r{   r   z@is_win_secure_system_proc.<locals>.get_procs.<locals>.<listcomp>i  s&    @@@1AIIc2&&@@@r}   ,r   )r;  
splitlinesrt   rs   )r  r  linebitsr   r  s         r{   	get_procsz,is_win_secure_system_proc.<locals>.get_procsd  s{    +,,NN$$QRR( 	 	D@@

3@@@DQT!W#DCHH
r}   zSecure SystemF)r   KeyError)r  r  s     r{   rF   rF   b  sX      Wy{{3?22   uus   & 
44c                      t          j                    } t          | d          r|                                 S t          | d          r&t	          j        |                                           S dS )Nr   r   r   )r   r   r  r   randomchoicer   )r:  s    r{   _get_eligible_cpur  t  s`    Aq) /yy{{	N	#	# /}Q^^--...1r}   c                      e Zd ZdZddi fddi fgZddi fddddifd	di fd
di fddi fddi fddi fddi fddi fg	Zddi fddi fddi fddi fddi fddi fddi fddi fddddifddi fddi fddi fddi fd di fd!di fd"di fd#di fgZer$ed$di fgz  Zed%di fgz  Zed&di fgz  Zed'di fgz  Zer	ed(di fgz  Ze	r	ed)di fgz  Ze
red*ej        fi fgz  Zer	ed+di fgz  Zer	ed,di fgz  Zer	ed-di fgz  Zer	ed.di fgz  Zered/dd0d1ifgz  Zg Zer
eddi fgz  Znedej        fi fgz  Ze
red*ej        d2fi fgz  Ze	r"ered)ej        d3fi fgz  Zned)ej        fi fgz  Zered+ e            gfi fgz  Zd4ej        fi fd5di fd6di fd7di fd8di fgZered4ej        fi fgz  Zed4ej        fi fgz  Zeez   ez   ez   Zd9 Zd?d:Zd; Z e!d<             Z"e!d=             Z#d>S )@rC   a  A container that lists all Process class method names + some
    reasonable parameters to be called with. Utility methods (parent(),
    children(), ...) are excluded.

    >>> ns = process_namespace(psutil.Process())
    >>> for fun, name in ns.iter(ns.getters):
    ...    fun()
    cpu_percentr  memory_percentr  r[  rZ  Tconnectionsr  oneshotr#  parentsr  r   r   r  	cpu_timescreate_timer   r   r*  memory_infor   net_connectionskindr  nicenum_ctx_switchesnum_threads
open_filesr  r  r   usernameuidsgidsterminalr/  r   r   r   r   r   r   r0  r   groupedF)r  i   r   rC  r  r  r7   r  c                     || _         d S r   )_proc)r   r?  s     r{   r   zprocess_namespace.__init__  s    


r}   c              #      K   t          |          }t          j        |           |D ]L\  }}}|r|                                  t	          | j        |          }t          j        |g|R i |}||fV  MdS z_Given a list of tuples yields a set of (fun, fun_name) tuples
        in random order.
        N)r  r  shuffler  r   r  r   r  )r   lsr  fun_namer   r  r   s          r{   r  zprocess_namespace.iter  s       "XXr$& 	" 	" HdD #  """$*h//C#C7$777$77C/!!!!	" 	"r}   c                 R    | j                             | j         j        d           dS )z&Clear the cache of a Process instance.T)_ignore_nspN)r  _initr  r   s    r{   r  zprocess_namespace.clear_cache  s'    
T:::::r}   c                     |D ]<\  }}}d|z   }t          ||          s!|j        j        d|d}t          |          =dS )z}Given a TestCase instance and a list of tuples checks that
        the class defines the required test method names.
        test_z class should define a z methodN)r  r   r   AttributeError)r"  
test_classr  r  r%  	meth_namer  s          r{   test_class_coveragez%process_namespace.test_class_coverage  s~    
 ! 	* 	*NHa(*I:y11 *!+4 - -!- - -  %S)))*	* 	*r}   c                     d | j         D             }d | j        D             }d t          t          j                  D             }||z  |z  }|rt          d|          d S )Nc                     h | ]
}|d          S r  r  r   s     r{   	<setcomp>z)process_namespace.test.<locals>.<setcomp>  s    &&&!&&&r}   c                     h | ]
}|d          S r  r  r   s     r{   r  z)process_namespace.test.<locals>.<setcomp>  s    ---A1Q4---r}   c                 *    h | ]}|d          dk    |S )r   r%  r  r   s     r{   r  z)process_namespace.test.<locals>.<setcomp>   s!    ???q1Q43;;;;;r}   zuncovered Process class names: )r  ignoredr   r   r   r   )r"  thisr  klassleftouts        r{   testzprocess_namespace.test  s    &&cg&&&-----??C//???'>U* 	LJwJJKKK	L 	Lr}   N)T)$r   r   r   r   utilsr  gettersr   r'   r(   r+   r   RLIMIT_NOFILEr$   r*   r&   r   r)   settersNORMAL_PRIORITY_CLASSr   IOPRIO_CLASS_NONEIOPRIO_NORMALr  rA  SIGTERMkillersCTRL_C_EVENTCTRL_BREAK_EVENTr  r   r  r  r_  r  r  r  r}   r{   rC   rC   }  ss         R$'7R&@AE 
B	R+t,-	B	r2	B	2r	B	B	r
G 
B	b"	B	B	B	R$	B	R	B0	R	R$	B	r2	R	2r	B	R#G&  )VR$%%VR$%%ZR())YB'(( -]B+,, (Xr2&'' =X 46;<< .^R,-- )YB'(( )YB'(( -]B+,, =]BE(:;<<G CVT2&''Vf:<bABB JX 4lCRHII A 	AF$<a#@"EFFGGF$8#:B?@@G D^'8'8':':&;%=rBCC 
)2.	B	2r	b"	RG  E]V%8$:B?@@]V%<$>CDD
'/G
#g
-C  " " " "; ; ; * * [* L L [L L Lr}   rC   c                   .   e Zd ZdZddi fddddifddddifddi fd	dd
difd	dd
difddddifddddifd ej                    fi fddddifddi fddi fddddifd ej                    fi fddi fddi fddi fddi fgZer!e	r e
j                    dk    rneddd
difgz  Zer	eddi fgz  Zer	eddi fgz  Zer	eddi fgz  Zer	ed di fgz  Zered!di fgz  Zed"d#i fgz  Zd$di fd% ej                    gfi fd&di fd'di fgZeZed(             Zej        Zd)S )*rD   zA container that lists all the module-level, system-related APIs.
    Utilities such as cpu_percent() are excluded. Usage:

    >>> ns = system_namespace
    >>> for fun, name in ns.iter(ns.getters):
    ...    fun()
    r  r  rv  logicalFT	cpu_statsr  percpudisk_io_countersperdiskdisk_partitionsr  
disk_usager  r  net_if_addrsnet_if_statsr   pernicrT  r  r  usersr  arm64r   r   r   r   r   win_service_iterwin_service_get)algr  r]  r  cpu_times_percentc              #      K   t          |           } t          j        |            | D ]6\  }}}t          t          |          }t          j        |g|R i |}||fV  7dS r  )r  r  r  r   r   r   r  )r  r  r   r  r   s        r{   r  zsystem_namespace.iter=  s      
 "XXr$& 	" 	" HdD&(++C#C7$777$77C/!!!!	" 	"r}   N)r   r   r   r   r   r   r  r  r%   r   ro   r  HAS_GETLOADAVGr/   r.   r,   r   r   r   r  r  r  r  rC   r  r  r}   r{   rD   rD     se         
b"	b9e,-	b9d+,	b"	b8U+,	b8T*+	R)T!23	B.			~r*	B0	R 	R 	B4 01			~r*	R	B	"b	2r"%G(  < 	<%X%''722R(D)9:;;G ,\2r*++ 6+R455 .^R,-- 1&B/00 7'R011&"566 
R 	))*,b1	B	b"%	G C	" 	" \	" ,?r}   rD   c                 8    d }t          t          d| |          S )zZDecorator which runs a test function and retries N times before
    actually failing.
    c                 B    t          | dt          j                   d S )Nz
, retryingr{  )rM  rw   r   )r~  s    r{   rv  z retry_on_failure.<locals>.logfunQ  s&    """444444r}   N)rs  r/  rt  rv  )rq  r  )rt  rv  s     r{   r@   r@   L  s3    
5 5 5  $   r}   c                       fd}|S )z,Decorator to Ignore AccessDenied exceptions.c                 J     t          j                    fd            }|S )Nc                  n    	  | i |S # t           j        $ r s t          j        d          w xY w)Nzraises AccessDenied)r   r  r  r  )r   r   r   only_ifs     r{   r   z9skip_on_access_denied.<locals>.decorator.<locals>.wrapper]  s]    9sD+F+++& 9 9 9&" k"7888	9s    )4r   r   r   r  s   ` r{   r  z(skip_on_access_denied.<locals>.decorator\  s>    				9 	9 	9 	9 	9 
		9 r}   r  r  r  s   ` r{   r>   r>   Y  s$         r}   c                       fd}|S )z3Decorator to Ignore NotImplementedError exceptions.c                 J     t          j                    fd            }|S )Nc                  x    	  | i |S # t           $ r$ s j        d}t          j        |          w xY w)Nz2 was skipped because it raised NotImplementedError)rb  r   r  r  )r   r   r  r   r  s      r{   r   z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapperp  st    
'sD+F+++& ' ' '&" | + + +  k#&&&'s    .9r   r  s   ` r{   r  z*skip_on_not_implemented.<locals>.decoratoro  s>    				' 	' 	' 	' 	' 
		' r}   r  r	  s   ` r{   r?   r?   l  s$        " r}   	127.0.0.1c                     t          j                     5 }|                    | df           |                                d         cddd           S # 1 swxY w Y   dS )z6Return an unused TCP port. Subject to race conditions.r   ra  N)socketbindgetsockname)hostr"  s     r{   rT   rT     s    	 %D		4)!!!$% % % % % % % % % % % % % % % % % %s   1AAAc                    || t           t          hv rd}t          j        | |          }	 t          j        dvr+|                    t          j        t          j        d           |                    |           |t          j	        k    r|
                    d           |S # t          $ r |                                  w xY w)zBinds a generic socket.Nr`  r   >   ntcygwinra  r   )r   r   r  r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRr  r   listenr   r  )familytypeaddrr"  s       r{   rU   rU     s    |7H"555=&&D	7***OOF-v/BAFFF		$6%%%KKNNN   

s   A4B    C c                 p   t           j        sJ t          j                            |           r
J |             t          j        t
          j        |          }	 |                    |            |t
          j        k    r|	                    d           n## t          $ r |                                  w xY w|S )zBind a UNIX socket.r   )r   r   r   r   r   r  r   r  r   r  r   r  )r   r  r"  s      r{   rV   rV     s    <w~~d##))T)))=..D		$6%%%KKNNN   

 Ks   :B  B3r  c                 "   t          j         | t                    5 }|                    |           |                    d           |                                }t          j         | t                    }	 |                    |           |                                }	 |                                \  }}||k    r||fcddd           S |                                 B# t          $ r |                                  w xY w# 1 swxY w Y   dS )z^Build a pair of TCP sockets connected to each other.
    Return a (server, client) tuple.
    r   TN)	r  r   r  r  r  connectr  r  rJ  )r  r  llrf  caddras         r{   rW   rW     s=    
v{	+	+ r

		!~~M&+..	IIdOOOMMOOE))++45==q6        			  	 	 	GGIII	         s+   AD5A
C!C!! DDDDc                    t           j        sJ dx}}	 t          | t          j                  }|                    d           t          j        t          j        t          j                  }|                    d           |                    |            n;# t          $ r. ||	                                 ||	                                  w xY w||fS )zBuild a pair of UNIX sockets connected to each other through
    the same UNIX file name.
    Return a (server, client) tuple.
    Nr  r   )
r   r   rV   r  r   setblockingr   r   r   r  )r   serverclients      r{   rX   rX     s    
 <FV!$V-?@@@1v~v/ABB1t   LLNNNLLNNN Fs   BB 8Cc               #   ^  K   g } dx}}	 |                      t          t          j        t          j                  t          t          j        t          j                  f           t                      r[|                      t          t          j        t          j                  t          t          j        t          j                  f           t          rmt          rft                      }t                      }t          |          \  }}t          |t          j                  }|||fD ]}|                     |           | V  | D ]}|                                 ||fD ]}|t          |           dS # | D ]}|                                 ||fD ]}|t          |           w xY w)z1Open as many socket families / types as possible.Nr%  )extendrU   r  r   r   
SOCK_DGRAMr   r   r   r0   rL   rX   rV   rL  r  rI   )socksfname1fname2s1s2s3r  r  s           r{   rY   rY     s      EFV#(:;;(9::
 	 	 	 ?? 	LLFOV-?@@FOV->??     	 - 	 \\F\\F$V,,FB!&v/@AAAB"b\    Q 	 	AGGIIIIf% 	# 	#E E"""	# 	#  	 	AGGIIIIf% 	# 	#E E"""	#s   D<E9 93F,c                 Z   t          |t          j                  s
J |            |t          j        k    rpd |                     d          D             }t          |          dk    s
J |             |D ]}d|cxk    rdk    sn J |             t          j        |            dS |t          j	        k    r5t          | t                    s
J |             t          j        |            dS |t          j        k    r!t          j        d|           
J |             dS t!          d|          )	z[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    c                 ,    g | ]}t          |          S r  )rs   r   s     r{   r   z%check_net_address.<locals>.<listcomp>  s    0001A000r}   rf   r   r      z([a-fA-F0-9]{2}[:|\-]?){6}Nzunknown family )r2  enumIntEnumr  r   rt   re  	ipaddressIPv4Addressr   r3  IPv6Addressr   AF_LINKr  r  r   )r  r  octsnums       r{   rR   rR     s=    fdl++33V33300

30004yyA~~~t~~~ 	) 	)C????s?????D????d#####	6?	"	"$$$**d***d#####	6>	!	!x5t<<HH$HHHHH5655666r}   c                     d }d }d }d }d } ||             ||             ||             ||             ||            dS )z*Check validity of a connection namedtuple.c                 D   t          |           dk    }t          |           dv sJ t          |                       | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    |r | d	         | j        k    sJ | j                    d S d S )
Nr   >   rH  r   r   ra  rg   r   r   r   rH  )re  r9  r  r  laddrraddrr  r  )r$  has_pids     r{   check_ntuplez-check_connection_ntuple.<locals>.check_ntuple  s5   d))q.4yyF"""CII"""Aw$'!!!47!!!Aw$+%%%t{%%%Aw$)###TY###Aw$*$$$dj$$$Aw$*$$$dj$$$Aw$+%%%t{%%% 	17dh&&&&&&	1 	1&&r}   c                 N   | j         t          t          t          hv sJ | j                     t	          | j         t
          j                  s
J |             | j         t          k    rt          j        | j         | j                  5 }	 |	                    | j
        d         df           n-# t          $ r }|j        t          j        k    r Y d }~nd }~ww xY wd d d            d S # 1 swxY w Y   d S | j         t          k    r$| j        t          j        k    sJ | j                    d S d S r  )r  r   r   r   r2  r5  r6  r  r  r  r?  rJ  errnoEADDRNOTAVAILr  r   	CONN_NONE)r$  r  rL  s      r{   check_familyz-check_connection_ntuple.<locals>.check_family   ss   {w'::::DK:::$+t|44::d:::;'!!
 t{DI66 !FFDJqM1-....   yE$777 87777                  [G##;&"2222DK222 $#22s<   C""B('C"(
C2CC"CC""C&)C&c                 p   t          t          dt                                }| j        t          j        t          j        |hv sJ | j                    t          | j        t          j                  s
J |             | j        t          j        k    r$| j	        t          j        k    sJ | j	                    d S d S )NSOCK_SEQPACKET)r   r  objectr  r   r+  r2  r5  r6  r  r   rF  )r$  rI  s     r{   
check_typez+check_connection_ntuple.<locals>.check_type1  s     )9688DDy
 
 
 
 9	
 
 

 $)T\2288D8889)));&"2222DK222 *)22r}   c                    | j         | j        fD ]}| j        t          t          hv rt          |t                    sJ t          |                      |sFt          |j        t                    sJ t          |j                              d|j        cxk    rdk    sn J |j                    t          |j        | j                   | j        t          k    r,t          |t                    sJ t          |                      d S )Nr   i  )r?  r@  r  r   r   r2  rq   r  portrs   rR   ipr   r3  )r$  r  s     r{   check_addrsz,check_connection_ntuple.<locals>.check_addrs=  s   Z, 		9 		9D{w111!$..::T

::: !$)S11BB4	??BBBDI.........	...!$'4;7777''!$,,88d4jj888		9 		9r}   c                    t          | j        t                    sJ | j                    d t          t                    D             }| j        |v sJ | j                    | j        t          t          hv r6| j        t          k    r&| j        t          j
        k    sJ | j                    d S | j        t          j
        k    sJ | j                    d S )Nc                 b    g | ],}|                     d           t          t          |          -S )CONN_r   r   s     r{   r   zAcheck_connection_ntuple.<locals>.check_status.<locals>.<listcomp>L  sC     
 
 
#$q||G7L7L
FA
 
 
r}   )r2  r  r3  r   r   r  r   r   r  r   rF  )r$  validss     r{   check_statusz-check_connection_ntuple.<locals>.check_statusJ  s    $+s++88T[888
 
(+F
 
 
 {f$$$dk$$$;7H---$){2J2J;&"2222DK22222;&"2222DK22222r}   Nr  )r$  rB  rG  rK  rO  rT  s         r{   check_connection_ntuplerU    s    
1 
1 
1@ @ @"
@ 
@ 
@9 9 9	@ 	@ 	@ LLJtKLr}   c                     g }| D ]V}t           r8|j        t          j        k    r#t          rd|j        v rt          d|            A|                    |           W|S )ztOur process may start with some open UNIX sockets which are not
    initialized by us, invalidating unit tests.
    z/syslogz	skipping )r   r  r  r   r   r@  r   rL  )consnewr$  s      r{   rS   rS   \  sv     C   	T[FN22 dj00($(()))

4Jr}   c                 *    t          j        |           S r   )	importlibreload)modules    r{   rZ   rZ   o  s    F###r}   c                 <   t           j                            t           j                            |                     d         }t          j                            ||           }t          j                            |          }|j        	                    |           |S r  )
r   r   splitextr  rZ  utilspec_from_file_locationmodule_from_specloaderexec_module)r   r   specmods       r{   r[   r[   s  ss    7BG,,T2233A6D>11$==D
.
)
)$
/
/CKC   Jr}   c                 >    t          j        | t          d           dS )zRaise a warning msg.rg   r  N)r  r\   r  )r  s    r{   r\   r\     s    M#{q111111r}   c                     t          |           }|j        }t          |          dk    s|d         t          urdS t	          |dd          }t          |t                    sdS t          d |D                       S )z-Check if object is an instance of namedtuple.ra  r   F_fieldsNc              3   @   K   | ]}t          |t                    V  d S r   )r2  r3  )r   ns     r{   rw  z is_namedtuple.<locals>.<genexpr>  s,      --az!S!!------r}   )r  	__bases__re  rq   r   r2  r  )r   tbr,  s       r{   r^   r^     s{    QA	A
1vv{{ad%''u9d##Aa u--1------r}   c              #   |  K   t           rdnddt          | z             }fdt          j                                                    D             }t          j        |          }t          j        ||           	 t          j
        |           |V  t          |           dS # t          |           w xY w)zCtx manager which picks up a random shared CO lib used
        by this process, copies it in another location and loads it
        in memory via ctypes. Return the new absolutized path.
        pypyrg  z.sor  c                     g | ]R}t           j                            |j                  d          k    0|j                                        v K|j        SS )ra  )r   r   r^  lower)r   r   r   exts     r{   r   z'copyload_shared_lib.<locals>.<listcomp>  s[     
 
 
w''*c11cQV\\^^6K6K F6K6K6Kr}   N)r   rL   r   r   r   r  r  r   r  ctypesCDLLrI   )r  dstlibsr!  r   rr  s       @@r{   r]   r]     s       *ff(---
 
 
 
 
^%%1133
 
 

 mD!!S!!!	KIIIKs   B* *B;c              #     	K   ddl m} ddl m} d	t          | 	z             }	fdt	          j                                                    D             }t          r1|s/d t	          j                                                    D             }t          j	        |          }t          j        ||           d}	 t          j        |          }|V  |Ct           j        j        j        }|j        g|_         ||j                  }|dk    r
 |            t'          |           dS # |Ct           j        j        j        }|j        g|_         ||j                  }|dk    r
 |            t'          |           w xY w)	zCtx manager which picks up a random shared DLL lib used
        by this process, copies it in another location and loads it
        in memory via ctypes.
        Return the new absolutized, normcased path.
        r   )WinError)wintypesz.dllr  c                    g | ]}|j                                                                       rZd t          j                             |j                                                   v r"d|j                                         v|j         S )rg  wow64)r   rq  r8  r   r  )r   r   rr  s     r{   r   z'copyload_shared_lib.<locals>.<listcomp>  s     
 
 
v||~~&&s++
 BG,,QV44::<<<<qv||~~--	 F .--r}   c                     g | ]A}d t           j                            |j                                                  v :|j        BS )ro  )r   r   r  rq  r   s     r{   r   z'copyload_shared_lib.<locals>.<listcomp>  sM       RW--af55;;==== ===r}   N)rs  rx  ry  rL   r   r   r   r   r  r  r   r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerI   )
r  rx  ry  ru  rv  r!  cfiler  r  rr  s
            @r{   r]   r]     s      	$###########---
 
 
 
^%%1133
 
 
  	 	 ))5577  D
 mD!!S!!!	M#&&EIII  $m4@(0(8'9$!k%-00!88"(**$  $m4@(0(8'9$!k%-00!88"(**$s   :D( (AE>c                  &    t          d           d S )NTrY  )r8   r  r}   r{   cleanup_test_procsr    s    D!!!!!!r}   c                 *    t          j        |           S r   )rw   exit)rE  r%  s     r{   r  r    s    # r}   r   )F)TFr  )r  )r  r  )r   r  r  rs  r5  rD  r   rD  rZ  r7  r   ro   r  r  r  r4  r   rA  r  r  ru   rw   r  r	  r   r   r=   r  r   r   r   r  r  r   r   r   r   r	   r
   r   r   r   psutil._commonr   r   r   r   r   psutil._psposixr   __all__builtin_module_namesr   r   r`   r    r3   r5   maxsizer#   r  r4   r|   r1   r2   r   r   r"   r   r   r  r   r   decoder   r  rq  ASCII_FSr   r   r   r  __file__r   getr   r  r  r   r$   r%   r&   r  r(   r)   r0   HAS_NET_IO_COUNTERSr*   r'   r+   r,   r]  r   r-   r   r.   r/   HAS_THREADSgetuidSKIP_SYSCONSr   r   r   r)  devnullr   r  r  r   r!   r   rJ  r   r   r   r  r   r<   r   r9   r;   r:   r6   r;  r  r7   r8   rN   rM   rq  r>  rP   r  r  rQ   rO   rI   r  r  rH   rJ   rK   rL   rG   r  rB   r  r  rA   rE   rF   r  rC   rD   r@   r>   r?   rT   rU   rV   rW   rX   rY   rR   rU  rS   rZ   r[   r\   r^   r]   r  r  r}   r{   <module>r     s  
               				         				   				           



                           MMMM   FFF                                                  & & & & & &             " " " " " " & & & & & & ( ( ( ( ( ( 	 )((((((# # #Z S--!RZ/O>RZ3O
RZ''2:5;
(


	
) 	  	( 	  =??X-L =??g-LLLL 
# '  !OJaNA
 7f-yry{{---MM-yry{{---M%,,V5FGG $3$&&,,..2GG 7GLL**D$77  jnn"',,x;;  
w1122 76>>:: wvz**gfni00..WV^X..
'&.-88 .Y gf&788 76>955 wv~}== WV^X..
gf&788 %H$$/Ev/E/G/G*H*HKK   KKK76>22 "76+ABB gfni002)")++"2
) ) )X )[]] 
N
$rz4
 
       #F    '&)VVXX
.
. ( ( ( ( (! ( ( (`	 	 	 & & & &R # # #L& & &R   &   0  &~N Q/ Q/ Q/ Q/h- - - -J! ! !0  6 6 6 6 6 6 6 6r "	      .1	      	      D          4   &J# J# J# J# J# J# J# J#Z 
>FB B B B BX& B B B` D!566b% b% b% b% b%^ b% b% 76b%Ji i iX  $  FL FL FL FL FL FL FL FLRC@ C@ C@ C@ C@ C@ C@ C@L ( 
 
 
 
   &   :% % % % [t    " !' 2       .  . # # #<7 7 7(H H HV  &$ $ $  2 2 2
	. 	. 	. 	 E    . * * * *f " " " 	 @FM&.">">?????@ @s$   B BBM2 2M<;M<