U =_E@sdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlZddlmZddlmZdd lmZdd lm Z dd lm!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+rddl1Z1nddl2Z1zddl1m3Z3Wn<e4k r(e5e6dddl3Z3W5QRXYnXej7dkr@ddl8Z8ndZ8ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gEZ9daej:kZ;de je=pe>Z?ej@ddkZAdeZBdfZCdgZDdhZEe?rFeBdi9ZBeEdi9ZEeCdi9ZCeDdi9ZDe jFdjkr`dke GZHn dle GZHe.dmZIe+rdnJdodpZKndqZKeLMdrkZNe jOPe jOQe jOReSdsdsZTe jOQeTdtZUe jOPe jOReSZVe!oe" ZWeXejYduZZeXedvZ[eXedwZ\eXejYdxZ]eXejYdyZ^eXejYdzZ_eXed{Z`eXejYd|ZaeXejYd}ZbeXejYd~ZceXedZdzedoxeeefZgWnehk rdZgYnXeXedZieXedZjeXejYdZke seoe ldkZmddZnenZoepe jqdZreserjtddeueDZvewedexZyezZ{ezZ|Gdddej}Z~ddZeddd<Zedd>Zdd=Zedd9ZeddZejeEfdd:Zddd;ZddQZddPZGdddexZeejdeEddddSZee*efdeEdddddTZeedeEddddRZddKZddZejddJZdddLZdddOZGddde1jZee1_GddDdDeZe1e;dGddCdCeZddGZddZGddEdEZGddFdFZddZeBfddBZddd@ZdddAZdddVZeedfddWZejfddXZdddYZddZZejdd[ZddUZddZdd\Zdd]Zdd^Zdd`Ze!rZejddd_Znejddd_ZejsddȄZe!reejddʄ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)mockignoreAPPVEYORDEVNULLGLOBAL_TIMEOUTTOLERANCE_SYS_MEM NO_RETRIESPYPY PYTHON_EXEROOT_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_TEMPERATURESZHAS_MEMORY_FULL_INFOpyrun terminate reap_childrenspawn_testproc spawn_zombiespawn_children_pairZThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespace print_sysinfoZ install_pipZinstall_test_depschdir safe_rmpath create_exeZ decode_pathZ encode_path 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_namedtupleZ__pypy__GITHUB_ACTIONSZ CIBUILDWHEELl iPirjavaz $psutil-%s-z @psutil-%s-u-ƒőősfutf8surrogateescapeufÀ€)asciizus-asciiz..Zscripts cpu_affinitycpu_freq getloadavgenvironionice memory_mapsnet_io_counterscpu_num io_countersrlimitsensors_batteryF sensors_fanssensors_temperaturesthreadscCsdd}tr@tr$trtdStdStr6tjtj StdSnlt r|tj p|tjtj p|tdtj ddp|t }|std|Stjtj }|SdS) NcSs<ztj|dgtjtjdWntk r2YdSX|SdS)Nz-V)stdoutstderr) subprocess check_callPIPE Exception)exerxH/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/__init__.pyattempts z_get_py_exe..attemptZpypy3pypypythonz python%s.%sz"can't find python exe real abspath)r\r"rrrospathrealpathsys executabler version_infopsutilProcessrw ValueError)rzrwrxrxry _get_py_exes(   rzr+cCs g|]}|drtt|qS)ZSTATUS_ startswithgetattrr.0xrxrxry s rAF_UNIXcsPeZdZdZfddZddZddZdd Zd d Zd d Z ddZ Z S) ThreadTaskz6A thread task which does nothing expect staying alive.cs$td|_d|_t|_dS)NFMbP?)r__init___running _interval threadingZEvent_flagself __class__rxryrs zThreadTask.__init__cCs|jj}d||jt|fS)Nz<%s running=%s at %#x>)r__name__rid)rnamerxrxry__repr__szThreadTask.__repr__cCs ||SN)startrrxrxry __enter__szThreadTask.__enter__cOs |dSr)stop)rargskwargsrxrxry__exit__szThreadTask.__exit__cCs(|jrtdtj||jdS)zStart thread and keep it running until an explicit stop() request. Polls for shutdown every 'timeout' seconds. zalready startedN)rrrThreadrrwaitrrxrxryrs zThreadTask.startcCs(d|_|j|jr$t|jqdS)NT)rrsettimesleeprrrxrxryruns zThreadTask.runcCs |jstdd|_|dS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)rrjoinrrxrxryrszThreadTask.stop) r __module__ __qualname____doc__rrrrrrr __classcell__rxrxrryrs  rcstfdd}|S)Ncs.z ||WStk r(tYnXdSr)rvr;rrfunrxrywrapper%s  z&_reap_children_on_err..wrapper functoolswrapsrrrxrry_reap_children_on_err$srcKs|dt|dt|dt|dtjtrJd}|d||dkrt}zDt|d|}td |g}t j |f|}t |t |d d d W5t|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(). stdinrqcwdenv creationflagsNz:from time import sleep;open(r'%s', 'w').close();sleep(60);z-cTdeleteempty) setdefaultrr~getcwdrfr rJrHr#rsPopen_subprocesses_startedaddrOrNpid)cmdkwdsZCREATE_NO_WINDOWtestfnZpylinesprocrxrxryr</s.        cCsd}ttd}zztdtj|tf}t rDt |dd\}}n t |\}}t |j }tt|ddd}t|t |}||fWSt||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(). Ndira; 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)rTFr)rJr~rrHtextwrapdedentrbasenamer#r r9rrrintrO _pids_startedr)tfilerssubpZchildZgrandchild_pidZ grandchildrxrxryr>Ws"       cst}td|}d}t|}z|tt|\}}| \}}zZt | gggtt | d}t|t|tfddd|fWWS|XW5|t||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) NcsSr)statusrxzombierxryzspawn_zombie..zret == psutil.STATUS_ZOMBIE)rJrrrScloserHZ settimeoutrr9acceptselectfilenorZrecvrrrrrM)Z unix_filesrcrsockparentconn_Zzpidrxrryr=~s,     c Ks|dd|ddt}zFt|d}||W5QRXtt|jgf|}t|j||fWSt 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. rqNrrwt) rrJopenwriter<r#rrNrrvrH)rrsrcfilefrrxrxryr9s     cKst|ttfrdnd}tr"|r"dnd}|d||dtj|dtj|dd|d |tj|f|}t |t r|j t d \}}n | \}}|j dkrt||rt||d r|d d }|S)zUrun cmd in a subprocess and return its output. raises RuntimeError on error. TFrrshellrqrrZuniversal_newlinesrtimeout N) isinstancestrrr rrsrurrrrZ communicater returncode RuntimeErrorrYendswith)rrrflagsprqrrrxrxryshs&        rc strddlmddddfdd}fd d fd d }d d}|}zbt|trt|||WLSt|tj tjfr||W,St|tjr|||WSt d|W5t|tjtjfr||t|tr|n|j}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. r)wait_pidcSsdt|tjrts|n ||tr`t|tjr`zt|j|WStj k r^YnXdSr) rrsrrrr rrr NoSuchProcessprocrrxrxryrs  zterminate..waitcSs6trtrtj}tr(|tjkr(|tj||dSr)r r\signalSIGKILLr send_signalSIGCONT)rsigrxrxrysendsigs  zterminate..sendsigc sZz|Wn@tk rN}z"tr0|jdkr0n|jtjkr>W5d}~XYnX||S)N)OSErrorr ZwinerrorerrnoZESRCH)rrerrrrrrxry term_subprocs zterminate..term_subproccs0z|Wntjk r$YnX||Sr)rrrrrxry term_psprocs zterminate..term_psproccsFzt|}Wn(tjk r6tr2||YSYn X||SdSr)rrrr )rrr)rrrxryterm_pids zterminate..term_pidcSs4|jr|j|jr |j|jr0|jdSr)rqrrrr)rrxrxry flush_popens   zterminate..flush_popenz wrong type %rN) r Zpsutil._psposixrrrsrrrrr TypeError)Z proc_or_pidr wait_timeoutrrr rrrx)rrrrrryr:s*         cCstj|d}tr&t}t|qtr||7}q qDq |sTtd|d}d}|d}t|d}t|dkrt|d}t|dkrt|d}|||fS) z"Return a tuple such as (2, 6, 36).z not POSIXr}.zcan't parse %rrr) r NotImplementedErrorr~unameisdigitrsplitrlen)rrcminormicroZnumsmajorrxrxryrLXs&         cCsdts tdt}t|dr*|jp&d}n(td|d}|rNt| d}nd}|d|d|fS)Nz not WINDOWSservice_pack_majorrz\s\d$rr) r rrZgetwindowsversionhasattrrresearchrgroup)ZwvZsprrxrxryrKps  c@s<eZdZdZeddddfddZddZdd Zd d ZdS) retryzA retry decorator.NrcCs2|r|rtd||_||_||_||_||_dS)Nz/timeout and retries args are mutually exclusive)r exceptionrretriesintervallogfun)rr$rr%r&r'rxrxryrszretry.__init__ccsT|jr*t|j}t|krPdVqn&|jrHt|jD] }dVq:ndVqHdSr)rrr%r)rstop_atrrxrxry__iter__s   zretry.__iter__cCs|jdk rt|jdSr)r&rrrrxrxryrs z retry.sleepcs"tfdd}|_|S)Nc s|d}D]b}z||WSjk rh}z,|}jdk rH|WYqW5d}~XYqXqtrv|ndSr)r$r'rr)rrexcrrrrxryrs  zretry.__call__..wrapper)rr decorator)rrrrxr+ry__call__szretry.__call__) rrrrrvrr)rr-rxrxrxryr#s  r#r)r$r'rr&cCst|trtddS)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)rrxrxryrNs Tc Cs2t|d}|}W5QRX|s"|r.t||S)z8Wait for a file to be written on disk with some content.rb)rreadrH)fnamerrrdatarxrxryrOs  cCs |}|S)zVKeep calling function for timeout secs and exit if eval() expression is True. rx)rexprretrxrxryrMscCsndd}zLt|}t|jr0ttj|}nttj|}t rJ|n||Wnt k rhYnXdS)z>Convenience function for removing temporary test files or dirsc Ss~tt}t|krvz|WStk r4Yn6tk rh}z|}tdt|W5d}~XYnXtdq |dS)Nz ignoring %sr.)rrrZ WindowsErrorrYrr)rr(rrrxrxry retry_funs  " zsafe_rmpath..retry_funN) r~statS_ISDIRst_moderpartialshutilZrmtreeremover r)rr5strrxrxryrHs   cCs(zt|Wntk r"YnXdS)z-Convenience function for creating a directoryN)r~mkdirrrrxrxry safe_mkdirsr>c cs.t}zt|dVW5t|XdS)z@Context manager which temporarily changes the current directory.N)r~rrG)dirnamecurdirrxrxryrGs   c Cs|rvtdstdt|tr(td}ttddd}||W5QRXzt d|j d|gW5t |j Xn.t t|trt|}t||jtjBdS) z1Creates an executable file in the given location.gcczgcc is not installedz #include int main() { pause(); return 1; } z.csuffixrz-oN)rrrboolrrrrJrrHrrsrtr:copyfiler#r r~r6chmodr8S_IEXEC)ZoutpathZc_coderr<rxrxryrIs     rcCs.tjt||d}tj|stj|SqdS)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. )prefixrCrN)tempfileZmktempr&r~rexistsr)rCrrrxrxryrJ9s c@s4eZdZddZeejds$ejjZe s0ddZ dS)TestCasecCs.|jj}|dsd|}d||jj|jfS)Nzpsutil.z psutil.tests.z%s.%s.%s)rrrrZ_testMethodName)rZfqmodrxrxry__str__Ns zTestCase.__str__assertRaisesRegexcCsdSrrxrrxrxryrunTest\szTestCase.runTestN) rrrrLrunittestrKZassertRaisesRegexprMrrNrxrxrxryrKJs  rKc@sBeZdZdZdddZddZdd Zd d Zd d ZddZ dS)rCzUTest class providing auto-cleanup wrappers on top of process test utilities. rNcCst||d}|t||S)N)rCr)rJ addCleanuprH)rrCrr1rxrxryrJis  zPsutilTestCase.get_testfncOst||}|t||Sr)r<rPr:)rrrrrxrxryr<ns  zPsutilTestCase.spawn_testproccCs*t\}}|t||t|||fSr)r>rPr:)rZchild1Zchild2rxrxryr>ss   z"PsutilTestCase.spawn_children_paircCs*t\}}|t||t|||fSr)r=rPr:)rrrrxrxryr=ys   zPsutilTestCase.spawn_zombiecOs*t||\}}|t||t||Sr)r9rPrHr:)rrrrrrxrxryr9s  zPsutilTestCase.pyruncCsx|tjtj|jt|tjtjfrbz |}Wntjk rHYnXtd||j dd| |jt dS)Nz3Process.status() didn't raise exception (status=%s)rr) assertRaisesrrrrrrrAssertionErrorrZ assertNotInpids)rrrrxrxryassertProcessGones  z PsutilTestCase.assertProcessGone)rN) rrrrrJr<r>r=r9rTrxrxrxryrCds zunreliable on PYPYc@s~eZdZdZdZdZdZer dndZdZ e Z ddZ d d Zd d Zd dZddZddZddZdddZddZdS)rBaTest 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|jS)NZuss) _thisprocmemory_full_inforZrss)rmemrxrxry_get_mems zTestMemoryLeak._get_memcCstr|jS|jSdSr)r rVnum_fds num_handlesrrxrxry _get_num_fdss zTestMemoryLeak._get_num_fdscCs|jrt|dtjddS)NZyellow)Zcolorfile)verboserrrr)rmsgrxrxry_logszTestMemoryLeak._logcCsx|}|||}||}|dkr8|d||dkrttrHdnd}|dkr\|d7}d|||f}||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)fdZhandlerrz%s unclosed %s after calling %rN)r\callfailr )rrZbeforeZafterdiffZtype_r_rxrxry _check_fdss  zTestMemoryLeak._check_fdscCs^tjdd|}t|D]}||}~~qtjdd|}|tjg||}|S)zGet 2 distinct memory samples, before and after having called fun repeadetly, and return the memory difference. r)Z generation)gcZcollectrYrrbZ assertEqualZgarbage)rrtimesZmem1rr4Zmem2rdrxrxry _call_ntimess    zTestMemoryLeak._call_ntimesc Csg}d}|}td|dD]} |||} d| t| t| ||f} || | |kp^| |k} | r|| dkrv|| dS| dkrt|| ||7}| }q|d|dS)Nrrz,Run #%s: extra-mem=%s, per-call=%s, calls=%sz. )rrhr appendr`printrcr) rrrg warmup_timesr% toleranceZmessagesZprev_memZincreaseidxrXr_successrxrxry _check_mems.     zTestMemoryLeak._check_memcCs|Srrx)rrrxrxryrbszTestMemoryLeak.callNc Cs|dk r |n|j}|dk r|n|j}|dk r0|n|j}|dk rB|n|j}zWn.tk rz}ztt|W5d}~XYnX||||||j |||||ddS)zTest a callable.N)rgrkr%rl) rgrkr%rlrRrrrhrero)rrrgrkr%rlrrxrxryexecute s     zTestMemoryLeak.executec s"fdd}j|f|dS)znConvenience method to test a callable while making sure it raises an exception on every call. csdSr)rQrxr*rrrxryrb"sz*TestMemoryLeak.execute_w_exc..callN)rp)rr*rrrbrxrqry execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)rrrrrgrkrlr)r%r^rrrVrYr\r`rerhrorbrprrrxrxrxryrBs$  cCsddl}ddl}ddl}ddl}ddl}ddl}z ddl}Wntk rTd}YnXz ddl}Wntk rzd}YnX| }t j rt drt d|d<n~t jrd|d|d<nbt jrddtt||d<t|dr|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 jrt drt ddg} t| #dd|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 6D|d)<t 7} d*t8| j9t:| j;t:| j<f|d+<t =} d*t8| j9t:| j;t:| j<f|d,<t>t ?|d-<t @A}|Bd.d|C||d/<tDd0t%jEd1|FD]$\}}tDd2|d3|ft%jEd1qntDd0t%jEd1t%jGHdS)4NrZ lsb_releasezlsb_release -d -sZOSz Darwin %szWindows  win32_editionz, z%s %sZarchr}Zkernelr| __version__z not installedpipz (wheel=%s)rAz --versionrrZglibcz fs-encodingz%s, %slangz%Y-%m-%d %H:%M:%Sz boot-timeruser~homerZpyexeZhostnameZPIDZcpusz%.1f%%, %.1f%%, %.1f%%cSsg|]}|tdqS)d)r cpu_countrrxrxryrpsz!print_sysinfo..Zloadavgz%s%%, used=%s, total=%sZmemoryswaprSrhrzF======================================================================r]z%-17s %s:)I collectionsdatetimegetpasslocaleplatformpprintrv ImportErrorwheel OrderedDictrrrrZOSXZmac_verr rmaprZ win32_verrrtsystemversionlistZ architecturemachiner rZpython_implementationZpython_versionZpython_compilerrrurZlibc_verrgetfilesystemencodingZ getlocaleZ fromtimestamp boot_timestrftimeZnowZgetuserr~r expanduserrr#Znodegetpidr|tuplerevirtual_memoryrZpercentr ZusedZtotal swap_memoryrrSras_dictrZpformatrjrritemsrqflush)rrrrrrrvrinfooutrrwrXr}ZpinfokvrxrxryrF(s                     cCs6t}t|dr|St|dr2t|SdS)Nrjrcr)rrrrjrandomchoicerc)rrxrxry_get_eligible_cpus   rc@sBeZdZdZddifddifgZddifddddifd difd difd difd difd difddifddifg Zddifddddifddifddifddifddifddifddifddifddifddifddifddifd difd!difd"difd#difgZerFed$difg7Zed%difg7Zed&difg7Zed'difg7Zer\ed(difg7Ze rred)difg7Ze red*e j fifg7Ze red+difg7Zered,difg7Zered-difg7Zered.difg7Zered/dd0d1ifg7ZgZereddifg7Znede jfifg7Ze rJed*e j d2fifg7Ze rerned)e jd3fifg7Zned)e jfifg7Ze red+egfifg7Zd4ejfifd5difd6difd7difd8difgZered4ejfifg7Zed4ejfifg7ZeeeeZd9d:ZdDd;d<Zd=d>Z e!d?d@Z"e!dAdBZ#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_percentrrr TZ is_runningZmemory_info_exZoneshotrparentsrrrZcmdlineZ connectionskindall cpu_timesZ create_timerrwrWZ memory_inforniceZnum_ctx_switchesZ num_threadsZ open_filesZppidrrpZusernameZuidsZgidsZterminalrZrkrgrlrcrjrfr[rhZgroupedF)rirrZsuspendZresumer:killcCs ||_dSr)_proc)rrrxrxryrszprocess_namespace.__init__ccsZt|}t||D]>\}}}|r,|t|j|}tj|f||}||fVqdSz_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)rrshuffle clear_cacherrrr9)rlsrfun_namerrrrxrxryiters  zprocess_namespace.itercCs|jj|jjdddS)z&Clear the cache of a Process instance.T)Z _ignore_nspN)rZ_initrrrxrxryrszprocess_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)rrrAttributeError)clsZ test_classrrrZ meth_namer_rxrxrytest_class_coverages z%process_namespace.test_class_coveragecCs`tdd|jD}tdd|jD}tddttjD}||B|A}|r\td|dS)NcSsg|] }|dqSrrxrrxrxryr sz*process_namespace.test..cSsg|] }|dqSrrxrrxrxryrscSsg|]}|ddkr|qS)rrrxrrxrxryrs z!uncovered Process class names: %r)rrignoredrrrr)rthisrklassZleftoutrxrxrytest s  zprocess_namespace.testN)T)$rrrrZutilsrgettersr r0r1r4rZ RLIMIT_NOFILEr-r3r/r r2ZsettersZNORMAL_PRIORITY_CLASSrZIOPRIO_CLASS_NONEZ IOPRIO_NORMALrrSIGTERMZkillersZ CTRL_C_EVENTZCTRL_BREAK_EVENTrrrr classmethodrrrxrxrxryrDs       c@seZdZdZddifddddifddddifddifd dd difd dd difd dd difd dddifdefifddddifddifddifddddifdefifddifddifddifddifgZereddd difg7Ze reddifg7Ze reddifg7Ze r$eddifg7Ze r:eddifg7Ze r`ed difg7Zed!d"ifg7Zd#difd$egfifd%difd&difgZeZed'd(ZejZd)S)*rEzA 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() rrxr|ZlogicalFTZ cpu_statsrZpercpuZdisk_io_countersZperdiskZdisk_partitionsrZ disk_usageZnet_connectionsrZ net_if_addrsZ net_if_statsriZpernicZ pid_existsrSrZusersrrdrerornrmZwin_service_iterZwin_service_get)ZalgZ process_iterrrZcpu_times_percentccsLt|}t||D]0\}}}tt|}tj|f||}||fVqdSr)rrrrrrr9)rrrrrrxrxryrHs   zsystem_namespace.iterN)rrrrr~rrrr.HAS_GETLOADAVGr8r7r5r rrrr staticmethodrrDrrxrxrxryrEsT         cCs d|_|S)zA decorator to mark a TestCase class. When running parallel tests, class' unit tests will be run serially (1 process). T)Z _serialrun)rrxrxry serialrunWsrcCsdd}ttd||dS)zZDecorator which runs a test function and retries N times before actually failing. cSstd|tjddS)Nz %r, retryingr~)rjrrr)r*rxrxryr'esz retry_on_failure..logfunN)r$rr%r')r#rR)r%r'rxrxryrAascsfdd}|S)z,Decorator to Ignore AccessDenied exceptions.cstfdd}|S)Ncs@z ||WStjk r:dk r,s,tdYnXdS)Nzraises AccessDenied)rZ AccessDeniedrOSkipTestrronly_ifrxryros z9skip_on_access_denied..decorator..wrapperrrrrryr,nsz(skip_on_access_denied..decoratorrxrr,rxrryr?ls csfdd}|S)z3Decorator to Ignore NotImplementedError exceptions.cstfdd}|S)NcsHz ||WStk rBdk r*s*dj}t|YnXdS)Nz4%r was skipped because it raised NotImplementedError)rrrOr)rrr_rrxryrs z;skip_on_not_implemented..decorator..wrapperrrrrryr,~s z*skip_on_not_implemented..decoratorrxrrxrryr@|s 127.0.0.1c Cs@tt(}||df|dW5QRSQRXdS)z6Return an unused TCP port. Subject to race conditions.rrN) contextlibclosingsocketbind getsockname)ZhostrrxrxryrQscCs|dkr|ttfkrd}t||}z@tjdkrB|tjtjd|||tj kr`| d|WSt k r| YnXdS)zBinds a generic socket.Nrr)ntcygwinrr^) rrrr~rZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRrrlistenrvr)familytypeaddrrrxrxryrRs     cCsTttj|}z"|||tjkr.|dWntk rN|YnX|S)zBind a UNIX socket.r^)rrrrrrvr)rrrrxrxryrSs  rc Cstt|t}|||d|}t|t}zJ|||}|\}}||krz||fWW5QRS| qPWnt k r| YnXW5QRXdS)z^Build a pair of TCP sockets connected to each other. Return a (server, client) tuple. r^N) rrrrrrrconnectrrr)rrZllrZcaddrarxrxryrTs     cCsd}}z@t|tjd}|dttjtj}|d||Wn6tk r~|dk rh||dk rx|YnX||fS)zBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. Nrr)rSrrZ setblockingrrrvr)rZserverZclientrxrxryrUs  c csg}d}}z|ttjtj|ttjtjtrd|ttj tj|ttj tjt rt rt }t }t |\}}t|tjd}|||fD]}||q|VW5|D] }|q||fD]}|dk rt|qXdS)z1Open as many socket families / types as possible.Nr)rrHrirRrrr SOCK_DGRAMrrr HAS_CONNECTIONS_UNIXrJrUrS)ZsocksZfname1Zfname2rr1s1s2Zs3rxrxryrVs*     cCsddl}trtrts|tjkrTdd|dD}|D]}q6tsHt|}||n8|tj krvtsjt|}| |n|t j krn t d|dS)z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNcSsg|] }t|qSrx)rrrxrxryr sz%check_net_address..rzunknown family %r) ipaddressenumrr"rrrrZ IPv4AddressrZ IPv6AddressrZAF_LINKr)rrrZoctsZnumrxrxryrPs       cCsTdd}dd}dd}dd}d d }||||||||||d S) z*Check validity of a connection namedtuple.cSst|dk}|rdS)N)r)rZhas_pidrxrxry check_ntuple s z-check_connection_ntuple..check_ntuplec Sstdk r n|jtkrt|j|j}t|Rz||jddfWn2tj k rz}z|j t j krjW5d}~XYnXW5QRXn |jt krdS)Nr) rrrrrrrrladdrerrorrZ EADDRNOTAVAILr)rrrrxrxry check_family,s     z-check_connection_ntuple..check_familycSs(ttdt}tdk rn|jtjkr$dS)NSOCK_SEQPACKET)rrobjectrrr)rrrxrxry check_typeAs  z+check_connection_ntuple..check_typecSsD|j|jfD]2}|jttfkr4|s$q t|j|jq |jtkr q dSr)rZraddrrrrrPZipr)rrrxrxry check_addrsMs z,check_connection_ntuple..check_addrscSs0ddttD}|jttfkr,|jtkr,ndS)NcSs g|]}|drtt|qS)ZCONN_rrrxrxryr\s zAcheck_connection_ntuple..check_status..)rrrrrrr)rZvalidsrxrxry check_statusZsz-check_connection_ntuple..check_statusNrx)rrrrrrrxrxrycheck_connection_ntuples    rcCsPzddl}t|dstWn&tk r@ddl}||YSX||SdS)z,Backport of importlib.reload of Python 3.3+.rNreload) importlibrrimpr)modulerrrxrxryrWps cCstjtj|d}tjddkr:ddl}|||Stjdddkrfddlm }||| Sddl }|j ||}|j |}|j||SdS)Nrr}r)SourceFileLoader)r~rsplitextrrrrZ load_sourceZimportlib.machineryr load_moduleimportlib.utilutilspec_from_file_locationmodule_from_specloader exec_module)rrrrrspecmodrxrxryrX}s    cCst|tdS)zRaise a warning msg.N)warningsrY UserWarning)r_rxrxryrYscCsVt|}|j}t|dks&|dtkr*dSt|dd}t|tsDdStdd|DS)z-Check if object is an instance of namedtuple.rrF_fieldsNcss|]}t|tkVqdSr)rr)rnrxrxry sz is_namedtuple..)r __bases__rrrrr)rtbrrxrxryr[s  c#sttrdnddt|d}fddtD}t|}t||zt ||VW5t |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. r{r|z.sorBcs6g|].}tj|jdkr|jkr|jqS)r)r~rrlowerrrwextrxryrs'copyload_shared_lib..N) r"rJrrrhrrr:rErHctypesZCDLL)rCdstlibsrrxrryrZs     c #sddlm}ddlm}dt|d}fddtD}trb|sbddtD}t |}t ||d }zt|}|VW5|d k rtj j j}|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)wintypes)WinErrorz.dllrBcsFg|]>}|jrdtj|jkrd|jkr|jqS)r|Zwow64)rrrr~rrrrxryrs rcSs(g|] }dtj|jkr|jqS)r{)r~rrrrrxrxryrsN)rrrrJrrrhr"rrr:rEZwindllZkernel32 FreeLibraryZHMODULEZargtypesZ_handlerHZWinDLL) rCrrrrrcfilerr4rxrryrZs(         cCstdddS)NTr )r;rxrxrxrycleanup_test_procssrcCs t|Sr)rexit)rframerxrxryrrr)N)F)TF)N)rN)N)N)r)r)r)r)rZ __future__ratexitrrrrrfinspectr~rrrr:rrr6rsrrIrrrrrrrrrrrr r r r Zpsutil._commonr rrZpsutil._compatrrrrrrrrrOZ unittest2rrcatch_warnings simplefilterrr__all__builtin_module_namesr"rfrr\r)maxsizer,r!r r+rrrr&r'decoder(rrZASCII_FSrrrr?__file__r$r%ZHERErrrr-r.rr/r1r2ZHAS_NET_IO_COUNTERSr3r0r4r5rDrmr6rvr7r8Z HAS_THREADSgetuidZ SKIP_SYSCONSrr#rdevnullrregisterrrr*rrrrrrrrrr<r>r=r9rrr:r;rLrKr#rrNrRrOrMrHr>contextmanagerrGrIrJrKrCZskipIfrBrFrrDrErrAr?r@rQrRrSrTrUrVrPrrWrXrYr[rZrrxrxrxrys                           -                         0  ' &-  X %:    !  1 [  B     R   ,