
    Xi                        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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+m0Z0 e(rddl1m2Z2 g dZ3dej4        v Z5de
j6        v pde
j6        v Z7e7Z8de
j6        v Z9de
j6        v Z:ej;        dk    Z< ej=                    >                                dv Z? ej=                    dk    Z@e.d             ZAe%r eA            dk    ZB eA            dk    ZCnd ZBd ZCd!ZDd"ZEd#ZFd$ZGe8reDd%z  ZDeGd%z  ZGeEd&z  ZEeFd%z  ZFd' e
jH                     d(ZId)ZJd*K                    d+d,          ZL ejM                    >                                d-v ZNe
j6        O                    d.          pKe
jP        Q                    e
jP        R                    e
jP        S                    eT          d/d/                    ZUe
jP        R                    eUd0          ZVe
jP        Q                    e
jP        S                    eT                    ZW eXe"jY        d1          ZZ eXe"jY        d2          Z[ eXe"d3          Z\ eXe"jY        d4          Z] eXe"jY        d5          Z^e(oe) Z_ eXe"d6          Z` eXe"jY        d7          Za eXe"jY        d8          Zb eXe"jY        d9          Zc eXe"d:          Zd eXe"d;          Ze eXe"d<          Zf eXe"jY        d=          Zge%se#o e
jh                    dk    Zi	 edo ej e"jk                              Zln9# em$ r1  ejn         ejo        ep ejq                                         d ZlY nw xY w	  eXe"d>          o ej e"jr                              Zsn9# em$ r1  ejn         ejo        ep ejq                                         d ZsY nw xY wd? Zt et            \  ZuZv ewe
jx        d@          Zy ejn        eyjz                   dA  e{e"          D             Z| e}edB e~                      Z e            Z e            Z G dC dD          Zeej        _m        e  eZ eej        dE<   e                                  G dF dGej                  ZdH ZeddI            ZedJ             ZdK ZedL             ZedM             Zej        eGfdNZddOZdP ZdQ Z G dR dS          Z ee"j        deGdTU          dV             Z eeefdeGdTU          ddX            Z eee j        jm        fdeGdTU          dY             ZdZ Zd[ Zej        d\             Zd] Zdd^Zdd`Z G da dbej                  Ze j                            e5dcd          e j                            def           G dg dhe                                  Zdi Zdj Z G dk dl          Z G dm dn          ZeDfdoZddpZddqZddsZeedfdtZej        fduZddwZdx Zej        dy             Zdz Zd{ Zd| Zd} Zd~ Zd Zd Ze(rej        dd            Znej        dd            Zejn        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)J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_subprocspawn_zombiespawn_children_pair
ThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespace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        >   arm64aarch64riscv64c                     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     m/var/www/development/aibuddy-work/election-extract/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    )ri      )   r   Fri   i  P i            z@psutil--u   -ƒőős   futf8surrogateescape>   us-asciiasciiPSUTIL_ROOT_DIRz..scriptscpu_affinityenviron
getloadavgionicememory_mapsnet_io_counterscpu_numio_countersrlimitsensors_batterysensors_fanssensors_temperaturesthreadscpu_freqc            	      .   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)rv   
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{}.{}rh   z"can't find python exe real abspath)osr   copygetattrrx   r   version_infory   r_   r   pathrealpathshutilwhichformatpsutilProcessr   
ValueErrorexists)r   rn   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                       e Zd ZdZed             Zed             Zedd            Zedd            Zedd            Z	edd	            Z
 G d
 d          ZdS )rF   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                  4    d } t          j        |            d S )Nc                  >    t          j        dt          d           d S )Nz<Fake pytest module was used. Test results may be inaccurate.   
stacklevelwarningsr[   UserWarning r~   r|   _warn_on_exitz0fake_pytest._warn_on_exit.<locals>._warn_on_exit!  s.    MN     r~   )atexitregister)r   s    r|   r   zfake_pytest._warn_on_exit  s)    	 	 	 	&&&&&r~   c                      t          j                                        t                    }t          j        d                              |           |S )zMimics pytest.main(). It has the same effect as running
        `python3 -m unittest -v` from the project root directory.
        rh   )	verbosity)r=   
TestLoaderdiscoverHERETextTestRunnerrun)argskwsuites      r|   mainzfake_pytest.main*  sG    
 #%%..t44!,,,00777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 N)_excselfs    r|   valuez/fake_pytest.raises.<locals>.ExceptionInfo.value:  s
    y r~   )__name__
__module____qualname__r   propertyr   r   r~   r|   ExceptionInfor   7  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searchstrr   )excmatcheinfoerr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.raises3  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.warnsM  sI      	H$&&77GGG ""..w777r~    c                 *    t          j        |           )zMimics `unittest.SkipTest`.)r=   SkipTestreasons    r|   skipzfake_pytest.skipT  s     '''r~   c                 N    t          j                                        |           S )zMimics `pytest.fail`.)r=   r   failr   s    r|   r   zfake_pytest.failY  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   names     r|   __init__z%fake_pytest.mark.xdist_group.__init__h  s    r~   c                     |S r   r   )r   cls_or_meths     r|   __call__z%fake_pytest.mark.xdist_group.__call__k  s    ""r~   r   )r   r   r   __doc__r  r  r   r~   r|   xdist_groupr  e  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   r~   r|   rF   rF     s          ' ' \'   \ ) ) ) \)2 8 8 8 \8 ( ( ( \( 0 0 0 \0# # # # # # # # # #r~   rF   pytestc                   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?)superr  _running	_interval	threadingEvent_flag)r   	__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  r   r  idr	  s     r|   __repr__zThreadTask.__repr__  s8    ~&C4CC$-CCRXXCCCCCr~   c                 .    |                                   | S r   )startr   s    r|   	__enter__zThreadTask.__enter__  s    

r~   c                 .    |                                   d S r   )stop)r   r   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|   r   zThreadTask.run  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.stop  s3    } 	0.///		r~   )r   r   r   r  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>.wrapper  sD    	3'''' 	 	 	OOO	s    %	functoolswraps)r8  r9  s   ` r|   _reap_children_on_errr=    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   cwdrn      creationflagsNdirzimport time;open(r'z6', 'w').close();[time.sleep(0.1) for x in range(100)];rk   Tdeleteempty)
setdefaultr   r   getcwdr   r   rK   rH   r   rv   Popen_subprocesses_startedaddrP   rO   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r|   r9   r9     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().
    NrC  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   )rB  TFrE  )rK   r   rI  textwrapdedentr   basenamer   r   r6   r   r   rM  rt   rP   _pids_startedrL  rH   )tfilerQ  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   rK   rU  rV  rU   
settimeoutr   r6   acceptselectfilenort   recvrX  rL  r   rN   closerH   )		unix_filesrcrY  sockparentconn_zpidrd  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)rH  rK   openwriter9   r   r
  rO   rM  r7  rH   )rm  rO  srcfilefr[  s        r|   r6   r6   5  s    	OOHd###OOHd###llG'3 	1GGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	j!&1::T::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.
    rA  r   r   r   ro   TrB  timeout
N)r   rH  rv   r   
isinstancer   shlexru   rJ  rK  rL  communicater   
returncodeRuntimeErrorr[   endswith)rN  rO  flagspr   r   s         r|   shr  I  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   r~  rv   rJ  r   r   rM  NoSuchProcess)procr{  s     r|   r-  zterminate.<locals>.waitm  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>.sendsigv  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{  r   r  r  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{  r  r  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   )rM  r{  r  r  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   rk  r   r?  r  s    r|   flush_popenzterminate.<locals>.flush_popen  sl    ; 	 K; 	 K: 	J	 	r~   zwrong type )	r~  rt   rv   rJ  r   rM  
pid_existsr   	TypeError)proc_or_pidr  wait_timeoutr  r  r  r  rM  r  r  r-  s    `      @@@r|   r7   r7   b  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)r  rz  zcouldn't terminate process z; attempting kill())r  )r   r   childrenrK  popr7   rX  
wait_procsr   r[   r  r  )r  r  r[  rM  r  rq  alives          r|   r8   r8     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 POSIXr   rh   rg   zcan't parse r   r   r   )	r   NotImplementedErrorr   unameisdigitr   ru   rt   len)rZ  r  cminormicronumsmajors          r|   rM   rM     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   r   )r   r  rx   getwindowsversionservice_pack_major)wvsps     r|   rL   rL     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   r  r{  r  r  r  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{  r0  r  range)r   stop_atrq  s      r|   __iter__zretry.__iter__  s      < 		ikkDL0G)++'' )++''''''\ 	4<((   r~   c                 J    | j         t          j        | j                    d S d S r   )r  r0  r1  r   s    r|   r1  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   )r  r  r1  )r   r)  r   rq  r8  r   s       r|   r9  zretry.__call__.<locals>.wrapper$  s    C  3//////~   C{.C(((JJLLLHHHH Is   
A2AA)r;  r<  	decorator)r   r8  r9  s   `` r|   r  zretry.__call__#  sF    				 	 	 	 	 
		  !r~   )	r   r   r   r  r7  r  r  r1  r  r   r~   r|   r  r     sl             
 
 
& & &    r~   r  r  )r  r  r{  r  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   rM  s    r|   rO   rO   9  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)ru  readrH   )fnamerF  rG  rx  datas        r|   rP   rP   H  s     
eT		 avvxx                EKs   266c                 "     |             }|sJ |S )z1Keep calling function until it evaluates to True.r   )r8  rets     r|   rN   rN   Y  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?)r0  r   FileNotFoundErrorr  r[   r1  )r8  r  rq  r   s       r|   	retry_funzsafe_rmpath.<locals>.retry_funn  s    
 )++.ikkG##(suu$    ( ( (&&&''''''''( Jt ikkG## 	s   	> 
A1
	A1A,,A1N)r   statS_ISDIRst_moder;  partialr   rmtreeremover   r  )r   r  str8  s       r|   rH   rH   k  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FileExistsErrorrC  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   rI  rG   )dirnamecurdirs     r|   rG   rG     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   r   r   rH   r   copyfiler   r   r  chmodr  S_IEXEC)r   r  s     r|   rI   rI     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          S |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suffixrt  z-o)r   r   r   r   r   r  r   rU  rV  r~  r   r   r   rH   ru  rK   rv  rv   r   r
  )r   c_coderx  s      r|   rJ   rJ     sa   w~~d##))T)))< 3{1222~ "   &#&&.....
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  rD  )
tempfilemktempr   r   r   r   r   r   r   rH   )r  rD  r
  r   s       r|   rK   rK     sd    mFLLLw~~d## 	7##D))DOK...Kr~   c                   V    e Zd 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 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.
    c                     | j         j        }|                    d          sd|z   }d                    || j         j        | j                  S )Nzpsutil.zpsutil.tests.z{}.{}.{})r  r   r   r   r   _testMethodName)r   fqmods     r|   __str__zPsutilTestCase.__str__  sU    )	** 	,#e+E  N# 
 
 	
r~   r   Nc                 ^    t          ||          }|                     t          |           |S )N)r  rD  )rK   
addCleanuprH   )r   r  rD  r  s       r|   rK   zPsutilTestCase.get_testfn  s-    &c222U+++r~   c                 T    t          |i |}|                     t          |           |S r   )r9   r  r7   )r   r   rO  rS  s       r|   r9   zPsutilTestCase.spawn_subproc  s-    t,t,,	5)))r~   c                      | j         |i |}	 t          j        |j                  S # t          j        $ r |                     |j                    w xY wr   )r9   r   r   rM  r  assert_pid_gone)r   r   r)  rS  s       r|   spawn_psproczPsutilTestCase.spawn_psproc  sg    ""D3F33	>%),,,# 	 	 	  +++	s	   ( +A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   ro  rd  s      r|   r:   zPsutilTestCase.spawn_zombie  sB    %	6***	6***r~   c                     t          |i |\  }}|                     t          |           |                     t          |           |S r   )r6   r  rH   r7   )r   r   rO  rS  rw  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   )r~  r   ErrorrM  r
  _nameZombieProcessppid_ppidr   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          d| d          # t           j        $ r t          d          t           j        $ r }|j        |k    sJ |j        J Y d }~nd }~ww xY wt          j        |          r
J |            |t          j                    vsJ |d t          j	                    D             vsJ d S )Nzdid not raise NoSuchProcess ()z&wasn't supposed to raise ZombieProcessc                     g | ]	}|j         
S r   r  r   s     r|   r   z2PsutilTestCase.assert_pid_gone.<locals>.<listcomp>)  s    @@@Q15@@@r~   )
r   r   r   r  r  rM  r
  r  r  process_iter)r   rM  r  r   s       r|   r  zPsutilTestCase.assert_pid_gone  s   	J>#&&D !!H!H!H!HIII # 	K 	K 	K !IJJJ# 	$ 	$ 	$7c>>>>8########	$ $S))..3...&+--''''@@&*=*?*?@@@@@@@@@s   ) ,A5A00A5c                    |                      |j                   t          |          }|                    |j        d          D ]\  }}|                     t          |          |          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   rz  )r  rM  rC   iterallsubTestr   r   r   r  r  r	  r-  )r   r  nsr8  r
  r  r   r   s           r|   assert_proc_gonezPsutilTestCase.assert_proc_gone+  s   TX&&&t$$T:: 	. 	.IC3t99488 . ..#%%C$4 $ $$ $  )--- +   + 4 4 4((s3333333343. . . . . . . . . . . . . . . 			!	s<   /C 1
B;C C0CC CC  C$	'C$	c                    d }t          j        |j                  }||k    sJ t          s0t          s)t
          s"t          |          t          |          k    sJ |                                t           j        k    sJ |	                                sJ t          j
        |j                  sJ |                                  ||           t          |          }|                    |j        d          D ]\  }}|                     t!          |          |          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  ||           d S )Nc                     t           rd S | 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   zMPsutilTestCase.assert_proc_zombie.<locals>.assert_in_pids.<locals>.<listcomp>D      EEE!EEEr~   c                     g | ]	}|j         
S r   r  r   s     r|   r   zMPsutilTestCase.assert_proc_zombie.<locals>.assert_in_pids.<locals>.<listcomp>F  r  r~   )r   rM  r   r  r  _pmapr  s    r|   assert_in_pidsz9PsutilTestCase.assert_proc_zombie.<locals>.assert_in_pids?  s     8v{}},,,,8EEv/B/D/DEEEEEEEFL8EEv/B/D/DEEEEEEEEEr~   Tr  r  )r   r   rM  r
   r	   r   hashrb  rc  
is_runningr  as_dictrC   r  r  r  r   r  AccessDeniedr	  r   r  r   cmdliner   r   r   suspendresumer7   kill)	r   r  r  cloner  r8  r
  r   cms	            r|   assert_proc_zombiez!PsutilTestCase.assert_proc_zombie>  s   	F 	F 	F tx((
 u}}}} 	-6 	-U 	-::e,,,,{{}} 44444      *****tt$$T:: 	4 	4IC3t99488 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		      *****tsr   $E;&
D10E;1E,E'"E;'E,,E;;E?	E?	-GGGH33H7:H77JJJr   N)r   r   r   r  r  rK   r9   r  r;   r:   r6   r	  r  r  r(  r   r~   r|   rB   rB     s         
 
 
   
  
                A A A  &6 6 6 6 6r~   rB   zunreliable on PYPYr   serial)r
  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)
       ri   r   r   TPSUTIL_DEBUGc                 .    t          j        d           d S )NF)r   
_set_debugclss    r|   
setUpClasszTestMemoryLeak.setUpClass  s    %     r~   c                 8    t          j        | j                   d S r   )r   r/  _psutil_debug_origr0  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   r8  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   rx   r   )r   r   s     r|   _logzTestMemoryLeak._log  s3    < 	>8#*======	> 	>r~   c                 >   |                                  }|                     |           |                                  }||z
  }|dk     rd|d}t          j        |          S |dk    r4t          rdnd}|dk    r|dz  }| d| d	|}t          j        |          S 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handler   rZ  z
 unclosed z after calling N)r@  callr  r   r   )r   r8  beforeafterdiffr   type_s          r|   
_check_fdszTestMemoryLeak._check_fds  s    
 ""$$		#!!##v~!882 2 2 2  ;s###!88!/DDxEaxxBBUBB3BBC;s### 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.
        r   )
generation)gccollectr<  r  rJ  garbage)r   r8  timesmem1r   r  mem2rM  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  }|	}t          j        d	                    |                    S )Nr   r   z,Run #{}: extra-mem={}, per-call={}, calls={}z. )
r  rX  r   r   appendrF  printr  r   r3  )r   r8  rU  r  	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tt!88GGG		#!{499X..///r~   c                      |            S r   r   )r   r8  s     r|   rJ  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.Nr   ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rU  r  r\  )
rU  warmup_timesr  r\  r   r   r   rX  rO  rb  )r   r8  rU  re  r  r\  r   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                 2    fd} | j         |fi | dS )znConvenience method to test a callable while making sure it
        raises an exception on every call.
        c                  d    	               t          j         d            S #  $ r Y d S w xY w)Nz did not raise )r  r   )r   r8  s   r|   rJ  z*TestMemoryLeak.execute_w_exc.<locals>.call&  sX    A {c#?#?##?#?@@@    s   
& //N)rf  )r   r   r8  r)  rJ  s    ``  r|   execute_w_exczTestMemoryLeak.execute_w_exc!  sJ    
	A 	A 	A 	A 	A 	A 	T$$V$$$$$r~   )NNNN)r   r   r   r  rU  re  r\  r    r  rE  r   r   r8  boolr   getenvr4  classmethodr2  r5  r<  r@  rF  rO  rX  rb  rJ  rf  ri  r   r~   r|   rA   rA     s8        > ELI%bbAGG  Iibi7788! ! [! 2 2 [2, , ,0 0 0> > >$ $ $,  0 0 08   KOP P P P,% % % % %r~   rA   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 csvr   c                 :    g | ]}|                     d d          S )r   r   )replacer   s     r|   r   z@is_win_secure_system_proc.<locals>.get_procs.<locals>.<listcomp>8  s&    @@@1AIIc2&&@@@r~   ,r   )r  
splitlinesru   rt   )r  outlinebitsr
  rM  s         r|   	get_procsz,is_win_secure_system_proc.<locals>.get_procs3  s{    +,,NN$$QRR( 	 	D@@

3@@@DQT!W#DCHH
r~   zSecure SystemF)r   KeyError)rM  rv  s     r|   rE   rE   1  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   hasattrr   randomchoicer   )r  s    r|   _get_eligible_cpur|  C  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  r  Tconnectionsr  oneshotro  parentsrM  r-  r   r"  	cpu_timescreate_timer@  r   r9  memory_infor
  net_connectionskindr  nicenum_ctx_switchesnum_threads
open_filesr  rb  r   usernameuidsgidsterminalr>  r   r   r   r   r   r   r?  r   groupedF)r`  i   r   r  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)listrz  shuffler  r   r  r;  r  )r   lsr  fun_namer   rO  r8  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  _initrM  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)ry  r  r   AttributeError)r1  
test_classr  r  rq  	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   rq  r   r   s     r|   r  z)process_namespace.test.<locals>.<setcomp>  s!    ???q1Q43;;;;;r~   zuncovered Process class names: )r  ignoredrD  r   r   r   )r1  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|  r  SIGTERMkillersCTRL_C_EVENTCTRL_BREAK_EVENTr  r  r  r  rl  r  r  r   r~   r|   rC   rC   L  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
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()
    	boot_timer   	cpu_countlogicalFT	cpu_statsr  percpudisk_io_countersperdiskdisk_partitionsr  
disk_usager  r  net_if_addrsnet_if_statsr   pernicr  r  swap_memoryusersvirtual_memoryr   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  rz  r  r   r   r;  r  )r  r  r   rO  r8  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   rI  getpidr  r%   r   r4   HAS_GETLOADAVGr/   r.   r,   r   r   r   r  r  r  r  rC   r  r   r~   r|   rD   rD     sV         
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(  < 	<W 	<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                 Z    d }t          t          t          j        j        fd| |          S )zZDecorator which runs a test function and retries N times before
    actually failing.
    c                 B    t          | dt          j                   d S )Nz
, retrying)rD  )r[  rx   r   )r   s    r|   r  z retry_on_failure.<locals>.logfun   s&    """444444r~   N)r  r{  r  r  )r  r   r  r   r7  )r  r  s     r|   r@   r@     s@    
5 5 5 !6;#89	   r~   c                       fd}|S )z,Decorator to Ignore AccessDenied exceptions.c                 J     t          j                    fd            }|S )Nc                  r    	  | i |S # t           j        $ r s t          j        d          cY S w xY w)Nzraises AccessDenied)r   r!  r  r   )r   r)  r8  only_ifs     r|   r9  z9skip_on_access_denied.<locals>.decorator.<locals>.wrapper/  sc    :sD+F+++& : : :&" {#899999	:s    (66r:  r8  r9  r  s   ` r|   r  z(skip_on_access_denied.<locals>.decorator.  s>    				: 	: 	: 	: 	: 
		: r~   r   r  r  s   ` r|   r>   r>   +  s$         r~   c                       fd}|S )z3Decorator to Ignore NotImplementedError exceptions.c                 J     t          j                    fd            }|S )Nc                  |    	  | i |S # t           $ r& s j        d}t          j        |          cY S w xY w)Nz2 was skipped because it raised NotImplementedError)r  r   r  r   )r   r)  r   r8  r  s      r|   r9  z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapperB  sz    
(sD+F+++& ( ( (&" | + + +  {3'''''(s    -;;r:  r  s   ` r|   r  z*skip_on_not_implemented.<locals>.decoratorA  s>    				( 	( 	( 	( 	( 
		( r~   r   r  s   ` r|   r?   r?   >  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   r   N)socketbindgetsockname)hostrn  s     r|   rS   rS   [  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cygwinr   r   )r   r   r  r   r
  
setsockopt
SOL_SOCKETSO_REUSEADDRr  r   listenr7  rk  )familytypeaddrrn  s       r|   rT   rT   b  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  r7  rk  )r
  r  rn  s      r|   rU   rU   s  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  connectrg  rk  r  )r  r  llr  caddras         r|   rV   rV     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   rU   r  r   setblockingr   r  r7  rk  )r
  serverclients      r|   rW   rW     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  )extendrT   r  r   r   
SOCK_DGRAMr   r   r   r0   rK   rW   rU   rZ  rk  rH   )socksfname1fname2s1s2s3rZ  r  s           r|   rX   rX     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   )rt   r   s     r|   r   z%check_net_address.<locals>.<listcomp>  s    0001A000r~   rg   r   r      z([a-fA-F0-9]{2}[:|\-]?){6}Nzunknown family )r~  enumIntEnumr  r   ru   r  	ipaddressIPv4Addressr   r   IPv6Addressr   AF_LINKr   r   r   )r  r  octsnums       r|   rQ   rQ     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   >   r  r   r   r   rh   r   r   r   r  )r  rH  r  r  laddrraddrrb  rM  )rp  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   r~  r  r  r  r  r  r  r  errnoEADDRNOTAVAILrb  r   	CONN_NONE)rp  rZ  r   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  r~  r  r  rb  r   r  )rp  r  s     r|   
check_typez+check_connection_ntuple.<locals>.check_type  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   r~  rr   r  portrt   rQ   ipr   r   )rp  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>  sC     
 
 
#$q||G7L7L
FA
 
 
r~   )r~  rb  r   rD  r   r  r   r   r  r   r  )rp  validss     r|   check_statusz-check_connection_ntuple.<locals>.check_status  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   )rp  r  r  r  r  r!  s         r|   check_connection_ntupler"    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   rZ  )consnewrp  s      r|   rR   rR   .  sv     C   	T[FN22 dj00($(()))

4Jr~   c                 *    t          j        |           S r   )	importlibreload)modules    r|   rY   rY   A  s    F###r~   c                 <   t           j                            t           j                            |                     d         }t          j                            ||           }t          j                            |          }|j        	                    |           |S r  )
r   r   splitextrW  r'  utilspec_from_file_locationmodule_from_specloaderexec_module)r   r
  specmods       r|   rZ   rZ   E  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.rh   r   Nr   )r   s    r|   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.r   r   F_fieldsNc              3   @   K   | ]}t          |t                    V  d S r   )r~  r   )r   ns     r|   	<genexpr>z is_namedtuple.<locals>.<genexpr>`  s,      --az!S!!------r~   )r  	__bases__r  rr   r   r~  r  )r   tbrx  s       r|   r]   r]   W  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.
        pypypythonz.sor  c                     g | ]R}t           j                            |j                  d          k    0|j                                        v K|j        SS )r   )r   r   r+  lower)r   r   r   exts     r|   r   z'copyload_shared_lib.<locals>.<listcomp>n  s[     
 
 
w''*c11cQV\\^^6K6K F6K6K6Kr~   N)r   rK   r   r   r   rz  r{  r   r  ctypesCDLLrH   )r  dstlibsrm  r   rA  s       @@r|   r\   r\   e  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 )r>  wow64)r   r@  r  r   rW  )r   r   rA  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 )r=  )r   r   rW  r@  r   s     r|   r   z'copyload_shared_lib.<locals>.<listcomp>  sM       RW--af55;;==== ===r~   N)rB  rG  rH  rK   r   r   r   r   rz  r{  r   r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerH   )
r  rG  rH  rD  rE  rm  cfilerO  r  rA  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 )NTr  )r8   r   r~   r|   cleanup_test_procsrU    s    D!!!!!!r~   c                 *    t          j        |           S r   )rx   exit)r  rq  s     r|   re  re    s    # r~   r   )F)TFr)  )r  )r  r  )r  r   r   rB  r  r  r;  rR  r'  r  r   rp   rz  r   rh  r  r   r  r  r  rv   rx   r  rU  r  r0  	tracebackr=   r   r   r   r   r  ImportErrorr   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#   machiner@  r4   RISCV64r}   r1   r2   r   r   r"   r   r  r   r   decoder   getfilesystemencodingASCII_FSgetr   r   r3  r  __file__r   r   r   ry  r   r$   r&   r  r(   r)   r0   HAS_NET_IO_COUNTERSr*   r'   r+   r,   r.   r/   HAS_THREADSgetuidSKIP_SYSCONSrj  r   r-   r7  r   r  r[  
format_excr   r%   r   r   r   ru  devnullr   rk  rD  r!   r   r  r   r/  rK  rX  rF   r   r   modulesr   r,  r<   r=  r9   r;   r:   r6   r  r  r7   r8   rM   rL   r  r  rO   r  rP   rN   rH   r  r   rG   rI   rJ   rK   r   rB   r  r  r  rA   rE   r|  rC   rD   r@   r>   r?   rS   rT   rU   rV   rW   rX   rQ   r"  rR   rY   rZ   r[   r]   r\   rU  r   r~   r|   <module>rm     sv  
               				         				   				           



                               MMMM   FFF                                                  & & & & & &             " " " " " " & & & & & & ( ( ( ( ( ( )((((((# # #Z S--!RZ/O>RZ3O
RZ''2:5;
(



"
"
$
$(<
<
(


	
) 	  	( 	  =??X-L =??g-LLLL 
# '  !OJaNA
 *929;;)))%,,V5FGG $3$&&,,..2GG :>>+,, 0@0@GLL**D$771 1 gll8Y//	w1122 76>>:: gfni00..WV^X..
'&.-88 .Y gf&788 76>955 wv~}== WV^X..
gf&788 76>22 "76+ABB gfni002)")++"2%H$$/Ev/E/G/G*H*HKK   FO%I%e-AY-A-C-CDDEEEKKK76:..J448I8I3J3JLL   FO%I%e-AY-A-C-CDDEEELLL) ) )X )[]] 
N
$rz4
 
       #F    '&)VVXX
.
. U# U# U# U# U# U# U# U#r ,   
>F'CK( ( ( ( (! ( ( (`	 	 	 & & & &R # # #L& & &R   &   0  &~N Q/ Q/ Q/ Q/h- - - -J! ! !0  6 6 6 6 6 6 6 6r "	      .1	      v{45	      D          4   &\ \ \ \ \X& \ \ \Z D!566h''g% g% g% g% g%^ g% g% (' 76g%T  $  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&.">">?????@ @s6   B BBN/ /3O%$O%)$P 3QQ