
    Xhn                       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 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jh                  v Z5de
jl                  v xs de
jl                  v Z7e7Z8de
jl                  v Z9de
jl                  v Z:ejv                  dkD  Z< ejz                         j}                         dv Z? ejz                         dk(  Z@e.d        ZAe%r eA       dkD  ZB eA       dk\  ZCnd ZBd ZCd!ZDd"ZEd#ZFd$ZGe8reDd%z  ZDeGd%z  ZGeEd&z  ZEeFd%z  ZFe
j                  d'k(  rd( e
j                          d)ZJnd* e
j                          d)ZJd+ZKd,j                  d-d.      ZM ej                         j}                         d/v ZOe
j                  j                  e
j                  j                  e
j                  j                  eT      d0d0            ZUe
jl                  j                  d1e
j                  j                  eUd2            ZWe
j                  j                  e
j                  j                  eT            ZX eYe"j                  d3      Z[ eYe"j                  d4      Z\ eYe"d5      Z] eYe"j                  d6      Z^ eYe"j                  d7      Z_e(xr e) Z` eYe"d8      Za eYe"j                  d9      Zb eYe"j                  d:      Zc eYe"j                  d;      Zd eYe"d<      Ze eYe"d=      Zf eYe"d>      Zg eYe"j                  d?      Zhe%xs e#xr  e
j                         dk7  Zj	 eexr  ek e"j                               Zm	  eYe"d@      xr  ek e"j                               ZtdA Zu eu       \  ZvZw exe
j                  dB      Zz ej                  ezj                          e|e"      D  cg c]  } | j                  dC      s e~e"|        c} Z e~edD e             Z e       Z e       Z G dE dF      Zeej                  _n        e #eZ eej                  dG<   ej                           G dH dIej                        ZdJ ZeddK       ZedL        ZdM ZedN        ZedO        Zej$                  eGfdPZddQZdR ZdS Z G dT dU      Z ee"j0                  deGdVW      dX        Z eeefdeGdVW      ddY       Z eee j                  j                  fdeGdVW      dZ        Zd[ Zd\ Zej>                  d]        Zd^ Zdd_Zdd`Z G da dbejH                        Ze jL                  jO                  e5dcd       G de dfe             Zdg Zdh Zdi Z G dj dk      Z G dl dm      ZeDfdnZddoZddpZddqZeedfdrZej>                  fdsZddtZdu Zej>                  dv        Zdw Zdx Zdy Zdz Zd{ Zd| Zd} Ze(rej>                  dd~       Znej>                  dd       Zej                  d        Ze(r  ej"                  ej$                  d        yy# e!$ r dZ Y Fw xY w# en$ r8  ej                   ej                  eq ej                                      d ZmY -w xY w# en$ r8  ej                   ej                  eq ej                                      d ZtY Jw xY wc c} w )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_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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        >   arm64aarch64riscv64c                  B   t        j                         d   } t        t        t        | j                  d      d d             }|dk(  rWt        j                  t        j                  dddgdd	id
      } t        t        t        | j                  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     I/var/www/html/myenv/lib/python3.12/site-packages/psutil/tests/__init__.pymacos_versionr~   z   s    ""$Q'KC[..s3BQ789G( !--?	 )#.#	
 C!2!23!7!;<=N    )rj      )   r   Frj   i  P i            javaz$psutil--z@psutil-u   -ƒőős   futf8surrogateescape>   us-asciiasciiz..PSUTIL_SCRIPTS_DIR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            	      6   d } t         j                  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                        xs  | t         j                  j                  t        j                              xsc  | t        j                   dj                  t        j                  d d              xs(  | t        j                          j#                               }|st%        d      ||fS t         j                  j                  t        j                        }t         j                  j'                  |      sJ |       ||fS )Nc                     	 t        j                  | dgt         j                  t         j                         | S # t         j                  $ r Y y w xY w)Nz-V)stdoutstderr)rw   
check_callPIPECalledProcessError)exes    r}   attemptz_get_py_exe.<locals>.attempt   sI    	!!dJOOJOO J ,, 		s   6: AA_base_executable)r      __PYVENV_LAUNCHER__zpython{}.{}ri   z"can't find python exe real abspath)osr   copygetattrry   r   version_inforz   r`   r   pathrealpathshutilwhichformatpsutilProcessr   
ValueErrorexists)r   ro   baser   s       r}   _get_py_exer      sI    **//
C 3*D1D3##v-$2B &)^^!"Sy	~~s""	CNN# /rww''78/1]1133C3CBQ3GHI/
 v~~'++-. 	 ABBCxggs~~.ww~~c"'C'"Cxr   zr+STATUS_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y)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                  4    d } t        j                  |        y )Nc                  <    t        j                  dt        d       y )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    MMNr   )atexitregister)r   s    r}   r   zfake_pytest._warn_on_exit%  s    	 	&r   c                      t        j                         j                  t              }t        j                  d      j                  |       |S )zMimics pytest.main(). It has the same effect as running
        `python3 -m unittest -v` from the project root directory.
        ri   )	verbosity)r=   
TestLoaderdiscoverHERETextTestRunnerrun)argskwsuites      r}   mainzfake_pytest.main0  s;    
 ##%..t4!,007r   Nc                 ^     G d d      t         j                  dfd	       } || |      S )zMimics `pytest.raises`.c                        e Zd ZdZed        Zy))fake_pytest.raises.<locals>.ExceptionInfoNc                     | j                   S N)_excselfs    r}   valuez/fake_pytest.raises.<locals>.ExceptionInfo.value@  s    yy r   )__name__
__module____qualname__r   propertyr   r   r   r}   ExceptionInfor   =  s    D! !r   r   c              3      K           }	 | t        | d      # | $ rF}|r3t        j                  |t        |            sd| d| d}t        |      ||_        Y d }~y d }~ww xY ww)Nz not raised"z" does not match ")AssertionErrorresearchstrr   )excmatcheinfoerrmsgr   s        r}   contextz#fake_pytest.raises.<locals>.contextD  sz     !OE< %wk%:;;  !5#c(!;eW$6se1=C(-- 

	!s*   A, A,A)<A$A,$A))A,)r   r   )
contextlibcontextmanager)r   r   r   r   s      @r}   raiseszfake_pytest.raises9  s6    	! 	! 
	"	"
	< 
#
	< s%((r   c                     |r$t        j                         j                  | |      S t        j                         j                  |       S )zMimics `pytest.warns`.)r=   TestCaseassertWarnsRegexassertWarns)warningr   s     r}   warnszfake_pytest.warnsS  s=     $$&77GG  "..w77r   c                 ,    t        j                  |       )zMimics `unittest.SkipTest`.)r=   SkipTestreasons    r}   skipzfake_pytest.skipZ  s     ''r   c                 H    t        j                         j                  |       S )zMimics `pytest.fail`.)r=   r   failr   s    r}   r   zfake_pytest.fail_  s       "''//r   c                   2    e Zd Zedd       Z G d d      Zy)fake_pytest.markc                 .    t        j                  | |      S )z'Mimics `@pytest.mark.skipif` decorator.)r=   skipIf)	conditionr   s     r}   skipifzfake_pytest.mark.skipiff  s     ??9f55r   c                       e Zd ZdZddZd Zy)fake_pytest.mark.xdist_groupz4Mimics `@pytest.mark.xdist_group` decorator (no-op).Nc                      y r   r   r   names     r}   __init__z%fake_pytest.mark.xdist_group.__init__n  s    r   c                     |S r   r   )r   cls_or_meths     r}   __call__z%fake_pytest.mark.xdist_group.__call__q  s    ""r   r   )r   r   r   __doc__r  r  r   r   r}   xdist_groupr  k  s    F#r   r
  N )r   r   r   staticmethodr   r
  r   r   r}   markr   d  s    		6 
	6	# 	#r   r  r   r  )r   r   r   r	  r  r   r   r   r   r   r   r  r   r   r}   rG   rG     s     ' '   ) )2 8 8 ( ( 0 0# #r   rG   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                 p    t         |           d| _        d| _        t	        j
                         | _        y )NFMbP?)superr  _running	_interval	threadingEvent_flag)r   	__class__s    r}   r  zThreadTask.__init__  s*    __&
r   c                 n    | 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__  s6    ~~&&4&	$--RXbMCCr   c                 &    | j                          | S r   )startr   s    r}   	__enter__zThreadTask.__enter__  s    

r   c                 $    | j                          y r   )stop)r   r   kwargss      r}   __exit__zThreadTask.__exit__  s    		r   c                     | j                   rt        d      t        j                  j	                  |        | j
                  j                          y)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  s9     ==.//t$

r   c                     d| _         | j                  j                          | j                   r-t        j                  | j
                         | j                   r,y y )NT)r  r  settimesleepr  r   s    r}   r   zThreadTask.run  s7    

mmJJt~~& mmr   c                 `    | j                   st        d      d| _         | j                          y)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)r  r   joinr   s    r}   r#  zThreadTask.stop  s%    }}.//		r   )r   r   r   r	  r  r  r!  r%  r   r   r#  __classcell__)r  s   @r}   r<   r<     s*    @'D'r   r<   c                 B     t        j                          fd       }|S )Nc                  F    	  | i |S # t         $ r t                 w xY wr   )	Exceptionr8   )r   r$  funs     r}   wrapperz&_reap_children_on_err.<locals>.wrapper  s/    	''' 	O	s     	functoolswraps)r3  r4  s   ` r}   _reap_children_on_errr8    s%    __S  Nr   c                    |j                  dt               |j                  dt               |j                  dt        j                                |j                  dt               t
        rd}|j                  d|       | t        t        j                               }	 t        |       d| d	}t        d
|g} t        j                  | fi |}t        j                  |       t        |dd       t        |       |S t        j                  | fi |}t        j                  |       t        |j                         |S # t        |       w xY w)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   cwdro      creationflagsdirzimport time;open(r'z6', 'w').close();[time.sleep(0.1) for x in range(100)];rl   Tdeleteempty)
setdefaultr   r   getcwdr   r   rL   rI   r   rw   Popen_subprocesses_startedaddrQ   rP   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r}   r9   r9     s%    	OOGW%OOHg&OOE299;'OOE>* %)9:
{		,	   "99 
 tV,C$$S1D1E!%%e,&T:
 L   --!!%(UYYL s   "AE Ec                  >   d} t        t        j                               }	 t        j                  dt        j
                  j                  |       dt         d      }t        rt        |d      \  }} nt        |      \  }} t        j                  |j                        }t        t        |dd	
            }t        j!                  |       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   rD  textwrapdedentr   basenamer   r   r6   r   r   rH  ru   rQ   _pids_startedrG  rI   )tfilerL  ssubpchildgrandchild_pid
grandchilds          r}   r;   r;     s    EBIIK(FOO !  WW--f56 7% &0L 1	 	 3KD%(KD%txx(]6$eLM.)^^N3
z"F  	F s   CD Dc                     t         j                  sJ t               } t        j                  d|  d      }d}t        |       }	 |j                  t               t        |      \  }}|j                         \  }}	 t        j                  |j                         gg g t               t        |j                  d            }t        j                  |       t        j                   |      t#        fd       |f|j%                          |j%                          t'        |        |t'        |       S S # |j%                          w xY w# |j%                          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                  F     j                         t        j                  k(  S r   )statusr   STATUS_ZOMBIE)zombies   r}   <lambda>zspawn_zombie.<locals>.<lambda>0  s    v}}&2F2FF r   )r   r   rL   rP  rQ  rV   
settimeoutr   r6   acceptselectfilenoru   recvrS  rG  r   rO   closerI   )		unix_filesrcrT  sockparentconn_zpidr_  s	           @r}   r:   r:     s7   
 <<<I
//  &; '	 C EI&D'c
++-a	MM4;;=/2r>Btyy'Dd#^^D)FFGF#JJL

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

I s%   6E <B D6 <E 6EE +E6c                 `   |j                  dd       |j                  dd       t               }	 t        |d      5 }|j                  |        ddd       t	        t
        j                  gfi |}t        |j                         ||fS # 1 sw Y   >xY w# 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)rC  rL   openwriter9   r   r  rP   rH  r2  rI   )rh  rJ  srcfilefrV  s        r}   r6   r6   ;  s     	OOHd#OOHd#lG'3 	1GGCL	j!&&1:T:TXXg		 	
  Gs"   B B<B BB B-c                 4   t         rdnd}|j                  dt        j                         |j                  dt        j                         |j                  dd       |j                  d|       t	        | t
              rt        j                  |       } t        j                  | fi |}t        j                  |       |j                  t              \  }}|j                  dk7  rt        ||z         |rt        |       |j!                  d	      r|d
d }|S )zURun cmd in a subprocess and return its output.
    raises RuntimeError on error.
    r<  r   r   r   rp   Tr=  timeout
N)r   rC  rw   r   
isinstancer   shlexrv   rE  rF  rG  communicater   
returncodeRuntimeErrorr\   endswith)rI  rJ  flagspr   r   s         r}   shr  O  s     !IaEOOHjoo.OOHjoo.OO($/OOOU+#skk#%%Aa ]]>]:NFF||q6F?++VtMr   c                   	
 d 
d 
fd}
fd		fd}d }| }	 t        |t              ru |||      t        |t        j                  t        j                  f      r ||       t        |t              r|n|j
                  }t	        j                  |      rJ |       S t        |t        j                  t        j                  f      ru 	||      t        |t        j                  t        j                  f      r ||       t        |t              r|n|j
                  }t	        j                  |      rJ |       S t        |t        j                        ru |||      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                     | j                  |       t        rJt        | t        j                        r/	 t        j                  | j                        j                  |      S y y # t
        j                  $ r Y y w xY wr   )	r(  r   ry  rw   rE  r   r   rH  NoSuchProcess)procrv  s     r}   r(  zterminate.<locals>.waits  sd    		'z$
(8(89~~dhh/44W== :7 '' s   -A# #A98A9c                     t         rt        rt        j                  }t        r2|t        j                  k7  r| j                  t        j                         | j                  |       y r   )r   r`   signalSIGKILLr   send_signalSIGCONT)r  sigs     r}   sendsigzterminate.<locals>.sendsig|  s@    ^..C SFNN*V^^,r   c                     	  |         | |      S # t         $ r Y t        $ r}t        r|j                  dk(  r	  d }~ww xY w)N   )ProcessLookupErrorOSErrorr   winerror)r  rv  r   r  r  r(  s      r}   term_subprocess_procz'terminate.<locals>.term_subprocess_proc  sR    	D# D'"" " 	 	3<<1,	s   	 	AA?Ac                 \    	  |         | |      S # t         j                  $ r Y w xY wr   )r   r  )r  rv  r  r  r(  s     r}   term_psutil_procz#terminate.<locals>.term_psutil_proc  s;    	D# D'"" ## 		s   	 ++c                     	 t        j                  |       } ||      S # t         j                  $ r t        rt	        | |      cY S Y y w xY wr   )r   r   r  r   r   )rH  rv  r  r  s      r}   term_pidzterminate.<locals>.term_pid  sQ    	3>>#&D $D'22 ## 	.W-- 	.s   ! %A
Ac                     | j                   r| j                   j                          | j                  r| j                  j                          | j                  r| j                  j                          y y r   )r   rf  r   r:  )r  s    r}   flush_popenzterminate.<locals>.flush_popen  sL    ;;KK;;KK::JJ r   zwrong type )	ry  ru   rw   rE  r   rH  
pid_existsr   	TypeError)proc_or_pidr  wait_timeoutr  r  r  r  rH  r  r  r(  s    `      @@@r}   r7   r7   h  s   	##3 	A/aA|, a***FLL9:Na%a155$$S).3.)) FNNFLL9:#A|4 a***FLL9:Na%a155$$S).3.)) :++,'<8 a***FLL9:Na%a155$$S).3.)) k!/00a***FLL9:Na%a155$$S).3.))s   G% )2G% "G% G% %A.Ic                    t        j                         j                  |       }t        r&t        j	                         }t        |       t        r&t        r&t        j	                         }t        |       t        r&|rd|D ]  }t        |d        t        j                  |t              \  }}|D ],  }t        d|d       t        |t        j                         . yy)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  ru  zcouldn't terminate process z; attempting kill())r  )r   r   childrenrF  popr7   rS  
wait_procsr   r\   r  r  )r  r  rV  rH  r  rl  alives          r}   r8   r8     s     ~~((9(=H  $((*$  
 !# 
  	,Aad+	,$$X~F5 	-A.qe3FGHaV^^,	-	 r   c                  |   t         st        d      d} t        j                         d   }|D ]  }|j	                         s|dk(  r| |z  }  n | st        d|      d}d}| j                  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  ri   rh   zcan't parse r   r   r   )	r   NotImplementedErrorr   unameisdigitr   rv   ru   len)rU  r  cminormicronumsmajors          r}   rN   rN     s    !+..
AHHJqME 99;!s(FA	
 <y122EE773<DQLE
4yA~DG
4yA~DG5%  r   c                      t         st        d      t        j                         } | j                  xs d}| d   | d   |fS )Nznot WINDOWSr   r   )r   r  ry   getwindowsversionservice_pack_major)wvsps     r}   rM   rM     sC    !-00				 B				#!BqE2a5"r   c                   4    e Zd ZdZeddddfdZd Zd Zd Zy)retryzA retry decorator.Nr  c                 h    |r|rt        d      || _        || _        || _        || _        || _        y )Nz/timeout and retries args are mutually exclusive)r   	exceptionrv  retriesintervallogfun)r   r  rv  r  r  r  s         r}   r  zretry.__init__	  s8     wNOO" r   c              #   0  K   | j                   rVt        j                         | j                   z   }t        j                         |k  rd  t        j                         |k  ry y | j                  rt        | j                        D ]  }d   y 	 d  wr   )rv  r+  r  range)r   stop_atrl  s      r}   __iter__zretry.__iter__  sq     <<iikDLL0G))+' ))+'\\4<<(   s   A B#3Bc                 \    | j                    t        j                  | j                          y y r   )r  r+  r,  r   s    r}   r,  zretry.sleep%  s!    ==$JJt}}% %r   c                 T     t        j                         fd       } |_        |S )Nc                      d }D ]  }	  | i |c S  |# j                   $ r9}|}j                  j                  |       j                          Y d }~Td }~ww xY wr   )r  r  r,  )r   r$  r   rl  r3  r   s       r}   r4  zretry.__call__.<locals>.wrapper*  sp    C /// I ~~ C{{.C(JJLs   A/AA)r6  r7  	decorator)r   r3  r4  s   `` r}   r  zretry.__call__)  s-    			 
	  !r   )	r   r   r   r	  r2  r  r  r,  r  r   r   r}   r  r    s*      
&r   r  r  )r  r  rv  r  c                     | t        j                         vrt        j                  |       t        j                  |        y)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   )rH  s    r}   rP   rP   ?  s/     &++-""3''
NN3r   c                     t        | d      5 }|j                         }ddd       |ssJ |rt        |        S # 1 sw Y   xY w)z8Wait for a file to be written on disk with some content.rbN)rp  readrI   )fnamerA  rB  rs  datas        r}   rQ   rQ   N  sJ     
eT	 avvxtEK s	   ;Ac                      |        }|sJ |S )z1Keep calling function until it evaluates to True.r   )r3  rets     r}   rO   rO   _  s     %CJ3Jr   c                 P   d }	 t        j                  |       }t        j                  |j                        r%t	        j
                  t        j                  |       }n$t	        j
                  t         j                  |       }t        r |        y ||       y# t        $ r Y yw xY w)z?Convenience function for removing temporary test files or dirs.c                 6   t        j                          t        z   }t        j                          |k  r	  |        S # t        $ r Y n%t        $ r}|}t	        d|        Y d }~nd }~ww xY wt        j
                  d       t        j                          |k  rg`)Nz	ignoring g{Gz?)r+  r   FileNotFoundErrorr  r\   r,  )r3  r  rl  r   s       r}   	retry_funzsafe_rmpath.<locals>.retry_funt  s    
 ))+.iikG#(u 	 %  (y&''( JJt iikG#s   = 	A*A*A%%A*N)r   statS_ISDIRst_moder6  partialr   rmtreeremover   r  )r   r  str3  s       r}   rI   rI   q  sv    "WWT]<<

###FMM48C##BIIt4CEcN s   B
B B 	B%$B%c                 N    	 t        j                  |        y# t        $ r Y y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 t        j                  |       y# t        j                  |       w xY ww)z@Context manager which temporarily changes the current directory.N)r   rD  rH   )dirnamecurdirs     r}   rH   rH     s?      YY[F

s   A!A A!AA!c                 R   t         j                  j                  |       rJ |        t        j                  t
        |        t        j                  t        |        t        rFt        j                  |       }t        j                  | |j                  t        j                  z         | S )z6Create a Python executable file in the given location.)r   r   r   r   r   rI   r   copyfiler   r   r  chmodr  S_IEXEC)r   r  s     r}   rJ   rJ     si    ww~~d#)T)#
OOK&
OOJ%WWT]
rzzDLL01Kr   c                 V   t         j                  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 }|j!                  |       ddd       	 t#        j$                  dj&                  d| g       t        |j&                         | S # 1 sw Y   DxY w# t        j&                         w xY w)	z5Create a compiled C executable in the given location.gcczgcc is not installedNz
            #include <unistd.h>
            int main() {
                pause();
                return 1;
            }
            z.csuffixro  z-o)r   r   r   r   r   r  r   rP  rQ  ry  r   r   r   rI   rp  rL   rq  rw   r   r  )r   c_coders  s      r}   rK   rK     s    ww~~d#)T)#<<kk011~ "  &#&..&
OOK&	j%s	+ q	uaffdD9:AFFK 
 	AFFs   0D#D DD(c                     	 t        j                  t        | |      }t        j                  j                  |      s;t        j                  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.
    )prefixr  r?  )
tempfilemktempr   r   r   r   r   r   r   rI   )r  r?  r  r   s       r}   rL   rL     sU     mFLww~~d#77##D)DOOK.K r   c                   T    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y)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                  }|j                  d      sd|z   }dj                  || j                   j                  | j
                        S )Nzpsutil.zpsutil.tests.z{}.{}.{})r  r   
startswithr   r   _testMethodName)r   fqmods     r}   __str__zPsutilTestCase.__str__  sU    ))	*#e+E  NN##  
 	
r   Nc                 L    t        ||      }| j                  t        |       |S )N)r  r?  )rL   
addCleanuprI   )r   r  r?  r  s       r}   rL   zPsutilTestCase.get_testfn  s!    &c2U+r   c                 H    t        |i |}| j                  t        |       |S r   )r9   r  r7   )r   r   rJ  rN  s       r}   r9   zPsutilTestCase.spawn_subproc  s$    t,t,	5)r   c                      | j                   |i |}	 t        j                  |j                        S # t        j                  $ r | j                  |j                          w xY wr   )r9   r   r   rH  r  assert_pid_gone)r   r   r$  rN  s       r}   spawn_psproczPsutilTestCase.spawn_psproc  s[    """D3F3	>>%)),,## 	  +	s	   3 0A#c                 |    t               \  }}| j                  t        |       | j                  t        |       ||fS r   )r;   r  r7   )r   child1child2s      r}   r;   z"PsutilTestCase.spawn_children_pair  s5    ,.	6*	6*r   c                 |    t               \  }}| j                  t        |       | j                  t        |       ||fS r   )r:   r  r7   )r   rj  r_  s      r}   r:   zPsutilTestCase.spawn_zombie	  s4    %	6*	6*r   c                 z    t        |i |\  }}| j                  t        |       | j                  t        |       |S r   )r6   r  rI   r7   )r   r   rJ  rN  rr  s        r}   r6   zPsutilTestCase.pyrun  s6    --wW-	5)r   c                    t        |t        j                        sJ |j                  |j                  k(  sJ |j                  |j
                  k(  sJ |j                  r|j                  sJ t        |t        j                        r8|j                  |j                  k(  sJ |j                  |j                  dk\  sJ t        |       t        |       y Nr   )ry  r   ErrorrH  r  _nameZombieProcessppid_ppidr   repr)r   r  r   s      r}   _check_proc_exczPsutilTestCase._check_proc_exc  s    #v||,,,ww$(("""xx4::%%%8888O8c6//088tzz)))xx#xx1}$}CS	r   c                 2   t        j                  t        j                        5 }	 t        j                  |       	 d d d        j                  j                  |k(  sJ |j                  j                  J t        j                  |      rJ |       |t        j                         vsJ |t        j                         D cg c]  }|j                   c}vsJ y # t        j
                  $ r t        j                  d      w xY w# 1 sw Y   xY wc c}w )Nz&wasn't supposed to raise ZombieProcess)r  r   r   r  r   r  r   r   rH  r  r  r  process_iter)r   rH  cmxs       r}   r  zPsutilTestCase.assert_pid_gone"  s    ]]6//0 	LBLs#	L
 xx||s"""xx}}$$$$$S).3.)&++-'''&*=*=*?@Q155@@@@ '' Lkk"JKKL	L 	L As"   DCD)DDDc                    | j                  |j                         t        |      }|j                  |j                  d      D ]<  \  }}| j                  t        |      |      5  	  |       }d| d|}t        |       |j                  d       y # t        j                  $ r  t        j                  $ r}| j                  ||       Y d }~nd }~ww xY w	 d d d        # 1 sw Y   xY w)NTclear_cacher  r  zProcess.z!() didn't raise NSP and returned r   ru  )r  rH  rC   iterallsubTestr   r   r   r  r  r  r(  )r   r  nsr3  r  r  r   r   s           r}   assert_proc_gonezPsutilTestCase.assert_proc_gone.  s    TXX&t$T: 	.IC3t948 ..%C #4& )7$  )--	. 			!	 ++ ++ 4((s3343. . .s6   &C%(B/C%&C<CC%CC%%C.	c                    t        j                  |j                        }||k(  sJ t        s%t        st
        st        |      t        |      k(  sJ |j                         t         j                  k(  sJ |j                         sJ t        j                  |j                        sJ |j                          |j                  t        j                         v sJ |j                  t        j                         D cg c]  }|j                   c}v sJ i t         _        |j                  t        j                         D cg c]  }|j                   c}v sJ t        |      }|j!                  |j"                  d      D ]2  \  }}| j%                  t'        |      |      5  	  |        d d d        4 t.        rt1        j2                  t         j(                        5 }|j5                          d d d        | j-                  |j6                         t1        j2                  t         j(                        5 }|j9                          d d d        | j-                  ||j6                         t1        j2                  t         j(                        5 }|j;                          d d d        | j-                  ||j6                         |j=                          |j?                          |jA                          |jC                          |j                         sJ t        j                  |j                        sJ |j                  t        j                         v sJ |j                  t        j                         D cg c]  }|j                   c}v sJ i t         _        |j                  t        j                         D cg c]  }|j                   c}v sJ y c c}w c c}w # t         j(                  t         j*                  f$ r}| j-                  ||       Y d }~sd }~ww xY w# 1 sw Y   xY w# 1 sw Y   ExY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}w )NTr	  r  )"r   r   rH  r
   r	   r   hashr]  r^  
is_runningr  as_dictr  r  _pmaprC   r  r  r  r   r  AccessDeniedr  r   r  r   cmdliner   r   r   suspendresumer7   kill)	r   r  cloner  r  r3  r  r   r  s	            r}   assert_proc_zombiez!PsutilTestCase.assert_proc_zombieA  sE   txx(
 u}}6U:e,,,{{} 4 4444     ***xx6;;=(((xx6+>+>+@AaAEEAAAAxx6+>+>+@AaAEEAAAAt$T: 	4IC3t948 44E4 4	4 v334   rxx0v334 
  rxx0v334 #  "#  rxx0		     ***xx6;;=(((xx6+>+>+@AaAEEAAAAxx6+>+>+@AaAEEAAAAA BA ,,f.A.AB 4((s3344 4  # # BAsl   ;O O#P'%O$ P48QQ;Q Q $#P$PP'P$$P''P1	4P>QQr  N)r   r   r   r	  r  rL   r9   r  r;   r:   r6   r  r  r  r  r   r   r}   rB   rB     s@    


  
A&3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y)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)
       rj   r   r   TPSUTIL_DEBUGc                 .    t        j                  d       y )NF)r   
_set_debugclss    r}   
setUpClasszTestMemoryLeak.setUpClass  s    % r   c                 B    t        j                  | j                         y r   )r   r"  _psutil_debug_origr#  s    r}   tearDownClasszTestMemoryLeak.tearDownClass  s    #001r   c                 d    | j                   j                         }t        |d|j                        S )Nuss)	_thisprocmemory_full_infor   rss)r   mems     r}   _get_memzTestMemoryLeak._get_mem  s)     nn--/sE377++r   c                 v    t         r| j                  j                         S | j                  j                         S r   )r   r+  num_fdsnum_handlesr   s    r}   _get_num_fdszTestMemoryLeak._get_num_fds  s+    >>))++>>--//r   c                 V    | j                   rt        |dt        j                         y y )Nyellow)colorfile)verboser   ry   r   )r   r   s     r}   _logzTestMemoryLeak._log  s    <<8#**= r   c                     | j                         }| j                  |       | j                         }||z
  }|dk  rd|d}t        j                  |      |dkD  r3t        rdnd}|dkD  r|dz  }| d| d	|}t        j                  |      y
)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   rU  z
 unclosed z after calling N)r3  callr  r   r   )r   r3  beforeafterdiffr   type_s          r}   
_check_fdszTestMemoryLeak._check_fds  s    
 ""$		#!!#v~!8  )2 2  ++c""!8!DxEaxF*UG?3'BC++c"" r   c                    t        j                  d       | j                         }t        |      D ]  }| j	                  |      }~~ t        j                  d       | j                         }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  r=  garbage)r   r3  timesmem1r  r  mem2r@  s           r}   _call_ntimeszTestMemoryLeak._call_ntimes  sy     	

a }}u 	A))C.C3	 	

a }}zzRd{r   c           	         g }d}|}t        d|dz         D ]  }| j                  ||      }	dj                  |t        |	      t        |	|z        |      }
|j	                  |
       |	|k  xs |	|k  }|r|dkD  r| j                  |
        y |dk(  r
t                | j                  |
       ||z  }|	} t        j                  dj                  |            )Nr   r   z,Run #{}: extra-mem={}, per-call={}, calls={}z. )
r  rK  r   r   appendr9  printr  r   r.  )r   r3  rH  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7IIcN!8G		#!'	( kk$))H-..r   c                      |       S r   r   )r   r3  s     r}   r=  zTestMemoryLeak.call  s	    u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       	 | j                  ||       | j                  |       | j                  ||||       y# t        $ r}t        t        |            d}~ww xY w)	zTest a callable.Nr   ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rH  r  rO  )
rH  warmup_timesr  rO  r   r   r   rK  rB  rU  )r   r3  rH  rX  r  rO  r   s          r}   executezTestMemoryLeak.execute
  s     *

(4L$:K:K 	 %0'dll!*!6IDNN		'A:333:1$A&AA$a<7!77<>;#;;> 	#|,5'YO  	'SX&&	's   0B, ,	C5C		Cc                 :    fd} | j                   |fi | y)znConvenience method to test a callable while making sure it
        raises an exception on every call.
        c                  ^    	          t        j                   d        #  $ r Y y w xY w)Nz did not raise )r  r   )r   r3  s   r}   r=  z*TestMemoryLeak.execute_w_exc.<locals>.call%  s>    @ kkSE">??  s   $ ,,N)rY  )r   r   r3  r$  r=  s    ``  r}   execute_w_exczTestMemoryLeak.execute_w_exc   s    
	@ 	T$V$r   )NNNN)r   r   r   r	  rH  rX  rO  r    r  r8  r   r   r+  boolr   getenvr'  classmethodr%  r(  r/  r3  r9  rB  rK  rU  r=  rY  r\  r   r   r}   rA   rA     s    > ELIbAGG Iibii78! ! 2 2,0>#,/8 KOP,%r   rA   c                  4   dd l } dd l}dd l}dd l}dd l}	 dd l}	 dd l}| j                         }t        j                  r$t        j                  d      rt        d      |d<   nt        j                  rdt        j                          d    |d<   nt        j"                  rjddj%                  t'        t(        t        j*                                     z   |d<   t-        t        d      rQ|dxx   d	t        j.                         z   z  cc<   n.t        j0                          dt        j2                          |d<   d	j%                  t5        t        j6                               t        j8                         gz         |d
<   t        j:                  rt        j<                         d   |d<   d	j%                  t        j>                         t        j@                         t        jB                         g      |d<   tE        |dd      |d<   ||dxx   d|jF                   dz  cc<   t        j:                  rft        j                  d      r.t        ddg      }t)        |      jI                  d      d   |d<   nd|d<   t        jJ                         d   }	|	r|	|d<   tM        jN                         |d<   |jQ                         }
|
d    d	|
d    |d<   |j                  jS                  t        jT                               jW                  d      |d<   |j                  jY                         jW                  d      |d<   |j[                         |d<   t\        j^                  ja                  d      |d<   t]        jb                         |d <   td        |d!<   t        jf                         |d"<   t]        jh                         |d#<   t        jj                         |d$<    d%jl                  to        d& t        jp                         D               |d'<   t        jr                         }d(jm                  tu        |jv                        ty        |jz                        ty        |j|                              |d)<   t        j~                         }d(jm                  tu        |jv                        ty        |jz                        ty        |j|                              |d*<   t        t               j                         D cg c]  \  }}|j                         s|d+u s| c}}      }d,j%                  |      |d-<   t        t        j                               |d.<   t        j                         j                         }|j                  d/d        t        t\        j                        D ci c]  }|t\        j                  |    c}|d0<   |j                  |      |d1<   t        d2tL        j                  3       |j                         D ]3  \  }}t        d4jm                  |d5z   |      tL        j                  3       5 t        d2tL        j                  3       tL        j                  j                          y # t        $ r d }Y _w xY w# t        $ r d }Y lw xY wc c}}w c c}w )6Nr   lsb_releasezlsb_release -d -sOSzDarwin zWindows  win32_editionz, archri   kernelpython__version__znot installedpipz (wheel=)r  z	--versionrw  r   glibczfs-encodinglangz%Y-%m-%d %H:%M:%Sz	boot-timer+  user~homer;  pyexehostnamePIDcpusz{:.1f}%, {:.1f}%, {:.1f}%c              3   P   K   | ]  }|t        j                         z  d z     yw)d   N)r   	cpu_count).0r  s     r}   	<genexpr>z print_sysinfo.<locals>.<genexpr>z  s#     Iq6##%%+Is   $&loadavgz{}%%, used={}, total={}memoryswapTz
                  	constantsr  r   r   r  zF======================================================================r7  z	{:<17} {}:)Ocollectionsdatetimegetpasslocalepprintri  ImportErrorwheelOrderedDictr   r   r   r   r  OSXrq   rr   r   r.  rt   r   	win32_verhasattrrd  systemr|   listarchitecturemachiner   r  python_implementationpython_versionpython_compilerr   rh  rv   libc_verry   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserrD  r   nodegetpidrv  r   rs   r   virtual_memoryru   percentr   usedtotalswap_memorysortedglobalsitemsisupperr  r  r   r  r  r   pformatrN  r   r   flush)r  r  r  r  r  ri  r  infooutrU  rl  r.  r{  kvr|  pinfos                    r}   rE   rE   0  sM    ""$D ||]3+,T
	x//1!456T
	#((3sH4F4F4H+I"JJT
8_-J$!7!7!999J )*!H,<,<,>+?@T
99X""$%)9)9);(<<DL ||!)!,X YY&&(!  "  DN
 #}o>DKU%"3"3!4A66 ||<<e[)*Cc(...q1DK)DK"DM 335DD1gYba	*DL ))77h"# 	 $$((*334GHDL??$DL77%%c*DL))+DKDM}}D))+DK ##%DL8188	IV5F5F5HI	IDO 


!C.55CKKCHHCIIDN
 D,33DLLDIIDJJDL y(Ftq!AIIKAIFI /33I>D v{{}%DLNN$$&E	IImT"282DEQ2::a=(EE)>>%(DL 
($

 ?1k  S!,3::>?	($JJE    \ 	G Fs:   Y+ Y= .Z
Z
Z
Z+Y:9Y:=ZZc                 T    t         d        }	  |       |    dk(  S # t        $ r Y yw xY w)Nc                      i } t        d      }|j                         dd  D ]H  }|j                  d      D cg c]  }|j                  dd       }}|d   t	        |d         }}|| |<   J | S c c}w )Nztasklist.exe /NH /FO csvr   ,r   r  r   )r  
splitlinesrv   replaceru   )r  r  liner  bitsr  rH  s          r}   	get_procsz,is_win_secure_system_proc.<locals>.get_procs  s    +,NN$QR( 	D04

3@1AIIc2&@D@QT!W#DCH	 
 As   A.zSecure SystemF)r   KeyError)rH  r  s     r}   rF   rF     s=     {3?22 s    	''c                      t        j                         } t        | d      r| j                         S t        | d      r#t	        j
                  | j                               S y)Nr   r   r   )r   r   r  r   randomchoicer   )r  s    r}   _get_eligible_cpur    sG    Aq)yy{	N	#}}Q^^-..r   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j2                  fi fd5di fd6di fd7di fd8di fgZer(ed4ej6                  fi fgz  Zed4ej8                  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#y>)@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  oneshotrj  parentsrH  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terminalr1  r   r   r   r   r   r   r2  r   groupedF)r[  i   r   r  r  r  r7   r  c                     || _         y r   )_proc)r   r  s     r}   r  zprocess_namespace.__init__  s	    
r   c              #      K   t        |      }t        j                  |       |D ]M  \  }}}|r| j                          t	        | j
                  |      }t        j                  |g|i |}||f O ywz_Given a list of tuples yields a set of (fun, fun_name) tuples
        in random order.
        N)r  r  shuffler
  r   r  r6  r  )r   lsr
  fun_namer   rJ  r3  s          r}   r  zprocess_namespace.iter  sv      "Xr$& 	" HdD  "$**h/C##C7$7$7C/!	"s   A4A6c                 f    | j                   j                  | j                   j                  d       y)z&Clear the cache of a Process instance.T)_ignore_nspN)r  _initrH  r   s    r}   r
  zprocess_namespace.clear_cache&  s!    

T:r   c                     |D ]>  \  }}}d|z   }t        ||      r|j                  j                  d|d}t        |       y)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  rl  	meth_namer   s          r}   test_class_coveragez%process_namespace.test_class_coverage*  sb    
 ! 	*NHa(*I:y1!++447 8!}G-  %S))	*r   c                     | j                   D ch c]  }|d   	 }}| j                  D ch c]  }|d   	 }}t        t        j                        D ch c]  }|d   dk7  s| }}||z  |z  }|rt        d|      y c c}w c c}w c c}w )Nr   rl  zuncovered Process class names: )r  ignoredr?  r   r   r   )r$  r  thisr  klassleftouts         r}   testzprocess_namespace.test8  s    !gg&!&&!$-A1Q4--/?q1Q43;??'>U*>wkJKK 	 '-?s   BBB"B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
  r_  r  r  r   r   r}   rC   rC     s    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 46;<<^R,--YB'((YB'((]B+,,]BE(:;<<GVT2&''Vf::<bABBX 4 4lCRHIIF$<$<a#@"EFFGF$8$8#:B?@@G^'8':&;%=rBCC 
)2.	B	2r	b"	RG ]V%8%8$:B?@@]V%<%<$>CDD
'/G
#g
-C"; * * 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y())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   pernicr  r  r  usersr  r   r   r   r   r   win_service_iterwin_service_get)algr  r  r  cpu_times_percentc              #      K   t        |       } t        j                  |        | D ]5  \  }}}t        t        |      }t        j                  |g|i |}||f 7 ywr  )r  r  r  r   r   r6  r  )r  r  r   rJ  r3  s        r}   r  zsystem_namespace.itery  sc     
 "Xr$& 	" HdD&(+C##C7$7$7C/!	"s   AAN)r   r   r   r	  r   rD  r  r  r%   r   r4   HAS_GETLOADAVGr/   r.   r,   r   r   r   r  r  r  r  rC   r  r   r   r}   rD   rD   B  s    
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*+++R455^R,--&B/00'R011&"566 
R 	)*,b1	B	b"%	G C	" 	" ,??r   rD   c                 b    d }t        t        t        j                  j                  fd| |      S )zZDecorator which runs a test function and retries N times before
    actually failing.
    c                 @    t        | dt        j                         y )Nz
, retryingr}  )rN  ry   r   )r   s    r}   r  z retry_on_failure.<locals>.logfun  s    z"4r   N)r  rv  r  r  )r  r   r  r   r2  )r  r  s     r}   r@   r@     s1    
5 !6;;#8#89	 r   c                       fd}|S )z,Decorator to Ignore AccessDenied exceptions.c                 F     t        j                          fd       }|S )Nc                  x    	  | i |S # t         j                  $ r s t        j                  d      w xY w)Nzraises AccessDenied)r   r  r  r   )r   r$  r3  only_ifs     r}   r4  z9skip_on_access_denied.<locals>.decorator.<locals>.wrapper  sI    9D+F++&& 9&"kk"788	9s    .9r5  r3  r4  r  s   ` r}   r  z(skip_on_access_denied.<locals>.decorator  s%    			9 
	9 r   r   r  r  s   ` r}   r>   r>     s     r   c                       fd}|S )z3Decorator to Ignore NotImplementedError exceptions.c                 F     t        j                          fd       }|S )Nc                      	  | i |S # t         $ r* s j                  d}t        j                  |      w xY w)Nz2 was skipped because it raised NotImplementedError)r  r   r  r   )r   r$  r   r3  r  s      r}   r4  z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapper  s]    
'D+F++& '&"||& '+ +  kk#&&'s    3>r5  r  s   ` r}   r  z*skip_on_not_implemented.<locals>.decorator  s%    			' 
	' r   r   r  s   ` r}   r?   r?     s    " r   c                     t        j                          5 }|j                  | df       |j                         d   cddd       S # 1 sw Y   yxY w)z6Return an unused TCP port. Subject to race conditions.r   r   N)socketbindgetsockname)hostri  s     r}   rT   rT     sC    	 %D		4)!!$% % %s   &AAc                    || t         t        hv rd}t        j                  | |      }	 t        j                  dvr/|j                  t        j                  t        j                  d       |j                  |       |t        j                  k(  r|j                  d       |S # t        $ r |j                           w xY w)zBinds a generic socket.r  r   >   ntcygwinr   r   )r   r   r  r   r  
setsockopt
SOL_SOCKETSO_REUSEADDRr  r   listenr2  rf  )familytypeaddrri  s       r}   rU   rU     s    |7H"55==&D	77**OOF--v/B/BAF		$6%%%KKN 

s   A7B" "B=c                 f   t         j                  sJ t        j                  j	                  |       rJ |        t        j
                  t
        j                  |      }	 |j                  |        |t
        j                  k(  r|j                  d       |S # t        $ r |j                           w xY w)zBind a UNIX socket.r   )r   r   r   r   r   r  r   r  r   r  r2  rf  )r  r  ri  s      r}   rV   rV     s    <<<ww~~d#)T)#==.D		$6%%%KKN K  

s   5B B0c                    t        j                   | t              5 }|j                  |       |j                  d       |j	                         }t        j                   | t              }	 |j                  |       |j	                         }	 |j                         \  }}||k(  r||fcddd       S |j                          6# t        $ r |j                           w xY w# 1 sw Y   yxY w)z^Build a pair of TCP sockets connected to each other.
    Return a (server, client) tuple.
    r   N)	r  r   r  r  r  connectrb  rf  r  )r  r  llr  caddras         r}   rW   rW     s     
v{	+ r

		!~~MM&+.	IIdOMMOE))+45=q6  	   	GGI	 s$   AC)=C0CCCC(c                    t         j                  sJ dx}}	 t        | t        j                        }|j                  d       t        j                  t        j                  t        j                        }|j                  d       |j                  |        ||fS # t        $ r& ||j                          ||j                           w xY w)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  r2  rf  )r  serverclients      r}   rX   rX     s    
 <<<FV!$V-?-?@1v~~v/A/AB1t F  LLNLLNs   B B /Cc               #   <  K   g } dx}}	 | j                  t        t        j                  t        j                        t        t        j                  t        j
                        f       t               r_| j                  t        t        j                  t        j                        t        t        j                  t        j
                        f       t        r^t        rXt               }t               }t        |      \  }}t        |t        j
                        }|||fD ]  }| j                  |        |  | D ]  }|j                           ||fD ]  }|t        |        y# | D ]  }|j                           ||fD ]  }|t        |        w xY ww)z1Open as many socket families / types as possible.Nr"  )extendrU   r  r   r   
SOCK_DGRAMr   r   r   r0   rL   rX   rV   rM  rf  rI   )socksfname1fname2s1s2s3rU  r  s           r}   rY   rY     sg     EFV#(:(:;(9(9:
 	 ?LLFOOV-?-?@FOOV->->?  -\F\F$V,FB!&v/@/@AB"b\  Q  	AGGI	f% 	#E E"	#  	AGGI	f% 	#E E"	#s)   FD0E) : FF)!FFFc                 X   t        |t        j                        sJ |       |t        j                  k(  rs| j                  d      D cg c]  }t        |       }}t        |      dk(  sJ |        |D ]  }d|cxk  rdk  rJ |         J |         t        j                  |        y|t        j                  k(  r-t        | t              sJ |        t        j                  |        y|t        j                  k(  rt        j                   d|       J |        yt#        d|      c c}w )z[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    rh   r   r      z([a-fA-F0-9]{2}[:|\-]?){6}Nzunknown family )ry  enumIntEnumr  r   rv   ru   r  	ipaddressIPv4Addressr   r   IPv6Addressr   AF_LINKr   r   r   )r  r  r  octsnums        r}   rR   rR   <  s    fdll+3V3+ $

301A004yA~#t#~ 	)C?s?(D(?(D(?	)d#	6??	"$$*d*$d#	6>>	!xx5t<HN$NH?6*566 1s   D'c                 r    d }d }d }d }d } ||         ||         ||         ||         ||        y)z*Check validity of a connection namedtuple.c                 J   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                         y y )
Nr   >   r  r   r   r   ri   r   r   r   r  )r  r;  r  r  laddrraddrr]  rH  )rk  has_pids     r}   check_ntuplez-check_connection_ntuple.<locals>.check_ntupleS  s   d)q.4yF"-CI-"Aw$''!*477*!Aw$++%2t{{2%Aw$))#.TYY.#Aw$**$0djj0$Aw$**$0djj0$Aw$++%2t{{2%7dhh&00& r   c                    | j                   t        t        t        hv sJ | j                          t	        | j                   t
        j                        sJ |        | j                   t        k(  rUt        j                  | j                   | j                        5 }	 |j                  | j                  d   df       d d d        y | j                   t        k(  r/| j                  t        j                   k(  sJ | j                         y y # t        $ r(}|j                  t        j                  k7  r Y d }~xd }~ww xY w# 1 sw Y   y xY wr  )r  r   r   r   ry  r1  r2  r  r  r  r;  r  errnoEADDRNOTAVAILr]  r   	CONN_NONE)rk  rU  r   s      r}   check_familyz-check_connection_ntuple.<locals>.check_family_  s    {{w'::GDKKG:$++t||4:d:4;;'!
 t{{DII6 !FFDJJqM1-.  [[G#;;&"2"22?DKK?2 $  yyE$7$77 8 s0   D9 D	D6D1,D91D66D99Ec                    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                         y y )NSOCK_SEQPACKET)r   r  objectr  r   r(  ry  r1  r2  r]  r   rB  )rk  rE  s     r}   
check_typez+check_connection_ntuple.<locals>.check_typep  s     )968Dyy
 
 	 99		 

 $))T\\28D8299)));;&"2"22?DKK?2 *r   c                    | j                   | j                  fD ]  }| j                  t        t        hv rt        |t              sJ t        |             |s>t        |j                  t              sJ t        |j                               d|j                  cxk  rdk  sn J |j                         t        |j                  | j                         | j                  t        k(  st        |t              rJ t        |              y )Nr   i  )r;  r<  r  r   r   ry  rs   r  portru   rR   ipr   r   )rk  r  s     r}   check_addrsz,check_connection_ntuple.<locals>.check_addrs|  s    ZZ, 		9D{{w11!$.:T
:.!$))S1B4		?B1DII..9		9.!$''4;;7'!$,8d4j8,		9r   c                 *   t        | j                  t              sJ | j                         t        t              D cg c]$  }|j                  d      st        t        |      & }}| j                  |v sJ | j                         | j                  t        t        hv rB| j                  t        k(  r/| j                  t        j                  k7  sJ | j                         y | j                  t        j                  k(  sJ | j                         y c c}w )NCONN_)ry  r]  r   r?  r   r  r   r  r   r   r  r   rB  )rk  r  validss      r}   check_statusz-check_connection_ntuple.<locals>.check_status  s    $++s+8T[[8+(+F
#$q||G7LGFA
 
 {{f$1dkk1$;;7H--$)){2J;;&"2"22?DKK?2;;&"2"22?DKK?2
s   DDNr   )rk  r>  rC  rG  rK  rO  s         r}   check_connection_ntuplerP  P  sH    
1@"
@9	@ tr   c                     g }| D ]Y  }t         r@|j                  t        j                  k(  r#t        rd|j
                  v rt        d|        I|j                  |       [ |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   rM  )consnewrk  s      r}   rS   rS     s]     C T[[FNN2djj0	$()

4 Jr   c                 ,    t        j                  |       S r   )	importlibreload)modules    r}   rZ   rZ     s    F##r   c                 8   t         j                  j                  t         j                  j                  |             d   }t        j
                  j                  ||       }t        j
                  j                  |      }|j                  j                  |       |S r  )
r   r   splitextrR  rU  utilspec_from_file_locationmodule_from_specloaderexec_module)r   r  specmods       r}   r[   r[     sk    77BGG,,T23A6D>>11$=D
..
)
)$
/CKKC Jr   c                 <    t        j                  | t        d       y)zRaise a warning msg.ri   r   Nr   )r   s    r}   r\   r\     s    MM#{q1r   c                     t        |       }|j                  }t        |      dk7  s|d   t        uryt	        |dd      }t        |t              syt        d |D              S )z-Check if object is an instance of namedtuple.r   r   F_fieldsNc              3   <   K   | ]  }t        |t                y wr   )ry  r   )rw  ns     r}   rx  z is_namedtuple.<locals>.<genexpr>  s     -az!S!-s   )r  	__bases__r  rs   r   ry  r  )r  tbrs  s       r}   r^   r^     sY    QA	A
1v{ad%'9d#Aa-1---r   c              #     K   t         rdnd}d}t        | |z         }t        j                         j	                         D cg c]Y  }t
        j                  j                  |j                        d   |k(  r(||j                  j                         v r|j                  [ }}t        j                  |      }t        j                  ||       	 t        j                  |       | t        |       yc c}w # t        |       w xY w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  r   N)r   rL   r   r   r   r   r   rY  lowerr  r  r   r  ctypesCDLLrI   )r  r   extdstr  libsrh  s          r}   r]   r]     s      f(- ^^%113
ww'*c1cQVV\\^6K FF
 

 mmD!S!	KKI
 s+   A DAC3 -DC8 'D8DDc              #     K   ddl m} ddl m} d}t        | |z         }t	        j
                         j                         D cg c]  }|j                  j                         j                  |      radt        j                  j                  |j                        j                         v r(d|j                  j                         vr|j                   }}t        rt|srt	        j
                         j                         D cg c]G  }dt        j                  j                  |j                        j                         v r|j                  I }}t        j                  |      }t        j                   ||       d	}	 t        j"                  |      }| |Tt         j$                  j&                  j(                  }	|j*                  g|	_         |	|j.                        }
|
dk(  r |       t1        |       y	c c}w c c}w # |Tt         j$                  j&                  j(                  }	|j*                  g|	_         |	|j.                        }
|
dk(  r |       t1        |       w xY w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  rg  wow64rj  N)rl  rr  rs  rL   r   r   r   r   rk  r~  r   rR  r   r  r  r   r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerI   )r  rr  rs  rn  ro  r  rp  rh  cfilerx  r  s              r}   r]   r]     s     	$#- ^^%113
vv||~&&s+BGG,,QVV4::<<qvv||~-	 FF
 
   )557RWW--aff5;;== D 
 mmD!S!	MM#&EI  $mm44@@(0(8(8'9$!%--0!8"*$?
"  $mm44@@(0(8(8'9$!%--0!8"*$s:   AI*BG:.I*AG?/I*?H A,I*A#I''I*c                      t        d       y )NTr  )r8   r   r   r}   cleanup_test_procsr~    s
    D!r   c                 ,    t        j                  |       S r   )ry   exit)r  rl  s     r}   r`  r`  (  s    # r   r   )F)TFr  )z	127.0.0.1)r  r  )r	  r   r   rl  r1  r@  r6  rE  rU  r3  r   rq   r  r   rc  rz  r   r  r  r  rw   ry   r  rP  r  r+  	tracebackr=   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  rk  r4   RISCV64r~   r1   r2   r   r   r"   r   r  r  r   r   decoder   r  ASCII_FSr   r   r.  r  __file__r   getr   r   r  r   r$   r&   r  r(   r)   r0   HAS_NET_IO_COUNTERSr*   r'   r+   r,   r.   r/   HAS_THREADSgetuidSKIP_SYSCONSr]  r   r-   r2  r   r  rN  
format_excr   r%   r   r   r   rp  devnullr   rf  r?  r  r   r!   rF  r   r*  rF  rS  rG   r   r   modulesr   r'  r<   r8  r9   r;   r:   r6   r  r  r7   r8   rN   rM   r  r  rP   r  rQ   rO   rI   r  r   rH   rJ   rK   rL   r   rB   r  r   rA   rE   rF   r  rC   rD   r@   r>   r?   rT   rU   rV   rW   rX   rY   rR   rP  rS   rZ   r[   r\   r^   r]   r~  )r  s   0r}   <module>r     s  
        	   	   	        
                    &   " & ((#Z S---!RZZ/O>RZZ3O
RZZ''2::5;;
(



"
"
$(<
<
(


	
) 	 	( 	 ?X-L ?g-LLL 
# ' !OJaNA
 77fyryy{m1-Myryy{m1-M%,,V5FG $3$$&,,.2GG 77GGLL*D$7 jjnn"'',,x; 
ww12 6>>>: fnni0.V^^X.
&..-8 .Y f&78 6>>95 v~~}= V^^X.
f&78 6>2 "6+AB fnni02)"))+"2%H$/Ev/E/E/G*HK6:.J48I3JL)X )] 
N
rzz4
    !$Fq||I/FGFA  &)VX
. U# U#r ,    
>F'CKK(!! (`	 & &R # #L&R  &  0  &~~N Q/h-J!06 6r ""	  .1	 v{{445	D  4&VBX&& VBN D!56g%^ g% 7g%Tk\$FL FLRC@ C@L (  &:% [t " !' 2 2 .. # #<7(HV&$2
	. 	 . * *f " " 	FMM&..">? 	}?  FR  FOO%I%%e-AY-A-A-CDEK
  FOO%I%%e-AY-A-A-CDELpsB   [ [ $"\ ]#][[9\\9]]