a
    þd_‰  ã                   @   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 "¡ : e #d¡ ddl$Z$ddl%Z%ddl&Z&ddl'Z'W d  ƒ n1 sš0    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-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)Úsuper)Úwhich)Ú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   úb/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/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urbd|v 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>[   ó    zwmic.<locals>.<listcomp>)r   ÚstripÚjoinÚ
splitlinesÚtupleÚsplit)ÚpathÚwhatr(   ÚoutÚdatar   r'   r   ÚwmicQ   s    
r4   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 )Nr6   )Ú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<   r:   ©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_Processorr:   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 rE   )ZNumberOfCoresrF   r   r   r   rH   €   r*   z:TestCpuAPIs.test_cpu_count_cores_vs_wmi.<locals>.<genexpr>F)ÚlogicalrI   )r=   rN   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)r:   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   )
rJ   rK   rM   r:   ZCurrentClockSpeedr;   Zcpu_freqÚcurrentZMaxClockSpeedÚmax)r=   rN   rG   r   r   r   Útest_cpu_freq‡   s    zTestCpuAPIs.test_cpu_freqN)r   r   r   r   ÚskipIfr8   r9   r>   rD   rO   rQ   rU   rY   r   r   r   r   r5   g   s   ÿ
r5   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¡ ¡ v r6q||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=   r2   ZnicsZnicr   r   r   Útest_nic_names   s    ÿzTestSystemAPIs.test_nic_namesc                 C   s,   t  ¡  ¡ d }|  t|jƒt ¡ j¡ d S rV   )	rJ   rK   ZWin32_ComputerSystemr:   r7   ZTotalPhysicalMemoryr;   Úvirtual_memoryÚtotal©r=   rN   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)
rJ   rK   ÚWin32_PerfRawData_PerfOS_MemoryÚassertAlmostEqualr7   ZAvailableBytesr;   rc   Úfreer   re   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 rV   )rJ   rK   ri   r:   r7   ZCommitLimitr;   rc   rd   Úswap_memoryrk   Úusedre   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?   rg   )r;   rm   rd   rJ   rK   Z#Win32_PerfRawData_PerfOS_PagingFiler7   ZPercentUsageZPercentUsage_BaseÚassertGreaterEqualÚpercentrj   ÚassertLessEqual)r=   rN   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)   Ì   r*   z,TestSystemAPIs.test_pids.<locals>.<listcomp>)rJ   rK   ÚWin32_ProcessÚsetr;   Úpidsr:   )r=   rN   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	v rT q|j 
d¡rd qzt  |j¡}W n tyŒ   Y  qY n0 |  |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_partitionsrJ   rK   ZWin32_LogicalDiskZdevicer_   ZDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   r:   rd   r7   ÚSizeZ	FreeSpacerk   Úabsra   Úrepr)r=   Zps_partsZ	wmi_partsZps_partZwmi_partÚusageZwmi_freer   r   r   Ú
test_disksÐ   s0    

ÿzTestSystemAPIs.test_disksc                 C   sx   t  ¡ D ]j}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 )Nr~   r   rg   r"   )r;   r€   r‚   r@   ZGetDiskFreeSpaceExr   r„   rj   rk   r   rd   r:   rn   )r=   ZdiskrB   rC   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   ÿTr{   )r@   ZGetLogicalDriveStringsr/   r;   r€   r:   rA   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)
rx   ÚcextZnet_if_statsrJ   rK   ZWin32_NetworkAdapterÚaddrp   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?   )rJ   rK   ZWin32_OperatingSystemZLastBootUpTimer/   ÚdatetimeÚstrptimeÚfromtimestampr;   Ú	boot_timer†   Útotal_secondsrt   )r=   Zwmi_osZwmi_btime_strZwmi_btime_dtZ	psutil_dtÚdiffr   r   r   Útest_boot_time  s    ÿzTestSystemAPIs.test_boot_timec                 C   sü   t jddd  |  t ¡ d¡ W d   ƒ n1 s40    Y  t jddd  |  t ¡ d¡ W d   ƒ n1 sr0    Y  t jddd  |  t ¡ d¡ W d   ƒ n1 s°0    Y  t jddd  |  t ¡ d¡ W d   ƒ n1 sî0    Y  d S )Nz psutil._pswindows.cext.boot_timer?   ©Zreturn_valueé   é   iM  )r   Úpatchr:   r;   r•   rT   r   r   r   Útest_boot_time_fluctuation  s    ...z)TestSystemAPIs.test_boot_time_fluctuationN)r   r   r   rb   rf   rl   ro   ru   r   rZ   r   r   rz   r‰   rŠ   r‹   r   r˜   r   r   r   r   r   r[   Ž   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   s.   t  ¡ d r|  t ¡ ¡ n|  t ¡ ¡ d S )NZSystemBatteriesPresent)r@   ZGetPwrCapabilitiesZassertIsNotNoner;   Úsensors_batteryÚassertIsNonerT   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"   rg   )rJ   rK   Úqueryr;   rŸ   rj   rs   ZEstimatedChargeRemaining©r=   rN   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   é   )rJ   rK   r£   r;   rŸ   r:   Zpower_pluggedZBatteryStatusr¤   r   r   r   Útest_power_plugged9  s    ÿz%TestSensorsBattery.test_power_pluggedc                 C   sJ   t jddd(}|  t ¡ ¡ |js(J ‚W d   ƒ n1 s<0    Y  d S )Nú&psutil._pswindows.cext.sensors_battery)r   é€   r   r   r™   )r   rœ   r    r;   rŸ   Úcalled©r=   Úmr   r   r   Útest_emulate_no_batteryC  s    ÿz*TestSensorsBattery.test_emulate_no_batteryc                 C   sP   t jddd.}|  t ¡ jtj¡ |js.J ‚W d   ƒ n1 sB0    Y  d S )Nr¨   )r"   r   r   r   r™   ©r   rœ   r:   r;   rŸ   ÚsecsleftZPOWER_TIME_UNLIMITEDrª   r«   r   r   r   Útest_emulate_power_connectedI  s    ÿÿz/TestSensorsBattery.test_emulate_power_connectedc                 C   sP   t jddd.}|  t ¡ jtj¡ |js.J ‚W d   ƒ n1 sB0    Y  d S )Nr¨   )r   é   r   r   r™   r®   r«   r   r   r   Útest_emulate_power_chargingP  s    ÿÿz.TestSensorsBattery.test_emulate_power_chargingc                 C   sP   t jddd.}|  t ¡ jtj¡ |js.J ‚W d   ƒ n1 sB0    Y  d S )Nr¨   )r   r   r   éÿÿÿÿr™   )r   rœ   r:   r;   rŸ   r¯   ZPOWER_TIME_UNKNOWNrª   r«   r   r   r   Útest_emulate_secs_left_unknownW  s    ÿÿz1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   r¡   r   rZ   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 rE   ©r   Úpid©Úclsr   r   r   Ú
setUpClassf  s    zTestProcess.setUpClassc                 C   s   t | jƒ d S rE   ©r   r·   r¸   r   r   r   ÚtearDownClassj  s    zTestProcess.tearDownClassc                 C   s   t  d¡}|  t j|j¡ d S rV   )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	yz   t
 ¡ d dvrv‚ Y n0 |  |dk¡ d S )Nrš   ÚSystemg        r¦   r"   )Zvistazwin-7Zwin7r   )r;   r½   r:   Ú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 rE   )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½   r8   ÚgetpidÚnum_handlesr@   Ú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   sd   t  |  ¡ j¡}| tj¡ | tj¡ | ¡  | 	¡  |  
t j|jtj¡ |  
t j|jtj¡ d S rE   )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   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¡}|  
||¡ d S )Nz[ ]+r\   r   ú"r!   r¦   )ÚreÚsubr@   ZGetCommandLiner+   r,   r;   r½   r   r_   r:   rA   r   r   r   Útest_cmdline¥  s
     zTestProcess.test_cmdlinec                 C   sJ   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }|  ||¡ d S rE   )r@   rÖ   r×   rØ   rÙ   r8   rÔ   Ú
addCleanuprÚ   Úwin32processZGetPriorityClassr;   r½   Únicer:   ©r=   rÜ   rB   rC   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É   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 rE   )r@   rÖ   r×   rØ   rÙ   r·   ré   rÚ   r;   r½   r   rß   rê   ZGetExitCodeProcessr:   )r=   rÜ   rÂ   rC   rB   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)   î  r*   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Ü   rB   rC   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Ù   r8   rÔ   ré   rÚ   rê   ZGetProcessIoCountersr;   r½   Úio_countersr:   Z
read_countZwrite_countÚ
read_bytesÚ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.wintypesÚwindllÚkernel32rÖ   r·   ré   rÚ   ZwintypesZDWORDZGetProcessHandleCountÚbyrefÚvaluer;   r½   rÕ   r:   )r=   rý   rØ   rÜ   ZhndcntrB   rC   r   r   r   Útest_num_handles  s    ÿ

ÿzTestProcess.test_num_handlesc              	   C   sŽ   t ƒ }d|_tjd|dR t d¡(}t ¡ }|  tj|j¡ W d   ƒ n1 sT0    Y  W d   ƒ n1 sr0    Y  |  	|j
d¡ d S )Ni+  z psutil._psplatform.cext.proc_cwd©Zside_effectz
time.sleepr?   )ÚWindowsErrorÚwinerrorr   rœ   r;   r½   r¾   r¿   Úcwdrr   Z
call_count)r=   Úexcr¬   rÂ   r   r   r   Útest_error_partial_copy  s    Lz#TestProcess.test_error_partial_copyc                 C   s0   t  ¡ d d }t j |¡}|  t j|j¡ d S )Nr³   iŸ† )r;   ry   Ú_psplatformr½   r¾   rà   Úexe)r=   r·   rG   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 rE   r¶   r¸   r   r   r   rº   /  s    zTestProcessWMI.setUpClassc                 C   s   t | jƒ d S rE   r»   r¸   r   r   r   r¼   3  s    zTestProcessWMI.tearDownClassc                 C   s8   t  ¡ j| jdd }t | j¡}|  | ¡ |j¡ d S ©Nrv   r   )	rJ   rK   rw   r·   r;   r½   r:   rÅ   ZCaption©r=   rN   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  )
rJ   rK   rw   r·   r;   r½   r:   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 )Nrv   r   r\   rå   r!   )rJ   rK   rw   r·   r;   r½   r:   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 )Nrv   r   z%s\%s)	rJ   rK   rw   r·   r;   r½   ZGetOwnerr:   rÇ   )r=   rN   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  )rJ   rK   rw   r·   r;   r½   rÉ   rÌ   r:   r7   rî   )r=   rN   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 )Nrv   r   rü   zwmi=%s, psutil=%s)rJ   rK   rw   r·   r;   r½   rÉ   rÍ   r7   ZPageFileUsagera   )r=   rN   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 )Nrv   r   r   r‘   )rJ   rK   rw   r·   r;   r½   rÆ   ZCreationDater/   ÚtimeÚstrftimeÚ	localtimerÈ   r:   )r=   rN   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   rZ   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 rE   r¶   r¸   r   r   r   rº   ~  s    z(TestDualProcessImplementation.setUpClassc                 C   s   t | jƒ d S rE   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 J ‚W d   ƒ n1 s´0    Y  d S )Nz(psutil._psplatform.cext.proc_memory_infoÚmsgr  r   i   rg   )r;   r½   r·   rÉ   r   rœ   ÚOSErrorÚerrnoÚEPERMr:   rR   rô   rr   rj   rª   )r=   Zmem_1ÚfunZmem_2rñ   r   r   r   rï   †  s    
ÿz.TestDualProcessImplementation.test_memory_infoc                 C   sl   t  | j¡ ¡ }tjdttjdƒd2}|  	t  | j¡ ¡ |¡ |j
sJJ ‚W d   ƒ n1 s^0    Y  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R}t  | j¡ ¡ }|j	sBJ ‚| j
|j|jdd | j
|j|jdd W d   ƒ n1 s~0    Y  d S )Nr   r  r  g{®Gáz„?rg   )r;   r½   r·   rS   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T}t  | j¡ ¡ }t	t
|ƒƒD ]}| j|| || dd qD|jslJ ‚W d   ƒ n1 s€0    Y  d S )Nz(psutil._psplatform.cext.proc_io_countersr  r  r?   rg   )r;   r½   r·   r÷   r   rœ   r  r  r  rô   rR   rj   rª   )r=   Zio_counters_1r  Zio_counters_2rñ   r   r   r   rû   ¤  s    
ÿÿz.TestDualProcessImplementation.test_io_countersc                 C   sl   t  | j¡ ¡ }tjdttjdƒd2}|  	t  | j¡ ¡ |¡ |j
sJJ ‚W d   ƒ n1 s^0    Y  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 ]r}z tj|dd}tj|dd}W n@ tyl } z(t|ƒ}t|t jt jfƒsX‚ W Y d }~qd }~0 0 |  	||¡ qd S )NT)Zuse_pebF)
r;   ry   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  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ÚfilenamerG   Ú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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   ÚsetUpr7  r   r   r	   ÚsysÚ
executableZpython64Zpython32r8   r9   ÚcopyrÆ   rÔ   r   Ú	test_argsr/  r1  Úproc32Úproc64)r=   Zother_pythonr9  ©Ú	__class__r   r   r;  Þ  s.    
ÿ
ýýzRemoteProcessTestCase.setUpc                    s"   t ƒ  ¡  | j ¡  | j ¡  d S rE   )r   ÚtearDownr@  r3  rA  rT   rB  r   r   rD  ÷  s    

zRemoteProcessTestCase.tearDownc                 C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S ©Né   r"   )r;   r½   r@  r·   r:   rR   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 rE  )r;   r½   rA  r·   r:   rR   r   r?  rÁ   r   r   r   Útest_cmdline_64  s    z%RemoteProcessTestCase.test_cmdline_64c                 C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S rE   )r;   r½   r@  r·   r:   r  r8   ÚgetcwdrÁ   r   r   r   Útest_cwd_32  s    z!RemoteProcessTestCase.test_cwd_32c                 C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S rE   )r;   r½   rA  r·   r:   r  r8   rI  rÁ   r   r   r   Útest_cwd_64
  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t  | jj¡}| ¡ }|  d|¡ |  |d tt 	¡ ƒ¡ d S )Nr8  )
r;   r½   r@  r·   r9   ÚassertInr:   rÆ   r8   rÔ   )r=   rÂ   Úer   r   r   Útest_environ_32  s    z%RemoteProcessTestCase.test_environ_32c                 C   s4   t  | jj¡}z| ¡  W n t jy.   Y n0 d S rE   )r;   r½   rA  r·   r9   r¿   rÁ   r   r   r   Útest_environ_64  s
    z%RemoteProcessTestCase.test_environ_64)r   r   r   r  Ústaticmethodr7  r?  r;  rD  rG  rH  rJ  rK  rN  rO  Ú__classcell__r   r   rB  r   r)  Ä  s   
r)  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestServicesc                 C   sR  t g d¢ƒ}t g d¢ƒ}t g d¢ƒ}t ¡ D ]}| ¡ }|  |d t¡ |  |d  ¡ d¡ |  |d t¡ |  |d t¡ |  |d |¡ |d	 d ur¨t 	|d	 ¡ |  |d
 t¡ |  |d t¡ |  |d t¡ |  |d |¡ |  |d |¡ |  |d t¡ | 
¡ }|d ur2t 	|¡}|  | ¡ ¡ t | ¡ ¡}|  ||¡ q,d S )N)ÚrunningÚpausedÚstartÚpauseÚcontinueÚstopÚstopped)Z	automaticZmanualÚdisabled)rS  rT  Zstart_pendingZpause_pendingZcontinue_pendingZstop_pendingrY  rÅ   r!   Údisplay_namerÇ   Ústatusr·   ZbinpathZ
start_typeÚdescription)rx   r;   Úwin_service_iterZas_dictZassertIsInstancerÆ   ZassertNotEqualr+   rL  r½   r·   rŽ   Z
is_runningÚwin_service_getrÅ   r:   )r=   Zvalid_statusesZvalid_start_typesZservr3   r·   rÂ   Úsr   r   r   Útest_win_service_iter$  s0    		

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 sT0    Y  |  |jj|d ¡ t  
|¡}trŽddd|f}n|df}t|Ž }tjd|d  |  t j	|j¡ W d   ƒ n1 sÒ0    Y  tjd|d  |  t j	|j¡ W d   ƒ n1 s0    Y  tr0ddd|f}n|df}t|Ž }tjd|d  |  t j|j¡ W d   ƒ n1 sv0    Y  tjd|d  |  t j|j¡ W d   ƒ n1 s¶0    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	  rŒ   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextr^  rÅ   r¾   rà   r_  r:   Ú	exceptionr
   r  r   rœ   r\  rÇ   r¿   rL  rÆ   r[  r‡   )r=   rb  rc  rÅ   ÚcmZservicer+  r  r   r   r   Útest_win_service_getT  sH    ÿ
,
ÿ.ÿ0ÿ0ÿ0z!TestServices.test_win_service_getN)r   r   r   ra  rg  r   r   r   r   rR  !  s   0rR  Ú__main__)Úrun_from_name)=r  r’   r  r.  r8   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ê   rJ   Zpsutil._pswindowsr   r	  rŒ   rZ   r   r    r7   r4   r5   r[   rž   rµ   r  r  r)  rR  r   Zpsutil.tests.runnerri  Ú__file__r   r   r   r   Ú<module>   s~   

(
' < IFQ\^
