U
    !h                  	   @   sx  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ZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ er^es^e 0 ed ddl Z ddl!Z!ddl"Z"ddl#Z#W 5 Q R X erpddl$m%Z% ej&j'Z'ej(j)e ddej(j)eddG dd deZ*dd Z+e,fddZ-G dd de*Z.G dd de*Z/G d d! d!e*Z0G d"d# d#e*Z1G d$d% d%e*Z2ej(j)e ddG d&d' d'eZ3ej(j)e ddG d(d) d)eZ4ej(j)e ddG d*d+ d+eZ5dS ),zWindows specific tests.    N)mock)WINDOWS)GITHUB_ACTIONS)HAS_BATTERY)IS_64BIT)PYPY)TOLERANCE_DISK_USAGE)TOLERANCE_SYS_MEM)PsutilTestCase)pytest)retry_on_failure)sh)spawn_subproc)	terminateignore)convert_oserrorzWINDOWS onlyreasonzpywin32 not available on PYPYc                   @   s   e Zd ZdS )WindowsTestCaseN)__name__
__module____qualname__ r   r   ?./venv/lib/python3.8/site-packages/psutil/tests/test_windows.pyr   5   s   r   c                 C   s(   t dstdd|  d}t|S )zCurrently not used, but available just in case. Usage:

    >>> powershell(
        "Get-CIMInstance Win32_PageFileUsage | Select AllocatedBaseSize")
    zpowershell.exezpowershell.exe not availablezhpowershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -Command "")shutilwhichr   skipr   )cmdcmdliner   r   r   
powershell;   s
    


r    c                    sn   t d|  d|  }d| dd  } dk	rfd|kr\t fdd| D S  |S n|S dS )	zCurrently not used, but available just in case. Usage:

    >>> wmic("Win32_OperatingSystem", "FreePhysicalMemory")
    2134124534
    z
wmic path z get     N,c                 3   s   | ]} |V  qd S Nr   .0x	converterr   r   	<genexpr>T   s     zwmic.<locals>.<genexpr>)r   stripjoin
splitlinestuplesplit)pathZwhatr)   outdatar   r(   r   wmicJ   s    
r3   c                   @   sR   e Zd Zejjdejkd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 availabler   c                 C   s"   t tjd }|t kstd S )Nr5   )intosenvironpsutil	cpu_countAssertionError)selfZnum_cpusr   r   r   &test_cpu_count_vs_NUMBER_OF_PROCESSORSa   s    z2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORSc                 C   s$   t  d }t }||ks td S )N   )win32apiZGetSystemInfor9   r:   r;   r<   	sys_valuepsutil_valuer   r   r   test_cpu_count_vs_GetSystemInfok   s    z+TestCpuAPIs.test_cpu_count_vs_GetSystemInfoc                 C   s2   t  }tdd | D }t |ks.td S )Nc                 s   s   | ]}|j V  qd S r$   )ZNumberOfLogicalProcessorsr&   procr   r   r   r*   t   s    z<TestCpuAPIs.test_cpu_count_logical_vs_wmi.<locals>.<genexpr>wmiWMIsumWin32_Processorr9   r:   r;   )r<   wZprocsr   r   r   test_cpu_count_logical_vs_wmir   s
    z)TestCpuAPIs.test_cpu_count_logical_vs_wmic                 C   s6   t  }tdd | D }tjdd|ks2td S )Nc                 s   s   | ]}|j V  qd S r$   )ZNumberOfCoresrD   r   r   r   r*   {   s     z:TestCpuAPIs.test_cpu_count_cores_vs_wmi.<locals>.<genexpr>F)ZlogicalrF   )r<   rK   Zcoresr   r   r   test_cpu_count_cores_vs_wmiy   s    z'TestCpuAPIs.test_cpu_count_cores_vs_wmic                 C   s    t  tt jddkstd S )NT)Zpercpu)r9   r:   len	cpu_timesr;   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ks(t|jt j	ks<td S Nr   )
rG   rH   rJ   ZCurrentClockSpeedr9   Zcpu_freqcurrentr;   ZMaxClockSpeedmax)r<   rK   rE   r   r   r   test_cpu_freq   s    zTestCpuAPIs.test_cpu_freqN)r   r   r   r   markskipifr7   r8   r=   rC   rL   rM   rQ   rU   r   r   r   r   r4   `   s   
r4   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Z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d Zdd ZdS )TestSystemAPIsc                 C   sT   t d}tjdd }|D ]2}d|dd kr6q||krt|dqd S )Nzipconfig /allT)Zperniczpseudo-interface -z+ nic wasn't found in 'ipconfig /all' output)r   r9   Znet_io_counterskeysreplacelowerr   fail)r<   r1   ZnicsZnicr   r   r   test_nic_names   s    zTestSystemAPIs.test_nic_namesc                 C   s,   t   d }t|jt jks(td S rR   )	rG   rH   ZWin32_ComputerSystemr6   ZTotalPhysicalMemoryr9   virtual_memorytotalr;   r<   rK   r   r   r   test_total_phymem   s    z TestSystemAPIs.test_total_phymemc                 C   s4   t   d }tt|jt j t	k s0t
d S rR   )rG   rH   Win32_PerfRawData_PerfOS_Memoryabsr6   ZAvailableBytesr9   r`   freer	   r;   rb   r   r   r   test_free_phymem   s
    zTestSystemAPIs.test_free_phymemc                 C   sh   t   d }t|jt j t jks2t	t jdkrdt j
dksRt	t jdksdt	d S rR   )rG   rH   rd   r6   ZCommitLimitr9   r`   ra   swap_memoryr;   rf   usedrb   r   r   r   test_total_swapmem   s    z!TestSystemAPIs.test_total_swapmemc                 C   s|   t  jdkrxt jddd }t|jd t|j }t  j	dksLt
tt  j	| dk sft
t  j	dksxt
d S )Nr   Z_Total)Named   r>   )r9   rh   ra   rG   rH   Z#Win32_PerfRawData_PerfOS_PagingFiler6   ZPercentUsageZPercentUsage_Basepercentr;   re   )r<   rK   ZpercentSwapr   r   r   test_percent_swapmem   s    z#TestSystemAPIs.test_percent_swapmemc                 C   s6   t   }dd |D }tt }||ks2td S )Nc                 S   s   h | ]
}|j qS r   Z	ProcessIdr%   r   r   r   	<setcomp>   s     z+TestSystemAPIs.test_pids.<locals>.<setcomp>)rG   rH   Win32_Processsetr9   pidsr;   )r<   rK   Zwmi_pidsZpsutil_pidsr   r   r   	test_pids   s    zTestSystemAPIs.test_pidsc              
   C   s  t jdd}t  }|D ]}|D ]}|jdd|jkr$|jsF qd|j	krT q|j
drd qzt |j}W n tk
r   Y  qY nX |jt|jkstt|j}|j|kstt|j| dkrtd|j d	|  qq$td
|qd S )NTall\r!   cdromA:i   zpsutil=z, wmi=zcan't find partition )r9   disk_partitionsrG   rH   ZWin32_LogicalDiskZdevicer\   ZDeviceID
mountpointopts
startswith
disk_usageFileNotFoundErrorra   r6   ZSizer;   Z	FreeSpacerf   re   r   r^   )r<   Zps_partsZ	wmi_partsZps_partZwmi_partusageZwmi_freer   r   r   
test_disks   s0    

zTestSystemAPIs.test_disksc                 C   s   t  D ]r}d|jkrqt|j}t |j}t|d |j t	k sJt
t|d |j t	k sdt
|j|j|j kst
qd S )Nrx   r   r"   )r9   rz   r|   r?   ZGetDiskFreeSpaceExr{   r~   re   rf   r   r;   ra   ri   )r<   ZdiskrA   rB   r   r   r   test_disk_usage   s    
zTestSystemAPIs.test_disk_usagec                 C   s>   dd t  dD }dd tjddD }||ks:td S )Nc                 S   s"   g | ]}|r| d s|d qS )ry   rw   )r}   r%   r   r   r   
<listcomp>   s    
z7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c                 S   s   g | ]}|j d s|j qS )ry   )r{   r}   r%   r   r   r   r      s   Tru   )r?   ZGetLogicalDriveStringsr/   r9   rz   r;   r@   r   r   r   test_disk_partitions   s    
z#TestSystemAPIs.test_disk_partitionsc              	   C   sn   d}d}d}d}d}||i}t jd|jd8}tj||ksBttj||ksVt|js`tW 5 Q R X d S )NzC:\Windows\TempzC:z\Device\HarddiskVolume1z\??\C:\Windows\Tempz$\Device\HarddiskVolume1\Windows\Tempz%psutil._pswindows.cext.QueryDosDeviceZside_effect)r   patchgetr9   
_pswindowsconvert_dos_pathr;   called)r<   winpathZdriveletterZ
devicepathntpath1ntpath2Zdevicesmr   r   r   test_convert_dos_path_drive  s     z*TestSystemAPIs.test_convert_dos_path_drivec                 C   sL   d}d}d}t j||ks tt j||ks4tt j||ksHtd S )Nz\\localhost\C$\Windows\Tempz!\??\UNC\localhost\C$\Windows\Tempz%\Device\Mup\localhost\C$\Windows\Temp)r9   r   r   r;   )r<   r   r   r   r   r   r   test_convert_dos_path_unc  s    z(TestSystemAPIs.test_convert_dos_path_uncc                 C   s`   t t }t  }t  }|D ]}||j ||j q"||@ s\t	d| d| d S )Nzno common entries in z, )
rr   cextZnet_if_statsrG   rH   ZWin32_NetworkAdapteraddrk   ZNetConnectionIDr;   )r<   Zps_namesZwmi_adaptersZ	wmi_namesZwmi_adapterr   r   r   test_net_if_stats"  s    z TestSystemAPIs.test_net_if_statsc                 C   sf   t   }|d jdd }tj|d}tjt	 }t
||  }|dksbt||fd S )Nr   .%Y%m%d%H%M%Sr>   )rG   rH   ZWin32_OperatingSystemZLastBootUpTimer/   datetimestrptimeZfromtimestampr9   Z	boot_timere   Ztotal_secondsr;   )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   s0   t jj }|d }tt | dk s,td S )Ng     @@g      ?)ctypeswindllkernel32ZGetTickCount64re   r   Zuptimer;   )r<   msZsecsr   r   r   test_uptime7  s    zTestSystemAPIs.test_uptimeN)r   r   r   r_   rc   rg   rj   rn   r   rt   r   r   r   r   r   r   r   r   r   r   r   r   rX      s"   




rX   c                   @   sh   e Zd Zdd Zejje dddd Zejje dddd Z	d	d
 Z
dd Zdd Zdd ZdS )TestSensorsBatteryc                 C   s2   t  d rt d k	s.tnt d ks.td S )NZSystemBatteriesPresent)r?   ZGetPwrCapabilitiesr9   sensors_batteryr;   rP   r   r   r   test_has_batteryE  s    z#TestSensorsBattery.test_has_batteryz
no batteryr   c                 C   s:   t  }|dd }t }t|j|j dk s6td S )Nselect * from Win32_Batteryr   r"   )	rG   rH   queryr9   r   re   rm   ZEstimatedChargeRemainingr;   r<   rK   Zbattery_wmiZbattery_psutilr   r   r   test_percentK  s    zTestSensorsBattery.test_percentc                 C   s6   t  }|dd }t }|j|jdkks2td S )Nr   r      )rG   rH   r   r9   r   Zpower_pluggedZBatteryStatusr;   r   r   r   r   test_power_pluggedU  s    z%TestSensorsBattery.test_power_pluggedc              	   C   s8   t jddd }t d ks t|js*tW 5 Q R X d S )N&psutil._pswindows.cext.sensors_battery)r      r   r   Zreturn_value)r   r   r9   r   r;   r   r<   r   r   r   r   test_emulate_no_battery^  s    z*TestSensorsBattery.test_emulate_no_batteryc              	   C   s<   t jddd$}t jtjks$t|js.tW 5 Q R X d S )Nr   )r"   r   r   r   r   r   r   r9   r   secsleftZPOWER_TIME_UNLIMITEDr;   r   r   r   r   r   test_emulate_power_connectedf  s     z/TestSensorsBattery.test_emulate_power_connectedc              	   C   s<   t jddd$}t jtjks$t|js.tW 5 Q R X d S )Nr   )r      r   r   r   r   r   r   r   r   test_emulate_power_chargingp  s     z.TestSensorsBattery.test_emulate_power_chargingc              	   C   s<   t jddd$}t jtjks$t|js.tW 5 Q R X d S )Nr   )r   r   r   r   )r   r   r9   r   r   ZPOWER_TIME_UNKNOWNr;   r   r   r   r   r   test_emulate_secs_left_unknownz  s    z1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   r   r   rV   rW   r   r   r   r   r   r   r   r   r   r   r   r   D  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 r$   r   pidclsr   r   r   
setUpClass  s    zTestProcess.setUpClassc                 C   s   t | j d S r$   r   r   r   r   r   r   tearDownClass  s    zTestProcess.tearDownClassc              	   C   s.   t d}tt j |  W 5 Q R X d S rR   )r9   Processr   raisesAccessDeniedkillr<   pr   r   r   test_issue_24  s    
zTestProcess.test_issue_24c                 C   s   t d}| dkstt| |  | dks:tz| d d \}}W n( t jk
rz   t	
 d dkrv Y nX |dkstd S )N   ZSystemg        r   r"   >   win7vistawin-7r   )r9   r   namer;   strusernamecreate_timememory_infor   platformuname)r<   r   rssZ_vmsr   r   r   test_special_pid  s    
zTestProcess.test_special_pidc              	   C   s2   t | j}tt |tj W 5 Q R X d S r$   )	r9   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 ksDt
t| | |ks^t
d S )Nr"   )r9   r   r7   getpidnum_handlesr?   OpenProcesswin32conPROCESS_QUERY_INFORMATIONFALSEr;   CloseHandle)r<   r   beforehandleZafterr   r   r   test_num_handles_increment  s      
z&TestProcess.test_num_handles_incrementc              	   C   s   t |  j}|tj |tj |  |	  t
t j |tj W 5 Q R X t
t j |tj W 5 Q R X d S r$   )r9   r   r   r   r   r   ZCTRL_C_EVENTZCTRL_BREAK_EVENTr   waitr   r   NoSuchProcessr   r   r   r   test_ctrl_signals  s    zTestProcess.test_ctrl_signalsc                 C   s8   t tj}|dr tdt 	 |ks4t
d S )N$zrunning as service account)r?   ZGetUserNameExr   ZNameSamCompatibleendswithr   r   r9   r   r   r;   )r<   r   r   r   r   test_username  s    

zTestProcess.test_usernamec                 C   sf   t ddt  }dt  }|d d  krD|d krVn n|	ddd}||ksbt
d S )Nz[ ]+rY   r   r   r!   r   )resubr?   ZGetCommandLiner+   r,   r9   r   r   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  }||ksFtd S r$   )r?   r   r   r   r   r7   r   
addCleanupr   win32processZGetPriorityClassr9   r   nicer;   r<   r   rA   rB   r   r   r   	test_nice  s      
zTestProcess.test_nicec                 C   s   t tjtj| j}| t j| t	|}t
| j }|d |jksNt|d |jks`t|d |jksrt|d |jkst|d |jkst|d |jkst|d |jkst|d |jkst|j|jkst|j|jkstd S )	NZPeakWorkingSetSizeWorkingSetSizeZQuotaPeakPagedPoolUsageZQuotaPagedPoolUsageZQuotaPeakNonPagedPoolUsageZQuotaNonPagedPoolUsageZPagefileUsageZPeakPagefileUsage)r?   r   r   r   r   r   r   r   r   ZGetProcessMemoryInfor9   r   r   Z	peak_wsetr;   ZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpagefileZpeak_pagefiler   vmsr   r   r   r   test_memory_info  s2      
zTestProcess.test_memory_infoc                 C   sX   t tjtj| j}| t j| t	| j}|
  | }t|}||ksTtd S r$   )r?   r   r   r   r   r   r   r   r9   r   r   r   r   ZGetExitCodeProcessr;   )r<   r   r   rB   rA   r   r   r   	test_wait  s      
zTestProcess.test_waitc                 C   s\   dd }t tjtj| j}| t j| |t	|d }t
| j }||ksXtd S )Nc                    s    fddt dD S )Nc                    s   g | ]}d |>  @ r|qS )r"   r   )r&   ir'   r   r   r     s      zGTestProcess.test_cpu_affinity.<locals>.from_bitmask.<locals>.<listcomp>@   )ranger   r   r   r   from_bitmask  s    z3TestProcess.test_cpu_affinity.<locals>.from_bitmaskr   )r?   r   r   r   r   r   r   r   r   ZGetProcessAffinityMaskr9   r   Zcpu_affinityr;   )r<   r   r   rA   rB   r   r   r   test_cpu_affinity  s      zTestProcess.test_cpu_affinityc                 C   s   t tjtjt }| t j| t	
|}t  }|j|d ksLt|j|d ks^t|j|d kspt|j|d kst|j|d kst|j|d kstd S )NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)r?   r   r   r   r   r7   r   r   r   r   ZGetProcessIoCountersr9   r   io_countersZ
read_countr;   Zwrite_countZ
read_bytesZwrite_bytesother_countZother_bytesr   r   r   r   test_io_counters!  s      
zTestProcess.test_io_countersc                 C   s   dd l }dd l}d}|jj|d| j}| |jjj| |j	 }|jj
||| |j}t| j }||ks|td S )Nr      )r   Zctypes.wintypesr   r   r   r   r   r   ZwintypesZDWORDZGetProcessHandleCountZbyrefvaluer9   r   r   r;   )r<   r   r   r   ZhndcntrA   rB   r   r   r   test_num_handles/  s"      
 zTestProcess.test_num_handlesc                 C   sv   t  }d|_tjd|dD td.}t }ttj |	  W 5 Q R X W 5 Q R X W 5 Q R X |j
dksrtd S )Ni+  z psutil._psplatform.cext.proc_cwdr   z
time.sleepr>   )OSErrorwinerrorr   r   r9   r   r   r   r   cwdZ
call_countr;   )r<   excr   r   r   r   r   test_error_partial_copyA  s    &z#TestProcess.test_error_partial_copyc              	   C   s@   t  d d }t j|}tt j |  W 5 Q R X d S )Nr   i )r9   rs   _psplatformr   r   r   r   exe)r<   r   rE   r   r   r   test_exeL  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     s&   

		r   c                   @   s|   e Zd ZdZedd Zedd Zdd Zej	j
ed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 r$   r   r   r   r   r   r   X  s    zTestProcessWMI.setUpClassc                 C   s   t | j d S r$   r   r   r   r   r   r   \  s    zTestProcessWMI.tearDownClassc                 C   s8   t  j| jdd }t| j}| |jks4td S Nro   r   )	rG   rH   rq   r   r9   r   r   ZCaptionr;   r<   rK   r   r   r   r   	test_name`  s    zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONSr   c                 C   s@   t  j| jdd }t| j}|  |j ks<t	d S r  )
rG   rH   rq   r   r9   r   r  r]   ExecutablePathr;   r  r   r   r   r  f  s    zTestProcessWMI.test_exec                 C   sF   t  j| jdd }t| j}d| |j	ddksBt
d S )Nro   r   rY   r   r!   )rG   rH   rq   r   r9   r   r,   r   ZCommandLiner\   r;   r  r   r   r   r   p  s    zTestProcessWMI.test_cmdlinec                 C   sR   t  j| jdd }t| j}| \}}}| d| }| |ksNtd S )Nro   r   rw   )	rG   rH   rq   r   r9   r   ZGetOwnerr   r;   )r<   rK   r   domain_r   r   r   r   r   u  s
    zTestProcessWMI.test_usernamec                 C   sB   t  j| jdd }t| j}| j}|t|j	ks>t
d S r  )rG   rH   rq   r   r9   r   r   r   r6   r   r;   )r<   rK   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	}|||d hkr\t
d| d| d S )Nro   r   r   zwmi=z	, psutil=)rG   rH   rq   r   r9   r   r   r   r6   ZPageFileUsager   r^   )r<   rK   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	| }||ksXtd S )Nro   r   r   r   )rG   rH   rq   r   r9   r   r   ZCreationDater/   timestrftime	localtimer   r;   )r<   rK   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   rV   rW   r   r  r   r   r   r  r  r  r   r   r   r   r  U  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 )TestDualProcessImplementationaw  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 r$   r   r   r   r   r   r     s    z(TestDualProcessImplementation.setUpClassc                 C   s   t | j d S r$   r   r   r   r   r   r     s    z+TestDualProcessImplementation.tearDownClassc              	   C   s   t | j }tjdtd}t | j }t|t|ksDtt	t|D ]@}|| dksdt|| dksttt
|| ||  dk sPtqP|jstW 5 Q R X d S )Nz(psutil._psplatform.cext.proc_memory_infor   r   i   )r9   r   r   r   r   r   PermissionErrorrN   r;   r   re   r   )r<   Zmem_1funZmem_2r   r   r   r   r     s    z.TestDualProcessImplementation.test_memory_infoc              	   C   sP   t | j }tjdtd(}t | j |ks8t|jsBtW 5 Q R X d S )N"psutil._psplatform.cext.proc_timesr   )	r9   r   r   r   r   r   r  r;   r   )r<   ctimer  r   r   r   r    s    z.TestDualProcessImplementation.test_create_timec              	   C   sx   t | j }tjdtdP}t | j }|js:tt	|j
|j
 dk sRtt	|j|j dk sjtW 5 Q R X d S )Nr  r   g{Gz?)r9   r   r   rO   r   r   r  r   r;   re   usersystem)r<   Zcpu_times_1r  Zcpu_times_2r   r   r   test_cpu_times  s    
z,TestDualProcessImplementation.test_cpu_timesc              	   C   sv   t | j }tjdtdN}t | j }tt|D ] }t	|| ||  dk s<t
q<|jsht
W 5 Q R X d S )Nz(psutil._psplatform.cext.proc_io_countersr   r>   )r9   r   r   r   r   r   r  r   rN   re   r;   r   )r<   Zio_counters_1r  Zio_counters_2r   r   r   r   r     s    z.TestDualProcessImplementation.test_io_countersc              	   C   sP   t | j }tjdtd(}t | j |ks8t|jsBtW 5 Q R X d S )Nz(psutil._psplatform.cext.proc_num_handlesr   )	r9   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 ]p}z tj|dd}tj|dd}W n> tk
rj } z t|}t|t jt jfsZ W 5 d }~X Y qX ||kst	qd S )NT)Zuse_pebF)
r9   rs   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    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 )RemoteProcessTestCasezCertain 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PIPEZSTDOUTcommunicater   r   r   )codefilenamerE   outputr  r   r   r   find_other_interpreter  s    z,RemoteProcessTestCase.find_other_interpreterr   zimport sys; sys.stdin.read()c                    s   t    |  }|d kr$tdtr8tj| _|| _	n|| _tj| _	t
j }tt
 |d< | j| j	g| j |tjd| _| j| jg| j |tjd| _d S )Nz0could not find interpreter with opposite bitnessTHINK_OF_A_NUMBER)envstdin)supersetUpr,  r   r   r   sys
executableZpython64Zpython32r7   r8   copyr   r   r   	test_argsr%  r'  proc32proc64)r<   Zother_pythonr.  	__class__r   r   r1    s.    

    zRemoteProcessTestCase.setUpc                    s"   t    | j  | j  d S r$   )r0  tearDownr6  r(  r7  rP   r8  r   r   r:  )  s    

zRemoteProcessTestCase.tearDownc                 C   s@   t | jj}t| dks"t| dd  | jks<td S N   r"   )r9   r   r6  r   rN   r   r;   r5  r   r   r   r   test_cmdline_32.  s    z%RemoteProcessTestCase.test_cmdline_32c                 C   s@   t | jj}t| dks"t| dd  | jks<td S r;  )r9   r   r7  r   rN   r   r;   r5  r   r   r   r   test_cmdline_643  s    z%RemoteProcessTestCase.test_cmdline_64c                 C   s&   t | jj}| t ks"td S r$   )r9   r   r6  r   r   r7   getcwdr;   r   r   r   r   test_cwd_328  s    z!RemoteProcessTestCase.test_cwd_32c                 C   s&   t | jj}| t ks"td S r$   )r9   r   r7  r   r   r7   r?  r;   r   r   r   r   test_cwd_64<  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t | jj}| }d|ks"t|d tt ks:td S )Nr-  )	r9   r   r6  r   r8   r;   r   r7   r   )r<   r   er   r   r   test_environ_32@  s    z%RemoteProcessTestCase.test_environ_32c                 C   s6   t | jj}z|  W n t jk
r0   Y nX d S r$   )r9   r   r7  r   r8   r   r   r   r   r   test_environ_64F  s
    z%RemoteProcessTestCase.test_environ_64)r   r   r   r  staticmethodr,  r5  r1  r:  r=  r>  r@  rA  rC  rD  __classcell__r   r   r8  r   r    s   
r  c                   @   s   e Zd Zdd Zdd ZdS )TestServicesc                 C   sz  dddddddh}dd	d
h}dddddddh}t  D ]<}| dkrJq6| }t|d tsdt|d  sttt|d tstt|d tst|d |kst|d d k	rt |d  t|d tstt|d tstt|d tst|d |ks
t|d |kstt|d ts0t|	 }|d k	rZt |}|
 sZtt | }||ks6tq6d S )NrunningZpausedstartpausecontinuestopstoppedZ	automaticZmanualZdisabledZstart_pendingZpause_pendingZcontinue_pendingZstop_pendingZWaaSMedicSvcr   display_namer   statusr   ZbinpathZ
start_typedescription)r9   win_service_iterr   Zas_dictr  r   r;   r+   r   r   Z
is_runningwin_service_get)r<   Zvalid_statusesZvalid_start_typesZservr2   r   r   sr   r   r   test_win_service_iterU  sP    	
	

z"TestServices.test_win_service_iterc              
   C   s  t jjj}t jjj}tt   }t	t j
}t |d  W 5 Q R X |jj|d ks^tt |}tddd}||_tjd|d& t	t j
 |  W 5 Q R X W 5 Q R X tjd|d& t	t j
 |  W 5 Q R X W 5 Q R X tddd}||_tjd|d& t	t j |  W 5 Q R X W 5 Q R X tjd|d& t	t j |  W 5 Q R X W 5 Q R X | t|kst| t|kst| t|kst| t|kstd S )Nz???r   msgz/psutil._psplatform.cext.winservice_query_statusr   z/psutil._psplatform.cext.winservice_query_config)r9   r  r   ERROR_SERVICE_DOES_NOT_EXISTERROR_ACCESS_DENIEDnextrQ  r   r   r   r   rR  r   r;   r   r   r   r   rO  r   r   r   rN  repr)r<   rV  rW  r   cmservicer   r   r   r   test_win_service_get  sP    

    z!TestServices.test_win_service_getN)r   r   r   rT  r\  r   r   r   r   rG  S  s   1rG  )6r  r   r   r$  r7   r   r   r   r   r%  r2  r  warningsZunittestr   r9   r   Zpsutil.testsr   r   r   r   r   r	   r
   r   r   r   r   r   catch_warningssimplefilterr?   r   r   rG   Zpsutil._pswindowsr   r  r   rV   rW   r   r    r6   r3   r4   rX   r   r   r  r  r  rG  r   r   r   r   <module>   sn   

( =F LHW]