3 JZ2^@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl m Z ddl m Z ddl mZdd l mZdd l mZdd l mZdd l mZdd l mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddl Z Gd d!d!e$j(Z)Gd"d#d#e$j(Z*Gd$d%d%e$j(Z+Gd&d'd'e$j(Z,e-d(kre e.dS))zContracts tests. These tests mainly check API sanity in terms of returned types and APIs availability. Some of these are duplicates of tests test_system.py and test_process.py N)closing)AIX)BSD)FREEBSD)LINUX)NETBSD)OPENBSD)OSX)POSIX)SUNOS)WINDOWS)callable)long)bind_unix_socket)check_connection_ntuple)get_kernel_version)HAS_CONNECTIONS_UNIX) HAS_RLIMIT)HAS_SENSORS_FANS)HAS_SENSORS_TEMPERATURES) is_namedtuple)run_test_module_by_name) safe_rmpath)skip_on_access_denied)TESTFN)unittest)unix_socket_path)VALID_PROC_STATUSES)warnc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.S)/TestAvailabilityzQMake sure code reflects what doc promises in terms of APIs availability. cCs$tp tp t}|jttjd|dS)N cpu_affinity)rr r assertEqualhasattrpsutilProcess)selfhasitr'&/usr/lib64/python3.6/test_contracts.pytest_cpu_affinity<s z"TestAvailability.test_cpu_affinitycCs(|jttdt|jttdtdS)NZwin_service_iterZwin_service_get)r!r"r#r )r%r'r'r(test_win_service@sz!TestAvailability.test_win_servicecCs|jttdtptptdS)NZ PROCFS_PATH)r!r"r#rr r)r%r'r'r(test_PROCFS_PATHDs z!TestAvailability.test_PROCFS_PATHcCsj|j}|ttdt|ttdt|ttdt|ttdt|ttdt|ttdtdS)NZABOVE_NORMAL_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZIDLE_PRIORITY_CLASSZNORMAL_PRIORITY_CLASSZREALTIME_PRIORITY_CLASS)r!r"r#r )r%aer'r'r(test_win_priorityHsz"TestAvailability.test_win_prioritycCsJ|j}|ttdt|ttdt|ttdt|ttdtdS)NZIOPRIO_CLASS_NONEZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLE)r!r"r#r)r%r,r'r'r(test_linux_ioprioQs z"TestAvailability.test_linux_iopriocCsH|j}totdk}|ttjd||ttd||ttd||ttd||ttd||ttd ||ttd ||ttd ||ttd ||ttd ||ttd||ttd||ttd|totdk}|ttd||ttd||ttd||ttd||ttd|dS)N$rlimitZ RLIM_INFINITYZ RLIMIT_ASZ RLIMIT_COREZ RLIMIT_CPUZ RLIMIT_DATAZ RLIMIT_FSIZEZ RLIMIT_LOCKSZRLIMIT_MEMLOCK RLIMIT_NOFILEZ RLIMIT_NPROCZ RLIMIT_RSSZ RLIMIT_STACKrZRLIMIT_MSGQUEUEZ RLIMIT_NICEZ RLIMIT_RTPRIOZ RLIMIT_RTTIMEZRLIMIT_SIGPENDING)r/r0r1)r4r)r!rrr"r#r$)r%r,r&r'r'r(test_linux_rlimitXs*z"TestAvailability.test_linux_rlimitcCs:totjjdptjjd}|jttd|p2tp2tdS)Nz/sys/devices/system/cpu/cpufreqz$/sys/devices/system/cpu/cpu0/cpufreqZcpu_freq) rospathexistsr!r"r#r r )r%linuxr'r'r( test_cpu_freqps  zTestAvailability.test_cpu_freqcCs|jttdtdS)Nsensors_temperatures)r!r"r#r)r%r'r'r(test_sensors_temperaturesvsz*TestAvailability.test_sensors_temperaturescCs|jttdtdS)N sensors_fans)r!r"r#r)r%r'r'r(test_sensors_fansysz"TestAvailability.test_sensors_fanscCs"|jttdtptptptdS)NZsensors_battery)r!r"r#rr rr )r%r'r'r( test_battery|s zTestAvailability.test_batterycCs |jttjdtptptdS)Nenviron)r!r"r#r$rr r )r%r'r'r(test_proc_environsz"TestAvailability.test_proc_environcCs|jttjdtdS)Nuids)r!r"r#r$r )r%r'r'r(test_proc_uidsszTestAvailability.test_proc_uidscCs|jttjdtdS)NrB)r!r"r#r$r )r%r'r'r(test_proc_gidsszTestAvailability.test_proc_gidscCs|jttjdtdS)Nterminal)r!r"r#r$r )r%r'r'r(test_proc_terminalsz#TestAvailability.test_proc_terminalcCs|jttjdtptdS)Nionice)r!r"r#r$rr )r%r'r'r(test_proc_ionicesz!TestAvailability.test_proc_ionicecCs|jttjdtdS)Nr2)r!r"r#r$r)r%r'r'r(test_proc_rlimitsz!TestAvailability.test_proc_rlimitcCs(ttjd}|j|tstrdnddS)N io_countersFT)r"r#r$r!r r )r%r&r'r'r(test_proc_io_counterss z&TestAvailability.test_proc_io_counterscCs|jttjdtdS)Nnum_fds)r!r"r#r$r )r%r'r'r(test_proc_num_fdssz"TestAvailability.test_proc_num_fdscCs|jttjdtdS)N num_handles)r!r"r#r$r )r%r'r'r(test_proc_num_handlessz&TestAvailability.test_proc_num_handlescCs |jttjdtptptdS)Nr )r!r"r#r$rr r)r%r'r'r(test_proc_cpu_affinitysz'TestAvailability.test_proc_cpu_affinitycCs |jttjdtptptdS)Ncpu_num)r!r"r#r$rrr )r%r'r'r(test_proc_cpu_numsz"TestAvailability.test_proc_cpu_numcCs,ttjd}|j|tststr"dnddS)N memory_mapsFT)r"r#r$r!rrr)r%r&r'r'r(test_proc_memory_mapss z&TestAvailability.test_proc_memory_mapsN)__name__ __module__ __qualname____doc__r)r*r+r-r.r5r:r<r>r?rArCrDrFrHrIrKrMrOrPrRrTr'r'r'r(r7s. rc@seZdZddZdS)TestDeprecationsc Csdtjdd}tjjWdQRX|d}|j|jt|jdt |j |jdt |j dS)NT)recordrzmemory_info_ex() is deprecatedzuse memory_info() instead) warningscatch_warningsr#r$memory_info_exassertIsInstancecategory FutureWarningassertInstrmessage)r%Zwswr'r'r(test_memory_info_exs z$TestDeprecations.test_memory_info_exN)rUrVrWrer'r'r'r(rYsrYc@seZdZdZeddZddZddZdd Zd d Z e j e d e j e d eedddZddZddZddZe j e dddZe j e dddZddZdS) TestSystemzCheck the return types of system related APIs. Mainly we want to test we never return unicode on Python 2, see: https://github.com/giampaolo/psutil/issues/1039 cCstj|_dS)N)r#r$proc)clsr'r'r( setUpClassszTestSystem.setUpClasscCs ttdS)N)rr)r%r'r'r(tearDownszTestSystem.tearDowncCs>tj}t|stx$|D]}|j|t|j|dqWdS)Nr)r# cpu_timesrAssertionErrorr^floatassertGreaterEqual)r%retnr'r'r(test_cpu_timess    zTestSystem.test_cpu_timescCs&x tjddD]}|j|tqWdS)NT)Zperdisk)r#Zdisk_io_countersr^rb)r%kr'r'r(test_io_countersszTestSystem.test_io_counterscCsNxHtjD]<}|j|jt|j|jt|j|jt|j|jtq WdS)N)r#Zdisk_partitionsr^ZdevicerbZ mountpointZfstypeZopts)r%Zdiskr'r'r(test_disk_partitionss zTestSystem.test_disk_partitionsz POSIX onlyzcan't list UNIX sockets)Zonly_ifcCs^tN}tt|6tjdd}|s*tx|D]}|j|jtq0WWdQRXWdQRXdS)NZunix)Zkind) rrrr#Znet_connectionsrlr^Zladdrrb)r%nameZconsconnr'r'r(test_net_connectionss   zTestSystem.test_net_connectionscCsrxltjjD]\\}}|j|txF|D]>}|j|jt|j|jttdf|j|jttdfq(WqWdS)N) r#Z net_if_addrsitemsr^rbZaddressZnetmasktypeZ broadcast)r%ifnameZaddrsaddrr'r'r(test_net_if_addrss   zTestSystem.test_net_if_addrscCs*x$tjjD]\}}|j|tqWdS)N)r#Z net_if_statsrxr^rb)r%rz_r'r'r(test_net_if_statsszTestSystem.test_net_if_statscCs.x(tjddjD]\}}|j|tqWdS)NT)Zpernic)r#Znet_io_countersrxr^rb)r%rzr}r'r'r(test_net_io_countersszTestSystem.test_net_io_countersz not supportedcCsFx@tjjD]0\}}|j|tx|D]}|j|jtq(WqWdS)N)r#r=rxr^rblabel)r%ruunitsunitr'r'r(r>s  zTestSystem.test_sensors_fanscCsFx@tjjD]0\}}|j|tx|D]}|j|jtq(WqWdS)N)r#r;rxr^rbr)r%rurrr'r'r(r<s  z$TestSystem.test_sensors_temperaturescCsfx`tjD]T}|j|jt|j|jttdf|j|jttdf|j|jt tdfq WdS)N) r#usersr^rurbrEryhostpidint)r%userr'r'r( test_userss zTestSystem.test_usersN)rUrVrWrX classmethodrirjrqrsrtrZskipIfr rrr rwr|r~rrr>rr<rr'r'r'r(rfs     rfc@s(eZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Z dd?Z"d@dAZ#dBdCZ$dDdEZ%dFdGZ&dHS)ITestFetchAllProcessesz~Test which iterates over all running processes and performs some sanity checks against Process API's returned values. cCsdtr`ddl}ddl}|j}|j}tdd|D|_tdd|D|_tdd|D|_dS)NrcSsg|] }|jqSr')Zpw_uid).0xr'r'r( (sz/TestFetchAllProcesses.setUp..cSsg|] }|jqSr')Zpw_name)rrr'r'r(r)scSsg|] }|jqSr')Zgr_gid)rrr'r'r(r*s) r pwdgrpZgetpwallZgetgrallsetall_uids all_usernamesall_gids)r%rrrgroupsr'r'r(setUp"szTestFetchAllProcesses.setUpcCsd}tdddddddd d d d g }tr6t r6|jd g}x2ttjD]$}|jdrVqF||kr`qF|j|qFWt }g}x(tj D]}|j x|D]}|}ydf} i} t ||d} | dk rt | r|d krtjf} n|dkrddi} | | | }n| }|d7}WnLtk r>d|jjd|} t| Yqtjtjfk r} zJ|j| j|j| jr|j| j|jt| st| jstWYdd} ~ Xqtk rX} zdddd}|d||f7}||kr|dt|7}|d7}|dd7}|dtj7}djdd|j D}|d7}|j|PWYdd} ~ XqX|ddgdd ifkr~|s~t|t ||}|||qWWdQRXqW|r|j!d j||stdS)!NrZ send_signalZsuspendZresumeZ terminatekillwaitZas_dictparentZchildrenr]oneshotr2r}rSZgroupedFz&%r was skipped because not implementedz.test_ =FzFAIL: test_%s (proc=%sz , ret=%s)z) -z %scss|]}d|VqdS) Nz r')rir'r'r( csz7TestFetchAllProcesses.test_fetch_all..g)"rrradddirr#r$ startswithappendobjectZ process_iterrgetattrr r3NotImplementedError __class__rUrZ NoSuchProcessZ AccessDeniedr!rrurbrlmsg Exceptionrepr traceback format_excjoin splitlinesZfail)r%Z valid_procsZexcluded_namesZattrsrudefaultZfailuresproargskwargsattrrerrsmethr'r'r(test_fetch_all,sx             z$TestFetchAllProcesses.test_fetch_allcCs*|j|tx|D]}|j|tqWdS)N)r^listrb)r%rorgpartr'r'r(cmdlinets  zTestFetchAllProcesses.cmdlinecCst|j|ttdf|s&|j|dnJtjj|s:t|trptjj |rpt tdrpt tdrptj |tj sptdS)NraccessX_OK) r^rbryr!r6r7isabsrlr isfiler"rr)r%rorgr'r'r(exeyszTestFetchAllProcesses.execCs|j|t|j|ddS)Nr)r^rrn)r%rorgr'r'r(rs zTestFetchAllProcesses.pidcCs |j|ttf|j|ddS)Nr)r^rrrn)r%rorgr'r'r(ppidszTestFetchAllProcesses.ppidcCs|j|tts|stdS)N)r^rbrrl)r%rorgr'r'r(rus zTestFetchAllProcesses.namec Cs^|j|ty|j|dWn*tk rFtr@|jtjkr@nYnXtj dtj |dS)Nrz%Y %m %d %H:%M:%S) r^rmrnrlrstatusr#Z STATUS_ZOMBIEtimeZstrftimeZ localtime)r%rorgr'r'r( create_times z!TestFetchAllProcesses.create_timecCsDt|s tx2|D]*}|j|t|j|d|j||jqWdS)Nr)rrlr^rrnrar)r%rorgZuidr'r'r(rBs     zTestFetchAllProcesses.uidscCsPt|s tx>|D]6}|j|tt rt r|j|d|j||jqWdS)Nr) rrlr^rr rrnrar)r%rorggidr'r'r(gidss      zTestFetchAllProcesses.gidscCs*|j|t|sttr&|j||jdS)N)r^rbrlr rar)r%rorgr'r'r(usernames zTestFetchAllProcesses.usernamecCs0|j|t|st|j|d|j|tdS)N?)r^rbrlZassertNotEqualrar)r%rorgr'r'r(rs  zTestFetchAllProcesses.statuscCsBt|s tx0|D](}|j|ttf|dkr|j|dqWdS)Nrr)rrlr^rrrn)r%rorgfieldr'r'r(rJs   z!TestFetchAllProcesses.io_counterscCshtr*t|stx|D]}|j|tqWtrL|j|jd|j|jdn|j|d|j |ddS)Nrrr/)rrr/) r rrlr^rrrnZioclassvaluera)r%rorgrr'r'r(rGs   zTestFetchAllProcesses.ionicecCs|j|t|j|ddS)Nr)r^rrn)r%rorgr'r'r( num_threadss z!TestFetchAllProcesses.num_threadscCsr|j|tx`|D]X}t|s"t|j|jd|j|jd|j|jdx|D]}|j|tt fqRWqWdS)Nr) r^rrrlrnidZ user_timeZ system_timerrm)r%rorgtrr'r'r(threadss    zTestFetchAllProcesses.threadscCs6t|s tx$|D]}|j|t|j|dqWdS)Nr)rrlr^rmrn)r%rorgrpr'r'r(rks   zTestFetchAllProcesses.cpu_timescCs0|j|td|kodkns,t|dS)NggY@)r^rmrl)r%rorgr'r'r( cpu_percents z!TestFetchAllProcesses.cpu_percentcCs\|j|ttr|dkrdS|j|dtjdkr@|j|d|j|tt tjdS)Nrrr) r^rrrnr# cpu_countr!rarrange)r%rorgr'r'r(rQs     zTestFetchAllProcesses.cpu_numcCst|s tx(|D] }|j|ttf|j|dqWtrt r|jdkrxx|j D](}|dkrRt ||}|j |j||dqRWnDt r|j|j |j|j|j|j|j|j|j|j|j|jdS)Nrvms)r)rrlr^rrrnr rr_fieldsr assertGreaterr Z peak_wsetZwsetZpeak_paged_poolZ paged_poolZpeak_nonpaged_poolZ nonpaged_poolZ peak_pagefileZpagefile)r%rorgrrur'r'r( memory_infos    z!TestFetchAllProcesses.memory_infocCst|s ttjj}xR|jD]H}t||}|j|tt f|j |d||fd|j |||||fdqWt r~|j |j |jdS)Nr)r)rrlr#Zvirtual_memorytotalrrr^rrrnZassertLessEqualrZpssZuss)r%rorgrrurr'r'r(memory_full_infos    z&TestFetchAllProcesses.memory_full_infocCs|j|tx|D]}|j|jt|j|jttrF|j|jdnhtr|j|j t|j|j t|j|j t|j |j d|j |j d |j|j dntr|j rqtjj|jst|tjj|jst|qWdS) Nrrrrdar+a+r)rrdrrr)r^rfdrr7rbr r!rZpositionmodeflagsrnrarrr6rrlr)r%rorgfr'r'r( open_filess"   z TestFetchAllProcesses.open_filescCs|j|t|j|ddS)Nr)r^rrn)r%rorgr'r'r(rL(s zTestFetchAllProcesses.num_fdscCs2|jt|tt|x|D] }t|qWdS)N)r!lenrr)r%rorgrvr'r'r( connections,s z!TestFetchAllProcesses.connectionscCs|r|j|ttjj|s$t|ytj|}WnDtk rv}z(trX|j t j j krXn|j t j krfWYdd}~XnXtj|jstdS)N)r^rbr6r7rrlstatOSErrorr errnor#Z _psplatformZACCESS_DENIED_SETENOENTS_ISDIRst_mode)r%rorgstrr'r'r(cwd1s   zTestFetchAllProcesses.cwdcCs0|j|td|kodkns,t|dS)Nrd)r^rmrl)r%rorgr'r'r(memory_percentAs z$TestFetchAllProcesses.memory_percentcCs|j|tdS)N)r^bool)r%rorgr'r'r( is_runningEsz TestFetchAllProcesses.is_runningcCsR|j|t|gkst|ttj}x$|D]}|j|t|j||q.WdS)N)r^rrlrr#rrra)r%rorgZcpusrpr'r'r(r Hs     z"TestFetchAllProcesses.cpu_affinitycCsH|j|ttdf|dk rDtjj|s0t|tjj|sDt|dS)N)r^rbryr6r7rrlr8)r%rorgr'r'r(rEPszTestFetchAllProcesses.terminalcCsx|D]}|j|jt|j|jt|j|jtxr|jD]h}t||}|dkrv|jdstjj |jst |jq<|dkr|st q<|j|t t f|j |dq.i)r^rr rlrr#ra)r%rorgZ prioritiesr'r'r(nicems  "zTestFetchAllProcesses.nicecCs:t|s tx(|D] }|j|ttf|j|dqWdS)Nr)rrlr^rrrn)r%rorgrr'r'r(num_ctx_switchesvs  z&TestFetchAllProcesses.num_ctx_switchescCs@|j|t|jt|d|j|dd|j|dddS)Nr/rrrr)r^tupler!rrn)r%rorgr'r'r(r2|s zTestFetchAllProcesses.rlimitcCs>|j|tx,|jD] \}}|j|t|j|tqWdS)N)r^dictrxrb)r%rorgrrvr'r'r(r@s  zTestFetchAllProcesses.environN)'rUrVrWrXrrrrrrrurrBrrrrJrGrrrkrrQrrrrLrrrrr rErSrNrrr2r@r'r'r'r(rsH H      r__main__)/rXrr6rrrr[ contextlibrr#rrrrrrr r r r Zpsutil._compatr rZ psutil.testsrrrrrrrrrrrrrrrrZTestCaserrYrfrrU__file__r'r'r'r( sX                             x^n