a
    áªlc_‰  ã                   @   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)Ú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   úU/var/www/html/django/DPS/env/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)Z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   rP   rT   rX   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 rU   )	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;   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   )rJ   rK   rh   r:   r7   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   rJ   rK   Z#Win32_PerfRawData_PerfOS_PagingFiler7   ZPercentUsageZPercentUsage_BaseÚassertGreaterEqualÚpercentri   Ú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:   rc   r7   ÚSizeZ	FreeSpacerj   Úabsr`   Ú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   rf   r"   )r;   r   r   r@   ZGetDiskFreeSpaceExr€   rƒ   ri   rj   r   rc   r:   rm   )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   ÿTrz   )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)
rw   ÚcextZnet_if_statsrJ   rK   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?   )rJ   rK   ZWin32_OperatingSystemZLastBootUpTimer/   ÚdatetimeÚstrptimeÚfromtimestampr;   Ú	boot_timer…   Útotal_secondsrs   )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”   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   )rJ   rK   Úqueryr;   rž   ri   rr   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   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 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 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	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.wintypesZwindllZkernel32rÕ   r¶   rè   rÙ   ZwintypesZDWORDZGetProcessHandleCountZ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¾   Úcwdrq   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;   rx   Ú_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 ©Nru   r   )	rJ   rK   rv   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   rv   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 )Nru   r   r[   rä   r!   )rJ   rK   rv   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 )Nru   r   z%s\%s)	rJ   rK   rv   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   rv   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 )Nru   r   rû   zwmi=%s, psutil=%s)rJ   rK   rv   r¶   r;   r¼   rÈ   rÌ   r7   ZPageFileUsager`   )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 )Nru   r   r   r   )rJ   rK   rv   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   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 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   rf   )r;   r¼   r¶   rÈ   r   r›   ÚOSErrorÚerrnoÚEPERMr:   rQ   ró   rq   ri   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„?rf   )r;   r¼   r¶   rR   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   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?   rf   )r;   r¼   r¶   rö   r   r›   r  r  r  ró   rQ   ri   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;   rx   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   ÚsetUpr3  r   r   r	   ÚsysÚ
executableZpython64Zpython32r8   r9   ÚcopyrÅ   rÓ   r   Ú	test_argsr+  r-  Úproc32Úproc64)r=   Zother_pythonr5  ©Ú	__class__r   r   r7  Þ  s.    
ÿ
ýýzRemoteProcessTestCase.setUpc                    s"   t ƒ  ¡  | j ¡  | j ¡  d S rE   )r   ÚtearDownr<  r/  r=  rS   r>  r   r   r@  ÷  s    

zRemoteProcessTestCase.tearDownc                 C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S ©Né   r"   )r;   r¼   r<  r¶   r:   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 rA  )r;   r¼   r=  r¶   r:   rQ   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¼   r=  r¶   r:   r  r8   rE  rÀ   r   r   r   Útest_cwd_64
  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t  | jj¡}| ¡ }|  d|¡ |  |d tt 	¡ ƒ¡ d S )Nr4  )
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¼   r=  r¶   r9   r¾   rÀ   r   r   r   Útest_environ_64  s
    z%RemoteProcessTestCase.test_environ_64)r   r   r   r  Ústaticmethodr3  r;  r7  r@  rC  rD  rF  rG  rJ  rK  Ú__classcell__r   r   r>  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)rO  rP  Zstart_pendingZpause_pendingZcontinue_pendingZstop_pendingrU  rÄ   r!   Údisplay_namerÆ   Ústatusr¶   ZbinpathZ
start_typeÚdescription)rw   r;   Úwin_service_iterÚas_dictZassertIsInstancerÅ   ZassertNotEqualr+   rH  r¼   r¶   r   Ú
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ÚnextrZ  rÄ   r½   rß   r]  r:   Ú	exceptionr
   r   r   r›   rX  rÆ   r¾   rH  rÅ   rW  r†   )r=   r`  ra  rÄ   ÚcmZservicer'  r  r   r   r   Útest_win_service_getT  sH    ÿ
,
ÿ.ÿ0ÿ0ÿ0z!TestServices.test_win_service_getN)r   r   r   r_  re  r   r   r   r   rN  !  s   0rN  Ú__main__)Úrun_from_name)=r  r‘   r  r*  r8   rÉ   rå   rÐ   r+  r8  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‹   rY   r   r    r7   r4   r5   rZ   r   r´   r	  r  r%  rN  r   Zpsutil.tests.runnerrg  Ú__file__r   r   r   r   Ú<module>   s~   

(
' < IFQ\^
