U Ã|ýfVLã@s¾dZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddlm Z ddlm Z ddlm Z ddlm Z ddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"e one Z#dd„Z$e"Gdd„deƒƒZ%Gdd „d eƒZ&e'd!krºdd"l(m)Z)e)e*ƒdS)#zeIterate over all process PIDs and for each one of them invoke and test all psutil.Process() methods. éN)ÚAIX)ÚBSD)ÚFREEBSD)ÚLINUX)ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚOSX)ÚPOSIX)ÚWINDOWS)ÚPY3)ÚFileNotFoundError)Úlong)Úunicode)Ú CI_TESTING)Ú QEMU_USER)ÚVALID_PROC_STATUSES)ÚPsutilTestCase)Úcheck_connection_ntuple)Úcreate_sockets)Ú is_namedtuple)Úis_win_secure_system_proc)Úprocess_namespace)Ú serialrunc s(tƒ‰‡‡fdd„‰‡‡‡‡‡fdd„}zt ˆ¡‰Wn$tjk rZˆ ˆ¡iYSXzˆ ddg¡}Wn tjk rŽˆ ˆ¡Yn–X|d|d‰‰dˆji}tˆƒ}|j |j dd D]T\}}z|ƒ||<WqÄtj k r}zˆ|ˆˆˆƒWY¢qÄW5d}~XYqÄXqÄ|ƒ|SdS) NcsŽˆ |jˆ¡|jdk r&ˆ |j|¡t|tjƒrdˆ |¡|jdk rzˆ |jd¡ˆ |j|¡nt|tj ƒrzˆ  |¡t |ƒt |ƒdS©Nr) Ú assertEqualÚpidÚnameÚ isinstanceÚpsutilZ ZombieProcessZassertProcessZombieÚppidÚassertGreaterEqualÚ NoSuchProcessÚassertProcessGoneÚstrÚrepr)ÚexcÚprocrr )rÚtcase©úP/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_process_all.pyÚcheck_exception6s      z"proc_info..check_exceptionc sNˆdkrJzˆ d¡Wn2tjk rH}zˆ|ˆˆˆƒW5d}~XYnXdSr)ÚwaitrÚError)r&)r+rrr r'r)r*Údo_waitDs zproc_info..do_waitr rrF)Ú clear_cache) rrÚProcessr"Z assertPidGoneÚas_dictr#rrÚiterÚgettersr-)rr.ÚdÚinfoÚnsZfunZfun_namer&r))r+rrr r'r(r*Ú proc_info3s.   r7c@s8eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Z dd?„Z"d@dA„Z#dBdC„Z$dDdE„Z%dFdG„Z&dHdI„Z'dJdK„Z(dLS)MÚTestFetchAllProcessesz·Test which iterates over all running processes and performs some sanity checks against Process API's returned values. Uses a process pool to get info about all processes. cCst d¡trt ¡|_dS©NF)rÚ _set_debugÚ USE_PROC_POOLÚmultiprocessingZPoolÚpool©Úselfr)r)r*ÚsetUpks zTestFetchAllProcesses.setUpcCs&t d¡tr"|j ¡|j ¡dS©NT)rr:r;r=Ú terminateÚjoinr>r)r)r*ÚtearDownrs  zTestFetchAllProcesses.tearDowncCsJddlm}tr"|j |t ¡¡Sg}t ¡D]}| ||ƒ¡q.|SdS)Nr)r7)Zpsutil.tests.test_process_allr7r;r=Zimap_unorderedrÚpidsÚappend)r?r7Zlsrr)r)r*Úiter_proc_infoxs  z$TestFetchAllProcesses.iter_proc_infoc Csèg}| ¡D]Â}| ¡D]´\}}t||ƒ}z|||ƒWnrtk rªd}|d||dt|ƒ|f7}|d7}|dt ¡7}d dd„| ¡Dƒ¡d}|  |¡YqX|d d gdd ifkr|st |ƒ‚qq |rä|  d  |¡¡‚dS) NzH ====================================================================== z+FAIL: name=test_%s, pid=%s, ret=%s info=%s rzF----------------------------------------------------------------------z %sÚ css|]}d|VqdS)z Nr))Ú.0Úir)r)r*Ú –sz1TestFetchAllProcesses.test_all..rçÚ) rGÚitemsÚgetattrÚ Exceptionr%Ú tracebackÚ format_excrCÚ splitlinesrFÚAssertionErrorZfail)r?Zfailuresr5rÚvalueÚmethÚsr)r)r*Útest_all…s,  üzTestFetchAllProcesses.test_allcCs&| |t¡|D]}| |t¡qdS©N)ÚassertIsInstanceÚlistr$)r?Úretr5Úpartr)r)r*Úcmdlinežs zTestFetchAllProcesses.cmdlinecCs°| |ttf¡| | ¡|¡|r¬tr6| d¡s6dStj  |¡sJt |ƒ‚t r¬tj  |¡r¬t tdƒr¬t tdƒr¬zt |tj¡s‚t ‚Wn&t k rªtj |¡r¦ts¦‚YnXdS)Nz.exeÚaccessÚX_OK)rZr$rrÚstripr ÚendswithÚosÚpathÚisabsrTr ÚisfileÚhasattrr_r`Úexistsr©r?r\r5r)r)r*Úexe£szTestFetchAllProcesses.execCs| |t¡| |d¡dSr©rZÚintr!rir)r)r*r¶s zTestFetchAllProcesses.pidcCs(| |ttf¡| |d¡t|ƒdSr)rZrlrr!r7rir)r)r*r ºs zTestFetchAllProcesses.ppidcCs@| |ttf¡tr(|s(t|dƒr(dSts<|st|ƒs t‚|D](}| |ttf¡|dkr| |d¡qdS)Néÿÿÿÿr©rrTrZrlrr!)r?r\r5Úfieldr)r)r*Ú io_countersõs  z!TestFetchAllProcesses.io_counterscCsztr>| |jt¡| |jt¡| |jd¡| |jd¡n8tjtjtj tj g}| |t¡| |d¡|  ||¡dSr) rrZZioclassrlrUr!rZIOPRIO_VERYLOWZ IOPRIO_LOWZ IOPRIO_NORMALZ IOPRIO_HIGHrz)r?r\r5Úchoicesr)r)r*Úioniceüsü  zTestFetchAllProcesses.ionicecCs8| |t¡tr(|dkr(t|dƒr(dS| |d¡dS)Nrré)rZrlr rr!rir)r)r*Ú num_threads s z!TestFetchAllProcesses.num_threadscCsj| |t¡|D]T}t|ƒs t‚| |jd¡| |jd¡| |jd¡|D]}| |tt f¡qNqdSr) rZr[rrTr!ÚidZ user_timeZ system_timerlrn)r?r\r5Útr}r)r)r*Úthreadss  zTestFetchAllProcesses.threadscCs2t|ƒs t‚|D]}| |t¡| |d¡qdSr)rrTrZrnr!)r?r\r5Únr)r)r*Ú cpu_timess  zTestFetchAllProcesses.cpu_timescCs.| |t¡d|kr dks*nt|ƒ‚dS)NrLgY@©rZrnrTrir)r)r*Ú cpu_percent%s z!TestFetchAllProcesses.cpu_percentcCs\| |t¡tr|dkrdS| |d¡t ¡dkr@| |d¡| |tt t ¡ƒƒ¡dS)Nr{rr) rZrlrr!rÚ cpu_countrrzr[Úrangerir)r)r*Úcpu_num)s     zTestFetchAllProcesses.cpu_numcCszt|ƒs t‚|D] }| |ttf¡| |d¡qtrv| |j|j¡| |j |j ¡| |j |j ¡| |j |j¡dSr)rrTrZrlrr!r Z peak_wsetZwsetZpeak_paged_poolZ paged_poolZpeak_nonpaged_poolZ nonpaged_poolZ peak_pagefileZpagefile©r?r\r5rUr)r)r*Ú memory_info2s z!TestFetchAllProcesses.memory_infocCst|ƒs t‚t ¡j}|jD]Z}t||ƒ}| |tt f¡|j |d||fdt st r`|dkr`q|j |||||fdqt rŒ|  |j|j¡dS)Nr)Úmsg)ZvmsÚdata)rrTrZvirtual_memoryÚtotalÚ_fieldsrOrZrlrr!rr ZassertLessEqualZpssZuss)r?r\r5r‘rrUr)r)r*Úmemory_full_info=s    z&TestFetchAllProcesses.memory_full_infoc Cs| |t¡|D]þ}| |jt¡| |jt¡| |j ¡|j¡trZ| |jd¡nft r´| |j t¡| |j t¡| |j t¡|  |j d¡| |j d¡| |j d¡n trÀ|jsÀqtj |j¡sÖt|ƒ‚zt |j¡}Wntk rúYqXt |j¡st|ƒ‚qdS)Nr{r)ÚrÚwÚazr+za+)rZr[Úfdrlrdr$rrar rÚpositionÚmodeÚflagsr!rzZ assertGreaterrrcrerTÚstatr ÚS_ISREGÚst_mode)r?r\r5ÚfÚstr)r)r*Ú open_filesMs,   z TestFetchAllProcesses.open_filescCs| |t¡| |d¡dSrrkrir)r)r*Únum_fdsgs zTestFetchAllProcesses.num_fdsc CsLtƒ<| t|ƒtt|ƒƒ¡|D]}t|ƒs4t‚t|ƒq$W5QRXdSrY)rrÚlenÚsetrrTr)r?r\r5Úconnr)r)r*Únet_connectionsks  z%TestFetchAllProcesses.net_connectionsc Csž| |ttf¡| | ¡|¡|rštj |¡s8t|ƒ‚zt  |¡}WnBt k rˆ}z$t rjt j  |¡rjn|jtjkrx‚W5d}~XYnXt  |j¡sšt‚dSrY)rZr$rrrarcrdrerTr›ÚOSErrorr rZ _psplatformZis_permission_errÚerrnoÚENOENTÚS_ISDIRr)r?r\r5rŸÚerrr)r)r*Úcwdrs zTestFetchAllProcesses.cwdcCs.| |t¡d|kr dks*nt|ƒ‚dS)Nrédrˆrir)r)r*Úmemory_percent‚s z$TestFetchAllProcesses.memory_percentcCs| |t¡dSrY)rZÚboolrir)r)r*Ú is_running†sz TestFetchAllProcesses.is_runningcCsN| |t¡| |g¡ttt ¡ƒƒ}|D]}| |t¡| ||¡q,dSrY)rZr[ryr‹rrŠrlrz)r?r\r5Zcpusr†r)r)r*Ú cpu_affinity‰s    z"TestFetchAllProcesses.cpu_affinitycCsH| |ttdƒf¡|dk rDtj |¡s0t|ƒ‚tj |¡sDt|ƒ‚dSrY)rZr$ÚtypercrdrerTrhrir)r)r*Úterminal‘szTestFetchAllProcesses.terminalcCsÎ|D]Ä}| |jt¡| |jt¡| |jt¡|jD]Ž}t||ƒ}|dkrr| d¡sÆtj  |j¡sÆt |jƒ‚q8|dkrŒ|sÆt t |ƒƒ‚q8|dkrªt sÆ|sÆt t |ƒƒ‚q8| |t tf¡| |d¡q8qdS)Nrd)ú[z anon_inode:ÚaddrÚpermsr)rZr´r$rµrdr’rOÚ startswithrcrerTr%r rlrr!)r?r\r5ÚntÚfnamerUr)r)r*Ú memory_maps—s    z!TestFetchAllProcesses.memory_mapscCs| |t¡| |d¡dSrrkrir)r)r*Ú num_handles­s z!TestFetchAllProcesses.num_handlescCsr| |t¡tr0d|kr$dksnnt|ƒ‚n>dd„ttƒDƒ}| ||¡trb| |tj ¡n | |t¡dS)NiìÿÿÿécSs g|]}| d¡rtt|ƒ‘qS)Z_PRIORITY_CLASS)rbrOr)rIÚxr)r)r*Ú ¶s þz.TestFetchAllProcesses.nice..) rZrlr rTÚdirrrzr ÚenumÚIntEnum)r?r\r5Z prioritiesr)r)r*Únice±s  þ zTestFetchAllProcesses.nicecCs6t|ƒs t‚|D] }| |ttf¡| |d¡qdSrr|rr)r)r*Únum_ctx_switchesÁs z&TestFetchAllProcesses.num_ctx_switchescCs@| |t¡| t|ƒd¡| |dd¡| |dd¡dS)Nérr{r)rZÚtuplerr¢r!rir)r)r*ÚrlimitÇs zTestFetchAllProcesses.rlimitcCs:| |t¡| ¡D] \}}| |t¡| |t¡qdSrY)rZÚdictrNr$)r?r\r5ÚkÚvr)r)r*ÚenvironÍs  zTestFetchAllProcesses.environN))Ú__name__Ú __module__Ú __qualname__Ú__doc__r@rDrGrXr^rjrr rrrrtrvrwrmr~r€r‚r…r‡r‰rŒrŽr“r r¡r¥r«r­r¯r°r²r¹rºrÁrÂrÅrÉr)r)r)r*r8dsL       r8c@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú TestPidsRangea@Given pid_exists() return value for a range of PIDs which may or may not exist, make sure that psutil.Process() and psutil.pids() agree with pid_exists(). This guarantees that the 3 APIs are all consistent with each other. See: https://github.com/giampaolo/psutil/issues/2359 XXX - Note about Windows: it turns out there are some "hidden" PIDs which are not returned by psutil.pids() and are also not revealed by taskmgr.exe and ProcessHacker, still they can be instantiated by psutil.Process() and queried. One of such PIDs is "conhost.exe". Running as_dict() for it reveals that some Process() APIs erroneously raise NoSuchProcess, so we know we have problem there. Let's ignore this for now, since it's quite a corner case (who even imagined hidden PIDs existed on Windows?). cCst d¡dSr9©rr:r>r)r)r*r@åszTestPidsRange.setUpcCst d¡dSrArÏr>r)r)r*rDèszTestPidsRange.tearDownc sVdd„}‡fdd„}tddƒD]2}tr0||ƒr0qˆj|d||ƒW5QRXqdS)Nc Ss‚ztd|dƒ}Wntk r(YdSX|J|D]6}| d¡r4t| ¡dƒ}||kW5QR£Sq4tdƒ‚W5QRXdS)Nz/proc/%s/statusÚrbFsTgid:rz'Tgid' line not found)Úopenr r¶rlÚsplitÚ ValueError)rržÚlineZtgidr)r)r*Ú is_linux_tidìs z+TestPidsRange.test_it..is_linux_tidc s¨d}t |¡}zb|r4t |¡tsnˆ |t ¡¡n:tsZˆ tj¡t |¡W5QRXtsnˆ  |t ¡¡Wn,tj t fk rœ|d8}|dkr˜‚YqXdSqdS)Nérr) rZ pid_existsr0r rzrErÚ assertRaisesr"Z assertNotInr-rT)rr¼rhr>r)r*Úcheckûs"  z$TestPidsRange.test_it..checkri¸ )r)r‹rZsubTest)r?rÕrØrr)r>r*Útest_itës  zTestPidsRange.test_itN)rÊrËrÌrÍr@rDrÙr)r)r)r*rÎÔsrÎÚ__main__)Ú run_from_name)+rÍr¿r§r<rcr›rorQrrrrrrrrr r r Zpsutil._compatr r rrZ psutil.testsrrrrrrrrrrr;r7r8rÎrÊZpsutil.tests.runnerrÛÚ__file__r)r)r)r*ÚsT                         1qN