<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    Œ=Ý_M  ã            	   @   s”  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ erzesze  ¡ 0 e !d¡ ddl"Z"ddl#Z#ddl$Z$ddl%Z%W dQ R X ej&j'Z'dd„ Z(e )e d¡e )ed¡e )eo®e d¡G dd„ deƒƒƒƒZ*G dd„ de*ƒZ+G dd„ de*ƒZ,G d d!„ d!e*ƒZ-G d"d#„ d#e*ƒZ.G d$d%„ d%e*ƒZ/e )e d¡G d&d'„ d'eƒƒZ0e )e d¡G d(d)„ d)eƒƒZ1e )e d¡G d*d+„ d+eƒƒZ2e3d,krdd-l4m5Z5 e5e6ƒ dS ).zWindows specific tests.é    N)ÚWINDOWS)ÚFileNotFoundError)Úsuper)ÚAPPVEYOR)ÚGITHUB_ACTIONS)ÚHAS_BATTERY)ÚIS_64BIT)Úmock)ÚPsutilTestCase)ÚPY3)ÚPYPY)Úretry_on_failure)Úsh)Úspawn_testproc)Ú	terminate)ÚTOLERANCE_DISK_USAGE)ÚunittestÚignorec                s   ‡ fdd„}|S )Nc          
      st   yˆ | f|ž|ŽS  t k
rn } z@ddlm} |j|krDt d d ¡‚|jtjkr\t d d ¡‚‚ W d d }~X Y nX d S )Nr   )ÚACCESS_DENIED_SET)ÚOSErrorÚpsutil._pswindowsr   ÚerrnoÚpsutilÚAccessDeniedZESRCHÚNoSuchProcess)ÚselfÚargsÚkwargsÚerrr   )Úfun© úL/opt/alt/python37/lib64/python3.7/site-packages/psutil/tests/test_windows.pyÚwrapper7   s    
z wrap_exceptions.<locals>.wrapperr    )r   r"   r    )r   r!   Úwrap_exceptions6   s    
r#   zWINDOWS onlyzpywin32 not available on PYPYzpywin32 broken on GITHUB + PY2c               @   s   e Zd ZdS )ÚWindowsTestCaseN)Ú__name__Ú
__module__Ú__qualname__r    r    r    r!   r$   D   s   r$   c               @   sN   e Zd Ze dejkd¡dd„ ƒZdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚTestCpuAPIsÚNUMBER_OF_PROCESSORSz-NUMBER_OF_PROCESSORS env var is not availablec             C   s"   t tjd ƒ}|  |t ¡ ¡ d S )Nr)   )ÚintÚosÚenvironÚassertEqualr   Ú	cpu_count)r   Znum_cpusr    r    r!   Ú&test_cpu_count_vs_NUMBER_OF_PROCESSORSS   s    z2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORSc             C   s$   t  ¡ d }t ¡ }|  ||¡ d S )Né   )Úwin32apiZGetSystemInfor   r.   r-   )r   Ú	sys_valueÚpsutil_valuer    r    r!   Útest_cpu_count_vs_GetSystemInfo[   s    z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfoc             C   s*   t  ¡ }| ¡ d }|  t ¡ |j¡ d S )Nr   )ÚwmiÚWMIÚWin32_Processorr-   r   r.   ZNumberOfLogicalProcessors)r   ÚwÚprocr    r    r!   Útest_cpu_count_logical_vs_wmib   s    z)TestCpuAPIs.test_cpu_count_logical_vs_wmic             C   s.   t  ¡ }| ¡ d }|  tjdd|j¡ d S )Nr   F)Zlogical)r5   r6   r7   r-   r   r.   ZNumberOfCores)r   r8   r9   r    r    r!   Útest_cpu_count_phys_vs_wmig   s    z&TestCpuAPIs.test_cpu_count_phys_vs_wmic             C   s    |   t ¡ ttjddƒ¡ d S )NT)Zpercpu)r-   r   r.   ÚlenÚ	cpu_times)r   r    r    r!   Útest_cpu_count_vs_cpu_timesl   s    
z'TestCpuAPIs.test_cpu_count_vs_cpu_timesc             C   s@   t  ¡ }| ¡ d }|  |jt ¡ j¡ |  |jt ¡ j	¡ d S )Nr   )
r5   r6   r7   r-   ZCurrentClockSpeedr   Zcpu_freqÚcurrentZMaxClockSpeedÚmax)r   r8   r9   r    r    r!   Útest_cpu_freqp   s    zTestCpuAPIs.test_cpu_freqN)r%   r&   r'   r   ÚskipIfr+   r,   r/   r4   r:   r;   r>   rA   r    r    r    r!   r(   Q   s   r(   c               @   sr   e Zd Zdd„ Zdd„ Ze ed¡eƒ dd„ ƒƒZ	eƒ dd	„ ƒZ
eƒ d
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestSystemAPIsc             C   sV   t dƒ}tjdd ¡ }x8|D ]0}d| dd¡ ¡ kr8q||kr|  d| ¡ qW d S )Nzipconfig /allT)Zperniczpseudo-interfaceú ú-z-%r nic wasn't found in 'ipconfig /all' output)r   r   Znet_io_countersÚkeysÚreplaceÚlowerÚfail)r   ÚoutZnicsZnicr    r    r!   Útest_nic_namesy   s    
zTestSystemAPIs.test_nic_namesc             C   s,   t  ¡  ¡ d }|  t|jƒt ¡ j¡ d S )Nr   )	r5   r6   ZWin32_ComputerSystemr-   r*   ZTotalPhysicalMemoryr   Zvirtual_memoryÚtotal)r   r8   r    r    r!   Útest_total_phymemƒ   s    z TestSystemAPIs.test_total_phymemztest not relieable on appveyorc             C   s:   t  ¡  ¡ }tdd„ |D ƒƒ}tt ¡ ƒ}|  ||¡ d S )Nc             S   s   g | ]
}|j ‘qS r    )Ú	ProcessId)Ú.0Úxr    r    r!   ú
<listcomp>š   s    z,TestSystemAPIs.test_pids.<locals>.<listcomp>)r5   r6   ÚWin32_ProcessÚsetr   Úpidsr-   )r   r8   Zwmi_pidsZpsutil_pidsr    r    r!   Ú	test_pids”   s    zTestSystemAPIs.test_pidsc          
   C   sü   t jdd}t ¡  ¡ }xÞ|D ]Ö}xÐ|D ]¶}|j dd¡|jkr(|jsHP d|j	krTP |j 
d¡rbP yt  |j¡}W n tk
rˆ   P Y nX |  |jt|jƒ¡ t|jƒ}|  |j|¡ t|j| ƒdkrÜ|  d|j|f ¡ P q(W |  d	t|ƒ ¡ qW d S )
NT)Úallú\Ú ÚcdromzA:i    zpsutil=%s, wmi=%szcan't find partition %s)r   Údisk_partitionsr5   r6   ZWin32_LogicalDiskÚdevicerG   ZDeviceIDÚ
mountpointÚoptsÚ
startswithÚ
disk_usager   r-   rL   r*   ÚSizeZ	FreeSpaceÚfreeÚabsrI   Úrepr)r   Zps_partsZ	wmi_partsZps_partZwmi_partÚusageZwmi_freer    r    r!   Ú
test_disksž   s.    



zTestSystemAPIs.test_disksc             C   s|   xvt  ¡ 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
W d S )NrY   r   )Údeltaé   )r   rZ   r]   r1   ZGetDiskFreeSpaceExr\   r_   ÚassertAlmostEqualra   r   rL   r-   Úused)r   Zdiskr2   r3   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 )zA:rW   )r^   )rO   rP   r    r    r!   rQ   Ì   s    z7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c             S   s   g | ]}|j  d ¡s|j ‘qS )zA:)r\   r^   )rO   rP   r    r    r!   rQ   Î   s    T)rV   )r1   ZGetLogicalDriveStringsÚsplitr   rZ   r-   )r   r2   r3   r    r    r!   Útest_disk_partitionsÊ   s    z#TestSystemAPIs.test_disk_partitionsc             C   s`   t t ¡ ƒ}t ¡  ¡ }t ƒ }x$|D ]}| |j¡ | |j¡ q$W |  	||@ d||f ¡ d S )Nzno common entries in %s, %s)
rS   ÚcextZnet_if_statsr5   r6   ZWin32_NetworkAdapterÚaddÚNameZNetConnectionIDÚ
assertTrue)r   Zps_namesZwmi_adaptersZ	wmi_namesZwmi_adapterr    r    r!   Útest_net_if_statsÒ   s    

z TestSystemAPIs.test_net_if_statsc             C   s^   t  ¡  ¡ }|d j d¡d }tj |d¡}tj t 	¡ ¡}t
||  ¡ ƒ}|  |d¡ d S )Nr   Ú.z%Y%m%d%H%M%Sé   )r5   r6   ZWin32_OperatingSystemZLastBootUpTimerk   ÚdatetimeÚstrptimeÚfromtimestampr   Ú	boot_timerb   Útotal_secondsZassertLessEqual)r   Zwmi_osZwmi_btime_strZwmi_btime_dtZ	psutil_dtZdiffr    r    r!   Útest_boot_timeÜ   s    zTestSystemAPIs.test_boot_timec          	   C   s¬   t jddd |  t ¡ d¡ W d Q R X t jddd |  t ¡ d¡ W d Q R X t jddd |  t ¡ d¡ W d Q R X t jddd |  t ¡ d¡ W d Q R X d S )Nz psutil._pswindows.cext.boot_timer0   )Úreturn_valueé   é   iM  )r	   Úpatchr-   r   rw   )r   r    r    r!   Útest_boot_time_fluctuationå   s    z)TestSystemAPIs.test_boot_time_fluctuationN)r%   r&   r'   rK   rM   r   rB   r   r   rU   re   rj   rl   rq   ry   r~   r    r    r    r!   rC   w   s   

	
	rC   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)r1   ZGetPwrCapabilitiesZassertIsNotNoner   Úsensors_batteryÚassertIsNone)r   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 )Nzselect * from Win32_Batteryr   rg   )rf   )r5   r6   Úqueryr   r€   rh   ÚpercentZEstimatedChargeRemaining)r   r8   Úbattery_wmiÚbattery_psutilr    r    r!   Útest_percentþ   s    zTestSensorsBattery.test_percentc             C   s6   t  ¡ }| d¡d }t ¡ }|  |j|jdk¡ d S )Nzselect * from Win32_Batteryr   é   )r5   r6   rƒ   r   r€   r-   Úpower_pluggedZBatteryStatus)r   r8   r…   r†   r    r    r!   Útest_power_plugged  s
    z%TestSensorsBattery.test_power_pluggedc          	   C   s6   t jddd}|  t ¡ ¡ |js(t‚W d Q R X d S )Nz&psutil._pswindows.cext.sensors_battery)r   é€   r   r   )rz   )r	   r}   r   r   r€   ÚcalledÚAssertionError)r   Úmr    r    r!   Útest_emulate_no_battery  s    
z*TestSensorsBattery.test_emulate_no_batteryc          	   C   s<   t jddd$}|  t ¡ jtj¡ |js.t‚W d Q R X d S )Nz&psutil._pswindows.cext.sensors_battery)rg   r   r   r   )rz   )	r	   r}   r-   r   r€   ÚsecsleftÚPOWER_TIME_UNLIMITEDrŒ   r   )r   rŽ   r    r    r!   Útest_emulate_power_connected  s
    
z/TestSensorsBattery.test_emulate_power_connectedc          	   C   s<   t jddd$}|  t ¡ jtj¡ |js.t‚W d Q R X d S )Nz&psutil._pswindows.cext.sensors_battery)r   é   r   r   )rz   )	r	   r}   r-   r   r€   r   r‘   rŒ   r   )r   rŽ   r    r    r!   Útest_emulate_power_charging  s
    
z.TestSensorsBattery.test_emulate_power_chargingc          	   C   s<   t jddd$}|  t ¡ jtj¡ |js.t‚W d Q R X d S )Nz&psutil._pswindows.cext.sensors_battery)r   r   r   éÿÿÿÿ)rz   )	r	   r}   r-   r   r€   r   ÚPOWER_TIME_UNKNOWNrŒ   r   )r   rŽ   r    r    r!   Útest_emulate_secs_left_unknown%  s
    
z1TestSensorsBattery.test_emulate_secs_left_unknownN)r%   r&   r'   r‚   r   rB   r   r‡   rŠ   r   r’   r”   r—   r    r    r    r!   r   ö   s   	
r   c               @   s°   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	e
 ejdk d¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%S )&ÚTestProcessc             C   s   t ƒ j| _d S )N)r   Úpid)Úclsr    r    r!   Ú
setUpClass4  s    zTestProcess.setUpClassc             C   s   t | jƒ d S )N)r   r™   )rš   r    r    r!   ÚtearDownClass8  s    zTestProcess.tearDownClassc             C   s   t  d¡}|  t j|j¡ d S )Nr   )r   ÚProcessÚassertRaisesr   Úkill)r   Úpr    r    r!   Útest_issue_24<  s    
zTestProcess.test_issue_24c             C   s   t  d¡}|  | ¡ d¡ t|ƒ | ¡  |  | ¡ dk¡ y| ¡ d d… \}}W n( t j	k
r|   t
 ¡ d dkrx‚ Y nX |  |dk¡ d S )Nr{   ÚSystemg        rˆ   rg   )Zvistazwin-7Zwin7r   )r   r   r-   ÚnameÚstrÚusernamerp   Úcreate_timeÚmemory_infor   ÚplatformÚuname)r   r    ÚrssÚvmsr    r    r!   Útest_special_pid@  s    
zTestProcess.test_special_pidc             C   s"   t  | j¡}|  t|jtj¡ d S )N)r   r   r™   rž   Ú
ValueErrorÚsend_signalÚsignalÚSIGINT)r   r    r    r    r!   Útest_send_signalQ  s    zTestProcess.test_send_signalc             C   sb   t  t ¡ ¡}| ¡ }t tjtj	t ¡ ¡}| ¡ }|  
||d ¡ t |¡ |  
| ¡ |¡ d S )Nrg   )r   r   r+   ÚgetpidÚnum_handlesr1   ÚOpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr-   ÚCloseHandle)r   r    ÚbeforeÚhandleÚafterr    r    r!   Útest_num_handles_incrementU  s    
z&TestProcess.test_num_handles_increment)rˆ   é   zCTRL_* signals not supportedc             C   sd   t  |  ¡ j¡}| tj¡ | tj¡ | ¡  | 	¡  |  
t j|jtj¡ |  
t j|jtj¡ d S )N)r   r   r   r™   r®   r¯   ZCTRL_C_EVENTZCTRL_BREAK_EVENTrŸ   Úwaitrž   r   )r   r    r    r    r!   Útest_ctrl_signals_  s    zTestProcess.test_ctrl_signalsc             C   s    |   t ¡  ¡ t tj¡¡ d S )N)r-   r   r   r¥   r1   ZGetUserNameExrµ   ZNameSamCompatible)r   r    r    r!   Útest_usernamel  s    zTestProcess.test_usernamec             C   s8   t  ddt ¡ ¡ ¡ }d t ¡  ¡ ¡}|  	||¡ d S )Nz +rD   )
ÚreÚsubr1   ZGetCommandLineÚstripÚjoinr   r   Úcmdliner-   )r   r2   r3   r    r    r!   Útest_cmdlinep  s    zTestProcess.test_cmdlinec             C   sJ   t  tjtjt ¡ ¡}|  t j|¡ t	 
|¡}t ¡  ¡ }|  ||¡ d S )N)r1   r´   rµ   r¶   r·   r+   r²   Ú
addCleanupr¸   Úwin32processZGetPriorityClassr   r   Únicer-   )r   rº   r2   r3   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)r1   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º   r2   r3   r    r    r!   Útest_memory_infoŒ  s0    
zTestProcess.test_memory_infoc             C   sX   t  tjtj| j¡}|  t j|¡ t 	| j¡}| 
¡  | ¡ }t |¡}|  ||¡ d S )N)r1   r´   rµ   r¶   r·   r™   rÇ   r¸   r   r   r   r¾   rÈ   ZGetExitCodeProcessr-   )r   rº   r    r3   r2   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 )rg   r    )rO   Úi)rP   r    r!   rQ   ³  s    zGTestProcess.test_cpu_affinity.<locals>.from_bitmask.<locals>.<listcomp>é@   )Úrange)rP   r    )rP   r!   Úfrom_bitmask²  s    z3TestProcess.test_cpu_affinity.<locals>.from_bitmaskr   )r1   r´   rµ   r¶   r·   r™   rÇ   r¸   rÈ   ZGetProcessAffinityMaskr   r   Zcpu_affinityr-   )r   rÑ   rº   r2   r3   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)r1   r´   rµ   r¶   r·   r+   r²   rÇ   r¸   rÈ   ZGetProcessIoCountersr   r   Úio_countersr-   Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚother_countZother_bytes)r   rº   r2   r3   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   i   )ÚctypesZctypes.wintypesÚwindllÚkernel32r´   r™   rÇ   r¸   ZwintypesZDWORDZGetProcessHandleCountÚbyrefÚvaluer   r   r³   r-   )r   rÚ   r¶   rº   Zhndcntr2   r3   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 d Q R X W d Q R X |  	|j
d¡ d S )Ni+  z psutil._psplatform.cext.proc_cwd)Úside_effectz
time.sleepr0   )ÚWindowsErrorÚwinerrorr	   r}   r   r   rž   r   ÚcwdÚassertGreaterEqualZ
call_count)r   ÚexcrŽ   r    r    r    r!   Útest_error_partial_copyß  s    $z#TestProcess.test_error_partial_copyc             C   s0   t  ¡ d d }t j |¡}|  t j|j¡ d S )Nr•   iŸ† )r   rT   Ú_psplatformr   rž   r   Úexe)r   r™   r9   r    r    r!   Útest_exeé  s    zTestProcess.test_exeN)r%   r&   r'   Úclassmethodr›   rœ   r¡   r¬   r±   r¼   r   rB   ÚsysÚversion_infor¿   rÀ   rÆ   rÊ   rÌ   rÍ   rÒ   rÙ   rß   ræ   ré   r    r    r    r!   r˜   2  s$   


r˜   c               @   sx   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Ze 	e
d¡d	d
„ ƒZdd„ Zdd„ Zeƒ dd„ ƒZeƒ dd„ ƒZdd„ ZdS )ÚTestProcessWMIz%Compare Process API results with WMI.c             C   s   t ƒ j| _d S )N)r   r™   )rš   r    r    r!   r›   ô  s    zTestProcessWMI.setUpClassc             C   s   t | jƒ d S )N)r   r™   )rš   r    r    r!   rœ   ø  s    zTestProcessWMI.tearDownClassc             C   s8   t  ¡ j| jdd }t | j¡}|  | ¡ |j¡ d S )N)rN   r   )	r5   r6   rR   r™   r   r   r-   r£   ZCaption)r   r8   r    r    r    r!   Ú	test_nameü  s    zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONSc             C   s@   t  ¡ j| jdd }t | j¡}|  | ¡  ¡ |j	 ¡ ¡ d S )N)rN   r   )
r5   r6   rR   r™   r   r   r-   rè   rH   ZExecutablePath)r   r8   r    r    r    r!   ré     s    zTestProcessWMI.test_exec             C   sF   t  ¡ j| jdd }t | j¡}|  d | ¡ ¡|j	 
dd¡¡ d S )N)rN   r   rD   ú"rX   )r5   r6   rR   r™   r   r   r-   rÄ   rÅ   ZCommandLinerG   )r   r8   r    r    r    r!   rÆ   
  s    zTestProcessWMI.test_cmdlinec             C   sP   t  ¡ j| jdd }t | j¡}| ¡ \}}}d||f }|  | ¡ |¡ d S )N)rN   r   z%s\%s)	r5   r6   rR   r™   r   r   ZGetOwnerr-   r¥   )r   r8   r    ÚdomainÚ_r¥   r    r    r!   rÀ     s
    zTestProcessWMI.test_usernamec             C   sB   t  ¡ j| jdd }t | j¡}| ¡ j}|  |t	|j
ƒ¡ d S )N)rN   r   )r5   r6   rR   r™   r   r   r§   rª   r-   r*   rË   )r   r8   r    rª   r    r    r!   Útest_memory_rss  s    
zTestProcessWMI.test_memory_rssc             C   s`   t  ¡ j| jdd }t | j¡}| ¡ j}t|j	ƒ}||kr\||d kr\|  
d||f ¡ d S )N)rN   r   i   zwmi=%s, psutil=%s)r5   r6   rR   r™   r   r   r§   r«   r*   ZPageFileUsagerI   )r   r8   r    r«   Z	wmi_usager    r    r!   Útest_memory_vms  s    

zTestProcessWMI.test_memory_vmsc             C   s\   t  ¡ j| jdd }t | j¡}t|j d¡d ƒ}t	 
dt	 | ¡ ¡¡}|  ||¡ d S )N)rN   r   rr   z%Y%m%d%H%M%S)r5   r6   rR   r™   r   r   r¤   ZCreationDaterk   ÚtimeÚstrftimeÚ	localtimer¦   r-   )r   r8   r    Zwmic_createZpsutil_creater    r    r!   Útest_create_time+  s    zTestProcessWMI.test_create_timeN)r%   r&   r'   Ú__doc__rê   r›   rœ   rî   r   rB   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 )N)r   r™   )rš   r    r    r!   r›   C  s    z(TestDualProcessImplementation.setUpClassc             C   s   t | jƒ d S )N)r   r™   )rš   r    r    r!   rœ   G  s    z+TestDualProcessImplementation.tearDownClassc          	   C   s²   t  | j¡ ¡ }tjdttjdƒd‚}t  | j¡ ¡ }|  	t
|ƒt
|ƒ¡ xLtt
|ƒƒD ]<}|  || d¡ |  || d¡ | j|| || dd qZW |js¤t‚W d Q R X d S )Nz(psutil._psplatform.cext.proc_memory_infoÚmsg)rà   r   i   )rf   )r   r   r™   r§   r	   r}   r   r   ÚEPERMr-   r<   rÐ   rä   rh   rŒ   r   )r   Zmem_1r   Zmem_2rÎ   r    r    r!   rÌ   K  s    z.TestDualProcessImplementation.test_memory_infoc          	   C   sX   t  | j¡ ¡ }tjdttjdƒd(}|  	t  | j¡ ¡ |¡ |j
sJt‚W d Q R X d S )Nz"psutil._psplatform.cext.proc_timesrú   )rà   )r   r   r™   r¦   r	   r}   r   r   rû   r-   rŒ   r   )r   Úctimer   r    r    r!   r÷   W  s
    z.TestDualProcessImplementation.test_create_timec          	   C   sx   t  | j¡ ¡ }tjdttjdƒdH}t  | j¡ ¡ }|j	sBt
‚| j|j|jdd | j|j|jdd W d Q R X d S )Nz"psutil._psplatform.cext.proc_timesrú   )rà   g{®Gáz„?)rf   )r   r   r™   r=   r	   r}   r   r   rû   rŒ   r   rh   ÚuserÚsystem)r   Zcpu_times_1r   Zcpu_times_2r    r    r!   Útest_cpu_times^  s    
z,TestDualProcessImplementation.test_cpu_timesc          	   C   s~   t  | j¡ ¡ }tjdttjdƒdN}t  | j¡ ¡ }x,t	t
|ƒƒD ]}| j|| || dd qFW |jspt‚W d Q R X d S )Nz(psutil._psplatform.cext.proc_io_countersrú   )rà   r0   )rf   )r   r   r™   rÓ   r	   r}   r   r   rû   rÐ   r<   rh   rŒ   r   )r   Zio_counters_1r   Zio_counters_2rÎ   r    r    r!   rÙ   i  s    z.TestDualProcessImplementation.test_io_countersc          	   C   sX   t  | j¡ ¡ }tjdttjdƒd(}|  	t  | j¡ ¡ |¡ |j
sJt‚W d Q R X d S )Nz(psutil._psplatform.cext.proc_num_handlesrú   )rà   )r   r   r™   r³   r	   r}   r   r   rû   r-   rŒ   r   )r   r³   r   r    r    r!   rß   s  s    z.TestDualProcessImplementation.test_num_handlesc             C   sŽ   ddl m} x|t ¡ D ]p}y tj|dd}tj|dd}W n> tk
rx } z ||ƒ}t|tjtj	fƒsh‚ W d d }~X Y qX |  
||¡ qW d S )Nr   )Úconvert_oserrorT)Zuse_pebF)r   r   r   rT   rm   Zproc_cmdliner   Ú
isinstancer   r   r-   )r   r   r™   ÚaÚbr   r    r    r!   rÆ   {  s    
z*TestDualProcessImplementation.test_cmdlineN)r%   r&   r'   rø   rê   r›   rœ   rÌ   r÷   rÿ   rÙ   rß   rÆ   r    r    r    r!   rù   7  s   

rù   c                   sp   e Zd ZdZedd„ ƒZddgZ‡ fdd„Z‡ fdd	„Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚRemoteProcessTestCasez×Certain functions require calling ReadProcessMemory.
    This trivially works when called on the current process.
    Check that this works on other processes, especially when they
    have a different bitness.
    c              C   s\   d} xRt   d¡D ]D}tj|d| gtjtjd}| ¡ \}}| ¡  |tt ƒkr|S qW d S )Nz6import sys; sys.stdout.write(str(sys.maxsize > 2**32))zC:\Python*\python.exez-c)r   ÚstdoutÚstderr)	ÚglobÚ
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicater¾   r¤   r   )ÚcodeÚfilenamer9   Úoutputrñ   r    r    r!   Úfind_other_interpreter’  s    
z,RemoteProcessTestCase.find_other_interpreterz-czimport sys; sys.stdin.read()c                s    t ƒ  ¡  |  ¡ }|d kr$t d¡‚tr8tj| _|| _	n|| _tj| _	t
j ¡ }tt
 ¡ ƒ|d< | j| j	g| j |tjd| _| j| jg| j |tjd| _d S )Nz0could not find interpreter with opposite bitnessÚTHINK_OF_A_NUMBER)ÚenvÚstdin)r   ÚsetUpr  r   ZSkipTestr   rë   Ú
executableZpython64Zpython32r+   r,   Úcopyr¤   r²   r   Ú	test_argsr  r
  Úproc32Úproc64)r   Zother_pythonr  )Ú	__class__r    r!   r  ¤  s(    

zRemoteProcessTestCase.setUpc                s"   t ƒ  ¡  | j ¡  | j ¡  d S )N)r   ÚtearDownr  r  r  )r   )r  r    r!   r  ½  s    

zRemoteProcessTestCase.tearDownc             C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S )Nrs   rg   )r   r   r  r™   r-   r<   rÅ   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 )Nrs   rg   )r   r   r  r™   r-   r<   rÅ   r  )r   r    r    r    r!   Útest_cmdline_64Ç  s    z%RemoteProcessTestCase.test_cmdline_64c             C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S )N)r   r   r  r™   r-   rã   r+   Úgetcwd)r   r    r    r    r!   Útest_cwd_32Ì  s    z!RemoteProcessTestCase.test_cwd_32c             C   s&   t  | jj¡}|  | ¡ t ¡ ¡ d S )N)r   r   r  r™   r-   rã   r+   r  )r   r    r    r    r!   Útest_cwd_64Ð  s    z!RemoteProcessTestCase.test_cwd_64c             C   s>   t  | jj¡}| ¡ }|  d|¡ |  |d tt 	¡ ƒ¡ d S )Nr  )
r   r   r  r™   r,   ÚassertInZassertEqualsr¤   r+   r²   )r   r    Úer    r    r!   Útest_environ_32Ô  s    z%RemoteProcessTestCase.test_environ_32c             C   s6   t  | jj¡}y| ¡  W n t jk
r0   Y nX d S )N)r   r   r  r™   r,   r   )r   r    r    r    r!   Útest_environ_64Ú  s
    z%RemoteProcessTestCase.test_environ_64)r%   r&   r'   rø   Ústaticmethodr  r  r  r  r  r  r  r   r#  r$  Ú__classcell__r    r    )r  r!   r  Š  s   r  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestServicesc             C   sn  t dddddddgƒ}t dd	d
gƒ}t dddddddgƒ}x,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	rLt 	|¡}|  | ¡ ¡ t | ¡ ¡}|  ||¡ qFW d S )NÚrunningZpausedÚstartÚpauseÚcontinueÚstopÚstoppedZ	automaticZmanualÚdisabledZstart_pendingZpause_pendingZcontinue_pendingZstop_pendingr£   rX   Údisplay_namer¥   Ústatusr™   ZbinpathZ
start_typeÚdescription)rS   r   Úwin_service_iterZas_dictZassertIsInstancer¤   ZassertNotEqualrÃ   r!  r   r™   rp   Z
is_runningÚwin_service_getr£   r-   )r   Zvalid_statusesZvalid_start_typesZservÚdatar™   r    Úsr    r    r!   Útest_win_service_iterê  sR    

z"TestServices.test_win_service_iterc          	   C   s¨  t jjj}t jjj}tt  ¡ ƒ ¡ }|  t j	¡}t  
|d ¡ W d Q R X |  |jj|d ¡ t  
|¡}trzddd|f}n|df}t|Ž }tjd|d |  t j	|j¡ W d Q R X tjd|d |  t j	|j¡ W d Q R X trðddd|f}n|df}t|Ž }tjd|d |  t j|j¡ W d Q R X tjd|d |  t j|j¡ W d Q R X |  | ¡ t|ƒ¡ |  | ¡ t|ƒ¡ |  | ¡ t|ƒ¡ |  | ¡ t|ƒ¡ d S )Nz???r   rú   z/psutil._psplatform.cext.winservice_query_status)rà   z/psutil._psplatform.cext.winservice_query_config)r   rç   rm   ÚERROR_SERVICE_DOES_NOT_EXISTÚERROR_ACCESS_DENIEDÚnextr2  r£   rž   r   r3  r-   Ú	exceptionr   rá   r	   r}   r0  r¥   r   r!  r¤   r/  rc   )r   r7  r8  r£   ÚcmZservicer   rå   r    r    r!   Útest_win_service_get  s>    






z!TestServices.test_win_service_getN)r%   r&   r'   r6  r<  r    r    r    r!   r'  ç  s   0r'  Ú__main__)Úrun_from_name)7rø   rt   r   r  r+   r¨   rÁ   r¯   r  rë   rô   Úwarningsr   r   Zpsutil._compatr   r   Zpsutil.testsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Úcatch_warningsÚsimplefilterr1   rµ   rÈ   r5   rç   rm   r#   rB   r$   r(   rC   r   r˜   rí   rù   r  r'  r%   Zpsutil.tests.runnerr>  Ú__file__r    r    r    r!   Ú<module>   sr   


	&< @FR\^
