U
    ÷;gØ„  ã                	   @   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 ddlm Z  ddlm!Z! er’es’e "¡ 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r¤ddl(m)Z) ej*j+Z+ej,j-e ddej,j-eddej,j-eoÚe ddG dd„ deƒƒƒƒZ.dd„ Z/e0fd d!„Z1G d"d#„ d#e.ƒZ2G d$d%„ d%e.ƒZ3G d&d'„ d'e.ƒZ4G d(d)„ d)e.ƒZ5G d*d+„ d+e.ƒZ6ej,j-e ddG d,d-„ d-eƒƒZ7ej,j-e ddG d.d/„ d/eƒƒZ8ej,j-e ddG d0d1„ d1eƒƒZ9dS )2zWindows specific tests.é    N)ÚWINDOWS)ÚFileNotFoundError)Úsuper)Úwhich)ÚAPPVEYOR)ÚGITHUB_ACTIONS)ÚHAS_BATTERY)ÚIS_64BIT)ÚPY3)ÚPYPY)ÚTOLERANCE_DISK_USAGE)ÚTOLERANCE_SYS_MEM)ÚPsutilTestCase)Úmock)Úpytest)Úretry_on_failure)Úsh)Úspawn_testproc)Ú	terminateÚignore)Úconvert_oserrorzWINDOWS only©Úreasonzpywin32 not available on PYPYzpywin32 broken on GITHUB + PY2c                   @   s   e Zd ZdS )ÚWindowsTestCaseN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú=/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_windows.pyr   ;   s   r   c                 C   s&   t dƒst d¡‚dd|   }t|ƒS )zšCurrently not used, but available just in case. Usage:

    >>> powershell(
        "Get-CIMInstance Win32_PageFileUsage | Select AllocatedBaseSize")
    zpowershell.exezpowershell.exe not availablez?powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive z,-NoProfile -WindowStyle Hidden -Command "%s")r   r   Úskipr   )ÚcmdÚcmdliner   r   r   Ú
powershellE   s    
ÿÿr"   c                    sj   t d| |f ƒ ¡ }d | ¡ dd… ¡ ¡ }ˆ dk	rbd|krXt‡ fdd„| ¡ D ƒƒS ˆ |ƒS n|S dS )z‡Currently not used, but available just in case. Usage:

    >>> wmic("Win32_OperatingSystem", "FreePhysicalMemory")
    2134124534
    zwmic path %s get %sÚ é   Nú,c                    s   g | ]}ˆ |ƒ‘qS r   r   ©Ú.0Úx©Ú	converterr   r   Ú
<listcomp>^   s     zwmic.<locals>.<listcomp>)r   ÚstripÚjoinÚ
splitlinesÚtupleÚsplit)ÚpathÚwhatr*   ÚoutÚdatar   r)   r   ÚwmicT   s    
r5   c                   @   sR   e Zd Zejjdejkd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 availabler   c                 C   s"   t tjd ƒ}|t ¡ kst‚d S )Nr7   )ÚintÚosÚenvironÚpsutilÚ	cpu_countÚAssertionError)ÚselfZnum_cpusr   r   r   Ú&test_cpu_count_vs_NUMBER_OF_PROCESSORSk   s    z2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORSc                 C   s$   t  ¡ d }t ¡ }||ks t‚d S )Né   )Úwin32apiZGetSystemInfor;   r<   r=   ©r>   Ú	sys_valueÚpsutil_valuer   r   r   Útest_cpu_count_vs_GetSystemInfou   s    z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfoc                 C   s2   t  ¡ }tdd„ | ¡ D ƒƒ}t ¡ |ks.t‚d S )Nc                 s   s   | ]}|j V  qd S ©N)ZNumberOfLogicalProcessors©r'   Úprocr   r   r   Ú	<genexpr>~   s    z<TestCpuAPIs.test_cpu_count_logical_vs_wmi.<locals>.<genexpr>©ÚwmiÚWMIÚsumÚWin32_Processorr;   r<   r=   )r>   ÚwZprocsr   r   r   Útest_cpu_count_logical_vs_wmi|   s
    ÿz)TestCpuAPIs.test_cpu_count_logical_vs_wmic                 C   s6   t  ¡ }tdd„ | ¡ D ƒƒ}tjdd|ks2t‚d S )Nc                 s   s   | ]}|j V  qd S rF   )ZNumberOfCoresrG   r   r   r   rI   …   s     z:TestCpuAPIs.test_cpu_count_cores_vs_wmi.<locals>.<genexpr>F)ÚlogicalrJ   )r>   rO   Zcoresr   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ƒkst‚d S )NT)Zpercpu)r;   r<   ÚlenÚ	cpu_timesr=   ©r>   r   r   r   Útest_cpu_count_vs_cpu_timesˆ   s    z'TestCpuAPIs.test_cpu_count_vs_cpu_timesc                 C   s@   t  ¡ }| ¡ d }|jt ¡ jks(t‚|jt ¡ j	ks<t‚d S ©Nr   )
rK   rL   rN   ZCurrentClockSpeedr;   Zcpu_freqÚcurrentr=   ZMaxClockSpeedÚmax)r>   rO   rH   r   r   r   Útest_cpu_freq‹   s    zTestCpuAPIs.test_cpu_freqN)r   r   r   r   ÚmarkÚskipifr9   r:   r?   rE   rP   rR   rV   rZ   r   r   r   r   r6   j   s   þ
r6   c                   @   sŽ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zej	j
ed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>   r3   ZnicsZnicr   r   r   Útest_nic_names“   s    ÿzTestSystemAPIs.test_nic_namesc                 C   s,   t  ¡  ¡ d }t|jƒt ¡ jks(t‚d S rW   )	rK   rL   ZWin32_ComputerSystemr8   ZTotalPhysicalMemoryr;   Úvirtual_memoryÚtotalr=   ©r>   rO   r   r   r   Útest_total_phymemž   s    z TestSystemAPIs.test_total_phymemc                 C   s4   t  ¡  ¡ d }tt|jƒt ¡ j ƒt	k s0t
‚d S rW   )rK   rL   ÚWin32_PerfRawData_PerfOS_MemoryÚabsr8   ZAvailableBytesr;   re   Úfreer   r=   rg   r   r   r   Útest_free_phymem¢   s
    ÿÿzTestSystemAPIs.test_free_phymemc                 C   sh   t  ¡  ¡ d }t|jƒt ¡ j t ¡ jks2t	‚t ¡ jdkrdt ¡ j
dksRt	‚t ¡ jdksdt	‚d S rW   )rK   rL   ri   r8   ZCommitLimitr;   re   rf   Úswap_memoryr=   rk   Úusedrg   r   r   r   Útest_total_swapmem©   s    ÿÿz!TestSystemAPIs.test_total_swapmemc                 C   s|   t  ¡ jdkrxt ¡ jddd }t|jƒd t|jƒ }t  ¡ j	dksLt
‚tt  ¡ j	| ƒdk sft
‚t  ¡ j	dksxt
‚d S )Nr   Z_Total)ÚNameéd   r@   )r;   rm   rf   rK   rL   Z#Win32_PerfRawData_PerfOS_PagingFiler8   ZPercentUsageZPercentUsage_BaseÚpercentr=   rj   )r>   rO   ZpercentSwapr   r   r   Útest_percent_swapmem³   s    z#TestSystemAPIs.test_percent_swapmemztest not relieable on appveyorr   c                 C   s:   t  ¡  ¡ }tdd„ |D ƒƒ}tt ¡ ƒ}||ks6t‚d S )Nc                 S   s   g | ]
}|j ‘qS r   ©Z	ProcessIdr&   r   r   r   r+   Ð   s     z,TestSystemAPIs.test_pids.<locals>.<listcomp>)rK   rL   ÚWin32_ProcessÚsetr;   Úpidsr=   )r>   rO   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ƒks¤t‚t|jƒ}|j|ks¼t‚t|j| ƒdkrâ|  d|j|f ¡‚ qq$|  d	t|ƒ ¡‚qd S )
NT©Úallú\r#   ÚcdromúA:i    zpsutil=%s, wmi=%szcan't find partition %s)r;   Údisk_partitionsrK   rL   ZWin32_LogicalDiskZdevicera   ZDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   rf   r8   ÚSizer=   Z	FreeSpacerk   rj   rc   Úrepr)r>   Zps_partsZ	wmi_partsZps_partZwmi_partÚusageZwmi_freer   r   r   Ú
test_disksÔ   s0    

ÿzTestSystemAPIs.test_disksc                 C   s€   t  ¡ D ]r}d|jkrqt |j¡}t  |j¡}t|d |j ƒt	k sJt
‚t|d |j ƒt	k sdt
‚|j|j|j kst
‚qd S )Nr|   r   r$   )r;   r~   r€   rA   ZGetDiskFreeSpaceExr   r‚   rj   rk   r   r=   rf   rn   )r>   ZdiskrC   rD   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 ƒ}||ks:t‚d S )Nc                 S   s"   g | ]}|r|  d ¡s|d ‘qS )r}   r{   )r   r&   r   r   r   r+     s    
þz7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c                 S   s   g | ]}|j  d ¡s|j ‘qS )r}   )r   r   r&   r   r   r   r+     s   þTry   )rA   ZGetLogicalDriveStringsr0   r;   r~   r=   rB   r   r   r   Útest_disk_partitions   s    þ
þz#TestSystemAPIs.test_disk_partitionsc                 C   s\   t t ¡ ƒ}t ¡  ¡ }t ƒ }|D ]}| |j¡ | |j¡ q"||@ sXt	d||f ƒ‚d S )Nzno common entries in %s, %s)
rv   ÚcextZnet_if_statsrK   rL   ZWin32_NetworkAdapterÚaddrp   ZNetConnectionIDr=   )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ksZt‚d S )Nr   Ú.ú%Y%m%d%H%M%Sr@   )rK   rL   ZWin32_OperatingSystemZLastBootUpTimer0   ÚdatetimeÚstrptimeÚfromtimestampr;   Ú	boot_timerj   Útotal_secondsr=   )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ks t‚W 5 Q R X t jddd t ¡ dksJt‚W 5 Q R X t jddd t ¡ dkstt‚W 5 Q R X t jddd t ¡ dksžt‚W 5 Q R X d S )Nz psutil._pswindows.cext.boot_timer@   ©Zreturn_valueé   é   iM  )r   Úpatchr;   r‘   r=   rU   r   r   r   Útest_boot_time_fluctuation#  s    z)TestSystemAPIs.test_boot_time_fluctuationN)r   r   r   rd   rh   rl   ro   rs   r   r[   r\   r   r   rx   r†   r‡   rˆ   r‹   r“   r˜   r   r   r   r   r]   ’   s    



r]   c                   @   sh   e Zd Zdd„ Zejje dddd„ ƒZejje dddd„ ƒZ	d	d
„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestSensorsBatteryc                 C   s2   t  ¡ d rt ¡ d k	s.t‚nt ¡ d ks.t‚d S )NZSystemBatteriesPresent)rA   ZGetPwrCapabilitiesr;   Úsensors_batteryr=   rU   r   r   r   Útest_has_battery5  s    z#TestSensorsBattery.test_has_batteryz
no batteryr   c                 C   s:   t  ¡ }| d¡d }t ¡ }t|j|j ƒdk s6t‚d S )Núselect * from Win32_Batteryr   r$   )	rK   rL   Úqueryr;   rš   rj   rr   ZEstimatedChargeRemainingr=   ©r>   rO   Zbattery_wmiZbattery_psutilr   r   r   Útest_percent;  s    ÿÿzTestSensorsBattery.test_percentc                 C   s6   t  ¡ }| d¡d }t ¡ }|j|jdkks2t‚d S )Nrœ   r   é   )rK   rL   r   r;   rš   Zpower_pluggedZBatteryStatusr=   rž   r   r   r   Útest_power_pluggedE  s    z%TestSensorsBattery.test_power_pluggedc              	   C   s8   t jddd }t ¡ d ks 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©r>   Úmr   r   r   Útest_emulate_no_batteryN  s    þz*TestSensorsBattery.test_emulate_no_batteryc              	   C   s<   t jddd$}t ¡ jtjks$t‚|js.t‚W 5 Q R X d S )Nr¢   )r$   r   r   r   r”   ©r   r—   r;   rš   ÚsecsleftZPOWER_TIME_UNLIMITEDr=   r¤   r¥   r   r   r   Útest_emulate_power_connectedV  s     ÿÿÿz/TestSensorsBattery.test_emulate_power_connectedc              	   C   s<   t jddd$}t ¡ jtjks$t‚|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ks$t‚|js.t‚W 5 Q R X d S )Nr¢   )r   r   r   éÿÿÿÿr”   )r   r—   r;   rš   r©   ZPOWER_TIME_UNKNOWNr=   r¤   r¥   r   r   r   Útest_emulate_secs_left_unknownj  s    þÿz1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   r›   r   r[   r\   r   rŸ   r¡   r§   rª   r¬   r®   r   r   r   r   r™   4  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	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 rF   ©r   Úpid©Úclsr   r   r   Ú
setUpClass{  s    zTestProcess.setUpClassc                 C   s   t | jƒ d S rF   ©r   r±   r²   r   r   r   ÚtearDownClass  s    zTestProcess.tearDownClassc              	   C   s.   t  d¡}t t j¡ | ¡  W 5 Q R X d S rW   )r;   ÚProcessr   ÚraisesÚAccessDeniedÚkill©r>   Úpr   r   r   Útest_issue_24ƒ  s    
zTestProcess.test_issue_24c                 C   sŒ   t  d¡}| ¡ dkst‚t|ƒ | ¡  | ¡ dks:t‚z| ¡ d d… \}}W n( t jk
rz   t	 
¡ d dkrv‚ Y nX |dksˆt‚d S )Nr•   ÚSystemg        r    r$   )Zvistazwin-7Zwin7r   )r;   r·   Únamer=   ÚstrÚusernameÚcreate_timeÚmemory_infor¹   ÚplatformÚuname)r>   r¼   ÚrssZ_vmsr   r   r   Útest_special_pidˆ  s    
zTestProcess.test_special_pidc              	   C   s2   t  | j¡}t t¡ | tj¡ W 5 Q R X d S rF   )	r;   r·   r±   r   r¸   Ú
ValueErrorÚsend_signalÚsignalÚSIGINTr»   r   r   r   Útest_send_signal™  s    zTestProcess.test_send_signalc                 C   sb   t  t ¡ ¡}| ¡ }t tjtj	t ¡ ¡}| ¡ }||d ksDt
‚t |¡ | ¡ |ks^t
‚d S )Nr$   )r;   r·   r9   ÚgetpidÚnum_handlesrA   ÚOpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr=   ÚCloseHandle)r>   r¼   ÚbeforeÚhandleÚafterr   r   r   Útest_num_handles_incrementž  s      ÿ
z&TestProcess.test_num_handles_incrementc              	   C   s„   t  |  ¡ j¡}| tj¡ | tj¡ | ¡  | 	¡  t
 t j¡ | tj¡ W 5 Q R X t
 t j¡ | tj¡ W 5 Q R X d S rF   )r;   r·   r   r±   rÉ   rÊ   ZCTRL_C_EVENTZCTRL_BREAK_EVENTrº   Úwaitr   r¸   ÚNoSuchProcessr»   r   r   r   Útest_ctrl_signals©  s    zTestProcess.test_ctrl_signalsc                 C   s8   t  tj¡}| d¡r t d¡‚t ¡  	¡ |ks4t
‚d S )Nú$zrunning as service account)rA   ZGetUserNameExrÐ   ZNameSamCompatibleÚendswithr   r   r;   r·   rÁ   r=   )r>   r¿   r   r   r   Útest_username´  s    

zTestProcess.test_usernamec                 C   sf   t  ddt ¡ ¡ ¡ }d t ¡  ¡ ¡}|d d  krD|d krVn n| 	ddd¡}||ksbt
‚d S )Nz[ ]+r^   r   ú"r#   r    )ÚreÚsubrA   ZGetCommandLiner,   r-   r;   r·   r!   ra   r=   rB   r   r   r   Útest_cmdline½  s
     zTestProcess.test_cmdlinec                 C   sJ   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }||ksFt‚d S rF   )rA   rÏ   rÐ   rÑ   rÒ   r9   rÍ   Ú
addCleanuprÓ   Úwin32processZGetPriorityClassr;   r·   Únicer=   ©r>   rÕ   rC   rD   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ksNt‚|d |jks`t‚|d |jksrt‚|d |jks„t‚|d |jks–t‚|d |jks¨t‚|d |jksºt‚|d |jksÌt‚|j|jksÜt‚|j|jksìt‚d S )	NZPeakWorkingSetSizeÚWorkingSetSizeZQuotaPeakPagedPoolUsageZQuotaPagedPoolUsageZQuotaPeakNonPagedPoolUsageZQuotaNonPagedPoolUsageZPagefileUsageZPeakPagefileUsage)rA   rÏ   rÐ   rÑ   rÒ   r±   râ   rÓ   rã   ZGetProcessMemoryInfor;   r·   rÃ   Z	peak_wsetr=   ZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpagefileZpeak_pagefilerÆ   Úvmsrå   r   r   r   Útest_memory_infoà  s2      ÿ
ÿÿÿÿÿzTestProcess.test_memory_infoc                 C   sX   t  tjtj| j¡}|  t j|¡ t 	| j¡}| 
¡  | ¡ }t |¡}||ksTt‚d S rF   )rA   rÏ   rÐ   rÑ   rÒ   r±   râ   rÓ   r;   r·   r   rØ   rã   ZGetExitCodeProcessr=   )r>   rÕ   r¼   rD   rC   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¡ ¡ }||ksXt‚d S )Nc                    s   ‡ fdd„t dƒD ƒS )Nc                    s   g | ]}d |> ˆ @ r|‘qS )r$   r   )r'   Ú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   )rA   rÏ   rÐ   rÑ   rÒ   r±   râ   rÓ   rã   ZGetProcessAffinityMaskr;   r·   Zcpu_affinityr=   )r>   rï   rÕ   rC   rD   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 ksLt‚|j|d ks^t‚|j|d kspt‚|j|d ks‚t‚|j|d ks”t‚|j|d ks¦t‚d S )NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)rA   rÏ   rÐ   rÑ   rÒ   r9   rÍ   râ   rÓ   rã   ZGetProcessIoCountersr;   r·   Úio_countersZ
read_countr=   Z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¡ ¡ }||ks|t‚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hndcntrC   rD   r   r   r   Útest_num_handles"  s"      ÿ
 ÿzTestProcess.test_num_handlesc                 C   sv   t ƒ }d|_tjd|dD t d¡.}t ¡ }t tj¡ | 	¡  W 5 Q R X W 5 Q R X W 5 Q R X |j
dksrt‚d S )Ni+  z psutil._psplatform.cext.proc_cwd©Zside_effectz
time.sleepr@   )ÚWindowsErrorÚwinerrorr   r—   r;   r·   r   r¸   r¹   ÚcwdZ
call_countr=   )r>   Úexcr¦   r¼   r   r   r   Útest_error_partial_copy4  s    &z#TestProcess.test_error_partial_copyc              	   C   s@   t  ¡ d d }t j |¡}t t j¡ | ¡  W 5 Q R X d S )Nr­   iŸ† )r;   rw   Ú_psplatformr·   r   r¸   rÙ   Úexe)r>   r±   rH   r   r   r   Útest_exe?  s    zTestProcess.test_exeN)r   r   r   Úclassmethodr´   r¶   r½   rÇ   rÌ   r×   rÚ   rÝ   rá   ræ   ré   rê   rð   rõ   rü   r  r  r   r   r   r   r¯   z  s&   

		r¯   c                   @   s|   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zej	j
ed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 rF   r°   r²   r   r   r   r´   K  s    zTestProcessWMI.setUpClassc                 C   s   t | jƒ d S rF   rµ   r²   r   r   r   r¶   O  s    zTestProcessWMI.tearDownClassc                 C   s8   t  ¡ j| jdd }t | j¡}| ¡ |jks4t‚d S ©Nrt   r   )	rK   rL   ru   r±   r;   r·   r¿   ZCaptionr=   ©r>   rO   r¼   r   r   r   Ú	test_nameS  s    zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONSr   c                 C   s@   t  ¡ j| jdd }t | j¡}| ¡  ¡ |j ¡ ks<t	‚d S r  )
rK   rL   ru   r±   r;   r·   r  rb   ZExecutablePathr=   r	  r   r   r   r  Y  s    zTestProcessWMI.test_exec                 C   sF   t  ¡ j| jdd }t | j¡}d | ¡ ¡|j 	dd¡ksBt
‚d S )Nrt   r   r^   rÞ   r#   )rK   rL   ru   r±   r;   r·   r-   r!   ZCommandLinera   r=   r	  r   r   r   rá   c  s    zTestProcessWMI.test_cmdlinec                 C   sP   t  ¡ j| jdd }t | j¡}| ¡ \}}}d||f }| ¡ |ksLt‚d S )Nrt   r   z%s\%s)	rK   rL   ru   r±   r;   r·   ZGetOwnerrÁ   r=   )r>   rO   r¼   ÚdomainÚ_rÁ   r   r   r   rÝ   h  s
    zTestProcessWMI.test_usernamec                 C   sB   t  ¡ j| jdd }t | j¡}| ¡ j}|t|j	ƒks>t
‚d S r  )rK   rL   ru   r±   r;   r·   rÃ   rÆ   r8   rç   r=   )r>   rO   r¼   rÆ   r   r   r   Útest_memory_rsso  s    
zTestProcessWMI.test_memory_rssc                 C   s\   t  ¡ j| jdd }t | j¡}| ¡ j}t|j	ƒ}|||d fkrX|  
d||f ¡‚d S )Nrt   r   rö   zwmi=%s, psutil=%s)rK   rL   ru   r±   r;   r·   rÃ   rè   r8   ZPageFileUsagerc   )r>   rO   r¼   rè   Z	wmi_usager   r   r   Útest_memory_vmsv  s    

zTestProcessWMI.test_memory_vmsc                 C   s\   t  ¡ j| jdd }t | j¡}t|j d¡d ƒ}t	 
dt	 | ¡ ¡¡}||ksXt‚d S )Nrt   r   rŒ   r   )rK   rL   ru   r±   r;   r·   rÀ   ZCreationDater0   ÚtimeÚstrftimeÚ	localtimerÂ   r=   )r>   rO   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   r  H  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 )ÚTestDualProcessImplementationaw  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 rF   r°   r²   r   r   r   r´   ›  s    z(TestDualProcessImplementation.setUpClassc                 C   s   t | jƒ d S rF   rµ   r²   r   r   r   r¶   Ÿ  s    z+TestDualProcessImplementation.tearDownClassc              	   C   s²   t  | j¡ ¡ }tjdttjdƒd‚}t  | j¡ ¡ }t	|ƒt	|ƒksLt
‚tt	|ƒƒD ]@}|| dkslt
‚|| dks|t
‚t|| ||  ƒdk sXt
‚qX|js¤t
‚W 5 Q R X d S )Nz(psutil._psplatform.cext.proc_memory_infoÚmsgrý   r   i   )r;   r·   r±   rÃ   r   r—   ÚOSErrorÚerrnoÚEPERMrS   r=   rî   rj   r¤   )r>   Zmem_1ÚfunZmem_2rë   r   r   r   ré   £  s    
þz.TestDualProcessImplementation.test_memory_infoc              	   C   sX   t  | j¡ ¡ }tjdttjdƒd(}t  | j¡ ¡ |ks@t	‚|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>   Úctimer  r   r   r   r  ±  s    
þz.TestDualProcessImplementation.test_create_timec              	   C   s€   t  | j¡ ¡ }tjdttjdƒdP}t  | j¡ ¡ }|j	sBt
‚t|j|j ƒdk sZt
‚t|j|j ƒdk srt
‚W 5 Q R X d S )Nr  r  rý   g{®Gáz„?)r;   r·   r±   rT   r   r—   r  r  r  r¤   r=   rj   ÚuserÚsystem)r>   Zcpu_times_1r  Zcpu_times_2r   r   r   Útest_cpu_timesº  s    
þ
z,TestDualProcessImplementation.test_cpu_timesc              	   C   s~   t  | j¡ ¡ }tjdttjdƒdN}t  | j¡ ¡ }t	t
|ƒƒD ] }t|| ||  ƒdk sDt‚qD|jspt‚W 5 Q R X d S )Nz(psutil._psplatform.cext.proc_io_countersr  rý   r@   )r;   r·   r±   rñ   r   r—   r  r  r  rî   rS   rj   r=   r¤   )r>   Zio_counters_1r  Zio_counters_2rë   r   r   r   rõ   Å  s    
þz.TestDualProcessImplementation.test_io_countersc              	   C   sX   t  | j¡ ¡ }tjdttjdƒd(}t  | j¡ ¡ |ks@t	‚|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ü   Ð  s    
þz.TestDualProcessImplementation.test_num_handlesc                 C   s~   t  ¡ D ]p}z tj|dd}tj|dd}W n> tk
rj } z t|ƒ}t|t jt jfƒsZ‚ W 5 d }~X Y qX ||kst	‚qd S )NT)Zuse_pebF)
r;   rw   r‰   Zproc_cmdliner  r   Ú
isinstancer¹   rÙ   r=   )r>   r±   ÚaÚbÚerrr   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    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)ÚargsÚstdoutÚstderr)	ÚglobÚ
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicaterØ   rÀ   r	   )ÚcodeÚfilenamerH   Ú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   ÚsetUpr1  r   r   r	   ÚsysÚ
executableZpython64Zpython32r9   r:   ÚcopyrÀ   rÍ   r   Ú	test_argsr)  r+  Úproc32Úproc64)r>   Zother_pythonr3  ©Ú	__class__r   r   r5    s.    
ÿ
  ÿ  ÿzRemoteProcessTestCase.setUpc                    s"   t ƒ  ¡  | j ¡  | j ¡  d S rF   )r   ÚtearDownr:  r-  r;  rU   r<  r   r   r>    s    

zRemoteProcessTestCase.tearDownc                 C   s@   t  | jj¡}t| ¡ ƒdks"t‚| ¡ dd … | jks<t‚d S ©Né   r$   )r;   r·   r:  r±   rS   r!   r=   r9  r»   r   r   r   Útest_cmdline_32!  s    z%RemoteProcessTestCase.test_cmdline_32c                 C   s@   t  | jj¡}t| ¡ ƒdks"t‚| ¡ dd … | jks<t‚d S r?  )r;   r·   r;  r±   rS   r!   r=   r9  r»   r   r   r   Útest_cmdline_64&  s    z%RemoteProcessTestCase.test_cmdline_64c                 C   s&   t  | jj¡}| ¡ t ¡ ks"t‚d S rF   )r;   r·   r:  r±   r   r9   Úgetcwdr=   r»   r   r   r   Útest_cwd_32+  s    z!RemoteProcessTestCase.test_cwd_32c                 C   s&   t  | jj¡}| ¡ t ¡ ks"t‚d S rF   )r;   r·   r;  r±   r   r9   rC  r=   r»   r   r   r   Útest_cwd_64/  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t  | jj¡}| ¡ }d|ks"t‚|d tt ¡ ƒks:t‚d S )Nr2  )	r;   r·   r:  r±   r:   r=   rÀ   r9   rÍ   )r>   r¼   Úer   r   r   Útest_environ_323  s    z%RemoteProcessTestCase.test_environ_32c                 C   s6   t  | jj¡}z| ¡  W n t jk
r0   Y nX d S rF   )r;   r·   r;  r±   r:   r¹   r»   r   r   r   Útest_environ_649  s
    z%RemoteProcessTestCase.test_environ_64)r   r   r   r  Ústaticmethodr1  r9  r5  r>  rA  rB  rD  rE  rG  rH  Ú__classcell__r   r   r<  r   r#  è  s   
r#  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestServicesc                 C   sx  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 ].}| ¡ }t|d tƒsbt‚|d  ¡ srt‚t|d tƒs„t‚t|d tƒs–t‚|d |ks¦t‚|d d k	rÀt |d ¡ t|d tƒsÒt‚t|d tƒsät‚t|d tƒsöt‚|d |kst‚|d |kst‚t|d tƒs.t‚| 	¡ }|d k	rXt |¡}| 
¡ sXt‚t | ¡ ¡}||ksBt‚qBd S )NZrunningZpausedÚstartÚpauseÚcontinueÚstopÚstoppedZ	automaticZmanualÚdisabledZstart_pendingZpause_pendingZcontinue_pendingZstop_pendingr¿   Údisplay_namerÁ   Ústatusr±   ZbinpathZ
start_typeÚdescription)rv   r;   Úwin_service_iterZas_dictr  rÀ   r=   r,   r·   r±   Z
is_runningÚwin_service_getr¿   )r>   Zvalid_statusesZvalid_start_typesZservr4   r±   r¼   Úsr   r   r   Útest_win_service_iterH  sP    ù	ù	

z"TestServices.test_win_service_iterc              
   C   sò  t jjj}t jjj}tt  ¡ ƒ ¡ }t 	t j
¡}t  |d ¡ W 5 Q R X |jj|d ks^t‚t  |¡}trzddd|f}n|df}t|Ž }tjd|d& t 	t j
¡ | ¡  W 5 Q R X W 5 Q R X tjd|d& t 	t j
¡ | ¡  W 5 Q R X W 5 Q R X trddd|f}n|df}t|Ž }tjd|d& t 	t j¡ | ¡  W 5 Q R X W 5 Q R X tjd|d& t 	t j¡ | ¡  W 5 Q R X W 5 Q R X | ¡ t|ƒks¬t‚| ¡ t|ƒksÂt‚| ¡ t|ƒksØt‚| ¡ t|ƒksît‚d S )Nz???r   r  z/psutil._psplatform.cext.winservice_query_statusrý   z/psutil._psplatform.cext.winservice_query_config)r;   r  r‰   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextrU  r¿   r   r¸   rÙ   rV  rû   r=   r
   rþ   r   r—   rS  rÁ   r¹   rÀ   rR  r„   )r>   rY  rZ  r¿   ÚcmZservicer%  r  r   r   r   Útest_win_service_gett  sX    ÿ

 ÿ ÿ ÿ ÿz!TestServices.test_win_service_getN)r   r   r   rX  r]  r   r   r   r   rK  F  s   ,rK  ):r  rŽ   r  r(  r9   rÄ   rß   rÊ   r)  r6  r  Úwarningsr;   r   Zpsutil._compatr   r   r   Zpsutil.testsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Úcatch_warningsÚsimplefilterrA   rÐ   rã   rK   Zpsutil._pswindowsr   r  r‰   r[   r\   r   r"   r8   r5   r6   r]   r™   r¯   r  r  r#  rK  r   r   r   r   Ú<module>   s~   


 ÿ( #F OHW]