B Œ=Ý_Mã @s”dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZe rzesze   ¡0e  !d¡ddl"Z"ddl#Z#ddl$Z$ddl%Z%WdQRXe j&j'Z'dd„Z(e )e d¡e )ed¡e )eo®e d¡Gdd„deƒƒƒƒZ*Gdd„de*ƒZ+Gdd„de*ƒZ,Gd d!„d!e*ƒZ-Gd"d#„d#e*ƒZ.Gd$d%„d%e*ƒZ/e )e d¡Gd&d'„d'eƒƒZ0e )e d¡Gd(d)„d)eƒƒZ1e )e d¡Gd*d+„d+eƒƒZ2e3d,krdd-l4m5Z5e5e6ƒdS).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)ÚunittestÚignorecs‡fdd„}|S)Nc styˆ|f|ž|ŽStk rn}z@ddlm}|j|krDt dd¡‚|jtjkr\t dd¡‚‚Wdd}~XYnXdS)Nr)ÚACCESS_DENIED_SET)ÚOSErrorÚpsutil._pswindowsrÚerrnoÚpsutilÚ AccessDeniedZESRCHÚ NoSuchProcess)ÚselfÚargsÚkwargsÚerrr)Úfun©úL/opt/alt/python37/lib64/python3.7/site-packages/psutil/tests/test_windows.pyÚwrapper7s     z wrap_exceptions..wrapperr )rr"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@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)Nr))ÚintÚosÚenvironÚ assertEqualrÚ cpu_count)rZnum_cpusr r r!Ú&test_cpu_count_vs_NUMBER_OF_PROCESSORSSsz2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORScCs$t ¡d}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 ¡|j¡dS)Nr)ÚwmiÚWMIÚWin32_Processorr-rr.ZNumberOfLogicalProcessors)rÚwÚprocr r r!Útest_cpu_count_logical_vs_wmibs z)TestCpuAPIs.test_cpu_count_logical_vs_wmicCs.t ¡}| ¡d}| tjdd|j¡dS)NrF)Zlogical)r5r6r7r-rr.Z NumberOfCores)rr8r9r r r!Útest_cpu_count_phys_vs_wmigs z&TestCpuAPIs.test_cpu_count_phys_vs_wmicCs | t ¡ttjddƒ¡dS)NT)Zpercpu)r-rr.ÚlenÚ cpu_times)rr r r!Útest_cpu_count_vs_cpu_timesls z'TestCpuAPIs.test_cpu_count_vs_cpu_timescCs@t ¡}| ¡d}| |jt ¡j¡| |jt ¡j ¡dS)Nr) r5r6r7r-ZCurrentClockSpeedrZcpu_freqZcurrentZ MaxClockSpeedÚmax)rr8r9r r r!Ú test_cpu_freqps zTestCpuAPIs.test_cpu_freqN) r%r&r'rÚskipIfr+r,r/r4r:r;r>r@r r r r!r(Qs r(c@sreZdZdd„Zdd„Ze ed¡eƒdd„ƒƒZ eƒdd „ƒZ eƒd d „ƒZ d d „Z dd„Z dd„Zdd„ZdS)ÚTestSystemAPIscCsVtdƒ}tjdd ¡}x8|D]0}d| dd¡ ¡kr8q||kr| d|¡qWdS)Nz ipconfig /allT)Zperniczpseudo-interfaceú ú-z-%r nic wasn't found in 'ipconfig /all' output)rrZnet_io_countersÚkeysÚreplaceÚlowerÚfail)rÚoutZnicsZnicr r r!Útest_nic_namesys zTestSystemAPIs.test_nic_namescCs,t ¡ ¡d}| t|jƒt ¡j¡dS)Nr) r5r6ZWin32_ComputerSystemr-r*ZTotalPhysicalMemoryrZvirtual_memoryÚtotal)rr8r r r!Útest_total_phymemƒs z TestSystemAPIs.test_total_phymemztest not relieable on appveyorcCs:t ¡ ¡}tdd„|Dƒƒ}tt ¡ƒ}| ||¡dS)NcSsg|] }|j‘qSr )Ú ProcessId)Ú.0Úxr r r!ú šsz,TestSystemAPIs.test_pids..)r5r6Ú Win32_ProcessÚsetrÚpidsr-)rr8Zwmi_pidsZ psutil_pidsr r r!Ú test_pids”s  zTestSystemAPIs.test_pidsc Csütjdd}t ¡ ¡}xÞ|D]Ö}xÐ|D]¶}|j dd¡|jkr(|jsHPd|j krTP|j  d¡rbPyt  |j¡}Wnt k rˆPYnX|  |jt|jƒ¡t|jƒ}|  |j|¡t|j|ƒdkrÜ| d|j|f¡Pq(W| d t|ƒ¡qWdS) NT)Úallú\ÚÚcdromzA:i zpsutil=%s, wmi=%szcan't find partition %s)rÚdisk_partitionsr5r6ZWin32_LogicalDiskZdevicerFZDeviceIDÚ mountpointÚoptsÚ startswithÚ disk_usagerr-rKr*ZSizeZ FreeSpaceÚfreeÚabsrHÚrepr)rZps_partsZ wmi_partsZps_partZwmi_partZusageZwmi_freer r r!Ú test_disksžs.       zTestSystemAPIs.test_diskscCs|xvt ¡D]j}d|jkrq t |j¡}t |j¡}|j|d|jt d|j|d|j t d|  |j |j |j¡q WdS)NrXr)Údeltaé) rrYr[r1ZGetDiskFreeSpaceExrZr]ÚassertAlmostEqualr^rrKr-Zused)rZdiskr2r3r r r!Útest_disk_usage¼s   zTestSystemAPIs.test_disk_usagecCs>dd„t ¡ d¡Dƒ}dd„tjddDƒ}| ||¡dS)NcSs"g|]}|r| d¡s|d‘qS)zA:rV)r\)rNrOr r r!rPÌsz7TestSystemAPIs.test_disk_partitions..z\cSsg|]}|j d¡s|j‘qS)zA:)rZr\)rNrOr r r!rPÎsT)rU)r1ZGetLogicalDriveStringsÚsplitrrYr-)rr2r3r r r!Útest_disk_partitionsÊsz#TestSystemAPIs.test_disk_partitionscCs`tt ¡ƒ}t ¡ ¡}tƒ}x$|D]}| |j¡| |j¡q$W|  ||@d||f¡dS)Nzno common entries in %s, %s) rRÚcextZ net_if_statsr5r6ZWin32_NetworkAdapterÚaddÚNameZNetConnectionIDÚ assertTrue)rZps_namesZ wmi_adaptersZ wmi_namesZ wmi_adapterr r r!Útest_net_if_statsÒs     z TestSystemAPIs.test_net_if_statscCs^t ¡ ¡}|dj d¡d}tj |d¡}tj t  ¡¡}t ||  ¡ƒ}|  |d¡dS)NrÚ.z %Y%m%d%H%M%Sé) r5r6ZWin32_OperatingSystemZLastBootUpTimerfÚdatetimeZstrptimeZ fromtimestamprÚ boot_timer_Z total_secondsZassertLessEqual)rZwmi_osZ wmi_btime_strZ wmi_btime_dtZ psutil_dtZdiffr r r!Útest_boot_timeÜs zTestSystemAPIs.test_boot_timec Cs¬tjddd| t ¡d¡WdQRXtjddd| t ¡d¡WdQRXtjddd| t ¡d¡WdQRXtjddd| t ¡d¡WdQRXdS)Nz psutil._pswindows.cext.boot_timer0)Ú return_valueééiM)r Úpatchr-rrp)rr r r!Útest_boot_time_fluctuationåsz)TestSystemAPIs.test_boot_time_fluctuationN)r%r&r'rJrLrrArr rTrarergrlrqrvr r r r!rBws     rBc@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)r1ZGetPwrCapabilitiesZassertIsNotNonerÚsensors_batteryÚ assertIsNone)rr r r!Útest_has_batteryøs z#TestSensorsBattery.test_has_batteryz no batterycCs6t ¡}| d¡d}t ¡}|j|j|jdddS)Nzselect * from Win32_Batteryrrc)rb)r5r6ÚqueryrrxrdZpercentZEstimatedChargeRemaining)rr8Ú battery_wmiÚbattery_psutilr r r!Ú test_percentþs zTestSensorsBattery.test_percentcCs6t ¡}| d¡d}t ¡}| |j|jdk¡dS)Nzselect * from Win32_Batteryré)r5r6r{rrxr-Z power_pluggedZ BatteryStatus)rr8r|r}r r r!Útest_power_pluggeds z%TestSensorsBattery.test_power_pluggedc Cs,tjddd}| t ¡¡WdQRXdS)Nz&psutil._pswindows.cext.sensors_battery)ré€rr)rr)r ruryrrx)rÚmr r r!Útest_emulate_no_batterys z*TestSensorsBattery.test_emulate_no_batteryc Cs2tjddd}| t ¡jtj¡WdQRXdS)Nz&psutil._pswindows.cext.sensors_battery)rcrrr)rr)r rur-rrxÚsecsleftÚPOWER_TIME_UNLIMITED)rr‚r r r!Útest_emulate_power_connecteds   z/TestSensorsBattery.test_emulate_power_connectedc Cs2tjddd}| t ¡jtj¡WdQRXdS)Nz&psutil._pswindows.cext.sensors_battery)rérr)rr)r rur-rrxr„r…)rr‚r r r!Útest_emulate_power_chargings   z.TestSensorsBattery.test_emulate_power_chargingc Cs2tjddd}| t ¡jtj¡WdQRXdS)Nz&psutil._pswindows.cext.sensors_battery)rrréÿÿÿÿ)rr)r rur-rrxr„ZPOWER_TIME_UNKNOWN)rr‚r r r!Útest_emulate_secs_left_unknown%s   z1TestSensorsBattery.test_emulate_secs_left_unknownN) r%r&r'rzrrArr~r€rƒr†rˆrŠr r r r!rwös  rwc@s°eZdZedd„ƒZedd„ƒZdd„Zdd„Zd d „Zd d „Z e   e j d k d¡dd„ƒZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%S)&Ú TestProcesscCstƒj|_dS)N)rÚpid)Úclsr r r!Ú setUpClass4szTestProcess.setUpClasscCst|jƒdS)N)rrŒ)rr r r!Ú tearDownClass8szTestProcess.tearDownClasscCst d¡}| tj|j¡dS)Nr)rÚProcessÚ assertRaisesrÚkill)rÚpr r r!Ú test_issue_24<s zTestProcess.test_issue_24cCst d¡}| | ¡d¡t|ƒ| ¡| | ¡dk¡y| ¡dd…\}}Wn(tj k r|t   ¡ddkrx‚YnX| |dk¡dS)NrsZSystemgrrc)Zvistazwin-7Zwin7r) rrr-ÚnameÚstrÚusernamerkÚ create_timeÚ memory_inforÚplatformÚuname)rr“ÚrssÚvmsr r r!Útest_special_pid@s zTestProcess.test_special_pidcCs"t |j¡}| t|jtj¡dS)N)rrrŒr‘Ú ValueErrorÚ send_signalÚsignalÚSIGINT)rr“r r r!Útest_send_signalQs zTestProcess.test_send_signalcCsbt t ¡¡}| ¡}t tjtj t ¡¡}| ¡}|  ||d¡t  |¡|  | ¡|¡dS)Nrc) rrr+ÚgetpidÚ num_handlesr1Ú OpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr-Ú CloseHandle)rr“ZbeforeÚhandleZafterr r r!Útest_num_handles_incrementUs z&TestProcess.test_num_handles_increment)rézCTRL_* signals not supportedcCsdt | ¡j¡}| tj¡| tj¡| ¡|  ¡|  tj |jtj¡|  tj |jtj¡dS)N) rrrrŒr r¡Z CTRL_C_EVENTZCTRL_BREAK_EVENTr’Úwaitr‘r)rr“r r r!Útest_ctrl_signals_s   zTestProcess.test_ctrl_signalscCs | t ¡ ¡t tj¡¡dS)N)r-rrr—r1Z GetUserNameExr§ZNameSamCompatible)rr r r!Ú test_usernamelszTestProcess.test_usernamecCs8t ddt ¡¡ ¡}d t ¡ ¡¡}|  ||¡dS)Nz +rC) ÚreÚsubr1ZGetCommandLineÚstripÚjoinrrÚcmdliner-)rr2r3r r r!Ú test_cmdlinepszTestProcess.test_cmdlinecCsJt tjtjt ¡¡}| tj|¡t   |¡}t   ¡  ¡}| ||¡dS)N)r1r¦r§r¨r©r+r¤Ú addCleanuprªÚ win32processZGetPriorityClassrrÚnicer-)rr«r2r3r r r!Ú 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)r1r¦r§r¨r©rŒr·rªr¸ZGetProcessMemoryInforrr™r-Z peak_wsetZwsetZpeak_paged_poolZ paged_poolZpeak_nonpaged_poolZ nonpaged_poolZpagefileZ peak_pagefilerœr)rr«r2r3r r r!Útest_memory_infoŒs0  zTestProcess.test_memory_infocCsXt tjtj|j¡}| tj|¡t  |j¡}|  ¡|  ¡}t   |¡}| ||¡dS)N)r1r¦r§r¨r©rŒr·rªrrrr®r¸ZGetExitCodeProcessr-)rr«r“r3r2r r r!Ú 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)rcr )rNÚi)rOr r!rP³szGTestProcess.test_cpu_affinity..from_bitmask..é@)Úrange)rOr )rOr!Ú from_bitmask²sz3TestProcess.test_cpu_affinity..from_bitmaskr)r1r¦r§r¨r©rŒr·rªr¸ZGetProcessAffinityMaskrrZ cpu_affinityr-)rrÁr«r2r3r r r!Útest_cpu_affinity±s zTestProcess.test_cpu_affinitycCsªt tjtjt ¡¡}| tj|¡t   |¡}t   ¡  ¡}| |j|d¡| |j|d¡| |j|d¡| |j|d¡| |j|d¡| |j|d¡dS)NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)r1r¦r§r¨r©r+r¤r·rªr¸ZGetProcessIoCountersrrÚ io_countersr-Z read_countZ write_countZ read_bytesZ write_bytesÚ other_countZ other_bytes)rr«r2r3r r r!Útest_io_counters½s"  zTestProcess.test_io_counterscCs€ddl}ddl}d}|jj |d|j¡}| |jjj|¡|j  ¡}|jj  ||  |¡¡|j }t  |j¡ ¡}| ||¡dS)Nri)ÚctypesZctypes.wintypesZwindllZkernel32r¦rŒr·rªZwintypesZDWORDZGetProcessHandleCountZbyrefÚvaluerrr¥r-)rrÆr¨r«Zhndcntr2r3r r r!Útest_num_handlesÐs  zTestProcess.test_num_handlesc Csftƒ}d|_tjd|d4t d¡}t ¡}| tj|j¡WdQRXWdQRX|  |j d¡dS)Ni+z psutil._psplatform.cext.proc_cwd)Ú side_effectz time.sleepr0) Ú WindowsErrorZwinerrorr rurrr‘rÚcwdÚassertGreaterEqualZ call_count)rÚexcr‚r“r r r!Útest_error_partial_copyßs $z#TestProcess.test_error_partial_copycCs0t ¡dd}tj |¡}| tj|j¡dS)Nr‰iŸ†)rrSÚ _psplatformrr‘rÚexe)rrŒr9r r r!Útest_exeés zTestProcess.test_exeN)r%r&r'Ú classmethodrŽrr”ržr£r¬rrAÚsysÚ version_infor¯r°r¶rºr¼r½rÂrÅrÈrÎrÑr r r r!r‹2s$       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|_dS)N)rrŒ)rr r r!rŽôszTestProcessWMI.setUpClasscCst|jƒdS)N)rrŒ)rr r r!røszTestProcessWMI.tearDownClasscCs8t ¡j|jdd}t |j¡}| | ¡|j¡dS)N)rMr) r5r6rQrŒrrr-r•ZCaption)rr8r“r r r!Ú test_nameüs zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONScCs@t ¡j|jdd}t |j¡}| | ¡ ¡|j  ¡¡dS)N)rMr) r5r6rQrŒrrr-rÐrGZExecutablePath)rr8r“r r r!rÑs zTestProcessWMI.test_execCsFt ¡j|jdd}t |j¡}| d | ¡¡|j   dd¡¡dS)N)rMrrCú"rW) r5r6rQrŒrrr-r´rµZ CommandLinerF)rr8r“r r r!r¶ s zTestProcessWMI.test_cmdlinecCsPt ¡j|jdd}t |j¡}| ¡\}}}d||f}| | ¡|¡dS)N)rMrz%s\%s) r5r6rQrŒrrZGetOwnerr-r—)rr8r“ZdomainÚ_r—r r r!r°s   zTestProcessWMI.test_usernamecCsBt ¡j|jdd}t |j¡}| ¡j}| |t |j ƒ¡dS)N)rMr) r5r6rQrŒrrr™rœr-r*r»)rr8r“rœr r r!Útest_memory_rsss  zTestProcessWMI.test_memory_rsscCs`t ¡j|jdd}t |j¡}| ¡j}t|j ƒ}||kr\||dkr\|  d||f¡dS)N)rMrizwmi=%s, psutil=%s) r5r6rQrŒrrr™rr*Z PageFileUsagerH)rr8r“rZ wmi_usager r r!Útest_memory_vmss    zTestProcessWMI.test_memory_vmscCs\t ¡j|jdd}t |j¡}t|j d¡dƒ}t   dt   |  ¡¡¡}|  ||¡dS)N)rMrrmz %Y%m%d%H%M%S)r5r6rQrŒrrr–Z CreationDaterfÚtimeZstrftimeZ localtimer˜r-)rr8r“Z wmic_createZ psutil_creater r r!Útest_create_time+s  zTestProcessWMI.test_create_timeN)r%r&r'Ú__doc__rÒrŽrrÖrrArrÑr¶r°r rÙrÚrÜr r r r!rÕñs   rÕc@sXeZdZdZedd„ƒZedd„ƒZdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z 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 cCstƒj|_dS)N)rrŒ)rr r r!rŽCsz(TestDualProcessImplementation.setUpClasscCst|jƒdS)N)rrŒ)rr r r!rGsz+TestDualProcessImplementation.tearDownClassc Cs¨t |j¡ ¡}tjdttjdƒdx}t |j¡ ¡}|  t |ƒt |ƒ¡xLt t |ƒƒD]<}|  ||d¡|  ||d¡|j ||||ddqZWWdQRXdS)Nz(psutil._psplatform.cext.proc_memory_infoÚmsg)rÉri)rb)rrrŒr™r rurrÚEPERMr-r<rÀrÌrd)rZmem_1rZmem_2r¾r r r!r¼Ksz.TestDualProcessImplementation.test_memory_infoc CsNt |j¡ ¡}tjdttjdƒd}|  t |j¡ ¡|¡WdQRXdS)Nz"psutil._psplatform.cext.proc_timesrß)rÉ) rrrŒr˜r rurrràr-)rZctimerr r r!rÜWs z.TestDualProcessImplementation.test_create_timec Csnt |j¡ ¡}tjdttjdƒd>}t |j¡ ¡}|j |j |j dd|j |j |j ddWdQRXdS)Nz"psutil._psplatform.cext.proc_timesrß)rÉg{®Gáz„?)rb) rrrŒr=r rurrràrdÚuserÚsystem)rZ cpu_times_1rZ cpu_times_2r r r!Útest_cpu_times^sz,TestDualProcessImplementation.test_cpu_timesc Cstt |j¡ ¡}tjdttjdƒdD}t |j¡ ¡}x,t t |ƒƒD]}|j ||||ddqFWWdQRXdS)Nz(psutil._psplatform.cext.proc_io_countersrß)rÉr0)rb) rrrŒrÃr rurrràrÀr<rd)rZ io_counters_1rZ io_counters_2r¾r r r!rÅisz.TestDualProcessImplementation.test_io_countersc CsNt |j¡ ¡}tjdttjdƒd}|  t |j¡ ¡|¡WdQRXdS)Nz(psutil._psplatform.cext.proc_num_handlesrß)rÉ) rrrŒr¥r rurrràr-)rr¥rr r r!rÈss z.TestDualProcessImplementation.test_num_handlesc CsŽddlm}x|t ¡D]p}y tj|dd}tj|dd}Wn>tk rx}z ||ƒ}t|tjtj fƒsh‚Wdd}~XYqX|  ||¡qWdS)Nr)Úconvert_oserrorT)Zuse_pebF) rrärrSrhZ proc_cmdlinerÚ isinstancerrr-)rrärŒÚaÚbrr r r!r¶{s  z*TestDualProcessImplementation.test_cmdlineN) r%r&r'rÝrÒrŽrr¼rÜrãrÅrÈr¶r r r r!rÞ7s      rÞcspeZdZdZedd„ƒ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}xRt d¡D]D}tj|d|gtjtjd}| ¡\}}| ¡|tt ƒkr|SqWdS)Nz6import sys; sys.stdout.write(str(sys.maxsize > 2**32))zC:\Python*\python.exez-c)rÚstdoutÚstderr) ÚglobÚ subprocessÚPopenÚPIPEZSTDOUTÚ communicater®r–r)ÚcodeÚfilenamer9ÚoutputrØr r r!Úfind_other_interpreter’s   z,RemoteProcessTestCase.find_other_interpreterz-czimport 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ÚsetUprórZSkipTestrrÓÚ executableZpython64Zpython32r+r,Úcopyr–r¤rÚ test_argsrìrîÚproc32Úproc64)rZ other_pythonrõ)Ú __class__r r!r÷¤s(     zRemoteProcessTestCase.setUpcs"tƒ ¡|j ¡|j ¡dS)N)rÚtearDownrûrïrü)r)rýr r!rþ½s  zRemoteProcessTestCase.tearDowncCs@t |jj¡}| t| ¡ƒd¡| | ¡dd…|j¡dS)Nrnrc)rrrûrŒr-r<rµrú)rr“r r r!Útest_cmdline_32Âsz%RemoteProcessTestCase.test_cmdline_32cCs@t |jj¡}| t| ¡ƒd¡| | ¡dd…|j¡dS)Nrnrc)rrrürŒr-r<rµrú)rr“r r r!Útest_cmdline_64Çsz%RemoteProcessTestCase.test_cmdline_64cCs&t |jj¡}| | ¡t ¡¡dS)N)rrrûrŒr-rËr+Úgetcwd)rr“r r r!Ú test_cwd_32Ìsz!RemoteProcessTestCase.test_cwd_32cCs&t |jj¡}| | ¡t ¡¡dS)N)rrrürŒr-rËr+r)rr“r r r!Ú test_cwd_64Ðsz!RemoteProcessTestCase.test_cwd_64cCs>t |jj¡}| ¡}| d|¡| |dtt  ¡ƒ¡dS)Nrô) rrrûrŒr,ÚassertInZ assertEqualsr–r+r¤)rr“Úer r r!Útest_environ_32Ôs z%RemoteProcessTestCase.test_environ_32cCs6t |jj¡}y | ¡Wntjk r0YnXdS)N)rrrürŒr,r)rr“r r r!Útest_environ_64Ús  z%RemoteProcessTestCase.test_environ_64)r%r&r'rÝÚ staticmethodrórúr÷rþrÿrrrrrÚ __classcell__r r )rýr!rèŠs   rèc@seZdZdd„Zdd„ZdS)Ú TestServicescCsntdddddddgƒ}tdd d gƒ}tddd d d ddgƒ}x,t ¡D]}| ¡}| |dt¡| |d ¡d¡| |dt¡| |dt¡| |d|¡|ddk rÂt  |d¡| |dt¡| |dt¡| |dt¡| |d|¡| |d|¡| |dt¡|  ¡}|dk rLt  |¡}|  |  ¡¡t  | ¡¡}| ||¡qFWdS)NZrunningZpausedÚstartÚpauseÚcontinueÚstopZstoppedZ automaticZmanualZdisabledZ start_pendingZ pause_pendingZcontinue_pendingZ stop_pendingr•rWÚ display_namer—ÚstatusrŒZbinpathZ start_typeÚ description)rRrÚwin_service_iterZas_dictZassertIsInstancer–ZassertNotEqualr³rrrŒrkZ is_runningÚwin_service_getr•r-)rZvalid_statusesZvalid_start_typesZservÚdatarŒr“Úsr r r!Útest_win_service_iterêsR   z"TestServices.test_win_service_iterc Cs¨tjjj}tjjj}tt ¡ƒ ¡}| tj ¡}t  |d¡WdQRX|  |j j|d¡t  |¡}t rzddd|f}n|df}t|Ž}tjd|d| tj |j¡WdQRXtjd|d| tj |j¡WdQRXt rðddd|f}n|df}t|Ž}tjd|d| tj|j¡WdQRXtjd|d| tj|j¡WdQRX| | ¡t|ƒ¡| | ¡t|ƒ¡| | ¡t|ƒ¡| | ¡t|ƒ¡dS)Nz???rrßz/psutil._psplatform.cext.winservice_query_status)rÉz/psutil._psplatform.cext.winservice_query_config)rrÏrhÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextrr•r‘rrr-Z exceptionr rÊr rurr—rrr–rr`)rrrr•ÚcmZservicerrÍr r r!Útest_win_service_gets>       z!TestServices.test_win_service_getN)r%r&r'rrr r r r!r çs0r Ú__main__)Ú run_from_name)7rÝrorrër+ršr±r¡rìrÓrÛÚwarningsrrZpsutil._compatrrZ psutil.testsrrrrr r r r r rrrrrÚcatch_warningsÚ simplefilterr1r§r¸r5rÏrhr#rAr$r(rBrwr‹rÕrÞrèr r%Zpsutil.tests.runnerrÚ__file__r r r r!Úsr                       &<@FR\^