Viewing File: /opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/__pycache__/__init__.cpython-38.pyc

U

Œ=Ý_ààãE@s”dZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlZddlmZddlmZdd	lmZdd
lm Z ddlm!Z!ddlm"Z"dd
lm#Z#ddl$m%Z%ddl$m&Z&ddl$m'Z'ddl(m)Z)ddl(m*Z*ddl(m+Z+ddl(m,Z,ddl(m-Z-ddl(m.Z.ddl(m/Z/ddl(m0Z0e+rÔddl1Z1nddl2Z1zddl1m3Z3Wn<e4k
r(e 5¡e 6d¡ddl3Z3W5QRXYnXej7dkr@ddl8Z8ndZ8ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gEZ9daej:kZ;de
j<kZ=dbe
j<kpúdce
j<kZ>e=pe>Z?ej@ddkZAdeZBdfZCdgZDdhZEe?rFeBdi9ZBeEdi9ZEeCdi9ZCeDdi9ZDe
jFdjkr`dke
 G¡ZHndle
 G¡ZHe.dmƒZIe+rˆdn Jdodp¡ZKndqZKe L¡ M¡drkZNe
jO Pe
jO Qe
jO ReS¡dsds¡¡ZTe
jO QeTdt¡ZUe
jO Pe
jO ReS¡¡ZVe!oèe"ZWeXejYduƒZZeXedvƒZ[eXedwƒZ\eXejYdxƒZ]eXejYdyƒZ^eXejYdzƒZ_eXed{ƒZ`eXejYd|ƒZaeXejYd}ƒZbeXejYd~ƒZceXedƒZdzedoxeee f¡ƒZgWnehk
r–d€ZgYnXeXedƒZieXed‚ƒZjeXejYdƒƒZke sÄeoÎe
 l¡dkZmd„d…„ZnenƒZoepe
jqd†ƒZre serjt¡d‡dˆ„eueƒDƒZvewed‰exƒƒZyezƒZ{ezƒZ|GdŠd‹„d‹ej}ƒZ~dŒd„ZedËdŽd<„ƒZ€edd>„ƒZdd=„Z‚ed‘d9„ƒZƒed’d“„ƒZ„ej…eEfd”d:„Z†dÌd•d;„Z‡d–dQ„Zˆd—dP„Z‰Gd˜d™„d™exƒZŠeŠej‹deEdšd›dœdS„ƒZŒeŠe*efdeEdšd›dÍdždT„ƒZŽeŠedeEdšd›dŸdR„ƒZd dK„Zd¡d¢„Z‘ej’d£dJ„ƒZ“dÎd¤dL„Z”dÏd¦dO„Z•Gd§d¨„d¨e1j–ƒZ–e–e1_–Gd©dD„dDe–ƒZ—e1 ˜e;dª¡Gd«dC„dCe—ƒƒZ™d¬dG„Zšd­d®„Z›Gd¯dE„dEƒZœGd°dF„dFƒZd±d²„ZžeBfd³dB„ZŸdÐd´d@„Z dÑdµdA„Z¡dÒd·dV„Z¢eedfd¸dW„Z£ejfd¹dX„Z¤dÓd»dY„Z¥d¼dZ„Z¦ej’d½d[„ƒZ§d¾dU„Z¨d¿dÀ„Z©dÁd\„ZªdÂd]„Z«dÃd^„Z¬dÄd`„Z­e!rZej’dÔdÅd_„ƒZ®nej’dÕdÆd_„ƒZ®ejsdÇdÈ„ƒZ¯e!re ej…dÉdÊ„¡dS)Öz
Test utilities.
é)Úprint_functionN)ÚAF_INET)ÚAF_INET6)ÚSOCK_STREAM)ÚAIX)ÚFREEBSD)ÚLINUX)ÚMACOS)ÚPOSIX)ÚSUNOS)ÚWINDOWS)Úbytes2human)Úprint_color)Ú
supports_ipv6)ÚFileExistsError)ÚFileNotFoundError)ÚPY3)Úrange)Úsuper)Úu)Úunicode)Úwhich)ÚmockÚignore©ééÚ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_TEMPERATURESZHAS_MEMORY_FULL_INFOÚpyrunÚ	terminateÚ
reap_childrenÚspawn_testprocÚspawn_zombieÚspawn_children_pairZThreadTaskunittestÚskip_on_access_deniedÚskip_on_not_implementedÚretry_on_failureÚTestMemoryLeakÚPsutilTestCaseÚprocess_namespaceÚsystem_namespaceÚ
print_sysinfoZinstall_pipZinstall_test_depsÚchdirÚsafe_rmpathÚ
create_exeZdecode_pathZencode_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_namedtupleZ__pypy__ÚGITHUB_ACTIONSZCIBUILDWHEELlé
iPi érÚjavaz$psutil-%s-z@psutil-%s-u-ƒőősfÀ€Úutf8Úsurrogateescapeuf)Úasciizus-asciiz..ZscriptsÚcpu_affinityÚcpu_freqÚ
getloadavgÚenvironÚioniceÚmemory_mapsÚnet_io_countersÚcpu_numÚio_countersÚrlimitÚsensors_batteryFÚsensors_fansÚsensors_temperaturesÚthreadscCsÄdd„}tr@tr$trtdƒStdƒStr6tj tj	¡StdƒSn€t
rš|tj	ƒpˆ|tj tj	¡ƒpˆ|tdtjdd…ƒƒpˆ|t 
¡ ¡ƒ}|s–tdƒ‚|Stj tj	¡}tj |¡s¼t|ƒ‚|SdS)	NcSs<ztj|dgtjtjdWntk
r2YdSX|SdS)Nz-V)ÚstdoutÚstderr)Ú
subprocessÚ
check_callÚPIPEÚ	Exception)Úexe©rxúH/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/__init__.pyÚattemptÄsÿ
z_get_py_exe.<locals>.attemptZpypy3ÚpypyÚpythonzpython%s.%séz"can't find python exe real abspath)r\r"rrrÚosÚpathÚrealpathÚsysÚ
executabler	Úversion_infoÚpsutilÚProcessrwÚ
ValueErrorÚexistsÚAssertionError)rzrwrxrxryÚ_get_py_exeÃs*	

ÿþür‰zr+cCs g|]}| d¡rtt|ƒ‘qS)ZSTATUS_©Ú
startswithÚgetattrr„©Ú.0ÚxrxrxryÚ
<listcomp>çs
ÿrÚAF_UNIXcsPeZdZdZ‡fdd„Zdd„Zdd„Zdd	„Zd
d„Zdd
„Z	dd„Z
‡ZS)Ú
ThreadTaskz6A thread task which does nothing expect staying alive.cs$tƒ ¡d|_d|_t ¡|_dS)NFçü©ñÒMbP?)rÚ__init__Ú_runningÚ	_intervalÚ	threadingZEventÚ_flag©Úself©Ú	__class__rxryr”÷s
zThreadTask.__init__cCs|jj}d||jt|ƒfS)Nz<%s running=%s at %#x>)rœÚ__name__r•Úid)ršÚnamerxrxryÚ__repr__ýszThreadTask.__repr__cCs| ¡|S©N)Ústartr™rxrxryÚ	__enter__szThreadTask.__enter__cOs| ¡dSr¡)Ústop)ršÚargsÚkwargsrxrxryÚ__exit__szThreadTask.__exit__cCs(|jrtdƒ‚tj |¡|j ¡dS)zStart thread and keep it running until an explicit
        stop() request. Polls for shutdown every 'timeout' seconds.
        zalready startedN)r•r†r—ÚThreadr¢r˜Úwaitr™rxrxryr¢szThreadTask.startcCs(d|_|j ¡|jr$t |j¡qdS)NT)r•r˜ÚsetÚtimeÚsleepr–r™rxrxryÚruns
zThreadTask.runcCs |jstdƒ‚d|_| ¡dS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)r•r†Újoinr™rxrxryr¤szThreadTask.stop)rÚ
__module__Ú__qualname__Ú__doc__r”r r£r§r¢r­r¤Ú
__classcell__rxrxr›ryr’ôs	r’cst ˆ¡‡fdd„ƒ}|S)Ncs.zˆ||ŽWStk
r(tƒ‚YnXdSr¡)rvr;©r¥r¦©ÚfunrxryÚwrapper%s
z&_reap_children_on_err.<locals>.wrapper©Ú	functoolsÚwraps©rµr¶rxr´ryÚ_reap_children_on_err$sr»cKsÐ| dt¡| dt¡| dt ¡¡| dtj¡trJd}| d|¡|dkrªtƒ}zDt|ƒd|}td	|g}t	j
|f|Ž}t |¡t
|d
d
dW5t|ƒXn"t	j
|f|Ž}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().
    ÚstdinrqÚcwdÚenvéÚ
creationflagsNz:from time import sleep;open(r'%s', 'w').close();sleep(60);z-cT©ÚdeleteÚempty)Ú
setdefaultrr~ÚgetcwdrfrrJrHr#rsÚPopenÚ_subprocesses_startedÚaddrOrNÚpid)ÚcmdÚkwdsZCREATE_NO_WINDOWÚtestfnZpylineÚsprocrxrxryr</s.
þ



cCs¬d}tt ¡d}zzt dtj |¡tf¡}t	rDt
|dd\}}nt
|ƒ\}}t |j
¡}tt|dddƒ}t |¡t |¡}||fW¢St|ƒ|dk	r¦t|ƒXdS)	aCreate 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©Údira;            import subprocess, os, sys, time
            s = "import os, time;"
            s += "f = open('%s', 'w');"
            s += "f.write(str(os.getpid()));"
            s += "f.close();"
            s += "time.sleep(60);"
            p = subprocess.Popen([r'%s', '-c', s])
            p.wait()
            r)rÀTFrÁ)rJr~rÅrHÚtextwrapÚdedentrÚbasenamer#rr9r„r…rÉÚintrOÚ
_pids_startedrÈ)ÚtfilerÌÚsÚsubpZchildZgrandchild_pidZ
grandchildrxrxryr>Ws"	÷


csÞtjs
t‚tƒ}t d|¡}d}t|ƒ}zŒ| 	t
¡t|ƒ\}}| ¡\}}zZt
 
| ¡gggt
¡t| d¡ƒ}t |¡t |¡‰t‡fdd„dƒ|ˆfW¢W¢S| ¡XW5| ¡t|ƒ|dk	rØt|ƒXdS)z±Create 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écsˆ ¡Sr¡)Ústatusrx©ÚzombierxryÚ<lambda> ózspawn_zombie.<locals>.<lambda>zret == psutil.STATUS_ZOMBIE)r„r
rˆrJrÐrÑrSÚcloserHZ
settimeoutrr9ÚacceptÚselectÚfilenorÓZrecvrÔrÈr…rM)Z	unix_fileÚsrcrÕÚsockÚparentÚconnÚ_ZzpidrxrÚryr=~s.
ñ


c	Ksˆ| dd¡| dd¡tƒ}zFt|dƒ}| |¡W5QRXtt|jgf|Ž}t|jƒ||fWSt	k
r‚t
|ƒ‚YnXdS)zRun python 'src' code string in a separate interpreter.
    Returns a subprocess.Popen instance and the test file where the source
    code was written.
    rqNrrÚwt)rÄrJÚopenÚwriter<r#rŸrNrÉrvrH)rârËÚsrcfileÚfr×rxrxryr9«s

cKsØt|ttfƒrdnd}tr"|r"dnd}| d|¡| dtj¡| dtj¡| dd¡| d	|¡tj|f|Ž}t 	|¡t
r”|jtd
\}}n| ¡\}}|j
dkr²t|ƒ‚|r¾t|ƒ| d¡rÔ|dd
…}|S)zUrun cmd in a subprocess and return its output.
    raises RuntimeError on error.
    TFr¿rÚshellrqrrZuniversal_newlinesrÀ©ÚtimeoutÚ
Néÿÿÿÿ)Ú
isinstanceÚstrrrrÄrsrurÆrÇrÈrZcommunicaterÚ
returncodeÚRuntimeErrorrYÚendswith)rÊrËrìÚflagsÚprqrrrxrxryÚsh¿s&


røc
strddlm‰dd„‰dd„‰‡‡‡fdd„}‡‡‡fd	d
„‰‡‡fdd„}d
d„}|}zbt|tƒrt|||ƒW¢LSt|tjtjfƒr”ˆ||ƒW¢,St|tjƒr®|||ƒW¢Std|ƒ‚W5t|tjtjfƒrØ||ƒt|tƒræ|n|j}t 	|¡rt
|ƒ‚XdS)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.
    r)Úwait_pidcSsdt|tjƒrts| ¡n
| |¡tr`t|tjƒr`zt |j¡ |¡WStj	k
r^YnXdSr¡)
rñrsrÆrr©rr„r…rÉÚ
NoSuchProcess©Úprocrîrxrxryr©ès

zterminate.<locals>.waitcSs6trtrtj}tr(|tjkr(| tj¡| |¡dSr¡)r	r\ÚsignalÚSIGKILLr
Úsend_signalÚSIGCONT)rüÚsigrxrxryÚsendsigôs
zterminate.<locals>.sendsigc
sZzˆ|ˆƒWn@tk
rN}z"tr0|jdkr0n|jtjkr>‚W5d}~XYnXˆ||ƒS)Né)ÚOSErrorrZwinerrorÚerrnoZESRCH)rürîÚerr©rrr©rxryÚterm_subprocþszterminate.<locals>.term_subproccs0zˆ|ˆƒWntjk
r$YnXˆ||ƒSr¡)r„rúrûrrxryÚterm_psprocs
zterminate.<locals>.term_psproccsFzt |¡}Wn(tjk
r6tr2ˆ||ƒYSYnXˆ||ƒSdSr¡)r„r…rúr
)rÉrîrü)r	rùrxryÚterm_pidszterminate.<locals>.term_pidcSs4|jr|j ¡|jr |j ¡|jr0|j ¡dSr¡)rqrÞrrr¼)rürxrxryÚflush_popens

zterminate.<locals>.flush_popenz
wrong type %rN)
r
Zpsutil._psposixrùrñrsrÆr„rÓrÉÚ
pid_existsrˆr…Ú	TypeError)Zproc_or_pidrÚwait_timeoutrr
rr÷rÉrx)rrr	r©rùryr:Ûs*



	
cCst ¡j|d}tr&t ¡}t|ƒqtr<t ¡}t|ƒq&|rŒ|D]}t|ddqDtj|td\}}|D]}t	d|ƒt|t
jdqldS)aTerminate 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)rríz0couldn't terminate process %r; attempting kill())r)r„r…ÚchildrenrÇÚpopr:rÔÚ
wait_procsrrYrýrþ)rrr×rÉr÷ZgoneZaliverxrxryr;3s


cCs¬tstdƒ‚d}t ¡d}|D]"}| ¡s4|dkr>||7}q qDq |sTtd|ƒ‚d}d}| d¡}t|dƒ}t|ƒdkrŠt|dƒ}t|ƒdkr¢t|dƒ}|||fS)	z"Return a tuple such as (2, 6, 36).z	not POSIXÚr}Ú.zcan't parse %rrér)	r
ÚNotImplementedErrorr~ÚunameÚisdigitr†ÚsplitrÓÚlen)rÖrÚcÚminorÚmicroZnumsÚmajorrxrxryrLXs&

cCsdtstdƒ‚t ¡}t|dƒr*|jp&d}n(t d|d¡}|rNt| 	d¡ƒ}nd}|d|d|fS)Nznot WINDOWSÚservice_pack_majorrz\s\d$rr)
rrrZgetwindowsversionÚhasattrr ÚreÚsearchrÓÚgroup)ZwvZspÚrrxrxryrKps
c@s<eZdZdZeddddfdd„Zdd„Zdd	„Zd
d„ZdS)ÚretryzA retry decorator.Nr“cCs2|r|rtdƒ‚||_||_||_||_||_dS)Nz/timeout and retries args are mutually exclusive)r†Ú	exceptionrîÚretriesÚintervalÚlogfun)ršr'rîr(r)r*rxrxryr”‡szretry.__init__ccsT|jr*t ¡|j}t ¡|krPdVqn&|jrHt|jƒD]
}dVq:ndVqHdSr¡)rîr«r(r)ršÚstop_atrærxrxryÚ__iter__–s

zretry.__iter__cCs|jdk	rt |j¡dSr¡)r)r«r¬r™rxrxryr¬¢s
zretry.sleepcs"t ˆ¡‡‡fdd„ƒ}ˆ|_|S)Ncs|d}ˆD]b}zˆ||ŽWSˆjk
rh}z,|}ˆjdk	rHˆ |¡ˆ ¡WY¢qW5d}~XYqXqtrv|‚n‚dSr¡)r'r*r¬r)r¥r¦Úexcræ©rµršrxryr¶§s

zretry.__call__.<locals>.wrapper)r¸r¹Ú	decorator)ršrµr¶rxr.ryÚ__call__¦szretry.__call__)	rr¯r°r±rvr”r,r¬r0rxrxrxryr&„sû
r&r“)r'r*rîr)cCst |¡trt d¡dS)z„Wait for pid to show up in the process list then return.
    Used in the test suite to give time the sub process to initialize.
    ç{®Gáz„?N)r„r…rr«r¬)rÉrxrxryrN¾s
Tc	Cs:t|dƒ}| ¡}W5QRX|s*|s*t‚|r6t|ƒ|S)z8Wait for a file to be written on disk with some content.Úrb)rèÚreadrˆrH)ÚfnamerÂrÃrëÚdatarxrxryrOÊscCs|ƒ}t|ƒst‚|S)zVKeep calling function for timeout secs and exit if eval()
    expression is True.
    )Úevalrˆ)rµÚexprÚretrxrxryrM×scCsndd„}zLt |¡}t |j¡r0t tj|¡}nt tj|¡}t	rJ|ƒn||ƒWnt
k
rhYnXdS)z>Convenience function for removing temporary test files or dirsc
Ss~t ¡t}t ¡|krvz|ƒWStk
r4Yn6tk
rh}z|}tdt|ƒƒW5d}~XYnXt d¡q|‚dS)Nzignoring %sr1)r«rrZWindowsErrorrYròr¬)rµr+rærrxrxryÚ	retry_funés"zsafe_rmpath.<locals>.retry_funN)r~ÚstatÚS_ISDIRÚst_moder¸ÚpartialÚshutilZrmtreeÚremover
r)rr9ÚstrµrxrxryrHçs
cCs(zt |¡Wntk
r"YnXdS)z-Convenience function for creating a directoryN)r~ÚmkdirrrÎrxrxryÚ
safe_mkdirsrBc	cs.t ¡}zt |¡dVW5t |¡XdS)z@Context manager which temporarily changes the current directory.N)r~rÅrG)ÚdirnameÚcurdirrxrxryrGs


c	CsÎtj |¡rt|ƒ‚|rœtdƒs(tdƒ‚t|tƒr<t 	d¡}t|t
ƒsNt|ƒ‚ttdddƒ}| 
|¡W5QRXzt d|jd|g¡W5t|jƒXn.t t|¡trÊt |¡}t ||jtjB¡dS)	z1Creates an executable file in the given location.Úgcczgcc is not installedzŸ
                #include <unistd.h>
                int main() {
                    pause();
                    return 1;
                }
                z.c©Úsuffixrçz-oN)r~rr‡rˆrr†rñÚboolrÐrÑròrèrJrérHrŸrsrtr>Úcopyfiler#r
r:Úchmodr<ÚS_IEXEC)ZoutpathZc_coderër@rxrxryrIs$
ÿ
rcCs.tjt||d}tj |¡stj |¡SqdS)zîReturn 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.
    )ÚprefixrGrÏN)ÚtempfileZmktempr&r~rr‡r€)rGrÏrŸrxrxryrJ9sc@s4eZdZdd„Zeejdƒs$ejjZe	s0dd„Z
dS)ÚTestCasecCs.|jj}| d¡sd|}d||jj|jfS)Nzpsutil.z
psutil.tests.z%s.%s.%s)rœr¯r‹rZ_testMethodName)ršZfqmodrxrxryÚ__str__Ns
ÿzTestCase.__str__ÚassertRaisesRegexcCsdSr¡rxr™rxrxryÚrunTest\szTestCase.runTestN)rr¯r°rOr!ÚunittestrNZassertRaisesRegexprPrrQrxrxrxryrNJs
	rNc@sBeZdZdZddd„Zdd„Zdd	„Zd
d„Zdd
„Zdd„Z	dS)rCzUTest class providing auto-cleanup wrappers on top of process
    test utilities.
    rNcCst||d}| t|¡|S)N)rGrÏ)rJÚ
addCleanuprH)ršrGrÏr4rxrxryrJiszPsutilTestCase.get_testfncOst||Ž}| t|¡|Sr¡)r<rSr:)ršr¥rËrÍrxrxryr<ns
zPsutilTestCase.spawn_testproccCs*tƒ\}}| t|¡| t|¡||fSr¡)r>rSr:)ršZchild1Zchild2rxrxryr>ss
z"PsutilTestCase.spawn_children_paircCs*tƒ\}}| t|¡| t|¡||fSr¡)r=rSr:)ršrärÛrxrxryr=ys
zPsutilTestCase.spawn_zombiecOs*t||Ž\}}| t|¡| t|¡|Sr¡)r9rSrHr:)ršr¥rËrÍrêrxrxryr9szPsutilTestCase.pyruncCsš| tjtj|j¡t|tjtjfƒrn| ¡r2t‚z| 	¡}Wntjk
rTYnXtd|ƒ‚|j
ddt |j¡r„t|jƒ‚| |jt 
¡¡dS)Nz3Process.status() didn't raise exception (status=%s)rrí)ÚassertRaisesr„rúr…rÉrñrÆÚ
is_runningrˆrÙr©rZassertNotInÚpids)ršrürÙrxrxryÚassertProcessGone…sÿz PsutilTestCase.assertProcessGone)rN)
rr¯r°r±rJr<r>r=r9rWrxrxrxryrCds
zunreliable on PYPYc@s~eZdZdZdZdZdZer dndZdZ	e
 ¡Zdd„Z
d	d
„Zdd„Zd
d„Zdd„Zdd„Zdd„Zddd„Zdd„ZdS)rBaç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)
    éÈr]rr^TcCs|j ¡}t|d|jƒS)NZuss)Ú	_thisprocÚmemory_full_inforŒZrss)ršÚmemrxrxryÚ_get_mem¼s
zTestMemoryLeak._get_memcCstr|j ¡S|j ¡SdSr¡)r
rYÚnum_fdsÚnum_handlesr™rxrxryÚ_get_num_fdsÂs
zTestMemoryLeak._get_num_fdscCs|jrt|dtjddS)NZyellow)ZcolorÚfile)Úverboserrrr)ršÚmsgrxrxryÚ_logÈszTestMemoryLeak._logcCsx| ¡}| |¡| ¡}||}|dkr8| d|¡‚|dkrttrHdnd}|dkr\|d7}d|||f}| |¡‚dS)	z»Makes sure num_fds() (POSIX) or num_handles() (Windows) does
        not increase after calling a function.  Used to discover forgotten
        close(2) and CloseHandle syscalls.
        rzHnegative diff %r (gc probably collected a resource from a previous test)ÚfdZhandlerrÖz%s unclosed %s after calling %rN)r_ÚcallÚfailr
)ršrµZbeforeZafterÚdiffZtype_rbrxrxryÚ
_check_fdsÌs
ÿzTestMemoryLeak._check_fdscCs^tjdd| ¡}t|ƒD]}| |¡}~~qtjdd| ¡}| tjg¡||}|S)z€Get 2 distinct memory samples, before and after having
        called fun repeadetly, and return the memory difference.
        r)Z
generation)ÚgcZcollectr\rreZassertEqualZgarbage)ršrµÚtimesZmem1rr8Zmem2rgrxrxryÚ_call_ntimesßs
zTestMemoryLeak._call_ntimesc
Cs¶g}d}|}td|dƒD]†}	| ||¡}
d|	t|
ƒt|
|ƒ|f}| |¡|
|kp^|
|k}|r||	dkrv| |¡dS|	dkrŠtƒ| |¡||7}|
}q| d |¡¡‚dS)Nrrz,Run #%s: extra-mem=%s, per-call=%s, calls=%sz. )rrkr
ÚappendrcÚprintrfr®)
ršrµrjÚwarmup_timesr(Ú	toleranceZmessagesZprev_memZincreaseÚidxr[rbÚsuccessrxrxryÚ
_check_memîs.
ÿ


zTestMemoryLeak._check_memcCs|ƒSr¡rx)ršrµrxrxryreszTestMemoryLeak.callNc
Csê|dk	r|n|j}|dk	r|n|j}|dk	r0|n|j}|dk	rB|n|j}zD|dksZtdƒ‚|dksjtdƒ‚|dksztdƒ‚|dksŠtdƒ‚Wn.tk
rº}ztt|ƒƒ‚W5d}~XYnX| ||¡| |¡|j	|||||ddS)	zTest a callable.Nrztimes must be >= 1rzwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rjrnr(ro)
rjrnr(rorˆr†ròrkrhrr)ršrµrjrnr(rorrxrxryÚexecute	s&ÿ

ÿzTestMemoryLeak.executecs"‡‡‡fdd„}ˆj|f|ŽdS)znConvenience method to test a callable while making sure it
        raises an exception on every call.
        csˆ ˆˆ¡dSr¡)rTrx©r-rµršrxryre"sz*TestMemoryLeak.execute_w_exc.<locals>.callN)rs)ršr-rµr¦rerxrtryÚ
execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)rr¯r°r±rjrnror)r(rar„r…rYr\r_rcrhrkrrrersrurxrxrxryrB•s$ÿ
cCs°ddl}ddl}ddl}ddl}ddl}ddl}zddl}Wntk
rTd}YnXzddl}Wntk
rzd}YnX| 	¡}t
jr tdƒr t
dƒ|d<n~t
jr¼d| ¡d|d<nbt
jrdd tt| ¡ƒ¡|d<t|dƒr|dd	| ¡7<nd
| ¡| ¡f|d<d	 t| ¡ƒ| ¡g¡|d<t
jrV| ¡d|d
<d	 | ¡| ¡|  ¡g¡|d<t!|ddƒ|d<|dk	r¦|dd|j"7<t
jrþtdƒrÜt
ddgƒ}	t|	ƒ #d¡d|d<nd|d<| $¡d}
|
rþ|
|d<t% &¡|d<| '¡}d|d|df|d<|j (t
 )¡¡ *d¡|d<|j +¡ *d¡|d<| ,¡|d<t-j. /d¡|d <t- 0¡|d!<t1|d"<| 2¡|d#<t- 3¡|d$<t
 4¡|d%<d&t5d'd(„t
 6¡Dƒƒ|d)<t
 7¡}d*t8|j9ƒt:|j;ƒt:|j<ƒf|d+<t
 =¡}
d*t8|
j9ƒt:|
j;ƒt:|
j<ƒf|d,<t>t
 ?¡ƒ|d-<t
 @¡ A¡}| Bd.d¡| C|¡|d/<tDd0t%jEd1| F¡D]$\}}tDd2|d3|ft%jEd1qntDd0t%jEd1t%jG H¡dS)4NrZlsb_releasezlsb_release -d -sZOSz	Darwin %szWindows ú Ú
win32_editionz, z%s %sZarchr}Zkernelr|Ú__version__z
not installedÚpipz (wheel=%s)rEz	--versionrïrZglibczfs-encodingz%s, %sÚlangz%Y-%m-%d %H:%M:%Sz	boot-timer«Úuserú~Úhomer½ZpyexeZhostnameZPIDZcpusz%.1f%%, %.1f%%, %.1f%%cSsg|]}|t ¡d‘qS)éd)r„Ú	cpu_countrrxrxryrpsz!print_sysinfo.<locals>.<listcomp>Zloadavgz%s%%, used=%s, total=%sZmemoryÚswaprVrhrüzF======================================================================©r`z%-17s %sú:)IÚcollectionsÚdatetimeÚgetpassÚlocaleÚplatformÚpprintryÚImportErrorÚwheelÚOrderedDictr„rrrøZOSXZmac_verrr®ÚmapròZ	win32_verr!rwÚsystemÚversionÚlistZarchitectureÚmachiner
rZpython_implementationZpython_versionZpython_compilerrŒrxrZlibc_verrÚgetfilesystemencodingZ	getlocaleZ
fromtimestampÚ	boot_timeÚstrftimeZnowZgetuserr~rÚ
expanduserrÅr#ZnodeÚgetpidrÚtuplereÚvirtual_memoryrÓZpercentr
ZusedZtotalÚswap_memoryrrVr…Úas_dictrZpformatrmrrÚitemsrqÚflush)rƒr„r…r†r‡rˆryrŠÚinfoÚoutrÖrzr[r€ZpinfoÚkÚvrxrxryrF(s®

ÿ
ÿý


ÿÿÿÿ
ÿ
cCs6t ¡}t|dƒr| ¡St|dƒr2t | ¡¡SdS)Nrjrcr)r„r…r!rjÚrandomÚchoicerc)r÷rxrxryÚ_get_eligible_cpuƒs

r¢c@sBeZdZdZddifddifgZddifddddifd	difd
difddifddifd
difddifddifg	Zddifddddifddifddifddifddifddifddifddifddifddifddifddifd difd!difd"difd#difgZerFed$difg7Zed%difg7Zed&difg7Zed'difg7Zer\ed(difg7Ze	rred)difg7Ze
rŒed*ejfifg7Ze
r¢ed+difg7Zer¸ed,difg7ZerÎed-difg7Zeräed.difg7Zerþed/dd0d1ifg7ZgZereddifg7Znedejfifg7Ze
rJed*ejd2fifg7Ze	r‚erned)ejd3fifg7Zned)ejfifg7Ze
ržed+eƒgfifg7Zd4ejfifd5difd6difd7difd8difgZerüed4ejfifg7Zed4ejfifg7ZeeeeZd9d:„ZdDd;d<„Zd=d>„Z e!d?d@„ƒZ"e!dAdB„ƒZ#dCS)ErDaA 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_percentrxZmemory_percentr™rrTrUZmemory_info_exZoneshoträÚparentsrÉr©©rZcmdlineZconnectionsÚkindÚallÚ	cpu_timesZcreate_timer½rwrZZmemory_inforŸÚniceZnum_ctx_switchesZnum_threadsZ
open_filesZppidrÙrpZusernameZuidsZgidsZterminalr]rkrgrlrcrjrfr^rhZgroupedF)rØirrÿZsuspendZresumer:ÚkillcCs
||_dSr¡)Ú_proc)ršrürxrxryr”ëszprocess_namespace.__init__ccsZt|ƒ}t |¡|D]>\}}}|r,| ¡t|j|ƒ}tj|f|ž|Ž}||fVqdS©z_Given a list of tuples yields a set of (fun, fun_name) tuples
        in random order.
        N)rr ÚshuffleÚclear_cacherŒr«r¸r=)ršÚlsr®Úfun_namer¥rËrµrxrxryÚiterîs
zprocess_namespace.itercCs|jj|jjdddS)z&Clear the cache of a Process instance.T)Z_ignore_nspN)r«Z_initrÉr™rxrxryr®ûszprocess_namespace.clear_cachecCs>|D]4\}}}d|}t||ƒsd|jj|f}t|ƒ‚qdS)z}Given a TestCase instance and a list of tuples checks that
        the class defines the required test method names.
        Ztest_z$%r class should define a '%s' methodN)r!rœrÚAttributeError)ÚclsZ
test_classr¯r°ræZ	meth_namerbrxrxryÚtest_class_coverageÿs
ÿz%process_namespace.test_class_coveragecCs`tdd„|jDƒƒ}tdd„|jDƒƒ}tdd„ttjƒDƒƒ}||B|A}|r\td|ƒ‚dS)NcSsg|]}|d‘qSr¥rxrrxrxryr
sz*process_namespace.test.<locals>.<listcomp>cSsg|]}|d‘qSr¥rxrrxrxryrscSsg|]}|ddkr|‘qS)rrærxrrxrxryrsz!uncovered Process class names: %r)rªr§ÚignoredrÏr„r…r†)r³ÚthisrµÚklassZleftoutrxrxryÚtestszprocess_namespace.testN)T)$rr¯r°r±ZutilsrµÚgettersr
r0r1r4r„Z
RLIMIT_NOFILEr-r3r/rr2ZsettersZNORMAL_PRIORITY_CLASSrZIOPRIO_CLASS_NONEZ
IOPRIO_NORMALr¢rýÚSIGTERMZkillersZCTRL_C_EVENTZCTRL_BREAK_EVENTr§r”r±r®Úclassmethodr´r¸rxrxrxryrDŒs¤	þ÷
ïû


c@s¦eZdZdZddifddddifddddifddifd	dd
difd	dd
difddddifd
dddifde ¡fifddddifddifddifddddifde ¡fifddifddifddifddifgZeräeddd
difg7Ze	røeddifg7Ze
reddifg7Zer$eddifg7Zer:eddifg7Ze
r`ed difg7Zed!d"ifg7Zd#difd$e ¡gfifd%difd&difgZeZed'd(„ƒZejZd)S)*rEzÝA 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’rxrZlogicalFTZ	cpu_statsr¨ZpercpuZdisk_io_countersZperdiskZdisk_partitionsr§Z
disk_usageZnet_connectionsr¦Znet_if_addrsZnet_if_statsriZpernicrrVr˜Zusersr—rdrerornrmZwin_service_iterZwin_service_get)ZalgZprocess_iterrr£Zcpu_times_percentccsLt|ƒ}t |¡|D]0\}}}tt|ƒ}tj|f|ž|Ž}||fVqdSr¬)rr r­rŒr„r¸r=)r¯r°r¥rËrµrxrxryr±Hs

zsystem_namespace.iterN)rr¯r°r±r~rÅr•r¹r.ÚHAS_GETLOADAVGr8r7r5rr„r…rµr§Ústaticmethodr±rDr´rxrxrxryrEsTîü
cCst |¡st|ƒ‚d|_|S)zA decorator to mark a TestCase class. When running parallel tests,
    class' unit tests will be run serially (1 process).
    T)ÚinspectZisclassrˆZ
_serialrun)r·rxrxryÚ	serialrunWsr¿cCsdd„}ttd||dS)zZDecorator which runs a test function and retries N times before
    actually failing.
    cSstd|tjddS)Nz%r, retryingr)rmrrr)r-rxrxryr*esz retry_on_failure.<locals>.logfunN)r'rîr(r*)r&rˆ)r(r*rxrxryrAasÿcs‡fdd„}|S)z,Decorator to Ignore AccessDenied exceptions.cst ˆ¡‡‡fdd„ƒ}|S)Ncs@zˆ||ŽWStjk
r:ˆdk	r,ˆs,‚t d¡‚YnXdS)Nzraises AccessDenied)r„ZAccessDeniedrRÚSkipTestr³©rµÚonly_ifrxryr¶osz9skip_on_access_denied.<locals>.decorator.<locals>.wrapperr·rº©rÂr´ryr/nsz(skip_on_access_denied.<locals>.decoratorrx©rÂr/rxrÃryr?lscs‡fdd„}|S)z3Decorator to Ignore NotImplementedError exceptions.cst ˆ¡‡‡fdd„ƒ}|S)NcsHzˆ||ŽWStk
rBˆdk	r*ˆs*‚dˆj}t |¡‚YnXdS)Nz4%r was skipped because it raised NotImplementedError)rrrRrÀ)r¥r¦rbrÁrxryr¶sÿz;skip_on_not_implemented.<locals>.decorator.<locals>.wrapperr·rºrÃr´ryr/~s
z*skip_on_not_implemented.<locals>.decoratorrxrÄrxrÃryr@|s
ú	127.0.0.1c
Cs@t t ¡¡(}| |df¡| ¡dW5QR£SQRXdS)z6Return an unused TCP port. Subject to race conditions.rrN)Ú
contextlibÚclosingÚsocketÚbindÚgetsockname)ZhostrãrxrxryrQ”scCsˆ|dkr|ttfkrd}t ||¡}z@tjdkrB| tjtjd¡| |¡|tj	kr`| 
d¡|WStk
r‚| ¡‚YnXdS)zBinds a generic socket.N©rr)ÚntÚcygwinrr^)
rrrÈr~rŸZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRrÉrÚlistenrvrÞ)ÚfamilyÚtypeÚaddrrãrxrxryrR›s



cCsrtjs
t‚tj |¡rt|ƒ‚t tj|¡}z"| |¡|tj	krL| 
d¡Wntk
rl| ¡‚YnX|S)zBind a UNIX socket.r^)
r„r
rˆr~rr‡rÈr‘rÉrrÎrvrÞ)rŸrÐrãrxrxryrS¬s


rËc
Cs´t t |t¡¡˜}| |¡| d¡| ¡}t |t¡}zJ| |¡| ¡}| ¡\}}||krz||fWW5QR£S| 	¡qPWnt
k
r¤| 	¡‚YnXW5QRXdS)z^Build a pair of TCP sockets connected to each other.
    Return a (server, client) tuple.
    r^N)rÆrÇrÈrrÉrÎrÊÚconnectrßrÞr)rÏrÑZllrZcaddrÚarxrxryrT»s


cCs’tjs
t‚d}}z@t|tjd}| d¡t tjtj¡}| d¡| |¡Wn6t	k
rˆ|dk	rr| 
¡|dk	r‚| 
¡‚YnX||fS)zƒBuild 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ˆrSrÈrZsetblockingr‘rÒrvrÞ)rŸZserverZclientrxrxryrUÒs


c	csìg}d}}z¨| ttjtjƒ¡| ttjtjƒ¡tƒrd| ttj	tjƒ¡| ttj	tjƒ¡t
r¬tr¬tƒ}tƒ}t
|ƒ\}}t|tjd}|||fD]}| |¡qœ|VW5|D]}| ¡qº||fD]}|dk	rÐt|ƒqÐXdS)z1Open as many socket families / types as possible.NrÔ)rÞrHrlrRrÈrrÚ
SOCK_DGRAMrrr
ÚHAS_CONNECTIONS_UNIXrJrUrS)ZsocksZfname1Zfname2rÖr4Ús1Ús2Zs3rxrxryrVés*

cCsddl}tr(tr(ts(t|tjƒs(t|ƒ‚|tjkršdd„| 	d¡Dƒ}t
|ƒdksZt|ƒ‚|D]"}d|krvdks^nt|ƒ‚q^tsŽt|ƒ}| |¡nb|tj
krÎt|tƒs¶t|ƒ‚tsÂt|ƒ}| |¡n.|tjkròt d|¡dk	süt|ƒ‚n
td	|ƒ‚dS)
z[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    rNcSsg|]}t|ƒ‘qSrx)rÓrrxrxryrsz%check_net_address.<locals>.<listcomp>rréÿz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r)Ú	ipaddressÚenumrr"rñÚIntEnumrˆrÈrrrrZIPv4AddressrròZIPv6Addressr„ZAF_LINKr"Úmatchr†)rÑrÏrÚZoctsZnumrxrxryrPs&
 

cCsTdd„}dd„}dd„}dd„}d	d
„}||ƒ||ƒ||ƒ||ƒ||ƒdS)z*Check validity of a connection namedtuple.cSsÔt|ƒdk}t|ƒdks$tt|ƒƒ‚|d|jks<t|jƒ‚|d|jksTt|jƒ‚|d|jkslt|jƒ‚|d|jks„t|jƒ‚|d|jksœt|jƒ‚|d|jks´t|jƒ‚|rÐ|d	|jksÐt|jƒ‚dS)
Né)rrÞrrr}rrr^r)	rrˆrdrÏrÐÚladdrÚraddrrÙrÉ)råZhas_pidrxrxryÚcheck_ntuple sz-check_connection_ntuple.<locals>.check_ntuplecSsð|jtttfkst|jƒ‚tdk	r:t|jtjƒsNt|ƒ‚nt|jtƒsNt|ƒ‚|jtkrÌt	 	|j|j
¡}t |¡Rz| 
|jddf¡Wn2t	jk
r¾}z|jtjkr®‚W5d}~XYnXW5QRXn |jtkrì|jtjksìt|jƒ‚dS)Nr)rÏrrr‘rˆrÛrñrÜrÓrÈrÐrÆrÇrÉrßÚerrorrZ
EADDRNOTAVAILrÙr„Ú	CONN_NONE)rårÖrrxrxryÚcheck_family,s
 
z-check_connection_ntuple.<locals>.check_familycSs†ttdtƒƒ}|jtjtj|fks,t|jƒ‚tdk	rLt|jtj	ƒs`t|ƒ‚nt|jt
ƒs`t|ƒ‚|jtjkr‚|jtj
ks‚t|jƒ‚dS)NÚSOCK_SEQPACKET)rŒrÈÚobjectrÐrrÕrˆrÛrñrÜrÓrÙr„rã)rårårxrxryÚ
check_typeAsÿÿz+check_connection_ntuple.<locals>.check_typecSs¬|j|jfD]š}|jttfkr†t|tƒs4tt|ƒƒ‚|s:qt|j	t
ƒsTtt|j	ƒƒ‚d|j	krjdksvnt|j	ƒ‚t|j|jƒq|jt
krt|tƒstt|ƒƒ‚qdS)Nriÿÿ)rßràrÏrrrñr–rˆrÐZportrÓrPZipr‘rò)rårÑrxrxryÚcheck_addrsMs"
z,check_connection_ntuple.<locals>.check_addrscSs†t|jtƒst|jƒ‚dd„ttƒDƒ}|j|ks<t|jƒ‚|jttfkrl|j	t
krl|jtjks‚t|jƒ‚n|jtjks‚t|jƒ‚dS)NcSs g|]}| d¡rtt|ƒ‘qS)ZCONN_rŠrrxrxryr\s
ÿzAcheck_connection_ntuple.<locals>.check_status.<locals>.<listcomp>)rñrÙròrˆrÏr„rÏrrrÐrrã)råZvalidsrxrxryÚcheck_statusZsz-check_connection_ntuple.<locals>.check_statusNrx)rårárärçrèrérxrxryÚcheck_connection_ntuples

rêcCsPzddl}t|dƒst‚Wn&tk
r@ddl}| |¡YSX| |¡SdS)z,Backport of importlib.reload of Python 3.3+.rNÚreload)Ú	importlibr!r‰Úimprë)ÚmodulerìrírxrxryrWps
cCsœtj tj |¡¡d}tjddkr:ddl}| ||¡Stjdd…dkrfddlm	}|||ƒ 
¡Sddl}|j 
||¡}|j |¡}|j |¡|SdS)Nrr}r)ÚSourceFileLoader)r~rÚsplitextrÒrrƒríZload_sourceZimportlib.machineryrïÚload_moduleÚimportlib.utilÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)rrŸrírïrìÚspecÚmodrxrxryrX}scCst |t¡dS)zRaise a warning msg.N)ÚwarningsrYÚUserWarning)rbrxrxryrY’scCsVt|ƒ}|j}t|ƒdks&|dtkr*dSt|ddƒ}t|tƒsDdStdd„|DƒƒS)z-Check if object is an instance of namedtuple.rrFÚ_fieldsNcss|]}t|ƒtkVqdSr¡)rÐrò)rŽÚnrxrxryÚ	<genexpr> sz is_namedtuple.<locals>.<genexpr>)rÐÚ	__bases__rr–rŒrñr§)rÚtÚbrërxrxryr[—s
c#sttrdnd‰d‰t|ˆd}‡‡fdd„t ¡ ¡Dƒ}t |¡}t ||¡zt
 |¡|VW5t	|ƒXdS)zÂCtx 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.sorFcs6g|].}tj |j¡dˆkrˆ|j ¡kr|j‘qS)r)r~rrðÚlowerr©rwÚextrxryr­sþú'copyload_shared_lib.<locals>.<listcomp>N)r"rJr„r…rhr r¡r>rIrHÚctypesZCDLL)rGÚdstÚlibsrârxrryrZ¤s


c	#sÔddlm}ddlm}d‰t|ˆd}‡fdd„t ¡ ¡Dƒ}trb|sbdd„t ¡ ¡Dƒ}t 	|¡}t
 ||¡d	}zt |¡}|VW5|d	k	rÆtjj
j}|jg|_||jƒ}|dkrÆ|ƒt|ƒXd	S)
zÖCtx 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)Úwintypes)ÚWinErrorz.dllrFcsFg|]>}|j ¡ ˆ¡rdtj |j¡ ¡krd|j ¡kr|j‘qS)r|Zwow64)rrrõr~rÒr©rrxryrÃs
ýrcSs(g|] }dtj |j¡ ¡kr|j‘qS)r{)r~rrÒrrrxrxryrÈsÿN)rr	r
rJr„r…rhr"r r¡r>rIZwindllZkernel32ÚFreeLibraryZHMODULEZargtypesZ_handlerHZWinDLL)	rGr	r
rrrâÚcfilerr8rxrryrZ¸s(





cCstdddS)NTr)r;rxrxrxryÚcleanup_test_procsåsrcCs
t |¡Sr¡)rÚexit)rÚframerxrxryrÜïrÝrÜ)N)F)TF)N)rN)N)N)rÅ)rË)r)r)°r±Z
__future__rÚatexitrÆrrr¸rir¾r~r r"ràr>rýrÈr:rsrrMrÐr—r«rúrrrr„rrrr	r
rrZpsutil._commonr
rrZpsutil._compatrrrrrrrrrRZ	unittest2rr‰Úcatch_warningsÚsimplefilterrƒrÛÚ__all__Úbuiltin_module_namesr"rfrr\r)Úmaxsizer,r!r r+rrŸr•r&r'Údecoder(r‘rZASCII_FSrr€r®rCÚ__file__r$r%ZHERErÖr!r…r-r.r¼r/r1r2ZHAS_NET_IO_COUNTERSr3r0r4r5rHrmr6rvr7r8ZHAS_THREADSÚgetuidZSKIP_SYSCONSr‰r#rèÚdevnullrÚregisterrÞrÏr*rŒrær‘rªrÇrÔr¨r’r»r<r>r=r9rørºr:r;rLrKr&rúrNrˆrOrMrHrBÚcontextmanagerrGrIrJrNrCZskipIfrBrFr¢rDrEr¿rAr?r@rQrRrSrTrUrVrPrêrWrXrYr[rZrrxrxrxryÚ<module>sü



Ý-



ÿ






 0'
&-

X
%:
ÿ


ÿÿ
!



1
[	
B





R
,

Back to Directory File Manager