
    ɧd                     N   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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(m-Z- ddl(m.Z. ddl(m/Z/ ddl(m0Z0 e)rddl1Z1nddl2Z1	 ddl1m3Z3 nF# e4$ r>  ej5                    5   ej6        d           ddl3Z3ddd           n# 1 swxY w Y   Y nw xY wej7        dk    rddl8Z8ndZ8e!rddl9m:Z: g dZ;dej<        v Z=de
j>        v Z?d e
j>        v pd!e
j>        v Z@e?pe@ZAejB        d"k    ZCd#ZDd$ZEd%ZFd&ZGeAreDd'z  ZDeGd'z  ZGeEd'z  ZEeFd'z  ZFe
jH        d(k    rd) e
jI                    z  ZJnd* e
jI                    z  ZJ e.d+          ZKe)rd,L                    d-d.          ZMnd/ZM ejN                    O                                d0v ZPe
jQ        R                    e
jQ        S                    e
jQ        T                    eU          d1d1                    ZVe
jQ        S                    eVd2          ZWe
jQ        R                    e
jQ        T                    eU                    ZXe!oe" ZY eZej[        d3          Z\ eZed4          Z] eZed5          Z^ eZej[        d6          Z_ eZej[        d7          Z` eZej[        d8          Za eZed9          Zb eZej[        d:          Zc eZej[        d;          Zd eZej[        d<          Ze eZed=          Zf	 efo eg ejh                              Zin# ej$ r d>ZiY nw xY w eZed?          Zk eZed@          Zl eZej[        dA          Zme seo e
jn                    dk    ZodB Zp ep            Zq ere
js        dC          Zt eju        etjv                   dD  ewe          D             Zx eyedE ez                      Z{ e|            Z} e|            Z~ G dF dGej                  ZdH ZeddI            ZedJ             ZdK ZedL             ZedM             Zej        eGfdNZddOZdP ZdQ Z G dR dSez          Z eej        deGdTU          dV             Z ee+efdeGdTU          ddX            Z eedeGdTU          dY             ZdZ Zd[ Zej        d\             Zdd]Zdd_Z G d` dae1j                  Zee1_         G db dce          Z e1j        e=dd           G de dfe                      Zdg Zdh Z G di dj          Z G dk dl          Zdm ZeDfdnZddoZddpZddrZeedfdsZej        fdtZddvZdw Zej        dx             Zdy Zdz Zd{ Zd| Zd} Zd~ Ze!rej        dd            Znej        dd            Zeju        d             Ze!r ej        ej        d            dS dS )z
Test utilities.
    )print_functionN)AF_INET)AF_INET6)SOCK_STREAM)AIX)FREEBSD)LINUX)MACOS)POSIX)SUNOS)WINDOWS)bytes2human)print_color)supports_ipv6)PY3)FileExistsError)FileNotFoundError)range)super)u)unicode)which)mockignore      )wait_pid)EAPPVEYORDEVNULLGLOBAL_TIMEOUTTOLERANCE_SYS_MEM
NO_RETRIESPYPY
PYTHON_EXE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_MEMORY_FULL_INFOpyrun	terminatereap_childrenspawn_testprocspawn_zombiespawn_children_pairThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespaceprint_sysinfoinstall_pipinstall_test_depschdirsafe_rmpath
create_exedecode_pathencode_path
get_testfn
get_winverkernel_version
call_untilwait_for_pidwait_for_filecheck_net_address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CIBUILDWHEELl        
   i  P i      r   javaz$psutil-%s-z@psutil-%s-u   -ƒőős   futf8surrogateescapeu   fÀ)asciizus-asciiz..scriptscpu_affinitycpu_freq
getloadavgenvironionicememory_mapsnet_io_counterscpu_numio_countersrlimitsensors_batteryFsensors_fanssensors_temperaturesthreadsc                     d } t           rkt          r%t          rt          d          nt          d          S t          r)t
          j                            t          j	                  S t          d          S t          r | t          j	                  p | t
          j                            t          j	                            pZ | t          dt          j        d d         z                      p- | t          j                                                              }|st          d          |S t
          j                            t          j	                  }t
          j                            |          s
J |            |S )Nc                     	 t          j        | dgt           j        t           j                   | S # t          $ r Y d S w xY w)Nz-V)stdoutstderr)
subprocess
check_callPIPE	Exception)exes    5lib/python3.11/site-packages/psutil/tests/__init__.pyattemptz_get_py_exe.<locals>.attempt   s_    	!dJOJOM M M M
 J  	 	 	44	s   -1 
??pypy3pypypythonzpython%s.%s   z"can't find python exe real abspath)re   r$   r   r   r   ospathrealpathsys
executabler
   version_infopsutilProcessr   
ValueErrorexists)r   r   s     r   _get_py_exer      sZ        	#%(;5>>>eFmm; 	#7##CN333??"	 GCN## ,GBG$$S^4455,GE-#*:2A2*>>??@@, GFN$$((**++	 	
  	CABBB
gs~..w~~c""''C'''
    zr+c                 b    g | ],}|                     d           t          t          |          -S )STATUS_
startswithgetattrr   .0xs     r   
<listcomp>r      sB     3 3 3a,,y113wvq)) 3 3 3r   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 )	
ThreadTaskz6A 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__   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__
  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.start  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.run  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.stop  s3    } 	0.///		r   )r   
__module____qualname____doc__r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s        @@' ' ' ' 'J J J      ' ' '      r   r   c                 F     t          j                    fd            }|S )Nc                  P    	  | i |S # t           $ r t                        w xY wr   )r   r>   )r   r   funs     r   wrapperz&_reap_children_on_err.<locals>.wrapper*  sD    	3'''' 	 	 	OOO	s    %	functoolswraps)r   r   s   ` r   _reap_children_on_errr   )  s8    _S     Nr   c                    |                     dt                     |                     dt                     |                     dt          j                               |                     dt          j                   t
          rd}|                     d|           | t                      }	 t          |           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}  Creates a python subprocess which does nothing for 60 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 attemps to make sure the process is in a reasonably
    initialized state.
    The process is registered for cleanup on reap_children().
    stdinr~   cwdenv   creationflagsNz:from time import sleep;open(r'%s', 'w').close();sleep(60);z-cTdeleteempty)
setdefaultr    r   getcwdrq   r   rR   rN   r%   r   Popen_subprocesses_startedaddrW   rV   pid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs         r   r?   r?   4  si    	OOGW%%%OOHg&&&OOE29;;'''OOE2:&&& ; %)9:::
  
	 "$*+F 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().
    Ndirzl            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   )rR   r   r   textwrapdedentr   basenamer%   r   r<   r   r   r   intrW   _pids_startedr   rN   )tfiler   ssubpchildgrandchild_pid
grandchilds          r   rA   rA   \  sD    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                  z   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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                  ,                                      S r   )status)zombies   r   <lambda>zspawn_zombie.<locals>.<lambda>  s    v}} r   zret == psutil.STATUS_ZOMBIE)r   r   rR   r   r   r[   
settimeoutr!   r<   acceptselectfilenor   recvr   r   r   rU   closerN   )		unix_filesrcr   sockparentconn_zpidr   s	           @r   r@   r@     s   
 <I
/    C  EI&&D'''c

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

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

I 		s&   AF BE*  F *F  F 7F: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   wt)r   rR   openwriter?   r%   r   rV   r   r   rN   )r  r   srcfilefr   s        r   r<   r<     s    	OOHd###OOHd###llG'4   	AGGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	z162;;d;;TXg   Gs/   B* A."B* .A22B* 5A263B* *Cc                    t          | t          t          f          rdnd}t          r|rdnd}|                    d|           |                    dt
          j                   |                    dt
          j                   |                    dd           |                    d	|           t          j        | fi |}t          	                    |           t          r|                    t          
          \  }}n|                                \  }}|j        dk    rt          |          |rt          |           |                    d          r
|dd         }|S )zUrun cmd in a subprocess and return its output.
    raises RuntimeError on error.
    TFr   r   shellr~   r   universal_newlinesr   timeout
N)
isinstancestrr   r   r   r   r   r   r   r   r   communicater!   
returncodeRuntimeErrorra   endswith)r   r   r  flagspr~   r   s          r   shr    sP   
 sS'N33>DDE 1U1IIEOOGU###OOHjo...OOHjo...OO($///OOOU+++%%%%Aa   
 )~>>|q #6""" 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   )
r  r   r   r   r   r   r   r   r   NoSuchProcess)procr  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
   re   signalSIGKILLr   send_signalSIGCONT)r!  sigs     r   sendsigzterminate.<locals>.sendsig  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)r!  r  errr(  r'  r   s      r   term_subproczterminate.<locals>.term_subproc   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   r   )r!  r  r(  r'  r   s     r   term_psproczterminate.<locals>.term_psproc
  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   r   r   r   )r   r  r!  r2  s      r   term_pidzterminate.<locals>.term_pid  sx    	.>#&&D ;tW--- # 	. 	. 	. .W-----. . .	.s   # &AAc                     | j         r| j                                          | j        r| j                                         | j        r| j                                         d S d S r   )r~   r   r   r   )r!  s    r   flush_popenzterminate.<locals>.flush_popen  sl    ; 	 K; 	 K: 	J	 	r   zwrong type %r)	r  r   r   r   r   r   
pid_existsr   	TypeError)proc_or_pidr'  wait_timeoutr0  r4  r6  r  r   r(  r2  r   s    `      @@@r   r=   r=     s   
 
 
  # # # # # # ## # # # # # #. . . . .   	A/a 	18A|,, a**FL9:: 	KNNNa%%0aa15$S))..3.... FNFL9:: 	1;q,// a**FL9:: 	KNNNa%%0aa15$S))..3.... :+,, 	1<<00 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 resursive is True it also tries to terminate and wait()
    all grandchildren started by this process.
    	recursiveN)r:  r  z0couldn't terminate process %r; attempting kill())r'  )r   r   childrenr   popr=   r   
wait_procsr!   ra   r#  r$  )r=  r>  r   r   r  gonealives          r   r>   r>   5  s    ~((9(==H   $((**$   
  !!#  
  - 	, 	,Aad+++++'.IIIe 	- 	-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 r   .zcan't parse %rr      r   )	r   NotImplementedErrorr   unameisdigitr   splitr   len)r   rH  cminormicronumsmajors          r   rT   rT   Z  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}nBt          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hasattrrR  researchr   group)wvsprs      r   rS   rS   r  s     1!-000			 	 Br'(( "'aIh1&& 	QWWQZZBBB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   	exceptionr  retriesintervallogfun)r   r^  r  r_  r`  ra  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   )r  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^  ra  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   rd  r   rj   r   r   r\  r\    sl         %   
 
 
& & &    r   r\  r   )r^  ra  r  r`  c                 h    t          j        |            t          rt          j        d           dS 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.
    {Gz?N)r   r   r   r   r   )r   s    r   rV   rV     s<     N3 
4 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
  readrN   )fnamer   r   r  datas        r   rW   rW     s     
eT		 avvxx                EKs   266c                 <     |             }t          |          sJ |S )zVKeep calling function for timeout secs and exit if eval()
    expression is True.
    )eval)r   exprrets      r   rU   rU     s&     #%%C::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 dirsc                 \   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 %srm  )r   r!   r   WindowsErrorra   r  r   )r   rc  r  r/  s       r   	retry_funzsafe_rmpath.<locals>.retry_fun  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   rz  str   s       r   rN   rN     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 directoryN)r   mkdirr   r   s    r   
safe_mkdirr  
  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   rM   )dirnamecurdirs     r   rM   rM     s]       Y[[F

s   A Ac                    t           j                            |           r
J |             |rt          d          st	          d          t          |t                    rt          j        d          }t          |t                    s
J |            t          t          d          d          5 }|                    |           ddd           n# 1 swxY w Y   	 t          j        d|j        d| g           t!          |j                   dS # t!          |j                   w xY wt#          j        t&          |            t(          r=t          j        |           }t          j        | |j        t*          j        z             dS dS )	z1Creates an executable file in the given location.gcczgcc is not installedz
                #include <unistd.h>
                int main() {
                    pause();
                    return 1;
                }
                z.csuffixr	  Nz-o)r   r   r   r   r   r  boolr   r   r  r
  rR   r  r   r   r   rN   r  copyfiler%   r   r{  chmodr}  S_IEXEC)outpathc_coder  r  s       r   rO   rO     s   w~~g&&///// 9U|| 	53444fd## 	_ F &#&&.....*D)))400 	AGGFOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 		 !5!&$"@AAAK 	
G,,, 	9!!BHWbj4<788888	9 	9s   0CCCD D'rD  c                     	 t          j        t          | |          }t          j                            |          st          j                            |          S [)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   r   s      r   rR   rR   ;  sN    *mFLLLw~~d## 	*7##D)))*r   c                   \    e Zd Zd Z eej        d          sej        j        Ze	sd Z
dS dS )TestCasec                     | j         j        }|                    d          sd|z   }|d| j         j        d| j        S )Nzpsutil.zpsutil.tests.rE  )r   r   r   r   _testMethodName)r   fqmods     r   __str__zTestCase.__str__P  sT    )	** 	,#e+EEE4>***D,@,@B 	Br   assertRaisesRegexc                     d S r   rk  r   s    r   runTestzTestCase.runTest^  s    Dr   N)r   r   r   r  rT  unittestr  assertRaisesRegexpr  r   r  rk  r   r   r  r  L  sp        B B B 78$&9:: A$-@  	 	 	 	 	 r   r  c                   8    e Zd ZdZd
dZd Zd Zd Zd Zd	 Z	dS )rG   zUTest class providing auto-cleanup wrappers on top of process
    test utilities.
    rD  Nc                 ^    t          ||          }|                     t          |           |S )N)r  r   )rR   
addCleanuprN   )r   r  r   rq  s       r   rR   zPsutilTestCase.get_testfnk  s-    &c222U+++r   c                 T    t          |i |}|                     t          |           |S r   )r?   r  r=   )r   r   r   r   s       r   r?   zPsutilTestCase.spawn_testprocp  s-    ---	5)))r   c                     t                      \  }}|                     t          |           |                     t          |           ||fS r   )rA   r  r=   )r   child1child2s      r   rA   z"PsutilTestCase.spawn_children_pairu  sD    ,..	6***	6***r   c                     t                      \  }}|                     t          |           |                     t          |           ||fS r   )r@   r  r=   )r   r  r   s      r   r@   zPsutilTestCase.spawn_zombie{  sB    %	6***	6***r   c                     t          |i |\  }}|                     t          |           |                     t          |           |S r   )r<   r  rN   r=   )r   r   r   r   r  s        r   r<   zPsutilTestCase.pyrun  sE    ---wW---	5)))r   c                 *   |                      t          j        t          j        |j                   t          |t          j        t          j        f          rh|                                rJ 	 |                                }t          d|z            # t          j        $ r Y nw xY w|
                    d           t          j        |j                  rJ |j                    |                     |j        t          j                               d S )Nz3Process.status() didn't raise exception (status=%s)r   r  )assertRaisesr   r   r   r   r  r   
is_runningr   AssertionErrorr   r7  assertNotInpids)r   r!  r   s      r   assertProcessGonez PsutilTestCase.assertProcessGone  s   &.IIIdV^V\:;; 		!(((((= % &35;&< = = = '   
 IIaI   $TX..888886;==11111s   .B B&%B&rD  N)
r   r   r   r   rR   r?   rA   r@   r<   r  rk  r   r   rG   rG   f  s}            
  
            2 2 2 2 2r   rG   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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 )rF   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)
       rg   r   rh   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   r  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   msgs     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~!8 	E)) =?CD E E E!8 	!!/DDxEax 7;ttUUUCCHC))C.. 	! 	!r   c                 F   t          j        d           |                                 }t          |          D ]}|                     |          }~~t          j        d           |                                 }|                     t           j        g            ||z
  }|S )zGet 2 distinct memory samples, before and after having
        called fun repeadetly, and return the memory difference.
        rF  )
generation)gccollectr  r   r  assertEqualgarbage)r   r   timesmem1r   rv  mem2r  s           r   _call_ntimeszTestMemoryLeak._call_ntimes  s     	
a    }}u 	 	A))C..C33

a    }}R(((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   r  r   appendr  printr  r   )r   r   r  warmup_timesr_  	tolerancemessagesprev_memincreaseidxr  r  successs                r   
_check_memzTestMemoryLeak._check_mem  s   GaK(( 	 	C##C//CC[%%%%{3;'?'?'?'?HCOOC   Y&9#/G 	7 #IIcNNN!8 GGG		#!ii		(++,,,r   c                      |            S r   rk  )r   r   s     r   r  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)r  r  r_  r  )
r  r  r_  r  r  r   r  r  r  r  )r   r   r  r  r_  r  r/  s          r   executezTestMemoryLeak.execute  sE    :
'3 #||" 	$B''dl!*JIIDN		'A:3333331$AA&AAAAa<77!7777>;;#;;;;; 	' 	' 	'SXX&&&	' 	#|,,,5| '9 	 	> 	> 	> 	> 	>s   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   )r  )rh  r   r   s   r   r  z*TestMemoryLeak.execute_w_exc.<locals>.call-  s    c3'''''r   N)r  )r   rh  r   r   r  s   ```  r   execute_w_exczTestMemoryLeak.execute_w_exc)  sJ    	( 	( 	( 	( 	( 	( 	( 	T$$V$$$$$r   )NNNN)r   r   r   r   r  r  r  r+   r_  r  r   r   r  r  r   getenvr  classmethodr  r  r  r  r  r  r  r  r  r  r  rk  r   r   rF   rF     s9        < ELI%bbAGG  Iibi::;;! ! [! 2 2 [2, , ,0 0 0> > >! ! !&  - - -0   CG> > > >*% % % % %r   rF   c                     dd l } 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|                                d         z  |d<   nt          j        rvdd                    t%          t&          |                                                    z   |d<   t+          |d          r%|dxx         d	|                                z   z  cc<   n.|                                d|                                |d<   d	                    t3          |                                          |                                gz             |d
<   t          j        r|                                d         |d<   d	                    |                                |                                |                                 g          |d<   tC          |dd          |d<   ||dxx         d|j"        z  z  cc<   t          j        rrt          d          r=t          ddg          }	t'          |	          #                    d          d         |d<   nd|d<   |$                                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 <   |2                                |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                                 d S )2Nr   lsb_releasezlsb_release -d -sOSz	Darwin %szWindows  win32_editionz, archr   kernelr   __version__znot installedpipz (wheel=%s)r  z	--versionr  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  rs   r!  zF======================================================================r  :17)Icollectionsdatetimegetpasslocaleplatformpprintr  ImportErrorwheelOrderedDictr   r	   r   r  OSXmac_verr   r   mapr  	win32_verrT  r  systemversionlistarchitecturemachiner   rH  python_implementationpython_versionpython_compilerr   r  rJ  libc_verr   getfilesystemencoding	getlocalefromtimestamp	boot_timestrftimenowgetuserr   r   
expanduserr   r%   nodegetpidr  tuplerp   virtual_memoryr   percentr   usedtotalswap_memoryrK  r  r   as_dictr?  pformatr  r   itemsr~   flush)r  r  r  r  r  r  r  r  infooutr   r  r  r  pinfokvs                    r   rJ   rJ   3  s   OOONNNMMMOOOMMM



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

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

	 G#((X''))**#, #, ,T
8_-- 	:JJJ$!7!7!9!999JJJ ( 1 1 1 183C3C3E3E3EFT
99X""$$%%)9)9););(<<> >DL| -!))!,X YY&&((!!  "" $ % %DN #}o>>DK 9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%899 	$((**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LDO


!
!CCK+ch////SY1G1G1GIDNDDL;ty1111;tz3J3J3JLDLv{}}%%DLN$$&&E	IImT""">>%((DL	($$$$

 : :1AGGGGQQ'cj99999	($$$$Js    ..7 AAc                      t          j                    } t          | d          r|                                 S t          | d          r&t	          j        |                                           S dS )Nru   rn   r   )r   r   rT  ru   randomchoicern   )r  s    r   _get_eligible_cpurD    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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j        fi fd5di fd6di fd7di fd8di fgZered4ej        fi fgz  Zed4ej        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#d>S )@rH   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_percentrk  memory_percentr8  r>  r=  Tr  memory_info_exoneshotr  parentsr   r   r   cmdlineconnectionskindall	cpu_timescreate_timer   r   r  memory_infor   nicenum_ctx_switchesnum_threads
open_filesppidr   r{   usernameuidsgidsterminalr  rv   rr   rw   rn   ru   rq   r  rs   groupedF)r   i   r   r%  suspendresumer=   killc                     || _         d S r   )_proc)r   r!  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!  rB  shuffleclear_cacher   ra  r   r~  )r   lsre  fun_namer   r   r   s          r   iterz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)ra  _initr   r   s    r   re  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)rT  r   r   AttributeError)r  
test_classrf  rg  r  	meth_namer  s          r   test_class_coveragez%process_namespace.test_class_coverage
  sn    
 ! 	* 	*NHa(*I:y11 *(111999>$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 rK  rk  r   s     r   r   z*process_namespace.test.<locals>.<listcomp>  s    ***QAaD***r   c                     g | ]
}|d          S rK  rk  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  rk  r   s     r   r   z*process_namespace.test.<locals>.<listcomp>  s%    CCC1qts{CQCCCr   z!uncovered Process class names: %r)r   rO  ignoredr   r   r   r   )r  thisrv  klassleftouts        r   testzprocess_namespace.test  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   utilsrv  gettersr   r2   r3   r6   r   RLIMIT_NOFILEr/   r5   r1   r   r4   settersNORMAL_PRIORITY_CLASSr	   IOPRIO_CLASS_NONEIOPRIO_NORMALrD  r#  SIGTERMkillersCTRL_C_EVENTCTRL_BREAK_EVENTrO  r   rh  re  r  rq  rz  rk  r   r   rH   rH     su         
B	2r"E 
B	R+t,-	r2	2r"	B	2r	B	B	
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7<== .^R,-- )YB'(( )YB'(( -]B+,, =]BE(:;<<G DVUB'((Vf:=rBCC JX 4lCRHII B 	BF$<a#@"EFFGGF$8#;R@AAG E^'8'8':':&;%>CDD 
*B/	B	2r	b"	RG  F]V%8$;R@AA]V%<$?DEE
'/G
#g
-C  " " " "; ; ; 	* 	* [	* L L [L L Lr   rH   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d(S ))rI   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+  rk  r  logicalFT	cpu_statsrP  percpudisk_io_countersperdiskdisk_partitionsrO  
disk_usagenet_connectionsrN  net_if_addrsnet_if_statsrt   pernicr7  r  r7  usersr3  ro   rp   rz   ry   rx   win_service_iterwin_service_get)algprocess_iterr@  rF  cpu_times_percentc              #      K   t          |           } t          j        |            | D ]6\  }}}t          t          |          }t          j        |g|R i |}||fV  7dS rc  )r!  rB  rd  r   r   r   r~  )rf  rg  r   r   r   s        r   rh  zsystem_namespace.iterS  s      
 "XXr$& 	" 	" HdD&(++C#C7$777$77C/!!!!	" 	"r   N)r   r   r   r   r   r   r1  r|  r0   HAS_GETLOADAVGr:   r9   r7   r   r   r   rv  rO  staticmethodrh  rH   rq  rk  r   r   rI   rI      sD         
b"	b9e,-	b9d+,	b"	b8U+,	b8T*+	R)T!23	B.			+	B0	R 	R 	B4 01			+	R	B	"b	2r"%G(  8Zh%5677 ,\2r*++ 6+R455 .^R,-- 1&B/00 8'R011&	2677 
R 	))*-r2	B	b"%	G C	" 	" \	" ,?r   rI   c                 P    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)rx  s    r   	serialrunr  b  s/    
 ?5!!((5(((ELr   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  )r  r   r   )rh  s    r   ra  z retry_on_failure.<locals>.logfunp  s"    ns"444444r   N)r^  r  r_  ra  )r\  r  )r_  ra  s     r   rE   rE   l  s3    5 5 5 >4       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   AccessDeniedr  SkipTest)r   r   r   only_ifs     r   r   z9skip_on_access_denied.<locals>.decorator.<locals>.wrapperz  s`    ?sD+F+++& ? ? ? " '(=>>>	?s    )4r   r   r   r  s   ` r   ri  z(skip_on_access_denied.<locals>.decoratory  s>    				? 	? 	? 	? 	? 
		? r   rk  r  ri  s   ` r   rC   rC   w  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  sk    -sD+F+++& - - - " L%',,,-s    .9r   r  s   ` r   ri  z*skip_on_not_implemented.<locals>.decorator  s>    					- 		- 		- 		- 		- 
			- r   rk  r  s   ` r   rD   rD     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)
contextlibclosingsocketbindgetsockname)hostr  s     r   rY   rY     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rD  r   )ntcygwinrF  rh   )r   r   r  r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRr  r   listenr   r   )familytypeaddrr  s       r   rZ   rZ     s     7H"55 =&&D	7** 	G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.rh   )r   r   r   r   r   r  r   r  r   r  r   r   )r   r  r  s      r   r[   r[     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.
    rh   TN)r  r  r  r   r  r  r  connectr   r   r+  )r  r  llrL  caddras         r   r\   r\     sK    
	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   r[   r  r   setblockingr   r  r   r   )r   serverclients      r   r]   r]     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.Nr  )r  rZ   r  r   r   
SOCK_DGRAMr   r   r   HAS_CONNECTIONS_UNIXrR   r]   r[   r   rN   )socksfname1fname2s1s2s3r   rq  s           r   r^   r^     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[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    r   Nc                 ,    g | ]}t          |          S rk  )r   r   s     r   r   z%check_net_address.<locals>.<listcomp>  s    0001A000r   rE  r      z([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r)	ipaddressenumr   r$   r  IntEnumr  r   rJ  rK  r   IPv4Addressr   r  IPv6Addressr   AF_LINKrU  matchr   )r  r  r  octsnums        r   rX   rX     s     8 8D 8&$,//77777 600

30004yyA~##t### 	) 	)C((((s(((((D(((( 	!4==Dd#####	6?	" 6$$$**d*** 	!4==Dd#####	6>	! 6x5t<<NN$NNNNN,f555r   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 )
N   )r*  r  r   rF  r   r   r   rh   r*  )rK  r  r  r  laddrraddrr   r   )r  has_pids     r   check_ntuplez-check_connection_ntuple.<locals>.check_ntuple+  s5   d))q.4yyF"--CII---Aw$'!**47***Aw$+%22t{222Aw$)#..TY...Aw$*$00dj000Aw$*$00dj000Aw$+%22t{222 	17dh&00000	1 	100r   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 )Nr   )r  r   r   r   r  r  r  r   r  r  r  r  r  r  errorr-  EADDRNOTAVAILr   r   	CONN_NONE)r  r   r/  s      r   check_familyz-check_connection_ntuple.<locals>.check_family7  s   {w'::GGDKGGG 	6dk4<88>>$>>>>dk3//55555;'! 	@
 dk4955A#A&&  FFDJqM1-....|   yE$77                       [G# 	@;&"22??DK???	@ 	@??s<   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   r  r  r  r  r   r   r   r  )r  r  s     r   
check_typez+check_connection_ntuple.<locals>.check_typeL  s     )9688DDyV/1B+- - 	8 	8.2i	8 	8 	8 	4di66<<<<<<di--33t3339)) 	@;&"22??DK???	@ 	@??r   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  )r  r  r  r   r   r  r2  r  portr   rX   ipr   r  )r  r  s     r   check_addrsz,check_connection_ntuple.<locals>.check_addrsX  s   Z, 		9 		9D{w11 9!$..::T

::: !$)S11BB4	??BBBDI999999999	999!$'4;7777' 9!$,,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>g  sB     , , ,\\'**,'&!$$ , , ,r   )r  r   r  r   r   r  r   r   r  r   r  )r  validss     r   check_statusz-check_connection_ntuple.<locals>.check_statuse  s    $+s++88T[888, ,c&kk , , ,{f$11dk111;7H-- 	@$){2J 	@;&"22??DK?????;&"22??DK?????r   Nrk  )r  r  r  r  r  r  s         r   check_connection_ntupler  )  s    
1 
1 
1@ @ @*
@ 
@ 
@9 9 9@ @ @ LLJtKLr   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)	importlibrT  r  r  imp)moduler  r  s      r   r_   r_   {  s    (y(++ 		 '''	  " " "


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


tT***		"1"		' 888888d++77999~55dDAAn--d33$$$
r   c                 :    t          j        | t                     dS )zRaise a warning msg.N)warningsra   UserWarning)r  s    r   ra   ra     s    M#{#####r   c                     t          |           }|j        }t          |          dk    s|d         t          k    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   F   K   | ]}t          |          t          k    V  d S r   )r  r  )r   ns     r   	<genexpr>z is_namedtuple.<locals>.<genexpr>  s,      ))!tAww#~))))))r   )r  	__bases__rK  r2  r   r  rO  )r   tbr  s       r   rc   rc     s    QA	A
1vv{ adem u9d##Aa u))q))))))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.
        r   r   z.sor  c                     g | ]R}t           j                            |j                  d          k    0|j                                        v K|j        SS )rF  )r   r   r  lower)r   r   r   exts     r   r   z'copyload_shared_lib.<locals>.<listcomp>  sb     ' ' '1  ((+s2'qv||~~%' ' ' 'r   N)r$   rR   r   r   rs   rB  rC  r  r  ctypesCDLLrN   )r  dstlibsr  r   r  s       @@r   rb   rb     s       *ff(---' ' ' ' ' 0 0 < < > > ' ' ' 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                                                                       .d t          j                             |j                                                   v fd|j                                         v|j         S )r   wow64)r   r  r  r   r   )r   r   r  s     r   r   z'copyload_shared_lib.<locals>.<listcomp>  s     / / /1'',,/BG,,QV44::<<</ qv||~~-/ / / /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>  sX     @ @ @qbg..qv66<<>>>@AF @ @ @r   N)r  r!  r"  rR   r   r   rs   r$   rB  rC  r  r  WinDLLwindllkernel32FreeLibraryHMODULEargtypes_handlerN   )
r  r!  r"  r  r  r  cfiler)  rv  r  s
            @r   rb   rb     s      	$###########---/ / / / 0 0 < < > > / / /  	@ 	@@ @FN$4$4$@$@$B$B @ @ @DmD!!S!!!	M#&&EIII  $m4@(0(8'9$!k%-00!8 HJJJ  $m4@(0(8'9$!k%-00!8 HJJJs   :D( (AE>c                  &    t          d           d S )NTr<  )r>   rk  r   r   cleanup_test_procsr/    s    D!!!!!!r   c                 *    t          j        |           S r   )r   exit)r'  frames     r   r   r     s    SXc]] r   r   )F)TFr  )r  )r  )rD  )r   
__future__r   atexitr  r  r-  r   r  r  r   rB  rU  r   r  r#  r  r{  r   r   r  r   r   r   r  r   r   r   r   r   r   r	   r
   r   r   r   psutil._commonr   r   r   psutil._compatr   r   r   r   r   r   r   r   r  	unittest2r   r  catch_warningssimplefilterr   r  psutil._psposixr   __all__builtin_module_namesr$   rq   r   re   r+   maxsizer.   r#   r"   r-   r!   r   r1  r(   r)   decoder*   r(  r  ASCII_FSr   r   r   r  __file__r&   r'   HEREr  rT  r   r/   r0   r  r1   r3   r4   HAS_NET_IO_COUNTERSr5   r2   r6   r7   r  rx   r8   r   r9   r:   HAS_THREADSgetuidSKIP_SYSCONSr   r%   r
  devnullr    registerr   r   r,   r   r  r   r   r   r   r   r   r   r?   rA   r@   r<   r  r  r=   r>   rT   rS   r\  r   rV   r  rW   rU   rN   r  contextmanagerrM   rO   rR   r  rG   skipIfrF   rJ   rD  rH   rI   r  rE   rC   rD   rY   rZ   r[   r\   r]   r^   rX   r  r_   r`   ra   rc   rb   r/  rk  r   r   <module>rJ     s    & % % % % %            				  				  				          



                                                                      & & & & & & & & & & & & ( ( ( ( ( (       * * * * * * , , , , , ,                               " " " " " "              !OOOO       	 	 	"	"  h'''              
 v KKKKD )(((((($ $ $Z S--#!RZ/O>RZ3O'
;  
# '  !OJaNA
 7f 0!IBIKK/MM!IBIKK/M9 ))009JKK($3$&&,,..2GG 7GLL**D$779 9gll8Y//	w1122 *U 76>>:: wvz**..gfni00WV^X..
'&.-88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
  @ []]

$rz4
 
     3 333v;; 3 3 3 
'&)VVXX
.
. ( ( ( ( (! ( ( (`   $ $ $ $N # # #L* * *Z   &   6  &~N R/ R/ R/ R/j- - - -J! ! !0  (7 7 7 7 7F 7 7 7t %dN     #^4T/ / /  / / n      B     9 9 9 9<	* 	* 	* 	*"    x    .  .2 .2 .2 .2 .2X .2 .2 .2b +,,X% X% X% X% X%^ X% X% -,X%vX X Xv  FL FL FL FL FL FL FL FLR?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@D   (               0% % % % [t    " !' 2       .  . # # #46 6 64J J Jd
( 
( 
(  *$ $ $
	* 	* 	* 	 9    & # # # #X " " " 	 DFM&."B"BCCCCCD DsH   /C6 6D9
D+D9+D/	/D92D/	3D98D9*N NN