bgf dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlZddlm Z ddlm!Z!dd lm"Z"dd lm#Z#dd lm$Z$dd lm%Z%dd l&m'Z'ddl&m(Z(ddl&m)Z)ddl&m*Z*ddl+m,Z,ddl+m-Z-ddl+m.Z.ddl+m/Z/ddl+m0Z0ddl+m1Z1ddl+m2Z2ddl+m3Z3 ddlm4Z4nF#e5$r>ej65ej7dddl4Z4dddn #1swxYwYYnwxYwej8dkrddl9Z9ndZ9e#rddl:m;Z;gdZde j?vZ@d e j?vpd!e j?vZAe@peAZBd"e j?vZCejDd#kZEe(d$ZFe"reFd%kZGeFd&kZHnd'ZGd'ZHd(ZId)ZJd*ZKd+ZLeBreId,zZIeLd,zZLeJd-zZJeKd,zZKe jMd.krd/e jNzZOnd0e jNzZOe1d1ZPe,rd2Qd3d4ZRnd5ZRejSTd6vZUe jVWe jVXe jVYeZd7d7Z[e j?\d8e jVXe[d9Z]e jVWe jVYeZZ^e#oe$ Z_e`ejad:Zbe`ed;Zce`ed<Zde`ejad=Zee`ejad>Zfe`ejad?Zge`ed@Zhe`ejadAZie`ejadBZje`ejadCZke`edDZl eloemejnZon #ep$rd'ZoYnwxYwe`edEZqe`edFZre`ejadGZse"se oe jtdkZudHZvev\ZwZxeye jzdIZ{ej|e{j}dJe~eDZeedKeZeZeZGdLdMejZdNZeddOZedPZdQZedRZedSZejeLfdTZddUZdVZdWZGdXdYeZeejdeLdZ[d\Zee.efdeLdZ[dd^ZeedeLdZ[d_Zd`ZdaZejdbZddcZddeZGdfdgejZee_GdhdieZeje>djGdkdleZdmZdnZGdodpZGdqdrZdsZeIfdtZdduZddvZddxZeedfdyZejfdzZdd|Zd}Zejd~ZdZdZdZdZdZdZe#rejddZnejddZej|dZe#rejejddSdS)z Test utilities. )print_functionN)AF_INET)AF_INET6) SOCK_STREAM)AIX)LINUX)MACOS)POSIX)SUNOS)WINDOWS) bytes2human)memoize) print_color) supports_ipv6)PY3)FileExistsError)FileNotFoundError)range)super)u)unicode)which)mockignore)wait_pid)EAPPVEYORDEVNULLGLOBAL_TIMEOUTTOLERANCE_SYS_MEM NO_RETRIESPYPY PYTHON_EXEPYTHON_EXE_ENVROOT_DIR SCRIPTS_DIR TESTFN_PREFIXUNICODE_SUFFIXINVALID_UNICODE_SUFFIX CI_TESTINGVALID_PROC_STATUSESTOLERANCE_DISK_USAGEIS_64BITHAS_CPU_AFFINITY HAS_CPU_FREQ HAS_ENVIRONHAS_PROC_IO_COUNTERS HAS_IONICEHAS_MEMORY_MAPSHAS_PROC_CPU_NUM HAS_RLIMITHAS_SENSORS_BATTERY HAS_BATTERYHAS_SENSORS_FANSHAS_SENSORS_TEMPERATURES MACOS_11PLUS MACOS_12PLUSCOVERAGEpyrun terminate reap_childrenspawn_testproc spawn_zombiespawn_children_pair ThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespace print_sysinfochdir safe_rmpath create_exe get_testfn get_winverkernel_version call_until wait_for_pid wait_for_filecheck_net_address get_free_port bind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_sockets reload_moduleimport_module_by_pathwarncopyload_shared_lib is_namedtuple__pypy__rGITHUB_ACTIONS CIBUILDWHEEL COVERAGE_RUNlctjd}ttt|ddd}|dkrdt jtj dddgdd id }ttt|ddd}|S) Nr.) z-sS-cz-import platform; print(platform.mac_ver()[0])SYSTEM_VERSION_COMPAT0T)envuniversal_newlines) platformmac_vertuplemapintsplit subprocess check_outputsys executable) version_strversions h/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib64/python3.11/site-packages/psutil/tests/__init__.py macos_versionrs"$$Q'KC[..s33BQB78899G(!-?   )#.#    C!2!23!7!7!;<<== N)rk) rFrkiPirrjavaz $psutil-%s-z @psutil-%s-u-ƒőősfutf8surrogateescapeufÀ€)asciizus-asciiz..PSUTIL_SCRIPTS_DIRscripts cpu_affinitycpu_freq getloadavgenvironionice memory_mapsnet_io_counterscpu_num io_countersrlimitsensors_battery sensors_fanssensors_temperaturesthreadscd}tj}ttdd}t r%tjdkr|tj|d<||fStrtj|fStr|tjp|tj tjpZ|tdtjddzp-|tj}|st!d||fStj tj}tj |s J|||fS)Nc tj|dgtjtj|S#t$rYdSwxYw)Nz-V)stdoutstderr)rx check_callPIPE Exception)exes r~attemptz_get_py_exe..attempts_   !d JOJO M M M M J   44 s -1 ??_base_executable)r__PYVENV_LAUNCHER__z python%s.%srjz"can't find python exe real abspath)osrcopygetattrrzr version_infor{rer pathrealpathrpsutilProcessr ValueErrorexists)rrpbasers r~ _get_py_exersx *//  C 3*D 1 1D3#v--$2B&)^ !"Sy ~s""   GCN # # , GBG$$S^44 5 5 , GE-#*:2A2*>>?? @ @ , GFN$$((** + +  CABB BCxgs~..w~~c""''C''"Cxrzr+cbg|],}|dtt|-S)STATUS_ startswithrr.0xs r~ rsB333a,,y113wvq))333rAF_UNIXcFeZdZdZfdZdZdZdZdZdZ dZ xZ S) rEz6A thread task which does nothing expect staying alive.ctd|_d|_t j|_dS)NFMbP?)r__init___running _interval threadingEvent_flag)self __class__s r~rzThreadTask.__init__!s:  _&& rcN|jj}d||jt|fzS)Nz<%s running=%s at %#x>)r__name__rid)rnames r~__repr__zThreadTask.__repr__'s&~&'44*IIIrc.||SN)startrs r~ __enter__zThreadTask.__enter__+s  rc.|dSr)stop)rargskwargss r~__exit__zThreadTask.__exit__/s rc|jrtdtj||jdS)zStart thread and keep it running until an explicit stop() request. Polls for shutdown every 'timeout' seconds. zalready startedN)rrrThreadrrwaitrs r~rzThreadTask.start2sL = 0.// /t$$$ rcd|_|j|jr"tj|j|j dSdS)NT)rrsettimesleeprrs r~runzThreadTask.run;sW  m ' Jt~ & & &m ' ' ' ' 'rch|jstdd|_|dS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)rrjoinrs r~rzThreadTask.stopAs3} 0.// /  r) r __module__ __qualname____doc__rrrrrrr __classcell__)rs@r~rErEs@@''''' JJJ''' rrEcFtjfd}|S)NcP |i|S#t$rtwxYwr)rrA)rrfuns r~wrapperz&_reap_children_on_err..wrapperOsD 3''' '    OOO  s % functoolswraps)rrs` r~_reap_children_on_errrNs8_S Nrc |dt|dt|dtj|dtt rd}|d||t } t|d|z}td |g}tj |fi|}t |t|d d t|nT#t|wxYwtj |fi|}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 attempts to make sure the process is in a reasonably initialized state. The process is registered for cleanup on reap_children(). stdinrcwdrp creationflagsNz:from time import sleep;open(r'%s', 'w').close();sleep(60);rmTdeleteempty) setdefaultr rgetcwdr&r rRrPr%rxPopen_subprocesses_startedaddrWrVpid)cmdkwdsCREATE_NO_WINDOWtestfnpylinesprocs r~rBrBYsd OOGW%%%OOHg&&&OOE29;;'''OOE>***;% )9::: {    "$*+FtV,C$S11D11E ! % %e , , , &T : : : :     K     ----!!%(((UY Ls )ADD&cd}ttj} tjdtj|dtd}trt|d\}}nt|\}}tj |j }tt|dd }t|tj |}||ft#||t#|SS#t#||t#|wwxYw) 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(). Ndirzl 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)rTFr)rRrrtextwrapdedentrbasenamer%r r?rrrrvrW _pids_startedrrP)tfilerssubpchildgrandchild_pid grandchilds r~rDrDs@ E BIKK ( ( (F OO7##F++++ZZZ 9 : :  #333KD%%((KD%tx((]6$eLLLMM.)))^N33 z"F         F        s CD#D>c|tjsJt}tjd|z}d}t |} |tt|\}}| \}} tj | gggtt| d}t|tj|}t#|jd||f||t)||t)|SS#|wxYw#|t)||t)|wwxYw)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) Nzret == psutil.STATUS_ZOMBIE)rr rRrrr[ settimeoutr!r?acceptselectfilenorvrecvrrrrUstatuscloserP) unix_filesrcrsockparentconn_zpidzombies r~rCrCs << I /   C E I & &D '''c ++--a  M4;;==/2r> B B Btyy''D   d # # #^D))F v}&C D D DF# JJLLL I         JJLLLL I        s&AF BE+!F+FF7F;c |dd|ddt} t|d5}||dddn #1swxYwYt t |jgfi|}t|j||fS#t$rt|wxYw)zRun python 'src' code string in a separate interpreter. Returns a subprocess.Popen instance and the test file where the source code was written. rNrwt) rrRopenwriterBr%rrVrrrP)rrsrcfilefrs r~r?r?s   OOHd###OOHd###llG '4  A GGCLLL               z162;;d;;TXg G s/B* A." B*.A22B*5A263B**Cc trdnd}|dtj|dtj|dd|d|t |t rt j|}tj|fi|}t |tr| t\}}n| \}}|jdkrt||rt!||d r |d d }|S) zUrun cmd in a subprocess and return its output. raises RuntimeError on error. rrrrrqTrtimeout N)r rrxr isinstancestrshlexrwrrrr communicater! returncode RuntimeErrorraendswith)rrflagsprrs r~shr/s: ! 'IIaEOOHjo...OOHjo...OO($///OOOU+++#sk#%%%%Aa    )~>>|q6"""  V  t Mrc d d fd} fd fd}d}|} t|try|||t|tjtjfr ||t|tr|n|j}t j|r J|St|tjtjfry ||t|tjtjfr ||t|tr|n|j}t j|r J|St|tjry|||t|tjtjfr ||t|tr|n|j}t j|r J|Std|z#t|tjtjfr ||t|tr|n|j}t j|r J|wxYw)aTerminate 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. cht|tjrts|n||t r]t|tjrE t j|j|S#t j $rYdSwxYwdSdSr) r&rxrrrr rrr NoSuchProcess)procr#s r~rzterminate..waits dJ, - - c  IIKKKK IIg     z$ (899  ~dh//44W==='         s.+BB-,B-ctrtr tj}tr/|tjkr|tj||dSr)r resignalSIGKILLr send_signalSIGCONT)r3sigs r~sendsigzterminate..sendsigs^  !^ !.C  -SFN**   V^ , , , rc |n@#t$r3}tr |jdkrn|jtjkrYd}~nd}~wwxYw||S)N)OSErrorr winerrorerrnoESRCH)r3r#errr:r9rs r~term_subprocess_procz'terminate..term_subprocess_proc%s~  GD#        3<1,,ek))   tD'"""s  A )AA cb |n#tj$rYnwxYw||Sr)rr2)r3r#r:r9rs r~term_psutil_procz#terminate..term_psutil_proc/sR  GD#    #    D tD'"""s ""c tj|}||S#tj$rtrt ||cYSYdSwxYwr)rrr2r r)rr#r3rDs r~term_pidzterminate..term_pid6sy 3>#&&D $#D'22 2 # . . . .W----- . . . .s#&AAc|jr|j|jr|j|jr|jdSdSr)rrrr)r3s r~ flush_popenzterminate..flush_popen@sl ; K      ; K      :  J         rz wrong type %r) r&rvrxrrr pid_existsr TypeError) proc_or_pidr9 wait_timeoutrBrFrHr.rr:rDrs ` @@@r~r@r@s   ##############33333 A / a   18A|,, a**FL9 : :  KNNNa%%0aa15$S))..3..).FNFL9 : : 1##A|44 a**FL9 : :  KNNNa%%0aa15$S))..3..).:+ , , 1''<88 a**FL9 : :  KNNNa%%0aa15$S))..3..). Oa/00 0 a**FL9 : :  KNNNa%%0aa15$S))..3..)))))s G621G6%G6$G66A/I%ctj|}tr/t}t |t/t r/t }t |t /|rf|D]}t |dtj|t\}}|D]1}td|zt |tj 0dSdS)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 recursive is True it also tries to terminate and wait() all grandchildren started by this process.  recursiveN)rLr"z0couldn't terminate process %r; attempting kill())r9) rrchildrenrpopr@r wait_procsr!rar5r6)rOrPrrr.ralives r~rArAZs~((9(==H $((**$  !!#  - , ,A ad + + + + +$X~FFF5 - -A CaG H H H aV^ , , , , , -- - -rctstdd}tjd}|D]"}|s|dkr||z }"|st d|zd}d}|d}t|d}t|dkrt|d}t|dkrt|d}|||fS) z"Return a tuple such as (2, 6, 36).z not POSIXrjrizcan't parse %rrr) r NotImplementedErrorrunameisdigitrrwrvlen)rrXcminormicronumsmajors r~rTrTs /!+... A HJJqME  99;; !s(( FAA  3)E1222 E E 773<.wrappersC  3//////~C{. C(((JJLLLHHHH    s A2AA)rr decorator)rrrs`` r~__call__zretry.__call__sF           $!r) rrrrrrrsrryrr~rkrksl%       &&&rrkr)rmrpr#rochtj|trtjddSdS)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)rrr rr)rs r~rVrVs<  N3 4rTct|d5}|}dddn #1swxYwY|s|sJ|rt||S)z8Wait for a file to be written on disk with some content.rbN)rreadrP)fnamerrr datas r~rWrWs eT  avvxx  t E Ks 266c<|}t|sJ|S)zVKeep calling function for timeout secs and exit if eval() expression is True. )eval)rexprrets r~rUrUs% #%%C ::: JrcDd} tj|}tj|jr t jt j|}nt jtj|}tr |dS||dS#t$rYdSwxYw)z?Convenience function for removing temporary test files or dirs.c\tjtz}tj|kry |S#t$rYn7t$r+}|}t dt |zYd}~nd}~wwxYwtjdtj|ky|)Nz ignoring %sr|)rr!r WindowsErrorrar'r)rrrrrAs r~ retry_funzsafe_rmpath..retry_funs )++.ikkG## 1suu $    1 1 1]c#hh/00000000 1 Jt   ikkG## s > A> A>!A99A>N) rstatS_ISDIRst_moderpartialshutilrmtreeremover r)rrstrs r~rPrPs"  WT]] < # # 5#FM488CC#BIt44C   CEEEEE IcNNNNN      sA=B B BBcR tj|dS#t$rYdSwxYw)z.Convenience function for creating a directory.N)rmkdirrrs r~ safe_mkdirr/s:        s  &&c#Ktj} tj|dVtj|dS#tj|wxYw)z@Context manager which temporarily changes the current directory.N)rrrO)dirnamecurdirs r~rOrO7s]Y[[F   s AAc tj|r J||rtdst jdt |trtj d}t |ts J|ttdd5}| |dddn #1swxYwY tjd|jd|gt#|jdS#t#|jwxYwt%jt(|t*r=tj|}tj||jt,jzdSdS) z1Creates an executable file in the given location.gcczgcc is not installedz #include int main() { pause(); return 1; } z.csuffixrNz-o)rrrrrFSkipTestr&boolrrr'rrRrrxrrrPrcopyfiler%r rchmodrS_IEXEC)outpathc_coder rs r~rQrQBsw~~g&&//// & 9U|| <#$:;; ; fd # # _F&#&&....& *D)))4 0 0 A GGFOOO                 !5!&$"@ A A A      K      G,,,  9!!B HWbj4<7 8 8 8 8 8 9 9s6CCC$DD-rUc tjt||}tj|stj|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)prefixrr)tempfilemktempr)rrrr)rrrs r~rRrR`sN *mFLLLw~~d## *7##D)) )*rc|eZdZdZeejds ejjZe sdZ e j dZ dSdS)TestCasec|jj}|dsd|z}|d|jjd|jS)Nzpsutil.z psutil.tests.ri)rrrr_testMethodName)rfqmods r~__str__zTestCase.__str__usT) ** ,#e+E EE4>***D,@,@B BrassertRaisesRegexcdSrrzrs r~runTestzTestCase.runTests Drc/KdVdSrrz)rrkws r~subTestzTestCase.subTests EEEEErN)rrrrrcrFrassertRaisesRegexprrr contextlibcontextmanagerrrzrr~rrqsBBB 78$&9 : :A$-@      "   # "    rrc8eZdZdZd dZdZdZdZdZd Z dS) rKzUTest class providing auto-cleanup wrappers on top of process test utilities. rUNc^t||}|t||S)N)rr)rR addCleanuprP)rrrrs r~rRzPsutilTestCase.get_testfns-&c222  U+++ rcTt|i|}|t||Sr)rBrr@)rrrrs r~rBzPsutilTestCase.spawn_testprocs----  5))) rct\}}|t||t|||fSr)rDrr@)rchild1child2s r~rDz"PsutilTestCase.spawn_children_pairsD,..  6***  6***rct\}}|t||t|||fSr)rCrr@)rrrs r~rCzPsutilTestCase.spawn_zombiesB%  6***  6***rct|i|\}}|t||t||Sr)r?rrPr@)rrrrrs r~r?zPsutilTestCase.pyrunsE---w  W---  5))) rc*|tjtj|jt |tjtjfrh|rJ |}td|z#tj$rYnwxYw| dtj |jrJ|j| |jtj dS)Nz3Process.status() didn't raise exception (status=%s)rr") assertRaisesrr2rrr&r is_runningrAssertionErrorrrI assertNotInpids)rr3rs r~assertProcessGonez PsutilTestCase.assertProcessGones &.III dV^V\: ; ; !(( ( (( =%&35;&<==='     IIaI $TX..8888. 6;==11111s.BB&%B&rUN) rrrrrRrBrDrCr?rrzrr~rKrKs}         2 2 2 2 2rrKzunreliable on PYPYceZdZdZdZdZdZerdndZdZ e j Z e ejdZedZed Zd Zd Zd Zd ZdZdZdZ ddZdZdS)rJaTest 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) rkrrT PSUTIL_DEBUGc.tjddS)NF)r _set_debugclss r~ setUpClasszTestMemoryLeak.setUpClasss%     rc8tj|jdSr)rr_psutil_debug_origrs r~ tearDownClasszTestMemoryLeak.tearDownClasss#011111rc`|j}t|d|jS)Nuss) _thisprocmemory_full_inforrss)rmems r~_get_memzTestMemoryLeak._get_mems+n--//sE37+++rcttr|jS|jSr)r rnum_fds num_handlesrs r~ _get_num_fdszTestMemoryLeak._get_num_fdss2  0>))++ +>--// /rcP|jrt|dtjdSdS)Nyellow)colorfile)verboserrzr)rmsgs r~_logzTestMemoryLeak._logs3 < > 8#* = = = = = = > >rc<|}|||}||z }|dkr|d|z|dkr5trdnd}|dkr|dz }|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. rzHnegative diff %r (gc probably collected a resource from a previous test)fdhandlerVrz unclosed z after calling N)rcallfailr )rrbeforeafterdifftype_rs r~ _check_fdszTestMemoryLeak._check_fdss ""$$ #!!##v~ !88))=?CDEE E !88!/DDxEaxx 7;ttUUUCCHC))C.. 8rcFtjd|}t|D]}||}~~tjd|}|tjg||z }|S)zGet 2 distinct memory samples, before and after having called fun repeatedly, and return the memory difference. rV) generation)gccollectrrr assertEqualgarbage)rrtimesmem1rrmem2rs r~ _call_ntimeszTestMemoryLeak._call_ntimess a    }}u  A))C..C33 a    }} R(((d{ rc g}d}|}td|dzD]}|||} d|dt| dt| |z d|} || | |kp| |k} | r|dkr|| dS|dkrt || ||z }| }|d|)NrrVzRun #z : extra-mem=z , per-call=z, calls=z. )rrr appendrprintrr) rrrrn tolerancemessagesprev_memincreaseidxrrsuccesss r~ _check_memzTestMemoryLeak._check_mem#sGaK((  C##C//CC[%%%%{3;'?'?'?'?HC OOC Y&9#/G 77IIcNNN!88GGG #!ii (++,,,rc|Srrz)rrs r~rzTestMemoryLeak.call;s suu rNc||n|j}||n|j}||n|j}||n|j} |dks Jd|dks Jd|dks Jd|dks Jdn.#t$r!}t t |d}~wwxYw|||||| ||||dS) zTest a callable.NrVztimes must be >= 1rzwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rrnr) r warmup_timesrnrrrr'rrr)rrrrrnrrAs r~executezTestMemoryLeak.execute>s#* '3'?||" $0''dl!*!6IIDN  'A:::3:::1$$$&A$$$a<<>>#;>>>> ' ' 'SXX&& & ' #|,,,  5'YOOOOOsAA// B9BBc 6fd}j|fi|dS)znConvenience method to test a callable while making sure it raises an exception on every call. c4dSr)r)rwrrsr~rz*TestMemoryLeak.execute_w_exc..callVs   c3 ' ' ' ' 'rN)r)rrwrrrs``` r~ execute_w_exczTestMemoryLeak.execute_w_excRsJ ( ( ( ( ( ( (  T$$V$$$$$r)NNNN)rrrrrrrr,rnrrrrrrgetenvr classmethodrrrrrrrrrrrrzrr~rJrJs;< ELI%bbAGG  Iibi7788!![!22[2,,, 000 >>>!!!&   ---0CGPPPP(%%%%%rrJc ddl}ddl}ddl}ddl}ddl} ddl}n#t $rd}YnwxYw ddl}n#t $rd}YnwxYw|}tj r"tdrtd|d<ntj r dtjdz|d<ntjryddt%t&tjz|d<t+tdr$|dxxd tjzz cc<n,tjdtj|d<d t3tjtjgz|d <tjrtjd |d <d tjtjtj g|d <tC|dd|d<||dxxd|j"zz cc<tjrqtdr=tddg}t'|#dd|d<nd|d<tj$d} | r| |d<tKj&|d<|'} | dd | d|d<|j(tj)*d|d<|j+*d|d<|,|d<tZj./d|d<t[j0|d<tb|d <tj2|d!<t[j3|d"<tj4|d#<d$tkd%tj6Dz|d&<tj7} tq| j9d'tu| j;d(tu| j<|d)<tj=} tq| j9d'tu| j;d(tu| j<|d*<t}tj?|d+<tj@A} | Bd,d|C| |d-<td.tJjE/|FD])\}}t|d0zd1d|tJjE/*td.tJjE/tJjGHdS)2Nr lsb_releasezlsb_release -d -sOSz Darwin %szWindows  win32_editionz, archrjkernelpython __version__z not installedpipz (wheel=%s)rz --versionr$rVglibcz fs-encodinglangz%Y-%m-%d %H:%M:%Sz boot-timeruser~homerpyexehostnamePIDcpusz%.1f%%, %.1f%%, %.1f%%c@g|]}|tjz dzS)d)r cpu_countrs r~rz!print_sysinfo..s+IIIq6#%%%+IIIrloadavgz%, used=z, total=memoryswaprrr3zF======================================================================r:17)I collectionsdatetimegetpasslocalepprintr ImportErrorwheel OrderedDictrrrr/OSXrrrsr rrur' win32_verrcrsystemr}list architecturemachiner rXpython_implementationpython_versionpython_compilerrrrwlibc_verrzgetfilesystemencoding getlocale fromtimestamp boot_timestrftimenowgetuserrr expanduserrr%nodegetpidr rtrvirtual_memoryrvpercentr usedtotal swap_memoryrZrras_dictrQpformatrritemsrflush)r'r(r)r*r+rr-infooutrrrr#pinfokvs r~rNrN\sOOONNNMMMMMM    " " $ $D| Gm,, G+,,T G 8#3#5#5a#88T G#(( X')) * *#,#,,T 8_ - - : JJJ$!7!9!99 9JJJ ( 1 1 1 183C3E3E3EFT 99 X " $ $%%)9););(<<>>DL |-!))!,XYY&((!! "" $%%DN#}o>>DK  U }u'888 | << *e[)**Cc((....q1DKK)DK     "  DM355D     D#AwwwQ0DL )77$H%899 $((**334GHHDL??$$DL7%%c**DL)++DKDM}D)++DK#%%DL. IIV5F5H5HIIIJJLDO   ! !C CK+ch////SY1G1G1GIDN    D DL;ty1111;tz3J3J3JLDLv{}}%%DL N   $ $ & &E IImT""">>%((DL ($$$$ ::1 AGGGGQQ'cj99999 ($$$$Js **3 AActj}t|dr|St|dr&t j|SdS)Nrrr)rrrcrrandomchoicer)r.s r~_get_eligible_cpurTs`Aq)/yy{{ N # #/}Q^^--... 1rceZdZdZddifddifgZddifddddifd difd difd difd difd difddifddifg Zddifddddifddifddifddifddifddifddifddifddifddifddifddifd difd!difd"difd#difgZer$ed$difgz Zed%difgz Zed&difgz Zed'difgz Zer ed(difgz Ze r ed)difgz Ze red*e j fifgz Ze r ed+difgz Zer ed,difgz Zer ed-difgz Zer ed.difgz Zer ed/dd0d1ifgz ZgZer eddifgz Znede jfifgz Ze red*e j d2fifgz Ze r"ered)e jd3fifgz Zned)e jfifgz Ze red+egfifgz Zd4ejfifd5difd6difd7difd8difgZered4ejfifgz Zed4ejfifgz ZeezezezZd9Zd?d:Zd;Z e!d<Z"e!d=Z#d>S)@rLaA 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_percentrzmemory_percentrHrPrOTrmemory_info_exoneshotrparentsrrrcmdline connectionskindall cpu_times create_timerrr memory_infornicenum_ctx_switches num_threads open_filesppidrrusernameuidsgidsterminalrrrrrrrrrgroupedF)r irr7suspendresumer@killc||_dSr)_proc)rr3s r~rzprocess_namespace.__init__s  rc#Kt|}tj||D]L\}}}|r|t |j|}t j|g|Ri|}||fVMdSz_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)r2rRshuffle clear_cacherrqrr)rlsrufun_namerrrs r~iterzprocess_namespace.iter!s"XXr$& " " HdD #  """$*h//C#C7$777$77C/ ! ! ! !  " "rcR|j|jjddS)z&Clear the cache of a Process instance.T) _ignore_nspN)rq_initrrs r~ruzprocess_namespace.clear_cache.s' T:::::rc|D]<\}}}d|z}t||s!|jjd|d}t|=dS)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)rcrrAttributeError)r test_classrvrwr meth_namers r~test_class_coveragez%process_namespace.test_class_coverage2sn ! * *NHa(*I:y11 *(111999>$S))) * * *rctd|jD}td|jD}tdttjD}||z|z }|rt d|zdS)Ncg|] }|d Sr[rzrs r~rz*process_namespace.test..@s***QAaD***rcg|] }|d Sr[rzrs r~rz*process_namespace.test..As111qt111rc*g|]}|ddk|S)rrrzrs r~rz*process_namespace.test..Bs!CCC1qts{{Q{{{rz!uncovered Process class names: %r)rr_ignoredrrrr)rthisrklassleftouts r~testzprocess_namespace.test>s**#'***++11S[11122CCFN 3 3CCCDD'>U*  L@7JKK K L LrN)T)$rrrrutilsrgettersr r3r4r7r RLIMIT_NOFILEr0r6r2r r5settersNORMAL_PRIORITY_CLASSrIOPRIO_CLASS_NONE IOPRIO_NORMALrTr5SIGTERMkillers CTRL_C_EVENTCTRL_BREAK_EVENTr_rrxrur rrrzrr~rLrLsu 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$%%ZR())YB'((-]B+,,(Xr2&''>X 47<==.^R,--)YB'(()YB'((-]B+,,=]BE(:;<<G DVUB'((Vf:=rBCCJX 4lCRHIIB  B F$CDD *B/ B 2r b" R GF]V%8$;R@AA]V%<$?DEE '/G #g -C " " " ";;; * *[ *LL[LLLrrLceZdZdZddifddddifddddifddifd dd difd dd difd dd difd dddifdejfifddddifddifddifddddifdejfifddifddifddifddifgZer eddd difgz Ze r eddifgz Ze r eddifgz Ze r eddifgz Ze r eddifgz Ze red difgz Zed!d"ifgz Zd#difd$ejgfifd%difd&difgZeZed'ZejZd(S))rMzA 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<rzr logicalFT cpu_statsr`percpudisk_io_countersperdiskdisk_partitionsr_ disk_usagenet_connectionsr^ net_if_addrs net_if_statsrpernicrIrrGusersrCrrrrrwin_service_iterwin_service_get)alg process_iterrRrVcpu_times_percentc#Kt|}tj||D]6\}}}tt|}t j|g|Ri|}||fV7dSrs)r2rRrtrrrr)rvrwrrrs r~rxzsystem_namespace.iter{s "XXr$& " " HdD&(++C#C7$777$77C/ ! ! ! ! " "rN)rrrrrrrBrr1HAS_GETLOADAVGr;r:r8r rrrr_ staticmethodrxrLrrzrr~rMrMHsD b" b9e,- b9d+, b" b8U+, b8T*+ R)T!23 B .   + B0 R R B4 01   + R B "b 2r"%G(8Zh%5677,\2r*++6+R455.^R,--1&B/008'R011& 2677 R ))*-r2 B b"% G C " "\ ",?rrMcPtj|s J|d|_|S)zA decorator to mark a TestCase class. When running parallel tests, class' unit tests will be run serially (1 process). T)inspectisclass _serialrun)rs r~ serialrunrs/ ?5 ! !((5(( !E Lrc8d}ttd||S)zZDecorator which runs a test function and retries N times before actually failing. cBtd|ztjdS)Nz %r, retryingr$)rrzr)rws r~rpz retry_on_failure..logfuns" ns"444444rN)rmr#rnrp)rkr)rnrps r~rIrIs3555 >4    rcfd}|S)z,Decorator to Ignore AccessDenied exceptions.cJtjfd}|S)Ncn |i|S#tj$rstjdwxYw)Nzraises AccessDenied)r AccessDeniedrFr)rrronly_ifs r~rz9skip_on_access_denied..decorator..wrappers^ ?sD+F+++& ? ? ?&"'(=>>>  ?s )4rrrrs` r~rxz(skip_on_access_denied..decorators>    ? ? ? ? ?   ?rrzrrxs` r~rGrGs$      rcfd}|S)z3Decorator to Ignore NotImplementedError exceptions.cJtjfd}|S)Ncx |i|S#t$r$sdjz}tj|wxYw)Nz4%r was skipped because it raised NotImplementedError)rWrrFr)rrrrrs r~rz;skip_on_not_implemented..decorator..wrappersi -sD+F+++& - - -&"L %',,,  -s .9rrs` r~rxz*skip_on_not_implemented..decorators>    - - - - -   -rrzrs` r~rHrHs$      r 127.0.0.1ctjtj5}||df|dcdddS#1swxYwYdS)z6Return an unused TCP port. Subject to race conditions.rrVN)rclosingsocketbind getsockname)hostrs r~rYrYs  FMOO , ,% 4)!!!$%%%%%%%%%%%%%%%%%%s1A$$A(+A(c||ttfvrd}tj||} tjdvr+|tjtjd|||tj kr| d|S#t$r| wxYw)zBinds a generic socket.NrUr)ntcygwinrVr) rrrrr setsockopt SOL_SOCKET SO_REUSEADDRrrlistenrr)familytypeaddrrs r~rZrZs |7H"555 = & &D  7* * * OOF-v/BA F F F $ 6% % % KKNNN   s A4B CcptjsJtj|r J|t jt j|} |||t jkr| dn##t$r| wxYw|S)zBind a UNIX socket.r) rr rrrrrrrrrr)rrrs r~r[r[s <<w~~d##))T)) # = . .D $ 6% % % KKNNN    Ks :B B3rcFtjtj|t5}|||d|}tj|t} |||} |\}}||kr||fcdddS| B#t$r| wxYw#1swxYwYdS)z^Build a pair of TCP sockets connected to each other. Return a (server, client) tuple. rTN) rrrrrrrconnectr rr=)rrllr[caddras r~r\r\sH  FM&+>> ? ?2   ! ~~ M&+ . .  IIdOOOMMOOE ))++45==q6       GGIII  s+ADA C3C33 DDDDctjsJdx}} t|tj}|dtjtjtj}|d||n;#t$r.|| || wxYw||fS)zBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. Nrr) rr r[rr setblockingrrrr)rserverclients r~r]r]s <<FV !$V-?@@@1v~v/ABB1t    LLNNN   LLNNN  F s BB8Cc#Kg}dx}} |ttjtj|ttjtjt rn|ttjtj|ttjtjtrmtrft}t}t|\}}t|tj}|||fD]}|||V|D]}| ||fD]}|t|dS#|D]}| ||fD]}|t|wxYw)z1Open as many socket families / types as possible.Nr)rrZrrr SOCK_DGRAMrrr HAS_CONNECTIONS_UNIXrRr]r[rrP)socksfname1fname2s1s2s3rrs r~r^r^s EFV# [1CDDEEE [1BCCDDD ?? J LLV_f6HII J J J LLV_f6GHH I I I  ) \\F\\F$V,,FB!&v/@AAAB"b\   Q   A GGIIIIf% # #E E""" # #  A GGIIIIf% # #E E""" #s E"F3Gcddl}tr2tr+ts$t |tjs J||t jkrd|dD}t|dks J||D]}d|cxkrdks nJ|tst|}| |dS|t j krLt |ts J|tst|}||dS|tjkr!t#jd| J|dSt'd|z) z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNc,g|]}t|Srz)rvrs r~rz%check_net_address..?s0001A000rrirz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r) ipaddressenumrr$r&IntEnumrrrwrZr IPv4Addressrr' IPv6AddressrAF_LINKrdmatchr)rrroctsnums r~rXrX7s 88D8&$,//7777/ 00 30004yyA~~~t~~~ ) )C????s?????D???? !4==Dd##### 6? " "$$$**d**$ !4==Dd##### 6> ! !x5t<<HH$HHHHH,v5666rcd}d}d}d}d}||||||||||dS)z*Check validity of a connection namedtuple.cDt|dk}t|dvsJt||d|jksJ|j|d|jksJ|j|d|jksJ|j|d|jksJ|j|d|jksJ|j|d|jksJ|j|r |d |jksJ|jdSdS) Nr)r<rrrVrjrrrr<)rZrrrladdrraddrrr)rhas_pids r~ check_ntuplez-check_connection_ntuple..check_ntupleSs5d))q.4yyF"""CII"""Aw$'!!!47!!!Aw$+%%%t{%%%Aw$)###TY###Aw$*$$$dj$$$Aw$*$$$dj$$$Aw$+%%%t{%%%  17dh&&&&&& 1 1&&rc|jtttfvsJ|jt*t |jtjs J|n$t |jts J||jtkrtj|j|j }tj |5 | |j ddfn2#tj$r }|jtjkrYd}~nd}~wwxYwddddS#1swxYwYdS|jtkr$|jt$jksJ|jdSdS)Nr)rrrrrr&rrvrrrrrrerrorr? EADDRNOTAVAILrr CONN_NONE)rrrAs r~ check_familyz-check_connection_ntuple..check_family_s{w'::::DK:::  dk4<88 > >$ > >8 >dk3// 5 5 5 5/ ;' ! !  dk4955A#A&&  FFDJqM1-....|yE$77787777                   [G # #;&"2222DK222$ #22s<D'"C('D'(D7D D'DD''D+.D+cttdt}|jtjtj|fvsJ|jt *t|jt js J|n$t|jts J||jtjkr$|j tj ksJ|j dSdS)NSOCK_SEQPACKET) rrobjectrrrrr&rrvrrr)rrs r~ check_typez+check_connection_ntuple..check_typets )9688DDyV/1B+----.2i---  di66 < < < <6 <di-- 3 3t 3 3- 9) ) );&"2222DK222 * )22rc|j|jfD]}|jttfvrt |t sJt||sFt |jtsJt|jd|jcxkrdksnJ|jt|j |j|jtkr,t |tsJt|dS)Nri)rrrrrr&rtrportrvrXiprr')rrs r~ check_addrsz,check_connection_ntuple..check_addrssZ, 9 9D{w111!$..::T ::.!$)S11BB4 ??BB1DI......... ...!$'4;7777''!$,,88d4jj88, 9 9rct|jtsJ|jdttD}|j|vsJ|j|jt tfvr6|jtkr&|jtj ksJ|jdS|jtj ksJ|jdS)Ncbg|],}|dtt|-S)CONN_rrs r~rzAcheck_connection_ntuple..check_status..sB,,,\\'**,'&!$$,,,r) r&rr'rrrrrrrr)rvalidss r~ check_statusz-check_connection_ntuple..check_statuss$+s++88T[88+,,c&kk,,,{f$$$dk$$$ ;7H- - -$){2J2J;&"2222DK22222;&"2222DK22222rNrz)rrrrrrs r~check_connection_ntuplerQs 1 1 1@@@* @ @ @ 9 9 9@@@LLJtKLrc ddl}t|dst ||S#t$rddl}||cYSwxYw)z,Backport of importlib.reload of Python 3.3+.rNreload) importlibrcr,rimp)moduler r s r~r_r_s(y(++    ''' """ zz&!!!!!"s3#AActjtj|d}tjddkrddl}|||Stjdddkr$ddlm }||| Sddl }|j ||}|j |}|j||S)Nrrjr)SourceFileLoader)rrsplitextrrzrr  load_sourceimportlib.machineryr  load_moduleimportlib.utilutilspec_from_file_locationmodule_from_specloader exec_module)rrr r r specmods r~r`r`s 7  BG,,T22 3 3A 6D a tT*** "1"  ' '888888d++77999~55dDAAn--d33 $$$ rc>tj|tddS)zRaise a warning msg.rj) stacklevelN)warningsra UserWarning)rs r~raras M#{q111111rct|}|j}t|dks|dtkrdSt |dd}t |tsdSt d|DS)z-Check if object is an instance of namedtuple.rVrF_fieldsNc3FK|]}t|tkVdSr)rr')rns r~ z is_namedtuple..s,))!tAww#~))))))r)r __bases__rZrtrr&r_)rtbr s r~rcrcsy QA A 1vv{{ademmu9d##A a  u ))q))) ) ))rc#|Ktrdnddt|z}fdtjD}t j|}tj|| tj ||Vt|dS#t|wxYw)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. pypyrz.sorcg|]R}tj|jdkr"|jvK|jSS)rV)rrrlower)rrrexts r~rz'copyload_shared_lib..s['''1  ((+s22qv||~~%%%%%rN) r$rRrrrrRrSrrctypesCDLLrP)rdstlibsrrr*s @@r~rbrbs *ff( ---''''' 0 0 < < > >'''mD!!S!!!  K   III      K    s B**B;c# Kddlm}ddlm}d t| z} fdt jD}tr1|s/dt jD}tj |}tj ||d} tj |}|V|Ctj jj}|jg|_||j}|dkr |t'|dS#|Ctj jj}|jg|_||j}|dkr |t'|wxYw) 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.dllrcg|]}|jrZdtj|jvr"d|jv|jS)rwow64)rr)r,rr)rrr*s r~rz'copyload_shared_lib..s///1 '',,/BG,,QV44::<<<<qv||~~--.--rcg|]A}dtj|jv:|jBS)r')rrrr)rs r~rz'copyload_shared_lib..sO@@@qbg..qv66<<>>>>F>>>rN)r+r0r1rRrrrr$rRrSrrWinDLLwindllkernel32 FreeLibraryHMODULEargtypes_handlerP) rr0r1r-r.rcfiler8rr*s @r~rbrbs $########### ---//// 0 0 < < > >///  @ @@@FN$4$4$@$@$B$B@@@DmD!!S!!! M#&&EIII $m4@ (0(8'9 $!k%-00!88HJJJ        $m4@ (0(8'9 $!k%-00!88HJJJ     s :D((AE>c&tddS)NTrN)rArzrr~cleanup_test_procsr>sD!!!!!!rc*tj|Sr)rzexit)r9frames r~rB"sSXc]]rr)F)TFr)r)r)rU)r __future__ratexitrr+r?rrrrrrrRrdrr(rr5rrrxrzrrrrrFrrrrrrrr r r r psutil._commonr rrrpsutil._compatrrrrrrrrrr,catch_warnings simplefilterrrpsutil._psposixr__all__builtin_module_namesr$rrrer,r>maxsizer/rr<r=r#r"r.r!rrBr)r*decoder+r9r)ASCII_FSrrrr__file__r'getr(HERErrcrr0r1rr2r4r5HAS_NET_IO_COUNTERSr6r3r7r8rrr9rr:r; HAS_THREADSgetuid SKIP_SYSCONSrr%r&rdevnullr registerrrr-rrrrrrrrErrBrDrCr?r/rr@rArTrSrkr2rVrrWrUrPrrrOrQrRrrKskipIfrJrNrTrLrMrrIrGrHrYrZr[r\r]r^rXrr_r`rarcrbr>rzrr~rYs? &%%%%%        &&&&&&""""""&&&&&&((((((******,,,,,, """"""   " "h'''  vKKKK D)((((((" " " VS--  #!RZ/O>RZ3O  ' RZ ' ;   (  =??X-L =??g-LLLL  #' !OJaNA 7f!IBIKK/MM!IBIKK/M9))009JKK( $3 $ & & , , . .2G G 7  GLL**D$77 9 9jnnGLL9%%  w1122*U76>>::wvz** ..gfni00 WV^X . . '&.-88gf&78876>955wv~}== WV^X . . gf&788%H$$/Ev/E/G/G*H*HKKKKK76>22"76+ABBgfni00  2)")++"2 %%%P)[]] N $rz4  3333v;;333 '&)VVXX . . (((((!(((`$$$$N###L***Z&6 &~NR/R/R/R/j----J!!!0   (77777F777t%dN#^4T/////n   B    9999< * * * *"x 8.2.2.2.2.2X.2.2.2b+,,W%W%W%W%W%^W%W%-,W%tWWWt   FLFLFLFLFLFLFLFLR?@?@?@?@?@?@?@?@D(         0%%%%[t"!' 2    .. ###47774JJJd ( ( (   *222 * * * 9&####X""" DFM&."B"BCCCCCDDsH0C77D: D, D:,D0 0D:3D0 4D:9D:;OO O