
    f                        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ZddlmZ ddlmZ ddlm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.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 e/rddl;Z;n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 ZEej                  d%kD  ZGe+d&        ZHe"r eH       d'kD  ZI eH       d(k\  ZJnd)ZId)ZJd*ZKd+ZLd,ZMd-ZNeDreKd.z  ZKeNd.z  ZNeLd/z  ZLeMd.z  ZMe
j                  d0k(  rd1 e
j                         z  ZQnd2 e
j                         z  ZQ e4d3      ZRe/rd4j                  d5d6      ZTnd7ZT ej                         j                         d8v ZWe
j                  j                  e
j                  j                  e
j                  j                  e\      d9d9            Z]e
j                  j                  d:e
j                  j                  e]d;            Z_e
j                  j                  e
j                  j                  e\            Z`e%xr e& Za ebej                  d<      Zd ebed=      Ze ebed>      Zf ebej                  d?      Zg ebej                  d@      Zh ebej                  dA      Zi ebedB      Zj ebej                  dC      Zk ebej                  dD      Zl ebej                  dE      Zm ebedF      Zn	 enxr  eo ej                               Zq ebedG      Zs ebedH      Zt ebej                  dI      Zue"xs e xr  e
j                         dk7  ZwdJ Zx ex       \  ZyZz e{e
j                  dK      Z} ej                  e}j                          ee      D  cg c]  } | j                  dL      s ee|         c} Z eedM e             Z e       Z e       Z G dN dOej                        ZdP ZeddQ       ZedR        ZdS ZedT        ZedU        Zej"                  eNfdVZddWZdX ZdY Z G dZ d[      Z eej.                  deNd\]      d^        Z ee1efdeNd\]      dd_       Z eedeNd\]      d`        Zda Zdb Zej<                  dc        Zdd ZddeZddfZ G dg dhejF                        Zee_         G di dje      Z ejJ                  e@dk       G dl dme             Zdn Zdo Zdp Z G dq dr      Z G ds dt      Zdu ZeKfdvZddwZddxZddyZeedfdzZej<                  fd{Zdd|Zd} Zej<                  d~        Zd Zd Zd Zd Zd Zd Zd Ze%rej<                  dd       Znej<                  dd       Zej                  d        Ze%r  ej"                  ej"                  d        yy# e8$ rA  ejr                         5   ejt                  d       ddl7Z7ddd       n# 1 sw Y   nxY wY w xY w# er$ r d)ZqY 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)u)unicode)which)mockignore)wait_pid)H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MACOS_11PLUSMACOS_12PLUSCOVERAGE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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_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_RUNl        c                  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     7/usr/lib/python3/dist-packages/psutil/tests/__init__.pymacos_versionr      s    ""$Q'KC[..s3BQ789G( !--?	 )#.#	
 C!2!23!7!;<=N    )rn      )   r   Frn   i  P i            javaz$psutil-%s-z@psutil-%s-u   -ƒőős   futf8surrogateescapeu   fÀ)asciizus-asciiz..PSUTIL_SCRIPTS_DIRscriptscpu_affinitycpu_freq
getloadavgenviron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.%srm   z"can't find python exe real abspath)osr   copygetattrr}   r   version_infor~   rh   r	   pathrealpathr   psutilProcessr   
ValueErrorexists)r   rs   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 )	rE   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__(  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__2  s    

r   c                 $    | j                          y r   )stop)r   argskwargss      r   __exit__zThreadTask.__exit__6  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.start9  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.runB  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.stopH  s%    }}.//		r   )r   
__module____qualname____doc__r   r   r   r   r   r   r   __classcell__)r   s   @r   rE   rE   %  s*    @'J'r   rE   c                 B     t        j                          fd       }|S )Nc                  F    	  | i |S # t         $ r t                 w xY wr   )	ExceptionrA   )r   r   funs     r   wrapperz&_reap_children_on_err.<locals>.wrapperV  s/    	''' 	O	s     	functoolswraps)r   r   s   ` r   _reap_children_on_errr   U  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   cwdrs      creationflagsdirzimport time;zopen(r'%s', 'w').close();z&[time.sleep(0.1) for x in range(100)];rp   Tdeleteempty)
setdefaultr    r   getcwdr&   r   rT   rQ   r%   r{   Popen_subprocesses_startedaddrY   rX   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r   rB   rB   a  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(60);"
            p = subprocess.Popen([r'z.', '-c', s])
            p.wait()
            r   )r   TFr   )rT   r   r   textwrapdedentr   basenamer%   r   r?   r   r   r   ry   rY   _pids_startedr   rQ   )tfiler   ssubpchildgrandchild_pid
grandchilds          r   rD   rD     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#        |j$                  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   zret == psutil.STATUS_ZOMBIE)r   r   rT   r   r   r^   
settimeoutr!   r?   acceptselectfilenory   recvr  r   r   rW   statuscloserQ   )		unix_filesrcr  sockparentconn_zpidzombies	            r   rC   rC     s5   
 <<<I
//   C  EI&D'c
++-a	MM4;;=/2r>Btyy'Dd#^^D)Fv}}&CDF#JJL

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

I s%   6E :BD< E <EE +E<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   rT   openwriterB   r%   r   rX   r   r   rQ   )r  r   srcfilefr  s        r   r?   r?     s     	OOHd#OOHd#lG'3 	1GGCL	z1662;d;TXXg		 	
  Gs"   B B<B BB B-c                 b   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        |      |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   rt   Tr   timeout
N)r   r   r{   r   
isinstancestrshlexrz   r   r   r   r   communicater!   
returncodeRuntimeErrorrd   endswith)r   r   flagspr   r   s         r   shr.    s     !IaEOOHjoo.OOHjoo.OO($/OOOU+#skk#%%Aa 
~>||q6""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   )
r%  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	   rh   signalSIGKILLr   send_signalSIGCONT)r2  sigs     r   sendsigzterminate.<locals>.sendsig&  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)r2  r"  errr9  r8  r   s      r   term_subprocess_procz'terminate.<locals>.term_subprocess_proc0  sX    	D# D'""  	3<<1,ekk)		s   	 	A4AAc                 \    	  |         | |      S # t         j                  $ r Y w xY wr   )r   r1  )r2  r"  r9  r8  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   r1  r   r   )r   r"  r2  rC  s      r   term_pidzterminate.<locals>.term_pidA  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   )r2  s    r   flush_popenzterminate.<locals>.flush_popenK  sL    ;;KK;;KK::JJ r   zwrong type %r)	r%  ry   r{   r   r   r   
pid_existsr   	TypeError)proc_or_pidr8  wait_timeoutrA  rE  rG  r-  r   r9  rC  r   s    `      @@@r   r@   r@     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)rK  r!  z0couldn't terminate process %r; attempting kill())r8  )r   r   childrenr   popr@   r  
wait_procsr!   rd   r4  r5  )rN  rO  r  r   r-  r  alives          r   rA   rA   e  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 rm   rl   zcan't parse %rr      r   )	r   NotImplementedErrorr   unameisdigitr   rz   ry   len)r  rW  cminormicronumsmajors          r   rV   rV     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   rU  )
r   rV  r}   getwindowsversionhasattrr`  researchry   group)wvsprs      r   rU   rU     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   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  r   )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  t        r| # j                   $ r9}|}j                  j                  |       j                          Y d }~[d }~ww xY wr   )rl  ro  r   r   )r   r   excr  r   r   s       r   r   zretry.__call__.<locals>.wrapper  sv    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   rr  r   rx   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   pidsr1  r   )r   s    r   rX   rX     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  readrQ   )fnamer   r   r  datas        r   rY   rY     sJ     
eT	 avvxtEK s	   ;Ac                 .     |        }t        |      sJ |S )zVKeep calling function for timeout secs and exit if eval()
    expression is True.
    )eval)r   exprrets      r   rW   rW     s     %C::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   WindowsErrorrd   r&  r   )r   rq  r  r@  s       r   	retry_funzsafe_rmpath.<locals>.retry_fun%  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   rQ   rQ   "  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  D  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   rP   )dirnamecurdirs     r   rP   rP   L  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registerrQ   r  copyfiler%   r   r  chmodr  S_IEXEC)r   r  s     r   rR   rR   W  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   rF   SkipTestr   r   r%  r&  r  r  rQ   r  rT   r  r{   r   r   )r   c_coder  s      r   rS   rS   b  s    ww~~d#)T)#< 677~ "  &#&..&
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  rQ   )r  r   r   r   s       r   rT   rT   |  sU     mFLww~~d#77##D)DOOK.K r   c                       e Zd Zd Z eej                  d      sej                  j                  Ze	sd Z
ej                  d        Zyy)TestCasec                     | j                   j                  }|j                  d      sd|z   }|d| j                   j                  d| j                  S )Nzpsutil.zpsutil.tests.rl   )r   r   
startswithr   _testMethodName)r   fqmods     r   __str__zTestCase.__str__  sL    ))	*#e+ENN##  
 	
r   assertRaisesRegexc                      y r   ry  r   s    r   runTestzTestCase.runTest  s    r   c              /      K   d  y wr   ry  )r   r   kws      r   subTestzTestCase.subTest  s      s   N)r   r   r   r  rb  rF   r  assertRaisesRegexpr  r   r  
contextlibcontextmanagerr  ry  r   r   r  r    sU    
 8$$&9:$--@@ 	 
	"	"	 
#	 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)rK   zUTest class providing auto-cleanup wrappers on top of process
    test utilities.
    Nc                 L    t        ||      }| j                  t        |       |S )N)r  r   )rT   
addCleanuprQ   )r   r  r   r  s       r   rT   zPsutilTestCase.get_testfn  s!    &c2U+r   c                 H    t        |i |}| j                  t        |       |S r   )rB   r  r@   )r   r   r   r   s       r   rB   zPsutilTestCase.spawn_testproc  s$    --	5)r   c                 |    t               \  }}| j                  t        |       | j                  t        |       ||fS r   )rD   r  r@   )r   child1child2s      r   rD   z"PsutilTestCase.spawn_children_pair  s5    ,.	6*	6*r   c                 |    t               \  }}| j                  t        |       | j                  t        |       ||fS r   )rC   r  r@   )r   r  r  s      r   rC   zPsutilTestCase.spawn_zombie  s4    %	6*	6*r   c                 z    t        |i |\  }}| j                  t        |       | j                  t        |       |S r   )r?   r  rQ   r@   )r   r   r   r   r  s        r   r?   zPsutilTestCase.pyrun  s6    --wW-	5)r   c                 (   | j                  |t        j                         | j                  |j                  |j                         | j                  |j
                  |j                         |j
                  r| j                  |j
                  d       t        |t        j                        rN| j                  |j                  |j                         |j                  | j                  |j                  d       t        |       t        |       y )NrT  r   )assertIsInstancer   ErrorassertEqualr   r   _nameassertNotEqualr%  ZombieProcessppid_ppidassertGreaterEqualr&  repr)r   r2  rv  s      r   _check_proc_exczPsutilTestCase._check_proc_exc  s    c6<<0$((+4::.88"-c6//0SXXtzz2xx#''!4CS	r   c                 x   | j                  t        j                        5 }	 t        j                  |       	 d d d        | j                  j                  j                  |       | j                  |j                  j                  d        t        j                  |      rJ |       | j                  |t        j                                | j                  |t        j                         D cg c]  }|j                   c}       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)assertRaisesr   r1  r   r  AssertionErrorr  rl  r   r   rH  assertNotInr{  process_iter)r   r   cmxs       r   assertPidGonezPsutilTestCase.assertPidGone  s    v334 	OOs#	O
 	))3/**D1$$S).3.)fkkm,f.A.A.CDquuDE '' O$%MNNO	O 	O Es"   D+D	.D7
	D((D++D4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r2  r   zProcess.z!() didn't raise NSP and returned r   r!  )r  r   rL   iterallr  r  r   r  r1  r  r   )r   r2  nsr   r   r  msgrv  s           r   assertProcessGonez PsutilTestCase.assertProcessGone  s    488$t$T: 	.IC4d3 ..%C C )--	. 			!	 ++ ++ 4((s3343. . .s6   CB&C&C3C
C
CCC%	c                 d	   t        j                  |j                        }| j                  ||       t        s*t
        s$| j                  t        |      t        |             | j                  |j                         t         j                         |j                         sJ t        j                  |j                        sJ |j                          | j                  |j                  t        j                                | j                  |j                  t        j                         D cg c]  }|j                   c}       i t         _        | j                  |j                  t        j                         D cg c]  }|j                   c}       t!        |      }|j#                  |j$                  d      D ])  \  }}| j'                  ||      5  	  |        d d d        + t.        r| j1                  t         j(                        5 }|j3                          d d d        | j-                  |j4                         | j1                  t         j(                        5 }|j7                          d d d        | j-                  ||j4                         | j1                  t         j(                        5 }|j9                          d d d        | j-                  ||j4                         |j;                          |j=                          |j?                          |jA                          |j                         sJ t        j                  |j                        sJ | j                  |j                  t        j                                | j                  |j                  t        j                         D cg c]  }|j                   c}       i t         _        | j                  |j                  t        j                         D cg c]  }|j                   c}       y c c}w c c}w # t         j(                  t         j*                  f$ r}| j-                  ||       Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   ax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   r
   hashr  STATUS_ZOMBIE
is_runningrH  as_dictassertInr{  r  _pmaprL   r  r  r  r  AccessDeniedr  r   r  cmdlinerl  r   r   suspendresumer@   kill)	r   r2  cloner  r  r   r   rv  r  s	            r   assertProcessZombiez"PsutilTestCase.assertProcessZombie  sM   txx( 	u%6T$Ze5(<(<=     ***dhh.dhh0C0C0E F1 FGdhh0C0C0E F1 FGt$T: 	4IC4d3 44E4 4	4 ""6#7#78 B  r||4""6#7#78 B
  r||4""6#7#78 #B  "#  r||4		     ***dhh.dhh0C0C0E F1 FGdhh0C0C0E F1 FGA !G F ,,f.A.AB 4((s3344 4  # # !G Fsl   -P'
>P,
Q4P1R%R9R;R(
R-
1#Q1Q,&Q4,Q11Q44Q>	RRR%rT  N)r   r   r   r   rT   rB   rD   rC   r?   r  r  r  r  ry  r   r   rK   rK     s6    

  
F&1Hr   rK   zunreliable on PYPYc                       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)rJ   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)
       rn   r   r   TPSUTIL_DEBUGc                 .    t        j                  d       y )NF)r   
_set_debugclss    r   
setUpClasszTestMemoryLeak.setUpClassj  s    % r   c                 B    t        j                  | j                         y r   )r   r  _psutil_debug_origr  s    r   tearDownClasszTestMemoryLeak.tearDownClassn  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_memr  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_fdsx  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handlerU  r  z
 unclosed z after calling N)r  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                         }| j                  t         j                  g        ||z
  }|S )zGet 2 distinct memory samples, before and after having
        called fun repeatedly, and return the memory difference.
        rU  )
generation)gccollectr  r   r  r  garbage)r   r   timesmem1r  r  mem2r  s           r   _call_ntimeszTestMemoryLeak._call_ntimes  s{     	

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

a }}R(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   rU  zRun #z: extra-mem=z, per-call=z, calls=z. )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C C%K(	C OOC Y&9#/G7IIcN!8G		#!'	( ii		(+,,r   c                      |       S r   ry  )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.NrU  ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)r  rm  r  )
r  warmup_timesrm  r  r  r   r&  r  r  r$  )r   r   r  r'  rm  r  r@  s          r   executezTestMemoryLeak.execute  s     *

(4L$:K:K 	 %0'dll!*!6IDNN		'A:333:1$A&AA$a<7!77<>;#;;> 	#|,5'YO  	'SX&&	's   0B, ,	C5C		Cc                 >      fd}  j                   |fi | y)znConvenience method to test a callable while making sure it
        raises an exception on every call.
        c                  *    j                          y r   )r  )rv  r   r   s   r   r  z*TestMemoryLeak.execute_w_exc.<locals>.call  s    c3'r   N)r(  )r   rv  r   r   r  s   ```  r   execute_w_exczTestMemoryLeak.execute_w_exc  s    
	( 	T$V$r   )NNNN)r   r   r   r   r  r'  r  r,   rm  r  r   r   r  boolr   getenvr  classmethodr  r  r  r  r  r  r  r$  r  r(  r+  ry  r   r   rJ   rJ   A  s    > ELIbAGG Iibii78! ! 2 2,0>!*-8 KOP,%r   rJ   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                          t         rt[        j.                  d2       n t        d3      rt[        j.                  d4       t        d.tJ        j                  /       tJ        j                  j                          y # t        $ r d }Y w xY w# t        $ r d }Y +w xY wc c}w )5Nr   lsb_releasezlsb_release -d -sOSz	Darwin %szWindows  win32_editionz, archrm   kernelpython__version__znot installedpipz (wheel=%s)r  z	--versionr#  rU  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   r2  zF======================================================================r  :17tasklistpszps aux)Icollectionsdatetimegetpasslocalepprintr8  ImportErrorwheelOrderedDictr   r   r   r.  OSXru   rv   r   r   rx   r&  	win32_verrb  r3  systemr   listarchitecturemachiner   rW  python_implementationpython_versionpython_compilerr   r7  rz   libc_verr}   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserr   r%   nodegetpid	cpu_countrw   r   virtual_memoryry   percentr   usedtotalswap_memoryrY  r{  r   r  rP  pformatr  r   itemsr   flush)rK  rL  rM  rN  rO  r8  rQ  infooutr  r:  r  r  rE  pinfokvs                    r   rN   rN     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Iq6##%%+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
		*	t
		(	($JJ    z Js(   X* X< !Y
*X98X9<Y
Y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 csvrU  ,"rT  r   )r.  
splitlinesrz   replacery   )r  rq  liner  bitsr   r   s          r   	get_procsz,is_win_secure_system_proc.<locals>.get_procsS  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   rO   rO   Q  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   rb  r   randomchoicer   )r-  s    r   _get_eligible_cpur  c  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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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>)@rL   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_percentry  memory_percentr  rO  rN  Tr  memory_info_exoneshotr  parentsr   r   )r   r  connectionskindr  	cpu_timescreate_timer   r   r  memory_infor   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   r6  r  r  r@   r  c                     || _         y r   )_proc)r   r2  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)rV  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)rb  r   r   AttributeError)r  
test_classr  r  r  	meth_namer  s          r   test_class_coveragez%process_namespace.test_class_coverage  sS    
 ! 	*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.test  s    #''*QAaD*+S[[1qt12FNN 3C1qts{QCD'>U*@7JKK 	 +1Cs   BB$-B);B)N)T)$r   r   r   r   utilsr  gettersr   r3   r4   r7   r   RLIMIT_NOFILEr0   r6   r2   r   r5   settersNORMAL_PRIORITY_CLASSr   IOPRIO_CLASS_NONEIOPRIO_NORMALr  r4  SIGTERMkillersCTRL_C_EVENTCTRL_BREAK_EVENTr  r   r  r  r.  r  r  ry  r   r   rL   rL   l  s    R$'7R&@AE 
B	R+t,-	r2	2r"	B	2r	B	B	r
G 
B	VUO,	b"	B	B	B	R$	B	R	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   rL   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ddd
difgz  Ze	r	eddi fgz  Ze
r	eddi fgz  Zer	eddi fgz  Zer	eddi fgz  Zered di fgz  Zed!d"i fgz  Zd#di fd$ ej                         gfi fd%di fd&di fgZeZed'        Zej*                  Zy())rM   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`  ry  rg  logicalFT	cpu_statsr  percpudisk_io_countersperdiskdisk_partitionsr  
disk_usagenet_connectionsr  net_if_addrsnet_if_statsr   pernicrH  r{  rl  usersrh  r   r   r   r   r   win_service_iterwin_service_get)algr  rQ  r  cpu_times_percentc              #      K   t        |       } t        j                  |        | D ]5  \  }}}t        t        |      }t        j                  |g|i |}||f 7 ywr  )rV  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   rf  r  r1   HAS_GETLOADAVGr;   r:   r8   r   r   r   r  r  staticmethodr  rL   r  ry  r   r   rM   rM     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( Zh%5677\2r*+++R455^R,--&B/00'R011&"566 
R 	)*,b1	B	b"%	G C	" 	" ,??r   rM   c                 L    t        j                  |       sJ |        d| _        | S )zA decorator to mark a TestCase class. When running parallel tests,
    class' unit tests will be run serially (1 process).
    T)inspectisclass
_serialrun)r  s    r   	serialrunr  8  s(    
 ??5!(5(!ELr   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, retryingrF  )r  r}   r   )rv  s    r   ro  z retry_on_failure.<locals>.logfunG  s    ns"4r   N)rl  r"  rm  ro  )rj  r  )rm  ro  s     r   rI   rI   B  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  rF   r  )r   r   r   only_ifs     r   r   z9skip_on_access_denied.<locals>.decorator.<locals>.wrapperS  sK    ?D+F++&& ?&"''(=>>	?s    .9r   r   r   r  s   ` r   rw  z(skip_on_access_denied.<locals>.decoratorR  s%    			? 
	? r   ry  r  rw  s   ` r   rG   rG   O  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)rV  r   rF   r  )r   r   r  r   r  s      r   r   z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapperf  sZ    
-D+F++& -&"Jll#  '',,-s    3>r   r  s   ` r   rw  z*skip_on_not_implemented.<locals>.decoratore  s%    			- 
	- r   ry  r  s   ` r   rH   rH   b  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   rU  N)r  closingsocketbindgetsockname)hostr  s     r   r\   r\     sN    			FMMO	, %		4)!!$% % %s   &AA!c                    || t         t        f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.rT  r   )ntcygwinrU  r   )r   r   r  r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRr  r   listenr   r  )familytypeaddrr  s       r   r]   r]     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   r^   r^     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  r<  )r  r  llrZ  caddras         r   r_   r_     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   r^   r  r   setblockingr   r  r   r  )r   serverclients      r   r`   r`     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  )r  r]   r  r   r   
SOCK_DGRAMr   r   r   HAS_CONNECTIONS_UNIXrT   r`   r^   r  rQ   )socksfname1fname2s1s2s3r  r  s           r   ra   ra     se     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   Nrl   r      z([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r)	ipaddressenumr   r$   r%  IntEnumr  r   rz   ry   rY  r   IPv4Addressr   r&  IPv6Addressr   AF_LINKrc  matchr   )r  r  r  r  octsnums         r   rZ   rZ     s)    D&$,,/77/ $

301A0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   )r;  r   r   rU  rm   r   r   r   r;  )rY  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        f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)Nr   )r  r   r   r   r  r%  r  ry   r  r  r  r  r  r  errorr>  EADDRNOTAVAILr  r   	CONN_NONE)r  r  r@  s      r   check_familyz-check_connection_ntuple.<locals>.check_family  s0   {{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
                  |f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  r%  r  ry   r  r   r  )r  r  s     r   
check_typez+check_connection_ntuple.<locals>.check_type.  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        f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%  rw   r  portry   rZ   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        f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   r  r   r  r   r   r  r   r  )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Nry  )r  r  r  r  r  r"  s         r   check_connection_ntupler#  
  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	   r  r   r&  r  )consnewr  s      r   r[   r[   \  s_     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)	importlibrb  rP  r(  imp)moduler)  r*  s      r   rb   rb   o  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   r*  load_sourceimportlib.utilutilspec_from_file_locationmodule_from_specloaderexec_module)r   r   r*  r)  specmods         r   rc   rc   ~  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.rm   )
stacklevelN)warningsrd   UserWarning)r  s    r   rd   rd     s    MM#{q1r   c                     t        |       }|j                  }t        |      dk7  s|d   t        k7  ryt	        |dd      }t        |t              syt        d |D              S )z-Check if object is an instance of namedtuple.rU  r   F_fieldsNc              3   <   K   | ]  }t        |t                y wr   )r%  r&  ).0ns     r   	<genexpr>z is_namedtuple.<locals>.<genexpr>  s     -az!S!-s   )r  	__bases__rY  rw   r   r%  r  )r  tbr  s       r   rf   rf     sX    QA	A
1v{adem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.
        pypyr6  z.sor  rU  N)r$   rT   r   r   r   r   r   r-  lowerr  r  r  r  ctypesCDLLrQ   )r  r   extdstr  libsr  s          r   re   re     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  r6  wow64rE  N)rG  rM  rN  rT   r   r   r   r   rF  r+  r   r  r$   r  r  r  r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerQ   )r  rM  rN  rI  rJ  r  rK  r  cfilerS  r  s              r   re   re     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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 )NTrM  )rA   ry  r   r   cleanup_test_procsrY    s
    D!r   c                 ,    t        j                  |       S r   )r}   exit)r8  r  s     r   <lambda>r\    s    # r   r   )F)TFr  )z	127.0.0.1)r  )rT  )r   
__future__r   r  r  rG  r>  r   r  r  r   ru   r  rc  r  r'  r  r4  r  r  r{   r}   r  r   r   r   rF   r9  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   r   rP  catch_warningssimplefilterr  psutil._psposixr   __all__builtin_module_namesr$   r   r   rh   r,   r>   maxsizer/   r   r<   r=   r#   r"   r.   r!   r   rf  r)   r*   decoder+   r]  rF  ASCII_FSr   r   r   r  __file__r'   getr(   HEREr  rb  r   r0   r1   r  r2   r4   r5   HAS_NET_IO_COUNTERSr6   r3   r7   r8   r,  r   r9   r   r:   r;   HAS_THREADSgetuidSKIP_SYSCONSr   r%   r&   r  devnullr    r  r  r   r  r   r-   r  r   r   r   r  r   rE   r   rB   rD   rC   r?   r.  r  r@   rA   rV   rU   rj  r1  rX   r  rY   rW   rQ   r  r  rP   rR   rS   rT   r  rK   skipIfrJ   rN   rO   r  rL   rM   r  rI   rG   rH   r\   r]   r^   r_   r`   ra   rZ   r#  r[   rb   rc   rd   rf   re   rY  )r  s   0r   <module>rq     so    %      	  	   	        
                   &   " & (  * ,      "   D(#Z S---#!RZZ/O>RZZ3O'
RZZ';; 	 	( 	 ?X-L ?g-LLL 
# ' !OJaNA
 77f!IBIIK/M!IBIIK/M9)009JK($3$$&,,.2GG 77GGLL*D$7 jjnn"'',,x; 
ww12 *U 6>>>: vz*.fnni0V^^X.
&..-8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q||I/FGFA  &)VX
. (!! (`	 & &R # #L*Z  &  6  &~~N S/l-J!0	"8 8v ""	  .1	 	D  4&x   @  ~HX ~H^ +,a%^ a% -a%HhV$FL FLR@@ @@F ( 
&:% [t " !' 2 2 .. # #476Od&((2
	. 	 . * *f " " 	FMM&..">? 	q=  	 	 	 	" h'  z  KpsH   Y, Z5 ?[[,Z2Z"	Z2"Z+	'Z21Z25[ ?[ 