
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    Œ=Ý_M  ã                	   @   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�rze�sze  ¡ �0 e !d¡ ddl"Z"ddl#Z#ddl$Z$ddl%Z%W 5 Q R X ej&j'Z'dd„ 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*ƒZ/e )e d¡G d&d'„ d'eƒƒZ0e )e d¡G d(d)„ d)eƒƒZ1e )e d¡G d*d+„ d+eƒƒZ2e3d,k�r�dd-l4m5Z5 e5e6ƒ dS ).zWindows 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Úignorec                    s   ‡ fdd„}|S )Nc              
      sv   zˆ | f|ž|ŽW S  t k
rp } z@ddlm} |j|krFt d d ¡‚|jtjkr^t d d ¡‚‚ W 5 d }~X Y nX d S )Nr   )ÚACCESS_DENIED_SET)ÚOSErrorÚpsutil._pswindowsr   ÚerrnoÚpsutilÚAccessDeniedZESRCHÚNoSuchProcess)ÚselfÚargsÚkwargsÚerrr   ©Úfun© úL/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_windows.pyÚwrapper7   s    
z wrap_exceptions.<locals>.wrapperr!   )r    r#   r!   r   r"   Úwrap_exceptions6   s    
r$   z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!   r!   r"   r%   D   s   r%   c                   @   sN   e Zd Ze dejk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ÚassertEqualr   Ú	cpu_count)r   Znum_cpusr!   r!   r"   Ú&test_cpu_count_vs_NUMBER_OF_PROCESSORSS   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_GetSystemInfo[   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_wmib   s    z)TestCpuAPIs.test_cpu_count_logical_vs_wmic                 C   s.   t  ¡ }| ¡ d }|  tjdd�|j¡ d S )Nr   F)Zlogical)r8   r9   r:   r.   r   r/   ZNumberOfCoresr;   r!   r!   r"   Útest_cpu_count_phys_vs_wmig   s    z&TestCpuAPIs.test_cpu_count_phys_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_timesl   s    
ÿz'TestCpuAPIs.test_cpu_count_vs_cpu_timesc                 C   s@   t  ¡ }| ¡ d }|  |jt ¡ j¡ |  |jt ¡ j	¡ d S r7   )
r8   r9   r:   r.   ZCurrentClockSpeedr   Zcpu_freqÚcurrentZMaxClockSpeedÚmaxr;   r!   r!   r"   Útest_cpu_freqp   s    zTestCpuAPIs.test_cpu_freqN)r&   r'   r(   r   ÚskipIfr,   r-   r0   r6   r>   r?   rC   rF   r!   r!   r!   r"   r)   Q   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 ]0}d| dd¡ ¡ kr6q||k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_namesy   s    ÿzTestSystemAPIs.test_nic_namesc                 C   s,   t  ¡  ¡ d }|  t|jƒt ¡ j¡ d S r7   )	r8   r9   ZWin32_ComputerSystemr.   r+   ZTotalPhysicalMemoryr   Zvirtual_memoryÚtotal)r   r<   r!   r!   r"   Útest_total_phymemƒ   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>)r8   r9   ÚWin32_ProcessÚsetr   Úpidsr.   )r   r<   Zwmi_pidsZpsutil_pidsr!   r!   r"   Ú	test_pids”   s    zTestSystemAPIs.test_pidsc              
   C   s   t jdd�}t ¡  ¡ }|D ]Þ}|D ]Â}|j dd¡|jkr$|jsF qd|j	krT q|j 
d¡rd qzt  |j¡}W n tk
rŽ   Y  qY nX |  |jt|jƒ¡ t|jƒ}|  |j|¡ t|j| ƒdkrâ|  d|j|f ¡  qq$|  d	t|ƒ ¡ qd S )
NT©Úallú\Ú ÚcdromúA:i    zpsutil=%s, wmi=%szcan't find partition %s)r   Údisk_partitionsr8   r9   ZWin32_LogicalDiskÚdevicerL   ZDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   r.   rQ   r+   ÚSizeZ	FreeSpaceÚfreeÚabsrN   Úrepr)r   Zps_partsZ	wmi_partsZps_partZwmi_partÚusageZwmi_freer!   r!   r"   Ú
test_disksž   s2    

 ÿzTestSystemAPIs.test_disksc                 C   sx   t  ¡ D ]j}d|jkrqt |j¡}t  |j¡}| j|d |jt	d� | j|d |j
t	d� |  |j|j
|j ¡ qd S )Nr`   r   ©Údeltaé   )r   rb   re   r2   ZGetDiskFreeSpaceExrd   rg   ÚassertAlmostEqualri   r   rQ   r.   Úused)r   Zdiskr4   r5   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 )ra   r^   )rf   rT   r!   r!   r"   rW   Ë   s    
ÿz7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c                 S   s   g | ]}|j  d ¡s|j ‘qS )ra   )rd   rf   rT   r!   r!   r"   rW   Î   s    ÿTr\   )r2   ZGetLogicalDriveStringsÚsplitr   rb   r.   r3   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)
rY   ÚcextZnet_if_statsr8   r9   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é   )r8   r9   ZWin32_OperatingSystemZLastBootUpTimert   ÚdatetimeÚstrptimeÚfromtimestampr   Ú	boot_timerj   Ú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 5 Q R X t jddd�� |  t ¡ d¡ W 5 Q R X t jddd�� |  t ¡ d¡ W 5 Q R X t jddd�� |  t ¡ d¡ W 5 Q R X d S )Nz psutil._pswindows.cext.boot_timer1   ©Zreturn_valueé   é   iM  )r	   Úpatchr.   r   r�   rB   r!   r!   r"   Útest_boot_time_fluctuationå   s    z)TestSystemAPIs.test_boot_time_fluctuationN)r&   r'   r(   rP   rR   r   rG   r   r   r[   rm   rs   ru   rz   rƒ   rˆ   r!   r!   r!   r"   rH   w   s   




	rH   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   s.   t  ¡ d r|  t ¡ ¡ n|  t ¡ ¡ d S )NZSystemBatteriesPresent)r2   ZGetPwrCapabilitiesZassertIsNotNoner   Úsensors_batteryÚassertIsNonerB   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   rp   rn   )r8   r9   Úqueryr   rŠ   rq   ÚpercentZEstimatedChargeRemaining©r   r<   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   é   )r8   r9   rŽ   r   rŠ   r.   Úpower_pluggedZBatteryStatusr�   r!   r!   r"   Útest_power_plugged  s    ÿz%TestSensorsBattery.test_power_pluggedc              	   C   s6   t jddd��}|  t ¡ ¡ |js(t‚W 5 Q R X d S )Nú&psutil._pswindows.cext.sensors_battery)r   é€   r   r   r„   )r	   r‡   r‹   r   rŠ   ÚcalledÚAssertionError©r   Úmr!   r!   r"   Útest_emulate_no_battery  s    ÿz*TestSensorsBattery.test_emulate_no_batteryc              	   C   s<   t jddd��$}|  t ¡ jtj¡ |js.t‚W 5 Q R X d S )Nr•   )rp   r   r   r   r„   ©	r	   r‡   r.   r   rŠ   ÚsecsleftÚPOWER_TIME_UNLIMITEDr—   r˜   r™   r!   r!   r"   Útest_emulate_power_connected  s    ÿÿz/TestSensorsBattery.test_emulate_power_connectedc              	   C   s<   t jddd��$}|  t ¡ jtj¡ |js.t‚W 5 Q R X d S )Nr•   )r   é   r   r   r„   rœ   r™   r!   r!   r"   Útest_emulate_power_charging  s    ÿÿz.TestSensorsBattery.test_emulate_power_chargingc              	   C   s<   t jddd��$}|  t ¡ jtj¡ |js.t‚W 5 Q R X d S )Nr•   )r   r   r   éÿÿÿÿr„   )	r	   r‡   r.   r   rŠ   r�   ÚPOWER_TIME_UNKNOWNr—   r˜   r™   r!   r!   r"   Útest_emulate_secs_left_unknown%  s    ÿÿz1TestSensorsBattery.test_emulate_secs_left_unknownN)r&   r'   r(   rŒ   r   rG   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   s   t ƒ j| _d S ©N©r   Úpid©Úclsr!   r!   r"   Ú
setUpClass4  s    zTestProcess.setUpClassc                 C   s   t | jƒ d S r¦   ©r   r¨   r©   r!   r!   r"   ÚtearDownClass8  s    zTestProcess.tearDownClassc                 C   s   t  d¡}|  t j|j¡ d S r7   )r   ÚProcessÚassertRaisesr   Úkill©r   Úpr!   r!   r"   Útest_issue_24<  s    
zTestProcess.test_issue_24c                 C   s�   t  d¡}|  | ¡ d¡ t|ƒ | ¡  |  | ¡ dk¡ z| ¡ d d… \}}W n( t j	k
r|   t
 ¡ d dkrx‚ Y nX |  |dk¡ d S )Nr…   ÚSystemg        r’   rp   )Zvistazwin-7Zwin7r   )r   r®   r.   ÚnameÚstrÚusernamery   Úcreate_timeÚmemory_infor   ÚplatformÚuname)r   r²   ÚrssÚvmsr!   r!   r"   Útest_special_pid@  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_signalQ  s    zTestProcess.test_send_signalc                 C   sb   t  t ¡ ¡}| ¡ }t tjtj	t ¡ ¡}| ¡ }|  
||d ¡ t |¡ |  
| ¡ |¡ d S )Nrp   )r   r®   r,   ÚgetpidÚnum_handlesr2   ÚOpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr.   ÚCloseHandle)r   r²   ÚbeforeÚhandleÚafterr!   r!   r"   Útest_num_handles_incrementU  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¯   r   r±   r!   r!   r"   Útest_ctrl_signals_  s     ÿ ÿzTestProcess.test_ctrl_signalsc                 C   s    |   t ¡  ¡ t tj¡¡ d S r¦   )r.   r   r®   r·   r2   ZGetUserNameExrÇ   ZNameSamCompatiblerB   r!   r!   r"   Útest_usernamel  s    
ÿzTestProcess.test_usernamec                 C   s8   t  ddt ¡ ¡ ¡ }d t ¡  ¡ ¡}|  	||¡ d S )Nz +rI   )
ÚreÚsubr2   ZGetCommandLineÚstripÚjoinr   r®   Úcmdliner.   r3   r!   r!   r"   Útest_cmdlinep  s    zTestProcess.test_cmdlinec                 C   sJ   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }|  ||¡ d S r¦   )r2   rÆ   rÇ   rÈ   rÉ   r,   rÄ   Ú
addCleanuprÊ   Úwin32processZGetPriorityClassr   r®   Únicer.   ©r   rÌ   r4   r5   r!   r!   r"   Ú	test_nice„  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)r2   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Œ  sR     ÿ
 ÿ ÿ ÿ ÿþ ÿ ÿ ÿzTestProcess.test_memory_infoc                 C   sX   t  tjtj| j¡}|  t j|¡ t 	| j¡}| 
¡  | ¡ }t |¡}|  ||¡ d S r¦   )r2   rÆ   rÇ   rÈ   rÉ   r¨   rÙ   rÊ   r   r®   r   rÐ   rÚ   ZGetExitCodeProcessr.   )r   rÌ   r²   r5   r4   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 )rp   r!   )rU   Úi©rV   r!   r"   rW   ³  s      zGTestProcess.test_cpu_affinity.<locals>.from_bitmask.<locals>.<listcomp>é@   )Úrangerâ   r!   râ   r"   Úfrom_bitmask²  s    z3TestProcess.test_cpu_affinity.<locals>.from_bitmaskr   )r2   rÆ   rÇ   rÈ   rÉ   r¨   rÙ   rÊ   rÚ   ZGetProcessAffinityMaskr   r®   Zcpu_affinityr.   )r   rå   rÌ   r4   r5   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)r2   rÆ   rÇ   rÈ   rÉ   r,   rÄ   rÙ   rÊ   rÚ   ZGetProcessIoCountersr   r®   Úio_countersr.   Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚother_countZother_bytesrÜ   r!   r!   r"   Útest_io_counters½  s>     ÿ
 ÿ ÿ ÿ ÿ ÿ ÿ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.wintypesÚwindllÚkernel32rÆ   r¨   rÙ   rÊ   ZwintypesZDWORDZGetProcessHandleCountÚbyrefÚvaluer   r®   rÅ   r.   )r   rï   rÈ   rÌ   Zhndcntr4   r5   r!   r!   r"   Útest_num_handlesÐ  s"      ÿ
 ÿzTestProcess.test_num_handlesc              
   C   sf   t ƒ }d|_tjd|d��4 t d¡�}t ¡ }|  tj|j¡ W 5 Q R X W 5 Q R X |  	|j
d¡ d S )Ni+  z psutil._psplatform.cext.proc_cwd©Úside_effectz
time.sleepr1   )ÚWindowsErrorÚwinerrorr	   r‡   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   rZ   Ú_psplatformr®   r¯   r   Úexe)r   r¨   r=   r!   r!   r"   Útest_exeé  s    zTestProcess.test_exeN)r&   r'   r(   Úclassmethodr«   r­   r³   r¾   rÃ   rÎ   r   rG   ÚsysÚversion_inforÑ   rÒ   rØ   rÝ   rß   rà   ræ   rí   rô   rü   rÿ   r!   r!   r!   r"   r¥   2  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   s   t ƒ j| _d S r¦   r§   r©   r!   r!   r"   r«   ô  s    zTestProcessWMI.setUpClassc                 C   s   t | jƒ d S r¦   r¬   r©   r!   r!   r"   r­   ø  s    zTestProcessWMI.tearDownClassc                 C   s8   t  ¡ j| jd�d }t | j¡}|  | ¡ |j¡ d S ©NrS   r   )	r8   r9   rX   r¨   r   r®   r.   rµ   ZCaption©r   r<   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  )
r8   r9   rX   r¨   r   r®   r.   rþ   rM   Z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 )NrS   r   rI   ú"r_   )r8   r9   rX   r¨   r   r®   r.   rÖ   r×   ZCommandLinerL   r  r!   r!   r"   rØ   
  s
    ÿzTestProcessWMI.test_cmdlinec                 C   sP   t  ¡ j| jd�d }t | j¡}| ¡ \}}}d||f }|  | ¡ |¡ d S )NrS   r   z%s\%s)	r8   r9   rX   r¨   r   r®   ZGetOwnerr.   r·   )r   r<   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  )r8   r9   rX   r¨   r   r®   r¹   r¼   r.   r+   rÞ   )r   r<   r²   r¼   r!   r!   r"   Útest_memory_rss  s    
zTestProcessWMI.test_memory_rssc                 C   s`   t  ¡ j| jd�d }t | j¡}| ¡ j}t|j	ƒ}||kr\||d kr\|  
d||f ¡ d S )NrS   r   rî   zwmi=%s, psutil=%s)r8   r9   rX   r¨   r   r®   r¹   r½   r+   ZPageFileUsagerN   )r   r<   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 )NrS   r   r{   r|   )r8   r9   rX   r¨   r   r®   r¶   ZCreationDatert   ÚtimeÚstrftimeÚ	localtimer¸   r.   )r   r<   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   rG   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   s   t ƒ j| _d S r¦   r§   r©   r!   r!   r"   r«   C  s    z(TestDualProcessImplementation.setUpClassc                 C   s   t | jƒ d S r¦   r¬   r©   r!   r!   r"   r­   G  s    z+TestDualProcessImplementation.tearDownClassc              	   C   s®   t  | j¡ ¡ }tjdttjdƒd��~}t  | j¡ ¡ }|  	t
|ƒt
|ƒ¡ tt
|ƒƒD ]<}|  || d¡ |  || d¡ | j|| || dd� qX|js t‚W 5 Q R X d S )Nz(psutil._psplatform.cext.proc_memory_infoÚmsgrõ   r   i   rn   )r   r®   r¨   r¹   r	   r‡   r   r   ÚEPERMr.   r@   rä   rú   rq   r—   r˜   )r   Zmem_1r    Zmem_2rá   r!   r!   r"   rß   K  s    
ÿz.TestDualProcessImplementation.test_memory_infoc              	   C   sX   t  | j¡ ¡ }tjdttjdƒd��(}|  	t  | j¡ ¡ |¡ |j
sJt‚W 5 Q R X d S )Nú"psutil._psplatform.cext.proc_timesr  rõ   )r   r®   r¨   r¸   r	   r‡   r   r   r  r.   r—   r˜   )r   Úctimer    r!   r!   r"   r  W  s    
ÿz.TestDualProcessImplementation.test_create_timec              	   C   sx   t  | j¡ ¡ }tjdttjdƒd��H}t  | j¡ ¡ }|j	sBt
‚| j|j|jdd� | j|j|jdd� W 5 Q R X d S )Nr  r  rõ   g{®Gáz„?rn   )r   r®   r¨   rA   r	   r‡   r   r   r  r—   r˜   rq   ÚuserÚsystem)r   Zcpu_times_1r    Zcpu_times_2r!   r!   r"   Útest_cpu_times^  s"    
ÿ
  ÿ  ÿz,TestDualProcessImplementation.test_cpu_timesc              	   C   sz   t  | j¡ ¡ }tjdttjdƒd��J}t  | j¡ ¡ }t	t
|ƒƒD ]}| j|| || dd� qD|jslt‚W 5 Q R X d S )Nz(psutil._psplatform.cext.proc_io_countersr  rõ   r1   rn   )r   r®   r¨   rç   r	   r‡   r   r   r  rä   r@   rq   r—   r˜   )r   Zio_counters_1r    Zio_counters_2rá   r!   r!   r"   rí   i  s    
ÿ  ÿz.TestDualProcessImplementation.test_io_countersc              	   C   sX   t  | j¡ ¡ }tjdttjdƒd��(}|  	t  | j¡ ¡ |¡ |j
sJt‚W 5 Q R X d S )Nz(psutil._psplatform.cext.proc_num_handlesr  rõ   )r   r®   r¨   rÅ   r	   r‡   r   r   r  r.   r—   r˜   )r   rÅ   r    r!   r!   r"   rô   s  s    
ÿÿz.TestDualProcessImplementation.test_num_handlesc                 C   sŠ   ddl m} t ¡ D ]p}z tj|dd�}tj|dd�}W n> tk
rv } z ||ƒ}t|tjtj	fƒsf‚ W 5 d }~X Y qX |  
||¡ qd S )Nr   )Úconvert_oserrorT)Zuse_pebF)r   r  r   rZ   rv   Zproc_cmdliner   Ú
isinstancer   r   r.   )r   r  r¨   ÚaÚbr   r!   r!   r"   rØ   {  s    ÿz*TestDualProcessImplementation.test_cmdlineN)r&   r'   r(   r  r   r«   r­   rß   r  r  rí   rô   rØ   r!   r!   r!   r"   r  7  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 ]H}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)r   ÚstdoutÚstderr)	ÚglobÚ
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicaterÐ   r¶   r   )ÚcodeÚfilenamer=   Úoutputr	  r!   r!   r"   Úfind_other_interpreter’  s    þz,RemoteProcessTestCase.find_other_interpreterr  zimport sys; sys.stdin.read()c                    s    t ƒ  ¡  |  ¡ }|d kr$t d¡‚tr8t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   ÚtearDownr2  r&  r3  rB   r4  r!   r"   r6  ½  s    

zRemoteProcessTestCase.tearDownc                 C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S ©Nr}   rp   )r   r®   r2  r¨   r.   r@   r×   r1  r±   r!   r!   r"   Útest_cmdline_32Â  s    z%RemoteProcessTestCase.test_cmdline_32c                 C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S r7  )r   r®   r3  r¨   r.   r@   r×   r1  r±   r!   r!   r"   Útest_cmdline_64Ç  s    z%RemoteProcessTestCase.test_cmdline_64c                 C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S r¦   )r   r®   r2  r¨   r.   rù   r,   Úgetcwdr±   r!   r!   r"   Útest_cwd_32Ì  s    z!RemoteProcessTestCase.test_cwd_32c                 C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S r¦   )r   r®   r3  r¨   r.   rù   r,   r:  r±   r!   r!   r"   Útest_cwd_64Ð  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t  | jj¡}| ¡ }|  d|¡ |  |d tt 	¡ ƒ¡ d S )Nr+  )
r   r®   r2  r¨   r-   ÚassertInZassertEqualsr¶   r,   rÄ   )r   r²   Úer!   r!   r"   Útest_environ_32Ô  s    z%RemoteProcessTestCase.test_environ_32c                 C   s6   t  | jj¡}z| ¡  W n t jk
r0   Y nX d S r¦   )r   r®   r3  r¨   r-   r   r±   r!   r!   r"   Útest_environ_64Ú  s
    z%RemoteProcessTestCase.test_environ_64)r&   r'   r(   r  Ústaticmethodr*  r1  r.  r6  r8  r9  r;  r<  r?  r@  Ú__classcell__r!   r!   r4  r"   r  Š  s   
r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestServicesc                 C   sh  t dddddddgƒ}t dd	d
gƒ}t dddddddgƒ}t ¡ D �]}| ¡ }|  |d t¡ |  |d  ¡ d¡ |  |d t¡ |  |d t¡ |  |d |¡ |d d k	r¾t 	|d ¡ |  |d t¡ |  |d t¡ |  |d t¡ |  |d |¡ |  |d |¡ |  |d t¡ | 
¡ }|d k	�rHt 	|¡}|  | ¡ ¡ t | ¡ ¡}|  ||¡ qBd S )NÚrunningZpausedÚstartÚpauseÚcontinueÚstopÚstoppedZ	automaticZmanualÚdisabledZstart_pendingZpause_pendingZcontinue_pendingZstop_pendingrµ   r_   Údisplay_namer·   Ústatusr¨   ZbinpathZ
start_typeÚdescription)rY   r   Úwin_service_iterZas_dictZassertIsInstancer¶   ZassertNotEqualrÕ   r=  r®   r¨   ry   Z
is_runningÚwin_service_getrµ   r.   )r   Zvalid_statusesZvalid_start_typesZservÚdatar¨   r²   Úsr!   r!   r"   Útest_win_service_iterê  sX    ù	ýù	

z"TestServices.test_win_service_iterc              	   C   s¨  t jjj}t jjj}tt  ¡ ƒ ¡ }|  t j	¡�}t  
|d ¡ W 5 Q R X |  |jj|d ¡ t  
|¡}trzddd|f}n|df}t|Ž }tjd|d�� |  t j	|j¡ W 5 Q R X tjd|d�� |  t j	|j¡ W 5 Q R X trðddd|f}n|df}t|Ž }tjd|d�� |  t j|j¡ W 5 Q R X tjd|d�� |  t j|j¡ W 5 Q R X |  | ¡ 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ý   rv   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextrN  rµ   r¯   r   rO  r.   Ú	exceptionr   r÷   r	   r‡   rL  r·   r   r=  r¶   rK  rk   )r   rS  rT  rµ   ÚcmZservicer   rû   r!   r!   r"   Útest_win_service_get  sH    ÿ

ÿÿÿÿz!TestServices.test_win_service_getN)r&   r'   r(   rR  rX  r!   r!   r!   r"   rC  ç  s   0rC  Ú__main__)Úrun_from_name)7r  r~   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Úsimplefilterr2   rÇ   rÚ   r8   rý   rv   r$   rG   r%   r)   rH   r‰   r¥   r  r  r  rC  r&   Zpsutil.tests.runnerrZ  Ú__file__r!   r!   r!   r"   Ú<module>   sr   


	&< @FR\^
