
    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n# e$ r dZY nw xY wddl Z ddl m!Z! ddl m"Z" dd	l m#Z# dd
l m$Z$ ddl m%Z% ddl m&Z& ddl m'Z' ddl m(Z( ddl)m*Z* ddl)m+Z+ ddl)m,Z, ddl)m-Z- ddl)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 nF# e$ r>  ej8                    5   ej9        d           ddl7Z7ddd           n# 1 swxY w Y   Y nw xY w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	jA        v ZBd!e	jA        v pd"e	jA        v ZCeBpeCZDd#e	jA        v ZEd$e	jA        v ZFe"r<eCr: eGd%          5 ZHd&eHI                                v ZJddd           n# 1 swxY w Y   nd'ZJejK        d(k    ZL e
jM                    d)k    ZNe,d*             ZOe#r eO            d+k    ZP eO            d,k    ZQnd'ZPd'ZQd-ZRd.ZSd/ZTd0ZUeDreRd1z  ZReUd1z  ZUeSd2z  ZSeTd1z  ZTe	jV        d3k    rd4 e	jW                    z  ZXnd5 e	jW                    z  ZXd6ZYe0rd7Z                    d8d9          Z[nd:Z[ ej\                    ]                                d;v Z^e	j_        `                    e	j_        a                    e	j_        b                    ec          d<d<                    Zde	jA        e                    d=e	j_        a                    edd>                    Zfe	j_        `                    e	j_        b                    ec                    Zg ehe ji        d?          Zj ehe d@          Zk ehe ji        dA          Zl ehe dB          Zm ehe ji        dC          Zn ehe ji        dD          Zoe&oe' Zp ehe dE          Zq ehe ji        dF          Zr ehe ji        dG          Zs ehe ji        dH          Zt ehe dI          Zu	 euo ev e jw                              Zxn# ey$ r d'ZxY nw xY w ehe dJ          Zz ehe dK          Z{ ehe ji        dL          Z|e#se!o e	j}                    dk    Z~dM Z e            \  ZZ eGe	j        dN          Z ej        ej                   dO  ee           D             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_`          ddc            Z eedeUd_`          dd             Zde Zdf Zej        dg             Zdh ZddiZddkZ G dl dm          ZeeZ G dn doej                  Zee_         G dp dqe          Zej                            e@drs           G dt due                      Zdv Zdw Zdx Z G dy dz          Z G d{ d|          ZeRfd}Zdd~ZddZddZeedfd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            dS dS )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                     t          j                    d         } t          t          t          |                     d          d d                             }|dk    rdt          j        t          j	        dddgdd	id
          } t          t          t          |                     d          d d                             }|S )Nr   .   )
      z-sS-cz-import platform; print(platform.mac_ver()[0])SYSTEM_VERSION_COMPAT0T)envuniversal_newlines)
platformmac_vertuplemapintsplit
subprocesscheck_outputsys
executable)version_strversions     Q/var/www/html/ai-engine/env/lib/python3.11/site-packages/psutil/tests/__init__.pymacos_versionr      s    "$$Q'KC[..s33BQB78899G( !-?	 )#.#	
 	
 	
 C!2!23!7!7!;<<==N    )rt      )   r   rt   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environ
getloadavgionicememory_mapsnet_io_counterscpu_numio_countersrlimitsensors_batterysensors_fanssensors_temperaturesthreadsc                     d } t           j                                        }t          t          dd           }t
          r%t          j        dk    r|t          j        |d<   ||fS t          rt          j        |fS t          r | t          j                  p | t           j
                            t          j                            pZ | t          dt          j        d d         z                      p- | t          j                                                              }|st!          d          ||fS t           j
                            t          j                  }t           j
                            |          s
J |            ||fS )Nc                     	 t          j        | dgt           j        t           j                   | S # t           j        $ r Y d S w xY w)Nz-V)stdoutstderr)r   
check_callPIPECalledProcessError)exes    r   attemptz_get_py_exe.<locals>.attempt   s^    	!dJOJO    J , 	 	 	44	s   -1 AA_base_executable)r      __PYVENV_LAUNCHER__zpython%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      sx      *//

C 3*D11D 3#v--$2B &)^!"Sy	 ~s""	 GCN## /wrw''7788/wu]S-=bqb-AABBCC/ wv~''++--..	 	  	CABBBCxgs~..w~~c""''C'''Cxr   zr+c                 b    g | ],}|                     d           t          t          |          -S )STATUS_
startswithr   r   .0xs     r   
<listcomp>r   $  sC       q||I/F/FFA  r   AF_UNIXc                   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                                                       d| _        d| _        t	          j                    | _        d S )NFMbP?)r   __init___running	_interval	threadingEvent_flag)self	__class__s    r   r   zThreadTask.__init__5  s:    _&&


r   c                 N    | 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                 .    |                                   | S N)startr   s    r   	__enter__zThreadTask.__enter__?  s    

r   c                 .    |                                   d S r   )stop)r   argskwargss      r   __exit__zThreadTask.__exit__C  s    		r   c                     | j         rt          d          t          j                            |            | j                                         dS )zStart thread and keep it running until an explicit
        stop() request. Polls for shutdown every 'timeout' seconds.
        zalready startedN)r   r   r   Threadr   r   waitr   s    r   r   zThreadTask.startF  sL     = 	0.///t$$$
r   c                     d| _         | j                                         | j         r"t          j        | j                   | j          d S d S )NT)r   r   settimesleepr   r   s    r   runzThreadTask.runO  sW    
m 	'Jt~&&& m 	' 	' 	' 	' 	'r   c                 h    | j         st          d          d| _         |                                  dS )z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)r   r   joinr   s    r   r   zThreadTask.stopU  s3    } 	0.///		r   )r   
__module____qualname____doc__r   r   r   r   r   r   r   __classcell__)r   s   @r   rH   rH   2  s        @@' ' ' ' 'J J J      ' ' '      r   rH   c                 F     t          j                    fd            }|S )Nc                  P    	  | i |S # t           $ r t                        w xY wr   )	ExceptionrD   )r   r   funs     r   wrapperz&_reap_children_on_err.<locals>.wrapperc  sD    	3'''' 	 	 	OOO	s    %	functoolswraps)r   r   s   ` r   _reap_children_on_errr   b  s8    _S     Nr   c                    |                     dt                     |                     dt                     |                     dt          j                               |                     dt                     t
          rd}|                     d|           | t          t          j                              }	 t          |           d	d
|z  z   dz   }t          d|g} t          j
        | fi |}t                              |           t          |dd           t          |           nT# t          |           w xY wt          j
        | fi |}t                              |           t          |j                   |S )a  Create a python subprocess which does nothing for some secs and
    return it as a subprocess.Popen instance.
    If "cmd" is specified that is used instead of python.
    By default stdin and stdout are redirected to /dev/null.
    It also attempts to make sure the process is in a reasonably
    initialized state.
    The process is registered for cleanup on reap_children().
    stdinr   cwdry      creationflagsN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&&&OOE29;;'''OOE>*** ; %)9:::
{	,,,	 -67:; 
 tV,C$S11D11E!%%e,,,&T::::K ----!!%(((UYLs   <A"D. .D?c                     d} t          t          j                              }	 t          j        dt          j                            |          dt          d          }t          rt          |d          \  }} nt          |          \  }} t          j        |j                  }t          t          |dd	
                    }t                              |           t          j        |          }||ft#          |           | t#          |            S S # t#          |           | t#          |            w w xY w)a  Create a subprocess which creates another one as in:
    A (us) -> B (child) -> C (grandchild).
    Return a (child, grandchild) tuple.
    The 2 processes are fully initialized and will live for 60 secs
    and are registered for cleanup on reap_children().
    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BIKK(((FOO 7##F++++ZZZ	9 	: 	:  	#333KD%%((KD%tx((]6$eLLLMM.)))^N33
z"F  	F s   CD #D>c                  x   t           j        sJ t                      } t          j        d| z            }d}t          |           }	 |                    t                     t          |          \  }}|	                                \  }}	 t          j
        |                                gg g t                     t          |                    d                    }t                              |           t          j        |          t#          fd           |f|                                 |                                 t'          |            |t'          |           S S # |                                 w xY w# |                                 t'          |            |t'          |           w w xY w)zCreate a zombie process and return a (parent, zombie) process tuple.
    In order to kill the zombie parent must be terminate()d first, then
    zombie must be wait()ed on.
    a          import os, sys, time, socket, contextlib
        child_pid = os.fork()
        if child_pid > 0:
            time.sleep(3000)
        else:
            # this is the zombie process
            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                  H                                      t          j        k    S r   )statusr   STATUS_ZOMBIE)zombies   r   <lambda>zspawn_zombie.<locals>.<lambda>  s    v}}&2FF r   )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     s   
 <I
/    C  EI&&D'''c

++--a	M4;;==/2r>BBBtyy''Dd###^D))FFFFFGGGF#JJLLL

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

I s&   AF BE) F )E??F 7F9c                    |                     dd           |                     dd           t                      }	 t          |d          5 }|                    |            ddd           n# 1 swxY w Y   t	          t
          |j        gfi |}t          |j                   ||fS # t          $ r t          |            w xY w)zRun python 'src' code string in a separate interpreter.
    Returns a subprocess.Popen instance and the test file where the source
    code was written.
    r   Nr   w)r   rX   openwriterE   r$   r   r\   r  r   rU   )r%  r  srcfilefr  s        r   rB   rB     s    	OOHd###OOHd###llG'3 	1GGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	z162;;d;;TXg   Gs/   B* A."B* .A22B* 5A263B* *Cc                    t           rdnd}|                    dt          j                   |                    dt          j                   |                    dd           |                    d|           t	          | t
                    rt          j        |           } t          j        | fi |}t          
                    |           t          r|                    t                    \  }}n|                                \  }}|j        dk    rt          ||z             |rt!          |           |                    d	          r
|d
d         }|S )zURun cmd in a subprocess and return its output.
    raises RuntimeError on error.
    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   shr?     s>    !'IIaEOOHjo...OOHjo...OO($///OOOU+++#s k#%%%%Aa   
 )~>>|q6F?+++ Vt Mr   c                   	
 d 
d 
fd}
fd		fd}d }| }	 t          |t                    ry |||          t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            S t          |t          j        t          j        f          ry 	||          t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            S t          |t          j                  ry |||          t          |t          j        t          j        f          r ||           t          |t                    r|n|j        }t	          j        |          r
J |            S t          d|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                 h   t          | t          j                  rt          s|                                  n|                     |           t
          r]t          | t          j                  rE	 t          j        | j                                      |          S # t          j	        $ r Y d S w xY wd S d S r   )
r6  r   r  r   r   r   r   r   r  NoSuchProcess)procr3  s     r   r   zterminate.<locals>.wait'  s    dJ,-- 	c 	IIKKKKIIg 	z$
(899 	~dh//44W==='   		 	 	 	s   .+B B-,B-c                     t           rt          rt          j        }t          r/|t          j        k    r|                     t          j                   |                     |           d S r   )r	   rl   signalSIGKILLr   send_signalSIGCONT)rC  sigs     r   sendsigzterminate.<locals>.sendsig3  s^     	!^ 	!.C  	-SFN**V^,,,r   c                     	  |            n@# t           $ r3}t          r|j        dk    rn|j        t          j        k    r Y d }~nd }~ww xY w | |          S )N   )OSErrorr   winerrorerrnoESRCH)rC  r3  errrJ  rI  r   s      r   term_subprocess_procz'terminate.<locals>.term_subprocess_proc=  s~    	GD# 	 	 	 3<1,,ek))		
 tD'"""s    
A)AAc                 b    	  |            n# t           j        $ r Y nw xY w | |          S r   )r   rB  )rC  r3  rJ  rI  r   s     r   term_psutil_procz#terminate.<locals>.term_psutil_procG  sR    	GD## 	 	 	D	tD'"""s    ""c                     	 t          j        |           } ||          S # t           j        $ r t          rt	          | |          cY S Y d S w xY wr   )r   r   rB  r   r   )r  r3  rC  rT  s      r   term_pidzterminate.<locals>.term_pidN  sy    	3>#&&D $#D'222 # 	. 	. 	. .W-----. . .	.s   # &AAc                     | j         r| j                                          | j        r| j                                         | j        r| j                                         d S d S r   )r   r#  r   r   )rC  s    r   flush_popenzterminate.<locals>.flush_popenX  sl    ; 	 K; 	 K: 	J	 	r   zwrong type %r)	r6  r   r   r  r   r  
pid_existsr   	TypeError)proc_or_pidrI  wait_timeoutrR  rV  rX  r>  r  rJ  rT  r   s    `      @@@r   rC   rC     s   
 
 
  # # # # # # ## # # # # # #3 3 3 3 3   	A/a 	18A|,, a**FL9:: 	KNNNa%%0aa15$S))..3.... FNFL9:: 	1##A|44 a**FL9:: 	KNNNa%%0aa15$S))..3.... :+,, 	1''<88 a**FL9:: 	KNNNa%%0aa15$S))..3.... Oa/000a**FL9:: 	KNNNa%%0aa15$S))..3.......s    G6 21G6 %G6 $G6 6A/I%c                     t          j                                        |           }t          r/t                                          }t          |           t          /t          r/t                                          }t          |           t          /|rf|D ]}t          |d           t          j        |t                    \  }}|D ]1}t          d|z             t          |t          j                   0dS dS )a  Terminate and wait() any subprocess started by this test suite
    and any children currently running, ensuring that no processes stick
    around to hog resources.
    If recursive is True it also tries to terminate and wait()
    all grandchildren started by this process.
    	recursiveN)r\  r2  z0couldn't terminate process %r; attempting kill())rI  )r   r   childrenr  poprC   r  
wait_procsr    rh   rE  rF  )r_  r`  r  r  r>  r)  alives          r   rD   rD   r  s    ~((9(==H   $((**$   
  !!#  
  - 	, 	,Aad+++++$X~FFF5 	- 	-ACaGHHHaV^,,,,,- -	- 	-r   c                     t           st          d          d} t          j                    d         }|D ]"}|                                s|dk    r| |z  } " | st          d|z            d}d}|                     d          }t          |d                   }t          |          dk    rt          |d                   }t          |          dk    rt          |d                   }|||fS )	z"Return a tuple such as (2, 6, 36).z	not POSIX rs   rr   zcan't parse %rr      r   )	r   NotImplementedErrorr   unameisdigitr   r   r   len)r  rh  cminormicronumsmajors          r   rZ   rZ     s     /!+...
AHJJqME  99;; 	!s((FAA 3)E1222EE773<<DQLLE
4yyA~~DG
4yyA~~DG5%  r   c                  ,   t           st          d          t          j                    } t	          | d          r
| j        pd}nAt          j        d| d                   }|r"t          |	                    d                    nd}| d         | d         |fS )Nznot WINDOWSservice_pack_majorr   z\s\d$r   rf  )
r   rg  r   getwindowsversionhasattrrq  researchr   group)wvsprs      r   rY   rY     s     1!-000			 	 Br'(( )"'aIh1&& !(S___qqE2a5"r   c                   6    e Zd ZdZeddddfdZd Zd Zd ZdS )retryzA retry decorator.Nr   c                 r    |r|rt          d          || _        || _        || _        || _        || _        d S )Nz/timeout and retries args are mutually exclusive)r   	exceptionr3  retriesintervallogfun)r   r}  r3  r~  r  r  s         r   r   zretry.__init__  sK      	Pw 	PNOOO" r   c              #   
  K   | j         rQt          j                    | j         z   }t          j                    |k     rd V  t          j                    |k     d S d S | j        rt          | j                  D ]}d V  d S 	 d V  r   )r3  r   r~  r   )r   stop_atr)  s      r   __iter__zretry.__iter__  s      < 		ikkDL0G)++'' )++''''''\ 	4<((   r   c                 J    | j         t          j        | j                    d S d S r   )r  r   r   r   s    r   r   zretry.sleep  s*    =$Jt}%%%%% %$r   c                 X     t          j                   fd            } |_        |S )Nc                      d }D ]U}	  | i |c S # j         $ r<}|}j                            |                                            Y d }~Nd }~ww xY wt          r| r   )r}  r  r   r   )r   r   excr)  r   r   s       r   r   zretry.__call__.<locals>.wrapper  s    C  3//////~   C{.C(((JJLLLHHHH  	s   
A2AA)r   r   	decorator)r   r   r   s   `` r   __call__zretry.__call__  sF    				 	 	 	 	 
		$ !r   )	r   r   r   r   r   r   r  r   r   r   r   r{  r{    sl             
 
 
& & &    r   r{  r   )r}  r  r3  r  c                     | t          j                    vrt          j        |           t          j        |            dS )zWait for pid to show up in the process list then return.
    Used in the test suite to give time the sub process to initialize.
    N)r   pidsrB  r   r  s    r   r\   r\     s<     &+--"3'''
N3r   Tc                     t          | d          5 }|                                }ddd           n# 1 swxY w Y   |s|sJ |rt          |            |S )z8Wait for a file to be written on disk with some content.rbN)r-  readrU   )fnamer   r   r0  datas        r   r]   r]   
  s     
eT		 avvxx                EKs   266c                 "     |             }|sJ |S )z1Keep calling function until it evaluates to True.r  )r   rets     r   r[   r[     s     #%%CJJJJr   c                 D   d }	 t          j        |           }t          j        |j                  r t	          j        t          j        |           }nt	          j        t           j        |           }t          r |             dS  ||           dS # t          $ r Y dS w xY w)z?Convenience function for removing temporary test files or dirs.c                 \   t          j                     t          z   }t          j                     |k     ry	  |             S # t          $ r Y n7t          $ r+}|}t	          dt          |          z             Y d }~nd }~ww xY wt          j        d           t          j                     |k     y|)Nzignoring %sg{Gz?)r   r    r   WindowsErrorrh   r7  r   )r   r  r)  rQ  s       r   	retry_funzsafe_rmpath.<locals>.retry_fun0  s    
 )++.ikkG##1suu$    1 1 1]c#hh/000000001 Jt ikkG## 	s   	> 
A>
	A>!A99A>N)r   statS_ISDIRst_moder   partialshutilrmtreeremover   r   )r   r  str   s       r   rU   rU   -  s      "WT]]<
## 	5#FM488CC#BIt44C 	CEEEEEIcNNNNN   s   A=B B 
BBc                 R    	 t          j        |            dS # t          $ r Y dS w xY w)z.Convenience function for creating a directory.N)r   mkdirr   r   s    r   
safe_mkdirr  O  s:    
   s    
&&c              #      K   t          j                    }	 t          j        |            dV  t          j        |           dS # t          j        |           w xY w)z@Context manager which temporarily changes the current directory.N)r   r  rT   )dirnamecurdirs     r   rT   rT   W  s]       Y[[F

s   A Ac                 D   t           j                            |           r
J |             t          j        t
          |            t          j        t          |            t          r;t          j
        |           }t          j        | |j        t          j        z             | S )z6Create a Python executable file in the given location.)r   r   r   atexitregisterrU   r  copyfiler$   r   r  chmodr  S_IEXEC)r   r  s     r   rV   rV   b  s}    w~~d##))T)))
OK&&&
OJ%%% 2WT]]
rzDL0111Kr   c                 l   t           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 }|                    |           ddd           n# 1 swxY w Y   	 t!          j        d|j        d| g           t          |j                   n# t          |j                   w xY w| S )	z5Create a compiled C executable in the given location.gcczgcc is not installedNz
            #include <unistd.h>
            int main() {
                pause();
                return 1;
            }
            z.csuffixr,  z-o)r   r   r   r   pytestskipr  r  r6  r7  r  r  rU   r-  rX   r.  r   r   r   )r   c_coder0  s      r   rW   rW   m  s]   w~~d##))T)))<< 2k0111~ "   &#&&.....
OK&&&	j%%%s	+	+ q	              uafdD9:::AFAFKs   ;CC!$C!)D D1re  c                     	 t          j        t          | |          }t          j                            |          s;t          j                            |          }t          j        t          |           |S w)zReturn an absolute pathname of a file or dir that did not
    exist at the time this call is made. Also schedule it for safe
    deletion at interpreter exit. It's technically racy but probably
    not really due to the time variant.
    T)prefixr  r   )
tempfilemktempr(   r   r   r   r   r  r  rU   )r  r   r   r   s       r   rX   rX     sd    mFLLLw~~d## 	7##D))DOK...Kr   c                       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	dS )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                                        t                    }t          j        d                              |           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.rf  
stacklevel)	rI   
TestLoaderdiscoverHERETextTestRunnerr   warningsrh   UserWarning)r   kwsuites      r   mainzfake_pytest.main  sk    
 #%%..t44!,,,00777J	
 	
 	
 	

 r   Nc                 h     G d d          t           j        dfd	            } || |          S )zMimics `pytest.raises`.c                   (    e Zd ZdZed             ZdS ))fake_pytest.raises.<locals>.ExceptionInfoNc                     | j         S r   )_excr   s    r   valuez/fake_pytest.raises.<locals>.ExceptionInfo.value  s
    y r   )r   r   r   r  propertyr  r  r   r   ExceptionInfor    s2        D! ! X! ! !r   r  Nc              3   *  K                }	 |V  t          d| z            # | $ rh}|rTt          j        |t          |                    s2d                    |t          |                    }t          |          ||_        Y d }~d S d }~ww xY w)Nz%r not raisedz"{}" does not match "{}")AssertionErrorrt  ru  r7  formatr  )r  matcheinforQ  msgr  s        r   contextz#fake_pytest.raises.<locals>.context  s      !MOOE< %_s%:;;;  ! ! ! .5#c((!;!; .4;;E3s88LLC(--- 






	!s   % BABB)r  r   )
contextlibcontextmanager)r  r  r  r  s      @r   raiseszfake_pytest.raises  sp    	! 	! 	! 	! 	! 	! 	! 	! 
	"
	< 
	< 
	< 
	< 
	< 
#	"
	< ws%((((r   c                     |r't          j                                        | |          S t          j                                        |           S )zMimics `pytest.warns`.)rI   TestCaseassertWarnsRegexassertWarns)warningr  s     r   warnszfake_pytest.warns  sI      	H$&&77GGG ""..w777r   re  c                 *    t          j        |           )zMimics `unittest.SkipTest`.)rI   SkipTestreasons    r   r  zfake_pytest.skip  s     '''r   c                   @    e Zd Zedd            Z G d d          ZdS )fake_pytest.markre  c                 ,    t          j        | |          S )z'Mimics `@pytest.mark.skipif` decorator.)rI   skipIf)	conditionr  s     r   skipifzfake_pytest.mark.skipif  s     ?9f555r   c                        e Zd ZdZddZd ZdS )fake_pytest.mark.xdist_groupz4Mimics `@pytest.mark.xdist_group` decorator (no-op).Nc                     d S r   r  r   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F   # # # # #r   r  Nre  )r   r   r   staticmethodr  r  r  r   r   markr    sZ        		6 	6 	6 
	6	# 	# 	# 	# 	# 	# 	# 	# 	# 	#r   r  r   r  )
r   r   r   r   r  r  r  r  r  r  r  r   r   rS   rS     s            \ ) ) ) \)2 8 8 8 \8 ( ( ( \(# # # # # # # # # #r   rS   c                   <    e Zd Zesd Zej        d             ZdS dS )r  c                     d S r   r  r   s    r   runTestzTestCase.runTest  s    Dr   c              /      K   d V  d S r   r  )r   r   r  s      r   subTestzTestCase.subTest  s       EEEEEr   N)r   r   r   r   r  r  r  r  r  r   r   r  r    sT         	 	 	 
	"	 	 
#	"	 	 	 r   r  c                   J    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dS )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.
    re  Nc                 ^    t          ||          }|                     t          |           |S )N)r  r   )rX   
addCleanuprU   )r   r  r   r  s       r   rX   zPsutilTestCase.get_testfn  s-    &c222U+++r   c                 T    t          |i |}|                     t          |           |S r   )rE   r  rC   )r   r   r  r  s       r   rE   zPsutilTestCase.spawn_testproc  s-    ---	5)))r   c                     t                      \  }}|                     t          |           |                     t          |           ||fS r   )rG   r  rC   )r   child1child2s      r   rG   z"PsutilTestCase.spawn_children_pair  sD    ,..	6***	6***r   c                     t                      \  }}|                     t          |           |                     t          |           ||fS r   )rF   r  rC   )r   r'  r  s      r   rF   zPsutilTestCase.spawn_zombie  sB    %	6***	6***r   c                     t          |i |\  }}|                     t          |           |                     t          |           |S r   )rB   r  rU   rC   )r   r   r  r  r/  s        r   rB   zPsutilTestCase.pyrun  sE    ---wW---	5)))r   c                 b   t          |t          j                  sJ |j        |j        k    sJ |j        |j        k    sJ |j        r	|j        sJ t          |t          j                  r&|j        |j        k    sJ |j        |j        dk    sJ t          |           t          |           d S Nr   )r6  r   Errorr  r   _nameZombieProcessppid_ppidr7  repr)r   rC  r  s      r   _check_proc_exczPsutilTestCase._check_proc_exc  s    #v|,,,,,w$(""""x4:%%%%8 	8OOOc6/00 	%8tz))))x#x1}}}}CS					r   c                    t          j        t          j                  5 }	 t          j        |           n"# t          j        $ r t          d          w xY w	 d d d            n# 1 swxY w Y   |j        j        |k    sJ |j        j	        J t          j
        |          r
J |            |t          j                    vsJ |d t          j                    D             vsJ d S )Nz&wasn't supposed to raise ZombieProcessc                     g | ]	}|j         
S r  r  r   s     r   r   z0PsutilTestCase.assertPidGone.<locals>.<listcomp>5  s    @@@Q15@@@r   )r  r  r   rB  r   r  r  r  r  r   rY  r  process_iter)r   r  cms      r   assertPidGonezPsutilTestCase.assertPidGone+  sR   ]6/00 	OBOs####' O O O$%MNNNO $	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O
 x|s""""x}$$$$S))..3...&+--''''@@&*=*?*?@@@@@@@@@s%   A%6A%AA%%A),A)c                    |                      |j                   t          |          }|                    |j        d          D ]\  }}|                     ||          5  	  |            }d|d|}t          |          # t          j        $ r  t          j	        $ r }| 
                    ||           Y d }~nd }~ww xY w	 d d d            n# 1 swxY w Y   |                    d           d S )NTclear_cacherC  r   zProcess.z!() didn't raise NSP and returned r   r2  )r  r  rO   iterallr  r  r   r  rB  r  r   )r   rC  nsr   r   r  r  r  s           r   assertProcessGonez PsutilTestCase.assertProcessGone7  sm   48$$$t$$T:: 	. 	.IC4d33 . ..#%%CC C )--- +   + 4 4 4((s3333333343. . . . . . . . . . . . . . . 			!	s<   "C$
B.CC#B>9C>CCC	C	c                    t          j        |j                  }||k    sJ t          s)t          s"t          |          t          |          k    sJ |                                t           j        k    sJ |                                sJ t          j	        |j                  sJ |
                                 |j        t          j                    v sJ |j        d t          j                    D             v sJ i t           _        |j        d t          j                    D             v sJ t          |          }|                    |j        d          D ]~\  }}|                     ||          5  	  |             n># t           j        t           j        f$ r }|                     ||           Y d }~nd }~ww xY wd d d            n# 1 swxY w Y   t*          r/t-          j        t           j                  5 }|                                 d d d            n# 1 swxY w Y   |                     ||j                   t-          j        t           j                  5 }|                                 d d d            n# 1 swxY w Y   |                     ||j                   t-          j        t           j                  5 }|                                 d d d            n# 1 swxY w Y   |                     ||j                   |                                 |                                 |                                 |                                 |                                sJ t          j	        |j                  sJ |j        t          j                    v sJ |j        d t          j                    D             v sJ i t           _        |j        d t          j                    D             v sJ d S )Nc                     g | ]	}|j         
S r  r  r   s     r   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>[      AAAaAEAAAr   c                     g | ]	}|j         
S r  r  r   s     r   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>]  r  r   Tr  r  c                     g | ]	}|j         
S r  r  r   s     r   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>y  r  r   c                     g | ]	}|j         
S r  r  r   s     r   r   z6PsutilTestCase.assertProcessZombie.<locals>.<listcomp>{  r  r   ) r   r   r  r   r
   hashr  r  
is_runningrY  as_dictr  r
  _pmaprO   r  r  r  r  AccessDeniedr  r   r  r  cmdliner  r   r   suspendresumerC   kill)r   rC  cloner  r   r   r  r  s           r   assertProcessZombiez"PsutilTestCase.assertProcessZombieJ  s   tx(( u}}}} 	-6 	-::e,,,,{{}} 44444      *****x6;==((((xAA6+>+@+@AAAAAAAxAA6+>+@+@AAAAAAAt$$T:: 	4 	4IC4d33 4 44CEEEE,f.AB 4 4 4((s3333333344 4 4 4 4 4 4 4 4 4 4 4 4 4 4
  
	1v344                 rx000v344 


                rx000v344 #  """# # # # # # # # # # # # # # #  rx000		      *****x6;==((((xAA6+>+@+@AAAAAAAxAA6+>+@+@AAAAAAAAAsr   6G8
FGF>F94G9F>>GG	G	?H  H$'H$$JJ	J		K**K.1K.re  N)r   r   r   r   rX   rE   rG   rF   rB   r  r  r  r%  r  r   r   rN   rN     s         
   
  
              
A 
A 
A  &1B 1B 1B 1B 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dS )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           d S )NF)r   
_set_debugclss    r   
setUpClasszTestMemoryLeak.setUpClass  s    %     r   c                 8    t          j        | j                   d S r   )r   r+  _psutil_debug_origr,  s    r   tearDownClasszTestMemoryLeak.tearDownClass  s    #011111r   c                 `    | j                                         }t          |d|j                  S )Nuss)	_thisprocmemory_full_infor   rss)r   mems     r   _get_memzTestMemoryLeak._get_mem  s+     n--//sE37+++r   c                 t    t           r| j                                        S | j                                        S r   )r   r4  num_fdsnum_handlesr   s    r   _get_num_fdszTestMemoryLeak._get_num_fds  s2     	0>))+++>--///r   c                 P    | j         rt          |dt          j                   d S d S )Nyellow)colorfile)verboser   r   r   )r   r  s     r   _logzTestMemoryLeak._log  s3    < 	>8#*======	> 	>r   c                 <   |                                  }|                     |           |                                  }||z
  }|dk     r|                     d|z            |dk    r5t          rdnd}|dk    r|dz  }|d|d|}|                     |          d	S )
zMakes sure num_fds() (POSIX) or num_handles() (Windows) does
        not increase after calling a function.  Used to discover forgotten
        close(2) and CloseHandle syscalls.
        r   zHnegative diff %r (gc probably collected a resource from a previous test)fdhandlerf  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~!88))1378   !88!/DDxEaxx7;ttUUUCCHC))C..  8r   c                 *   t          j        d           |                                 }t          |          D ]}|                     |          }~~t          j        d           |                                 }t           j        g k    sJ ||z
  }|S )zGet 2 distinct memory samples, before and after having
        called fun repeatedly, and return the memory difference.
        rf  )
generation)gccollectr8  r   rF  garbage)r   r   timesmem1r   r  mem2rJ  s           r   _call_ntimeszTestMemoryLeak._call_ntimes  s     	
a    }}u 	 	A))C..C33

a    }}zRd{r   c           
         g }d}|}t          d|dz             D ]}|                     ||          }	d|dt          |	          dt          |	|z            d|}
|                    |
           |	|k    p|	|k    }|r|dk    r|                     |
            d S |dk    rt                       |                     |
           ||z  }|	}|                     d                    |                    )Nr   rf  zRun #z: extra-mem=z, per-call=z, calls=z. )r   rU  r   appendrB  printrG  r   )r   r   rR  r~  	tolerancemessagesprev_memincreaseidxr7  r  successs               r   
_check_memzTestMemoryLeak._check_mem  s   GaK(( 	 	C##C//CCC    C%K((((	C OOC   Y&9#/G 	77IIcNNN!88GGG		#!ii		(++,,,r   c                      |            S r   r  )r   r   s     r   rF  zTestMemoryLeak.call  s    suur   Nc                    ||n| j         }||n| j        }||n| j        }||n| j        }	 |dk    s
J d            |dk    s
J d            |dk    s
J d            |dk    s
J d            n.# t          $ r!}t          t          |                    d}~ww xY w|                     ||           |                     |           | 	                    ||||           dS )	zTest a callable.Nrf  ztimes must be >= 1r   zwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rR  r~  rY  )
rR  warmup_timesr~  rY  r  r   r7  rU  rL  r_  )r   r   rR  rb  r~  rY  rQ  s          r   executezTestMemoryLeak.execute  s$    *
(4LL$:K 	 %0''dl!*!6IIDN		'A:::3:::1$$$&A$$$a<<<!7<<<>>>#;>>>> 	' 	' 	'SXX&&&	' 	#|,,,5'YOOOOOs   A A/ /
B9BBc                 6      fd}  j         |fi | dS )znConvenience method to test a callable while making sure it
        raises an exception on every call.
        c                  4                                     d S r   )assertRaises)r  r   r   s   r   rF  z*TestMemoryLeak.execute_w_exc.<locals>.call+  s    c3'''''r   N)rc  )r   r  r   r   rF  s   ```  r   execute_w_exczTestMemoryLeak.execute_w_exc&  sJ    
	( 	( 	( 	( 	( 	( 	( 	T$$V$$$$$r   )NNNN)r   r   r   r   rR  rb  rY  r+   r~  rA  r   r   r4  boolr   getenvr0  classmethodr.  r1  r8  r<  rB  rL  rU  r_  rF  rc  rg  r  r   r   rM   rM     s8        > ELI%bbAGG  Iibi7788! ! [! 2 2 [2, , ,0 0 0> > >! ! !*  - - -8   KOP P P P,% % % % %r   rM   c                  >   dd l } dd l}dd l}dd l}dd l}	 dd l}n# t          $ r d }Y nw xY w	 dd l}n# t          $ r d }Y nw xY w|                                 }t          j
        r"t          d          rt          d          |d<   nt          j        r dt          j                    d         z  |d<   nt          j        rydd                    t%          t&          t          j                                        z   |d<   t+          t          d          r$|dxx         d	t          j                    z   z  cc<   n,t          j                    dt          j                    |d<   d	                    t3          t          j                              t          j                    gz             |d
<   t          j        rt          j                    d         |d<   d	                    t          j                    t          j                    t          j                     g          |d<   tC          |dd          |d<   ||dxx         d|j"        z  z  cc<   t          j        rqt          d          r=t          ddg          }t'          |          #                    d          d         |d<   nd|d<   t          j$                    d         }	|	r|	|d<   tK          j&                    |d<   |'                                }
|
d         d	|
d         |d<   |j        (                    t          j)                              *                    d          |d<   |j        +                                *                    d          |d<   |,                                |d<   tZ          j.        /                    d          |d<   t[          j0                    |d<   tb          |d <   t          j2                    |d!<   t[          j3                    |d"<   t          j4                    |d#<   d$tk          d% t          j6                    D                       z  |d&<   t          j7                    }tq          |j9                  d'tu          |j;                  d(tu          |j<                  |d)<   t          j=                    }tq          |j9                  d'tu          |j;                  d(tu          |j<                  |d*<   t}          t          j?                              |d+<   t          j@                    A                                }|B                    d,d            |C                    |          |d-<   t          d.tJ          jE        /           |F                                D ])\  }}t          |d0z   d1d|tJ          jE        /           *t          d.tJ          jE        /           tJ          jG        H                                 tJ          jG        H                                 d S )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	--versionr4  rf  glibczfs-encodinglangz%Y-%m-%d %H:%M:%Sz	boot-timer   user~homer   pyexehostnamePIDcpusz%.1f%%, %.1f%%, %.1f%%c                 @    g | ]}|t          j                    z  d z  S )d   )r   	cpu_countr   s     r   r   z!print_sysinfo.<locals>.<listcomp>{  s+    IIIq6#%%%+IIIr   loadavgz%, used=z, total=memoryswapr  r   rC  zF======================================================================r@  :17)Icollectionsdatetimegetpasslocalepprintrt  ImportErrorwheelOrderedDictr   r   r   r?  OSXr{   r|   r   r   r~   r7  	win32_verrs  ro  systemr   listarchitecturemachiner   rh  python_implementationpython_versionpython_compilerr   rs  r   libc_verr   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserr  r$   nodegetpidr  r}   r   virtual_memoryr   percentr   usedtotalswap_memoryrj  r  r   r  ra  pformatrX  r   itemsr   flush)r  r  r  r  r  rt  r  infooutr  rv  r7  r  pinfokvs                   r   rQ   rQ   1  s   OOONNNMMMMMM



       ""$$D | 	Gm,, 	G+,,T

	 G 8#3#5#5a#88T

	 G#((3sH4F4H4H+I+I"J"JJT
8_-- 	:JJJ$!7!9!999JJJ ( 1 1 1 183C3E3E3EFT
99X"$$%%)9););(<< DL | -!))!,X YY&((!! ""   DN
 #}o>>DKU}u'888 | << 	*e[)**Cc((....q1DKK)DK" 	DM 355DD#AwwwQ0DL )77 h"## 	 $((**334GHHDL??$$DL7%%c**DL)++DKDM}D)++DK #%%DL.IIV5F5H5HIIIJJDO 

!
!CCKCHCIDN
 DDLDIDJDL
 v{}}%%DLN$$&&E	IImT""">>%((DL	($$$$

 : :1AGGGGQQ'cj99999	($$$$J Js    **3 AAc                 n    t           d             }	  |            |          dk    S # t          $ r Y dS w xY w)Nc                      i } t          d          }|                                dd          D ]C}d |                    d          D             }|d         t          |d                   }}|| |<   D| S )Nztasklist.exe /NH /FO csvrf  c                 :    g | ]}|                     d d          S )"re  )replacer   s     r   r   z@is_win_secure_system_proc.<locals>.get_procs.<locals>.<listcomp>  s&    @@@1AIIc2&&@@@r   ,r   )r?  
splitlinesr   r   )r  r  linebitsr   r  s         r   	get_procsz,is_win_secure_system_proc.<locals>.get_procs  s{    +,,NN$$QRR( 	 	D@@

3@@@DQT!W#DCHH
r   zSecure SystemF)r   KeyError)r  r  s     r   rR   rR     sX      Wy{{3?22   uus   & 
44c                      t          j                    } t          | d          r|                                 S t          | d          r&t	          j        |                                           S dS )Nr   r   r   )r   r   rs  r   randomchoicer   )r>  s    r   _get_eligible_cpur    s`    Aq) /yy{{	N	#	# /}Q^^--...1r   c                      e Zd ZdZddi fddi fgZddi fddddifd	di fd
di fddi fddi fddi fddi fddi f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j        fi fd6di fd7di fd8di fd9di fgZered5ej        fi fgz  Zed5ej        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#d?S )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  r`  r_  Tconnectionsr  memory_info_exoneshotr'  parentsr  r   r   r   	cpu_timescreate_timer   r   r5  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   rG  r!  r"  rC   r#  c                     || _         d S r   )_proc)r   rC  s     r   r   zprocess_namespace.__init__  s    


r   c              #      K   t          |          }t          j        |           |D ]L\  }}}|r|                                  t	          | j        |          }t          j        |g|R i |}||fV  MdS z_Given a list of tuples yields a set of (fun, fun_name) tuples
        in random order.
        N)r  r  shuffler  r   r  r   r  )r   lsr  fun_namer   r  r   s          r   r  zprocess_namespace.iter  s       "XXr$& 	" 	" HdD #  """$*h//C#C7$777$77C/!!!!	" 	"r   c                 R    | j                             | j         j        d           dS )z&Clear the cache of a Process instance.T)_ignore_nspN)r  _initr  r   s    r   r  zprocess_namespace.clear_cache&  s'    
T:::::r   c                     |D ]<\  }}}d|z   }t          ||          s!|j        j        d|d}t          |          =dS )z}Given a TestCase instance and a list of tuples checks that
        the class defines the required test method names.
        test_z class should define a 'z' methodN)rs  r   r   AttributeError)r-  
test_classr  r  r)  	meth_namer  s          r   test_class_coveragez%process_namespace.test_class_coverage*  sq    
 ! 	* 	*NHa(*I:y11 *(111II %S)))*	* 	*r   c                    t          d | j        D                       }t          d | j        D                       }t          d t          t          j                  D                       }||z  |z  }|rt          d|z            d S )Nc                     g | ]
}|d          S r  r  r   s     r   r   z*process_namespace.test.<locals>.<listcomp>:  s    ***QAaD***r   c                     g | ]
}|d          S r  r  r   s     r   r   z*process_namespace.test.<locals>.<listcomp>;  s    111qt111r   c                 *    g | ]}|d          dk    |S )r   r)  r  r   s     r   r   z*process_namespace.test.<locals>.<listcomp><  s!    CCC1qts{{Q{{{r   z!uncovered Process class names: %r)r   r  ignoredr   r   r   r   )r-  thisr  klassleftouts        r   testzprocess_namespace.test8  s    **#'***++11S[11122CCFN 3 3CCCDD'>U* 	L@7JKKK	L 	Lr   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  rE  SIGTERMkillersCTRL_C_EVENTCTRL_BREAK_EVENTr  r   r  r  rj  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6;<< .^R,-- )YB'(( )YB'(( -]B+,, =]BE(:;<<G CVT2&''Vf:<bABB JX 4lCRHII A 	AF$<a#@"EFFGGF$8#:B?@@G D^'8'8':':&;%=rBCC 
)2.	B	2r	b"	RG  E]V%8$:B?@@]V%<$>CDD
'/G
#g
-C  " " " "; ; ; * * [* L L [L L Lr   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j        Zd)S )*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   pernicrY  r  r  usersr  arm64r   r   r   r   r   win_service_iterwin_service_get)algr
  rb  r  cpu_times_percentc              #      K   t          |           } t          j        |            | D ]6\  }}}t          t          |          }t          j        |g|R i |}||fV  7dS r  )r  r  r  r   r   r   r  )r  r  r   r  r   s        r   r  zsystem_namespace.itery  s      
 "XXr$& 	" 	" HdD&(++C#C7$777$77C/!!!!	" 	"r   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  se         
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2R(D)9:;;G ,\2r*++ 6+R455 .^R,-- 1&B/00 7'R011&"566 
R 	))*,b1	B	b"%	G C	" 	" \	" ,?r   rP   c                 8    d }t          t          d| |          S )zZDecorator which runs a test function and retries N times before
    actually failing.
    c                 B    t          d| z  t          j                   d S )Nz%r, retryingr  )rX  r   r   )r  s    r   r  z retry_on_failure.<locals>.logfun  s"    ns"444444r   N)r}  r3  r~  r  )r{  r  )r~  r  s     r   rL   rL     s3    
5 5 5  $   r   c                       fd}|S )z,Decorator to Ignore AccessDenied exceptions.c                 J     t          j                    fd            }|S )Nc                  n    	  | 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  s]    9sD+F+++& 9 9 9&" k"7888	9s    )4r   r   r   r  s   ` r   r  z(skip_on_access_denied.<locals>.decorator  s>    				9 	9 	9 	9 	9 
		9 r   r  r  r  s   ` r   rJ   rJ     s$         r   c                       fd}|S )z3Decorator to Ignore NotImplementedError exceptions.c                 J     t          j                    fd            }|S )Nc                  x    	  | i |S # t           $ r$ s dj        z  }t          j        |          w xY w)Nz4%r was skipped because it raised NotImplementedError)rg  r   r  r  )r   r   r  r   r  s      r   r   z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapper  sm    
'sD+F+++& ' ' '&" Jl#  k#&&&'s    .9r   r  s   ` r   r  z*skip_on_not_implemented.<locals>.decorator  s>    				' 	' 	' 	' 	' 
		' r   r  r  s   ` r   rK   rK     s$        " r   	127.0.0.1c                     t          j        t          j                              5 }|                    | df           |                                d         cddd           S # 1 swxY w Y   dS )z6Return an unused TCP port. Subject to race conditions.r   rf  N)r  closingsocketbindgetsockname)hostr&  s     r   r`   r`     s    		FMOO	,	, %		4)!!!$% % % % % % % % % % % % % % % % % %s   1A$$A(+A(c                    || t           t          fv rd}t          j        | |          }	 t          j        dvr+|                    t          j        t          j        d           |                    |           |t          j	        k    r|
                    d           |S # t          $ r |                                  w xY w)zBinds a generic socket.Nre  r   )ntcygwinrf  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5=&&D	7***OOF-v/BAFFF		$6%%%KKNNN   

s   A4B    C c                 p   t           j        sJ t          j                            |           r
J |             t          j        t
          j        |          }	 |                    |            |t
          j        k    r|	                    d           n## t          $ r |                                  w xY w|S )zBind a UNIX socket.r   )r   r   r   r   r   r  r   r  r   r%  r   r#  )r   r'  r&  s      r   rb   rb     s    <w~~d##))T)))=..D		$6%%%KKNNN   

 Ks   :B  B3r  c                 F   t          j        t          j        | t                              5 }|                    |           |                    d           |                                }t          j        | t                    }	 |                    |           |                                }	 |                                \  }}||k    r||fcddd           S |	                                 B# t          $ r |	                                  w xY w# 1 swxY w Y   dS )z^Build a pair of TCP sockets connected to each other.
    Return a (server, client) tuple.
    r   TN)r  r  r  r   r  r%  r  connectr  r#  rM  )r&  r(  llrk  caddras         r   rc   rc     sH    
	FM&+>>	?	? 2

		!~~M&+..	IIdOOOMMOOE))++45==q6        			  	 	 	GGIII	         s+   ADA
C3C33 DDDDc                    t           j        sJ dx}}	 t          | t          j                  }|                    d           t          j        t          j        t          j                  }|                    d           |                    |            n;# t          $ r. ||	                                 ||	                                  w xY w||fS )zBuild a pair of UNIX sockets connected to each other through
    the same UNIX file name.
    Return a (server, client) tuple.
    Nr'  r   )
r   r   rb   r  r   setblockingr   r+  r   r#  )r   serverclients      r   rd   rd     s    
 <FV!$V-?@@@1v~v/ABB1t   LLNNNLLNNN Fs   BB 8Cc               #     K   g } dx}}	 |                      t          t          j        t          j                             |                      t          t          j        t          j                             t                      rn|                      t          t          j        t          j                             |                      t          t          j        t          j                             t          rmt          rft                      }t                      }t          |          \  }}t          |t          j                  }|||fD ]}|                      |           | V  | D ]}|                                 ||fD ]}|t          |           dS # | D ]}|                                 ||fD ]}|t          |           w xY w)z1Open as many socket families / types as possible.Nr0  )rW  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     s      EFV#[1CDDEEE[1BCCDDD?? 	JLLV_f6HIIJJJLLV_f6GHHIII 	 - 	 \\F\\F$V,,FB!&v/@AAAB"b\    Q 	 	AGGIIIIf% 	# 	#E E"""	# 	#  	 	AGGIIIIf% 	# 	#E E"""	#s   E"F 3Gc                    ddl }t          r2t          r+t          s$t	          |t          j                  s
J |            |t          j        k    rd |                     d          D             }t          |          dk    s
J |             |D ]}d|cxk    rdk    sn J |             t          st          |           } |                    |            dS |t          j        k    rLt	          | t                    s
J |             t          st          |           } |                    |            dS |t          j        k    r!t#          j        d|           
J |             dS t'          d|z            )	z[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    r   Nc                 ,    g | ]}t          |          S r  )r   r   s     r   r   z%check_net_address.<locals>.<listcomp>>  s    0001A000r   rr   r      z([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r)	ipaddressenumr   r#   r6  IntEnumr  r   r   rj  r   IPv4Addressr   r7  IPv6Addressr   AF_LINKrt  r  r   )r(  r&  r?  octsnums        r   r^   r^   5  s     8 8D 8&$,//7777700

30004yyA~~~t~~~ 	) 	)C????s?????D???? 	!4==Dd#####	6?	"	"$$$**d*** 	!4==Dd#####	6>	!	!x5t<<HH$HHHHH,v5666r   c                     d }d }d }d }d } ||             ||             ||             ||             ||            dS )z*Check validity of a connection namedtuple.c                 D   t          |           dk    }t          |           dv sJ t          |                       | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    | d         | j        k    sJ | j                    |r | d	         | j        k    sJ | j                    d S d S )
Nr   )rL  r   r   rf  rs   r   r   r   rL  )rj  rD  r&  r'  laddrraddrr  r  )r(  has_pids     r   check_ntuplez-check_connection_ntuple.<locals>.check_ntupleS  s5   d))q.4yyF"""CII"""Aw$'!!!47!!!Aw$+%%%t{%%%Aw$)###TY###Aw$*$$$dj$$$Aw$*$$$dj$$$Aw$+%%%t{%%% 	17dh&&&&&&	1 	1&&r   c                    | j         t          t          t          fv sJ | j                     t          *t          | j         t          j                  s
J |             n$t          | j         t                    s
J |             | j         t          k    rt          j        | j         | j	                  }t          j        |          5  	 |                    | j        d         df           n2# t          j        $ r }|j        t          j        k    r Y d }~nd }~ww xY wd d d            d S # 1 swxY w Y   d S | j         t          k    r$| j        t$          j        k    sJ | j                    d S d S r   )r&  r   r   r   r@  r6  rA  r   r  r'  r  r  r  rI  errorrO  EADDRNOTAVAILr  r   	CONN_NONE)r(  r  rQ  s      r   check_familyz-check_connection_ntuple.<locals>.check_family_  s   {w'::::DK:::dk4<88>>$>>>>dk3//55555;'!!
 dk4955A#A&&  FFDJqM1-....|   yE$777 87777                  [G##;&"2222DK222 $#22s<   D'"C('D'(D7DD'DD''D+.D+c                    t          t          dt                                }| j        t          j        t          j        |fv sJ | j                    t          *t          | j        t          j                  s
J |             n$t          | j        t                    s
J |             | j        t          j        k    r$| j
        t          j        k    sJ | j
                    d S d S )NSOCK_SEQPACKET)r   r  objectr'  r   r5  r@  r6  rA  r   r  r   rP  )r(  rS  s     r   
check_typez+check_connection_ntuple.<locals>.check_typet  s     )9688DDy
 
 
 
 9	
 
 

 di66<<<<<<di--33t3339)));&"2222DK222 *)22r   c                    | j         | j        fD ]}| j        t          t          fv rt          |t                    sJ t          |                      |sFt          |j        t                    sJ t          |j                              d|j        cxk    rdk    sn J |j                    t          |j        | j                   | j        t          k    r,t          |t                    sJ t          |                      d S )Nr   i  )rI  rJ  r&  r   r   r6  r}   r'  portr   r^   ipr   r7  )r(  r(  s     r   check_addrsz,check_connection_ntuple.<locals>.check_addrs  s   Z, 		9 		9D{w111!$..::T

::: !$)S11BB4	??BBBDI.........	...!$'4;7777''!$,,88d4jj888		9 		9r   c                    t          | j        t                    sJ | j                    d t          t                    D             }| j        |v sJ | j                    | j        t          t          fv r6| j        t          k    r&| j        t          j
        k    sJ | j                    d S | j        t          j
        k    sJ | j                    d S )Nc                 b    g | ],}|                     d           t          t          |          -S )CONN_r   r   s     r   r   zAcheck_connection_ntuple.<locals>.check_status.<locals>.<listcomp>  sC     
 
 
#$q||G7L7L
FA
 
 
r   )r6  r  r7  r   r   r&  r   r   r'  r   rP  )r(  validss     r   check_statusz-check_connection_ntuple.<locals>.check_status  s    $+s++88T[888
 
(+F
 
 
 {f$$$dk$$$;7H---$){2J2J;&"2222DK22222;&"2222DK22222r   Nr  )r(  rL  rQ  rU  rY  r^  s         r   check_connection_ntupler_  P  s    
1 
1 
1@ @ @*@ @ @9 9 9	@ 	@ 	@ LLJtKLr   c                     g }| D ]c}t           rE|j        t          j        k    r0t          r)d|j        v r t          dt          |          z             N|                    |           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	   rJ  r   r7  rW  )consnewr(  s      r   r_   r_     sx     C   	T[FN22 dj00mc$ii/000

4Jr   c                     	 ddl }t          |d          st          	 |                    |           S # t          $ r ddl}|                    |           cY S w xY w)z,Backport of importlib.reload of Python 3.3+.r   Nreload)	importlibrs  r  rd  imp)modulere  rf  s      r   rf   rf     s    
(y(++ 		 '''  " " "


zz&!!!!!"s   3 #AAc                    t           j                            t           j                            |                     d         }t          j        d         dk     rdd l}|                    ||           S dd l}|j	        
                    ||           }|j	                            |          }|j                            |           |S )Nr   r   )r   r   splitextr  r   r   rf  load_sourceimportlib.utilutilspec_from_file_locationmodule_from_specloaderexec_module)r   r   rf  re  specmods         r   rg   rg     s    7BG,,T2233A6D
Q


tT***~55dDAAn--d33$$$
r   c                 >    t          j        | t          d           dS )zRaise a warning msg.rs   r  N)r  rh   r  )r  s    r   rh   rh     s    M#{q111111r   c                     t          |           }|j        }t          |          dk    s|d         t          urdS t	          |dd          }t          |t                    sdS t          d |D                       S )z-Check if object is an instance of namedtuple.rf  r   F_fieldsNc              3   @   K   | ]}t          |t                    V  d S r   )r6  r7  )r   ns     r   	<genexpr>z is_namedtuple.<locals>.<genexpr>  s,      --az!S!!------r   )r'  	__bases__rj  r}   r   r6  r  )r   tbr0  s       r   rj   rj     s{    QA	A
1vv{{ad%''u9d##Aa u--1------r   c              #   |  K   t           rdnddt          | z             }fdt          j                                                    D             }t          j        |          }t          j        ||           	 t          j
        |           |V  t          |           dS # t          |           w xY w)zCtx manager which picks up a random shared CO lib used
        by this process, copies it in another location and loads it
        in memory via ctypes. Return the new absolutized path.
        pypyrr  z.sor  c                     g | ]R}t           j                            |j                  d          k    0|j                                        v K|j        SS )rf  )r   r   ri  lower)r   r   r   exts     r   r   z'copyload_shared_lib.<locals>.<listcomp>  s[     
 
 
w''*c11cQV\\^^6K6K F6K6K6Kr   N)r#   rX   r   r   r   r  r  r  r  ctypesCDLLrU   )r  dstlibsr%  r   r  s       @@r   ri   ri     s       *ff(---
 
 
 
 
^%%1133
 
 

 mD!!S!!!	KIIIKs   B* *B;c              #     	K   ddl m} ddl m} d	t          | 	z             }	fdt	          j                                                    D             }t          r1|s/d t	          j                                                    D             }t          j	        |          }t          j        ||           d}	 t          j        |          }|V  |Ct           j        j        j        }|j        g|_         ||j                  }|dk    r
 |             t'          |           dS # |Ct           j        j        j        }|j        g|_         ||j                  }|dk    r
 |             t'          |           w xY w)	zCtx manager which picks up a random shared DLL lib used
        by this process, copies it in another location and loads it
        in memory via ctypes.
        Return the new absolutized, normcased path.
        r   )WinError)wintypesz.dllr  c                    g | ]}|j                                                                       rZd t          j                             |j                                                   v r"d|j                                         v|j         S )rr  wow64)r   r  r<  r   r  )r   r   r  s     r   r   z'copyload_shared_lib.<locals>.<listcomp>  s     
 
 
v||~~&&s++
 BG,,QV44::<<<<qv||~~--	 F .--r   c                     g | ]A}d t           j                            |j                                                  v :|j        BS )r}  )r   r   r  r  r   s     r   r   z'copyload_shared_lib.<locals>.<listcomp>  sM       RW--af55;;==== ===r   N)r  r  r  rX   r   r   r   r#   r  r  r  r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerU   )
r  r  r  r  r  r%  cfiler  r  r  s
            @r   ri   ri     s      	$###########---
 
 
 
^%%1133
 
 
  	 	 ))5577  D
 mD!!S!!!	M#&&EIII  $m4@(0(8'9$!k%-00!88HJJJ  $m4@(0(8'9$!k%-00!88HJJJs   :D( (AE>c                  &    t          d           d S )NTr^  )rD   r  r   r   cleanup_test_procsr  7  s    D!!!!!!r   c                 *    t          j        |           S r   )r   exit)rI  r)  s     r   r  r  A  s    # r   r   )F)TFr&  )r  )r  r  )r   
__future__r   r  r  r  rO  r   rO  r   r{   r  rt  r   r8  r  rE  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-  r0  r  r@   maxsizer.   r  r?   r   r<   r=   r"   r!   r-   r    r   r  r(   r)   decoder*   r  r  ASCII_FSr   r   r   r  __file__r&   getr'   r  rs  r   r/   r0   r1   r  r3   r4   r;   HAS_NET_IO_COUNTERSr5   r2   r6   r7   rh  r   r8   r   r9   r:   HAS_THREADSgetuidSKIP_SYSCONSr   r$   r%   devnullr   r  r#  r   r,   r   rT  r   r   r  r  r   rH   r   rE   rG   rF   rB   r?  r  rC   rD   rZ   rY   r{  rB  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^   r_  r_   rf   rg   rh   rj   ri   r  r  r   r   <module>r     s     % % % % % %            				 				   				           



                           MMMM   FFF                                                  & & & & & &             " " " " " " & & & & & & ( ( ( ( ( (       * * * * * * , , , , , ,                         " " " " " "               	 	 	"	"  h'''              
  KKKK    D )((((((# # #Z S--#!RZ/O>RZ3O'
RZ''2:5 ^ 		 	  -A AFFHH,	- - - - - - - - - - - - - - - I;
(


	
) 	  	( 	  =??X-L =??g-LLLL 
# '  !OJaNA
 7f!IBIKK/MM!IBIKK/M ))009JKK($3$&&,,..2GG 7GLL**D$77  jnn"',,x;;  
w1122 76>>:: wvz**gfni00..WV^X..
'&.-88 .Y gf&788 76>955 wv~}== WV^X..
gf&788 %H$$/Ev/E/G/G*H*HKK   KKK76>22 "76+ABB gfni002)")++"2
' ' 'T )[]] 
N
$rz4
 
       #F    '&)VVXX
.
. ( ( ( ( (! ( ( (`	 	 	 & & & &R # # #L* * *Z   &   6  &~N S/ S/ S/ S/l- - - -J! ! !0	 	 	"8 8 8 8 8 8 8 8v "	      .1	      	      D          4   &J# J# J# J# J# J# J# J#Z 
>F
 
 
 
 
x  
 
 
  B B B B BX B B B` D!566a% a% a% a% a%^ a% a% 76a%Hi i iX  $  GL GL GL GL GL GL GL GLTC@ C@ C@ C@ C@ C@ C@ C@L ( 
 
 
 
   &   :% % % % [t    " !' 2       .  . # # #47 7 76O O Od  &( ( (  (2 2 2
	. 	. 	. 	 E    . * * * *f " " " 	 @FM&.">">?????@ @sl   <B B
BD E&E;EE	EE	EE:GG!$G!$P? ?Q	Q	