U Ã|ýfã‰ã @sÆdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddl mZddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!erŽesŽe  "¡0e  #d¡ddl$Z$ddl%Z%ddl&Z&ddl'Z'W5QRXer ddl(m)Z)e j*j+Z+e  ,e d¡e  ,ed¡e  ,eoÌe d¡Gdd„deƒƒƒƒZ-dd„Z.e/fdd„Z0Gd d!„d!e-ƒZ1Gd"d#„d#e-ƒZ2Gd$d%„d%e-ƒZ3Gd&d'„d'e-ƒZ4Gd(d)„d)e-ƒZ5e  ,e d¡Gd*d+„d+eƒƒZ6e  ,e d¡Gd,d-„d-eƒƒZ7e  ,e d¡Gd.d/„d/eƒƒZ8e9d0krÂdd1l:m;Z;e;e<ƒdS)2zWindows specific tests.éN)ÚWINDOWS)ÚFileNotFoundError)Úsuper)Úwhich)ÚAPPVEYOR)ÚGITHUB_ACTIONS)Ú HAS_BATTERY)ÚIS_64BIT)ÚPY3)ÚPYPY)ÚTOLERANCE_DISK_USAGE)ÚTOLERANCE_SYS_MEM)ÚPsutilTestCase)Úmock)Úretry_on_failure)Úsh)Úspawn_testproc)Ú terminateÚignore)Úconvert_oserrorz WINDOWS onlyzpywin32 not available on PYPYzpywin32 broken on GITHUB + PY2c@s eZdZdS)ÚWindowsTestCaseN)Ú__name__Ú __module__Ú __qualname__©rrúL/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_windows.pyr;srcCs&tdƒst d¡‚dd|}t|ƒS)zšCurrently not used, but available just in case. Usage: >>> powershell( "Get-CIMInstance Win32_PageFileUsage | Select AllocatedBaseSize") zpowershell.exezpowershell.exe not availablez?powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive z,-NoProfile -WindowStyle Hidden -Command "%s")rÚunittestÚSkipTestr)ÚcmdÚcmdlinerrrÚ powershellCs ÿÿr csjtd||fƒ ¡}d | ¡dd…¡ ¡}ˆdk rbd|krXt‡fdd„| ¡DƒƒSˆ|ƒSn|SdS)z‡Currently not used, but available just in case. Usage: >>> wmic("Win32_OperatingSystem", "FreePhysicalMemory") 2134124534 zwmic path %s get %sÚéNú,csg|] }ˆ|ƒ‘qSrr©Ú.0Úx©Ú converterrrÚ \szwmic..)rÚstripÚjoinÚ splitlinesÚtupleÚsplit)ÚpathÚwhatr(ÚoutÚdatarr'rÚwmicRs r3c@sNeZdZe dejkd¡dd„ƒZdd„Zdd„Z d d „Z d d „Z d d„Z dS)Ú TestCpuAPIsÚNUMBER_OF_PROCESSORSz-NUMBER_OF_PROCESSORS env var is not availablecCs"ttjdƒ}| |t ¡¡dS)Nr5)ÚintÚosÚenvironÚ assertEqualÚpsutilÚ cpu_count)ÚselfZnum_cpusrrrÚ&test_cpu_count_vs_NUMBER_OF_PROCESSORSisz2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORScCs$t ¡d}t ¡}| ||¡dS)Né)Úwin32apiZ GetSystemInfor:r;r9©r<Ú sys_valueÚ psutil_valuerrrÚtest_cpu_count_vs_GetSystemInfoss z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfocCs2t ¡}tdd„| ¡Dƒƒ}| t ¡|¡dS)Ncss|] }|jVqdS©N)ZNumberOfLogicalProcessors©r%ÚprocrrrÚ |sz.©ÚwmiÚWMIÚsumÚWin32_Processorr9r:r;)r<ÚwZprocsrrrÚtest_cpu_count_logical_vs_wmizs ÿz)TestCpuAPIs.test_cpu_count_logical_vs_wmicCs6t ¡}tdd„| ¡Dƒƒ}| tjdd|¡dS)Ncss|] }|jVqdSrD)Z NumberOfCoresrErrrrGƒsz:TestCpuAPIs.test_cpu_count_cores_vs_wmi..F)ZlogicalrH)r<rMZcoresrrrÚtest_cpu_count_cores_vs_wmisz'TestCpuAPIs.test_cpu_count_cores_vs_wmicCs | t ¡ttjddƒ¡dS)NT)Zpercpu)r9r:r;ÚlenÚ cpu_times©r<rrrÚtest_cpu_count_vs_cpu_times†sÿz'TestCpuAPIs.test_cpu_count_vs_cpu_timescCs@t ¡}| ¡d}| |jt ¡j¡| |jt ¡j ¡dS©Nr) rIrJrLr9ZCurrentClockSpeedr:Zcpu_freqÚcurrentZ MaxClockSpeedÚmax)r<rMrFrrrÚ test_cpu_freq‹s zTestCpuAPIs.test_cpu_freqN) rrrrÚskipIfr7r8r=rCrNrOrSrWrrrrr4hsþ r4c@sŠeZdZdd„Zdd„Zdd„Zdd„Zd d „Ze  e d ¡e ƒd d „ƒƒZ e ƒdd„ƒZ e ƒdd„ƒZdd„Zdd„Zdd„Zdd„ZdS)ÚTestSystemAPIscCsRtdƒ}tjdd ¡}|D]0}d| dd¡ ¡kr6q||kr| d|¡‚qdS)Nz ipconfig /allT)Zperniczpseudo-interfaceú ú-z-%r nic wasn't found in 'ipconfig /all' output)rr:Znet_io_countersÚkeysÚreplaceÚlowerÚfail)r<r1ZnicsZnicrrrÚtest_nic_names“sÿzTestSystemAPIs.test_nic_namescCs,t ¡ ¡d}| t|jƒt ¡j¡dSrT) rIrJZWin32_ComputerSystemr9r6ZTotalPhysicalMemoryr:Úvirtual_memoryÚtotal©r<rMrrrÚtest_total_phymemžs ÿz TestSystemAPIs.test_total_phymemcCs0t ¡ ¡d}|jt|jƒt ¡jt ddS)Nr©Údelta) rIrJÚWin32_PerfRawData_PerfOS_MemoryÚassertAlmostEqualr6ZAvailableBytesr:raÚfreer rcrrrÚtest_free_phymem¤s ýzTestSystemAPIs.test_free_phymemcCsht ¡ ¡d}| t|jƒt ¡jt  ¡j¡t  ¡jdkrd| dt  ¡j ¡| dt  ¡j ¡dSrT) rIrJrgr9r6Z CommitLimitr:rarbÚ swap_memoryriÚusedrcrrrÚtest_total_swapmem¬sþz!TestSystemAPIs.test_total_swapmemcCsxt ¡jdkrtt ¡jddd}t|jƒdt|jƒ}|  t ¡j d¡|j t ¡j |dd|  t ¡j d¡dS)NrZ_Total)ÚNameédr>re) r:rkrbrIrJZ#Win32_PerfRawData_PerfOS_PagingFiler6Z PercentUsageZPercentUsage_BaseÚassertGreaterEqualÚpercentrhÚassertLessEqual)r<rMZ percentSwaprrrÚtest_percent_swapmem¶sÿz#TestSystemAPIs.test_percent_swapmemztest not relieable on appveyorcCs:t ¡ ¡}tdd„|Dƒƒ}tt ¡ƒ}| ||¡dS)NcSsg|] }|j‘qSr©Z ProcessIdr$rrrr)Õsz,TestSystemAPIs.test_pids..)rIrJÚ Win32_ProcessÚsetr:Úpidsr9)r<rMZwmi_pidsZ psutil_pidsrrrÚ test_pidsÏs  zTestSystemAPIs.test_pidsc Cstjdd}t ¡ ¡}|D]Þ}|D]Â}|j dd¡|jkr$|jsFqd|j krTq|j  d¡rdqzt  |j¡}Wnt k rŽYqYnX|  |jt|jƒ¡t|jƒ}|  |j|¡t|j|ƒdkrâ| d|j|f¡‚qq$| d t|ƒ¡‚qdS) NT©Úallú\r!ÚcdromúA:i zpsutil=%s, wmi=%szcan't find partition %s)r:Údisk_partitionsrIrJZWin32_LogicalDiskZdevicer]ZDeviceIDÚ mountpointÚoptsÚ startswithÚ disk_usagerr9rbr6ÚSizeZ FreeSpaceriÚabsr_Úrepr)r<Zps_partsZ wmi_partsZps_partZwmi_partÚusageZwmi_freerrrÚ test_disksÙs0       ÿzTestSystemAPIs.test_diskscCsxt ¡D]j}d|jkrqt |j¡}t |j¡}|j|d|jt d|j|d|j t d|  |j |j |j¡qdS)Nr|rrer") r:r~r€r?ZGetDiskFreeSpaceExrr‚rhrir rbr9rl)r<ZdiskrArBrrrÚtest_disk_usageøs&    ÿÿ ÿzTestSystemAPIs.test_disk_usagecCs>dd„t ¡ d¡Dƒ}dd„tjddDƒ}| ||¡dS)NcSs"g|]}|r| d¡s|d‘qS)r}r{)rr$rrrr) s þz7TestSystemAPIs.test_disk_partitions..z\cSsg|]}|j d¡s|j‘qS)r})rrr$rrrr)s þTry)r?ZGetLogicalDriveStringsr.r:r~r9r@rrrÚtest_disk_partitions s þ þz#TestSystemAPIs.test_disk_partitionscCs\tt ¡ƒ}t ¡ ¡}tƒ}|D]}| |j¡| |j¡q"|  ||@d||f¡dS)Nzno common entries in %s, %s) rvÚcextZ net_if_statsrIrJZWin32_NetworkAdapterÚaddrnZNetConnectionIDÚ assertTrue)r<Zps_namesZ wmi_adaptersZ wmi_namesZ wmi_adapterrrrÚtest_net_if_statss    þz TestSystemAPIs.test_net_if_statscCs^t ¡ ¡}|dj d¡d}tj |d¡}tj t  ¡¡}t ||  ¡ƒ}|  |d¡dS)NrÚ.ú %Y%m%d%H%M%Sr>) rIrJZWin32_OperatingSystemZLastBootUpTimer.ÚdatetimeÚstrptimeÚ fromtimestampr:Ú boot_timer„Ú total_secondsrr)r<Zwmi_osZ wmi_btime_strZ wmi_btime_dtZ psutil_dtÚdiffrrrÚtest_boot_time"s ÿzTestSystemAPIs.test_boot_timec Cs¬tjddd| t ¡d¡W5QRXtjddd| t ¡d¡W5QRXtjddd| t ¡d¡W5QRXtjddd| t ¡d¡W5QRXdS)Nz psutil._pswindows.cext.boot_timer>©Z return_valueééiM)rÚpatchr9r:r“rRrrrÚtest_boot_time_fluctuation,sz)TestSystemAPIs.test_boot_time_fluctuationN)rrrr`rdrjrmrsrrXrrrxr‡rˆr‰rr–r›rrrrrY’s          rYc@s`eZdZdd„Ze e d¡dd„ƒZe e d¡dd„ƒZdd „Z d d „Z d d „Z dd„Z dS)ÚTestSensorsBatterycCs.t ¡dr| t ¡¡n| t ¡¡dS)NZSystemBatteriesPresent)r?ZGetPwrCapabilitiesZassertIsNotNoner:Úsensors_batteryÚ assertIsNonerRrrrÚtest_has_battery>s z#TestSensorsBattery.test_has_batteryz no batterycCs6t ¡}| d¡d}t ¡}|j|j|jdddS)Núselect * from Win32_Batteryrr"re)rIrJÚqueryr:rrhrqZEstimatedChargeRemaining©r<rMZ battery_wmiZbattery_psutilrrrÚ test_percentDsýzTestSensorsBattery.test_percentcCs6t ¡}| d¡d}t ¡}| |j|jdk¡dS)Nr ré)rIrJr¡r:rr9Z power_pluggedZ BatteryStatusr¢rrrÚtest_power_pluggedOsÿz%TestSensorsBattery.test_power_pluggedc Cs6tjddd}| t ¡¡|js(t‚W5QRXdS)Nú&psutil._pswindows.cext.sensors_battery)ré€rrr—)rršržr:rÚcalledÚAssertionError©r<ÚmrrrÚtest_emulate_no_batteryZsþz*TestSensorsBattery.test_emulate_no_batteryc Cs<tjddd$}| t ¡jtj¡|js.t‚W5QRXdS)Nr¦)r"rrrr—© rršr9r:rÚsecsleftZPOWER_TIME_UNLIMITEDr¨r©rªrrrÚtest_emulate_power_connectedbsÿÿz/TestSensorsBattery.test_emulate_power_connectedc Cs<tjddd$}| t ¡jtj¡|js.t‚W5QRXdS)Nr¦)rérrr—r­rªrrrÚtest_emulate_power_chargingksÿÿz.TestSensorsBattery.test_emulate_power_chargingc Cs<tjddd$}| t ¡jtj¡|js.t‚W5QRXdS)Nr¦)rrréÿÿÿÿr—) rršr9r:rr®ZPOWER_TIME_UNKNOWNr¨r©rªrrrÚtest_emulate_secs_left_unknowntsþÿz1TestSensorsBattery.test_emulate_secs_left_unknownN) rrrrŸrrXrr£r¥r¬r¯r±r³rrrrrœ=s     rœc@sœeZdZedd„ƒZedd„ƒZdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#S)$Ú TestProcesscCstƒj|_dSrD©rÚpid©ÚclsrrrÚ setUpClass…szTestProcess.setUpClasscCst|jƒdSrD©rr¶r·rrrÚ tearDownClass‰szTestProcess.tearDownClasscCst d¡}| tj|j¡dSrT)r:ÚProcessÚ assertRaisesÚ AccessDeniedÚkill©r<ÚprrrÚ test_issue_24s zTestProcess.test_issue_24cCsŒt d¡}| | ¡d¡t|ƒ| ¡| | ¡d¡z| ¡dd…\}}Wn(tj k rzt   ¡ddkrv‚YnX|  |d¡dS)Nr˜ÚSystemgr¤r")Zvistazwin-7Zwin7r) r:r¼r9ÚnameÚstrÚusernamerpÚ create_timeÚ memory_infor¾ÚplatformÚunameZ assertGreater)r<rÁÚrssZ_vmsrrrÚtest_special_pid‘s zTestProcess.test_special_pidcCs"t |j¡}| t|jtj¡dSrD)r:r¼r¶r½Ú ValueErrorÚ send_signalÚsignalÚSIGINTrÀrrrÚtest_send_signal¢s zTestProcess.test_send_signalcCsbt t ¡¡}| ¡}t tjtj t ¡¡}| ¡}|  ||d¡t  |¡|  | ¡|¡dS)Nr") r:r¼r7ÚgetpidÚ num_handlesr?Ú OpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr9Ú CloseHandle)r<rÁÚbeforeÚhandleÚafterrrrÚtest_num_handles_increment¦sÿ z&TestProcess.test_num_handles_incrementcCsdt | ¡j¡}| tj¡| tj¡| ¡|  ¡|  tj |jtj¡|  tj |jtj¡dSrD) r:r¼rr¶rÎrÏZ CTRL_C_EVENTZCTRL_BREAK_EVENTr¿Úwaitr½Ú NoSuchProcessrÀrrrÚtest_ctrl_signals±s  ÿÿzTestProcess.test_ctrl_signalscCs8t tj¡}| d¡r t d¡‚| t  ¡  ¡|¡dS)Nú$zrunning as service account) r?Z GetUserNameExrÕZNameSamCompatibleÚendswithrrr9r:r¼rÆ)r<rÄrrrÚ test_username¾s   zTestProcess.test_usernamecCsft ddt ¡¡ ¡}d t ¡ ¡¡}|ddkrD|dkrVnn|  ddd¡}|  ||¡dS)Nz[ ]+rZrú"r!r¤) ÚreÚsubr?ZGetCommandLiner*r+r:r¼rr]r9r@rrrÚ test_cmdlineÇs  zTestProcess.test_cmdlinecCsJt tjtjt ¡¡}| tj|¡t   |¡}t   ¡  ¡}| ||¡dSrD)r?rÔrÕrÖr×r7rÒÚ addCleanuprØÚ win32processZGetPriorityClassr:r¼Únicer9©r<rÚrArBrrrÚ test_niceásÿ  zTestProcess.test_nicecCsðt tjtj|j¡}| tj|¡t  |¡}t   |j¡  ¡}|  |d|j¡|  |d|j¡|  |d|j¡|  |d|j¡|  |d|j¡|  |d|j¡|  |d|j¡|  |d|j¡|  |j|j¡|  |j|j¡dS) NZPeakWorkingSetSizeÚWorkingSetSizeZQuotaPeakPagedPoolUsageZQuotaPagedPoolUsageZQuotaPeakNonPagedPoolUsageZQuotaNonPagedPoolUsageZ PagefileUsageZPeakPagefileUsage)r?rÔrÕrÖr×r¶rçrØrèZGetProcessMemoryInfor:r¼rÈr9Z peak_wsetZwsetZpeak_paged_poolZ paged_poolZpeak_nonpaged_poolZ nonpaged_poolZpagefileZ peak_pagefilerËÚvmsrêrrrÚtest_memory_infoêsHÿ ÿÿÿþÿÿzTestProcess.test_memory_infocCsXt tjtj|j¡}| tj|¡t  |j¡}|  ¡|  ¡}t   |¡}| ||¡dSrD)r?rÔrÕrÖr×r¶rçrØr:r¼rrÝrèZGetExitCodeProcessr9)r<rÚrÁrBrArrrÚ test_wait sÿ  zTestProcess.test_waitcCs\dd„}t tjtj|j¡}| tj|¡|t  |¡dƒ}t   |j¡  ¡}|  ||¡dS)Ncs‡fdd„tdƒDƒS)Ncsg|]}d|>ˆ@r|‘qS)r"r)r%Úi©r&rrr)s zGTestProcess.test_cpu_affinity..from_bitmask..é@)ÚrangerñrrñrÚ from_bitmasksz3TestProcess.test_cpu_affinity..from_bitmaskr)r?rÔrÕrÖr×r¶rçrØrèZGetProcessAffinityMaskr:r¼Z cpu_affinityr9)r<rôrÚrArBrrrÚtest_cpu_affinitysÿ ÿzTestProcess.test_cpu_affinitycCsªt tjtjt ¡¡}| tj|¡t   |¡}t   ¡  ¡}| |j|d¡| |j|d¡| |j|d¡| |j|d¡| |j|d¡| |j|d¡dS)NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)r?rÔrÕrÖr×r7rÒrçrØrèZGetProcessIoCountersr:r¼Ú io_countersr9Z read_countZ write_countÚ read_bytesÚ write_bytesÚ other_countZ other_bytesrêrrrÚtest_io_counters#s@ÿ  ÿÿÿÿÿÿzTestProcess.test_io_counterscCs€ddl}ddl}d}|jj |d|j¡}| |jjj|¡|j  ¡}|jj  ||  |¡¡|j }t  |j¡ ¡}| ||¡dS)Nré)ÚctypesZctypes.wintypesÚwindllÚkernel32rÔr¶rçrØZwintypesZDWORDZGetProcessHandleCountZbyrefÚvaluer:r¼rÓr9)r<rürÖrÚZhndcntrArBrrrÚtest_num_handles=s"ÿ ÿzTestProcess.test_num_handlesc Csftƒ}d|_tjd|d4t d¡}t ¡}| tj|j¡W5QRXW5QRX|  |j d¡dS)Ni+z psutil._psplatform.cext.proc_cwd©Z side_effectz time.sleepr>) Ú WindowsErrorÚwinerrorrršr:r¼r½r¾ÚcwdrpZ call_count)r<Úexcr«rÁrrrÚtest_error_partial_copyOs $z#TestProcess.test_error_partial_copycCs0t ¡dd}tj |¡}| tj|j¡dS)Nr²iŸ†)r:rwÚ _psplatformr¼r½rÞÚexe)r<r¶rFrrrÚtest_exeYs zTestProcess.test_exeN)rrrÚ classmethodr¹r»rÂrÌrÑrÜrßrârærërîrïrõrúrrr rrrrr´„s&         r´c@sxeZdZdZedd„ƒZedd„ƒZdd„Ze  e d¡d d „ƒZ d d „Z d d„Z eƒdd„ƒZeƒdd„ƒZdd„ZdS)ÚTestProcessWMIz%Compare Process API results with WMI.cCstƒj|_dSrDrµr·rrrr¹dszTestProcessWMI.setUpClasscCst|jƒdSrDrºr·rrrr»hszTestProcessWMI.tearDownClasscCs8t ¡j|jdd}t |j¡}| | ¡|j¡dS©Nrtr) rIrJrur¶r:r¼r9rÄZCaption©r<rMrÁrrrÚ test_namels zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONScCs@t ¡j|jdd}t |j¡}| | ¡ ¡|j  ¡¡dSr ) rIrJrur¶r:r¼r9rr^ZExecutablePathr rrrr rs zTestProcessWMI.test_execCsFt ¡j|jdd}t |j¡}| d | ¡¡|j   dd¡¡dS)NrtrrZrãr!) rIrJrur¶r:r¼r9r+rZ CommandLiner]r rrrræzs zTestProcessWMI.test_cmdlinecCsPt ¡j|jdd}t |j¡}| ¡\}}}d||f}| | ¡|¡dS)Nrtrz%s\%s) rIrJrur¶r:r¼ZGetOwnerr9rÆ)r<rMrÁÚdomainÚ_rÆrrrrâs   zTestProcessWMI.test_usernamecCsBt ¡j|jdd}t |j¡}| ¡j}| |t |j ƒ¡dSr ) rIrJrur¶r:r¼rÈrËr9r6rì)r<rMrÁrËrrrÚtest_memory_rss†s  zTestProcessWMI.test_memory_rsscCs\t ¡j|jdd}t |j¡}| ¡j}t|j ƒ}|||dfkrX|  d||f¡‚dS)Nrtrrûzwmi=%s, psutil=%s) rIrJrur¶r:r¼rÈrír6Z PageFileUsager_)r<rMrÁríZ wmi_usagerrrÚtest_memory_vmss    zTestProcessWMI.test_memory_vmscCs\t ¡j|jdd}t |j¡}t|j d¡dƒ}t   dt   |  ¡¡¡}|  ||¡dS)NrtrrŽr)rIrJrur¶r:r¼rÅZ CreationDater.ÚtimeÚstrftimeÚ localtimerÇr9)r<rMrÁZ wmic_createZ psutil_createrrrÚtest_create_timešs  ÿzTestProcessWMI.test_create_timeN)rrrÚ__doc__r r¹r»rrrXrr rærârrrrrrrrr as      r c@sXeZdZdZedd„ƒZedd„ƒZdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z dS)ÚTestDualProcessImplementationawCertain 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. cCstƒj|_dSrDrµr·rrrr¹²sz(TestDualProcessImplementation.setUpClasscCst|jƒdSrDrºr·rrrr»¶sz+TestDualProcessImplementation.tearDownClassc Cs®t |j¡ ¡}tjdttjdƒd~}t |j¡ ¡}|  t |ƒt |ƒ¡t t |ƒƒD]<}|  ||d¡|  ||d¡|j ||||ddqX|js t‚W5QRXdS)Nz(psutil._psplatform.cext.proc_memory_infoÚmsgrrire)r:r¼r¶rÈrršÚOSErrorÚerrnoÚEPERMr9rPrórprhr¨r©)r<Zmem_1ÚfunZmem_2rðrrrrîºs þz.TestDualProcessImplementation.test_memory_infoc CsXt |j¡ ¡}tjdttjdƒd(}|  t |j¡ ¡|¡|j sJt ‚W5QRXdS)Nú"psutil._psplatform.cext.proc_timesrr) r:r¼r¶rÇrršrrrr9r¨r©)r<ÚctimerrrrrÈs þz.TestDualProcessImplementation.test_create_timec Csxt |j¡ ¡}tjdttjdƒdH}t |j¡ ¡}|j sBt ‚|j |j |j dd|j |j |j ddW5QRXdS)Nrrrg{®Gáz„?re)r:r¼r¶rQrršrrrr¨r©rhÚuserÚsystem)r<Z cpu_times_1rZ cpu_times_2rrrÚtest_cpu_timesÑs$ þ ÿÿz,TestDualProcessImplementation.test_cpu_timesc Cszt |j¡ ¡}tjdttjdƒdJ}t |j¡ ¡}t t |ƒƒD]}|j ||||ddqD|j slt ‚W5QRXdS)Nz(psutil._psplatform.cext.proc_io_countersrrr>re)r:r¼r¶rörršrrrrórPrhr¨r©)r<Z io_counters_1rZ io_counters_2rðrrrrúàs þÿz.TestDualProcessImplementation.test_io_countersc CsXt |j¡ ¡}tjdttjdƒd(}|  t |j¡ ¡|¡|j sJt ‚W5QRXdS)Nz(psutil._psplatform.cext.proc_num_handlesrr) r:r¼r¶rÓrršrrrr9r¨r©)r<rÓrrrrrís þÿz.TestDualProcessImplementation.test_num_handlesc Cs~t ¡D]p}z tj|dd}tj|dd}Wn>tk rj}z t|ƒ}t|tjtjfƒsZ‚W5d}~XYqX|  ||¡qdS)NT)Zuse_pebF) r:rwrŠZ proc_cmdlinerrÚ isinstancer¾rÞr9)r<r¶ÚaÚbÚerrrrrræøs  ÿz*TestDualProcessImplementation.test_cmdlineN) rrrrr r¹r»rîrr"rúrrærrrrr§s      rcspeZdZdZedd„ƒZddgZ‡fdd„Z‡fdd „Zd d „Z d d „Z dd„Z dd„Z dd„Z dd„Z‡ZS)ÚRemoteProcessTestCasez×Certain 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}t d¡D]H}tj|d|gtjtjd}| ¡\}}| ¡|tt ƒkr|SqdS)Nz6import sys; sys.stdout.write(str(sys.maxsize > 2**32))zC:\Python*\python.exeú-c)ÚargsÚstdoutÚstderr) ÚglobÚ subprocessÚPopenÚPIPEÚSTDOUTÚ communicaterÝrÅr )ÚcodeÚfilenamerFÚoutputrrrrÚfind_other_interpretersý z,RemoteProcessTestCase.find_other_interpreterr(zimport sys; sys.stdin.read()cs tƒ ¡| ¡}|dkr$t d¡‚tr8tj|_||_ n||_tj|_ t j   ¡}t t  ¡ƒ|d<|j|j g|j|tjd|_|j|jg|j|tjd|_dS)Nz0could not find interpreter with opposite bitnessÚTHINK_OF_A_NUMBER)ÚenvÚstdin)rÚsetUpr5rrr ÚsysÚ executableZpython64Zpython32r7r8ÚcopyrÅrÒrÚ test_argsr-r/Úproc32Úproc64)r<Z other_pythonr7©Ú __class__rrr9#s. ÿ  ÿ ÿzRemoteProcessTestCase.setUpcs"tƒ ¡|j ¡|j ¡dSrD)rÚtearDownr>r1r?rRr@rrrB;s  zRemoteProcessTestCase.tearDowncCs@t |jj¡}| t| ¡ƒd¡| | ¡dd…|j¡dS©Nér")r:r¼r>r¶r9rPrr=rÀrrrÚtest_cmdline_32@sz%RemoteProcessTestCase.test_cmdline_32cCs@t |jj¡}| t| ¡ƒd¡| | ¡dd…|j¡dSrC)r:r¼r?r¶r9rPrr=rÀrrrÚtest_cmdline_64Esz%RemoteProcessTestCase.test_cmdline_64cCs&t |jj¡}| | ¡t ¡¡dSrD)r:r¼r>r¶r9rr7ÚgetcwdrÀrrrÚ test_cwd_32Jsz!RemoteProcessTestCase.test_cwd_32cCs&t |jj¡}| | ¡t ¡¡dSrD)r:r¼r?r¶r9rr7rGrÀrrrÚ test_cwd_64Nsz!RemoteProcessTestCase.test_cwd_64cCs>t |jj¡}| ¡}| d|¡| |dtt  ¡ƒ¡dS)Nr6) r:r¼r>r¶r8ÚassertInr9rÅr7rÒ)r<rÁÚerrrÚtest_environ_32Rs z%RemoteProcessTestCase.test_environ_32cCs6t |jj¡}z | ¡Wntjk r0YnXdSrD)r:r¼r?r¶r8r¾rÀrrrÚtest_environ_64Xs  z%RemoteProcessTestCase.test_environ_64)rrrrÚ staticmethodr5r=r9rBrErFrHrIrLrMÚ __classcell__rrr@rr's   r'c@seZdZdd„Zdd„ZdS)Ú TestServicescCshtdddddddgƒ}tdd d gƒ}tddd d d ddgƒ}t ¡D]}| ¡}| |dt¡| |d ¡d¡| |dt¡| |dt¡| |d|¡|ddk r¾t  |d¡| |dt¡| |dt¡| |dt¡| |d|¡| |d|¡| |dt¡|  ¡}|dk rHt  |¡}|  |  ¡¡t  | ¡¡}| ||¡qBdS)NÚrunningÚpausedÚstartÚpauseÚcontinueÚstopÚstoppedZ automaticZmanualÚdisabledZ start_pendingZ pause_pendingZcontinue_pendingZ stop_pendingrÄr!Ú display_namerÆÚstatusr¶ZbinpathZ start_typeÚ description)rvr:Úwin_service_iterÚas_dictZassertIsInstancerÅZassertNotEqualr*rJr¼r¶rŒÚ is_runningÚwin_service_getrÄr9)r<Zvalid_statusesZvalid_start_typesZservr2r¶rÁÚsrrrÚtest_win_service_itergsPù ù    z"TestServices.test_win_service_iterc Cs¨tjjj}tjjj}tt ¡ƒ ¡}| tj ¡}t  |d¡W5QRX|  |j j|d¡t  |¡}t rzddd|f}n|df}t|Ž}tjd|d| tj |j¡W5QRXtjd|d| tj |j¡W5QRXt rðddd|f}n|df}t|Ž}tjd|d| tj|j¡W5QRXtjd|d| tj|j¡W5QRX| | ¡t|ƒ¡| | ¡t|ƒ¡| | ¡t|ƒ¡| | ¡t|ƒ¡dS)Nz???rrz/psutil._psplatform.cext.winservice_query_statusrz/psutil._psplatform.cext.winservice_query_config)r:rrŠÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextr\rÄr½rÞr_r9Ú exceptionr rrršrZrÆr¾rJrÅrYr…)r<rbrcrÄÚcmZservicer)rrrrÚtest_win_service_get“sPÿ  ÿÿÿÿz!TestServices.test_win_service_getN)rrrrargrrrrrPes,rPÚ__main__)Ú run_from_name)=rrrr,r7rÉrärÏr-r:rrÚwarningsr:rZpsutil._compatrrrZ psutil.testsrrrr r r r r rrrrrrÚcatch_warningsÚ simplefilterr?rÕrèrIZpsutil._pswindowsrrrŠrXrr r6r3r4rYrœr´r rr'rPrZpsutil.tests.runnerriÚ__file__rrrrÚs~                         *,G^F _ ] ^