B
    çÚ†\ƒ  ã            	   @   st  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 e ¡ Z e d¡ y$ddlZddlZddlZddlZW n$ ek
r8   ejdkr4‚ Y nX W dQ R X ej j!Z!e	j"dkZ#dd„ Z$e %e d¡G dd„ dej&ƒƒZ'e %e d¡G dd„ dej&ƒƒZ(e %e d¡G dd„ dej&ƒƒZ)e %e d¡G dd„ dej&ƒƒZ*e %e d¡G dd„ dej&ƒƒZ+e %e d¡G dd„ dej&ƒƒZ,e %e d¡G dd „ d ej&ƒƒZ-e %e d¡G d!d"„ d"ej&ƒƒZ.e/d#krpee0ƒ dS )$zWindows specific tests.é    N)ÚWINDOWS)ÚAPPVEYOR)Úget_test_subprocess)ÚHAS_BATTERY)Úmock)Úreap_children)Úretry_before_failing)Úrun_test_module_by_name)Úsh)ÚunittestÚignoreÚntl        c                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ÚAccessDeniedÚESRCHÚNoSuchProcess)ÚselfÚargsÚkwargsÚerrr   )Úfun© ú8lib/python3.7/site-packages/psutil/tests/test_windows.pyÚwrapper5   s    
z wrap_exceptions.<locals>.wrapperr   )r   r   r   )r   r   Úwrap_exceptions4   s    
r   zWINDOWS onlyc               @   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_PROCESSORSJ   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_GetSystemInfoR   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_wmiY   s    z)TestCpuAPIs.test_cpu_count_logical_vs_wmic             C   s.   t  ¡ }| ¡ d }|  tjdd|j¡ d S )Nr   F)Zlogical)r,   r-   r.   r$   r   r%   ZNumberOfCores)r   r/   r0   r   r   r   Útest_cpu_count_phys_vs_wmi^   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_timesc   s    
z'TestCpuAPIs.test_cpu_count_vs_cpu_timesc             C   s@   t  ¡ }| ¡ d }|  |jt ¡ j¡ |  |jt ¡ j	¡ d S )Nr   )
r,   r-   r.   r$   ZCurrentClockSpeedr   Zcpu_freqZcurrentZMaxClockSpeedÚmax)r   r/   r0   r   r   r   Útest_cpu_freqg   s    zTestCpuAPIs.test_cpu_freqN)Ú__name__Ú
__module__Ú__qualname__r   ÚskipIfr"   r#   r&   r+   r1   r2   r5   r7   r   r   r   r   r   G   s   r   c               @   sl   e Zd Zdd„ Zdd„ Ze ed¡eƒ dd„ ƒƒZ	eƒ dd	„ ƒZ
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_namesq   s    
zTestSystemAPIs.test_nic_namesc             C   s,   t  ¡  ¡ d }|  t|jƒt ¡ j¡ d S )Nr   )	r,   r-   ZWin32_ComputerSystemr$   r!   ZTotalPhysicalMemoryr   Zvirtual_memoryÚtotal)r   r/   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>)r,   r-   ÚWin32_ProcessÚsetr   Úpidsr$   )r   r/   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 yt  
|j¡}W n4 tk
r˜ } z|jtjkr†P n‚ W d d }~X 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ú\Ú Úcdromi    zpsutil=%s, wmi=%szcan't find partition %s)r   Údisk_partitionsr,   r-   ZWin32_LogicalDiskZdevicer@   ZDeviceIDÚ
mountpointÚoptsÚ
disk_usager   r   ZENOENTr$   rE   r!   ZSizeZ	FreeSpaceÚfreeÚabsrB   Úrepr)r   Zps_partsZ	wmi_partsZps_partZwmi_partZusager   Z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dd | j|d |j	dd |  
|j|j	|j ¡ q
W d S )NrR   r   i   )Údeltaé   )r   rS   rU   r(   ZGetDiskFreeSpaceExrT   rV   ÚassertAlmostEqualrW   rE   r$   Zused)r   Zdiskr)   r*   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:rP   )Ú
startswith)rH   rI   r   r   r   rJ   Ä   s    z7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c             S   s   g | ]
}|j ‘qS r   )rT   )rH   rI   r   r   r   rJ   Æ   s    T)rO   )r(   ZGetLogicalDriveStringsÚsplitr   rS   r$   )r   r)   r*   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)
rL   ÚcextZnet_if_statsr,   r-   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é   )r,   r-   ZWin32_OperatingSystemZLastBootUpTimer`   ÚdatetimeZstrptimeZfromtimestampr   Ú	boot_timerX   Z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_timer'   )Úreturn_valueé   é   iM  )r   Úpatchr$   r   rj   )r   r   r   r   Útest_boot_time_fluctuationÝ   s    z)TestSystemAPIs.test_boot_time_fluctuationN)r8   r9   r:   rD   rF   r   r;   r   r   rN   rZ   r^   ra   rf   rk   rp   r   r   r   r   r<   n   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Ú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   r\   )r[   )r,   r-   Úqueryr   rr   r]   ZpercentZEstimatedChargeRemaining)r   r/   Ú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   é   )r,   r-   ru   r   rr   r$   Zpower_pluggedZBatteryStatus)r   r/   rv   rw   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   )rl   )r   ro   rs   r   rr   Ú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)r\   r   r   r   )rl   )	r   ro   r$   r   rr   Ú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   )rl   )	r   ro   r$   r   rr   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   éÿÿÿÿ)rl   )	r   ro   r$   r   rr   r€   ZPOWER_TIME_UNKNOWNr|   r}   )r   r~   r   r   r   Útest_emulate_secs_left_unknown  s
    
z1TestSensorsBattery.test_emulate_secs_left_unknownN)r8   r9   r:   rt   r   r;   r   rx   rz   r   r‚   r„   r†   r   r   r   r   rq   î   s   	
rq   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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%S )&ÚTestProcessc             C   s   t ƒ j| _d S )N)r   Úpid)Úclsr   r   r   Ú
setUpClass.  s    zTestProcess.setUpClassc             C   s
   t ƒ  d S )N)r   )r‰   r   r   r   ÚtearDownClass2  s    zTestProcess.tearDownClassc             C   s   t  d¡}|  t j|j¡ d S )Nr   )r   ÚProcessÚassertRaisesr   Úkill)r   Úpr   r   r   Útest_issue_246  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 )Nrm   ZSystemg        ry   r\   )Zvistazwin-7Zwin7r   )r   rŒ   r$   ÚnameÚstrÚusernamere   Ú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_signalK  s    zTestProcess.test_send_signalc          	   C   sp   xjt  ¡ D ]^}y| ¡ }W n t jk
r0   Y q
X y|  tj | ¡ ¡|¡ W q
 t j	k
rf   w
Y q
X q
W d S )N)
r   Zprocess_iterr‘   r   r$   r"   ÚpathÚbasenameÚexeÚError)r   r   r‘   r   r   r   Útest_exe_and_nameO  s    zTestProcess.test_exe_and_namec             C   sb   t  t ¡ ¡}| ¡ }t tjtj	t ¡ ¡}| ¡ }|  
||d ¡ t |¡ |  
| ¡ |¡ d S )Nr\   )r   rŒ   r"   ÚgetpidÚnum_handlesr(   ÚOpenProcessÚwin32conÚPROCESS_QUERY_INFORMATIONÚFALSEr$   ÚCloseHandle)r   r   ZbeforeÚhandleZafterr   r   r   Útest_num_handles_increment]  s    
z&TestProcess.test_num_handles_incrementc          
      sÈ   ‡ fdd„}t  | j¡}g }xŽtt jƒD ]€‰ ˆ  d¡s(ˆ dkrBq(q(y(||ˆ ƒ | ¡ }||ˆ ƒ | ¡ }W n t jt jfk
r†   Y q(X ||kr(dˆ ||f }| |¡ q(W |rÄ|  	dd 
|¡ ¡ d S )Nc                s,   t | ˆ d ƒ}|d k	r$t|ƒr$|ƒ  n| d S )N)ÚgetattrÚcallable)r   Úattr)r‘   r   r   Úcallk  s    z+TestProcess.test_handles_leak.<locals>.callÚ_)
Ú	terminaterŽ   ZsuspendZresumeÚnicerœ   ÚwaitZchildrenÚas_dictZmemory_info_exz@failure while processing Process.%s method (before=%s, after=%s)Ú
)r   rŒ   rˆ   Údirr_   r¦   r   r   ÚappendrB   Újoin)r   r±   r   ZfailuresZnum1Znum2rB   r   )r‘   r   Útest_handles_leakg  s(    


zTestProcess.test_handles_leak)ry   é   zCTRL_* signals not supportedc             C   sb   t  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Ž   rµ   r   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“   r(   ZGetUserNameExr¨   ZNameSamCompatible)r   r   r   r   Útest_username˜  s    zTestProcess.test_usernamec             C   s8   t  ddt ¡ ¡ ¡ }d t ¡  ¡ ¡}|  	||¡ d S )Nz +r=   )
ÚreÚsubr(   ZGetCommandLineÚstriprº   r   rŒ   Úcmdliner$   )r   r)   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 )N)r(   r§   r¨   r©   rª   r"   r¥   Ú
addCleanupr«   Úwin32processZGetPriorityClassr   rŒ   r´   r$   )r   r¬   r)   r*   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*   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)r(   r§   r¨   r©   rª   rˆ   rÄ   r«   r   rŒ   r³   rµ   rÅ   ZGetExitCodeProcessr$   )r   r¬   r   r*   r)   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   )rH   Úi)rI   r   r   rJ   ß  s    zGTestProcess.test_cpu_affinity.<locals>.from_bitmask.<locals>.<listcomp>é@   )Úrange)rI   r   )rI   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¬   r)   r*   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ª   r"   r¥   rÄ   r«   rÅ   ZGetProcessIoCountersr   rŒ   Úio_countersr$   Z
read_countZwrite_countZ
read_bytesZwrite_bytesÚother_countZother_bytes)r   r¬   r)   r*   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.wintypesZwindllZkernel32r§   rˆ   rÄ   r«   ZwintypesZDWORDZGetProcessHandleCountZbyrefÚvaluer   rŒ   r¦   r$   )r   rÒ   r©   r¬   Zhndcntr)   r*   r   r   r   Útest_num_handlesü  s    
zTestProcess.test_num_handlesN)r8   r9   r:   ÚclassmethodrŠ   r‹   r   rš   rŸ   r¤   r­   r»   r   r;   ÚsysÚversion_infor½   r¾   rÃ   rÆ   rÈ   rÉ   rÎ   rÑ   rÔ   r   r   r   r   r‡   +  s$   
$
r‡   c               @   s`   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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 ƒ  d S )N)r   )r‰   r   r   r   r‹     s    zTestProcessWMI.tearDownClassc             C   s8   t  ¡ j| jdd }t | j¡}|  | ¡ |j¡ d S )N)rG   r   )	r,   r-   rK   rˆ   r   rŒ   r$   r‘   ZCaption)r   r/   r   r   r   r   Ú	test_name  s    zTestProcessWMI.test_namec             C   s@   t  ¡ j| jdd }t | j¡}|  | ¡  ¡ |j	 ¡ ¡ d S )N)rG   r   )
r,   r-   rK   rˆ   r   rŒ   r$   r¢   rA   ZExecutablePath)r   r/   r   r   r   r   Útest_exe  s    zTestProcessWMI.test_exec             C   sF   t  ¡ j| jdd }t | j¡}|  d | ¡ ¡|j	 
dd¡¡ d S )N)rG   r   r=   ú"rQ   )r,   r-   rK   rˆ   r   rŒ   r$   rº   rÂ   ZCommandLiner@   )r   r/   r   r   r   r   rÃ   $  s    zTestProcessWMI.test_cmdlinec             C   sP   t  ¡ j| jdd }t | j¡}| ¡ \}}}d||f }|  | ¡ |¡ d S )N)rG   r   z%s\%s)	r,   r-   rK   rˆ   r   rŒ   ZGetOwnerr$   r“   )r   r/   r   Zdomainr²   r“   r   r   r   r¾   *  s
    zTestProcessWMI.test_usernamec             C   sL   t  d¡ t ¡ j| jdd }t | j¡}| ¡ j	}|  
|t|jƒ¡ d S )Ngš™™™™™¹?)rG   r   )ÚtimeÚsleepr,   r-   rK   rˆ   r   rŒ   r•   r˜   r$   r!   rÇ   )r   r/   r   r˜   r   r   r   Útest_memory_rss1  s
    

zTestProcessWMI.test_memory_rssc             C   sj   t  d¡ t ¡ j| jdd }t | j¡}| ¡ j	}t
|jƒ}||krf||d krf|  d||f ¡ d S )Ngš™™™™™¹?)rG   r   i   zwmi=%s, psutil=%s)rÜ   rÝ   r,   r-   rK   rˆ   r   rŒ   r•   r™   r!   ZPageFileUsagerB   )r   r/   r   r™   Z	wmi_usager   r   r   Útest_memory_vms8  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)rG   r   rg   z%Y%m%d%H%M%S)r,   r-   rK   rˆ   r   rŒ   r’   ZCreationDater`   rÜ   ZstrftimeZ	localtimer”   r$   )r   r/   r   Zwmic_createZpsutil_creater   r   r   Útest_create_timeE  s    zTestProcessWMI.test_create_timeN)r8   r9   r:   Ú__doc__rÕ   rŠ   r‹   rÙ   rÚ   rÃ   r¾   rÞ   rß   rà   r   r   r   r   rØ     s   rØ   c               @   s`   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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Š   Z  s    z(TestDualProcessImplementation.setUpClassc             C   s
   t ƒ  d S )N)r   )r‰   r   r   r   r‹   ^  s    z+TestDualProcessImplementation.tearDownClassc          	   C   sZ   t  | j¡ ¡ }tjdt  t ¡ ¡d(}|  	t  | j¡ ¡ |¡ |j
sLt‚W d Q R X d S )Nz psutil._psplatform.cext.proc_exe)Úside_effect)r   rŒ   rˆ   r‘   r   ro   r   r"   r¥   r$   r|   r}   )r   r‘   r   r   r   r   rÙ   e  s
    z'TestDualProcessImplementation.test_namec          	   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   )r[   )r   rŒ   rˆ   r•   r   ro   r   r   ÚEPERMr$   r3   rÌ   ZassertGreaterEqualr]   r|   r}   )r   Zmem_1r   Zmem_2rÊ   r   r   r   rÈ   l  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_create_timerä   )rã   )r   rŒ   rˆ   r”   r   ro   r   r   rå   r$   r|   r}   )r   Zctimer   r   r   r   rà   x  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_cpu_timesrä   )rã   g{®Gáz„?)r[   )r   rŒ   rˆ   r4   r   ro   r   r   rå   r|   r}   r]   Ú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ã   r'   )r[   )r   rŒ   rˆ   rÏ   r   ro   r   r   rå   rÌ   r3   r]   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 d Q R X d S )Nz(psutil._psplatform.cext.proc_num_handlesrä   )rã   )r   rŒ   rˆ   r¦   r   ro   r   r   rå   r$   r|   r}   )r   r¦   r   r   r   r   rÔ   ”  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 |j|krXn|jtjkrfn‚ W d d }~X Y qX |  	||¡ qW d S )Nr   )ÚACCESS_DENIED_ERRSETT)Zuse_pebF)
r   ré   r   rM   rb   Zproc_cmdliner   r   r   r$   )r   ré   rˆ   ÚaÚbr   r   r   r   rÃ   œ  s    
z*TestDualProcessImplementation.test_cmdlineN)r8   r9   r:   rá   rÕ   rŠ   r‹   rÙ   rÈ   rà   rè   rÑ   rÔ   rÃ   r   r   r   r   râ   N  s   

râ   c               @   s|   e Zd ZdZedd„ ƒZedd„ ƒZddgZdd	„ Z	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 )Ú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   sT   d} xJt   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ÚPIPEZSTDOUTÚcommunicater’   Ú	IS_64_BIT)ÚcodeÚfilenamer0   Úoutputr²   r   r   r   Úfind_other_interpreterµ  s    
z,RemoteProcessTestCase.find_other_interpreterc             C   s@   |   ¡ }|d krt d¡‚tr.tj| _|| _n|| _tj| _d S )Nz0could not find interpreter with opposite bitness)rø   r   ZSkipTestrô   rÖ   Ú
executableÚpython64Úpython32)r‰   Zother_pythonr   r   r   rŠ   Ä  s    z RemoteProcessTestCase.setUpClassz-czimport sys; sys.stdin.read()c             C   sV   t j ¡ }tt  ¡ ƒ|d< t| jg| j |tj	d| _
t| jg| j |tj	d| _d S )NÚTHINK_OF_A_NUMBER)ÚenvÚstdin)r"   r#   Úcopyr’   r¥   r   rû   Ú	test_argsrð   rò   Úproc32rú   Úproc64)r   rý   r   r   r   ÚsetUpÕ  s    
zRemoteProcessTestCase.setUpc             C   s   | j  ¡  | j ¡  tƒ  d S )N)r  ró   r  r   )r   r   r   r   ÚtearDownß  s    

zRemoteProcessTestCase.tearDownc             C   s
   t ƒ  d S )N)r   )r‰   r   r   r   r‹   ä  s    z#RemoteProcessTestCase.tearDownClassc             C   s@   t  | jj¡}|  t| ¡ ƒd¡ |  | ¡ dd … | j¡ d S )Nrh   r\   )r   rŒ   r  rˆ   r$   r3   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 )Nrh   r\   )r   rŒ   r  rˆ   r$   r3   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$   Úcwdr"   Ú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_64N)r8   r9   r:   rá   Ústaticmethodrø   rÕ   rŠ   r   r  r  r‹   r  r  r	  r
  r  r  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 )NZrunningZpausedÚstartÚpauseÚcontinueÚstopZstoppedZ	automaticZmanualZdisabledZstart_pendingZpause_pendingZcontinue_pendingZstop_pendingr‘   rQ   Údisplay_namer“   Ústatusrˆ   ZbinpathZ
start_typeZdescription)rL   r   Úwin_service_iterr¶   ZassertIsInstancer’   ZassertNotEqualrÁ   r  rŒ   rˆ   re   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   sp  t t ¡ ƒ ¡ }|  tj¡}t |d ¡ W d Q R X |  |jj|d ¡ t |¡}t	tj
jjdƒ}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j
jjdƒ}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???rQ   z/psutil._psplatform.cext.winservice_query_status)rã   z/psutil._psplatform.cext.winservice_query_config)Únextr   r  r‘   r   r   r  r$   Z	exceptionZWindowsErrorÚ_psplatformrb   ZERROR_SERVICE_DOES_NOT_EXISTr   ro   r  r“   ZERROR_ACCESS_DENIEDr   r  r’   r  rY   )r   r‘   ÚcmZserviceÚexcr   r   r   Útest_win_service_get@  s2    




z!TestServices.test_win_service_getN)r8   r9   r:   r  r   r   r   r   r   r    s   0r  Ú__main__)1rá   ri   r   rï   r"   r–   r¿   r   rð   rÖ   rÜ   Úwarningsr   r   Zpsutil.testsr   r   r   r   r   r   r	   r
   r   Úcatch_warningsÚsimplefilterr(   r¨   rÅ   r,   ÚImportErrorr‘   r  rb   Úmaxsizerô   r   r;   ZTestCaser   r<   rq   r‡   rØ   râ   rì   r  r8   Ú__file__r   r   r   r   Ú<module>   sl   



&

<
 a
A
^
_
U
