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)ÚselfZ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é   )Úwin32apiZ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"   Z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)Zlogical)r,   r-   r.   r    r!   r"   ZNumberOfCoresr/   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)Z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-   r.   r    ZCurrentClockSpeedr!   Zcpu_freqZcurrentZMaxClockSpeedÚmaxr/   r   r   r   Útest_cpu_freqe   s   zTestCpuAPIs.test_cpu_freqN)r   r   r   r   ÚskipIfr   r   r$   r*   r2   r3   r7   r9   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)Zperniczpseudo-interfaceú ú-z-%r nic wasn't found in 'ipconfig /all' output)r   r!   Znet_io_countersÚkeysÚreplaceÚlowerÚfail)r#   ÚoutZnicsZ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-   ZWin32_ComputerSystemr    r   ZTotalPhysicalMemoryr!   Zvirtual_memoryÚtotal)r#   r0   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   ©Z	ProcessId©Ú.0Úxr   r   r   Ú
<listcomp>   s    z,TestSystemAPIs.test_pids.<locals>.<listcomp>)r,   r-   ÚWin32_ProcessÚsetr!   Úpidsr    )r#   r0   Zwmi_pidsZ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-   ZWin32_LogicalDiskZdevicer?   ZDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   r    rD   r   ZSizeZ	FreeSpaceÚfreeÚabsrA   Úrepr)r#   Zps_partsZ	wmi_partsZps_partZwmi_partÚusageZ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 )NrS   r   ©Zdeltaé   )r!   rU   rW   r&   ZGetDiskFreeSpaceExrV   rY   ÚassertAlmostEqualrZ   r   rD   r    Úused)r#   Z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 )rT   rQ   )rX   rG   r   r   r   rJ   À   s    þþÿz7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c                 S   s   g | ]}|j  d ¡s|j ‘qS )rT   )rV   rX   rG   r   r   r   rJ   Ã   s    
ÿTrO   )r&   ZGetLogicalDriveStringsÚsplitr!   rU   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)
rL   ÚcextZnet_if_statsr,   r-   ZWin32_NetworkAdapterÚaddÚNameZNetConnectionIDÚ
assertTrue)r#   Zps_namesZwmi_adaptersZ	wmi_namesZ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-   ZWin32_OperatingSystemZLastBootUpTimerd   ÚdatetimeÚstrptimeZfromtimestampr!   Ú	boot_timer[   Ztotal_secondsZassertLessEqual)r#   Zwmi_osZwmi_btime_strZwmi_btime_dtZ	psutil_dtZ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%   ©Zreturn_valueé   é   iM  )r   Úpatchr    r!   rp   r6   r   r   r   Útest_boot_time_fluctuationÚ   s   ÿÿÿ"ÿz)TestSystemAPIs.test_boot_time_fluctuationN)r   r   r   rC   rE   r   r:   r   r   rN   r^   rc   re   rj   rq   rv   r   r   r   r   r;   l   s    




	r;   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 )NZSystemBatteriesPresent)r&   ZGetPwrCapabilitiesZassertIsNotNoner!   Úsensors_batteryÚassertIsNoner6   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!   rx   ra   ÚpercentZEstimatedChargeRemaining©r#   r0   Zbattery_wmiZ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!   rx   r    Zpower_pluggedZ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   rr   )r   ru   ry   r!   rx   Ú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   rr   ©r   ru   r    r!   rx   ÚsecsleftZPOWER_TIME_UNLIMITEDr„   r…   r   r   r   Útest_emulate_power_connected  ó   ÿÿ"üz/TestSensorsBattery.test_emulate_power_connectedc                 C   rˆ   )Nr‚   )r   é   r   r   rr   r‰   r…   r   r   r   Útest_emulate_power_charging  rŒ   z.TestSensorsBattery.test_emulate_power_chargingc                 C   rˆ   )Nr‚   )r   r   r   éÿÿÿÿrr   )r   ru   r    r!   rx   rŠ   ZPOWER_TIME_UNKNOWNr„   r…   r   r   r   Útest_emulate_secs_left_unknown  rŒ   z1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   rz   r   r:   r   r   r   r‡   r‹   rŽ   r   r   r   r   r   rw   ë   s    

	rw   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 )Nrs   ZSystemg        r€   r`   )Zvistazwin-7Zwin7r   )r!   r   r    ÚnameÚstrÚusernameri   Ú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¢   ZbeforeÚhandleZ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°   ZCTRL_C_EVENTZ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&   ZGetUserNameExr¶   ZNameSamCompatibler6   r   r   r   Útest_usernamea  s   
ÿzTestProcess.test_usernamec                 C   s8   t  ddt ¡ ¡ ¡ }d t ¡  ¡ ¡}|  	||¡ d S )Nz +r<   )
ÚreÚsubr&   Z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¹   Úwin32processZ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 )	NZPeakWorkingSetSizeÚWorkingSetSizeZQuotaPeakPagedPoolUsageZQuotaPagedPoolUsageZQuotaPeakNonPagedPoolUsageZQuotaNonPagedPoolUsageZPagefileUsageZPeakPagefileUsage)r&   rµ   r¶   r·   r¸   r•   rÇ   r¹   rÈ   ZGetProcessMemoryInfor!   r   r¨   r    Z	peak_wsetZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpagefileZ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È   Z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   )rH   Úi©rI   r   r   rJ   ¨  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È   ZGetProcessAffinityMaskr!   r   Z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 )NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)r&   rµ   r¶   r·   r¸   r   r³   rÇ   r¹   rÈ   ZGetProcessIoCountersr!   r   Úio_countersr    Z
read_countZwrite_countZ
read_bytesZwrite_bytesÚother_countZ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   é   )ÚctypesZctypes.wintypesZwindllZkernel32rµ   r•   rÇ   r¹   ZwintypesZDWORDZGetProcessHandleCountZbyrefÚvaluer!   r   r´   r    )r#   rÙ   r·   rº   Z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©Zside_effectz
time.sleepr%   )ÚWindowsErrorÚwinerrorr   ru   r!   r   rž   rŸ   ÚcwdÚassertGreaterEqualZ
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!   rM   Ú_psplatformr   rž   r¾   Úexe)r#   r•   r1   r   r   r   Útest_exeÞ  s   zTestProcess.test_exeN)r   r   r   Úclassmethodr˜   rœ   r£   r­   r²   r»   r   r:   ÚsysÚversion_infor¿   rÀ   rÆ   rË   rÍ   rÎ   rÔ   r×   rÛ   râ   rå   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 ©NrF   r   )	r,   r-   rK   r•   r!   r   r    r¤   ZCaption©r#   r0   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-   rK   r•   r!   r   r    rä   r@   ÚExecutablePathrë   r   r   r   rå   ÷  s   zTestProcessWMI.test_exec                 C   sF   t  ¡ j| jdd }t | j¡}|  d | ¡ ¡|j	 
dd¡¡ d S )NrF   r   r<   ú"rR   )r,   r-   rK   r•   r!   r   r    rÄ   rÅ   ZCommandLiner?   rë   r   r   r   rÆ   ÿ  s
   ÿzTestProcessWMI.test_cmdlinec                 C   sP   t  ¡ j| jdd }t | j¡}| ¡ \}}}d||f }|  | ¡ |¡ d S )NrF   r   z%s\%s)	r,   r-   rK   r•   r!   r   ZGetOwnerr    r¦   )r#   r0   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-   rK   r•   r!   r   r¨   r«   r    r   rÌ   )r#   r0   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 )NrF   r   rØ   zwmi=%s, psutil=%s)r,   r-   rK   r•   r!   r   r¨   r¬   r   ZPageFileUsagerA   )r#   r0   r¢   r¬   Z	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 )NrF   r   rk   rl   )r,   r-   rK   r•   r!   r   r¥   ZCreationDaterd   ÚtimeÚstrftimeÚ	localtimer§   r    )r#   r0   r¢   Zwmic_createZpsutil_creater   r   r   Útest_create_time   s   ÿzTestProcessWMI.test_create_timeN)r   r   r   Ú__doc__ræ   r˜   rœ   rì   r   r:   r   rå   rÆ   rÀ   r   rñ   rò   rö   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ÚmsgrÜ   r   i   r_   )r!   r   r•   r¨   r   ru   ÚOSErrorÚerrnoÚEPERMr    r4   rÒ   rà   ra   r„   )r#   Zmem_1ÚfunZ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_timesrù   rÜ   )r!   r   r•   r§   r   ru   rú   rû   rü   r    r„   )r#   Úctimerý   r   r   r   rö   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ÿ   rù   rÜ   g{®Gáz„?r_   )r!   r   r•   r5   r   ru   rú   rû   rü   r„   ra   ÚuserÚsystem)r#   Zcpu_times_1rý   Z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_countersrù   rÜ   r%   r_   )r!   r   r•   rÕ   r   ru   rú   rû   rü   rÒ   r4   ra   r„   )r#   Zio_counters_1rý   Zio_counters_2rÏ   r   r   r   r×   ^  s   
ÿÿ"úz.TestDualProcessImplementation.test_io_countersc                 C   rþ   )Nz(psutil._psplatform.cext.proc_num_handlesrù   rÜ   )r!   r   r•   r´   r   ru   rú   rû   rü   r    r„   )r#   r´   rý   r   r   r   rÛ   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)Zuse_pebF)
r!   rM   rf   Zproc_cmdlinerú   r   Ú
isinstancerŸ   r¾   r    )r#   r•   ÚaÚbÚerrr   r   r   rÆ   p  s   ÿþ€þöz*TestDualProcessImplementation.test_cmdlineN)r   r   r   r÷   ræ   r˜   rœ   rÍ   rö   r  r×   rÛ   rÆ   r   r   r   r   rø   ,  s    



rø   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ÚPIPEZSTDOUTÚcommunicater½   r¥   r   )ÚcodeÚfilenamer1   Úoutputrð   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   ZSkipTestr   rç   Ú
executableZpython64Zpython32r   r   Úcopyr¥   r³   r   Ú	test_argsr  r  Úproc32Úproc64)r#   Zother_pythonr  ©Ú	__class__r   r   r  ˜  s.   
ÿ
ýýzRemoteProcessTestCase.setUpc                    s"   t ƒ  ¡  | j ¡  | j ¡  d S r“   )r   ÚtearDownr  r  r  r6   r  r   r   r!  ±  s   

zRemoteProcessTestCase.tearDownc                 C   ó@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S ©Nrm   r`   )r!   r   r  r•   r    r4   rÅ   r  r¡   r   r   r   Útest_cmdline_32¶  ó   z%RemoteProcessTestCase.test_cmdline_32c                 C   r"  r#  )r!   r   r  r•   r    r4   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    rß   r   Úgetcwdr¡   r   r   r   Útest_cwd_32À  ó   z!RemoteProcessTestCase.test_cwd_32c                 C   r'  r“   )r!   r   r  r•   r    rß   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   r÷   Ú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)Z	automaticZmanualZdisabled)r3  r4  Zstart_pendingZpause_pendingZcontinue_pendingZstop_pendingr9  r¤   rR   Údisplay_namer¦   Ústatusr•   ZbinpathZ
start_typeÚdescription)rL   r!   Úwin_service_iterZas_dictZassertIsInstancer¥   ZassertNotEqualrÃ   r,  r   r•   ri   Z
is_runningÚwin_service_getr¤   r    )r#   Zvalid_statusesZvalid_start_typesZ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   rù   z/psutil._psplatform.cext.winservice_query_statusrÜ   z/psutil._psplatform.cext.winservice_query_config)r!   rã   rf   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextr=  r¤   rž   r¾   r>  r    Z	exceptionr	   rÝ   r   ru   r;  r¦   rŸ   r,  r¥   r:  r\   )r#   rB  rC  r¤   ÚcmÚservicer
  rá   r   r   r   Útest_win_service_get  sR   ÿ
ÿ
ÿþÿþÿþÿþz!TestServices.test_win_service_getN)r   r   r   rA  rG  r   r   r   r   r2  Û  s    0r2  Ú__main__)Úrun_from_name)8r÷   rn   rû   r  r   r©   rÁ   r°   r  rç   ró   Úwarningsr!   r   Zpsutil._compatr   r   Zpsutil.testsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Úcatch_warningsÚsimplefilterr&   r¶   rÈ   r,   Zpsutil._pswindowsr   rã   rf   r:   r   r   r;   rw   r‘   ré   rø   r  r2  r   Zpsutil.tests.runnerrI  Ú__file__r   r   r   r   Ú<module>   sz   


û
	&< @FQ\
^þ