U
    (Ûc_‰  ã                	   @   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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 ,e d¡e ,ed¡e ,eoÌe d¡G dd„ deƒƒƒƒZ-dd„ Z.e/fdd„Z0G d d!„ d!e-ƒZ1G d"d#„ d#e-ƒZ2G d$d%„ d%e-ƒZ3G d&d'„ d'e-ƒZ4G d(d)„ d)e-ƒZ5e ,e d¡G d*d+„ d+eƒƒZ6e ,e d¡G d,d-„ d-eƒƒZ7e ,e d¡G d.d/„ d/eƒƒZ8e9d0krÂdd1l:m;Z; e;e<ƒ dS )2zWindows specific tests.é    N)ÚWINDOWS)ÚFileNotFoundError)Úwhich)Úsuper)ÚAPPVEYOR)ÚGITHUB_ACTIONS)ÚHAS_BATTERY)ÚIS_64BIT)ÚPY3)ÚPYPY)ÚTOLERANCE_DISK_USAGE)ÚTOLERANCE_SYS_MEM)ÚPsutilTestCase)Úmock)Úretry_on_failure)Úsh)Úspawn_testproc)Ú	terminateÚ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   ú=/tmp/pip-unpacked-wheel-l83rk7k5/psutil/tests/test_windows.pyr   ;   s   r   c                 C   s&   t dƒst d¡‚dd|   }t|ƒS )z™Currently not used, but avalable 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   ÚunittestÚSkipTestr   )ÚcmdÚcmdliner   r   r   Ú
powershellC   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 avalable 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   ÚwmicQ   s    
r3   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 )Nr5   )ÚintÚosÚenvironÚassertEqualÚpsutilÚ	cpu_count)ÚselfZnum_cpusr   r   r   Ú&test_cpu_count_vs_NUMBER_OF_PROCESSORSi   s    z2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORSc                 C   s$   t  ¡ d }t ¡ }|  ||¡ d S )Né   )Úwin32apiZGetSystemInfor:   r;   r9   ©r<   Ú	sys_valueÚpsutil_valuer   r   r   Útest_cpu_count_vs_GetSystemInfoq   s    z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfoc                 C   s2   t  ¡ }tdd„ | ¡ D ƒƒ}|  t ¡ |¡ d S )Nc                 s   s   | ]}|j V  qd S ©N)ZNumberOfLogicalProcessors©r%   Úprocr   r   r   Ú	<genexpr>z   s   ÿz<TestCpuAPIs.test_cpu_count_logical_vs_wmi.<locals>.<genexpr>©ÚwmiÚWMIÚsumÚWin32_Processorr9   r:   r;   )r<   ÚwZprocsr   r   r   Útest_cpu_count_logical_vs_wmix   s
    ÿz)TestCpuAPIs.test_cpu_count_logical_vs_wmic                 C   s6   t  ¡ }tdd„ | ¡ D ƒƒ}|  tjdd|¡ d S )Nc                 s   s   | ]}|j V  qd S rD   )ZNumberOfCoresrE   r   r   r   rG   €   s     z:TestCpuAPIs.test_cpu_count_cores_vs_wmi.<locals>.<genexpr>F)ÚlogicalrH   )r<   rM   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ƒ¡ d S )NT)Zpercpu)r9   r:   r;   ÚlenÚ	cpu_times©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¡ |  |jt ¡ j	¡ d S ©Nr   )
rI   rJ   rL   r9   ZCurrentClockSpeedr:   Zcpu_freqÚcurrentZMaxClockSpeedÚmax)r<   rM   rF   r   r   r   Útest_cpu_freq‡   s    zTestCpuAPIs.test_cpu_freqN)r   r   r   r   ÚskipIfr7   r8   r=   rC   rN   rP   rT   rX   r   r   r   r   r4   g   s   ÿ
r4   c                   @   sŠ   e Zd Zdd„ Zdd„ Zd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<   r1   ZnicsZnicr   r   r   Útest_nic_names   s    ÿzTestSystemAPIs.test_nic_namesc                 C   s,   t  ¡  ¡ d }|  t|jƒt ¡ j¡ d S rU   )	rI   rJ   ZWin32_ComputerSystemr9   r6   ZTotalPhysicalMemoryr:   Úvirtual_memoryÚtotal©r<   rM   r   r   r   Útest_total_phymemš   s    ÿz TestSystemAPIs.test_total_phymemc                 C   s0   t  ¡  ¡ d }| jt|jƒt ¡ jt	d d S )Nr   ©Údelta)
rI   rJ   ÚWin32_PerfRawData_PerfOS_MemoryÚassertAlmostEqualr6   ZAvailableBytesr:   rb   Úfreer   rd   r   r   r   Útest_free_phymemŸ   s     þzTestSystemAPIs.test_free_phymemc                 C   sh   t  ¡  ¡ d }|  t|jƒt ¡ j t 	¡ j¡ t 	¡ jdkrd|  dt 	¡ j
¡ |  dt 	¡ j¡ d S rU   )rI   rJ   rh   r9   r6   ZCommitLimitr:   rb   rc   Úswap_memoryrj   Úusedrd   r   r   r   Útest_total_swapmem¥   s    ÿz!TestSystemAPIs.test_total_swapmemc                 C   sx   t  ¡ jdkrtt ¡ jddd }t|jƒd t|jƒ }|  	t  ¡ j
d¡ | jt  ¡ j
|dd |  t  ¡ j
d¡ d S )Nr   Z_Total)ÚNameéd   r>   rf   )r:   rl   rc   rI   rJ   Z#Win32_PerfRawData_PerfOS_PagingFiler6   ZPercentUsageZPercentUsage_BaseÚassertGreaterEqualÚpercentri   ÚassertLessEqual)r<   rM   ZpercentSwapr   r   r   Útest_percent_swapmem­   s    ÿÿÿz#TestSystemAPIs.test_percent_swapmemz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	ProcessIdr$   r   r   r   r)   Ì   s     z,TestSystemAPIs.test_pids.<locals>.<listcomp>)rI   rJ   ÚWin32_ProcessÚsetr:   Úpidsr9   )r<   rM   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ú\r!   ÚcdromúA:i    zpsutil=%s, wmi=%szcan't find partition %s)r:   Údisk_partitionsrI   rJ   ZWin32_LogicalDiskZdevicer^   ZDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   r9   rc   r6   ÚSizeZ	FreeSpacerj   Úabsr`   Ú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   rf   r"   )r:   r   r   r?   ZGetDiskFreeSpaceExr€   rƒ   ri   rj   r   rc   r9   rm   )r<   ZdiskrA   rB   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 )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    ÿTrz   )r?   ZGetLogicalDriveStringsr.   r:   r   r9   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)
rw   ÚcextZnet_if_statsrI   rJ   ZWin32_NetworkAdapterÚaddro   Z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%Sr>   )rI   rJ   ZWin32_OperatingSystemZLastBootUpTimer.   ÚdatetimeÚstrptimeÚfromtimestampr:   Ú	boot_timer…   Útotal_secondsrs   )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_timer>   ©Zreturn_valueé   é   iM  )r   Úpatchr9   r:   r”   rS   r   r   r   Útest_boot_time_fluctuation  s    z)TestSystemAPIs.test_boot_time_fluctuationN)r   r   r   ra   re   rk   rn   rt   r   rY   r   r   ry   rˆ   r‰   rŠ   rŽ   r–   r›   r   r   r   r   rZ   Ž   s    




	rZ   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)r?   ZGetPwrCapabilitiesZassertIsNotNoner:   Úsensors_batteryÚassertIsNonerS   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"   rf   )rI   rJ   Úqueryr:   r   ri   rr   ZEstimatedChargeRemaining©r<   rM   Zbattery_wmiZbattery_psutilr   r   r   Útest_percent0  s     þzTestSensorsBattery.test_percentc                 C   s6   t  ¡ }| d¡d }t ¡ }|  |j|jdk¡ d S )Nr    r   é   )rI   rJ   r¡   r:   r   r9   Zpower_pluggedZBatteryStatusr¢   r   r   r   Útest_power_plugged9  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_batteryC  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¦   )r"   r   r   r   r—   ©	r   rš   r9   r:   r   ÚsecsleftZPOWER_TIME_UNLIMITEDr¨   r©   rª   r   r   r   Útest_emulate_power_connectedI  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_chargingP  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š   r9   r:   r   r®   ZPOWER_TIME_UNKNOWNr¨   r©   rª   r   r   r   Útest_emulate_secs_left_unknownW  s    ÿÿz1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   rŸ   r   rY   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	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 rD   ©r   Úpid©Úclsr   r   r   Ú
setUpClassf  s    zTestProcess.setUpClassc                 C   s   t | jƒ d S rD   ©r   r¶   r·   r   r   r   ÚtearDownClassj  s    zTestProcess.tearDownClassc                 C   s   t  d¡}|  t j|j¡ d S rU   )r:   ÚProcessÚassertRaisesÚAccessDeniedÚkill©r<   Úpr   r   r   Útest_issue_24n  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¤   r"   )Zvistazwin-7Zwin7r   )r:   r¼   r9   ÚnameÚstrÚusernamer   Úcreate_timeÚmemory_infor¾   ÚplatformÚuname)r<   rÁ   ÚrssÚvmsr   r   r   Útest_special_pidr  s    
zTestProcess.test_special_pidc                 C   s"   t  | j¡}|  t|jtj¡ d S rD   )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 ¡ t |¡ |  
| ¡ |¡ d S )Nr"   )r:   r¼   r7   ÚgetpidÚnum_handlesr?   ÚOpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr9   ÚCloseHandle)r<   rÁ   ÚbeforeÚhandleÚafterr   r   r   Útest_num_handles_increment‡  s     ÿ
z&TestProcess.test_num_handles_incrementc                 C   sd   t  |  ¡ j¡}| tj¡ | tj¡ | ¡  | 	¡  |  
t j|jtj¡ |  
t j|jtj¡ d S rD   )r:   r¼   r   r¶   rÏ   rÐ   ZCTRL_C_EVENTZCTRL_BREAK_EVENTr¿   Úwaitr½   ÚNoSuchProcessrÀ   r   r   r   Útest_ctrl_signals‘  s     ÿ ÿzTestProcess.test_ctrl_signalsc                 C   s8   t  tj¡}| d¡r t d¡‚|  t 	¡  
¡ |¡ d S )Nú$zrunning as service account)r?   ZGetUserNameExrÖ   ZNameSamCompatibleÚendswithr   r   r9   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¡}|  
||¡ d S )Nz[ ]+r[   r   ú"r!   r¤   )ÚreÚsubr?   ZGetCommandLiner*   r+   r:   r¼   r   r^   r9   r@   r   r   r   Útest_cmdline¥  s
     zTestProcess.test_cmdlinec                 C   sJ   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }|  ||¡ d S rD   )r?   rÕ   rÖ   r×   rØ   r7   rÓ   Ú
addCleanuprÙ   Úwin32processZGetPriorityClassr:   r¼   Únicer9   ©r<   rÛ   rA   rB   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)r?   rÕ   rÖ   r×   rØ   r¶   rè   rÙ   ré   ZGetProcessMemoryInfor:   r¼   rÈ   r9   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 rD   )r?   rÕ   rÖ   r×   rØ   r¶   rè   rÙ   r:   r¼   r   rÞ   ré   ZGetExitCodeProcessr9   )r<   rÛ   rÁ   rB   rA   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   )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   )r?   rÕ   rÖ   r×   rØ   r¶   rè   rÙ   ré   ZGetProcessAffinityMaskr:   r¼   Zcpu_affinityr9   )r<   rô   rÛ   rA   rB   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Ø   r7   rÓ   rè   rÙ   ré   ZGetProcessIoCountersr:   r¼   Úio_countersr9   Z
read_countZ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Ô   r9   )r<   rü   r×   rÛ   ZhndcntrA   rB   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©Zside_effectz
time.sleepr>   )ÚWindowsErrorÚwinerrorr   rš   r:   r¼   r½   r¾   Úcwdrq   Z
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:   rx   Ú_psplatformr¼   r½   rß   Úexe)r<   r¶   rF   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´   d  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 rD   rµ   r·   r   r   r   r¹   /  s    zTestProcessWMI.setUpClassc                 C   s   t | jƒ d S rD   rº   r·   r   r   r   r»   3  s    zTestProcessWMI.tearDownClassc                 C   s8   t  ¡ j| jdd }t | j¡}|  | ¡ |j¡ d S ©Nru   r   )	rI   rJ   rv   r¶   r:   r¼   r9   rÄ   ZCaption©r<   rM   rÁ   r   r   r   Ú	test_name7  s    zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONSc                 C   s@   t  ¡ j| jdd }t | j¡}|  | ¡  ¡ |j	 ¡ ¡ d S r  )
rI   rJ   rv   r¶   r:   r¼   r9   r	  r_   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 )Nru   r   r[   rä   r!   )rI   rJ   rv   r¶   r:   r¼   r9   r+   r   ZCommandLiner^   r  r   r   r   rç   E  s
    ÿzTestProcessWMI.test_cmdlinec                 C   sP   t  ¡ j| jdd }t | j¡}| ¡ \}}}d||f }|  | ¡ |¡ d S )Nru   r   z%s\%s)	rI   rJ   rv   r¶   r:   r¼   ZGetOwnerr9   rÆ   )r<   rM   rÁ   ÚdomainÚ_rÆ   r   r   r   rã   K  s
    zTestProcessWMI.test_usernamec                 C   sB   t  ¡ j| jdd }t | j¡}| ¡ j}|  |t	|j
ƒ¡ d S r  )rI   rJ   rv   r¶   r:   r¼   rÈ   rË   r9   r6   rí   )r<   rM   rÁ   rË   r   r   r   Útest_memory_rssR  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 )Nru   r   rû   zwmi=%s, psutil=%s)rI   rJ   rv   r¶   r:   r¼   rÈ   rÌ   r6   ZPageFileUsager`   )r<   rM   rÁ   rÌ   Z	wmi_usager   r   r   Útest_memory_vmsY  s    

zTestProcessWMI.test_memory_vmsc                 C   s\   t  ¡ j| jdd }t | j¡}t|j d¡d ƒ}t	 
dt	 | ¡ ¡¡}|  ||¡ d S )Nru   r   r   r   )rI   rJ   rv   r¶   r:   r¼   rÅ   ZCreationDater.   ÚtimeÚstrftimeÚ	localtimerÇ   r9   )r<   rM   rÁ   Zwmic_createZpsutil_creater   r   r   Útest_create_timef  s    ÿzTestProcessWMI.test_create_timeN)r   r   r   Ú__doc__r  r¹   r»   r  r   rY   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 rD   rµ   r·   r   r   r   r¹   ~  s    z(TestDualProcessImplementation.setUpClassc                 C   s   t | jƒ d S rD   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
|ƒ¡ 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   rf   )r:   r¼   r¶   rÈ   r   rš   ÚOSErrorÚerrnoÚEPERMr9   rQ   ró   rq   ri   r¨   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¡ ¡ |¡ |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  r9   r¨   r©   )r<   Úctimer  r   r   r   r  ’  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„?rf   )r:   r¼   r¶   rR   r   rš   r  r  r  r¨   r©   ri   Ú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  r>   rf   )r:   r¼   r¶   rö   r   rš   r  r  r  ró   rQ   ri   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¡ ¡ |¡ |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  r9   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 |  	||¡ qd S )NT)Zuse_pebF)
r:   rx   r‹   Zproc_cmdliner  r   Ú
isinstancer¾   rß   r9   )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  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ÚfilenamerF   Ú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   ÚsetUpr6  r   r   r	   ÚsysÚ
executableZpython64Zpython32r7   r8   ÚcopyrÅ   rÓ   r   Ú	test_argsr.  r0  Úproc32Úproc64)r<   Zother_pythonr8  ©Ú	__class__r   r   r:  Þ  s.    
ÿ
ýýzRemoteProcessTestCase.setUpc                    s"   t ƒ  ¡  | j ¡  | j ¡  d S rD   )r   ÚtearDownr?  r2  r@  rS   rA  r   r   rC  ÷  s    

zRemoteProcessTestCase.tearDownc                 C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S ©Né   r"   )r:   r¼   r?  r¶   r9   rQ   r   r>  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 rD  )r:   r¼   r@  r¶   r9   rQ   r   r>  rÀ   r   r   r   Útest_cmdline_64  s    z%RemoteProcessTestCase.test_cmdline_64c                 C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S rD   )r:   r¼   r?  r¶   r9   r  r7   ÚgetcwdrÀ   r   r   r   Útest_cwd_32  s    z!RemoteProcessTestCase.test_cwd_32c                 C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S rD   )r:   r¼   r@  r¶   r9   r  r7   rH  rÀ   r   r   r   Útest_cwd_64
  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t  | jj¡}| ¡ }|  d|¡ |  |d tt 	¡ ƒ¡ d S )Nr7  )
r:   r¼   r?  r¶   r8   ÚassertInr9   rÅ   r7   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 rD   )r:   r¼   r@  r¶   r8   r¾   rÀ   r   r   r   Útest_environ_64  s
    z%RemoteProcessTestCase.test_environ_64)r   r   r   r  Ústaticmethodr6  r>  r:  rC  rF  rG  rI  rJ  rM  rN  Ú__classcell__r   r   rA  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 )NZ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)rw   r:   Úwin_service_iterZas_dictZassertIsInstancerÅ   ZassertNotEqualr*   rK  r¼   r¶   r   Z
is_runningÚwin_service_getrÄ   r9   )r<   Zvalid_statusesZvalid_start_typesZservr2   r¶   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  r‹   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextr[  rÄ   r½   rß   r\  r9   Ú	exceptionr
   r  r   rš   rY  rÆ   r¾   rK  rÅ   rX  r†   )r<   r_  r`  rÄ   ÚcmZservicer*  r  r   r   r   Útest_win_service_getT  sH    ÿ

ÿÿÿÿz!TestServices.test_win_service_getN)r   r   r   r^  rd  r   r   r   r   rQ  !  s   0rQ  Ú__main__)Úrun_from_name)=r  r‘   r  r-  r7   rÉ   rå   rÐ   r.  r;  r  r   Úwarningsr:   r   Zpsutil._compatr   r   r   Zpsutil.testsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Úcatch_warningsÚsimplefilterr?   rÖ   ré   rI   Zpsutil._pswindowsr   r  r‹   rY   r   r    r6   r3   r4   rZ   rœ   r´   r  r  r(  rQ  r   Zpsutil.tests.runnerrf  Ú__file__r   r   r   r   Ú<module>   s~   


' < IFQ\^
