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 StdSnt r|tj p|tjtj p|tdtj ddp|t }|std|Stjtj }tj|st||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 ValueErrorexistsAssertionError)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"       cstjs tt}td|}d}t|}z| t t |\}}| \}}zZt |gggt t|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)rr rrJrrrScloserHZ settimeoutrr9acceptselectfilenorZrecvrrrrM)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}t |rt |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)r rrxryterm_pids zterminate..term_pidcSs4|jr|j|jr |j|jr0|jdSr)rqrrrr)rrxrxry flush_popens   zterminate..flush_popenz wrong type %rN) r Zpsutil._psposixrrrsrrrr pid_existsrr TypeError)Z proc_or_pidr wait_timeoutrr r rrrx)rrr rrryr: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 rrZgetwindowsversionhasattrr researchrgroup)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,rr0rxrxrxryr&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 Cs:t|d}|}W5QRX|s*|s*t|r6t||S)z8Wait for a file to be written on disk with some content.rb)rreadrrH)fnamerrrdatarxrxryrOs cCs|}t|st|S)zVKeep calling function for timeout secs and exit if eval() expression is True. )evalr)rexprretrxrxryrMs cCsndd}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 %sr1)rrrZ WindowsErrorrYrr)rr+rrrxrxry retry_funs  " zsafe_rmpath..retry_funN) r~statS_ISDIRst_moderpartialshutilZrmtreeremover r)rr9strrxrxryrHs   cCs(zt|Wntk r"YnXdS)z-Convenience function for creating a directoryN)r~mkdirrrrxrxry safe_mkdirsrBc cs.t}zt|dVW5t|XdS)z@Context manager which temporarily changes the current directory.N)r~rrG)dirnamecurdirrxrxryrGs   c Cstj|rt||rtds(tdt|tr int main() { pause(); return 1; } z.csuffixrz-oN)r~rrrrrrboolrrrrrJrrHrrsrtr>copyfiler#r r:chmodr<S_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. )prefixrGrN)tempfileZmktempr&r~rrr)rGrrrxrxryrJ9s 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) rrrrOr!unittestrNZassertRaisesRegexprPrrQrxrxrxryrNJs  rNc@sBeZdZdZdddZddZdd Zd d Zd d ZddZ dS)rCzUTest class providing auto-cleanup wrappers on top of process test utilities. rNcCst||d}|t||S)N)rGr)rJ addCleanuprH)rrGrr4rxrxryrJis  zPsutilTestCase.get_testfncOst||}|t||Sr)r<rSr:)rrrrrxrxryr<ns  zPsutilTestCase.spawn_testproccCs*t\}}|t||t|||fSr)r>rSr:)rZchild1Zchild2rxrxryr>ss   z"PsutilTestCase.spawn_children_paircCs*t\}}|t||t|||fSr)r=rSr:)rrrrxrxryr=ys   zPsutilTestCase.spawn_zombiecOs*t||\}}|t||t||Sr)r9rSrHr:)rrrrrrxrxryr9s  zPsutilTestCase.pyruncCs|tjtj|jt|tjtjfrn|r2tz | }Wntjk rTYnXtd||j ddt |jrt|j| |jt dS)Nz3Process.status() didn't raise exception (status=%s)rr) assertRaisesrrrrrr is_runningrrrr Z assertNotInpids)rrrrxrxryassertProcessGones   z PsutilTestCase.assertProcessGone)rN) rrrrrJr<r>r=r9rWrxrxrxryrCds 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 rYnum_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_rbrxrxry _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)gcZcollectr\rreZ assertEqualZgarbage)rrtimesZmem1rr8Zmem2rgrxrxry _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. )rrkr appendrcprintrfr) rrrj warmup_timesr( toleranceZmessagesZprev_memZincreaseidxr[rbsuccessrxrxry _check_mems.     zTestMemoryLeak._check_memcCs|Srrx)rrrxrxryreszTestMemoryLeak.callNc Cs|dk r |n|j}|dk r|n|j}|dk r0|n|j}|dk rB|n|j}zD|dksZtd|dksjtd|dksztd|dkstdWn.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(rorrrrkrhrr)rrrjrnr(rorrxrxryexecute 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)rTrxr-rrrxryre"sz*TestMemoryLeak.execute_w_exc..callN)rs)rr-rrrerxrtry execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)rrrrrjrnror)r(rarrrYr\r_rcrhrkrrrersrurxrxrxryrBs$  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)rEz --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=%sZmemoryswaprVrhrzF======================================================================r`z%-17s %s:)I collectionsdatetimegetpasslocaleplatformpprintry ImportErrorwheel OrderedDictrrrrZOSXZmac_verr rmaprZ win32_verr!rwsystemversionlistZ architecturemachiner rZpython_implementationZpython_versionZpython_compilerrrxrZlibc_verrgetfilesystemencodingZ getlocaleZ fromtimestamp boot_timestrftimeZnowZgetuserr~r expanduserrr#Znodegetpidrtuplerevirtual_memoryrZpercentr ZusedZtotal swap_memoryrrVras_dictrZpformatrmrritemsrqflush)rrrrrrryrinfooutrrzr[rZpinfokvrxrxryrF(s                     cCs6t}t|dr|St|dr2t|SdS)Nrjrcr)rrr!rjrandomchoicerc)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_percentrrrTrUZmemory_info_exZoneshotrparentsrrrZcmdlineZ connectionskindall cpu_timesZ create_timerrwrZZ memory_inforniceZnum_ctx_switchesZ num_threadsZ open_filesZppidrrpZusernameZuidsZgidsZterminalr]rkrgrlrcrjrfr^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_cacherrrr=)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)r!rrAttributeError)clsZ test_classrrrZ meth_namerbrxrxrytest_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() rrxrZlogicalFTZ cpu_statsrZpercpuZdisk_io_countersZperdiskZdisk_partitionsrZ disk_usageZnet_connectionsrZ net_if_addrsZ net_if_statsriZpernicr rVrZusersrrdrerornrmZwin_service_iterZwin_service_get)ZalgZ process_iterrrZcpu_times_percentccsLt|}t||D]0\}}}tt|}tj|f||}||fVqdSr)rrrrrrr=)rrrrrrxrxryrHs   zsystem_namespace.iterN)rrrrr~rrrr.HAS_GETLOADAVGr8r7r5r rrrr staticmethodrrDrrxrxrxryrEsT         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)inspectZisclassrZ _serialrun)rrxrxry serialrunWsrcCsdd}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..logfunN)r'rr(r*)r&r)r(r*rxrxryrAascsfdd}|S)z,Decorator to Ignore AccessDenied exceptions.cstfdd}|S)Ncs@z ||WStjk r:dk r,s,tdYnXdS)Nzraises AccessDenied)rZ AccessDeniedrRSkipTestrronly_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)rrrRr)rrrbrrxryrs 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     cCsrtjs ttj|rt|ttj|}z"|||tj krL| dWnt k rl| YnX|S)zBind a UNIX socket.r^) rr rr~rrrrrrrrvr)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     cCstjs td}}z@t|tjd}|dttjtj}|d||Wn6t k r|dk rr| |dk r| YnX||fS)zBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. Nrr) rr rrSrrZ 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)rrHrlrRrrr SOCK_DGRAMrrr HAS_CONNECTIONS_UNIXrJrUrS)ZsocksZfname1Zfname2rr4s1s2Zs3rxrxryrVs*     cCsddl}tr(tr(ts(t|tjs(t||tjkrdd| dD}t |dksZt||D]"}d|krvdks^nt|q^tst |}| |nb|tj krt|tst|tst |}||n.|tjkrtd|dk st|n td |dS) z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNcSsg|] }t|qSrx)rrrxrxryr sz%check_net_address..rrz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r) ipaddressenumrr"rIntEnumrrrrrrZ IPv4AddressrrZ IPv6AddressrZAF_LINKr"matchr)rrrZoctsZnumrxrxryrPs&       cCsTdd}dd}dd}dd}d d }||||||||||d S) z*Check validity of a connection namedtuple.cSst|dk}t|dks$tt||d|jks.check_ntuplec Ss|jtttfkst|jtdk r:t|jtjsNt|nt|jtsNt||jtkrt |j|j }t |Rz| |jddfWn2t jk r}z|jtjkrW5d}~XYnXW5QRXn |jtkr|jtjkst|jdS)Nr)rrrrrrrrrrrrrrrerrorrZ EADDRNOTAVAILrr CONN_NONE)rrrrxrxry check_family,s     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)rrobjectrrrrrrrrrrr)rrrxrxry check_typeAs  z+check_connection_ntuple..check_typecSs|j|jfD]}|jttfkrt|ts4tt||s:q t|j t sTtt|j d|j krjdksvnt|j t |j |jq |jt kr t|ts tt|q dS)Nri)rrrrrrrrrZportrrPZiprr)rrrxrxry check_addrsMs" z,check_connection_ntuple..check_addrscSst|jtst|jddttD}|j|ks.check_status..) rrrrrrrrrrrr)rZvalidsrxrxry check_statusZs z-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) importlibr!rimpr)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)rbrxrxryrYscCsVt|}|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.sorFcs6g|].}tj|jdkr|jkr|jqS)r)r~rrlowerrrwextrxryrs'copyload_shared_lib..N) r"rJrrrhrrr>rIrHctypesZCDLL)rGdstlibsrrxrryrZs     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.dllrFcsFg|]>}|jrdtj|jkrd|jkr|jqS)r|Zwow64)rrrr~rrrrxryrs rcSs(g|] }dtj|jkr|jqS)r{)r~rrrrrxrxryrsN)rr r rJrrrhr"rrr>rIZwindllZkernel32 FreeLibraryZHMODULEZargtypesZ_handlerHZWinDLL) rGr r rrrcfiler r8rxr ryrZs(         cCstdddS)NTr)r;rxrxrxrycleanup_test_procssrcCs t|Sr)rexit)rframerxrxryrrr)N)F)TF)N)rN)N)N)r)r)r)r)rZ __future__ratexitrrrrrirr~rr"rr>rrr:rsrrMrrrrrrrrrrrr r r r Zpsutil._commonr rrZpsutil._compatrrrrrrrrrRZ unittest2rrcatch_warnings simplefilterrr__all__builtin_module_namesr"rfrr\r)maxsizer,r!r r+rrrr&r'decoder(rrZASCII_FSrrrrC__file__r$r%ZHERErr!rr-r.rr/r1r2ZHAS_NET_IO_COUNTERSr3r0r4r5rHrmr6rvr7r8Z HAS_THREADSgetuidZ SKIP_SYSCONSrr#rdevnullrregisterrrr*rrrrrrrrrr<r>r=r9rrr:r;rLrKr&rrNrrOrMrHrBcontextmanagerrGrIrJrNrCZskipIfrBrFrrDrErrAr?r@rQrRrSrTrUrVrPrrWrXrYr[rZrrxrxrxrys                           -                         0  ' &-  X %:    !  1 [  B     R   ,