3 ֪eU@s(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 lm&Z&ddlm'Z'ddl(m)Z)ddl(m*Z*ddl(m+Z+ddl(m,Z,ddl(m-Z-ddl.m/Z/ddl.m0Z0ddl.m1Z1ddl.m2Z2ddl.m3Z3ddl.m4Z4ddl.m5Z5ddl.m6Z6yddlm7Z7Wn<e8k rLej9ej:dddl7Z7WdQRXYnXe/r^ddl;Z;ndZ;e%rtddld?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfgHZ>dgej?kZ@de jAkZBdhe jAkp0die jAkZCeBp:eCZDdje jAkZEejFdkZGe+dmdnZHe"rxeHdkZIeHdkZJndrZIdrZJdoZKdZLdZMdsZNeDreKdu9ZKeNdu9ZNeLdv9ZLeMdu9ZMe jOdwkrdxe jPZQn dye jPZQe4dzZRe/rd{jSd|d}ZTnd~ZTejUjVdkZWe jXjYe jXjZe jXj[e\ddZ]e jAj^de jXjZe]dZ_e jXjYe jXj[e\Z`e%obe& ZaebejcdZdebedZeebedZfebejcdZgebejcdZhebejcdZiebedZjebejcdZkebejcdZlebejcdZmebedZnyenoeoejpZqWnerk rdrZqYnXebedZsebedZtebejcdZue"s>e oHe jvdkZwddZxex\ZyZze{e j|dZ}ej~e}jddeeDZeedeZeZeZGddEdEejZddZedddBZeddDZddCZedd?ZeddZejeNfdd@ZdddAZddVZddUZGdddZeejdeNddddXZee1efdeNdddddYZeedeNddddWZddQZddZejddPZddRZdddSZdddTZGdddejZee_GddKdKeZeje@dGddJdJeZddNZddOZddZGddLdLZGddMdMZddZeKfddIZdddGZdddHZddd\Zeedfdd]Zejfdd^Zddd_Zdd`ZejddaZddZZdd΄Zdd[ZddbZddcZdddZddfZe%rejdddeZnejdddeZej~ddׄZe%r$ejejddلdS)zTest utilities.)print_functionN)AF_INET)AF_INET6) SOCK_STREAM)AIX)LINUX)MACOS)NETBSD)OPENBSD)POSIX)SUNOS)WINDOWS) bytes2human)debug)memoize) print_color) supports_ipv6)PY3)FileExistsError)FileNotFoundError)range)super)u)unicode)which)mockignore)wait_pidAPPVEYORDEVNULLGLOBAL_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_sysinfois_win_secure_system_procchdir safe_rmpath create_py_exe create_c_exe get_testfn get_winverkernel_version call_until wait_for_pid wait_for_filecheck_net_addressfilter_proc_connections get_free_port bind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_sockets reload_moduleimport_module_by_pathwarncopyload_shared_lib is_namedtuple__pypy__GITHUB_ACTIONS CIBUILDWHEELZ COVERAGE_RUN cCsntjd}ttt|jddd}|d krjtjtj dddgd d id d }ttt|jddd}|S)Nr.ri z-sSz-cz-import platform; print(platform.mac_ver()[0])ZSYSTEM_VERSION_COMPAT0T)envuniversal_newlines)rlrm) platformmac_vertuplemapintsplit subprocess check_outputsys executable) version_strversionr}A/usr/local/lib64/python3.6/site-packages/psutil/tests/__init__.py macos_versions rrl Fijavaz $psutil-%s-z @psutil-%s-u-ƒőősfutf8surrogateescapeufÀ€asciius-asciiz..ZPSUTIL_SCRIPTS_DIRscripts cpu_affinitycpu_freq getloadavgenvironionice memory_mapsnet_io_counterscpu_num io_countersrlimitsensors_battery sensors_fanssensors_temperaturesthreadscCsdd}tjj}ttdd}trFtjd krF|dk rFtj|d<||fStrTtj|fSt r|tjp|tj j tjp|t dtjddp|t jj}|std ||fStj j tj}tj j|st|||fSdS) Nc Ss<ytj|dgtjtjdWntjk r2dSX|SdS)Nz-V)stdoutstderr)rw check_callPIPECalledProcessError)exer}r}r~attempts z_get_py_exe..attemptZ_base_executabler__PYVENV_LAUNCHER__z python%s.%sriz"can't find python exe real abspath)rr)osrcopygetattrryr version_inforzrgrpathrealpathrpsutilProcessr ValueErrorexistsAssertionError)rrobaserr}r}r~ _get_py_exes&     rzr+cCs g|]}|jdrtt|qS)ZSTATUS_) startswithrr).0xr}r}r~ srAF_UNIXcsPeZdZdZfddZddZddZdd Zd d Zd d Z ddZ Z S)rDz6A thread task which does nothing expect staying alive.cs$tjd|_d|_tj|_dS)NFgMbP?)r__init___running _interval threadingEvent_flag)self) __class__r}r~r(s zThreadTask.__init__cCs|jj}d||jt|fS)Nz<%s running=%s at %#x>)r__name__rid)rnamer}r}r~__repr__.szThreadTask.__repr__cCs |j|S)N)start)rr}r}r~ __enter__2szThreadTask.__enter__cOs |jdS)N)stop)rargskwargsr}r}r~__exit__6szThreadTask.__exit__cCs(|jrtdtjj||jjdS)zStart thread and keep it running until an explicit stop() request. Polls for shutdown every 'timeout' seconds. zalready startedN)rrrThreadrrwait)rr}r}r~r9s zThreadTask.startcCs,d|_|jjx|jr&tj|jqWdS)NT)rrsettimesleepr)rr}r}r~runBs zThreadTask.runcCs |jstdd|_|jdS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)rrjoin)rr}r}r~rHszThreadTask.stop) r __module__ __qualname____doc__rrrrrrr __classcell__r}r})rr~rD%s  cstjfdd}|S)Nc s,y ||Stk r&tYnXdS)N) Exceptionr@)rr)funr}r~wrapperVs  z&_reap_children_on_err..wrapper) functoolswraps)rrr})rr~_reap_children_on_errUsrc Ks|jdt|jdt|jdtj|jdttrHd}|jd||dkrttjd}zLt|d d |d }td |g}t j |f|}t j |t |d d dWdt|Xn"t j |f|}t j |t|j|S)aCreate a python subprocess which does nothing for some secs and return it as a subprocess.Popen instance. If "cmd" is specified that is used instead of python. By default stdin and stdout are redirected to /dev/null. It also attempts to make sure the process is in a reasonably initialized state. The process is registered for cleanup on reap_children(). stdinrcwdroi creationflagsN)dirz import time;zopen(r'%s', 'w').close();z&[time.sleep(0.1) for x in range(100)];z-cT)deleteempty) setdefaultrrgetcwdr%r rSrPr$rwPopen_subprocesses_startedaddrXrWpid)cmdkwdsZCREATE_NO_WINDOWtestfnZpylinesprocr}r}r~rAas*         c Csd}ttjd}zvtjdtjj|tf}trDt |dd\}}n t |\}}t j |j }t t|ddd}tj|t j |}||fSt||dk rt|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)ra; 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)rTF)rr)rSrrtextwrapdedentrbasenamer$r r>rrrrurX _pids_startedrrP)tfilerssubpchildZgrandchild_pidZ grandchildr}r}r~rCs      c Cstjs tt}tjd|}d}t|}z~|jtt |\}}|j \}}zLt j |j gggtt |jd}tj|tj|}t|jd||fS|jXWd|jt||dk rt|XdS)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) Nizret == psutil.STATUS_ZOMBIE)rr rrSrrr] settimeoutr r>acceptselectfilenorurecvrrrrVstatuscloserP) Z unix_filesrcrsockparentconn_Zzpidzombier}r}r~rBs,        cKs|jdd|jddt}yDt|d}|j|WdQRXtt|jgf|}t|j||fSt k rt |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. rNrw) rrSopenwriterAr$rrWrrrP)rrsrcfilefrr}r}r~r>s    cKstrdnd}|jdtj|jdtj|jdd|jd|t|trTtj|}tj|f|}t j |t r|j t d\}}n |j \}}|jdkrt||rt||jd r|d d }|S) zURun cmd in a subprocess and return its output. raises RuntimeError on error. irrrrpTr)timeout N)r rrwr isinstancestrshlexrvrrrr communicater returncode RuntimeErrorrcendswith)rrflagsprrr}r}r~shs&          rc sddddfdd}fddfd d }d d }|}zVt|tr^|||St|tjtjfrz||St|tjr|||Std |Wdt|tjtjfr||t|tr|n|j}tj| st |XdS)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. c Ssdt|tjrt r|jn |j|tr`t|tjr`ytj|jj|Stj k r^YnXdS)N) rrwrrrr rrr NoSuchProcess)procrr}r}r~rs  zterminate..waitcSs6trtrtj}tr(|tjkr(|jtj|j|dS)N)rrgsignalSIGKILLr send_signalSIGCONT)rsigr}r}r~sendsig&s  zterminate..sendsigcsZy|Wn@tk rN}z$tr0|jdkr0n|jtjkr>WYdd}~XnX||S)N)OSErrorr winerrorerrnoZESRCH)rrerr)rrrr}r~term_subprocess_proc0s z'terminate..term_subprocess_procc s0y|Wntjk r$YnX||S)N)rr)rr)rrrr}r~term_psutil_proc:s z#terminate..term_psutil_procc sBytj|}Wn$tjk r2tr.t||SYn X||SdS)N)rrrr r)rrr)rr}r~term_pidAs zterminate..term_pidcSs4|jr|jj|jr |jj|jr0|jjdS)N)rrrr)rr}r}r~ flush_popenKs   zterminate..flush_popenz wrong type %rN) rrurrrrw TypeErrorr pid_existsr)Z proc_or_pidr wait_timeoutrrrr rr})rrrrr~r?s&           cCstjj|d}xtr(tj}t|qWxtrBtj}t|q,W|rx|D]}t|ddqNWtj|td\}}x&|D]}t d|t|t j dqzWdS)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)r")rz0couldn't terminate process %r; attempting kill())r) rrchildrenrpopr?r wait_procsr rcrr)r#r$rrr raliver}r}r~r@es      cCsts tdd}tjd}x(|D] }|js6|dkr@||7}q"Pq"W|sVtd|d}d}|jd}t|d}t|dkrt|d}t|dkrt|d}|||fS) z"Return a tuple such as (2, 6, 36).z not POSIXrirkzcan't parse %rrrr) r NotImplementedErrorrunameisdigitrrvrulen)rr*cminormicronumsmajorr}r}r~rUs&          cCsbts tdtj}t|dr*|jp&d}n&tjd|d}|rLt|j dnd}|d|d|fS)Nz not WINDOWSservice_pack_majorrz\s\d$rr) r r)rygetwindowsversionhasattrr2researchrugroup)Zwvsprr}r}r~rTs  c@s<eZdZdZeddddfddZddZdd Zd d ZdS) retryzA retry decorator.NgMbP?cCs2|r|rtd||_||_||_||_||_dS)Nz/timeout and retries args are mutually exclusive)r exceptionrretriesintervallogfun)rr;rr<r=r>r}r}r~rszretry.__init__ccs`|jr.tj|j}xFtj|kr*dVqWn.|jrPx&t|jD] }dVq@Wn x dVqRWdS)N)rrr<r)rstop_atrr}r}r~__iter__s  zretry.__iter__cCs|jdk rtj|jdS)N)r=rr)rr}r}r~rs z retry.sleepcs"tjfdd}|_|S)Ncstd}x^D]V}y ||Sjk r^}z(|}jdk rDj|jw WYdd}~Xq Xq Wtrn|ndS)N)r;r>rr)rrexcr)rrr}r~rs    zretry.__call__..wrapper)rr decorator)rrrr})rrr~__call__szretry.__call__) rrrrrrr@rrCr}r}r}r~r:s  r:gMbP?)r;r>rr=cCs$|tjkrtj|tj|dS)zWait for pid to show up in the process list then return. Used in the test suite to give time the sub process to initialize. N)rpidsrr)rr}r}r~rWs  Tc Cs:t|d}|j}WdQRX|s*|s*t|r6t||S)z8Wait for a file to be written on disk with some content.rbN)rreadrrP)fnamerrrdatar}r}r~rXs cCs|}t|st|S)zVKeep calling function for timeout secs and exit if eval() expression is True. )evalr)rexprretr}r}r~rVs  c Csndd}yLtj|}tj|jr0tjtj|}ntjtj|}t rJ|n||Wnt k rhYnXdS)z?Convenience function for removing temporary test files or dirs.cSstjt}xjtj|krvy|Stk r4Yn6tk rh}z|}tdt|WYdd}~XnXtjdqW|dS)Nz ignoring %sg{Gz?)rr rZ WindowsErrorrcrr)rr?rrr}r}r~ retry_fun%s "zsafe_rmpath..retry_funN) rstatS_ISDIRst_moderpartialshutilrmtreeremover r)rrLstrr}r}r~rP"s   c Cs(ytj|Wntk r"YnXdS)z.Convenience function for creating a directory.N)rmkdirr)rr}r}r~ safe_mkdirDsrVc cs.tj}ztj|dVWdtj|XdS)z@Context manager which temporarily changes the current directory.N)rrrO)dirnamecurdirr}r}r~rOLs   cCsTtjj| st|tjt|tjt |t rPtj |}tj ||j t jB|S)z6Create a Python executable file in the given location.)rrrratexitregisterrPrQcopyfiler$r rMchmodrOS_IEXEC)rrTr}r}r~rQWs   cCstjj| st|tds(tjd|dkr int main() { pause(); return 1; } z.c)suffixrz-o)rrrrrrESkipTestrrrrrYrZrPrrSrrwrr)rc_coderr}r}r~rRbs   r(cCsBxddZ e j ddZ dS) TestCasecCs.|jj}|jdsd|}d||jj|jfS)Nzpsutil.z psutil.tests.z%s.%s.%s)rrrrZ_testMethodName)rZfqmodr}r}r~__str__s zTestCase.__str__assertRaisesRegexcCsdS)Nr})rr}r}r~runTestszTestCase.runTestcos dVdS)Nr})rrkwr}r}r~subTestszTestCase.subTestN)rrrrfr4rEreZassertRaisesRegexprgrrh contextlibcontextmanagerrjr}r}r}r~res  rec@sZeZdZdZdddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ dS)rJzUTest class providing auto-cleanup wrappers on top of process test utilities. r(NcCst||d}|jt||S)N)r_r)rS addCleanuprP)rr_rrGr}r}r~rSs  zPsutilTestCase.get_testfncOst||}|jt||S)N)rArmr?)rrrrr}r}r~rAs  zPsutilTestCase.spawn_testproccCs*t\}}|jt||jt|||fS)N)rCrmr?)rZchild1Zchild2r}r}r~rCs   z"PsutilTestCase.spawn_children_paircCs*t\}}|jt||jt|||fS)N)rBrmr?)rrrr}r}r~rBs   zPsutilTestCase.spawn_zombiecOs*t||\}}|jt||jt||S)N)r>rmrPr?)rrrrrr}r}r~r>s  zPsutilTestCase.pyruncCs|j|tj|j|j|j|j|j|j|jrB|j|jdt|tj rv|j|j |j |j dk rv|j |j dt |t|dS)Nr(r)ZassertIsInstancerError assertEqualrr_nameZassertNotEqualr ZombieProcessppidZ_ppidZassertGreaterEqualrrepr)rrrAr}r}r~_check_proc_excs  zPsutilTestCase._check_proc_exccCs|jtj4}ytj|Wntjk r:tdYnXWdQRX|j|jj||j|jj dtj | szt||j |tj |j |ddtj DdS)Nz&wasn't supposed to raise ZombieProcesscSsg|] }|jqSr})r)rrr}r}r~rsz0PsutilTestCase.assertPidGone..) assertRaisesrrrrqrror;rrr!Z assertNotInrD process_iter)rrcmr}r}r~ assertPidGoneszPsutilTestCase.assertPidGonecCs|j|jt|}x|j|jddD]\}}|j||dly |}WnFtjk r`YnDtjk r}z|j ||WYdd}~XnXd||f}t |WdQRXq&W|j dddS)NT) clear_cache)rrz-Process.%s() didn't raise NSP and returned %rr)r) rxrrKiterallrjrrqrrtrr)rrnsrrrKrAmsgr}r}r~assertProcessGones  z PsutilTestCase.assertProcessGonecCsbtj|j}|j||tpts4|jt|t||j|jtj|j sRt tj |jsbt |j |j |jtj|j |jddtjDit_|j |jddtjDt|}xz|j|jddD]f\}}|j||dJy |Wn8tjtjfk r.}z|j||WYdd}~XnXWdQRXqWtr|jtj}|jWdQRX|j||j|jtj}|jWdQRX|j||j|jtj}|jWdQRX|j||j|j|j|j |j!|j st tj |jst |j |jtj|j |jddtjDit_|j |jddtjDdS) NcSsg|] }|jqSr})r)rrr}r}r~rsz6PsutilTestCase.assertProcessZombie..cSsg|] }|jqSr})r)rrr}r}r~rsT)ry)rrcSsg|] }|jqSr})r)rrr}r}r~r.scSsg|] }|jqSr})r)rrr}r}r~r0s)"rrrror r hashr STATUS_ZOMBIE is_runningrr!as_dictZassertInrDrvZ_pmaprKrzr{rjrq AccessDeniedrtrrucmdliner;rrsuspendresumer?kill)rrcloner|rrrArwr}r}r~assertProcessZombiesN    ,z"PsutilTestCase.assertProcessZombie)r(N) rrrrrSrArCrBr>rtrxr~rr}r}r}r~rJs   zunreliable on PYPYc@seZdZdZdZdZdZer dndZdZ e j Z e ejdZedd Zed d Zd d ZddZddZddZddZddZddZdddZddZdS) rIaTest 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) rlrrT PSUTIL_DEBUGcCstjddS)NF)r _set_debug)clsr}r}r~ setUpClassjszTestMemoryLeak.setUpClasscCstj|jdS)N)rr_psutil_debug_orig)rr}r}r~ tearDownClassnszTestMemoryLeak.tearDownClasscCs|jj}t|d|jS)NZuss) _thisprocmemory_full_inforZrss)rmemr}r}r~_get_memrs zTestMemoryLeak._get_memcCstr|jjS|jjSdS)N)r rnum_fds num_handles)rr}r}r~ _get_num_fdsxs zTestMemoryLeak._get_num_fdscCs|jrt|dtjddS)Nyellow)colorfile)verboserryr)rr}r}r}r~_log~szTestMemoryLeak._logcCsx|j}|j||j}||}|dkr8|jd||dkrttrHdnd}|dkr\|d7}d|||f}|j|dS) 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)fdhandlerrz%s unclosed %s after calling %rN)rcallfailr )rrbeforeafterdifftype_r}r}r}r~ _check_fdss  zTestMemoryLeak._check_fdscCsbtjdd|j}xt|D]}|j|}~~qWtjdd|j}|jtjg||}|S)zGet 2 distinct memory samples, before and after having called fun repeatedly, and return the memory difference. r)Z generation)gcZcollectrrrroZgarbage)rrtimesZmem1rrKZmem2rr}r}r~ _call_ntimess   zTestMemoryLeak._call_ntimesc Csg}d}|}xtd|dD]}|j||} d|t| t| ||f} |j| | |kp`| |k} | r||dkrx|j| dS|dkrt|j| ||7}| }qW|jdj|dS)Nrrz,Run #%s: extra-mem=%s, per-call=%s, calls=%sz. )rrrappendrprintrr) rrrr< tolerancemessagesZprev_memZincreaseidxrr}successr}r}r~ _check_mems,     zTestMemoryLeak._check_memcCs|S)Nr})rrr}r}r~rszTestMemoryLeak.callNcCs|dk r |n|j}|dk r|n|j}|dk r0|n|j}|dk rB|n|j}yD|dksZtd|dksjtd|dksztd|dkstdWn.tk r}ztt|WYdd}~XnX|j|||j||j ||||ddS) zTest a callable.Nrztimes must be >= 1rzwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rr<r) r warmup_timesr<rrrrrrr)rrrrr<rrr}r}r~executes  zTestMemoryLeak.executec s"fdd}j|f|dS)znConvenience method to test a callable while making sure it raises an exception on every call. csjdS)N)rur})rArrr}r~rsz*TestMemoryLeak.execute_w_exc..callN)r)rrArrrr})rArrr~ execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)rrrrrrrr+r<rrrrboolrgetenvr classmethodrrrrrrrrrrrr}r}r}r~rIAs&    cCsddl}ddl}ddl}ddl}ddl}y ddl}Wntk rLd}YnXy ddl}Wntk rrd}YnX|j}t j rt drt d|d<nzt j rdtjd|d<n^t jrddjtttj|d<ttdr|dd tj7<nd tjtjf|d<d jttjtjg|d <t jrJtjd |d <d jtjtjtj g|d<t!|dd|d<|dk r|dd|j"7<t jrt drt ddg}t|j#dd|d<nd|d<tj$d} | r| |d<t%j&|d<|j'} d| d| df|d<|jj(t j)j*d|d<|jj+j*d|d<|j,|d<t-j.j/d|d <t-j0|d!<t1|d"<tj2|d#<t-j3|d$<t j4|d%<d&t5d'd(t j6D|d)<t j7} d*t8| j9t:| j;t:| j<f|d+<t j=} d*t8| j9t:| j;t:| j<f|d,<t>t j?|d-<t j@jA} | jBd.d|jC| |d/<tDd0d1t%jEd2x0|jFD]$\}}tDd3|d4|ft%jEd2qhWtDd0d1t%jEd2t%jGjHtrt-jd5nt d6rt-jd7tDd0d1t%jEd2t%jGjHdS)8NrZ lsb_releasezlsb_release -d -sZOSz Darwin %szWindows  win32_editionz, z%s %sarchrikernelpython __version__z not installedpipz (wheel=%s)r^z --versionrrglibcz fs-encodingz%s, %slangz%Y-%m-%d %H:%M:%Sz boot-timeruser~homerZpyexehostnameZPIDZcpusz%.1f%%, %.1f%%, %.1f%%cSsg|]}|tjdqS)d)r cpu_count)rrr}r}r~r0sz!print_sysinfo..Zloadavgz%s%%, used=%s, total=%sZmemoryswaprDrr=F)rz%-17s %s:Ztasklistpszps aux)I collectionsdatetimegetpasslocalepprintr ImportErrorwheel OrderedDictrrrrOSXrqrrr rrtr win32_verr4rsystemr|list architecturemachiner r*python_implementationpython_versionpython_compilerrrrvlibc_verrygetfilesystemencoding getlocale fromtimestamp boot_timestrftimenowZgetuserrr expanduserrr$nodegetpidrrsrvirtual_memoryrupercentrusedtotal swap_memoryr,rDrrr%pformatrritemsrflush)rrrrrrrinfooutrrrrZpinfokvr}r}r~rMs                        c Cs4tdd}y||dkStk r.dSXdS)NcSs\i}td}xJ|jddD]6}dd|jdD}|dt|d}}|||<qW|S)Nztasklist.exe /NH /FO csvrcSsg|]}|jddqS)"r()replace)rrr}r}r~rXsz@is_win_secure_system_proc..get_procs..,r)r splitlinesrvru)rKrlinebitsrrr}r}r~ get_procsSs z,is_win_secure_system_proc..get_procsz Secure SystemF)rKeyError)rrr}r}r~rNQs  cCs6tj}t|dr|jSt|dr2tj|jSdS)Nrrr)rrr4rrandomchoicer)r r}r}r~_get_eligible_cpucs   rc@sBeZdZdZdfifdfifgZdfifdfddifdfifd fifd fifd fifd fifd fifddCifg Zdfifdfddifdfifdfifdfifdfifdfifdfifdfifdfifdfifdfifdfifdfifd fifd!fifd"fifgZerFed#fifg7Zed$fifg7Zed%fifg7Zed&fifg7Zer\ed'fifg7Ze rred(fifg7Ze red)e j fifg7Ze red*fifg7Zered+fifg7Zered,fifg7Zered-fifg7Zered.fd/d0ifg7ZgZereddDifg7Znede jfifg7Ze rJed)e j dEfifg7Ze rerned(e jdfifg7Zned(e jfifg7Ze red*egfifg7Zd3ejfifd4fifd5fifd6fifd7fifgZered3ejfifg7Zed3ejfifg7ZeeeeZd8d9ZdFd:d;Zdd?Z"e!d@dAZ#dBS)GrKaA 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_percentZmemory_percentrr$r#TrZmemory_info_exZoneshotrparentsrrrrZ connectionskindr{ cpu_timesZ create_timerrrZ memory_inforniceZnum_ctx_switches num_threadsZ open_filesrrrrusernameZuidsZgidsterminalrrrrrrrrrZgroupedFrrrr?rcCs ||_dS)N)_proc)rrr}r}r~rszprocess_namespace.__init__ccs^t|}tj|xF|D]>\}}}|r.|jt|j|}tj|f||}||fVqWdS)z_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)rrshuffleryrrrrP)rlsryfun_namerrrr}r}r~rzs  zprocess_namespace.itercCs|jj|jjdddS)z&Clear the cache of a Process instance.T)Z _ignore_nspN)r_initr)rr}r}r~ryszprocess_namespace.clear_cachecCsBx<|D]4\}}}d|}t||sd|jj|f}t|qWdS)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)r4rrAttributeError)rZ test_classrr rZ meth_namer}r}r}r~test_class_coverages z%process_namespace.test_class_coveragecCs`tdd|jD}tdd|jD}tddttjD}||B|A}|r\td|dS)NcSsg|] }|dqS)rr})rrr}r}r~rsz*process_namespace.test..cSsg|] }|dqS)rr})rrr}r}r~rscSsg|]}|ddkr|qS)rrr})rrr}r}r~rsz!uncovered Process class names: %r)rr{ignoredrrrr)rthisr klassZleftoutr}r}r~tests  zprocess_namespace.testN)r)r)rr)T)$rrrrutilsr gettersr r2r3r6rZ RLIMIT_NOFILEr/r5r1r r4ZsettersZNORMAL_PRIORITY_CLASSrZIOPRIO_CLASS_NONEZ IOPRIO_NORMALrrSIGTERMZkillersZ CTRL_C_EVENTZCTRL_BREAK_EVENTr{rrzryrr rr}r}r}r~rKls        c@seZdZdZdfifdfddifdfddifdfifdfd difdfd difd fd difd fd difdejfifdfdd ifdfifdfifdfddifdejfifdfifdfifdfifdfifgZeredfd difg7Ze redfifg7Ze redfifg7Ze r$edfifg7Ze r:edfifg7Ze r`edfifg7Zed d)ifg7Zd"fifd#ejgfifd$fifd%fifgZeZed&d'ZejZd(S)*rLzA 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() rrZlogicalFTZ cpu_statsrZpercpuZdisk_io_countersZperdiskZdisk_partitionsr{ disk_usageZnet_connectionsrZ net_if_addrsZ net_if_statsrZpernicr!rDrZusersrrrrrrZwin_service_iterZwin_service_getalgrvr&rZcpu_times_percentccsPt|}tj|x8|D]0\}}}tt|}tj|f||}||fVqWdS)z_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)rrrrrrrP)rr rrrr}r}r~rz)s   zsystem_namespace.iterN)r)rrrrrrrrr0HAS_GETLOADAVGr:r9r7r rrr r{ staticmethodrzrKr r}r}r}r~rLsN           cCstj|st|d|_|S)zA decorator to mark a TestCase class. When running parallel tests, class' unit tests will be run serially (1 process). T)inspectisclassrZ _serialrun)rr}r}r~ serialrun8srcCsdd}ttd||dS)zZDecorator which runs a test function and retries N times before actually failing. cSstd|tjddS)Nz %r, retrying)r)rryr)rAr}r}r~r>Gsz retry_on_failure..logfunN)r;rr<r>)r:r)r<r>r}r}r~rHBscsfdd}|S)z,Decorator to Ignore AccessDenied exceptions.cstjfdd}|S)Nc s>y ||Stjk r8dk r*s*tjdYnXdS)Nzraises AccessDenied)rrrEr`)rr)ronly_ifr}r~rSs z9skip_on_access_denied..decorator..wrapper)rr)rr)r)rr~rBRs z(skip_on_access_denied..decoratorr})rrBr})rr~rFOs csfdd}|S)z3Decorator to Ignore NotImplementedError exceptions.cstjfdd}|S)Nc sFy ||Stk r@dk r(s(dj}tj|YnXdS)Nz4%r was skipped because it raised NotImplementedError)r)rrEr`)rrr})rrr}r~rfs z;skip_on_not_implemented..decorator..wrapper)rr)rr)r)rr~rBesz*skip_on_not_implemented..decoratorr})rrBr})rr~rGbs  127.0.0.1c Cs4tjtj}|j|df|jdSQRXdS)z6Return an unused TCP port. Subject to race conditions.rrN)rkclosingsocketbind getsockname)hostrr}r}r~r[sc Cs|dkr|ttfkrd}tj||}y>tjd krB|jtjtjd|j||tj kr`|j d|St k r|j YnXdS) zBinds a generic socket.Nr(rntcygwinrr)r(r)r"r#) rrrrr setsockopt SOL_SOCKET SO_REUSEADDRrrlistenrr)familytypeaddrrr}r}r~r\s     c Csttjs ttjj| s t|tjtj|}y"|j||tj krN|j dWnt k rn|j YnX|S)zBind a UNIX socket.r) rr rrrrrrrrr'rr)rr)rr}r}r~r]s   cCstjtj|t}|j||jd|j}tj|t}y@|j||j}x(|j\}}||krn||fS|j qRWWnt k r|j YnXWdQRXdS)z^Build a pair of TCP sockets connected to each other. Return a (server, client) tuple. rN) rkrrrrr'r connectrrr)r(r*Zllr-Zcaddrar}r}r~r^s      c Cstjs td}}y@t|tjd}|jdtjtjtj}|jd|j|Wn6t k r|dk rr|j |dk r|j YnX||fS)zBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. N)r)r) rr rr]rr setblockingrr+rr)rserverclientr}r}r~r_s   c csg}d}}z|jttjtj|jttjtjtrd|jttjtj|jttjtjtrt rt }t }t |\}}t |tjd}x|||fD]}|j|qW|VWdx|D] }|j qWx ||fD]}|dk rt|qWXdS)z1Open as many socket families / types as possible.N)r))rr\rrr SOCK_DGRAMrrr HAS_CONNECTIONS_UNIXrSr_r]rrP)ZsocksZfname1Zfname2s1s2Zs3rrGr}r}r~r`s*    cCs ddl}tr*tr*t r*t|tjs*t||tjkrdd|j dD}t |dks\t|x,|D]$}d|koxdknsbt|qbWtst |}|j |nd|tj krt|tst|tst |}|j|n0|tjkrtjd|dk st|n td |dS) z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNcSsg|] }t|qSr})ru)rrr}r}r~rsz%check_net_address..rkrz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r) ipaddressenumrr#rIntEnumrrrrvr,rZ IPv4AddressrrZ IPv6AddressrZAF_LINKr5matchr)r*r(r5Zoctsnumr}r}r~rYs&  $    cCsTdd}dd}dd}dd}d d }||||||||||d S) z*Check validity of a connection namedtuple.cSst|dk}t|d ks$tt||d|jks.check_ntuplecSs|jtttfkst|jtdk r:t|jtjsNt|nt|jtsNt||jtkrt j |j|j }t j |Ry|j |jddfWn2t jk r}z|jtjkrWYdd}~XnXWdQRXn |jtkr|jtjkst|jdS)Nr)r(rrrrr6rr7rurr)rkrrr:errorrZ EADDRNOTAVAILrr CONN_NONE)rrrr}r}r~ check_familys     z-check_connection_ntuple..check_familycSsttdt}|jtjtj|fks,t|jtdk rLt|jtj s`t|nt|jt s`t||jtjkr|j t j kst|j dS)NSOCK_SEQPACKET)rrobjectr)rr0rr6rr7rurrr>)rr@r}r}r~ check_type.s  z+check_connection_ntuple..check_typecSsx|j|jfD]}|jttfkrt|ts6tt||s.check_addrscSst|jtst|jddttD}|j|ks.check_status..) rrrrrrr(rrr)rr>)rZvalidsr}r}r~ check_statusJs z-check_connection_ntuple..check_statusNr})rr<r?rBrErFr}r}r~check_connection_ntuple s   rGcCsPg}xF|D]>}tr>|jtjkr>tr>d|jkr>tdt|q |j|q W|S)ztOur process may start with some open UNIX sockets which are not initialized by us, invalidating unit tests. z/syslogz skipping %s) r r(rrrr;rrr)Zconsnewrr}r}r~rZ\s c CsLyddl}t|dstWn"tk r<ddl}|j|SX|j|SdS)z,Backport of importlib.reload of Python 3.3+.rNreload) importlibr4rimprI)modulerJrKr}r}r~raos  cCsptjjtjj|d}tjddkr:ddl}|j||Sddl}|j j ||}|j j |}|j j ||SdS)Nrr)rrsplitextrryrrKZ load_sourceimportlib.utilutilspec_from_file_locationmodule_from_specloader exec_module)rrrKrJspecmodr}r}r~rb~s   cCstj|tdddS)zRaise a warning msg.ri) stacklevelN)warningsrc UserWarning)r}r}r}r~rcscCsVt|}|j}t|dks&|dtkr*dSt|dd}t|tsDdStdd|DS)z-Check if object is an instance of namedtuple.rrF_fieldsNcss|]}t|tVqdS)N)rr)rnr}r}r~ sz is_namedtuple..)r) __bases__r,rsrrr{)rtbrr}r}r~res  c #sttrdnddt|d}fddtjjD}tj|}tj||zt j ||VWdt |XdS)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.so)r_cs6g|].}tjj|jdkr|jjkr|jqS)r)rrrMlower)rr)rextr}r~rsz'copyload_shared_lib..N) r#rSrrrrrrQr[ctypesCDLLrP)r_dstlibsrr})rrar~rds      c #sddlm}ddlm}dt|d}fddtjjD}trd| rdddtjjD}tj |}t j ||d }ztj |}|VWd |d k rtj jj}|jg|_||j}|dkr|t|Xd S) 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.dll)r_csFg|]>}|jjjrdtjj|jjkrd|jjkr|jqS)rZwow64)rr`r rr)rr)rar}r~rsz'copyload_shared_lib..cSs(g|] }dtjj|jjkr|jqS)r_)rrrr`)rrr}r}r~rsN)rbrfrgrSrrrr#rrrQr[ZWinDLLwindllkernel32 FreeLibraryZHMODULEargtypes_handlerP) r_rfrgrdrercfilerjrKr})rar~rds,           cCstdddS)NT)r#)r@r}r}r}r~cleanup_test_procssrncCs tj|S)N)ryexit)rrr}r}r~srpl)rlr)rriiPi(i)rr)N)F)TF)N)r(N)N)N)rr(r)rq)r()r()r __future__rrYrkrbrrrrrrqrr5rrrQrrrMrwryrcrrrrErWrrrrrrrr r r r r Zpsutil._commonrrrrrZpsutil._compatrrrrrrrrrrcatch_warnings simplefilterr6Zpsutil._psposixr__all__builtin_module_namesr#rrrgr+r=maxsizer.rr;r<r"r!r-r rrr(r)decoder*rr`ZASCII_FSrrrrW__file__r&getr'HEREr1r4rr/r0rr1r3r4ZHAS_NET_IO_COUNTERSr5r2r6r7rrr8rr9r:Z HAS_THREADSgetuidZ SKIP_SYSCONSrr$r%rdevnullrrZrrr,rrArrrrrrDrrArCrBr>rrr?r@rUrTr:rrWrrXrVrPrVrlrOrQrRrSrerJZskipIfrIrMrNrrKrLrrHrFrGr[r\r]r^r_r`rYrGrZrarbrcrerdrnr}r}r}r~s                                                           *   0  ) '-  V %;  "    %k  C    R  3