
    g                       d Z ddlm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. ddl/m0Z0 ddl/m1Z1 ddl/m2Z2 ddl/m3Z3 ddl/m4Z4 ddl/m5Z5 ddl/m6Z6 	 ddlm7Z7 e0rddl:Z:nddl;ZdZ:e&rddl<m=Z= g dZ>dej~                  v Z@d e	j                  v ZBd!e	j                  v xs d"e	j                  v ZCeBxs eCZDd#e	j                  v ZEd$e	j                  v ZFe"r&eCr$ eGd%      5 ZHd&eHj                         v ZJddd       nd'ZJej                  d(kD  ZL e
j                         d)k(  ZNe,d*        ZOe#r eO       d+kD  ZP eO       d,k\  ZQnd'ZPd'ZQd-ZRd.ZSd/ZTd0ZUeDreRd1z  ZReUd1z  ZUeSd2z  ZSeTd1z  ZTe	j                  d3k(  rd4 e	j                         z  ZXnd5 e	j                         z  ZXd6ZYe0rd7j                  d8d9      Z[nd:Z[ ej                         j                         d;v Z^e	j                  j                  e	j                  j                  e	j                  j                  ec      d<d<            Zde	j                  j                  d=e	j                  j                  edd>            Zfe	j                  j                  e	j                  j                  ec            Zg ehe j                  d?      Zj ehe d@      Zk ehe j                  dA      Zl ehe dB      Zm ehe j                  dC      Zn ehe j                  dD      Zoe&xr e' Zp ehe dE      Zq ehe j                  dF      Zr ehe j                  dG      Zs ehe j                  dH      Zt ehe dI      Zu	 euxr  ev e j                               Zx ehe dJ      Zz ehe dK      Z{ ehe j                  dL      Z|e#xs e!xr  e	j                         dk7  Z~dM Z e       \  ZZ eGe	j                  dN      Z ej                  ej
                          ee       D  cg c]  } | j                  dO      s ee |         c} Z eedP e             Z e       Z e       Z G dQ dRej                        ZdS ZeddT       ZedU        ZdV ZedW        ZedX        Zej.                  eUfdYZddZZd[ Zd\ Z G d] d^      Z ee j:                  deUd_`      da        Z ee2efdeUd_`      ddb       Z eedeUd_`      dc        Zdd Zde ZejH                  df        Zdg ZddhZddiZ G dj dk      ZeeZ G dl dmejT                        Zee_         G dn doe      ZejX                  j[                  e@dpq       G dr dse             Zdt Zdu Zdv Z G dw dx      Z G dy dz      ZeRfd{Zdd|Zdd}Zdd~ZeedfdZej:                  fdZddZd ZejH                  d        Zd Zd Zd Zd Zd Zd Zd Ze&rejH                  dd       ZnejH                  dd       Zej                  d        Ze&r  ej                   ej.                  d        yy# e$ r dZY Uw xY w# e$ rA  ejp                         5   ejr                  d       ddl7Z7ddd       n# 1 sw Y   nxY wY w xY w# 1 sw Y   xY w# ey$ r d'ZxY <w xY wc c} w )zTest utilities.    )print_functionN)AF_INET)AF_INET6)SOCK_STREAM)AIX)LINUX)MACOS)NETBSD)OPENBSD)POSIX)SUNOS)WINDOWS)bytes2human)debug)memoize)print_color)supports_ipv6)PY3)FileExistsError)FileNotFoundError)range)super)unicode)which)mockignore)wait_pid)MAPPVEYOR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	QEMU_USER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__r   GITHUB_ACTIONSCIBUILDWHEELCOVERAGE_RUNPYTEST_XDIST_WORKERz/proc/1/cmdlinez
/bin/qemu-Fl        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     J/var/www/openai/venv/lib/python3.12/site-packages/psutil/tests/__init__.pymacos_versionr      s    ""$Q'KC[..s3BQ789G( !--?	 )#.#	
 C!2!23!7!;<=N    )rt      )   r   rt   i  P i            javaz$psutil-%s-z@psutil-%s-u   -ƒőős   futf8surrogateescapeu   fÀ>   us-asciiasciiz..PSUTIL_SCRIPTS_DIRscriptscpu_affinitycpu_freqenviron
getloadavgionicememory_mapsnet_io_counterscpu_numio_countersrlimitsensors_batterysensors_fanssensors_temperaturesthreadsc                     d } t         j                  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sO  | t        dt        j                  d d z              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)r   
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%s.%srs   z"can't find python exe real abspath)osr   copygetattrr   r   version_infor   rl   r	   pathrealpathr   psutilProcessr   
ValueErrorexists)r   ry   baser   s       r   _get_py_exer      s9    **//
C 3*D1D3##v-$2B &)^^!"Sy	~~s""	CNN# /rww''78/u]S-=-=bq-AABC/ 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 )	rH   z6A thread task which does nothing expect staying alive.c                     t               j                          d| _        d| _        t	        j
                         | _        y )NFMbP?)r   __init___running	_interval	threadingEvent_flag)self	__class__s    r   r   zThreadTask.__init__5  s-    __&
r   c                 d    | j                   j                  }d|| j                  t        |       fz  S )Nz<%s running=%s at %#x>)r   __name__r   idr   names     r   __repr__zThreadTask.__repr__;  s+    ~~&&'44*IIIr   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__C  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.startF  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.runO  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.stopU  s%    }}.//		r   )r   
__module____qualname____doc__r   r   r   r   r   r   r   __classcell__)r   s   @r   rH   rH   2  s*    @'J'r   rH   c                 B     t        j                          fd       }|S )Nc                  F    	  | i |S # t         $ r t                 w xY wr   )	ExceptionrD   )r   r   funs     r   wrapperz&_reap_children_on_err.<locals>.wrapperc  s/    	''' 	O	s     	functoolswraps)r   r   s   ` r   _reap_children_on_errr   b  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	|z  z   d
z   }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   cwdry      creationflagsdirzimport time;zopen(r'%s', 'w').close();z&[time.sleep(0.1) for x in range(100)];rv   Tdeleteempty)
setdefaultr   r   getcwdr%   r   rX   rU   r$   r   Popen_subprocesses_startedaddr]   r\   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r   rE   rE   n  s)    	OOGW%OOHg&OOE299;'OOE>* %)9:
{		,	 -67:; 
 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   )rX   r   r   textwrapdedentr   basenamer$   r   rB   r   r   r   r   r]   _pids_startedr   rU   )tfiler  ssubpchildgrandchild_pid
grandchilds          r   rG   rG     s     EBIIK(FOO 77##F+Z	9 	: 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| z        }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
            s = socket.socket(socket.AF_UNIX)
            with contextlib.closing(s):
                s.connect('%s')
                if sys.version_info < (3, ):
                    pid = str(os.getpid())
                else:
                    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Fr   )r   r   rX   r  r  rb   
settimeoutr    rB   acceptselectfilenor   recvr
  r   r   r[   closerU   )		unix_filesrcr  sockparentconn_zpidr  s	           @r   rF   rF     s0   
 <<<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 D5 ;E
 5EE
 
+E5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   rX   openwriterE   r$   r   r\   r   r   rU   )r  r  srcfilefr  s        r   rB   rB     s     	OOHd#OOHd#lG'31GGCL  z1662;d;TXXg	  
  Gs"   B B<B BB B-c                 h   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                  |       t        r|j                  t              \  }}n|j                         \  }}|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   rz   Tr   timeout
N)r   r   r   r   
isinstancestrshlexr   r   r   r   r   communicater    
returncodeRuntimeErrorrh   endswith)r   r  flagspr   r   s         r   shr9     s     !IaEOOHjoo.OOHjoo.OO($/OOOU+#skk#%%Aa 
~>||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|z        # 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                 Z   t        | t        j                        rt        s| j	                          n| j	                  |       t
        rJt        | t        j                        r/	 t        j                  | j                        j	                  |      S y y # t        j                  $ r Y y w xY wr   )
r0  r   r   r   r   r   r   r   r   NoSuchProcess)procr-  s     r   r   zterminate.<locals>.wait'  s    dJ,,-cIIKIIgz$
(8(89~~dhh/44W== :7 '' s   $-B B*)B*c                     t         rt        rt        j                  }t        r2|t        j                  k7  r| j                  t        j                         | j                  |       y r   )r	   rl   signalSIGKILLr   send_signalSIGCONT)r=  sigs     r   sendsigzterminate.<locals>.sendsig3  s@    ^..C SFNN*V^^,r   c                     	  |         | |      S # t         $ r>}t        r|j                  dk(  rn|j                  t        j                  k7  r Y d }~Kd }~ww xY w)N   )OSErrorr   winerrorerrnoESRCH)r=  r-  errrD  rC  r   s      r   term_subprocess_procz'terminate.<locals>.term_subprocess_proc=  sX    	D# D'""  	3<<1,ekk)		s   	 	A4AAc                 \    	  |         | |      S # t         j                  $ r Y w xY wr   )r   r<  )r=  r-  rD  rC  r   s     r   term_psutil_procz#terminate.<locals>.term_psutil_procG  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   )r   r-  r=  rN  s      r   term_pidzterminate.<locals>.term_pidN  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   )r=  s    r   flush_popenzterminate.<locals>.flush_popenX  sL    ;;KK;;KK::JJ r   zwrong type %r)	r0  r   r   r   r   r   
pid_existsr   	TypeError)proc_or_pidrC  wait_timeoutrL  rP  rR  r8  r   rD  rN  r   s    `      @@@r   rC   rC     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.)) Oa/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&|rc|D ]  }t        |d        t        j                  |t              \  }}|D ]+  }t        d|z         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)rV  r,  z0couldn't terminate process %r; attempting kill())rC  )r   r   childrenr   poprC   r
  
wait_procsr    rh   r?  r@  )rY  rZ  r  r   r8  r#  alives          r   rD   rD   r  s     ~~((9(=H  $((*$  
 !# 
 Aad+ $$X~F5ACaGHaV^^, 	 r   c                  |   t         st        d      d} t        j                         d   }|D ]  }|j	                         s|dk(  r| |z  }  n | st        d|z        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 rs   rr   zcan't parse %rr      r   )	r   NotImplementedErrorr   unameisdigitr   r   r   len)r  rb  cminormicronumsmajors          r   rZ   rZ     s    !+..
AHHJqME99;!s(FA	 
 )E122EE773<DQLE
4yA~DG
4yA~DG5%  r   c                  
   t         st        d      t        j                         } t	        | d      r| j
                  xs d}n7t        j                  d| d         }|rt        |j                  d            nd}| d   | d   |fS )Nznot WINDOWSservice_pack_majorr   z\s\d$r   r`  )
r   ra  r   getwindowsversionhasattrrk  researchr   group)wvsprs      r   rY   rY     sw    !-00				 Br'(""'aIIh1& !S_q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   rw  r-  rx  ry  rz  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   rx  r   )r   stop_atr#  s      r   __iter__zretry.__iter__  sl     <<iikDLL0G))+' ))+'\\4<<( )  s   A B#3Bc                 \    | j                    t        j                  | j                          y y r   )ry  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  t        r| # j                   $ r9}|}j                  j                  |       j                          Y d }~[d }~ww xY wr   )rw  rz  r   r   )r   r   excr#  r   r   s       r   r   zretry.__call__.<locals>.wrapper  sq    C///  	 ~~ 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   r}  r   r   r   r   ru  ru    s*      
&r   ru  r   )rw  rz  r-  ry  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   )r   s    r   r\   r\     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'  readrU   )fnamer   r   r*  datas        r   r]   r]   
  sC     
eT	avvx 
tEK 
	s	   ;Ac                      |        }|sJ |S )z1Keep calling function until it evaluates to True.r  )r   rets     r   r[   r[     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                 H   t        j                          t        z   }t        j                          |k  r	  |        S # t        $ r Y n.t        $ r#}|}t	        dt        |      z         Y d }~nd }~ww xY wt        j                  d       t        j                          |k  rpi)Nzignoring %sg{Gz?)r   r    r   WindowsErrorrh   r1  r   )r   r|  r#  rK  s       r   	retry_funzsafe_rmpath.<locals>.retry_fun0  s    
 ))+.iikG#1u 	 %  1]c#h/001 JJt iikG#s   = 	A3A3A..A3N)r   statS_ISDIRst_moder   partialshutilrmtreeremover   r   )r   r  str   s       r   rU   rU   -  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   mkdirr   r   s    r   
safe_mkdirr  O  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   rT   )dirnamecurdirs     r   rT   rT   W  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registerrU   r  copyfiler$   r   r  chmodr  S_IEXEC)r   r  s     r   rV   rV   b  si    ww~~d#)T)#
OOK&
OOJ%WWT]
rzzDLL01Kr   c                 B   t         j                  j                  |       rJ |        t        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   pytestskipr  r  r0  r1  r  r  rU   r'  rX   r(  r   r   r   )r   c_coder*  s      r   rW   rW   m  s    ww~~d#)T)#<kk011~ "  &#&..&
OOK&	j%s	+q	 
,uaffdD9:AFFK 
,	+
 	AFFs   &C;#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  rU   )r  r   r   r   s       r   rX   rX     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)rS   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.
        rs   )	verbosityz<Fake pytest module was used. Test results may be inaccurate.r`  
stacklevel)	rI   
TestLoaderdiscoverHERETextTestRunnerr   warningsrh   UserWarning)r   kwsuites      r   mainzfake_pytest.main  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  r  r   r   ExceptionInfor    s    D! !r   r  c              3      K           }	 | t        d| z        # | $ rX}|rEt        j                  |t        |            s&dj	                  |t        |            }t        |      ||_        Y d }~y d }~ww xY ww)Nz%r not raisedz"{}" does not match "{}")AssertionErrorrn  ro  r1  formatr  )r  matcheinforK  msgr  s        r   contextz#fake_pytest.raises.<locals>.context  sy     !OE< %_s%:;;  !5#c(!;4;;E3s8LC(-- 

	!s+   A> A>A;AA61A>6A;;A>)r  r   )
contextlibcontextmanager)r  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`.)rI   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`.)rI   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.)rI   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   r  r   s     r   r   z%fake_pytest.mark.xdist_group.__init__  s    r   c                     |S r   r  )r   cls_or_meths     r   r  z%fake_pytest.mark.xdist_group.__call__  s    ""r   r   )r   r   r   r   r   r  r  r   r   xdist_groupr    s    F#r   r  Nr_  )r   r   r   staticmethodr  r  r  r   r   markr    s    		6 
	6	# 	#r   r  r   r  )
r   r   r   r   r  r  r  r  r  r  r  r   r   rS   rS     sa       ) )2 8 8 ( (# #r   rS   c                   <    e Zd Zesd Zej                  d        Zyy)r  c                      y r   r  r   s    r   runTestzTestCase.runTest  s    r   c              /      K   d  y wr   r  )r   r   r  s      r   subTestzTestCase.subTest  s      s   N)r   r   r   r   r  r  r  r  r  r   r   r  r    s)    	 
	"	"	 
#	 r   r  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)rN   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   )rX   
addCleanuprU   )r   r  r   r  s       r   rX   zPsutilTestCase.get_testfn  s!    &c2U+r   c                 H    t        |i |}| j                  t        |       |S r   )rE   r  rC   )r   r   r  r  s       r   rE   zPsutilTestCase.spawn_testproc  s$    --	5)r   c                 |    t               \  }}| j                  t        |       | j                  t        |       ||fS r   )rG   r  rC   )r   child1child2s      r   rG   z"PsutilTestCase.spawn_children_pair  s5    ,.	6*	6*r   c                 |    t               \  }}| j                  t        |       | j                  t        |       ||fS r   )rF   r  rC   )r   r!  r  s      r   rF   zPsutilTestCase.spawn_zombie  s4    %	6*	6*r   c                 z    t        |i |\  }}| j                  t        |       | j                  t        |       |S r   )rB   r  rU   rC   )r   r   r  r  r)  s        r   rB   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   )r0  r   Errorr   r   _nameZombieProcessppid_ppidr1  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                    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   r<  r   r  r  r  r   r   rS  r  process_iter)r   r   cmxs       r   assertPidGonezPsutilTestCase.assertPidGone+  s    ]]6//0BOs# 1
 xx||s"""xx}}$$$$$S).3.)&++-'''&*=*=*?@*?Q155*?@@@@ '' O$%MNNO 10 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r=  r   zProcess.z!() didn't raise NSP and returned r   r,  )r  r   rO   iterallr  r  r   r  r<  r   r   )r   r=  nsr   r   r  r  r  s           r   assertProcessGonez PsutilTestCase.assertProcessGone7  s    488$t$T:IC4d3.%C C )-- ; 			!	 ++ ++ 4((s3343 433s6   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_runningrS  as_dictr  r  _pmaprO   r
  r  r  r  AccessDeniedr   r   r  r  cmdliner  r   r   suspendresumerC   kill)	r   r=  cloner  r  r   r   r  r  s	            r   assertProcessZombiez"PsutilTestCase.assertProcessZombieJ  s4   txx( u}}6:e,,,{{} 4 4444     ***xx6;;=(((xx6+>+>+@A+@aAEE+@AAAAxx6+>+>+@A+@aAEE+@AAAAt$T:IC4d34E 43 ; v334 5  rxx0v334
 5  rxx0v334  " 5  rxx0		     ***xx6;;=(((xx6+>+>+@A+@aAEE+@AAAAxx6+>+>+@A+@aAEE+@AAAAA BA ,,f.A.AB 4((s334 43 54 54 5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	r_  N)r   r   r   r   rX   rE   rG   rF   rB   r   r  r  r  r  r   r   rN   rN     s6    


  
A&1Br   rN   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)rM   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)
       rt   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   r   r   )r   r  s     r   _logzTestMemoryLeak._log  s    <<8#**= r   c                 
   | j                         }| j                  |       | j                         }||z
  }|dk  r| j                  d|z        |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   zHnegative diff %r (gc probably collected a resource from a previous test)fdhandler`  r  z
 unclosed z after calling N)r0  callfailr   )r   r   beforeafterdifftype_r  s          r   
_check_fdszTestMemoryLeak._check_fds  s    
 ""$		#!!#v~!8))1378  !8!DxEax7;UCHC))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   r   timesmem1r  r  mem2r>  s           r   _call_ntimeszTestMemoryLeak._call_ntimes  st     	

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

a }}zzRd{r   c           
         g }d}|}t        d|dz         D ]  }| j                  ||      }	d|dt        |	      dt        |	|z        d|}
|j                  |
       |	|k  xs |	|k  }|r|dkD  r| j	                  |
        y |dk(  r
t                | j	                  |
       ||z  }|	} | j                  dj                  |            )Nr   r`  zRun #z: extra-mem=z, per-call=z, calls=z. )r   rI  r   appendr6  printr;  r   )r   r   rF  rx  	tolerancemessagesprev_memincreaseidxr+  r  successs               r   
_check_memzTestMemoryLeak._check_mem  s    GaK(C##C/CC C%K(	C OOC Y&9#/G7IIcN!8G		#!' )( ii		(+,,r   c                      |       S r   r  )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.Nr`  ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rF  rx  rM  )
rF  warmup_timesrx  rM  r  r   r1  rI  r@  rS  )r   r   rF  rV  rx  rM  rK  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)r  r   r   s   r   r:  z*TestMemoryLeak.execute_w_exc.<locals>.call+  s    c3'r   N)rW  )r   r  r   r   r:  s   ```  r   execute_w_exczTestMemoryLeak.execute_w_exc&  s    
	( 	T$V$r   )NNNN)r   r   r   r   rF  rV  rM  r+   rx  r5  r   r   r(  boolr   getenvr$  classmethodr"  r%  r,  r0  r6  r@  rI  rS  r:  rW  r[  r  r   r   rM   rM     s    > ELIbAGG Iibii78! ! 2 2,0>!*-8 KOP,%r   rM   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        d      rt        d      |d<   nt        j                  rdt        j                         d   z  |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        j.                         dt        j0                         |d<   d	j#                  t3        t        j4                               t        j6                         gz         |d
<   t        j8                  rt        j:                         d   |d<   d	j#                  t        j<                         t        j>                         t        j@                         g      |d<   tC        |dd      |d<   ||dxx   d|jD                  z  z  cc<   t        j8                  r\t        d      r.t        ddg      }t'        |      jG                  d      d   |d<   nd|d<   t        jH                         d   }	|	r|	|d<   tK        jL                         |d<   |jO                         }
|
d   d	|
d   |d<   |j                  jQ                  t        jR                               jU                  d      |d<   |j                  jW                         jU                  d      |d<   |jY                         |d<   tZ        j\                  j_                  d      |d<   t[        j`                         |d<   tb        |d <   t        jd                         |d!<   t[        jf                         |d"<   t        jh                         |d#<   d$tk        t        jl                         D cg c]  }|t        jh                         z  d%z   c}      z  |d&<   t        jn                         }tq        |jr                        d'tu        |jv                        d(tu        |jx                        |d)<   t        jz                         }tq        |jr                        d'tu        |jv                        d(tu        |jx                        |d*<   t}        t        j~                               |d+<   t        j                         j                         }|j                  d,d        |j                  |      |d-<   t        d.tJ        j                  /       |j                         D ])  \  }}t        |d0z   d1d|tJ        j                  /       + t        d.tJ        j                  /       tJ        j                  j                          tJ        j                  j                          y # t        $ r d }Y w xY w# t        $ r d }Y w xY wc c}w )2Nr   lsb_releasezlsb_release -d -sOSz	Darwin %szWindows  win32_editionz, archrs   kernelpython__version__znot installedpipz (wheel=%s)r  z	--versionr.  r`  glibczfs-encodinglangz%Y-%m-%d %H:%M:%Sz	boot-timer   user~homer   pyexehostnamePIDcpusz%.1f%%, %.1f%%, %.1f%%d   loadavgz%, used=z, total=memoryswapr  r   r=  zF======================================================================r4  :17)Icollectionsdatetimegetpasslocalepprintrh  ImportErrorwheelOrderedDictr   r   r   r9  OSXr{   r|   r   r   r~   r1  	win32_verrm  rc  systemr   listarchitecturemachiner   rb  python_implementationpython_versionpython_compilerr   rg  r   libc_verr   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserr   r$   nodegetpid	cpu_countr}   r   virtual_memoryr   percentr   usedtotalswap_memoryrd  r  r   r  r[  pformatrL  r   itemsr   flush)ry  rz  r{  r|  r}  rh  r  infooutr  rj  r  r+  ru  pinfokvs                    r   rQ   rQ   1  s    ""$D ||m,+,T
	 8#3#3#5a#88T
	#((3sH4F4F4H+I"JJT
8_-J$!7!7!999J ( 183C3C3EFT
99X""$%)9)9);(<<DL ||!)!,X YY&&(!  "  DN
 #}o>DKU}u'8'888 ||<e[)*Cc(...q1DK)DK"DM 335DD#AwQ0DL ))77h"# 	 $$((*334GHDL??$DL77%%c*DL))+DKDM}}D))+DK ##%DL.V5F5F5HI5Hq6##%%+5HIJDO 


!CCKKCHHCIIDN
 DDLLDIIDJJDL
 v{{}%DLNN$$&E	IImT">>%(DL	($

1AGQ'cjj9 	($JJ JJA    z Js(   W W% !W7
W"!W"%W43W4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   )r9  
splitlinesr   replacer   )r  r  liner  bitsr   r   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)r   r  s     r   rR   rR     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   rm  r   randomchoicer   )r8  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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d0dd1d2i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                  d3fi fgz  Ze	r,ered*ej*                  d4f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d5ej2                  fi fd6di fd7di fd8di fd9di fgZer(ed5ej6                  fi fgz  Zed5ej8                  fi fgz  Zeez   ez   ez   Zd: Zd@d;Zd< Z e!d=        Z"e!d>        Z#y?)ArO   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  rZ  rY  Tconnectionsr  memory_info_ex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   rA  r  r  rC   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  r   r  )r   lsr  fun_namer   r  r   s          r   r
  zprocess_namespace.iter  sq      "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)rm  r   r   AttributeError)r!  
test_classr  r  r#  	meth_namer  s          r   test_class_coveragez%process_namespace.test_class_coverage*  sN    
 !NHa(*I:y1((11 %S)) !r   c                 \   t        | j                  D cg c]  }|d   	 c}      }t        | j                  D cg c]  }|d   	 c}      }t        t        t        j
                        D cg c]  }|d   dk7  s| c}      }||z  |z  }|rt        d|z        y c c}w c c}w c c}w )Nr   r#  z!uncovered Process class names: %r)r   r  ignoredr   r   r   r   )r!  r  thisr  klassleftouts         r   testzprocess_namespace.test8  s    #''*'QAaD'*+S[[1[qt[12FNN 3C 31qts{Q 3CD'>U*@7JKK 	 +1Cs   BB$-B);B)N)T)$r   r   r   r   utilsr  gettersr   r2   r3   r6   r   RLIMIT_NOFILEr/   r5   r1   r   r4   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   rO   rO     s    R$'7R&@AE 
B	R+t,-	B	r2	2r"	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   rO   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))*rP   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  r  logicalFT	cpu_statsr  percpudisk_io_countersperdiskdisk_partitionsr  
disk_usager  r  net_if_addrsnet_if_statsr   pernicrS  r  r  usersr  arm64r   r   r   r   r   win_service_iterwin_service_get)algr  r\  r  cpu_times_percentc              #      K   t        |       } t        j                  |        | D ]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.itery  s^     
 "Xr$& HdD&(+C##C7$7$7C/! %'s   AAN)r   r   r   r   r   r   r  r  r0   r	   r{   r  HAS_GETLOADAVGr:   r9   r7   r   r   r   r  r  r  r
  rO   r  r  r   r   rP   rP   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( %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   rP   c                 .    d }t        t        d| |      S )zZDecorator which runs a test function and retries N times before
    actually failing.
    c                 @    t        d| z  t        j                         y )Nz%r, retryingrv  )rL  r   r   )r  s    r   rz  z retry_on_failure.<locals>.logfun  s    ns"4r   N)rw  r-  rx  rz  )ru  r  )rx  rz  s     r   rL   rL     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   r  z(skip_on_access_denied.<locals>.decorator  s%    			9 
	9 r   r  r  r  s   ` r   rJ   rJ     s     r   c                       fd}|S )z3Decorator to Ignore NotImplementedError exceptions.c                 F     t        j                          fd       }|S )Nc                      	  | i |S # t         $ r* s dj                  z  }t        j                  |      w xY w)Nz4%r was skipped because it raised NotImplementedError)ra  r   r  r  )r   r   r  r   r  s      r   r   z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapper  sX    
'D+F++& '&"Jll#  kk#&&'s    3>r   r   s   ` r   r  z*skip_on_not_implemented.<locals>.decorator  s%    			' 
	' r   r  r  s   ` r   rK   rK     s    " r   c                     t        j                  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)r  closingsocketbindgetsockname)hostr   s     r   r`   r`     sE    			FMMO	,		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   listenr   r  )familytypeaddrr   s       r   ra   ra     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   rb   rb     s    <<<ww~~d#)T)#==.D		$6%%%KKN K  

s   5B B0c                    t        j                  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  r  r	  connectr  r  rG  )r  r  llre  caddras         r   rc   rc     s     
		FMM&+>	?2

		!~~MM&+.	IIdOMMOE))+45=q6 
@	? 	   	GGI	 
@	?s$   AC2<=CCC//C22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   rb   r  r   setblockingr   r  r   r  )r   serverclients      r   rd   rd     s    
 <<<FV!$V-?-?@1v~~v/A/AB1t F  LLNLLNs   B B /Cc               #   x  K   g } dx}}	 | j                  t        t        j                  t        j                               | j                  t        t        j                  t        j
                               t               rn| j                  t        t        j                  t        j                               | j                  t        t        j                  t        j
                               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  )rK  ra   r  r   r   
SOCK_DGRAMr   r   r   r;   rX   rd   rb   r  rU   )socksfname1fname2s1s2s3r  r  s           r   re   re     sL     EFV#[1C1CDE[1B1BCD?LLV__f6H6HIJLLV__f6G6GHI-\F\F$V,FB!&v/@/@AB"b\Q "AGGI f%E E" & AGGI f%E E" &s)   F:EF  F:9F:!F7)F77F:c                    ddl }t        r-t        r't        s!t	        |t        j
                        sJ |       |t        j                  k(  r| j                  d      D cg c]  }t        |       }}t        |      dk(  sJ |        |D ]  }d|cxk  rdk  rJ |         J |         t        st        |       } |j                  |        y|t        j                  k(  r:t	        | t              sJ |        t        st        |       } |j                  |        y|t         j"                  k(  rt%        j&                  d|       J |        yt)        d|z        c c}w )z[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    r   Nrr   r      z([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r)	ipaddressenumr   r#   r0  IntEnumr  r   r   r   rd  r   IPv4Addressr   r1  IPv6Addressr   AF_LINKrn  r  r   )r  r  r+  r  octsnums         r   r^   r^   5  s%    D&$,,/77/ $

301A04yA~#t#~C?s?(D(?(D(? 4=Dd#	6??	"$$*d*$4=Dd#	6>>	!xx5t<HN$NH,v566 1s   E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   >   rF  r   r   r`  rs   r   r   r   rF  )rd  r8  r  r  laddrraddrr  r   )r"  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        +t        | j                   t        j                        s(J |        t        | j                   t              sJ |        | j                   t        k(  rjt        j                  | j                   | j                        }t        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        j                  $ r(}|j                  t        j                   k7  r Y d }~d }~ww xY w# 1 sw Y   y xY wr  )r  r   r   r   r,  r0  r-  r   r  r  r  r  r  r5  errorrI  EADDRNOTAVAILr  r   	CONN_NONE)r"  r  rK  s      r   check_familyz-check_connection_ntuple.<locals>.check_family_  s'   {{w'::GDKKG:dkk4<<8>$>8dkk3/55/;;'!
 dkk4995A##A&FFDJJqM1-. '& [[G#;;&"2"22?DKK?2 $ || yyE$7$77 8 '&s0   E? EE<E72E?7E<<E??Fc                    t        t        dt                     }| j                  t        j                  t        j
                  |hv sJ | j                         t        +t        | j                  t        j                        s(J |        t        | j                  t              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,  r0  r-  r   r  r   r<  )r"  r?  s     r   
check_typez+check_connection_ntuple.<locals>.check_typet  s     )968Dyy
 
 	 99		 

 dii6<<6dii-3t3-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  )r5  r6  r  r   r   r0  r}   r  portr   r^   ipr   r1  )r"  r  s     r   check_addrsz,check_connection_ntuple.<locals>.check_addrs  s    ZZ,D{{w11!$.:T
:.!$))S1B4		?B1DII..9		9.!$''4;;7'!$,8d4j8, -r   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_)r0  r  r1  r   r   
startswithr   r  r   r   r  r   r<  )r"  r  validss      r   check_statusz-check_connection_ntuple.<locals>.check_status  s    $++s+8T[[8+(+F
(31q||G7LGFA 	 
 {{f$1dkk1$;;7H--$)){2J;;&"2"22?DKK?2;;&"2"22?DKK?2
s   DDNr  )r"  r8  r=  rA  rE  rJ  s         r   check_connection_ntuplerK  P  sH    
1@*@9	@ tr   c                     g }| D ]b  }t         rI|j                  t        j                  k(  r,t        r&d|j
                  v rt        dt        |      z         R|j                  |       d |S )ztOur process may start with some open UNIX sockets which are not
    initialized by us, invalidating unit tests.
    z/syslogzskipping %s)	r   r  r  r   r	   r6  r   r1  rK  )consnewr"  s      r   r_   r_     sZ     CT[[FNN2djj0mc$i/0

4  Jr   c                     	 ddl }t        |d      st        	 |j                  |       S # t        $ r ddl}|j                  |       cY S w xY w)z,Backport of importlib.reload of Python 3.3+.r   Nreload)	importlibrm  r~  rP  imp)modulerQ  rR  s      r   rf   rf     sU    
(y(+ , ''  "zz&!!"s   * A
Ac                    t         j                  j                  t         j                  j                  |             d   }t        j
                  d   dk  rdd l}|j                  ||       S dd l}|j                  j                  ||       }|j                  j                  |      }|j                  j                  |       |S )Nr   r   )r   r   splitextr	  r   r   rR  load_sourceimportlib.utilutilspec_from_file_locationmodule_from_specloaderexec_module)r   r   rR  rQ  specmods         r   rg   rg     s    77BGG,,T23A6D
QtT**~~55dDAnn--d3$
r   c                 <    t        j                  | t        d       y)zRaise a warning msg.rs   r  N)r  rh   r  )r  s    r   rh   rh     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   )r0  r1  ).0ns     r   	<genexpr>z is_namedtuple.<locals>.<genexpr>  s     -1az!S!1s   )r  	__bases__rd  r}   r   r0  r  )r  tbr*  s       r   rj   rj     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.
        pypyrf  z.sor  r`  N)r#   rX   r   r   r   r   r   rU  lowerr  r  r  r  ctypesCDLLrU   )r  r   extdstr  libsr  s          r   ri   ri     s      f(- ^^%113
3ww'*c1cQVV\\^6K FF3 	 

 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  rf  wow64rj  N)rl  rr  rs  rX   r   r   r   r   rk  r6  r   r	  r#   r  r  r  r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerU   )r  rr  rs  rn  ro  r  rp  r  cfilerx  r  s              r   ri   ri     s     	$#- ^^%113
3vv||~&&s+BGG,,QVV4::<<qvv||~-	 FF3 	 
   )5577ARWW--aff5;;== 7  
 mmD!S!	MM#&EI  $mm44@@(0(8(8'9$!%--0!8J?
"  $mm44@@(0(8(8'9$!%--0!8Js:   AI*BG:.I*AG?/I*?H A,I*A#I''I*c                      t        d       y )NTrX  )rD   r  r   r   cleanup_test_procsr~  7  s
    D!r   c                 ,    t        j                  |       S r   )r   exit)rC  r#  s     r   r  r  A  s    #r   r   )F)TFr  )z	127.0.0.1)r  r  )r   
__future__r   r  r  rl  rI  r   rC  r   r{   r  rn  r  r2  r  r?  r  r  r   r   r  r  r   r   rI   r  r   r   r   r  r~  r   r   r   r	   r
   r   r   r   r   psutil._commonr   r   r   r   r   psutil._compatr   r   r   r   r   r   r   r   catch_warningssimplefilterr,  	unittest2psutil._psposixr   __all__builtin_module_namesr#   r   r   rl   r+   r>   rA   r'  r*  r  r@   maxsizer.   r  r?   r   r<   r=   r"   r!   r-   r    r   r  r(   r)   decoder*   r  rk  ASCII_FSr   r   r   r  __file__r&   getr'   r  rm  r   r/   r0   r1   r  r3   r4   r;   HAS_NET_IO_COUNTERSr5   r2   r6   r7   r\  r   r8   r   r9   r:   HAS_THREADSgetuidSKIP_SYSCONSr   r$   r%   devnullr   r  r  r   rH  r   r,   r@  r   r   r   r
  r   rH   r   rE   rG   rF   rB   r9  r  rC   rD   rZ   rY   ru  r<  r\   r  r]   r[   rU   r  r  rT   rV   rW   rX   rS   r  rN   r  r  rM   rQ   rR   r  rO   rP   rL   rJ   rK   r`   ra   rb   rc   rd   re   r^   rK  r_   rf   rg   rh   rj   ri   r~  )r  s   0r   <module>r     s    %      	 	   	        
                   &   " & (  * ,     "    D(#Z S---#!RZZ/O>RZZ3O'
RZZ''2::5^		 A AFFH,	 
!	  I;;
(


	
) 	 	( 	 ?X-L ?g-LLL 
# ' !OJaNA
 77f!IBIIK/M!IBIIK/M)009JK($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
'T )] 
N
rzz4
    !$F +1q||I/FGFA  &)VX
. (!! (`	 & &R # #L*Z  &  6  &~~N S/l-J!0	"8 8v ""	  .1	 	D  4&J# J#Z 
>F
x   
  BX B` D!56a%^ a% 7a%HiX$GL GLTC@ C@L ( 
&:% [t " !' 2 2 .. # #476Od&((2
	. 	 . * *f " " 	FMM&..">? 	m@  F8  	 	 	 	"h' 
#	"	"L 
!	 @  Kpsf   <[ =[ \""\/ \=\=[[\/\	\\	\\"\,/\:9\: