U
    ;g[d                    @   s  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ 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rddl.m/Z/ dd l.m0Z0 dd!l.m1Z1 dd"l.m2Z2 ej34ej35e6Z7d#Z8d$Z9d%Z:d&Z;d'Z<er,d(Z=ed) Z>d*d+ Z?d,d- Z@d.d/ ZAd0d1 ZBd2d3 ZCd4d5 ZDd6d7 ZEd8d9 ZFd:d; ZGejHd<d= ZIejHd>d? ZJe'jKjLe d@dAG dBdC dCe#ZMe'jKjLe d@dAG dDdE dEe#ZNe'jKjLe d@dAG dFdG dGe#ZOe'jKjLe d@dAG dHdI dIe#ZPe'jKjLe d@dAG dJdK dKe#ZQe'jKjLe d@dAG dLdM dMe#ZRe'jKjLe d@dAG dNdO dOe#ZSe'jKjLe d@dAG dPdQ dQe#ZTe'jKjLe d@dAG dRdS dSe#ZUe'jKjLe d@dAG dTdU dUe#ZVe'jKjLe d@dAG dVdW dWe#ZWe'jKjLe d@dAe'jKjLe dXdAG dYdZ dZe#ZXe'jKjLe d@dAG d[d\ d\e#ZYe'jKjLe d@dAG d]d^ d^e#ZZe'jKjLe d@dAG d_d` d`e#Z[e'jKjLe d@dAG dadb dbe#Z\e'jKjLe d@dAG dcdd dde#Z]e'jKjLe d@dAG dedf dfe#Z^e'jKjLe d@dAe'jKjLe dgdAG dhdi die#Z_e'jKjLe d@dAG djdk dke#Z`e'jKjLe d@dAG dldm dme#Zae'jKjLe d@dAG dndo doe#Zbe'jKjLe d@dAG dpdq dqe#Zce'jKjLe d@dAG drds dse#Zde'jKjLe d@dAG dtdu due#ZedS )vzLinux specific tests.    )divisionN)LINUX)PY3)FileNotFoundError)
basestring)AARCH64)GITHUB_ACTIONS)GLOBAL_TIMEOUT)HAS_BATTERY)HAS_CPU_FREQ)HAS_GETLOADAVG)
HAS_RLIMIT)PYPY)PYTEST_PARALLEL)	QEMU_USER)TOLERANCE_DISK_USAGE)TOLERANCE_SYS_MEM)PsutilTestCase)
ThreadTask)
call_until)mock)pytest)reload_module)retry_on_failure)safe_rmpath)sh)skip_on_not_implemented)which)CLOCK_TICKS)RootFsDeviceFinder)calculate_avail_vmem)open_binaryi  i  i'  i  i  i   z/sys/class/hwmon/hwmon*c                 C   s|   dd l }| d d } tr"t| d} ttjtj}t|6 t|	|
 ttd| dd W  5 Q R  S Q R X d S Nr      ascii256s      )fcntlr   bytessocketAF_INET
SOCK_DGRAM
contextlibclosing	inet_ntoaioctlfilenoSIOCGIFADDRstructpackifnamer(   s r8   ;/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_linux.pyget_ipv4_addressN   s    
 r:   c                 C   s|   dd l }| d d } tr"t| d} ttjtj}t|6 t|	|
 ttd| dd W  5 Q R  S Q R X d S r"   )r(   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   SIOCGIFNETMASKr3   r4   r5   r8   r8   r9   get_ipv4_netmask]   s     
  
 r<   c                 C   s|   dd l }| d d } tr"t| d} ttjtj}t|6 t|	|
 ttd| dd W  5 Q R  S Q R X d S r"   )r(   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   SIOCGIFBRDADDRr3   r4   r5   r8   r8   r9   get_ipv4_broadcastl   s     
  
 r>   c              	   C   s   t dJ}g }|D ]"}| }|d | kr|| qt|dkrNtd|  W 5 Q R X tt|D ]j}|| d }g }tdt|dD ]}||||d   qd|}	ttj	|	}
t
tj	|
||< qd|S )Nz/proc/net/if_inet6r   zcould not find interface %r   :)opensplitappendlen
ValueErrorrangejoinr*   	inet_ptonAF_INET6	inet_ntop)r6   fZ
all_fieldslinefieldsiZunformattedgroupsj	formattedpackedr8   r8   r9   get_ipv6_addresses{   s"    

rT   c              
      s   dd l }| d d } tr"t| d} ttjtj}t|l ||	 t
td| }trfdd  ndd l}|j d fdd	|d
d D d d W  5 Q R  S Q R X d S )Nr   r#   r$   r%   c                 S   s   | S Nr8   xr8   r8   r9   ord   s    zget_mac_address.<locals>.ord c                    s   g | ]}d  | qS )z%02x:r8   ).0charrX   r8   r9   
<listcomp>   s     z#get_mac_address.<locals>.<listcomp>   r'   r?   )r(   r   r)   r*   r+   r,   r-   r.   r0   r1   SIOCGIFHWADDRr3   r4   __builtin__rX   rH   )r6   r(   r7   infor`   r8   r\   r9   get_mac_address   s     
  

rb   c                  C   s   t ddgddid} | d}|D ]F}|dr"| \}}}}tdd}|t|t|t|  S q"td	d| d
S )zQParse 'free' cmd and return swap memory's s total, used and free
    values.
    free-bLANGC.UTF-8env
ZSwapztotal used freez&can't find 'Swap' in 'free' output:
%sN)r   rC   
startswithcollections
namedtupleintrF   rH   )outlinesrM   _totalusedrc   ntr8   r8   r9   	free_swap   s    

rt   c                  C   s   t ddgddid} | d}|D ]P}|dr"dd	 | d
d D \}}}}tdd}||||||   S q"tdd| dS )zSParse 'free' cmd and return physical memory's total, used
    and free values.
    rc   rd   re   rf   rg   ri   ZMemc                 s   s   | ]}t |V  qd S rU   )rm   rZ   rW   r8   r8   r9   	<genexpr>   s     zfree_physmem.<locals>.<genexpr>      ztotal used free shared outputz%can't find 'Mem' in 'free' output:
%sN)r   rC   rj   rk   rl   rF   rH   )rn   ro   rM   rq   rr   rc   sharedrs   r8   r8   r9   free_physmem   s    

" rz   c                 C   sZ   t ddgddid}|dD ]*}| }| |krt|dd   S qtd	|  d S )
Nvmstatz-sre   rf   rg   ri    r   z can't find %r in 'vmstat' output)r   rC   striprm   rF   )statrn   rM   r8   r8   r9   r{      s    r{   c                  C   s@   t ddg } d| kr"tdttttd| 	 d S )Nrc   z-VUNKNOWNzcan't determine free versionz\d+r?   )
r   r}   r   skiptuplemaprm   refindallrC   )rn   r8   r8   r9   get_free_version_info   s    
r   c              	   #   sD    fdd}t  trdnd}tj|d|d}|V  W 5 Q R X dS )zMock open() builtin and forces it to return a certain content
    for a given path. `pairs` is a {"path": "content", ...} dict.
    c                    sT   | kr@|  }t r4t|tr(t|S t|S qPt|S n | f||S d S rU   )r   
isinstancer   ioStringIOBytesIO)nameargskwargscontent	orig_openpairsr8   r9   	open_mock   s    

z$mock_open_content.<locals>.open_mockbuiltins.open__builtin__.openTcreateside_effectNrB   r   r   patch)r   r   patch_pointmr8   r   r9   mock_open_content   s
    r   c              	   #   sF    fdd}t trdnd}tj|d|d}|V  W 5 Q R X dS )zZMock open() builtin and raises `exc` if the path being opened
    matches `for_path`.
    c                    s"   | kr n| f||S d S rU   r8   r   r   r   excfor_pathr   r8   r9   r      s    z&mock_open_exception.<locals>.open_mockr   r   Tr   Nr   )r   r   r   r   r   r8   r   r9   mock_open_exception   s
    r   z
LINUX onlyreasonc                   @   sL   e Zd Zdd Ze dd Ze dd Ze dd Ze d	d
 ZdS )"TestSystemVirtualMemoryAgainstFreec                 C   s"   t  j}t j}||kstd S rU   )rz   rq   psutilvirtual_memoryAssertionErrorselfZ	cli_valuepsutil_valuer8   r8   r9   
test_total  s    
z-TestSystemVirtualMemoryAgainstFree.test_totalc                 C   sR   t  dk rtdt  dkr(tdt j}t j}t|| tk sNt	d S )N   r      free version too oldr@   r   r   free version too recent)
r   r   r   rz   rr   r   r   absr   r   r   r8   r8   r9   	test_used  s    





z,TestSystemVirtualMemoryAgainstFree.test_usedc                 C   s*   t  j}t j}t|| tk s&td S rU   )rz   rc   r   r   r   r   r   r   r8   r8   r9   	test_free'  s    
z,TestSystemVirtualMemoryAgainstFree.test_freec                 C   sP   t  }|j}|dkrtdt j}t|| tk sLtd|||j	f d S )Nr   z%free does not support 'shared' column	%s %s 
%s)
rz   ry   r   r   r   r   r   r   r   output)r   rc   
free_valuer   r8   r8   r9   test_shared-  s    

z.TestSystemVirtualMemoryAgainstFree.test_sharedc                 C   sr   t ddg}|d}d|d kr.tdn@t|d  d }t j}t|| t	k snt
d	|||f d S )
Nrc   rd   ri   	availabler   z(free does not support 'available' columnrw   r?   r   )r   rC   r   r   rm   r   r   r   r   r   r   )r   rn   ro   r   r   r8   r8   r9   test_available8  s    

z1TestSystemVirtualMemoryAgainstFree.test_availableN)	__name__
__module____qualname__r   r   r   r   r   r   r8   r8   r8   r9   r     s   



r   c                   @   sZ   e Zd Zdd Ze dd Ze dd Ze dd Ze d	d
 Ze dd Z	dS )$TestSystemVirtualMemoryAgainstVmstatc                 C   s.   t dd }t j}t|| tk s*td S )Nztotal memory   )r{   r   r   rq   r   r   r   r   Zvmstat_valuer   r8   r8   r9   r   J  s    
z/TestSystemVirtualMemoryAgainstVmstat.test_totalc                 C   sV   t  dk rtdt  dkr(tdtdd }t j}t|| tk sRt	d S )Nr   r   r   r   zused memoryr   )
r   r   r   r{   r   r   rr   r   r   r   r   r8   r8   r9   r   O  s    





z.TestSystemVirtualMemoryAgainstVmstat.test_usedc                 C   s.   t dd }t j}t|| tk s*td S )Nzfree memoryr   )r{   r   r   rc   r   r   r   r   r8   r8   r9   r   a  s    
z.TestSystemVirtualMemoryAgainstVmstat.test_freec                 C   s.   t dd }t j}t|| tk s*td S )Nzbuffer memoryr   )r{   r   r   buffersr   r   r   r   r8   r8   r9   test_buffersg  s    
z1TestSystemVirtualMemoryAgainstVmstat.test_buffersc                 C   s.   t dd }t j}t|| tk s*td S )Nzactive memoryr   )r{   r   r   activer   r   r   r   r8   r8   r9   test_activem  s    
z0TestSystemVirtualMemoryAgainstVmstat.test_activec                 C   s.   t dd }t j}t|| tk s*td S )Nzinactive memoryr   )r{   r   r   inactiver   r   r   r   r8   r8   r9   test_inactives  s    
z2TestSystemVirtualMemoryAgainstVmstat.test_inactiveN)
r   r   r   r   r   r   r   r   r   r   r8   r8   r8   r9   r   H  s   



r   c                   @   sB   e Zd Zdd Ze dd Zdd Zdd Zd	d
 Zdd Z	dS )TestSystemVirtualMemoryMocksc              
   C   sd  t d }td|i>}tjdd$}td t }|j	sJt
t|dksZt
|d }dt|jkstt
d	t|jkst
d
t|jkst
dt|jkst
dt|jkst
dt|jkst
dt|jkst
|jdkst
|jdkst
|jdkst
|jdkst
|jdks,t
|jdks<t
|jdksLt
W 5 Q R X W 5 Q R X d S )NaL              Active(anon):    6145416 kB
            Active(file):    2950064 kB
            Inactive(anon):   574764 kB
            Inactive(file):  1567648 kB
            MemAvailable:         -1 kB
            MemFree:         2057400 kB
            MemTotal:       16325648 kB
            SReclaimable:     346648 kB
            /proc/meminfoTrecordalwaysrw   r   z#memory stats couldn't be determinedcachedry   r   r   r   r   )textwrapdedentencoder   warningscatch_warningssimplefilterr   r   calledr   rE   strmessager   r   r   ry   r   r   slabr   r   r   wsretwr8   r8   r9   test_warnings_on_misses|  s,    


z4TestSystemVirtualMemoryMocks.test_warnings_on_missesc              	   C   s~   i }t d0}|D ]$}| }t|d d ||d < qW 5 Q R X t|}d|krz|d }t|| | d }|dk sztd S )Nr   rw   r   r   s   MemAvailable:d   r#   )r!   rC   rm   r    r   r   )r   ZmemsrL   rM   rN   abZdiff_percentr8   r8   r9   test_avail_old_percent  s    
$z3TestSystemVirtualMemoryMocks.test_avail_old_percentc              
   C   s|   t d }td|iX}tjdd}t }W 5 Q R X |jsFt	|j
dksTt	|d }dt|jksnt	W 5 Q R X d S )Na              Active:          9444728 kB
            Active(anon):    6145416 kB
            Active(file):    2950064 kB
            Buffers:          287952 kB
            Cached:          4818144 kB
            Inactive(file):  1578132 kB
            Inactive(anon):   574764 kB
            Inactive(file):  1567648 kB
            MemAvailable:    6574984 kB
            MemFree:         2057400 kB
            MemTotal:       16325648 kB
            Shmem:            577588 kB
            SReclaimable:     346648 kB
            r   Tr   l     " r   ,inactive memory stats couldn't be determinedr   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r8   r9    test_avail_old_comes_from_kernel  s    
z=TestSystemVirtualMemoryMocks.test_avail_old_comes_from_kernelc              
   C   s|   t d }td|iX}tjdd}t }W 5 Q R X |jsFt	|j
dksTt	|d }dt|jksnt	W 5 Q R X d S )Nat              Active:          9444728 kB
            Active(anon):    6145416 kB
            Buffers:          287952 kB
            Cached:          4818144 kB
            Inactive(file):  1578132 kB
            Inactive(anon):   574764 kB
            MemFree:         2057400 kB
            MemTotal:       16325648 kB
            Shmem:            577588 kB
            r   Tr       `LG r   r   r   r   r8   r8   r9   test_avail_old_missing_fields  s    
z:TestSystemVirtualMemoryMocks.test_avail_old_missing_fieldsc                 C   s   t d }td|il tdttjdN tj	dd6}t
 }|jdksTt|d }d	t|jksntW 5 Q R X W 5 Q R X W 5 Q R X d S )
Na              Active:          9444728 kB
            Active(anon):    6145416 kB
            Active(file):    2950064 kB
            Buffers:          287952 kB
            Cached:          4818144 kB
            Inactive(file):  1578132 kB
            Inactive(anon):   574764 kB
            Inactive(file):  1567648 kB
            MemFree:         2057400 kB
            MemTotal:       16325648 kB
            Shmem:            577588 kB
            SReclaimable:     346648 kB
            r   z/proc/zoneinfono such file or directoryTr   r   r   r   )r   r   r   r   r   IOErrorerrnoENOENTr   r   r   r   r   r   r   r   )r   r   r   r   r   r8   r8   r9   test_avail_old_missing_zoneinfo  s    
z<TestSystemVirtualMemoryMocks.test_avail_old_missing_zoneinfoc              	   C   s   t d }td|i}t }|js.t|jdks<t|j	dksJt|j
dksXt|jdksft|jdkstt|jdkst|jd	kst|jd
kst|jdkstW 5 Q R X d S )Na              MemTotal:              100 kB
            MemFree:               2 kB
            MemAvailable:          3 kB
            Buffers:               4 kB
            Cached:                5 kB
            SwapCached:            6 kB
            Active:                7 kB
            Inactive:              8 kB
            Active(anon):          9 kB
            Inactive(anon):        10 kB
            Active(file):          11 kB
            Inactive(file):        12 kB
            Unevictable:           13 kB
            Mlocked:               14 kB
            SwapTotal:             15 kB
            SwapFree:              16 kB
            Dirty:                 17 kB
            Writeback:             18 kB
            AnonPages:             19 kB
            Mapped:                20 kB
            Shmem:                 21 kB
            Slab:                  22 kB
            SReclaimable:          23 kB
            SUnreclaim:            24 kB
            KernelStack:           25 kB
            PageTables:            26 kB
            NFS_Unstable:          27 kB
            Bounce:                28 kB
            WritebackTmp:          29 kB
            CommitLimit:           30 kB
            Committed_AS:          31 kB
            VmallocTotal:          32 kB
            VmallocUsed:           33 kB
            VmallocChunk:          34 kB
            HardwareCorrupted:     35 kB
            AnonHugePages:         36 kB
            ShmemHugePages:        37 kB
            ShmemPmdMapped:        38 kB
            CmaTotal:              39 kB
            CmaFree:               40 kB
            HugePages_Total:       41 kB
            HugePages_Free:        42 kB
            HugePages_Rsvd:        43 kB
            HugePages_Surp:        44 kB
            Hugepagesize:          45 kB
            DirectMap46k:          46 kB
            DirectMap47M:          47 kB
            DirectMap48G:          48 kB
            r   i  i      i p  i T  i   i    i X     )r   r   r   r   r   r   r   r   rq   rc   r   r   ry   r   r   r   r   )r   r   r   Zmemr8   r8   r9   test_virtual_memory_mocked  s    2
z7TestSystemVirtualMemoryMocks.test_virtual_memory_mockedN)
r   r   r   r   r   r   r   r   r   r   r8   r8   r8   r9   r   z  s   $
r   c                   @   s\   e Zd Zedd Z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 )TestSystemSwapMemoryc               	   C   s,   t d} |  }W 5 Q R X d|ko*d|kS )z3Return True if /proc/meminfo provides swap metrics.r   z
SwapTotal:z	SwapFree:)rB   read)rL   datar8   r8   r9   meminfo_has_swap_infoN  s    
z*TestSystemSwapMemory.meminfo_has_swap_infoc                 C   s*   t  j}t j}t|| tk s&td S rU   )rt   rq   r   swap_memoryr   r   r   r   r   r   r8   r8   r9   r   U  s    
zTestSystemSwapMemory.test_totalc                 C   s*   t  j}t j}t|| tk s&td S rU   )rt   rr   r   r   r   r   r   r   r8   r8   r9   r   Z  s    
zTestSystemSwapMemory.test_usedc                 C   s*   t  j}t j}t|| tk s&td S rU   )rt   rc   r   r   r   r   r   r   r8   r8   r9   r   `  s    
zTestSystemSwapMemory.test_freec              
   C   s   t jddd}tjddh}td t }|js:tt	|dksJt|d }dt
|jksdt|jdksrt|jdkstW 5 Q R X W 5 Q R X d S )	Npsutil._common.openTr   r   r   rw   r   z9'sin' and 'sout' swap memory stats couldn't be determined)r   r   r   r   r   r   r   r   r   rE   r   r   sinsoutr   r   r   r   r   r8   r8   r9   test_missing_sin_soutf  s    

z*TestSystemSwapMemory.test_missing_sin_soutc              
   C   s   t dttjd}tjddh}td t }|j	s>t
t|dksNt
|d }dt|jksht
|jdksvt
|jdkst
W 5 Q R X W 5 Q R X d S )	Nz/proc/vmstatr   Tr   r   rw   r   zK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)r   r   r   r   r   r   r   r   r   r   r   rE   r   r   r   r   r   r8   r8   r9   test_no_vmstat_mockedu  s"     


z*TestSystemSwapMemory.test_no_vmstat_mockedc              	   C   s   |   stdtd}t }W 5 Q R X |jr:tdd l	m
} | \}}}}}}}||9 }||9 }|j|ksztt|j| tk std S )Nz!/proc/meminfo has no swap metricsz"psutil._pslinux.cext.linux_sysinfor   )r   r   r   r   r   r   r   r   r   Zpsutil._psutil_linuxZ_psutil_linuxZlinux_sysinforq   r   rc   r   )r   r   swapZcextrp   rq   rc   Zunit_multiplierr8   r8   r9   test_meminfo_against_sysinfo  s    

z1TestSystemSwapMemory.test_meminfo_against_sysinfoc              	   C   s.   t ddi}t  |js tW 5 Q R X d S )Nr       )r   r   r   r   r   r   r   r8   r8   r9   #test_emulate_meminfo_has_no_metrics  s    z8TestSystemSwapMemory.test_emulate_meminfo_has_no_metricsN)r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r8   r8   r8   r9   r   L  s   


r   c                   @   s   e Zd Zdd ZdS )TestSystemCPUTimesc                 C   s   t  j}tdt d d }ttt	|
d}|dkrLd|ksXtnd|ksXt|dkrnd|ksztnd|kszt|d	krd
|kstnd
|kstd S )Nz\d+\.\d+\.\d+   r   .)r         steal)r   r  r'   Zguest)r   r   r   Z
guest_nice)r   	cpu_times_fieldsr   r   osunamer   r   rm   rC   r   )r   rN   Z
kernel_verZkernel_ver_infor8   r8   r9   test_fields  s    
zTestSystemCPUTimes.test_fieldsN)r   r   r   r	  r8   r8   r8   r9   r     s   r   c                   @   s   e Zd Zejjejd dddd Z	ejjejd dddd	 Z
ejjed
 dddd Zejjed dddd Zdd ZdS )TestSystemCPUCountLogical/sys/devices/system/cpu/onlinez-/sys/devices/system/cpu/online does not existr   c              	   C   sV   t d}|  }W 5 Q R X dt|krRt|dd d }t |ksRtd S )Nr  -rw   )	rB   r   r}   r   rm   rC   r   	cpu_countr   )r   rL   valuer8   r8   r9   test_against_sysdev_cpu_online  s
    
z8TestSystemCPUCountLogical.test_against_sysdev_cpu_online/sys/devices/system/cpuz&/sys/devices/system/cpu does not existc                 C   s0   t d}tdd |D }t |ks,td S )Nr  c                 S   s    g | ]}t d |dk	r|qS )zcpu\d+$N)r   searchru   r8   r8   r9   r]     s      zITestSystemCPUCountLogical.test_against_sysdev_cpu_num.<locals>.<listcomp>)r  listdirrE   r   r  r   )r   Zlscountr8   r8   r9   test_against_sysdev_cpu_num  s    
z5TestSystemCPUCountLogical.test_against_sysdev_cpu_numZnprocznproc utility not availablec                 C   s$   t td}tjdd|ks td S )Nznproc --allTlogical)rm   r   r   r  r   )r   numr8   r8   r9   test_against_nproc  s    z,TestSystemCPUCountLogical.test_against_nproclscpulscpu utility not availablec                 C   s8   t d}tdd |dD }tjdd|ks4td S )Nlscpu -pc                 S   s   g | ]}| d s|qS )#rj   ru   r8   r8   r9   r]     s     
 z@TestSystemCPUCountLogical.test_against_lscpu.<locals>.<listcomp>ri   Tr  )r   rE   rC   r   r  r   )r   rn   r  r8   r8   r9   test_against_lscpu  s    z,TestSystemCPUCountLogical.test_against_lscpuc              
   C   s,  dd l }|j }tjdtd }|j |ks6t|js@ttjddd<}|j d ksbt|jdkspt|j	d d dkstW 5 Q R X t
d	d
}| }W 5 Q R X t|}tjd|dd}|j |kstW 5 Q R X td	di&}|j |kst|jstW 5 Q R X W 5 Q R X d S )Nr   zpsutil._pslinux.os.sysconfr   r   Tr   r   
/proc/stat/proc/cpuinforbreturn_valuer   r   )psutil._pslinux_pslinuxZcpu_count_logicalr   r   rF   r   r   Z
call_countZ	call_argsrB   r   r   r   r   )r   r   originalr   rL   Zcpuinfo_data	fake_filer8   r8   r9   test_emulate_fallbacks  s4    
 
 
  z0TestSystemCPUCountLogical.test_emulate_fallbacksN)r   r   r   r   markskipifr  pathexistsr  r  r   r  r  r)  r8   r8   r8   r9   r
    s*   

 
 
r
  c                   @   s:   e Zd Zejjed dddd Zdd Zdd	 Z	d
S )TestSystemCPUCountCoresr  r  r   c                 C   s\   t d}t }|dD ]&}|ds|d}||d  qtjddt|ksXtd S )Nr  ri   r  ,rw   Fr  )	r   setrC   rj   addr   r  rE   r   )r   rn   Zcore_idsrM   rN   r8   r8   r9   r    s    

z*TestSystemCPUCountCores.test_against_lscpuc              	   C   sP   t j }tjdg d}t j }|js.tW 5 Q R X |d k	rL||ksLtd S )N	glob.globr$  )r   r&  cpu_count_coresr   r   r   r   )r   Zmeth_1r   Zmeth_2r8   r8   r9   test_method_2  s    

z%TestSystemCPUCountCores.test_method_2c              
   C   s^   t jdg d2}t jddd}tj d ks2tW 5 Q R X W 5 Q R X |jsPt|jsZtd S )Nr2  r3  r   Tr   )r   r   r   r&  r4  r   r   )r   m1m2r8   r8   r9   test_emulate_none  s
    &
z)TestSystemCPUCountCores.test_emulate_noneN)
r   r   r   r   r*  r+  r   r  r5  r8  r8   r8   r8   r9   r.    s    
	r.  c                   @   s   e Zd Zejje dddd Zejje ddejjedddd Z	ejje dddd	 Z
ejje ddd
d Zejje dddd ZdS )TestSystemCPUFrequencynot supportedr   c              	      s@    fdd}t jj tjd|dd t s2tW 5 Q R X d S )Nc                    s   |  drdS  | S d S )N&/sys/devices/system/cpu/cpufreq/policyFr  r,  Zorig_existsr8   r9   path_exists_mock(  s    
zMTestSystemCPUFrequency.test_emulate_use_second_file.<locals>.path_exists_mockos.path.existsT)r   r   )r  r,  r-  r   r   r   cpu_freqr   )r   r>  r8   r=  r9   test_emulate_use_second_file%  s      z3TestSystemCPUFrequency.test_emulate_use_second_filez,aarch64 does not report mhz in /proc/cpuinfoc              	      s    fdd}t jj ztjd|dn ttj t }|sDt	||j
dksRt	|jdks`t	tjddD ] }|j
dks~t	|jdkslt	qlW 5 Q R X W 5 ttj tt X d S )Nc                    s   |  drdS  | S d S )Nz/sys/devices/system/cpu/Fr  r<  Zos_path_existsr8   r9   r>  ;  s    
zITestSystemCPUFrequency.test_emulate_use_cpuinfo.<locals>.path_exists_mockr?  r          TZpercpu)r  r,  r-  r   r   r&  r   r   r@  r   maxmin)r   r>  r   freqr8   rB  r9   test_emulate_use_cpuinfo4  s    

z/TestSystemCPUFrequency.test_emulate_use_cpuinfoc              
      s    fdd}t  trdnd}tj||df tjdddL t }|jd	ksRt|jd
krj|jdksjt|j	d
kr|j	dkstW 5 Q R X W 5 Q R X d S )Nc                    s   |  dr| drtdS |  dr<| dr<tdS |  drZ| drZtdS | dkrltd	S  | f||S d S )
N/scaling_cur_freqr;     500000/scaling_min_freq   600000/scaling_max_freqs   700000r!  s   cpu MHz     : 500endswithrj   r   r   r   r   r8   r9   r   R  s    



z;TestSystemCPUFrequency.test_emulate_data.<locals>.open_mockr   r   r  r?  Tr3       @@rC       @g     @
rB   r   r   r   r   r@  currentr   rF  rE  r   r   r   rG  r8   rP  r9   test_emulate_dataP  s    

z(TestSystemCPUFrequency.test_emulate_datac                    s   fdd}t  trdnd}tj||d tjddd tjd	d
d tjdd}|d jdksjt|d jdkr|d jdkst|d j	dkr|d j	dkst|d jdkst|d jdkr|d jdkst|d j	dkr|d j	dkstW 5 Q R X W 5 Q R X W 5 Q R X d S )Nc                    s   | }| dr"|dr"tdS | dr@|dr@tdS | dr^|dr^tdS | dr||dr|td	S | dr|drtd
S | dr|drtdS | dkrtdS  | f||S d S )NrI  z'/sys/devices/system/cpu/cpufreq/policy0s   100000rK     200000rM  s   300000z'/sys/devices/system/cpu/cpufreq/policy1s   400000rJ  rL  r!  s#   cpu MHz     : 100
cpu MHz     : 400rN  )r   r   r   nrP  r8   r9   r   s  s8    






z@TestSystemCPUFrequency.test_emulate_multi_cpu.<locals>.open_mockr   r   r  r?  Tr3  !psutil._pslinux.cpu_count_logicalr   rD  r         Y@rC  g      i@g     r@rw   g      y@rQ  rR  rS  rU  r8   rP  r9   test_emulate_multi_cpuq  s(     z-TestSystemCPUFrequency.test_emulate_multi_cpuc                    s    fdd}t  trdnd}tj||dP tjddd6 tjd	d
d t }|jdksbtW 5 Q R X W 5 Q R X W 5 Q R X d S )Nc                    sR   |  drttjdn6|  dr,tdS | dkr>tdS  | f||S d S )NrI  rY   z/cpuinfo_cur_freqrW  r!  s   cpu MHz     : 200)rO  r   r   r   r   r   r   rP  r8   r9   r     s    



zOTestSystemCPUFrequency.test_emulate_no_scaling_cur_freq_file.<locals>.open_mockr   r   r  r?  Tr3  rY  rw      )rB   r   r   r   r   r@  rT  r   rU  r8   rP  r9   %test_emulate_no_scaling_cur_freq_file  s    
 z<TestSystemCPUFrequency.test_emulate_no_scaling_cur_freq_fileN)r   r   r   r   r*  r+  r   rA  r   rH  rV  r[  r]  r8   r8   r8   r9   r9  #  s   
 
 
3r9  c                   @   s   e Zd Zdd ZdS )TestSystemCPUStatsc                 C   s*   t d}t j}t|| dk s&td S )N
interruptsi  )r{   r   Z	cpu_statsr_  r   r   r   r8   r8   r9   test_interrupts  s    
z"TestSystemCPUStats.test_interruptsN)r   r   r   r`  r8   r8   r8   r9   r^    s   	r^  c                   @   s&   e Zd Zejje dddd ZdS )TestLoadAvgr:  r   c              	   C   s   t  }td}|  }W 5 Q R X tt|d |d  dk sHttt|d |d  dk shttt|d |d  dk std S )Nz/proc/loadavgr   rw   r   )r   
getloadavgrB   r   rC   r   floatr   )r   r   rL   Z
proc_valuer8   r8   r9   test_getloadavg  s    
  zTestLoadAvg.test_getloadavgN)r   r   r   r   r*  r+  r   rd  r8   r8   r8   r9   ra    s   ra  c                   @   s   e Zd Zdd ZdS )TestSystemNetIfAddrsc                 C   s   t   D ]\}}|D ]}|jt jkr<|jt|kstq|jtj	kr|jt
|ksZt|jt|kslt|jd k	r|jt|kstqt|dkstq|jtjkr|jdd }|t|kstqqd S )Nz0.0.0.0%r   )r   Znet_if_addrsitemsfamilyZAF_LINKaddressrb   r   r*   r+   r:   netmaskr<   	broadcastr>   rJ   rC   rT   )r   r   addrsaddrri  r8   r8   r9   test_ips  s    
zTestSystemNetIfAddrs.test_ipsN)r   r   r   rn  r8   r8   r8   r9   re    s   re  QEMU user not supportedc                   @   sP   e Zd Zejjed dddd Zdd Zejjed dddd	 Z	d
S )TestSystemNetIfStatsifconfigifconfig utility not availabler   c              	   C   st   t   D ]b\}}ztd| }W n tk
r8   Y qX |jd|kksPt||jtt	
d|d kstqd S )Nifconfig %sZRUNNINGz(?i)MTU[: ](\d+)r   )r   net_if_statsrg  r   RuntimeErrorZisupr   mturm   r   r   )r   r   statsrn   r8   r8   r9   test_against_ifconfig	  s    z*TestSystemNetIfStats.test_against_ifconfigc              
   C   sL   t   D ]:\}}td|  }|jt|  ks<tW 5 Q R X qd S )Nz/sys/class/net/%s/mtu)	r   rt  rg  rB   rv  rm   r   r}   r   )r   r   rw  rL   r8   r8   r9   test_mtu  s    zTestSystemNetIfStats.test_mtuc              	   C   s  d}t   D ]\}}ztd| }W n tk
r<   Y qX td|}|rt| dkr|d7 }t	|
d d}t	|jd}||kstqtd|}|rt| dkr|d7 }t	|
d  }t	|jd}||kstq|s| d	d S )
Nr   rs  zflags=(\d+)?<(.*?)>r   rw   r/  z(.*)  MTU:(\d+)  Metric:(\d+)r   zno matches were found)r   rt  rg  r   ru  r   r  rE   rP   r0  grouplowerrC   flagsr   fail)r   Zmatches_foundr   rw  rn   matchZifconfig_flagsZpsutil_flagsr8   r8   r9   
test_flags  s(    zTestSystemNetIfStats.test_flagsN)
r   r   r   r   r*  r+  r   rx  ry  r  r8   r8   r8   r9   rp    s    
 rp  c                   @   s0   e Zd Zejjed dde dd ZdS )TestSystemNetIOCountersrq  rr  r   c              	   C   s&  dd }t jddd}| D ] \}}z||}W n tk
rL   Y qY nX t|j|d  dk shtt|j|d  dk stt|j|d	  d
k stt|j	|d  d
k stt|j
|d  dk stt|j|d  dk stt|j|d  dk stt|j|d  dk stqd S )Nc                 S   s   i }t d|  }ttd|d |d< ttd|d |d< ttd|d |d< ttd|d	 |d
< ttd|d |d< ttd|d	 |d< ttd|d |d< ttd|d |d< |S )Nrs  zRX packets[: ](\d+)r   packets_recvzTX packets[: ](\d+)packets_sentzerrors[: ](\d+)errinrw   erroutzdropped[: ](\d+)dropindropoutz#RX (?:packets \d+ +)?bytes[: ](\d+)
bytes_recvz#TX (?:packets \d+ +)?bytes[: ](\d+)
bytes_sent)r   rm   r   r   )Znicr   rn   r8   r8   r9   rq  E  s&    z?TestSystemNetIOCounters.test_against_ifconfig.<locals>.ifconfigTF)Zpernicnowrapr  i (  r  r  r   r  r  
   r  r  r  )r   net_io_countersrg  ru  r   r  r   r  r  r  r  r  r  r  )r   rq  Znior   rw  Zifconfig_retr8   r8   r9   rx  @  s&    
z-TestSystemNetIOCounters.test_against_ifconfigN)	r   r   r   r   r*  r+  r   r   rx  r8   r8   r8   r9   r  >  s    r  c                   @   s8   e Zd Zejdedejddddd Zdd	 Zd
S )TestSystemNetConnectionsz psutil._pslinux.socket.inet_ntopr  zpsutil._pslinux.supports_ipv6Fr3  c                 C   sR   z*t  t jt j}| |j |d W n t jk
r@   Y nX tjdd d S )N)z::1r   Zinet6kind)	r*   rJ   SOCK_STREAMZ
addCleanupclosebinderrorr   net_connections)r   Zsupports_ipv6rK   r7   r8   r8   r9   test_emulate_ipv6_unsupportedt  s    z6TestSystemNetConnections.test_emulate_ipv6_unsupportedc              	   C   s<   t d}td|i}tjdd |js.tW 5 Q R X d S )Na              0: 00000003 000 000 0001 03 462170 @/tmp/dbus-Qw2hMPIU3n
            0: 00000003 000 000 0001 03 35010 @/tmp/dbus-tB2X8h69BQ
            0: 00000003 000 000 0001 03 34424 @/tmp/dbus-cHy80Y8O
            000000000000000000000000000000000000000000000000000000
            z/proc/net/unixunixr  )r   r   r   r   r  r   r   )r   r   r   r8   r8   r9   test_emulate_unix  s    
z*TestSystemNetConnections.test_emulate_unixN)r   r   r   r   r   rF   r  r  r8   r8   r8   r9   r  r  s   
r  c                   @   sB   e Zd Zejjeed dde dd Z	dd Z
dd	 Zd
S )TestSystemDiskPartitionsstatvfszos.statvfs() not availabler   c                 C   sv   dd }t jddD ]\}t |j}||j\}}}}|j|ksDtt|j| tk sZtt|j	| tk stqd S )Nc                 S   sz   t d|   }|d}|d |d}| d d \}}}}|dkrRd}t|t|t|  }}}||||fS )Nzdf -P -B 1 "%s"ri   r   r@   nonerY   )r   r}   rC   poprm   )r,  rn   ro   rM   devrq   rr   rc   r8   r8   r9   df  s    


z4TestSystemDiskPartitions.test_against_df.<locals>.dfF)all)
r   disk_partitions
disk_usageZ
mountpointrq   r   r   rc   r   rr   )r   r  partusagerp   rq   rr   rc   r8   r8   r9   test_against_df  s    z(TestSystemDiskPartitions.test_against_dfc              
   C   s   t d}| }W 5 Q R X d|krLt D ]}|jdkr, qq,| dnxtd}tj	d|ddX}tj	dd	gd
<}t }|j
st|j
st|st|d jdkstW 5 Q R X W 5 Q R X d S )Nz/proc/filesystemszfszcouldn't find any ZFS partitionz
nodev	zfs
r   Tr#  $psutil._pslinux.cext.disk_partitions)z	/dev/sdb3/r  rwr3  r   )rB   r   r   r  Zfstyper}  r   r   r   r   r   r   )r   rL   r   r  r(  r6  r7  r   r8   r8   r9   test_zfs_fs  s0    


  

z$TestSystemDiskPartitions.test_zfs_fsc              
   C   sT   zFtjddd.}tt t   W 5 Q R X |js:t	W 5 Q R X W 5 dt _X d S )N/proczos.path.realpathz/non/existentr3  )
r   PROCFS_PATHr   r   r   raisesr   r  r   r   r   r8   r8   r9   test_emulate_realpath_fail  s     z3TestSystemDiskPartitions.test_emulate_realpath_failN)r   r   r   r   r*  r+  hasattrr  r   r  r  r  r8   r8   r8   r9   r    s   
 r  c                   @   sD   e Z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 )TestSystemDiskIoCountersc              
   C   s   d}t d|i tjddd tjdd}|jdks<t|jd	ksJt|jd
t	 ks\t|j
dksjt|jdksxt|jdkst|jdt	 kst|jdkst|jdkstW 5 Q R X W 5 Q R X d S )Nz+   3     0   1 hda 2 3 4 5 6 7 8 9 10 11 12/proc/diskstats!psutil._pslinux.is_storage_deviceTr3  Fr  rw   r   r   r@   rx   r        r  r   r   r   r   disk_io_counters
read_countr   read_merged_count
read_bytesSECTOR_SIZE	read_timewrite_countwrite_merged_countwrite_bytes
write_time	busy_timer   r   r   r8   r8   r9   test_emulate_kernel_2_4  s      z0TestSystemDiskIoCounters.test_emulate_kernel_2_4c              
   C   s   d}t d|i tjddd tjdd}|jdks<t|jd	ksJt|jd
t	 ks\t|j
dksjt|jdksxt|jdkst|jdt	 kst|jdkst|jdkstW 5 Q R X W 5 Q R X d S )Nz'   3    0   hda 1 2 3 4 5 6 7 8 9 10 11r  r  Tr3  Fr  rw   r   r   r@   rx   r  r  r  r  r  r  r8   r8   r9   test_emulate_kernel_2_6_full  s      z5TestSystemDiskIoCounters.test_emulate_kernel_2_6_fullc              
   C   s   t ddi tjddd tjdd}|jdks8t|jd	t ksJt|j	d
ksXt|j
dt ksjt|jdksxt|jdkst|jdkst|jdkst|jdkstW 5 Q R X W 5 Q R X d S )Nr  z   3    1   hda 1 2 3 4r  Tr3  Fr  rw   r   r   r@   r   )r   r   r   r   r  r  r   r  r  r  r  r  r  r  r  r  )r   r   r8   r8   r9   test_emulate_kernel_2_6_limited  s     z8TestSystemDiskIoCounters.test_emulate_kernel_2_6_limitedc              
   C   s   t d}td|i tjdddl tjddd}t|dksFt|d	 j	d
ksXt|d j	d
ksjt|d	 j
dks|t|d j
dkstW 5 Q R X W 5 Q R X d S )Nx            3    0   nvme0n1 1 2 3 4 5 6 7 8 9 10 11
            3    0   nvme0n1p1 1 2 3 4 5 6 7 8 9 10 11
            r  r  Fr3  Tperdiskr  r   nvme0n1rw   Z	nvme0n1p1rx   )r   r   r   r   r   r   r  rE   r   r  r  r  r8   r8   r9   test_emulate_include_partitions  s    
 z8TestSystemDiskIoCounters.test_emulate_include_partitionsc              
   C   s   t d}td|i: tjddd  tjddd}|d ksBtW 5 Q R X W 5 Q R X dd }t d}td|iL tjdd	|d
0 tjddd}|jdkst|j	dkstW 5 Q R X W 5 Q R X d S )Nr  r  r  Fr3  r  c                 S   s   | dkS )Nr  r8   )r   r8   r8   r9   is_storage_device4  s    zSTestSystemDiskIoCounters.test_emulate_exclude_partitions.<locals>.is_storage_deviceTr   rw   rx   )
r   r   r   r   r   r   r  r   r  r  )r   r   r   r  r8   r8   r9   test_emulate_exclude_partitions%  s&    
  
z8TestSystemDiskIoCounters.test_emulate_exclude_partitionsc              	   C   sT   dd }t jdd}tjdd|d t jdd}W 5 Q R X t|t|ksPtd S )Nc                 S   s   | dkS )Nr  r8   r<  r8   r8   r9   r-  F  s    z?TestSystemDiskIoCounters.test_emulate_use_sysfs.<locals>.existsT)r  psutil._pslinux.os.path.existsr   )r   r  r   r   rE   r   )r   r-  ZwprocfsZwsysfsr8   r8   r9   test_emulate_use_sysfsE  s      z/TestSystemDiskIoCounters.test_emulate_use_sysfsc              
   C   sF   dd }t jdd|d$ tt t  W 5 Q R X W 5 Q R X d S )Nc                 S   s   dS )NFr8   r<  r8   r8   r9   r-  Q  s    z>TestSystemDiskIoCounters.test_emulate_not_impl.<locals>.existsr  Tr   )r   r   r   r  NotImplementedErrorr   r  )r   r-  r8   r8   r9   test_emulate_not_implP  s      z.TestSystemDiskIoCounters.test_emulate_not_implN)
r   r   r   r  r  r  r  r  r  r  r8   r8   r8   r9   r    s    r  c                   @   sj   e Zd Zdd Zdd Zejjedddd Z	ejje
d	 d
dejjedddd Zdd ZdS )TestRootFsDeviceFinderc                 C   s(   t dj}t || _t || _d S )Nr  )r  r~   st_devmajorminor)r   r  r8   r8   r9   setUp]  s    zTestRootFsDeviceFinder.setUpc              	   C   s   t  }tjdr|  ntt |  W 5 Q R X tjd| j| j	f r\|
  ntt |
  W 5 Q R X |  d S Nz/proc/partitionsz/sys/dev/block/%s:%s/uevent)r   r  r,  r-  ask_proc_partitionsr   r  r   r  r  ask_sys_dev_blockask_sys_class_block)r   finderr8   r8   r9   test_call_methodsb  s    

z(TestRootFsDeviceFinder.test_call_methodszunsupported on GITHUB_ACTIONSr   c                 C   s   t  }| d k	std  } }}tjdr6| }tjd| j| jf rV|	 }|
 }|ph|ph|}|r~|r~||ks~t|r|r||kst|r|r||kstd S r  )r   findr   r  r,  r-  r  r  r  r  r  )r   r  r   r   cbaser8   r8   r9   test_comparisonsr  s"    z'TestRootFsDeviceFinder.test_comparisonsZfindmntzfindmnt utility not availablec                 C   s"   t   }td}||kstd S )Nzfindmnt -o SOURCE -rn /)r   r  r   r   )r   r   Zfindmnt_valuer8   r8   r9   test_against_findmnt  s    
z+TestRootFsDeviceFinder.test_against_findmntc              	   C   sl   t jddgdR}t d }|js(ttsP|jdks:t|jt 	 ks^tn|jdks^tW 5 Q R X d S )Nr  )	/dev/rootr  Zext4r  r3  r   r  )
r   r   r   r  r   r   r   Zdevicer   r  )r   r   r  r8   r8   r9   test_disk_partitions_mocked  s    
z2TestRootFsDeviceFinder.test_disk_partitions_mockedN)r   r   r   r  r  r   r*  r+  r   r  r   r  r  r8   r8   r8   r9   r  [  s   
 r  c                   @   sb   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	 e
jjedddd Zdd ZdS )TestMiscc                 C   s(   t d}t }t|t|ks$td S )Nz	boot time)r{   r   	boot_timerm   r   r   r8   r8   r9   test_boot_time  s    zTestMisc.test_boot_timec              
      s  |   }t| ttj|dd$}|d |d |d W 5 Q R X zt  fdd}trldnd	}tj||d
 t	t
 tt t
  W 5 Q R X tt t
jdd W 5 Q R X tt t
  W 5 Q R X tt t
jdd W 5 Q R X tt t
  W 5 Q R X tt t
jdd W 5 Q R X |t
_t
 dksbttt
 dksxtt
jdd}t|dkstt
jdd}ttt|dkstttj|dd$}|d |d |d W 5 Q R X t
 dks
ttt
jdddks$ttt
 dks:ttttt
jdddksZtW 5 Q R X W 5 t| t	t
 X t
jdkstd S )Nr~   r   zcpu   0 0 0 0 0 0 0 0 0 0
zcpu0  0 0 0 0 0 0 0 0 0 0
zcpu1  0 0 0 0 0 0 0 0 0 0
c                    s&   |  drttjd | f||S )Nr  zrejecting access for test)rj   r   r   r   r   rP  r8   r9   r     s    
z4TestMisc.test_no_procfs_on_import.<locals>.open_mockr   r   r  TrD  r   zcpu   1 0 0 0 0 0 0 0 0 0
zcpu0  1 0 0 0 0 0 0 0 0 0
zcpu1  1 0 0 0 0 0 0 0 0 0
r  )
get_testfnr  mkdirrB   r,  rH   writeshutilrmtreer   r   r   r   r   r   r  r   r  cpu_percentcpu_times_percentr  r   sumr   )r   Z	my_procfsrL   r   r   Zper_cpu_percentZper_cpu_times_percentr8   rP  r9   test_no_procfs_on_import  sV    






z!TestMisc.test_no_procfs_on_importc              	   C   s>  t d }td|i8}t  |js.ttjdd t  tjdd W 5 Q R X t d }td|i t }|jsttjdd}t }tjdd}|dkstt	|dkstt	|dkstt	|dkstt	t
t	|dkstt	t
t	|dkst|jdks t|jdks0tW 5 Q R X d S )Nz~            cpu   0 0 0 0 0 0 0 1 0 0
            cpu0  0 0 0 0 0 0 0 1 0 0
            cpu1  0 0 0 0 0 0 0 1 0 0
            r   TrD  z~            cpu   1 0 0 0 0 0 0 0 0 0
            cpu0  1 0 0 0 0 0 0 0 0 0
            cpu1  1 0 0 0 0 0 0 0 0 0
            r   rZ  )r   r   r   r   r   r  r   r   r  r  r   r  user)r   r   r   r  Zcpu_percent_percpur  Zcpu_times_percent_percpur8   r8   r9   test_cpu_steal_decrease  s,    

z TestMisc.test_cpu_steal_decreasec              
   C   sH   t jddd0}tt tj  W 5 Q R X |js:t	W 5 Q R X d S )Nr   Tr   )
r   r   r   r  ru  r   r&  r  r   r   r   r8   r8   r9   test_boot_time_mocked  s    zTestMisc.test_boot_time_mockedc                 C   s    t  D ]}|jdkstqd S )N)z:0z:0.0)r   Zusershostr   )r   r  r8   r8   r9   
test_users  s    zTestMisc.test_usersc              	   C   s@  |   }t| z|t_tt t  W 5 Q R X tt t	  W 5 Q R X tt tj	dd W 5 Q R X tt t
  W 5 Q R X tt t  W 5 Q R X tt t  W 5 Q R X tt t  W 5 Q R X tt t  W 5 Q R X ttj t  W 5 Q R X W 5 dt_X d S )Nr  TrD  )r  r  r  r   r  r   r  r   r   r  r  r  r  rt  r  ZNoSuchProcessProcess)r   Ztdirr8   r8   r9   test_procfs_path   s.    
zTestMisc.test_procfs_pathzskip if pytest-parallelr   c              	   C   s   t  t t }| }t|tr&dndks0tt|dd dd j}|j	|ksTtt|}|
  |t ksvtW 5 Q R X d S )Nr   r   c                 S   s   | j S rU   )idrV   r8   r8   r9   <lambda>H  r   z)TestMisc.test_issue_687.<locals>.<lambda>)keyrw   )r   r   r  threadsrE   r   r   sortedr  pidZas_dictZpids)r   pr  tidptr8   r8   r9   test_issue_687<  s    
zTestMisc.test_issue_687c              	   C   s8   t ddi"}tt s t|js*tW 5 Q R X d S )N/proc/%s/statusrY   )r   r   Z
pid_existsr  getpidr   r   r   r8   r8   r9   test_pid_exists_no_proc_statusN  s    z'TestMisc.test_pid_exists_no_proc_statusN)r   r   r   r  r  r  r  r  r  r   r   r*  r+  r   r  r  r8   r8   r8   r9   r    s   B'r  z
no batteryc                   @   sj   e Zd Zejjed d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 )TestSensorsBatteryZacpizacpi utility not availabler   c                 C   sH   t d}t|dd  dd}t j}t|| dk sDt	d S )Nzacpi -br/  rw   rf  rY   )
r   rm   rC   r}   replacer   sensors_batterypercentr   r   )r   rn   Z
acpi_valuer   r8   r8   r9   test_percent_  s    
zTestSensorsBattery.test_percentc              	      sj    fdd}t  trdnd}tj||d6}t jdks>tt jtj	ksRt|j
s\tW 5 Q R X d S )Nc                    s(   |  drtdS  | f||S d S )Nz
AC0/onlinez	AC/online   1rO  r   r   r   rP  r8   r9   r   h  s    

z@TestSensorsBattery.test_emulate_power_plugged.<locals>.open_mockr   r   r  T)rB   r   r   r   r   r  power_pluggedr   ZsecsleftZPOWER_TIME_UNLIMITEDr   r   r   r   r   r8   rP  r9   test_emulate_power_pluggedf  s    z-TestSensorsBattery.test_emulate_power_pluggedc              	      sV    fdd}t  trdnd}tj||d"}t jdks>t|jsHtW 5 Q R X d S )Nc                    s@   |  drttjdn$|  dr,tdS  | f||S d S )Nr  rY   /statusZchargingrO  r   r   r   r   r   r   rP  r8   r9   r   {  s
    


zBTestSensorsBattery.test_emulate_power_plugged_2.<locals>.open_mockr   r   r  T	rB   r   r   r   r   r  r  r   r   r	  r8   rP  r9   test_emulate_power_plugged_2x  s    z/TestSensorsBattery.test_emulate_power_plugged_2c              	      sV    fdd}t  trdnd}tj||d"}t jdks>t|jsHtW 5 Q R X d S )Nc                    s(   |  drtdS  | f||S d S )Nr     0r  r   rP  r8   r9   r     s    

zDTestSensorsBattery.test_emulate_power_not_plugged.<locals>.open_mockr   r   r  Fr  r	  r8   rP  r9   test_emulate_power_not_plugged  s    z1TestSensorsBattery.test_emulate_power_not_pluggedc              	      sV    fdd}t  trdnd}tj||d"}t jdks>t|jsHtW 5 Q R X d S )Nc                    s@   |  drttjdn$|  dr,tdS  | f||S d S )Nr  rY   r  Zdischargingr  r   rP  r8   r9   r     s
    


zFTestSensorsBattery.test_emulate_power_not_plugged_2.<locals>.open_mockr   r   r  Fr  r	  r8   rP  r9    test_emulate_power_not_plugged_2  s    z3TestSensorsBattery.test_emulate_power_not_plugged_2c              	      sV    fdd}t  trdnd}tj||d"}t jd ks>t|jsHtW 5 Q R X d S )Nc                    s@   |  drttjdn$|  dr,tdS  | f||S d S )N)"/sys/class/power_supply/AC0/online!/sys/class/power_supply/AC/onlinerY   #/sys/class/power_supply/BAT0/statuss   ???)rj   r   r   r   r   r   r   rP  r8   r9   r     s
    


zETestSensorsBattery.test_emulate_power_undetermined.<locals>.open_mockr   r   r  r  r	  r8   rP  r9   test_emulate_power_undetermined  s    z2TestSensorsBattery.test_emulate_power_undeterminedc              	   C   s8   t ddi"}t jdks t|js*tW 5 Q R X d S )N(/sys/class/power_supply/BAT0/energy_fullr  r   )r   r   r  r  r   r   r   r8   r8   r9   test_emulate_energy_full_0  s    z-TestSensorsBattery.test_emulate_energy_full_0c                 C   sj   t dttjdN t dttjd0 tddi t jdksHtW 5 Q R X W 5 Q R X W 5 Q R X d S )Nr  rY   z(/sys/class/power_supply/BAT0/charge_fullz%/sys/class/power_supply/BAT0/capacitys   88X   )	r   r   r   r   r   r   r  r  r   r   r8   r8   r9   "test_emulate_energy_full_not_avail  s    

z5TestSensorsBattery.test_emulate_energy_full_not_availc                 C   sp   t dttjdT t dttjd6 t dttjd t jd ksNtW 5 Q R X W 5 Q R X W 5 Q R X d S )Nr  rY   r  r  )r   r   r   r   r   r  r  r   r  r8   r8   r9   test_emulate_no_power  s     
 

z(TestSensorsBattery.test_emulate_no_powerN)r   r   r   r   r*  r+  r   r  r
  r  r  r  r  r  r  r  r8   r8   r8   r9   r   \  s   
r   c                   @   s   e Zd Zdd ZdS )TestSensorsBatteryEmulatedc              
      sz    fdd}t  trdnd}tjddgd0}tj||d}t d k	sNtW 5 Q R X W 5 Q R X |jslt|jsvtd S )	Nc                    sP   |  drtdS |  dr(tdS |  dr<tdS  | f||S d S )Nz/energy_nowZ60000000z
/power_now0z/energy_fullZ60000001rO  r   r   r   rP  r8   r9   r     s    





z5TestSensorsBatteryEmulated.test_it.<locals>.open_mockr   r   z
os.listdirZBAT0r3  r  )rB   r   r   r   r   r  r   r   )r   r   r   ZmlistdirZmopenr8   rP  r9   test_it  s    
$
z"TestSensorsBatteryEmulated.test_itN)r   r   r   r  r8   r8   r8   r9   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )TestSensorsTemperaturesc              
      s    fdd}t  trdnd}tj||dj tjddgdN t d	 d
 }|jdks\t|jdksjt|j	dksxt|j
dkstW 5 Q R X W 5 Q R X d S )Nc                    sx   |  drtdS |  dr(tdS |  dr<tdS |  drPtdS |  d	rdtd
S  | f||S d S )N/namer   z/temp1_labellabelz/temp1_input   30000z
/temp1_maxs   40000z/temp1_crit   50000)rO  r   r   r   r   rP  r8   r9   r     s    









zCTestSensorsTemperatures.test_emulate_class_hwmon.<locals>.open_mockr   r   r  r2  z/sys/class/hwmon/hwmon0/temp1r3  r   r   r"        >@g      D@      I@rB   r   r   r   r   Zsensors_temperaturesr"  r   rT  highcritical)r   r   r   tempr8   rP  r9   test_emulate_class_hwmon  s     z0TestSensorsTemperatures.test_emulate_class_hwmonc              
      s    fdd}dd }t  tr dnd}tj||dj tjdd	|d
N t d d }|jdksdt|jdksrt|j	dkst|j
dkstW 5 Q R X W 5 Q R X d S )Nc                    sd   |  drtdS |  dr(tdS |  dr<tdS |  drPtdS  | f||S d S )	NZ0_tempr$  r*  r#  Z0_typer)  typer   )rO  r   r   r   r   rP  r8   r9   r     s    







zETestSensorsTemperatures.test_emulate_class_thermal.<locals>.open_mockc                 S   s:   | dkrg S | dkrg S | dkr&dgS | dkr6ddgS g S )Nz/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*z /sys/class/thermal/thermal_zone*z /sys/class/thermal/thermal_zone0z,/sys/class/thermal/thermal_zone0/trip_point*z2/sys/class/thermal/thermal_zone1/trip_point_0_typez2/sys/class/thermal/thermal_zone1/trip_point_0_tempr8   r<  r8   r8   r9   	glob_mock$  s    zETestSensorsTemperatures.test_emulate_class_thermal.<locals>.glob_mockr   r   r  r2  Tr   r   r   rY   r%  r&  r'  )r   r   r-  r   r*  r8   rP  r9   test_emulate_class_thermal  s    z2TestSensorsTemperatures.test_emulate_class_thermalN)r   r   r   r+  r.  r8   r8   r8   r9   r     s   r   c                   @   s   e Zd Zdd ZdS )TestSensorsFansc              
      s    fdd}t  trdnd}tj||dN tjddgd2 t d	 d
 }|jdks\t|jdksjtW 5 Q R X W 5 Q R X d S )Nc                    sP   |  drtdS |  dr(tdS |  dr<tdS  | f||S d S )Nr!  r   z/fan1_labelr"  z/fan1_input2000r  r   rP  r8   r9   r   @  s    





z4TestSensorsFans.test_emulate_data.<locals>.open_mockr   r   r  r2  z/sys/class/hwmon/hwmon2/fan1r3  r   r   r"  i  )	rB   r   r   r   r   Zsensors_fansr"  r   rT  )r   r   r   Zfanr8   rP  r9   rV  ?  s    
 z!TestSensorsFans.test_emulate_dataN)r   r   r   rV  r8   r8   r8   r9   r/  =  s   r/  c                   @   s   e Zd Ze dd Z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d Zdd Zdd Zdd Zdd Zdd Zdd Zejje ddd d! Zd"d# Zd$d% Zd&d' Zd(S ))TestProcessc                 C   s   |   }tj|j \}}}t|jjdd}t|tdd |D  dk sVt	t|tdd |D  dk sxt	t|tdd |D  dk st	d S )NF)Zgroupedc                 S   s   g | ]}|j |j qS r8   )Zprivate_dirtyZprivate_cleanru   r8   r8   r9   r]   b  s     z?TestProcess.test_parse_smaps_vs_memory_maps.<locals>.<listcomp>r   c                 S   s   g | ]
}|j qS r8   )pssru   r8   r8   r9   r]   e  s     c                 S   s   g | ]
}|j qS r8   )r   ru   r8   r8   r9   r]   f  s     )
Zspawn_testprocr   r&  r  r  _parse_smapsmemory_mapsr   r  r   )r   Zsprocussr2  r   mapsr8   r8   r9   test_parse_smaps_vs_memory_maps\  s    "z+TestProcess.test_parse_smaps_vs_memory_mapsc              	   C   s~   t d }tdt  |iR}tjt }|	 \}}}|j
sLt|dksXt|dksdt|dksptW 5 Q R X d S )Nan              fffff0 r-xp 00000000 00:00 0                  [vsyscall]
            Size:                  1 kB
            Rss:                   2 kB
            Pss:                   3 kB
            Shared_Clean:          4 kB
            Shared_Dirty:          5 kB
            Private_Clean:         6 kB
            Private_Dirty:         7 kB
            Referenced:            8 kB
            Anonymous:             9 kB
            LazyFree:              10 kB
            AnonHugePages:         11 kB
            ShmemPmdMapped:        12 kB
            Shared_Hugetlb:        13 kB
            Private_Hugetlb:       14 kB
            Swap:                  15 kB
            SwapPss:               16 kB
            KernelPageSize:        17 kB
            MMUPageSize:           18 kB
            Locked:                19 kB
            VmFlags: rd ex
            /proc/%s/smapsi l  r   i <  )r   r   r   r   r  r  r   r&  r  r3  r   r   )r   r   r   r  r5  r2  r   r8   r8   r9   test_parse_smaps_mockedh  s    
z#TestProcess.test_parse_smaps_mockedzunreliable on PYPYr   c              	   C   sl  dd }|   }t|d ||jdks.tW 5 Q R X t| ||jdksTtW 5 Q R X t|d ||jdks|tW 5 Q R X t|d ||jdkstW 5 Q R X t|d ||jdkstW 5 Q R X t|d ||jdkstW 5 Q R X trht| t|d	 ||jdks,tW 5 Q R X t| t|d
 ||jdks^tW 5 Q R X d S )Nc                 S   sZ   t  }t t }| D ].}|jtj| kr:|  S t |kr qqqtdd S )Nztimeout looking for test file)	r   r  timer	   
open_filesr,  r  abspathru  )fnamer  Z	giveup_atfiler8   r8   r9   get_test_file  s    z7TestProcess.test_open_files_mode.<locals>.get_test_filer   rr   zr+zw+za+rW   zx+)r  rB   moder   r   r   )r   r?  Ztestfnr8   r8   r9   test_open_files_mode  s*    
z TestProcess.test_open_files_modec              
      s   t    t|  d t fdd tjdtt	j
dd } g ksZt|jsdtW 5 Q R X tjdtt	jdd } g kst|jstW 5 Q R X W 5 Q R X d S )Nr   c                      s   t  t  kS rU   rE   r;  r8   filesr  r8   r9   r    r   z7TestProcess.test_open_files_file_gone.<locals>.<lambda>psutil._pslinux.os.readlinkrY   r  )r   r  r;  rB   r  r   r   r   OSErrorr   r   r   r   EINVALr   r8   rD  r9   test_open_files_file_gone  s$    

z%TestProcess.test_open_files_file_gonec              
      s   t    t|  d` t fdd tr:dnd}tj|t	t
jdd } g ksft|jsptW 5 Q R X W 5 Q R X d S )Nr   c                      s   t  t  kS rU   rC  r8   rD  r8   r9   r    r   z5TestProcess.test_open_files_fd_gone.<locals>.<lambda>r   r   rY   r  )r   r  r;  rB   r  r   r   r   r   r   r   r   r   r   r   r   r   r8   rD  r9   test_open_files_fd_gone  s     
z#TestProcess.test_open_files_fd_gonec                    s   t    t|  dn t fdd d}tj|tt	j
dd6}td   g ksjt|jsttW 5 Q R X W 5 Q R X W 5 Q R X d S )Nr   c                      s   t  t  kS rU   rC  r8   rD  r8   r9   r    r   z:TestProcess.test_open_files_enametoolong.<locals>.<lambda>rF  rY   r  psutil._pslinux.debug)r   r  r;  rB   r  r   r   r   rG  r   ENAMETOOLONGr   r   rJ  r8   rD  r9   test_open_files_enametoolong  s     
z(TestProcess.test_open_files_enametoolongc              	   C   sD   t jdi d,}tjt  d ks,t|j	s6tW 5 Q R X d S )Nz)psutil._pslinux._psposix.get_terminal_mapr3  )
r   r   r   r&  r  r  r  Zterminalr   r   r   r8   r8   r9   test_terminal_mocked  s     z TestProcess.test_terminal_mockedc              	   C   s   t  }td}tjd|dd$}| ddgks8t|jsBtW 5 Q R X td}tjd|dd&}| dddgks~t|jstW 5 Q R X d S )	Nzfoo bar r   Tr#  foobarz	foo bar  rY   	r   r  r   r   r   r   Zcmdliner   r   r   r  r(  r   r8   r8   r9   test_cmdline_mocked  s&    
  
  zTestProcess.test_cmdline_mockedc              	   C   s   t  }td}tjd|dd$}| ddgks8t|jsBtW 5 Q R X td}tjd|dd&}| dddgks~t|jstW 5 Q R X d S )	Nzfoo bar r   Tr#  rP  rQ  z	foo bar  rY   rR  rS  r8   r8   r9   test_cmdline_spaces_mocked  s&    
  
  z&TestProcess.test_cmdline_spaces_mockedc              	   C   sP   t  }td}tjd|dd$}| ddgks8t|jsBtW 5 Q R X d S )Nzfoo bar r   Tr#  rP  rQ  rR  rS  r8   r8   r9   test_cmdline_mixed_separators  s    
  z)TestProcess.test_cmdline_mixed_separatorsc              	   C   sF   t jddd. t  dks$tt  dks8tW 5 Q R X d S )NrF  z/home/foo (deleted)r3  z	/home/foo)r   r   r   r  exer   cwdr  r8   r8   r9   !test_readlink_path_deleted_mocked!  s     z-TestProcess.test_readlink_path_deleted_mockedc              
      s    fdd}t  trdnd}tj||d(}t  }|jsBt|g ksNtW 5 Q R X  fdd}tj||d* t	
tj t   W 5 Q R X W 5 Q R X d S )Nc                    s4   |  dt  r ttjdn | f||S d S Nz/proc/%s/taskrY   )rj   r  r  r   r   r   r   rP  r8   r9   open_mock_1-  s    z4TestProcess.test_threads_mocked.<locals>.open_mock_1r   r   r  c                    s4   |  dt  r ttjdn | f||S d S rZ  )rj   r  r  r   r   EPERMr   rP  r8   r9   open_mock_2<  s    z4TestProcess.test_threads_mocked.<locals>.open_mock_2)rB   r   r   r   r   r  r  r   r   r   r  ZAccessDenied)r   r[  r   r   r   r]  r8   rP  r9   test_threads_mocked(  s    
zTestProcess.test_threads_mockedc              
   C   sb   t jdttjddB}t jdg d( t  }|js>t	|dksJt	W 5 Q R X W 5 Q R X d S )Nzpsutil._pslinux.readlinkrY   r  zpsutil._pslinux.Process.cmdliner3  )
r   r   rG  r   r   r   r  rW  r   r   )r   r   r   r8   r8   r9   test_exe_mockedF  s     
 
zTestProcess.test_exe_mockedc              
   C   sZ   t dt  ttjd6}t }t	t
 |  W 5 Q R X |jsLtW 5 Q R X d S )Nr8  rY   )r   r  r  r   r   r   r   r  r   r  r   r4  r   r   r   r   r  r8   r8   r9   test_issue_1014R  s    
 
zTestProcess.test_issue_1014r:  c                 C   s   t jdttjddT}t jddd:}t }|  t	tj
}|tj W 5 Q R X W 5 Q R X W 5 Q R X |jszt|jst|jj|jkst|jj| kstd S )Nzpsutil._pslinux.prlimitrY   r  z"psutil._pslinux.Process._is_zombieTr3  )r   r   rG  r   ZENOSYSr   r  r   r   r  ZZombieProcessZrlimitZRLIMIT_NOFILEr   r   r  r  )r   r6  r7  r  cmr8   r8   r9   test_rlimit_zombie]  s$     
 *

zTestProcess.test_rlimit_zombiec              *   C   sZ  dddddddddddddddddddddd	ddddddddddddddddd	ddd
g*}d | }tdt  |i t }| dkst|	 tj
kst| dkst| dt t  kst| }|jdt kst|jdt kst|jdt kst|jdt ks&t|jdt ks:t| dksLtW 5 Q R X d S )Nr  z(cat)Z1234567r|   z/proc/%s/statcatrw   r  r   r   r@   rx   r  )rH   r   r   r  r  r   r  r   r   statusZSTATUS_ZOMBIEppidZcreate_timer   r  r  r  systemchildren_userchildren_systemZiowaitZcpu_num)r   r   r   r  cpur8   r8   r9   test_stat_file_parsingq  sr    ,z"TestProcess.test_stat_file_parsingc              	   C   s   t d }tdt  |i t }| j	dks>t
| jdksPt
| dks`t
| }|jdksvt
|jdkst
|jdkst
| }|jd	kst
|jd
kst
|jdkst
|j ttdkst
W 5 Q R X d S )Nz            Uid:	1000	1001	1002	1003
            Gid:	1004	1005	1006	1007
            Threads:	66
            Cpus_allowed:	f
            Cpus_allowed_list:	0-7
            voluntary_ctxt_switches:	12
            nonvoluntary_ctxt_switches:	13r  r      B   i  i  i  i  i  i  r  )r   r   r   r   r  r  r   r  num_ctx_switches	voluntaryr   involuntarynum_threadsuidsrealZ	effectiveZsavedgids_proc_get_eligible_cpuslistrG   )r   r   r  rz  r|  r8   r8   r9   test_status_file_parsing  s    z$TestProcess.test_status_file_parsingc              
   C   s^   t jdttjdd>}t }t d  | g ks<t|j	sFtW 5 Q R X W 5 Q R X d S )NrF  rY   r  rL  )
r   r   rG  r   rM  r   r  r  r   r   r`  r8   r8   r9   !test_net_connections_enametoolong  s    
z-TestProcess.test_net_connections_enametoolongN)r   r   r   r   r7  r9  r   r*  r+  r   rB  rI  rK  rN  rO  rT  rU  rV  rY  r^  r_  ra  r   rc  rs  r  r  r8   r8   r8   r9   r1  Z  s*   
"
"
<r1  c                   @   s   e Zd ZdZedd Zdd Zdd Zej	j
edd	d
d Zdd Zdd Zdd Zdd Ze dd Zdd Zdd ZdS )TestProcessAgainstStatusa  /proc/pid/stat and /proc/pid/status have many values in common.
    Whenever possible, psutil uses /proc/pid/stat (it's faster).
    For all those cases we check that the value found in
    /proc/pid/stat (by psutil) matches the one found in
    /proc/pid/status.
    c                 C   s   t  | _d S rU   )r   r  proc)clsr8   r8   r9   
setUpClass  s    z#TestProcessAgainstStatus.setUpClassc              
   C   s   t jd| jj }|D ]h}| }||r|dd }zt|W   W  5 Q R  S  t	k
r   | Y   W  5 Q R  S X qt	d| W 5 Q R X d S )Nr  	r   zcan't find %r)
r   _psplatform	open_textr  r  r}   rj   	partitionrm   rF   )r   Z	linestartrL   rM   r  r8   r8   r9   read_status_file  s    

z)TestProcessAgainstStatus.read_status_filec                 C   s    |  d}| j |kstd S )NzName:)r  r  r   r   r   r  r8   r8   r9   	test_name  s    
z"TestProcessAgainstStatus.test_namero  r   c                 C   sH   |  d}||dd |d }|dd}| j |ksDtd S )NzState:(rw   )r|   r  )r  r  rfindr  r  rm  r   r  r8   r8   r9   test_status  s    
z$TestProcessAgainstStatus.test_statusc                 C   s    |  d}| j |kstd S )NzPPid:)r  r  rn  r   r  r8   r8   r9   	test_ppid  s    
z"TestProcessAgainstStatus.test_ppidc                 C   s    |  d}| j |kstd S )NzThreads:)r  r  ry  r   r  r8   r8   r9   test_num_threads  s    
z)TestProcessAgainstStatus.test_num_threadsc                 C   s:   |  d}ttt| dd }| j |ks6td S )NzUid:rw   r@   )r  r   r   rm   rC   r  rz  r   r  r8   r8   r9   	test_uids	  s    
z"TestProcessAgainstStatus.test_uidsc                 C   s:   |  d}ttt| dd }| j |ks6td S )NzGid:rw   r@   )r  r   r   rm   rC   r  r|  r   r  r8   r8   r9   	test_gids	  s    
z"TestProcessAgainstStatus.test_gidsc                 C   s@   |  d}| j j|kst|  d}| j j|ks<td S )Nzvoluntary_ctxt_switches:znonvoluntary_ctxt_switches:)r  r  rv  rw  r   rx  r  r8   r8   r9   test_num_ctx_switches	  s    

z.TestProcessAgainstStatus.test_num_ctx_switchesc                 C   sN   |  d}dt|krJtt|d\}}| j tt||d ksJt	d S )NCpus_allowed_list:r  rw   )
r  r   r   rm   rC   r  Zcpu_affinityr  rG   r   )r   r  Zmin_Zmax_r8   r8   r9   test_cpu_affinity	  s    
z*TestProcessAgainstStatus.test_cpu_affinityc              	   C   sR   |  d}td}| jj  W 5 Q R X dt|krD|jrNtn
|jsNtd S )Nr  zpsutil._pslinux.per_cpu_timesr  )	r  r   r   r  r}  r~  r   r   r   )r   r  r   r8   r8   r9   test_cpu_affinity_eligible_cpus	  s    
z8TestProcessAgainstStatus.test_cpu_affinity_eligible_cpusN)r   r   r   __doc__classmethodr  r  r  r   r*  r+  r   r  r  r  r  r  r   r  r  r  r8   r8   r8   r9   r    s   


r  c                   @   s   e Zd Zdd ZdS )	TestUtilsc              	   C   s<   t jddd$}tjddks$t|js.tW 5 Q R X d S )Nzos.readlinkzfoo (deleted)r3  rQ  rP  )r   r   r   r  readlinkr   r   r   r8   r8   r9   test_readlink)	  s    zTestUtils.test_readlinkN)r   r   r   r  r8   r8   r8   r9   r  '	  s   r  )fr  
__future__r   rk   r-   r   globr   r  r   r  r*   r3   r   r:  r   r   r   Zpsutil._compatr   r   r   Zpsutil.testsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%  r   r   r    r!   r,  r<  dirname__file__ZHEREr2   ZSIOCGIFCONFr_   r;   r=   r  ZEMPTY_TEMPERATURESr:   r<   r>   rT   rb   rt   rz   r{   r   contextmanagerr   r   r*  r+  r   r   r   r   r   r
  r.  r9  r^  ra  re  rp  r  r  r  r  r  r  r   r  r   r/  r1  r  r  r8   r8   r8   r9   <module>   s   	

91 RZI '63A H 8 C  zS