o
    ˆ¶¹a’}  ã                   @   s®  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ erÅesÅe  ¡ � e !d¡ ddl"Z"ddl#Z#ddl$Z$ddl%Z%W d  ƒ n1 sÀw   Y  erÍddl&m'Z' ej(j)Z)e *e d¡e *ed¡e *eoâe d¡G dd„ deƒƒƒƒZ+G dd„ de+ƒZ,G dd„ de+ƒZ-G dd „ d e+ƒZ.G d!d"„ d"e+ƒZ/G d#d$„ d$e+ƒZ0e *e d¡G d%d&„ d&eƒƒZ1e *e d¡G d'd(„ d(eƒƒZ2e *e d¡G d)d*„ d*eƒƒZ3e4d+k�rUdd,l5m6Z6 e6e7ƒ dS dS )-zWindows specific tests.é    N)ÚWINDOWS)ÚFileNotFoundError)Úsuper)ÚAPPVEYOR)ÚGITHUB_ACTIONS)ÚHAS_BATTERY)ÚIS_64BIT)ÚPY3)ÚPYPY)ÚTOLERANCE_DISK_USAGE)ÚPsutilTestCase)Úmock)Úretry_on_failure)Úsh)Úspawn_testproc)Ú	terminate)ÚunittestÚignore)Úconvert_oserrorzWINDOWS onlyzpywin32 not available on PYPYzpywin32 broken on GITHUB + PY2c                   @   s   e Zd ZdS )ÚWindowsTestCaseN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú;/usr/lib/python3/dist-packages/psutil/tests/test_windows.pyr   9   s    r   c                   @   sN   e Zd Ze dejvd¡dd„ ƒZdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚTestCpuAPIsÚNUMBER_OF_PROCESSORSz-NUMBER_OF_PROCESSORS env var is not availablec                 C   s"   t tjd ƒ}|  |t ¡ ¡ d S )Nr   )ÚintÚosÚenvironÚassertEqualÚpsutilÚ	cpu_count)ÚselfÚnum_cpusr   r   r   Ú&test_cpu_count_vs_NUMBER_OF_PROCESSORSH   s   z2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORSc                 C   s$   t  ¡ d }t ¡ }|  ||¡ d S )Né   )Úwin32apiÚGetSystemInfor!   r"   r    ©r#   Ú	sys_valueÚpsutil_valuer   r   r   Útest_cpu_count_vs_GetSystemInfoP   s   z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfoc                 C   s*   t  ¡ }| ¡ d }|  t ¡ |j¡ d S ©Nr   )ÚwmiÚWMIÚWin32_Processorr    r!   r"   ÚNumberOfLogicalProcessors©r#   ÚwÚprocr   r   r   Útest_cpu_count_logical_vs_wmiW   s   z)TestCpuAPIs.test_cpu_count_logical_vs_wmic                 C   s.   t  ¡ }| ¡ d }|  tjdd�|j¡ d S )Nr   F)Úlogical)r.   r/   r0   r    r!   r"   ÚNumberOfCoresr2   r   r   r   Útest_cpu_count_cores_vs_wmi\   s   z'TestCpuAPIs.test_cpu_count_cores_vs_wmic                 C   s    |   t ¡ ttjdd�ƒ¡ d S )NT)Úpercpu)r    r!   r"   ÚlenÚ	cpu_times©r#   r   r   r   Útest_cpu_count_vs_cpu_timesa   s   
ÿz'TestCpuAPIs.test_cpu_count_vs_cpu_timesc                 C   s@   t  ¡ }| ¡ d }|  |jt ¡ j¡ |  |jt ¡ j	¡ d S r-   )
r.   r/   r0   r    ÚCurrentClockSpeedr!   Úcpu_freqÚcurrentÚMaxClockSpeedÚmaxr2   r   r   r   Útest_cpu_freqe   s   zTestCpuAPIs.test_cpu_freqN)r   r   r   r   ÚskipIfr   r   r%   r,   r5   r8   r=   rC   r   r   r   r   r   F   s    ÿ
r   c                   @   sr   e Zd Zdd„ Zdd„ Ze ed¡eƒ dd„ ƒƒZ	eƒ dd	„ ƒZ
eƒ d
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestSystemAPIsc                 C   sR   t dƒ}tjdd� ¡ }|D ]}d| dd¡ ¡ v rq||vr&|  d| ¡ qd S )Nzipconfig /allT)Úperniczpseudo-interfaceú ú-z-%r nic wasn't found in 'ipconfig /all' output)r   r!   Únet_io_countersÚkeysÚreplaceÚlowerÚfail)r#   ÚoutÚnicsÚnicr   r   r   Útest_nic_namesn   s   ÿ€üzTestSystemAPIs.test_nic_namesc                 C   s,   t  ¡  ¡ d }|  t|jƒt ¡ j¡ d S r-   )	r.   r/   ÚWin32_ComputerSystemr    r   ÚTotalPhysicalMemoryr!   Úvirtual_memoryÚtotal)r#   r3   r   r   r   Útest_total_phymemx   s   ÿz TestSystemAPIs.test_total_phymemztest not relieable on appveyorc                 C   s:   t  ¡  ¡ }tdd„ |D ƒƒ}tt ¡ ƒ}|  ||¡ d S )Nc                 S   s   g | ]}|j ‘qS r   ©Ú	ProcessId©Ú.0Úxr   r   r   Ú
<listcomp>�   s    z,TestSystemAPIs.test_pids.<locals>.<listcomp>)r.   r/   ÚWin32_ProcessÚsetr!   Úpidsr    )r#   r3   Úwmi_pidsÚpsutil_pidsr   r   r   Ú	test_pids‰   s   zTestSystemAPIs.test_pidsc              
   C   sú   t jdd�}t ¡  ¡ }|D ]l}|D ]^}|j dd¡|jkrp|js# nWd|j	v r* nP|j 
d¡r2 nHzt  |j¡}W n
 tyD   Y  n6w |  |jt|jƒ¡ t|jƒ}|  |j|¡ t|j| ƒdkrn|  d|j|f ¡  n
q|  d	t|ƒ ¡ qd S )
NT©Úallú\Ú ÚcdromúA:i    zpsutil=%s, wmi=%szcan't find partition %s)r!   Údisk_partitionsr.   r/   ÚWin32_LogicalDiskÚdevicerK   ÚDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   r    rU   r   ÚSizeÚ	FreeSpaceÚfreeÚabsrM   Úrepr)r#   Úps_partsÚ	wmi_partsÚps_partÚwmi_partÚusageÚwmi_freer   r   r   Ú
test_disks“   s8   
þ
ÿì€èzTestSystemAPIs.test_disksc                 C   sx   t  ¡ D ]5}d|jv rqt |j¡}t  |j¡}| j|d |jt	d� | j|d |j
t	d� |  |j|j
|j ¡ qd S )Nrg   r   ©Údeltaé   )r!   ri   rn   r'   ÚGetDiskFreeSpaceExrm   rp   ÚassertAlmostEqualrs   r   rU   r    Úused)r#   Údiskr*   r+   r   r   r   Útest_disk_usage±   s   
ÿÿ
ÿ÷zTestSystemAPIs.test_disk_usagec                 C   s>   dd„ t  ¡  d¡D ƒ}dd„ tjdd�D ƒ}|  ||¡ d S )Nc                 S   s"   g | ]}|r|  d ¡s|d ‘qS )rh   re   )ro   rY   r   r   r   r\   À   s    þþÿz7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c                 S   s   g | ]}|j  d ¡s|j ‘qS )rh   )rm   ro   rY   r   r   r   r\   Ã   s    
ÿTrc   )r'   ÚGetLogicalDriveStringsÚsplitr!   ri   r    r)   r   r   r   Útest_disk_partitions¿   s
   ÿz#TestSystemAPIs.test_disk_partitionsc                 C   s\   t t ¡ ƒ}t ¡  ¡ }t ƒ }|D ]}| |j¡ | |j¡ q|  	||@ d||f ¡ d S )Nzno common entries in %s, %s)
r^   ÚcextÚnet_if_statsr.   r/   ÚWin32_NetworkAdapterÚaddÚNameÚNetConnectionIDÚ
assertTrue)r#   Úps_namesÚwmi_adaptersÚ	wmi_namesÚwmi_adapterr   r   r   Útest_net_if_statsÇ   s   

ÿz TestSystemAPIs.test_net_if_statsc                 C   s^   t  ¡  ¡ }|d j d¡d }tj |d¡}tj t 	¡ ¡}t
||  ¡ ƒ}|  |d¡ d S )Nr   Ú.ú%Y%m%d%H%M%Sé   )r.   r/   ÚWin32_OperatingSystemÚLastBootUpTimer†   ÚdatetimeÚstrptimeÚfromtimestampr!   Ú	boot_timert   Útotal_secondsÚassertLessEqual)r#   Úwmi_osÚwmi_btime_strÚwmi_btime_dtÚ	psutil_dtÚdiffr   r   r   Útest_boot_timeÑ   s   ÿzTestSystemAPIs.test_boot_timec                 C   sþ   t jddd�� |  t ¡ d¡ W d   ƒ n1 sw   Y  t jddd�� |  t ¡ d¡ W d   ƒ n1 s9w   Y  t jddd�� |  t ¡ d¡ W d   ƒ n1 sXw   Y  t jddd�� |  t ¡ d¡ W d   ƒ d S 1 sxw   Y  d S )Nz psutil._pswindows.cext.boot_timer&   ©Úreturn_valueé   é   iM  )r   Úpatchr    r!   rœ   r<   r   r   r   Útest_boot_time_fluctuationÚ   s   ÿÿÿ"ÿz)TestSystemAPIs.test_boot_time_fluctuationN)r   r   r   rQ   rV   r   rD   r   r   rb   r|   r„   r‡   r“   r¤   rª   r   r   r   r   rE   l   s    




	rE   c                   @   s`   e Zd Zdd„ Ze e d¡dd„ ƒZe e d¡dd„ ƒZdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )ÚTestSensorsBatteryc                 C   s0   t  ¡ d r|  t ¡ ¡ d S |  t ¡ ¡ d S )NÚSystemBatteriesPresent)r'   ÚGetPwrCapabilitiesÚassertIsNotNoner!   Úsensors_batteryÚassertIsNoner<   r   r   r   Útest_has_batteryí   s   z#TestSensorsBattery.test_has_batteryz
no batteryc                 C   s6   t  ¡ }| d¡d }t ¡ }| j|j|jdd� d S )Núselect * from Win32_Batteryr   r   r}   )r.   r/   Úqueryr!   r¯   r�   ÚpercentÚEstimatedChargeRemaining©r#   r3   Úbattery_wmiÚbattery_psutilr   r   r   Útest_percentó   s   
þzTestSensorsBattery.test_percentc                 C   s6   t  ¡ }| d¡d }t ¡ }|  |j|jdk¡ d S )Nr²   r   é   )r.   r/   r³   r!   r¯   r    Úpower_pluggedÚBatteryStatusr¶   r   r   r   Útest_power_pluggedü   s   ÿz%TestSensorsBattery.test_power_pluggedc                 C   sL   t jddd��}|  t ¡ ¡ |jsJ ‚W d   ƒ d S 1 sw   Y  d S )Nú&psutil._pswindows.cext.sensors_battery)r   é€   r   r   r¥   )r   r©   r°   r!   r¯   Úcalled©r#   Úmr   r   r   Útest_emulate_no_battery  s   ÿ"ýz*TestSensorsBattery.test_emulate_no_batteryc                 C   óR   t jddd��}|  t ¡ jtj¡ |jsJ ‚W d   ƒ d S 1 s"w   Y  d S )Nr¾   )r   r   r   r   r¥   ©r   r©   r    r!   r¯   ÚsecsleftÚPOWER_TIME_UNLIMITEDrÀ   rÁ   r   r   r   Útest_emulate_power_connected  ó   ÿÿ"üz/TestSensorsBattery.test_emulate_power_connectedc                 C   rÄ   )Nr¾   )r   é   r   r   r¥   rÅ   rÁ   r   r   r   Útest_emulate_power_charging  rÉ   z.TestSensorsBattery.test_emulate_power_chargingc                 C   rÄ   )Nr¾   )r   r   r   éÿÿÿÿr¥   )r   r©   r    r!   r¯   rÆ   ÚPOWER_TIME_UNKNOWNrÀ   rÁ   r   r   r   Útest_emulate_secs_left_unknown  rÉ   z1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   r±   r   rD   r   r¹   r½   rÃ   rÈ   rË   rÎ   r   r   r   r   r«   ë   s    

	r«   c                   @   s°   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	e
 ejdk d¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%S )&ÚTestProcessc                 C   ó   t ƒ j| _d S ©N©r   Úpid©Úclsr   r   r   Ú
setUpClass)  ó   zTestProcess.setUpClassc                 C   ó   t | jƒ d S rÑ   ©r   rÓ   rÔ   r   r   r   ÚtearDownClass-  r×   zTestProcess.tearDownClassc                 C   s   t  d¡}|  t j|j¡ d S r-   )r!   ÚProcessÚassertRaisesÚAccessDeniedÚkill©r#   Úpr   r   r   Útest_issue_241  s   
zTestProcess.test_issue_24c                 C   s�   t  d¡}|  | ¡ d¡ t|ƒ | ¡  |  | ¡ dk¡ z| ¡ d d… \}}W n t j	y>   t
 ¡ d dvr;‚ Y d S w |  |dk¡ d S )Nr§   ÚSystemg        rº   r   )Úvistazwin-7Úwin7r   )r!   rÛ   r    ÚnameÚstrÚusernamerŽ   Úcreate_timeÚmemory_inforÝ   ÚplatformÚuname)r#   rà   ÚrssÚvmsr   r   r   Útest_special_pid5  s   
ÿþzTestProcess.test_special_pidc                 C   s"   t  | j¡}|  t|jtj¡ d S rÑ   )r!   rÛ   rÓ   rÜ   Ú
ValueErrorÚsend_signalÚsignalÚSIGINTrß   r   r   r   Útest_send_signalF  s   zTestProcess.test_send_signalc                 C   sb   t  t ¡ ¡}| ¡ }t tjtj	t ¡ ¡}| ¡ }|  
||d ¡ t |¡ |  
| ¡ |¡ d S )Nr   )r!   rÛ   r   ÚgetpidÚnum_handlesr'   ÚOpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr    ÚCloseHandle)r#   rà   ÚbeforeÚhandleÚafterr   r   r   Útest_num_handles_incrementJ  s   
ÿ
z&TestProcess.test_num_handles_increment)rº   é   zCTRL_* signals not supportedc                 C   sd   t  |  ¡ j¡}| tj¡ | tj¡ | ¡  | 	¡  |  
t j|jtj¡ |  
t j|jtj¡ d S rÑ   )r!   rÛ   r   rÓ   rð   rñ   ÚCTRL_C_EVENTÚCTRL_BREAK_EVENTrÞ   ÚwaitrÜ   ÚNoSuchProcessrß   r   r   r   Útest_ctrl_signalsT  s   ÿÿzTestProcess.test_ctrl_signalsc                 C   s    |   t ¡  ¡ t tj¡¡ d S rÑ   )r    r!   rÛ   rç   r'   ÚGetUserNameExr÷   ÚNameSamCompatibler<   r   r   r   Útest_usernamea  s   
ÿzTestProcess.test_usernamec                 C   s8   t  ddt ¡ ¡ ¡ }d t ¡  ¡ ¡}|  	||¡ d S )Nz +rG   )
ÚreÚsubr'   ÚGetCommandLineÚstripÚjoinr!   rÛ   Úcmdliner    r)   r   r   r   Útest_cmdlinee  s   zTestProcess.test_cmdlinec                 C   sJ   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }|  ||¡ d S rÑ   )r'   rö   r÷   rø   rù   r   rô   Ú
addCleanuprú   Úwin32processÚGetPriorityClassr!   rÛ   Únicer    ©r#   rü   r*   r+   r   r   r   Ú	test_nicey  s   
ÿ
zTestProcess.test_nicec                 C   sð   t  tjtj| j¡}|  t j|¡ t 	|¡}t
 | j¡ ¡ }|  |d |j¡ |  |d |j¡ |  |d |j¡ |  |d |j¡ |  |d |j¡ |  |d |j¡ |  |d |j¡ |  |d |j¡ |  |j|j¡ |  |j|j¡ d S )	NÚPeakWorkingSetSizeÚWorkingSetSizeÚQuotaPeakPagedPoolUsageÚQuotaPagedPoolUsageÚQuotaPeakNonPagedPoolUsageÚQuotaNonPagedPoolUsageÚPagefileUsageÚPeakPagefileUsage)r'   rö   r÷   rø   rù   rÓ   r  rú   r  ÚGetProcessMemoryInfor!   rÛ   ré   r    Ú	peak_wsetÚwsetÚpeak_paged_poolÚ
paged_poolÚpeak_nonpaged_poolÚnonpaged_poolÚpagefileÚpeak_pagefilerì   rí   r  r   r   r   Útest_memory_info�  sB   ÿ

ÿ
ÿ
ÿ
ÿþ
ÿ
ÿ
ÿzTestProcess.test_memory_infoc                 C   sX   t  tjtj| j¡}|  t j|¡ t 	| j¡}| 
¡  | ¡ }t |¡}|  ||¡ d S rÑ   )r'   rö   r÷   rø   rù   rÓ   r  rú   r!   rÛ   r   r  r  ÚGetExitCodeProcessr    )r#   rü   rà   r+   r*   r   r   r   Ú	test_waitœ  s   ÿ
zTestProcess.test_waitc                 C   s\   dd„ }t  tjtj| j¡}|  t j|¡ |t 	|¡d ƒ}t
 | j¡ ¡ }|  ||¡ d S )Nc                    s   ‡ fdd„t dƒD ƒS )Nc                    s   g | ]
}d |> ˆ @ r|‘qS )r   r   )rZ   Úi©r[   r   r   r\   ¨  s    zGTestProcess.test_cpu_affinity.<locals>.from_bitmask.<locals>.<listcomp>é@   )Úranger*  r   r*  r   Úfrom_bitmask§  s   z3TestProcess.test_cpu_affinity.<locals>.from_bitmaskr   )r'   rö   r÷   rø   rù   rÓ   r  rú   r  ÚGetProcessAffinityMaskr!   rÛ   Úcpu_affinityr    )r#   r-  rü   r*   r+   r   r   r   Útest_cpu_affinity¦  s   ÿÿzTestProcess.test_cpu_affinityc                 C   sª   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }|  |j|d ¡ |  |j|d ¡ |  |j|d ¡ |  |j|d ¡ |  |j|d ¡ |  |j|d ¡ d S )NÚReadOperationCountÚWriteOperationCountÚReadTransferCountÚWriteTransferCountÚOtherOperationCountÚOtherTransferCount)r'   rö   r÷   rø   rù   r   rô   r  rú   r  ÚGetProcessIoCountersr!   rÛ   Úio_countersr    Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚother_countÚother_bytesr  r   r   r   Útest_io_counters²  s0   
ÿ

ÿ
ÿ
ÿ
ÿ
ÿ
ÿzTestProcess.test_io_countersc                 C   s€   dd l }dd l}d}|jj |d| j¡}|  |jjj|¡ |j 	¡ }|jj 
|| |¡¡ |j}t | j¡ ¡ }|  ||¡ d S )Nr   é   )ÚctypesÚctypes.wintypesÚwindllÚkernel32rö   rÓ   r  rú   ÚwintypesÚDWORDÚGetProcessHandleCountÚbyrefÚvaluer!   rÛ   rõ   r    )r#   rA  rø   rü   Úhndcntr*   r+   r   r   r   Útest_num_handlesÅ  s   ÿ

ÿzTestProcess.test_num_handlesc              	   C   sŽ   t ƒ }d|_tjd|d��) t d¡�}t ¡ }|  tj|j¡ W d   ƒ n1 s*w   Y  W d   ƒ n1 s9w   Y  |  	|j
d¡ d S )Ni+  z psutil._psplatform.cext.proc_cwd©Úside_effectz
time.sleepr&   )ÚWindowsErrorÚwinerrorr   r©   r!   rÛ   rÜ   rÝ   ÚcwdÚassertGreaterEqualÚ
call_count)r#   ÚexcrÂ   rà   r   r   r   Útest_error_partial_copyÔ  s   þ€ÿz#TestProcess.test_error_partial_copyc                 C   s0   t  ¡ d d }t j |¡}|  t j|j¡ d S )NrÌ   iŸ† )r!   r_   Ú_psplatformrÛ   rÜ   r  Úexe)r#   rÓ   r4   r   r   r   Útest_exeÞ  s   zTestProcess.test_exeN)r   r   r   ÚclassmethodrÖ   rÚ   rá   rî   ró   rþ   r   rD   ÚsysÚversion_infor  r  r  r  r&  r(  r0  r?  rK  rT  rW  r   r   r   r   rÏ   '  s.    


ÿ


rÏ   c                   @   sx   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Ze 	e
d¡d	d
„ ƒZdd„ Zdd„ Zeƒ dd„ ƒZeƒ dd„ ƒZdd„ ZdS )ÚTestProcessWMIz%Compare Process API results with WMI.c                 C   rÐ   rÑ   rÒ   rÔ   r   r   r   rÖ   é  r×   zTestProcessWMI.setUpClassc                 C   rØ   rÑ   rÙ   rÔ   r   r   r   rÚ   í  r×   zTestProcessWMI.tearDownClassc                 C   s8   t  ¡ j| jd�d }t | j¡}|  | ¡ |j¡ d S ©NrW   r   )	r.   r/   r]   rÓ   r!   rÛ   r    rå   ÚCaption©r#   r3   rà   r   r   r   Ú	test_nameñ  s   zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONSc                 C   s@   t  ¡ j| jd�d }t | j¡}|  | ¡  ¡ |j	 ¡ ¡ d S r\  )
r.   r/   r]   rÓ   r!   rÛ   r    rV  rL   ÚExecutablePathr^  r   r   r   rW  ÷  s   zTestProcessWMI.test_exec                 C   sF   t  ¡ j| jd�d }t | j¡}|  d | ¡ ¡|j	 
dd¡¡ d S )NrW   r   rG   ú"rf   )r.   r/   r]   rÓ   r!   rÛ   r    r  r  ÚCommandLinerK   r^  r   r   r   r  ÿ  s
   ÿzTestProcessWMI.test_cmdlinec                 C   sP   t  ¡ j| jd�d }t | j¡}| ¡ \}}}d||f }|  | ¡ |¡ d S )NrW   r   z%s\%s)	r.   r/   r]   rÓ   r!   rÛ   ÚGetOwnerr    rç   )r#   r3   rà   ÚdomainÚ_rç   r   r   r   r    s
   zTestProcessWMI.test_usernamec                 C   sB   t  ¡ j| jd�d }t | j¡}| ¡ j}|  |t	|j
ƒ¡ d S r\  )r.   r/   r]   rÓ   r!   rÛ   ré   rì   r    r   r  )r#   r3   rà   rì   r   r   r   Útest_memory_rss  s   
zTestProcessWMI.test_memory_rssc                 C   sh   t  ¡ j| jd�d }t | j¡}| ¡ j}t|j	ƒ}||kr0||d kr2|  
d||f ¡ d S d S d S )NrW   r   r@  zwmi=%s, psutil=%s)r.   r/   r]   rÓ   r!   rÛ   ré   rí   r   ÚPageFileUsagerM   )r#   r3   rà   rí   Ú	wmi_usager   r   r   Útest_memory_vms  s   

ÿzTestProcessWMI.test_memory_vmsc                 C   s\   t  ¡ j| jd�d }t | j¡}t|j d¡d ƒ}t	 
dt	 | ¡ ¡¡}|  ||¡ d S )NrW   r   r”   r•   )r.   r/   r]   rÓ   r!   rÛ   ræ   ÚCreationDater†   ÚtimeÚstrftimeÚ	localtimerè   r    )r#   r3   rà   Úwmic_createÚpsutil_creater   r   r   Útest_create_time   s   ÿzTestProcessWMI.test_create_timeN)r   r   r   Ú__doc__rX  rÖ   rÚ   r_  r   rD   r   rW  r  r  r   rf  ri  rp  r   r   r   r   r[  æ  s     





r[  c                   @   sX   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú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
    c                 C   rÐ   rÑ   rÒ   rÔ   r   r   r   rÖ   8  r×   z(TestDualProcessImplementation.setUpClassc                 C   rØ   rÑ   rÙ   rÔ   r   r   r   rÚ   <  r×   z+TestDualProcessImplementation.tearDownClassc                 C   sÄ   t  | j¡ ¡ }tjdttjdƒd��E}t  | j¡ ¡ }|  	t
|ƒt
|ƒ¡ tt
|ƒƒD ]}|  || d¡ |  || d¡ | j|| || dd� q,|jsPJ ‚W d   ƒ d S 1 s[w   Y  d S )Nz(psutil._psplatform.cext.proc_memory_infoÚmsgrL  r   i   r}   )r!   rÛ   rÓ   ré   r   r©   ÚOSErrorÚerrnoÚEPERMr    r:   r,  rQ  r�   rÀ   )r#   Úmem_1ÚfunÚmem_2r)  r   r   r   r&  @  s   
ÿ"øz.TestDualProcessImplementation.test_memory_infoc                 C   ón   t  | j¡ ¡ }tjdttjdƒd��}|  	t  | j¡ ¡ |¡ |j
s%J ‚W d   ƒ d S 1 s0w   Y  d S )Nú"psutil._psplatform.cext.proc_timesrs  rL  )r!   rÛ   rÓ   rè   r   r©   rt  ru  rv  r    rÀ   )r#   Úctimerx  r   r   r   rp  L  s   
ÿ"ýz.TestDualProcessImplementation.test_create_timec                 C   sŽ   t  | j¡ ¡ }tjdttjdƒd��*}t  | j¡ ¡ }|j	s!J ‚| j
|j|jdd� | j
|j|jdd� W d   ƒ d S 1 s@w   Y  d S )Nr{  rs  rL  g{®Gáz„?r}   )r!   rÛ   rÓ   r;   r   r©   rt  ru  rv  rÀ   r�   ÚuserÚsystem)r#   Úcpu_times_1rx  Úcpu_times_2r   r   r   Útest_cpu_timesS  s   
ÿ

ÿ
ÿ"úz,TestDualProcessImplementation.test_cpu_timesc                 C   s�   t  | j¡ ¡ }tjdttjdƒd��+}t  | j¡ ¡ }t	t
|ƒƒD ]}| j|| || dd� q"|js6J ‚W d   ƒ d S 1 sAw   Y  d S )Nz(psutil._psplatform.cext.proc_io_countersrs  rL  r&   r}   )r!   rÛ   rÓ   r8  r   r©   rt  ru  rv  r,  r:   r�   rÀ   )r#   Úio_counters_1rx  Úio_counters_2r)  r   r   r   r?  ^  s   
ÿÿ"úz.TestDualProcessImplementation.test_io_countersc                 C   rz  )Nz(psutil._psplatform.cext.proc_num_handlesrs  rL  )r!   rÛ   rÓ   rõ   r   r©   rt  ru  rv  r    rÀ   )r#   rõ   rx  r   r   r   rK  h  s   
ÿÿ"üz.TestDualProcessImplementation.test_num_handlesc                 C   s€   t  ¡ D ]9}ztj|dd�}tj|dd�}W n  ty6 } zt|ƒ}t|t jt jfƒs,‚ W Y d }~qd }~ww |  	||¡ qd S )NT)Úuse_pebF)
r!   r_   rˆ   Úproc_cmdlinert  r   Ú
isinstancerÝ   r  r    )r#   rÓ   ÚaÚbÚerrr   r   r   r  p  s   ÿþ€þöz*TestDualProcessImplementation.test_cmdlineN)r   r   r   rq  rX  rÖ   rÚ   r&  rp  r�  r?  rK  r  r   r   r   r   rr  ,  s    



rr  c                       sp   e Zd ZdZedd„ ƒZddgZ‡ fdd„Z‡ fdd	„Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú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.
    c                  C   s\   d} t   d¡D ]$}tj|d| gtjtjd�}| ¡ \}}| ¡  |tt ƒkr+|  S qd S )Nz6import sys; sys.stdout.write(str(sys.maxsize > 2**32))zC:\Python*\python.exeú-c)ÚargsÚstdoutÚstderr)	ÚglobÚ
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicater  ræ   r   )ÚcodeÚfilenamer4   Úoutputre  r   r   r   Úfind_other_interpreter†  s   þÿúz,RemoteProcessTestCase.find_other_interpreterr‹  zimport sys; sys.stdin.read()c                    s    t ƒ  ¡  |  ¡ }|d u rt d¡‚trtj| _|| _	n|| _tj| _	t
j ¡ }tt
 ¡ ƒ|d< | j| j	g| j |tjd�| _| j| jg| j |tjd�| _d S )Nz0could not find interpreter with opposite bitnessÚTHINK_OF_A_NUMBER)ÚenvÚstdin)r   ÚsetUpr˜  r   ÚSkipTestr   rY  Ú
executableÚpython64Úpython32r   r   Úcopyræ   rô   r   Ú	test_argsr�  r’  Úproc32Úproc64)r#   Úother_pythonrš  ©Ú	__class__r   r   rœ  ˜  s.   
ÿ
ýýzRemoteProcessTestCase.setUpc                    s"   t ƒ  ¡  | j ¡  | j ¡  d S rÑ   )r   ÚtearDownr£  r”  r¤  r<   r¦  r   r   r¨  ±  s   

zRemoteProcessTestCase.tearDownc                 C   ó@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S ©Nr–   r   )r!   rÛ   r£  rÓ   r    r:   r  r¢  rß   r   r   r   Útest_cmdline_32¶  ó   z%RemoteProcessTestCase.test_cmdline_32c                 C   r©  rª  )r!   rÛ   r¤  rÓ   r    r:   r  r¢  rß   r   r   r   Útest_cmdline_64»  r¬  z%RemoteProcessTestCase.test_cmdline_64c                 C   ó&   t  | jj¡}|  | ¡ t ¡ ¡ d S rÑ   )r!   rÛ   r£  rÓ   r    rP  r   Úgetcwdrß   r   r   r   Útest_cwd_32À  ó   z!RemoteProcessTestCase.test_cwd_32c                 C   r®  rÑ   )r!   rÛ   r¤  rÓ   r    rP  r   r¯  rß   r   r   r   Útest_cwd_64Ä  r±  z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t  | jj¡}| ¡ }|  d|¡ |  |d tt 	¡ ƒ¡ d S )Nr™  )
r!   rÛ   r£  rÓ   r   ÚassertInr    ræ   r   rô   )r#   rà   Úer   r   r   Útest_environ_32È  s   z%RemoteProcessTestCase.test_environ_32c                 C   s4   t  | jj¡}z| ¡  W d S  t jy   Y d S w rÑ   )r!   rÛ   r¤  rÓ   r   rÝ   rß   r   r   r   Útest_environ_64Î  s   ÿz%RemoteProcessTestCase.test_environ_64)r   r   r   rq  Ústaticmethodr˜  r¢  rœ  r¨  r«  r­  r°  r²  rµ  r¶  Ú__classcell__r   r   r¦  r   rŠ  ~  s    
rŠ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestServicesc                 C   sN  t g d¢ƒ}t g d¢ƒ}t g d¢ƒ}t ¡ D ]Ž}| ¡ }|  |d t¡ |  |d  ¡ d¡ |  |d t¡ |  |d t¡ |  |d |¡ |d	 d urSt 	|d	 ¡ |  |d
 t¡ |  |d t¡ |  |d t¡ |  |d |¡ |  |d |¡ |  |d t¡ | 
¡ }|d ur—t 	|¡}|  | ¡ ¡ t | ¡ ¡}|  ||¡ qd S )N)ÚrunningÚpausedÚstartÚpauseÚcontinueÚstopÚstopped)Ú	automaticÚmanualÚdisabled)rº  r»  Ústart_pendingÚpause_pendingÚcontinue_pendingÚstop_pendingrÀ  rå   rf   Údisplay_namerç   ÚstatusrÓ   ÚbinpathÚ
start_typeÚdescription)r^   r!   Úwin_service_iterÚas_dictÚassertIsInstanceræ   ÚassertNotEqualr  r³  rÛ   rÓ   rŽ   Ú
is_runningÚwin_service_getrå   r    )r#   Úvalid_statusesÚvalid_start_typesÚservÚdatarÓ   rà   Úsr   r   r   Útest_win_service_iterÞ  s2   		
êz"TestServices.test_win_service_iterc                 C   s  t jjj}t jjj}tt  ¡ ƒ ¡ }|  t j	¡�}t  
|d ¡ W d   ƒ n1 s*w   Y  |  |jj|d ¡ t  
|¡}trGddd|f}n|df}t|Ž }tjd|d�� |  t j	|j¡ W d   ƒ n1 siw   Y  tjd|d�� |  t j	|j¡ W d   ƒ n1 sˆw   Y  tr–ddd|f}n|df}t|Ž }tjd|d�� |  t j|j¡ W d   ƒ n1 s¸w   Y  tjd|d�� |  t j|j¡ W d   ƒ n1 s×w   Y  |  | ¡ t|ƒ¡ |  | ¡ t|ƒ¡ |  | ¡ t|ƒ¡ |  | ¡ t|ƒ¡ d S )Nz???r   rs  z/psutil._psplatform.cext.winservice_query_statusrL  z/psutil._psplatform.cext.winservice_query_config)r!   rU  rˆ   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextrÍ  rå   rÜ   r  rÒ  r    Ú	exceptionr	   rN  r   r©   rÉ  rç   rÝ   r³  ræ   rÈ  ru   )r#   rÙ  rÚ  rå   ÚcmÚservicerŒ  rS  r   r   r   Útest_win_service_get  sR   ÿ
ÿ
ÿþÿþÿþÿþz!TestServices.test_win_service_getN)r   r   r   rØ  rß  r   r   r   r   r¹  Û  s    0r¹  Ú__main__)Úrun_from_name)8rq  r™   ru  r�  r   rê   r  rñ   r�  rY  rk  Úwarningsr!   r   Úpsutil._compatr   r   Úpsutil.testsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Úcatch_warningsÚsimplefilterr'   r÷   r  r.   Úpsutil._pswindowsr   rU  rˆ   rD   r   r   rE   r«   rÏ   r[  rr  rŠ  r¹  r   Úpsutil.tests.runnerrá  Ú__file__r   r   r   r   Ú<module>   sz   


û
	&< @FQ\
^þ