a
    QIh                     @   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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rlesle : ed ddlZddl Z ddl!Z!ddl"Z"W d   n1 sb0    Y  er~d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)Z/G d"d# d#e)Z0G d$d% d%e)Z1ej'j(e ddG 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Z4d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_testproc)	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   S/var/www/html/venv_bot_3.9/lib/python3.9/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urfd|v 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       zwmic.<locals>.<genexpr>)r   stripjoin
splitlinestuplesplit)pathwhatr)   outdatar   r(   r   wmicJ   s    
r5   c                   @   sR   e Zd Zejjdejv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J d S )Nr7   )intosenvironpsutil	cpu_count)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 J d S )N   )win32apiZGetSystemInfor;   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.J 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_Processorr;   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s2J d S )Nc                 s   s   | ]}|j V  qd S r$   )ZNumberOfCoresrE   r   r   r   r*   {   r+   z:TestCpuAPIs.test_cpu_count_cores_vs_wmi.<locals>.<genexpr>F)ZlogicalrG   )r=   rL   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J d S )NT)Zpercpu)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ks(J |jt jks<J d S Nr   )	rH   rI   rK   ZCurrentClockSpeedr;   Zcpu_freqcurrentZMaxClockSpeedmax)r=   rL   rF   r   r   r   test_cpu_freq   s    zTestCpuAPIs.test_cpu_freqN)r   r   r   r   markskipifr9   r:   r>   rD   rM   rN   rR   rV   r   r   r   r   r6   `   s   
r6   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S )TestSystemAPIsc                 C   sT   t d}tjdd }|D ]2}d|dd v r6q||vr| |dqd S )Nzipconfig /allT)Zperniczpseudo-interface -z+ nic wasn't found in 'ipconfig /all' output)r   r;   Znet_io_counterskeysreplacelowerfail)r=   r3   ZnicsZnicr   r   r   test_nic_names   s    zTestSystemAPIs.test_nic_namesc                 C   s,   t   d }t|jt jks(J d S rS   )rH   rI   ZWin32_ComputerSystemr8   ZTotalPhysicalMemoryr;   virtual_memorytotalr=   rL   r   r   r   test_total_phymem   s    z TestSystemAPIs.test_total_phymemc                 C   s4   t   d }tt|jt j t	k s0J d S rS   )
rH   rI   Win32_PerfRawData_PerfOS_Memoryabsr8   ZAvailableBytesr;   ra   freer	   rc   r   r   r   test_free_phymem   s
    zTestSystemAPIs.test_free_phymemc                 C   sh   t   d }t|jt j t jks2J t jdkrdt j	dksRJ t j
dksdJ d S rS   )rH   rI   re   r8   ZCommitLimitr;   ra   rb   swap_memoryrg   usedrc   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sLJ t
t  j	| dk sfJ t  j	dksxJ d S )Nr   Z_Total)Named   r?   )r;   ri   rb   rH   rI   Z#Win32_PerfRawData_PerfOS_PagingFiler8   ZPercentUsageZPercentUsage_Basepercentrf   )r=   rL   ZpercentSwapr   r   r   test_percent_swapmem   s    z#TestSystemAPIs.test_percent_swapmemc                 C   s6   t   }dd |D }tt }||ks2J d S )Nc                 S   s   h | ]
}|j qS r   Z	ProcessIdr%   r   r   r   	<setcomp>   r+   z+TestSystemAPIs.test_pids.<locals>.<setcomp>)rH   rI   Win32_Processsetr;   pids)r=   rL   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ksJ t|j}|j|ksJ t|j| dkr| d|j d	|  qq$| d
|qd S )NTall\r!   cdromA:i   zpsutil=z, wmi=zcan't find partition )r;   disk_partitionsrH   rI   ZWin32_LogicalDiskZdevicer]   ZDeviceID
mountpointopts
startswith
disk_usageFileNotFoundErrorrb   r8   SizeZ	FreeSpacerg   rf   r_   )r=   Zps_partsZ	wmi_partsZps_partZwmi_partusageZwmi_freer   r   r   
test_disks   s,    

zTestSystemAPIs.test_disksc                 C   s   t  D ]r}d|jv rqt|j}t |j}t|d |j t	k sJJ t|d |j
 t	k sdJ |j|j
|j ksJ qd S )Nry   r   r"   )r;   r{   r}   r@   ZGetDiskFreeSpaceExr|   r   rf   rg   r   rb   rj   )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 }||ks:J d S )Nc                 S   s"   g | ]}|r| d s|d qS )rz   rx   )r~   r%   r   r   r   
<listcomp>   s   z7TestSystemAPIs.test_disk_partitions.<locals>.<listcomp>z\ c                 S   s   g | ]}|j d s|j qS )rz   )r|   r~   r%   r   r   r   r      s   Trv   )r@   ZGetLogicalDriveStringsr0   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"||@ s\J d| d| d S )Nzno common entries in z, )	rs   cextZnet_if_statsrH   rI   ZWin32_NetworkAdapteraddrl   ZNetConnectionID)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ksZJ d S )Nr   .%Y%m%d%H%M%Sr?   )rH   rI   ZWin32_OperatingSystemZLastBootUpTimer0   datetimestrptimefromtimestampr;   	boot_timerf   total_seconds)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ks J W d    n1 s40    Y  t jddd  t dks^J W d    n1 sr0    Y  t jddd  t dksJ W d    n1 s0    Y  t jddd  t dksJ W d    n1 s0    Y  d S )Nz psutil._pswindows.cext.boot_timer?   Zreturn_value      iM  )r   patchr;   r   rQ   r   r   r   test_boot_time_fluctuation  s    ...z)TestSystemAPIs.test_boot_time_fluctuationN)r   r   r   r`   rd   rh   rk   ro   r   ru   r   r   r   r   r   r   r   r   r   r   rY      s   




rY   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 us.J nt d u s.J d S )NZSystemBatteriesPresent)r@   ZGetPwrCapabilitiesr;   sensors_batteryrQ   r   r   r   test_has_battery'  s    z#TestSensorsBattery.test_has_batteryz
no batteryr   c                 C   s:   t  }|dd }t }t|j|j dk s6J d S )Nselect * from Win32_Batteryr   r"   )rH   rI   queryr;   r   rf   rn   ZEstimatedChargeRemainingr=   rL   Zbattery_wmiZbattery_psutilr   r   r   test_percent-  s    zTestSensorsBattery.test_percentc                 C   s6   t  }|dd }t }|j|jdkks2J d S )Nr   r      )rH   rI   r   r;   r   Zpower_pluggedZBatteryStatusr   r   r   r   test_power_plugged7  s    z%TestSensorsBattery.test_power_pluggedc                 C   sL   t jddd*}t d u s J |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   calledr=   mr   r   r   test_emulate_no_battery@  s    z*TestSensorsBattery.test_emulate_no_batteryc                 C   sP   t jddd.}t jtjks$J |js.J W d    n1 sB0    Y  d S )Nr   )r"   r   r   r   r   r   r   r;   r   secsleftZPOWER_TIME_UNLIMITEDr   r   r   r   r   test_emulate_power_connectedH  s    z/TestSensorsBattery.test_emulate_power_connectedc                 C   sP   t jddd.}t jtjks$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_chargingR  s    z.TestSensorsBattery.test_emulate_power_chargingc                 C   sP   t jddd.}t jtjks$J |js.J W d    n1 sB0    Y  d S )Nr   )r   r   r   r   )r   r   r;   r   r   ZPOWER_TIME_UNKNOWNr   r   r   r   r   test_emulate_secs_left_unknown\  s    z1TestSensorsBattery.test_emulate_secs_left_unknownN)r   r   r   r   r   rW   rX   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 r$   r   pidclsr   r   r   
setUpClassm  s    zTestProcess.setUpClassc                 C   s   t | j d S r$   r   r   r   r   r   r   tearDownClassq  s    zTestProcess.tearDownClassc                 C   sB   t d}tt j |  W d    n1 s40    Y  d S rS   )r;   Processr   raisesAccessDeniedkillr=   pr   r   r   test_issue_24u  s    
zTestProcess.test_issue_24c                 C   s   t d}| dksJ t| |  | dks:J z| d d \}}W n& t jyx   t	 d dvrt Y n0 |dksJ d S )Nr   Systemg        r   r"   >   zwin-7ZvistaZwin7r   )
r;   r   namestrusernamecreate_timememory_infor   platformuname)r=   r   rssZ_vmsr   r   r   test_special_pidz  s    
zTestProcess.test_special_pidc                 C   sF   t | j}tt |tj W d    n1 s80    Y  d S r$   )	r;   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sDJ t
| | |ks^J d S )Nr"   )r;   r   r9   getpidnum_handlesr@   OpenProcesswin32conPROCESS_QUERY_INFORMATIONFALSECloseHandle)r=   r   beforehandle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 d    n1 sf0    Y  t
t j |tj W d    n1 s0    Y  d S r$   )r;   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s4J d S )N$zrunning as service account)
r@   ZGetUserNameExr   ZNameSamCompatibleendswithr   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}||ksbJ d S )Nz[ ]+rZ   r   r   r!   r   )
resubr@   ZGetCommandLiner,   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  }||ksFJ d S r$   )r@   r   r   r   r   r9   r   
addCleanupr   win32processZGetPriorityClassr;   r   nice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ksNJ |d |jks`J |d |jksrJ |d |jksJ |d |jksJ |d |jksJ |d |jksJ |d |jksJ |j|jksJ |j|jksJ d S )	NZPeakWorkingSetSizeWorkingSetSizeZQuotaPeakPagedPoolUsageZQuotaPagedPoolUsageZQuotaPeakNonPagedPoolUsageZQuotaNonPagedPoolUsageZPagefileUsageZPeakPagefileUsage)r@   r   r   r   r   r   r   r   r   ZGetProcessMemoryInfor;   r   r   Z	peak_wsetZwsetZpeak_paged_poolZ
paged_poolZpeak_nonpaged_poolZnonpaged_poolZpagefileZpeak_pagefiler   vmsr   r   r   r   test_memory_info  s.    
zTestProcess.test_memory_infoc                 C   sX   t tjtj| j}| t j| t	| j}|
  | }t|}||ksTJ d S r$   )r@   r   r   r   r   r   r   r   r;   r   r   r   r   ZGetExitCodeProcess)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 }||ksXJ 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_affinity)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 ksLJ |j|d ks^J |j|d kspJ |j|d ksJ |j|d ksJ |j|d ksJ d S )NZReadOperationCountZWriteOperationCountZReadTransferCountZWriteTransferCountZOtherOperationCountZOtherTransferCount)r@   r   r   r   r   r9   r   r   r   r   ZGetProcessIoCountersr;   r   io_countersZ
read_countZwrite_count
read_bytes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|J d S )Nr      )ctypesZctypes.wintypesZwindllZkernel32r   r   r   r   ZwintypesZDWORDZGetProcessHandleCountZbyrefvaluer;   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v tdL}t }ttj |	  W d    n1 sZ0    Y  W d    n1 sx0    Y  W d    n1 s0    Y  |j
dksJ d S )Ni+  z psutil._psplatform.cext.proc_cwdZside_effectz
time.sleepr?   )OSErrorwinerrorr   r   r;   r   r   r   r   cwdZ
call_count)r=   excr   r   r   r   r   test_error_partial_copy&  s    bz#TestProcess.test_error_partial_copyc                 C   sT   t  d d }t j|}tt j |  W d    n1 sF0    Y  d S )Nr   i )r;   rt   _psplatformr   r   r   r   exe)r=   r   rF   r   r   r   test_exe1  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   l  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   =  s    zTestProcessWMI.setUpClassc                 C   s   t | j d S r$   r   r   r   r   r   r   A  s    zTestProcessWMI.tearDownClassc                 C   s8   t  j| jdd }t| j}| |jks4J d S Nrp   r   )rH   rI   rr   r   r;   r   r   ZCaptionr=   rL   r   r   r   r   	test_nameE  s    zTestProcessWMI.test_namez!unreliable path on GITHUB_ACTIONSr   c                 C   s@   t  j| jdd }t| j}|  |j ks<J d S r  )	rH   rI   rr   r   r;   r   r   r^   ZExecutablePathr  r   r   r   r   K  s    zTestProcessWMI.test_exec                 C   sF   t  j| jdd }t| j}d| |j	ddksBJ d S )Nrp   r   rZ   r   r!   )
rH   rI   rr   r   r;   r   r-   r   ZCommandLiner]   r  r   r   r   r   U  s    zTestProcessWMI.test_cmdlinec                 C   sR   t  j| jdd }t| j}| \}}}| d| }| |ksNJ d S )Nrp   r   rx   )rH   rI   rr   r   r;   r   ZGetOwnerr   )r=   rL   r   domain_r   r   r   r   r   Z  s
    zTestProcessWMI.test_usernamec                 C   sB   t  j| jdd }t| j}| j}|t|j	ks>J d S r  )
rH   rI   rr   r   r;   r   r   r   r8   r   )r=   rL   r   r   r   r   r   test_memory_rssa  s    
zTestProcessWMI.test_memory_rssc                 C   s`   t  j| jdd }t| j}| j}t|j	}|||d hvr\| 
d| d| d S )Nrp   r   r   zwmi=z	, psutil=)rH   rI   rr   r   r;   r   r   r   r8   ZPageFileUsager_   )r=   rL   r   r   Z	wmi_usager   r   r   test_memory_vmsh  s    

zTestProcessWMI.test_memory_vmsc                 C   s\   t  j| jdd }t| j}t|jdd }t	
dt	| }||ksXJ d S )Nrp   r   r   r   )rH   rI   rr   r   r;   r   r   ZCreationDater0   timestrftime	localtimer   )r=   rL   r   Zwmic_createZpsutil_creater   r   r   test_create_timeu  s    zTestProcessWMI.test_create_timeN)r   r   r   __doc__r  r   r   r  r   rW   rX   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 )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sDJ tt|D ]@}|| dksdJ || dkstJ t	|| ||  dk sPJ qP|j
sJ W d    n1 s0    Y  d S )Nz(psutil._psplatform.cext.proc_memory_infor   r   i   )r;   r   r   r   r   r   PermissionErrorrO   r   rf   r   )r=   Zmem_1funZmem_2r   r   r   r   r     s    z.TestDualProcessImplementation.test_memory_infoc                 C   sd   t | j }tjdtd2}t | j |ks8J |jsBJ W d    n1 sV0    Y  d S )N"psutil._psplatform.cext.proc_timesr   )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dZ}t | j }|js:J t|j	|j	 dk sRJ t|j
|j
 dk sjJ W d    n1 s~0    Y  d S )Nr  r   g{Gz?)r;   r   r   rP   r   r   r  r   rf   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dX}t | j }tt|D ] }t	|| ||  dk s<J q<|j
shJ W d    n1 s|0    Y  d S )Nz(psutil._psplatform.cext.proc_io_countersr   r?   )r;   r   r   r   r   r   r  r   rO   rf   r   )r=   Zio_counters_1r  Zio_counters_2r   r   r   r   r     s    z.TestDualProcessImplementation.test_io_countersc                 C   sd   t | j }tjdtd2}t | j |ks8J |jsBJ W d    n1 sV0    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     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 ||ksJ qd S )NT)Zuse_pebF)	r;   rt   r   Zproc_cmdliner   r   
isinstancer   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PIPESTDOUTcommunicater   r   r   )codefilenamerF   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)supersetUpr)  r   r   r   sys
executableZpython64Zpython32r9   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 r$   )r-  tearDownr3  r%  r4  rQ   r5  r   r   r7    s    

zRemoteProcessTestCase.tearDownc                 C   s@   t | jj}t| dks"J | dd  | jks<J d S N   r"   )r;   r   r3  r   rO   r   r2  r   r   r   r   test_cmdline_32  s    z%RemoteProcessTestCase.test_cmdline_32c                 C   s@   t | jj}t| dks"J | dd  | jks<J d S r8  )r;   r   r4  r   rO   r   r2  r   r   r   r   test_cmdline_64  s    z%RemoteProcessTestCase.test_cmdline_64c                 C   s&   t | jj}| t ks"J d S r$   )r;   r   r3  r   r   r9   getcwdr   r   r   r   test_cwd_32  s    z!RemoteProcessTestCase.test_cwd_32c                 C   s&   t | jj}| t ks"J d S r$   )r;   r   r4  r   r   r9   r<  r   r   r   r   test_cwd_64!  s    z!RemoteProcessTestCase.test_cwd_64c                 C   s>   t | jj}| }d|v s"J |d tt ks:J d S )Nr*  )r;   r   r3  r   r:   r   r9   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 r$   )r;   r   r4  r   r:   r   r   r   r   r   test_environ_64+  s
    z%RemoteProcessTestCase.test_environ_64)r   r   r   r  staticmethodr)  r2  r.  r7  r:  r;  r=  r>  r@  rA  __classcell__r   r   r5  r   r    s   
r  c                   @   s   e Zd Zdd Zdd ZdS )TestServicesc                 C   sR  h d}h d}h d}t  D ]*}| }t|d ts@J |d  sPJ t|d tsbJ t|d tstJ |d |v sJ |d d urt |d  t|d	 tsJ t|d tsJ t|d
 tsJ |d
 |v sJ |d |v sJ t|d tsJ | }|d ur2t |}| s2J t 	|
 }||ks J q d S )N>   continuepausedstoppedstoprunningpausestart>   Z	automaticdisabledZmanual>   Zpause_pendingZstart_pendingrF  rG  rI  Zstop_pendingZcontinue_pendingr   display_namer   statusr   ZbinpathZ
start_typedescription)r;   win_service_iteras_dictr  r   r,   r   r   
is_runningwin_service_getr   )r=   Zvalid_statusesZvalid_start_typesZservr4   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	t j
}t |d  W d    n1 sT0    Y  |jj|d ksrJ t |}tddd}||_tjd|dD t	t j
 |  W d    n1 s0    Y  W d    n1 s0    Y  tjd|dF t	t j
 |  W d    n1 s,0    Y  W d    n1 sL0    Y  tddd}||_tjd|dF t	t j |  W d    n1 s0    Y  W d    n1 s0    Y  tjd|dF t	t j |  W d    n1 s
0    Y  W d    n1 s*0    Y  | t|v sJJ | t|v s`J | t|v svJ | t|v sJ d S )Nz???r   msgz/psutil._psplatform.cext.winservice_query_statusr   z/psutil._psplatform.cext.winservice_query_config)r;   r   r   ERROR_SERVICE_DOES_NOT_EXISTERROR_ACCESS_DENIEDnextrP  r   r   r   r   rS  r   r   r   r   r   rN  r   r   r   rM  repr)r=   rW  rX  r   cmZservicer   r   r   r   test_win_service_getf  sH    
,
DHHHz!TestServices.test_win_service_getN)r   r   r   rU  r\  r   r   r   r   rD  8  s   ,rD  )5r  r   r   r9   r   r   r   r   r!  r/  r
  warningsZunittestr   r;   r   Zpsutil.testsr   r   r   r   r   r	   r
   r   r   r   r   r   catch_warningssimplefilterr@   r   r   rH   Zpsutil._pswindowsr   r   r   rW   rX   r   r    r8   r5   r6   rY   r   r   r  r  r  rD  r   r   r   r   <module>   sl   

(( F OHW]