U =_M @sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZe rzesze 0e !dddl"Z"ddl#Z#ddl$Z$ddl%Z%W5QRXe j&j'Z'ddZ(e)e de)ede)eoe dGdddeZ*Gddde*Z+Gddde*Z,Gd d!d!e*Z-Gd"d#d#e*Z.Gd$d%d%e*Z/e)e dGd&d'd'eZ0e)e dGd(d)d)eZ1e)e dGd*d+d+eZ2e3d,krdd-l4m5Z5e5e6dS).zWindows specific tests.N)WINDOWS)FileNotFoundError)super)APPVEYOR)GITHUB_ACTIONS) HAS_BATTERY)IS_64BIT)mock)PsutilTestCase)PY3)PYPY)retry_on_failure)sh)spawn_testproc) terminate)TOLERANCE_DISK_USAGE)unittestignorecsfdd}|S)Nc svz|f||WStk rp}z@ddlm}|j|krFtdd|jtjkr^tddW5d}~XYnXdS)Nr)ACCESS_DENIED_SET)OSErrorpsutil._pswindowsrerrnopsutil AccessDeniedZESRCH NoSuchProcess)selfargskwargserrrfunL/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_windows.pywrapper7s     z wrap_exceptions..wrapperr!)r r#r!rr"wrap_exceptions6s r$z WINDOWS onlyzpywin32 not available on PYPYzpywin32 broken on GITHUB + PY2c@s eZdZdS)WindowsTestCaseN)__name__ __module__ __qualname__r!r!r!r"r%Dsr%c@sNeZdZedejkdddZddZddZ d d Z d d Z d dZ dS) TestCpuAPIsNUMBER_OF_PROCESSORSz-NUMBER_OF_PROCESSORS env var is not availablecCs"ttjd}||tdS)Nr*)intosenviron assertEqualr cpu_count)rZnum_cpusr!r!r"&test_cpu_count_vs_NUMBER_OF_PROCESSORSSsz2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORScCs$td}t}|||dS)N)win32apiZ GetSystemInforr/r.r sys_value psutil_valuer!r!r"test_cpu_count_vs_GetSystemInfo[s z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfocCs*t}|d}|t|jdSNr)wmiWMIWin32_Processorr.rr/ZNumberOfLogicalProcessorsrwprocr!r!r"test_cpu_count_logical_vs_wmibs z)TestCpuAPIs.test_cpu_count_logical_vs_wmicCs.t}|d}|tjdd|jdS)NrF)Zlogical)r8r9r:r.rr/Z NumberOfCoresr;r!r!r"test_cpu_count_phys_vs_wmigs z&TestCpuAPIs.test_cpu_count_phys_vs_wmicCs |tttjdddS)NT)Zpercpu)r.rr/len cpu_timesrr!r!r"test_cpu_count_vs_cpu_timesls z'TestCpuAPIs.test_cpu_count_vs_cpu_timescCs@t}|d}||jtj||jtj dSr7) r8r9r:r.ZCurrentClockSpeedrZcpu_freqZcurrentZ MaxClockSpeedmaxr;r!r!r" test_cpu_freqps zTestCpuAPIs.test_cpu_freqN) r&r'r(rskipIfr,r-r0r6r>r?rCrEr!r!r!r"r)Qs  r)c@sreZdZddZddZeededdZ edd Z ed d Z d d Z ddZ ddZddZdS)TestSystemAPIscCsRtd}tjdd}|D]0}d|ddkr6q||kr|d|qdS)Nz ipconfig /allT)Zperniczpseudo-interface -z-%r nic wasn't found in 'ipconfig /all' output)rrZnet_io_counterskeysreplacelowerfail)routZnicsZnicr!r!r"test_nic_namesyszTestSystemAPIs.test_nic_namescCs,td}|t|jtjdSr7) r8r9ZWin32_ComputerSystemr.r+ZTotalPhysicalMemoryrZvirtual_memorytotal)rr<r!r!r"test_total_phymems z TestSystemAPIs.test_total_phymemztest not relieable on appveyorcCs:t}tdd|D}tt}|||dS)NcSsg|] }|jqSr!Z ProcessId.0xr!r!r" sz,TestSystemAPIs.test_pids..)r8r9 Win32_Processsetrpidsr.)rr<Zwmi_pidsZ psutil_pidsr!r!r" test_pidss  zTestSystemAPIs.test_pidsc Cstjdd}t}|D]}|D]}|jdd|jkr$|jsFqd|j krTq|j drdqzt |j}Wnt k rYqYnX| |jt|jt|j}| |j|t|j|dkr|d|j|fqq$|d t|qdS) NTall\cdromA:izpsutil=%s, wmi=%szcan't find partition %s)rdisk_partitionsr8r9ZWin32_LogicalDiskZdevicerKZDeviceID mountpointopts startswith disk_usagerr.rPr+ZSizeZ FreeSpacefreeabsrMrepr)rZps_partsZ wmi_partsZps_partZwmi_partZusageZwmi_freer!r!r" test_diskss2      zTestSystemAPIs.test_diskscCsxtD]j}d|jkrqt|j}t|j}|j|d|jt d|j|d|j t d| |j |j |jqdS)Nr_rZdelta) rrarcr2ZGetDiskFreeSpaceExrbreassertAlmostEqualrfrrPr.Zused)rZdiskr4r5r!r!r"test_disk_usages     zTestSystemAPIs.test_disk_usagecCs>ddtdD}ddtjddD}|||dS)NcSs"g|]}|r|ds|dqS)r`r])rdrSr!r!r"rVs z7TestSystemAPIs.test_disk_partitions..z\cSsg|]}|jds|jqS)r`)rbrdrSr!r!r"rVs Tr[)r2ZGetLogicalDriveStringssplitrrar.r3r!r!r"test_disk_partitionss  z#TestSystemAPIs.test_disk_partitionscCs\tt}t}t}|D]}||j||jq"| ||@d||fdS)Nzno common entries in %s, %s) rXcextZ net_if_statsr8r9ZWin32_NetworkAdapteraddNameZNetConnectionID assertTrue)rZps_namesZ wmi_adaptersZ wmi_namesZ wmi_adapterr!r!r"test_net_if_statss     z TestSystemAPIs.test_net_if_statscCs^t}|djdd}tj|d}tjt }t || }| |ddS)Nr. %Y%m%d%H%M%S) r8r9ZWin32_OperatingSystemZLastBootUpTimerndatetimestrptimeZ fromtimestampr boot_timergZ total_secondsZassertLessEqual)rZwmi_osZ wmi_btime_strZ wmi_btime_dtZ psutil_dtZdiffr!r!r"test_boot_times zTestSystemAPIs.test_boot_timec Cstjddd|tdW5QRXtjddd|tdW5QRXtjddd|tdW5QRXtjddd|tdW5QRXdS)Nz psutil._pswindows.cext.boot_timer1Z return_valueiM)r patchr.rrzrBr!r!r"test_boot_time_fluctuationsz)TestSystemAPIs.test_boot_time_fluctuationN)r&r'r(rOrQrrFrr rZrirmrortr{rr!r!r!r"rGws       rGc@s`eZdZddZee dddZee dddZdd Z d d Z d d Z ddZ dS)TestSensorsBatterycCs.tdr|tn|tdS)NZSystemBatteriesPresent)r2ZGetPwrCapabilitiesZassertIsNotNonersensors_battery assertIsNonerBr!r!r"test_has_batterys z#TestSensorsBattery.test_has_batteryz no batterycCs6t}|dd}t}|j|j|jdddS)Nselect * from Win32_Batteryrrkrj)r8r9queryrrrlZpercentZEstimatedChargeRemainingrr<Z battery_wmiZbattery_psutilr!r!r" test_percentszTestSensorsBattery.test_percentcCs6t}|dd}t}||j|jdkdS)Nrr)r8r9rrrr.Z power_pluggedZ BatteryStatusrr!r!r"test_power_pluggeds z%TestSensorsBattery.test_power_pluggedc Cs6tjddd}|t|js(tW5QRXdS)N&psutil._pswindows.cext.sensors_battery)rrrr|)r rrrrcalledAssertionErrorrmr!r!r"test_emulate_no_batterys z*TestSensorsBattery.test_emulate_no_batteryc Cs<tjddd$}|tjtj|js.tW5QRXdS)Nr)rkrrrr| r rr.rrsecsleftZPOWER_TIME_UNLIMITEDrrrr!r!r"test_emulate_power_connecteds z/TestSensorsBattery.test_emulate_power_connectedc Cs<tjddd$}|tjtj|js.tW5QRXdS)Nr)rrrr|rrr!r!r"test_emulate_power_chargings z.TestSensorsBattery.test_emulate_power_chargingc Cs<tjddd$}|tjtj|js.tW5QRXdS)Nr)rrrr|) r rr.rrrZPOWER_TIME_UNKNOWNrrrr!r!r"test_emulate_secs_left_unknown%s z1TestSensorsBattery.test_emulate_secs_left_unknownN) r&r'r(rrrFrrrrrrrr!r!r!r"rs    rc@seZdZeddZeddZddZddZd d Zd d Z e e j d k dddZddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%S)& TestProcesscCstj|_dSNrpidclsr!r!r" setUpClass4szTestProcess.setUpClasscCst|jdSrrrrr!r!r" tearDownClass8szTestProcess.tearDownClasscCstd}|tj|jdSr7)rProcess assertRaisesrkillrpr!r!r" test_issue_24<s zTestProcess.test_issue_24cCstd}||dt||||dkz|dd\}}Wn(tj k r|t ddkrxYnX||dkdS)Nr}ZSystemgrrk)Zvistazwin-7Zwin7r) rrr.namestrusernamers create_time memory_inforplatformuname)rrrssvmsr!r!r"test_special_pid@s zTestProcess.test_special_pidcCs"t|j}|t|jtjdSr)rrrr ValueError send_signalsignalSIGINTrr!r!r"test_send_signalQs zTestProcess.test_send_signalcCsbtt}|}ttjtj t}|}| ||dt || ||dS)Nrk) rrr,getpid num_handlesr2 OpenProcesswin32conPROCESS_QUERY_INFORMATIONFALSEr. CloseHandle)rrZbeforehandleZafterr!r!r"test_num_handles_incrementUs z&TestProcess.test_num_handles_increment)rzCTRL_* signals not supportedcCsdt|j}|tj|tj|| | tj |jtj| tj |jtjdSr) rrrrrrZ CTRL_C_EVENTZCTRL_BREAK_EVENTrwaitrrrr!r!r"test_ctrl_signals_s  zTestProcess.test_ctrl_signalscCs |tttjdSr)r.rrrr2Z GetUserNameExrZNameSamCompatiblerBr!r!r" test_usernamels zTestProcess.test_usernamecCs8tddt}dt}| ||dS)Nz +rH) resubr2ZGetCommandLinestripjoinrrcmdliner.r3r!r!r" test_cmdlinepszTestProcess.test_cmdlinecCsJttjtjt}|tj|t |}t }|||dSr)r2rrrrr,r addCleanupr win32processZGetPriorityClassrrnicer.rrr4r5r!r!r" test_nices  zTestProcess.test_nicecCsttjtj|j}|tj|t |}t |j }| |d|j| |d|j| |d|j| |d|j| |d|j| |d|j| |d|j| |d|j| |j|j| |j|jdS) NZPeakWorkingSetSizeWorkingSetSizeZQuotaPeakPagedPoolUsageZQuotaPagedPoolUsageZQuotaPeakNonPagedPoolUsageZQuotaNonPagedPoolUsageZ PagefileUsageZPeakPagefileUsage)r2rrrrrrrrZGetProcessMemoryInforrrr.Z peak_wsetZwsetZpeak_paged_poolZ paged_poolZpeak_nonpaged_poolZ nonpaged_poolZpagefileZ peak_pagefilerrrr!r!r"test_memory_infosR zTestProcess.test_memory_infocCsXttjtj|j}|tj|t |j}| | }t |}|||dSr)r2rrrrrrrrrrrrZGetExitCodeProcessr.)rrrr5r4r!r!r" test_waits  zTestProcess.test_waitcCs\dd}ttjtj|j}|tj||t |d}t |j }| ||dS)NcsfddtdDS)Ncsg|]}d|>@r|qS)rkr!)rTirUr!r"rVs zGTestProcess.test_cpu_affinity..from_bitmask..@)rangerr!rr" from_bitmasksz3TestProcess.test_cpu_affinity..from_bitmaskr)r2rrrrrrrrZGetProcessAffinityMaskrrZ cpu_affinityr.)rrrr4r5r!r!r"test_cpu_affinitys zTestProcess.test_cpu_affinitycCsttjtjt}|tj|t |}t }||j|d||j|d||j|d||j|d||j|d||j|ddS)NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)r2rrrrr,rrrrZGetProcessIoCountersrr io_countersr.Z read_countZ write_countZ read_bytesZ write_bytes other_countZ other_bytesrr!r!r"test_io_counterss>  zTestProcess.test_io_counterscCsddl}ddl}d}|jj|d|j}||jjj||j }|jj || ||j }t |j}|||dS)Nr)ctypesZctypes.wintypesZwindllZkernel32rrrrZwintypesZDWORDZGetProcessHandleCountZbyrefvaluerrrr.)rrrrZhndcntr4r5r!r!r"test_num_handless" zTestProcess.test_num_handlesc Csft}d|_tjd|d4td}t}|tj|jW5QRXW5QRX| |j ddS)Ni+z psutil._psplatform.cext.proc_cwdZ side_effectz time.sleepr1) WindowsErrorZwinerrorr rrrrrcwdassertGreaterEqualZ call_count)rexcrrr!r!r"test_error_partial_copys $z#TestProcess.test_error_partial_copycCs0tdd}tj|}|tj|jdS)Nri)rrY _psplatformrrrexe)rrr=r!r!r"test_exes zTestProcess.test_exeN)r&r'r( classmethodrrrrrrrrFsys version_inforrrrrrrrrrrr!r!r!r"r2s,       rc@sxeZdZdZeddZeddZddZe e dd d Z d d Z d dZ eddZeddZddZdS)TestProcessWMIz%Compare Process API results with WMI.cCstj|_dSrrrr!r!r"rszTestProcessWMI.setUpClasscCst|jdSrrrr!r!r"rszTestProcessWMI.tearDownClasscCs8tj|jdd}t|j}|||jdSNrRr) r8r9rWrrrr.rZCaptionrr<rr!r!r" test_names zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONScCs@tj|jdd}t|j}|||j dSr) r8r9rWrrrr.rrLZExecutablePathrr!r!r"rs zTestProcessWMI.test_execCsFtj|jdd}t|j}|d||j dddS)NrRrrH"r^) r8r9rWrrrr.rrZ CommandLinerKrr!r!r"r s   zTestProcessWMI.test_cmdlinecCsPtj|jdd}t|j}|\}}}d||f}|||dS)NrRrz%s\%s) r8r9rWrrrZGetOwnerr.r)rr<rZdomain_rr!r!r"rs   zTestProcessWMI.test_usernamecCsBtj|jdd}t|j}|j}||t |j dSr) r8r9rWrrrrrr.r+r)rr<rrr!r!r"test_memory_rsss  zTestProcessWMI.test_memory_rsscCs`tj|jdd}t|j}|j}t|j }||kr\||dkr\| d||fdS)NrRrrzwmi=%s, psutil=%s) r8r9rWrrrrrr+Z PageFileUsagerM)rr<rrZ wmi_usager!r!r"test_memory_vmss    zTestProcessWMI.test_memory_vmscCs\tj|jdd}t|j}t|jdd}t dt | }| ||dS)NrRrrurv)r8r9rWrrrrZ CreationDaterntimestrftime localtimerr.)rr<rZ wmic_createZ psutil_creater!r!r"test_create_time+s  zTestProcessWMI.test_create_timeN)r&r'r(__doc__rrrrrrFrrrrr rrrr!r!r!r"rs      rc@sXeZdZdZeddZeddZddZdd Zd d Z d d Z ddZ ddZ dS)TestDualProcessImplementationa{ Certain APIs on Windows have 2 internal implementations, one based on documented Windows APIs, another one based NtQuerySystemInformation() which gets called as fallback in case the first fails because of limited permission error. Here we test that the two methods return the exact same value, see: https://github.com/giampaolo/psutil/issues/304 cCstj|_dSrrrr!r!r"rCsz(TestDualProcessImplementation.setUpClasscCst|jdSrrrr!r!r"rGsz+TestDualProcessImplementation.tearDownClassc Cst|j}tjdttjdd~}t|j}| t |t |t t |D]<}| ||d| ||d|j ||||ddqX|jstW5QRXdS)Nz(psutil._psplatform.cext.proc_memory_infomsgrrirj)rrrrr rrrEPERMr.r@rrrlrr)rZmem_1r Zmem_2rr!r!r"rKs z.TestDualProcessImplementation.test_memory_infoc CsXt|j}tjdttjdd(}| t|j||j sJt W5QRXdS)N"psutil._psplatform.cext.proc_timesrr) rrrrr rrrrr.rr)rctimer r!r!r"rWs z.TestDualProcessImplementation.test_create_timec Csxt|j}tjdttjddH}t|j}|j sBt |j |j |j dd|j |j |j ddW5QRXdS)Nrrrg{Gz?rj)rrrrAr rrrrrrrlusersystem)rZ cpu_times_1r Z cpu_times_2r!r!r"test_cpu_times^s"  z,TestDualProcessImplementation.test_cpu_timesc Cszt|j}tjdttjddJ}t|j}t t |D]}|j ||||ddqD|j slt W5QRXdS)Nz(psutil._psplatform.cext.proc_io_countersrrr1rj)rrrrr rrrrrr@rlrr)rZ io_counters_1r Z io_counters_2rr!r!r"ris z.TestDualProcessImplementation.test_io_countersc CsXt|j}tjdttjdd(}| t|j||j sJt W5QRXdS)Nz(psutil._psplatform.cext.proc_num_handlesrr) rrrrr rrrrr.rr)rrr r!r!r"rss z.TestDualProcessImplementation.test_num_handlesc Csddlm}tD]p}z tj|dd}tj|dd}Wn>tk rv}z ||}t|tjtj fsfW5d}~XYqX| ||qdS)Nr)convert_oserrorT)Zuse_pebF) rrrrYrpZ proc_cmdliner isinstancerrr.)rrrabrr!r!r"r{s  z*TestDualProcessImplementation.test_cmdlineN) r&r'r(rrrrrrrrrrr!r!r!r"r7s      rcspeZdZdZeddZddgZfddZfdd Zd d Z d d Z ddZ ddZ ddZ ddZZS)RemoteProcessTestCasezCertain functions require calling ReadProcessMemory. This trivially works when called on the current process. Check that this works on other processes, especially when they have a different bitness. cCs\d}tdD]H}tj|d|gtjtjd}|\}}||tt kr|SqdS)Nz6import sys; sys.stdout.write(str(sys.maxsize > 2**32))zC:\Python*\python.exe-c)rstdoutstderr) glob subprocessPopenPIPEZSTDOUT communicaterrr)codefilenamer=outputrr!r!r"find_other_interpreters  z,RemoteProcessTestCase.find_other_interpreterrzimport sys; sys.stdin.read()cst|}|dkr$tdtr8tj|_||_ n||_tj|_ t j }t t |d<|j|j g|j|tjd|_|j|jg|j|tjd|_dS)Nz0could not find interpreter with opposite bitnessTHINK_OF_A_NUMBER)envstdin)rsetUprrZSkipTestrr executableZpython64Zpython32r,r-copyrrr test_argsr r proc32proc64)rZ other_pythonr __class__r!r"rs.    zRemoteProcessTestCase.setUpcs"t|j|jdSr)rtearDownrr rrBrr!r"rs  zRemoteProcessTestCase.tearDowncCs@t|jj}|t|d||dd|jdSNrwrk)rrrrr.r@rrrr!r!r"test_cmdline_32sz%RemoteProcessTestCase.test_cmdline_32cCs@t|jj}|t|d||dd|jdSr)rrrrr.r@rrrr!r!r"test_cmdline_64sz%RemoteProcessTestCase.test_cmdline_64cCs&t|jj}||tdSr)rrrrr.rr,getcwdrr!r!r" test_cwd_32sz!RemoteProcessTestCase.test_cwd_32cCs&t|jj}||tdSr)rrrrr.rr,r rr!r!r" test_cwd_64sz!RemoteProcessTestCase.test_cwd_64cCs>t|jj}|}|d|||dtt dS)Nr) rrrrr-assertInZ assertEqualsrr,r)rrer!r!r"test_environ_32s z%RemoteProcessTestCase.test_environ_32cCs6t|jj}z |Wntjk r0YnXdSr)rrrrr-rrr!r!r"test_environ_64s  z%RemoteProcessTestCase.test_environ_64)r&r'r(r staticmethodrrrrrrr!r"r%r& __classcell__r!r!rr"rs   rc@seZdZddZddZdS) TestServicescCshtdddddddg}tdd d g}tddd d d ddg}tD]}|}||dt||dd||dt||dt||d||ddk rt |d||dt||dt||dt||d|||d|||dt| }|dk rHt |}| | t |}|||qBdS)NZrunningZpausedstartpausecontinuestopZstoppedZ automaticZmanualZdisabledZ start_pendingZ pause_pendingZcontinue_pendingZ stop_pendingrr^ display_namerstatusrZbinpathZ start_type description)rXrwin_service_iterZas_dictZassertIsInstancerZassertNotEqualrr#rrrsZ is_runningwin_service_getrr.)rZvalid_statusesZvalid_start_typesZservdatarrsr!r!r"test_win_service_itersX     z"TestServices.test_win_service_iterc Cstjjj}tjjj}tt}|tj }t |dW5QRX| |j j|dt |}t rzddd|f}n|df}t|}tjd|d|tj |jW5QRXtjd|d|tj |jW5QRXt rddd|f}n|df}t|}tjd|d|tj|jW5QRXtjd|d|tj|jW5QRX||t|||t|||t|||t|dS)Nz???rrz/psutil._psplatform.cext.winservice_query_statusrz/psutil._psplatform.cext.winservice_query_config)rrrpERROR_SERVICE_DOES_NOT_EXISTERROR_ACCESS_DENIEDnextr1rrrr2r.Z exceptionr rr rr/rrr#rr.rh)rr6r7rcmZservicerrr!r!r"test_win_service_getsH  z!TestServices.test_win_service_getN)r&r'r(r5r:r!r!r!r"r)s0r)__main__) run_from_name)7rrxrrr,rrrr rrwarningsrrZpsutil._compatrrZ psutil.testsrrrrr r r r r rrrrrcatch_warnings simplefilterr2rrr8rrpr$rFr%r)rGrrrrrr)r&Zpsutil.tests.runnerr<__file__r!r!r!r"sr                       &<@F R \ ^