
    [hh                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlmZ 	 ddlZddl!Z!ddl!m"Z" ddl!m#Z# ddl!m$Z$ dd	l!m%Z% dd
l!m&Z& ddl!m'Z' ddl!m(Z( ddl!m)Z) ddl*m+Z+ ddl*m,Z, ddl*m-Z- ddl*m.Z. ddl*m/Z/ e'rddl0m1Z1 g dZ2dejf                  v Z4de
jj                  v xs de
jj                  v Z6e6Z7de
jj                  v Z8de
jj                  v Z9ejt                  dkD  Z; ejx                         dk(  Z=e-d        Z>e$r e>       dkD  Z? e>       dk\  Z@ndZ?dZ@d ZAd!ZBd"ZCd#ZDe7reAd$z  ZAeDd$z  ZDeBd%z  ZBeCd$z  ZCe
j                  d&k(  rd' e
j                          d(ZGnd) e
j                          d(ZGd*ZHd+j                  d,d-      ZJ ej                         j                         d.v ZMe
j                  j                  e
j                  j                  e
j                  j                  eR      d/d/            ZSe
jj                  j                  d0e
j                  j                  eSd1            ZUe
j                  j                  e
j                  j                  eR            ZV eWe!j                  d2      ZY eWe!d3      ZZ eWe!j                  d4      Z[ eWe!d5      Z\ eWe!j                  d6      Z] eWe!j                  d7      Z^e'xr e( Z_ eWe!d8      Z` eWe!j                  d9      Za eWe!j                  d:      Zb eWe!j                  d;      Zc eWe!d<      Zd	 edxr  ee e!j                               Zg eWe!d=      Zi eWe!d>      Zj eWe!j                  d?      Zke$xs e"xr  e
j                         dk7  Zmd@ Zn en       \  ZoZp eqe
j                  dA      Zs ej                  esj                          eve!      D  cg c]  } | j                  dB      s exe!|        c} Zy exedC ez             Z{ e|       Z} e|       Z~ G dD dEej                        ZdF ZeddG       ZedH        ZdI ZedJ        ZedK        Zej                  eDfdLZddMZdN ZdO Z G dP dQ      Z ee!j                  deDdRS      dT        Z eeefdeDdRS      ddU       Z eedeDdRS      dV        ZdW ZdX Zej*                  dY        ZdZ Zdd[Zdd\Z G d] d^      ZeeZ G d_ d`ej6                        Zej:                  j=                  e4dab       G dc dde             Zde Zdf Zdg Z G dh di      Z G dj dk      ZeAfdlZddmZddnZddoZeedfdpZej<                  fdqZddrZds Zej*                  dt        Zdu Zdv Zdw Zdx Zdy Zdz 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 w xY w# eh$ r dZgY w 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_testprocspawn_zombiespawn_children_pair
ThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespaceprint_sysinfois_win_secure_system_procfake_pytestchdirsafe_rmpathcreate_py_execreate_c_exe
get_testfn
get_winverkernel_version
call_untilwait_for_pidwait_for_filecheck_net_addressfilter_proc_net_connectionsget_free_portbind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_socketsreload_moduleimport_module_by_pathwarncopyload_shared_libis_namedtuple__pypy__GITHUB_ACTIONSCIBUILDWHEELCOVERAGE_RUNPYTEST_XDIST_WORKERl        aarch64c                  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     P/var/www/html/backend/venv/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    )rh      )   r   Frh   i  P i            javaz$psutil--z@psutil-u   -ƒőős   futf8surrogateescape>   us-asciiasciiz..PSUTIL_SCRIPTS_DIRscriptscpu_affinitycpu_freqenviron
getloadavgionicememory_mapsnet_io_counterscpu_numio_countersrlimitsensors_batterysensors_fanssensors_temperaturesthreadsc            	      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)ru   
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{}.{}rg   z"can't find python exe real abspath)osr   copygetattrrw   r   version_inforx   r`   r   pathrealpathshutilwhichformatpsutilProcessr   
ValueErrorexists)r   rm   baser   s       r{   _get_py_exer      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                   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?)super__init___running	_interval	threadingEvent_flag)self	__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   __name__r   idr   names     r{   __repr__zThreadTask.__repr__  s6    ~~&&4&	$--RXbMCCr}   c                 &    | j                          | S N)startr   s    r{   	__enter__zThreadTask.__enter__#  s    

r}   c                 $    | j                          y r   )stop)r   args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{   runzThreadTask.run3  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.stop9  s%    }}.//		r}   )r   
__module____qualname____doc__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>.wrapperG  s/    	''' 	O	s     	functoolswraps)r   r   s   ` r{   _reap_children_on_errr   F  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   cwdrm      creationflagsdirzimport time;open(r'z6', 'w').close();[time.sleep(0.1) for x in range(100)];rj   Tdeleteempty)
setdefaultr   r   getcwdr   r   rL   rI   r   ru   Popen_subprocesses_startedaddrQ   rP   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r{   r9   r9   R  s%    	OOGW%OOHg&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   r   textwrapdedentr   basenamer   r   r6   r   r   r   rs   rQ   _pids_startedr   rI   )tfiler   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>  s    v}}&2F2FF r}   )r   r   rL   r  r  rV   
settimeoutr   r6   acceptselectfilenors   recvr  r   r   rO   closerI   )		unix_filesrcr  sockparentconn_zpidr  s	           @r{   r:   r:     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)r   rL   openwriter9   r   r   rP   r   r   rI   )r  r   srcfilefr  s        r{   r6   r6     s     	OOHd#OOHd#lG'3 	1GGCL	z1662;d;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   rn   Tr   timeout
N)r   r   ru   r   
isinstancestrshlexrt   r   r   r   communicater   
returncodeRuntimeErrorr\   endswith)r   r   flagspr   r   s         r{   shr4    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   r+  ru   r   r   r   r   NoSuchProcess)procr(  s     r{   r   zterminate.<locals>.wait  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)r8  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)r8  r(  errr?  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   r7  )r8  r(  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   r7  r   r   )r   r(  r8  rH  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   r  r   r   )r8  s    r{   flush_popenzterminate.<locals>.flush_popen3  sL    ;;KK;;KK::JJ r}   zwrong type )	r+  rs   ru   r   r   r   
pid_existsr   	TypeError)proc_or_pidr>  wait_timeoutrF  rJ  rL  r3  r   r?  rH  r   s    `      @@@r{   r7   r7     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)rP  r'  zcouldn't terminate process z; attempting kill())r>  )r   r   childrenr   popr7   r  
wait_procsr   r\   r:  r;  )rS  rT  r  r   r3  r  alives          r{   r8   r8   M  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 POSIX rg   rf   zcan't parse r      r   )	r   NotImplementedErrorr   unameisdigitr   rt   rs   len)r  r\  cminormicronumsmajors          r{   rN   rN   r  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   rZ  )r   r[  rw   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   	exceptionr(  retriesintervallogfun)r   rl  r(  rm  rn  ro  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   )r(  r   rm  range)r   stop_atr  s      r{   __iter__zretry.__iter__  sq     <<iikDLL0G))+' ))+'\\4<<(   s   A B#3Bc                 \    | j                    t        j                  | j                          y y r   )rn  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   )rl  ro  r   )r   r   excr  r   r   s       r{   r   zretry.__call__.<locals>.wrapper  sp    C /// I ~~ C{{.C(JJLs   A/AA)r   r   	decorator)r   r   r   s   `` r{   __call__zretry.__call__  s-    			 
	  !r}   )	r   r   r   r   r   r   rs  r   ry   r}   r{   rj  rj    s*      
&r}   rj  r   )rl  ro  r(  rn  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   pidsr7  r   )r   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)r"  readrI   )fnamer   r   r%  datas        r{   rQ   rQ     sJ     
eT	 avvxtEK s	   ;Ac                      |        }|sJ |S )z1Keep calling function until it evaluates to True.rz  )r   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   FileNotFoundErrorrC  r\   r   )r   rr  r  rE  s       r{   	retry_funzsafe_rmpath.<locals>.retry_fun  s    
 ))+.iikG#(u 	 %  (y&''( JJt iikG#s   = 	A*A*A%%A*N)r   statS_ISDIRst_moder   partialr   rmtreeremover   r  )r   r  str   s       r{   rI   rI     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   r   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   atexitregisterrI   r   copyfiler   r   r  chmodr  S_IEXEC)r   r  s     r{   rJ   rJ   7  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suffixr!  z-o)r   r   r   r   r   pytestskipr  r  r+  r,  r  r  rI   r"  rL   r#  ru   r   r   )r   c_coder%  s      r{   rK   rK   B  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                   j    e Zd ZdZed        Zed	d       Zed	d       Zed
d       Z G d d      Z	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                      t        j                         j                  t              }t        j                  d      j                  |       t        j                  dt        d       |S )zMimics pytest.main(). It has the same effect as running
        `python3 -m unittest -v` from the project root directory.
        rg   )	verbosityz<Fake pytest module was used. Test results may be inaccurate.rZ  
stacklevel)	r=   
TestLoaderdiscoverHERETextTestRunnerr   warningsr\   UserWarning)r   kwsuites      r{   mainzfake_pytest.mainw  sR    
 ##%..t4!,007J	

 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 r   )_excr   s    r{   valuez/fake_pytest.raises.<locals>.ExceptionInfo.value  s    yy r}   )r   r   r   r  propertyr  rz  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searchr,  r  )rw  matcheinforE  msgr  s        r{   contextz#fake_pytest.raises.<locals>.context  sz     !OE< %wk%:;;  !5#c(!;eW$6se1=C(-- 

	!s*   A, A,A)<A$A,$A))A,)r  r   )
contextlibcontextmanager)rw  r  r  r  s      @r{   raiseszfake_pytest.raises  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.warns  s=     $$&77GG  "..w77r}   c                 ,    t        j                  |       )zMimics `unittest.SkipTest`.)r=   SkipTestreasons    r{   r  zfake_pytest.skip  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.skipif  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   rz  r   s     r{   r   z%fake_pytest.mark.xdist_group.__init__  s    r}   c                     |S r   rz  )r   cls_or_meths     r{   ry  z%fake_pytest.mark.xdist_group.__call__  s    ""r}   r   )r   r   r   r   r   ry  rz  r}   r{   xdist_groupr    s    F#r}   r  NrY  )r   r   r   staticmethodr  r  rz  r}   r{   markr    s    		6 
	6	# 	#r}   r  r   r  )
r   r   r   r   r  r  r  r  r  r  rz  r}   r{   rG   rG   o  sa       ) )2 8 8 ( (# #r}   rG   c                   H    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Z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.
    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   r   r   s       r{   r9   zPsutilTestCase.spawn_testproc  s$    --	5)r}   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   r  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   r   r   r$  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   )r+  r   Errorr   r   _nameZombieProcessppid_ppidr,  repr)r   r8  rw  s      r{   _check_proc_exczPsutilTestCase._check_proc_exc  s    #v||,,,ww$(("""xx4::%%%8888O8c6//088tzz)))xx#xx1}$}CS	r}   c                    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        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   r7  r   r  r  r  r   r   rM  r|  process_iter)r   r   cmxs       r{   assertPidGonezPsutilTestCase.assertPidGone  s    ]]6//0 	OBOs#	O
 xx||s"""xx}}$$$$$S).3.)&++-'''&*=*=*?@Q155@@@@ '' O$%MNNO	O 	O As"   C>CD
C;;C>>Dc                    | j                  |j                         t        |      }|j                  |j                  d      D ]3  \  }}| j                  ||      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r8  r   zProcess.z!() didn't raise NSP and returned r   r'  )r  r   rC   iterallsubTestr  r   r  r7  r  r   )r   r8  nsr   r   r  r  rw  s           r{   assertProcessGonez PsutilTestCase.assertProcessGone  s    488$t$T: 	.IC4d3 ..%C #4& )7$  )--	. 			!	 ++ ++ 4((s3343. . .s6   CB&C&C3C
C
CCC%	c                    t        j                  |j                        }||k(  sJ 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 ])  \  }}| j#                  ||      5  	  |        d d d        + t*        rt-        j.                  t         j$                        5 }|j1                          d d d        | j)                  |j2                         t-        j.                  t         j$                        5 }|j5                          d d d        | j)                  ||j2                         t-        j.                  t         j$                        5 }|j7                          d d d        | j)                  ||j2                         |j9                          |j;                          |j=                          |j?                          |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   r   r
   r	   hashr  r  
is_runningrM  as_dictr|  r  _pmaprC   r  r  r  r  AccessDeniedr  r   r  r  cmdliner  r   r   suspendresumer7   kill)	r   r8  cloner  r   r   r   rw  r  s	            r{   assertProcessZombiez"PsutilTestCase.assertProcessZombie  s?   txx( u}}6:e,,,{{} 4 4444     ***xx6;;=(((xx6+>+>+@AaAEEAAAAxx6+>+>+@AaAEEAAAAt$T: 	4IC4d3 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   5O:OPOP%)P2P?,Q1Q#P8P
PPPP"	%P/2P<?Q	rY  N)r   r   r   r   rL   r9   r;   r:   r6   r  r  r  r  rz  r}   r{   rB   rB     s6    


  
A&1Br}   rB   zunreliable on PYPYr  c                       e Zd ZdZdZdZdZerdndZdZ	 e
j                         Z e ej                  d            Zed        Zed	        Zd
 Zd Zd Zd Zd Zd Zd Z	 ddZd Z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)
       rh   r   r   TPSUTIL_DEBUGc                 .    t        j                  d       y )NF)r   
_set_debugclss    r{   
setUpClasszTestMemoryLeak.setUpClassy  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   rw   r   )r   r  s     r{   _logzTestMemoryLeak._log  s    <<8#**= r}   c                    | j                         }| j                  |       | j                         }||z
  }|dk  rd|d}| j                  |      |dkD  r/t        rdnd}|dkD  r|dz  }| d| d	|}| 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handlerZ  r  z
 unclosed z after calling N)r$  callfailr   )r   r   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.
        rZ  )
generation)gccollectr   rq  r.  garbage)r   r   timesmem1r  r  mem2r2  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  }|	} | j                  dj                  |            )Nr   rZ  z,Run #{}: extra-mem={}, per-call={}, calls={}z. )	rq  r=  r   r   appendr*  printr/  r   )r   r   r:  rm  	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		#!'	( ii		(+,,r}   c                      |       S r   rz  )r   r   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.NrZ  ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)r:  rm  rA  )
r:  warmup_timesrm  rA  r  r   r,  r=  r4  rG  )r   r   r:  rJ  rm  rA  rE  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                  *    j                          y r   )assertRaises)rw  r   r   s   r{   r.  z*TestMemoryLeak.execute_w_exc.<locals>.call  s    c3'r}   N)rK  )r   rw  r   r   r.  s   ```  r{   execute_w_exczTestMemoryLeak.execute_w_exc  s    
	( 	T$V$r}   )NNNN)r   r   r   r   r:  rJ  rA  r    rm  r)  r   r   r  boolr   getenvr  classmethodr  r  r   r$  r*  r4  r=  rG  r.  rK  rO  rz  r}   r{   rA   rA   P  s    > ELIbAGG Iibii78! ! 2 2,0>!,-8 KOP,%r}   rA   c                  &   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+<   t        j                         j                         }|j                  d,d        |j                  |      |d-<   t        d.tL        j                  /       |j                         D ]3  \  }}t        d0jm                  |d1z   |      tL        j                  /       5 t        d.tL        j                  /       tL        j                  j                          tL        j                  j                          y # t        $ r d }Y w xY w# t        $ r d }Y w xY w)2Nr   lsb_releasezlsb_release -d -sOSzDarwin zWindows  win32_editionz, archrg   kernelpython__version__znot installedpipz (wheel=)r  z	--versionr)  rZ  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>@  s#     Iq6##%%+Is   $&loadavgz{}%%, used={}, total={}memoryswapr|  r   r8  zF======================================================================r(  z	{:<17} {}:)Kcollectionsdatetimegetpasslocalepprintr\  ImportErrorwheelOrderedDictr   r   r   r   r4  OSXro   rp   r   r   rr   r,  	win32_verhasattrrW  systemrz   listarchitecturemachiner   r\  python_implementationpython_versionpython_compilerr   r[  rt   libc_verrw   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserr   r   nodegetpidri  r   rq   r   virtual_memoryrs   percentr   usedtotalswap_memoryr^  r|  r   r  rU  pformatr@  r   itemsr   flush)rq  rr  rs  rt  ru  r\  rw  infooutr  r_  r  rn  pinfokvs                   r{   rE   rE     s    ""$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
 v{{}%DLNN$$&E	IImT">>%(DL	($

 ?1k  S!,3::>?	($JJ JJA    s"   W/ X /W>=W>XX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 csvrZ  ,r  rY  r   )r4  
splitlinesrt   replacers   )r  r  liner  bitsr   r   s          r{   	get_procsz,is_win_secure_system_proc.<locals>.get_procsd  s    +,NN$QR( 	D04

3@1AIIc2&@D@QT!W#DCH	 
 As   A.zSecure SystemF)r   KeyError)r   r  s     r{   rF   rF   b  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   )r3  s    r{   _get_eligible_cpur  t  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_percentrz  memory_percentr  rT  rS  Tconnectionsr  oneshotr  parentsr   r   )r   r  	cpu_timescreate_timer   r   r  memory_infor   net_connectionskindr  nicenum_ctx_switchesnum_threads
open_filesr  r  r   usernameuidsgidsterminalr"  r   r   r   r   r   r   r#  r   groupedF)r  i   r   r<  r	  r
  r7   r  c                     || _         y r   )_proc)r   r8  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  r   r  )r   lsr  fun_namer   r   r   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  _initr   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  r  	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   r  zuncovered Process class names: )r  ignoredr   r   r   r   )r  r  thisr  klassleftouts         r{   testzprocess_namespace.test  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  rR  r  r  rz  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
j                         dk(  rneddd
difgz  Zer	eddi fgz  Zer	eddi fgz  Zer	eddi fgz  Zer	ed di fgz  Zered!di fgz  Zed"d#i fgz  Zd$di fd% ej$                         gfi fd&di fd'di fgZeZed(        Zej0                  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  rz  ri  logicalFT	cpu_statsr  percpudisk_io_countersperdiskdisk_partitionsr  
disk_usager  r  net_if_addrsnet_if_statsr   pernicrM  r|  r  usersr  arm64r   r   r   r   r   win_service_iterwin_service_get)algr  rV  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   r   r  )r  r  r   r   r   s        r{   r  zsystem_namespace.iter=  sc     
 "Xr$& 	" HdD&(+C##C7$7$7C/!	"s   AAN)r   r   r   r   r   r   r  r  r%   r   ro   r  HAS_GETLOADAVGr/   r.   r,   r   r   r   r  r  r  r  rC   r  rz  r}   r{   rD   rD     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( %X%%'72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                 .    d }t        t        d| |      S )zZDecorator which runs a test function and retries N times before
    actually failing.
    c                 @    t        | dt        j                         y )Nz
, retryingro  )r@  rw   r   )rw  s    r{   ro  z retry_on_failure.<locals>.logfunQ  s    z"4r}   N)rl  r(  rm  ro  )rj  r  )rm  ro  s     r{   r@   r@   L  s    
5  $ 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   r   only_ifs     r{   r   z9skip_on_access_denied.<locals>.decorator.<locals>.wrapper]  sI    9D+F++&& 9&"kk"788	9s    .9r   r   r   r  s   ` r{   rx  z(skip_on_access_denied.<locals>.decorator\  s%    			9 
	9 r}   rz  r  rx  s   ` r{   r>   r>   Y  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  r   r  s      r{   r   z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapperp  s]    
'D+F++& '&"||& '+ +  kk#&&'s    3>r   r  s   ` r{   rx  z*skip_on_not_implemented.<locals>.decoratoro  s%    			' 
	' r}   rz  r  s   ` r{   r?   r?   l  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   rZ  N)socketbindgetsockname)hostr  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.rY  r   >   ntcygwinrZ  r   )r   r   r  r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRr  r   listenr   r  )familytypeaddrr  s       r{   rU   rU     s    |7H"55==&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  r   r  )r   r	  r  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  connectr  r  rC  )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  r   r  )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   r?  r  rI   )socksfname1fname2s1s2s3r  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.
    rf   r   r      z([a-fA-F0-9]{2}[:|\-]?){6}Nzunknown family )r+  enumIntEnumr  r   rt   rs   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   >   rA  r   r   rZ  rg   r   r   r   rA  )r^  r,  r  r	  laddrraddrr  r   )r  has_pids     r{   check_ntuplez-check_connection_ntuple.<locals>.check_ntuple  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   r+  r!  r"  r  r	  r  r+  rC  errnoEADDRNOTAVAILr  r   	CONN_NONE)r  r  rE  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  r+  r!  r"  r  r   r2  )r  r5  s     r{   
check_typez+check_connection_ntuple.<locals>.check_type1  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   r+  rq   r	  portrs   rR   ipr   r,  )r  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_)r+  r  r,  r   r   
startswithr   r  r   r   r	  r   r2  )r  r  validss      r{   check_statusz-check_connection_ntuple.<locals>.check_statusJ  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Nrz  )r  r.  r3  r7  r;  r@  s         r{   check_connection_ntuplerA    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   r?  )consnewr  s      r{   rS   rS   \  s]     C T[[FNN2djj0	$()

4 Jr}   c                 ,    t        j                  |       S r   )	importlibreload)modules    r{   rZ   rZ   o  s    F##r}   c                 8   t         j                  j                  t         j                  j                  |             d   }t        j
                  j                  ||       }t        j
                  j                  |      }|j                  j                  |       |S r  )
r   r   splitextr  rF  utilspec_from_file_locationmodule_from_specloaderexec_module)r   r   specmods       r{   r[   r[   s  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.rg   r  N)r  r\   r  )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.rZ  r   F_fieldsNc              3   <   K   | ]  }t        |t                y wr   )r+  r,  )rj  ns     r{   rk  z is_namedtuple.<locals>.<genexpr>  s     -az!S!-s   )r	  	__bases__r^  rq   r   r+  r  )r  tbr%  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.
        pypyrZ  z.sor  rZ  N)r   rL   r   r   r   r   r   rJ  lowerr  r  r   r  ctypesCDLLrI   )r  r   extdstr  libsr  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  rZ  wow64r[  N)r]  rc  rd  rL   r   r   r   r   r\  r1  r   r  r   r  r  r   r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerI   )r  rc  rd  r_  r`  r  ra  r  cfileri  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 )NTrR  )r8   rz  r}   r{   cleanup_test_procsro    s
    D!r}   c                 ,    t        j                  |       S r   )rw   exit)r>  r  s     r{   r  r    s    # r}   r   )F)TFr  )z	127.0.0.1)r  r  )r   r  r  r]  r!  r0  r   r7  rF  r#  r   ro   r  r  r  r-  r   r:  r  r  ru   rw   r  r  r   r   r=   r  r   r   r   r  rv  r   r   r   r   r	   r
   r   r   r   psutil._commonr   r   r   r   r   psutil._psposixr   __all__builtin_module_namesr   r   r`   r    r3   r5   maxsizer#   r  r4   r|   r1   r2   r   r   r"   r   r   r  r   r   decoder   r  r\  ASCII_FSr   r   r   r  __file__r   getr   r  r{  r   r$   r%   r&   r  r(   r)   r0   HAS_NET_IO_COUNTERSr*   r'   r+   r,   rP  r   r-   r   r.   r/   HAS_THREADSgetuidSKIP_SYSCONSr   r   r   r"  devnullr   r  r  r   r>  r   r!   r6  r   r   r   r  r   r<   r   r9   r;   r:   r6   r4  r  r7   r8   rN   rM   rj  r7  rP   r  r  rQ   rO   rI   r  r  rH   rJ   rK   rL   rG   r  rB   r  r  rA   rE   rF   r  rC   rD   r@   r>   r?   rT   rU   rV   rW   rX   rY   rR   rA  rS   rZ   r[   r\   r^   r]   ro  )r  s   0r{   <module>r     s1  
        	   	   	        
                   &   " & ( 	(#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>>>: vz*fnni0.V^^X.
&..-8 .Y f&78 6>>95 v~~}= V^^X.
f&78 %H$/Ev/E/E/G*HK 6>2 "6+AB fnni02)"))+"2
)X )] 
N
rzz4
    !$Fq||I/FGFA  &)VX
. (!! (`	 & &R # #L&R  &  0  &~~N Q/h-J!06 6r ""	  .1	 	D  4&J# J#Z 
>FBX&& B` D!56b%^ b% 7b%JiX$FL FLRC@ C@L ( 
&:% [t " !' 2 2 .. # #<7(HV&$2
	. 	 . * *f " " 	FMM&..">? 	}=  FH  Kts0   X< +Y
 Y$Y<YY
YY