U
    ;gN                     @   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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 e Ze dkoedZndZdZdd Zdd Zejje ddG dd deZejje ddG dd deZejje ddG dd deZejje	 ddG d d! d!eZ ejje d"dG d#d$ d$eZ!dS )%z$Tests specific to all BSD platforms.    N)BSD)FREEBSD)NETBSD)OPENBSD)HAS_BATTERY)TOLERANCE_SYS_MEM)PsutilTestCase)pytest)retry_on_failure)sh)spawn_testproc)	terminate)which)getpagesizemuseFc                 C   sn   t d|  }tr(||dd d }nts0trF||dd d }z
t|W S  tk
rh   | Y S X dS )zmExpects a sysctl command with an argument and parse the result
    returning only the value of interest.
    zsysctl z:    N=   )r   r   findr   r   int
ValueError)cmdlineresult r   9/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_bsd.pysysctl-   s    
r   c                 C   s>   t d}|dD ]}|| r q.qtdt| d S )z+Thin wrapper around 'muse' cmdline utility.r   
zline not foundr   )r   split
startswithr   r   )fieldoutliner   r   r   r   <   s    
zBSD onlyreasonc                   @   s   e Zd ZdZedd Zedd Zejj	e
dddd	 Zd
d Zejj	ed dddd Zejj	ed ddejj	e
dddd Zejj	ed dddd ZdS )BSDTestCasez)Generic tests common to all BSD variants.c                 C   s   t  j| _d S Nr   pidclsr   r   r   
setUpClassP   s    zBSDTestCase.setUpClassc                 C   s   t | j d S r%   r   r'   r(   r   r   r   tearDownClassT   s    zBSDTestCase.tearDownClassz -o lstart doesn't work on NETBSDr"   c                 C   sP   t d| j }|dd }t| j }tdt	|}||ksLt
d S )Nzps -o lstart -p %sZSTARTED z%a %b %e %H:%M:%S %Y)r   r'   replacestrippsutilProcessZcreate_timetimestrftime	localtimeAssertionError)selfoutputZstart_psZstart_psutilr   r   r   test_process_create_timeX   s     z$BSDTestCase.test_process_create_timec                 C   s   dd }t jddD ]}t |j}||j\}}}}|j|ksDt|j|ksRtt|j| dkrx| 	d|j|f t|j
| dkr| 	d|j
|f qd S )Nc                 S   s   t d|   }|d}|d |d}| d d \}}}}|dkrRd}t|d }t|d }t|d }||||fS )Nz
df -k "%s"r   r      noner-      )r   r/   r   popr   )pathr    linesr!   devtotalusedfreer   r   r   dfe   s    


z"BSDTestCase.test_disks.<locals>.dfF)alli   zpsutil=%s, df=%s)r0   Zdisk_partitions
disk_usageZ
mountpointZdevicer5   r@   absrB   ZfailrA   )r6   rC   partusager?   r@   rA   rB   r   r   r   
test_disksb   s    zBSDTestCase.test_disksr   zsysctl cmd not availablec                 C   s    t d}tjdd|kstd S )Nzhw.ncpuT)logical)r   r0   	cpu_countr5   r6   Zsystr   r   r   test_cpu_count_logical}   s    z"BSDTestCase.test_cpu_count_logicalzskipped on NETBSDc                 C   s   t d}|t jkstd S )Nz
hw.physmem)r   r0   virtual_memoryr@   r5   r6   numr   r   r   test_virtual_memory_total   s    z%BSDTestCase.test_virtual_memory_totalZifconfigzifconfig cmd not availablec              	   C   sx   t   D ]f\}}ztd| }W n tk
r8   Y qX |jd|kksLtd|kr|jtt	
d|d kstqd S )Nzifconfig %sZRUNNINGmtuz	mtu (\d+)r   )r0   Znet_if_statsitemsr   RuntimeErrorZisupr5   rR   r   refindall)r6   namestatsr    r   r   r   test_net_if_stats   s    zBSDTestCase.test_net_if_statsN)__name__
__module____qualname____doc__classmethodr*   r,   r	   markskipifr   r8   rI   r   rM   rQ   rY   r   r   r   r   r$   L   s*   


	
  r$   zFREEBSD onlyc                   @   sf   e Zd Zedd Zedd Ze dd Zdd Zd	d
 Z	dd Z
e dd Ze dd ZdS )FreeBSDPsutilTestCasec                 C   s   t  j| _d S r%   r&   r(   r   r   r   r*      s    z FreeBSDPsutilTestCase.setUpClassc                 C   s   t | j d S r%   r+   r(   r   r   r   r,      s    z#FreeBSDPsutilTestCase.tearDownClassc                 C   s   t d| j }t| jjdd}|ddd  }|r| }| }|d d \}}}}	}
| }d||f |jks|tt	|
|j
kst|jds4|d	 |jks4tq4d S )
Nzprocstat -v %sF)Zgroupedr   r      z%s-%s[
   )r   r'   r0   r1   Zmemory_mapsr   r<   addrr5   r   Zrssr=   r   )r6   r    mapsr>   r!   fields_startstopZ_permsresmapr   r   r   test_memory_maps   s    z&FreeBSDPsutilTestCase.test_memory_mapsc                 C   s<   t d| j }t| j |dd  d ks8td S )Nzprocstat -b %sr   r   )r   r'   r0   r1   Zexer   r5   r6   r    r   r   r   test_exe   s    zFreeBSDPsutilTestCase.test_exec                 C   sL   t d| j }dt| j d|dd  dd  ksHtd S )Nzprocstat -c %s r   r   r   )r   r'   joinr0   r1   r   r   r5   ro   r   r   r   test_cmdline   s    z"FreeBSDPsutilTestCase.test_cmdlinec                 C   s   t d| j }|dd  dd \}}}}}}t| j}| }	| }
|	jt|ksbt	|	j
t|kstt	|	jt|kst	|
jt|kst	|
j
t|kst	|
jt|kst	d S )Nzprocstat -s %sr   r   r      )r   r'   r   r0   r1   uidsgidsrealr   r5   Z	effectiveZsaved)r6   r    ZeuidZruidZsuidZegidZrgidZsgidpru   rv   r   r   r   test_uids_gids   s    &z$FreeBSDPsutilTestCase.test_uids_gidsc                 C   s   g }t d| j }t| j}|dD ]}|  }d|krrt| d }| j	}||ksft
|d  q(d|kr(t| d }| j}||kst
|d  q(t|dkrtdd S )Nprocstat -r %sr   z voluntary contextrn   z involuntary contextr   )couldn't find lines match in procstat out)r   r'   r0   r1   r   lowerr/   r   Znum_ctx_switchesZ	voluntaryr5   appendZinvoluntarylenrT   r6   Ztestedr    rx   r!   Zpstat_valueZpsutil_valuer   r   r   test_ctx_switches   s"    

z'FreeBSDPsutilTestCase.test_ctx_switchesc                 C   s   g }t d| j }t| j}|dD ]}|  }d|krtd| d dd  }| j	}||kstt
|d  q(d|kr(td| d dd  }| j}||kst
|d  q(t|dkrtd	d S )
Nrz   r   z	user timez0.rn   .zsystem timer   r{   )r   r'   r0   r1   r   r|   r/   floatZ	cpu_timesuserr5   r}   systemr~   rT   r   r   r   r   test_cpu_times   s"    

z$FreeBSDPsutilTestCase.test_cpu_timesN)rZ   r[   r\   r^   r*   r,   r
   rm   rp   rs   ry   r   r   r   r   r   r   ra      s   



ra   c                   @   s  e Zd Zed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e dd Zejje dddd Zejje dde dd Zejje dde dd Zejje dde dd Zejje dde dd Zejje dde dd Zejje dde dd  Zd!d" Zd#d$ Zd%d& Ze d'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zejje  d1dd2d3 Z!ejje  d1dd4d5 Z"ejje d6dd7d8 Z#d9d: Z$d;S )<FreeBSDSystemTestCasec                  C   sR   t d d } td| }|s,td|  dd |dd D \}}}|||fS )	Nzswapinfo -krn   z\s+zCan't parse swapinfo: %sc                 s   s   | ]}t |d  V  qdS )r;   N)r   ).0rx   r   r   r   	<genexpr>  s     z7FreeBSDSystemTestCase.parse_swapinfo.<locals>.<genexpr>r   r9   )r   
splitlinesrU   r   r   )r7   partsr@   rA   rB   r   r   r   parse_swapinfo   s    z$FreeBSDSystemTestCase.parse_swapinfoc                 C   s   d}zt t|}W n tk
r2   tdY nX t j|ksFtd}t|}t |	 d 	dd }t |	 d 	dd }t j
|kstt j|kstd S )Nzdev.cpu.0.freqz#frequencies not supported by kernelzdev.cpu.0.freq_levelsr   /rn   )r   r   rT   r	   skipr0   Zcpu_freqcurrentr5   r   maxmin)r6   sensorsysctl_resultZmax_freqZmin_freqr   r   r   !test_cpu_frequency_against_sysctl  s    z7FreeBSDSystemTestCase.test_cpu_frequency_against_sysctlc                 C   s*   t dt }tt j| tk s&td S )Nzvm.stats.vm.v_active_count)r   PAGESIZErF   r0   rN   activer   r5   rL   r   r   r   test_vmem_active  s    z&FreeBSDSystemTestCase.test_vmem_activec                 C   s*   t dt }tt j| tk s&td S )Nzvm.stats.vm.v_inactive_count)r   r   rF   r0   rN   inactiver   r5   rL   r   r   r   test_vmem_inactive!  s    z(FreeBSDSystemTestCase.test_vmem_inactivec                 C   s*   t dt }tt j| tk s&td S )Nzvm.stats.vm.v_wire_count)r   r   rF   r0   rN   wiredr   r5   rL   r   r   r   test_vmem_wired&  s    z%FreeBSDSystemTestCase.test_vmem_wiredc                 C   s*   t dt }tt j| tk s&td S )Nzvm.stats.vm.v_cache_count)r   r   rF   r0   rN   cachedr   r5   rL   r   r   r   test_vmem_cached+  s    z&FreeBSDSystemTestCase.test_vmem_cachedc                 C   s*   t dt }tt j| tk s&td S )Nzvm.stats.vm.v_free_count)r   r   rF   r0   rN   rB   r   r5   rL   r   r   r   test_vmem_free0  s    z$FreeBSDSystemTestCase.test_vmem_freec                 C   s&   t d}tt j| tk s"td S )Nzvfs.bufspace)r   rF   r0   rN   buffersr   r5   rL   r   r   r   test_vmem_buffers5  s    z'FreeBSDSystemTestCase.test_vmem_bufferszmuse not installedr"   c                 C   s   t d}t j|kstd S )NZTotal)r   r0   rN   r@   r5   rO   r   r   r   test_muse_vmem_total<  s    z*FreeBSDSystemTestCase.test_muse_vmem_totalc                 C   s&   t d}tt j| tk s"td S )NZActive)r   rF   r0   rN   r   r   r5   rO   r   r   r   test_muse_vmem_activeA  s    z+FreeBSDSystemTestCase.test_muse_vmem_activec                 C   s&   t d}tt j| tk s"td S )NZInactive)r   rF   r0   rN   r   r   r5   rO   r   r   r   test_muse_vmem_inactiveG  s    z-FreeBSDSystemTestCase.test_muse_vmem_inactivec                 C   s&   t d}tt j| tk s"td S )NZWired)r   rF   r0   rN   r   r   r5   rO   r   r   r   test_muse_vmem_wiredM  s    z*FreeBSDSystemTestCase.test_muse_vmem_wiredc                 C   s&   t d}tt j| tk s"td S )NCache)r   rF   r0   rN   r   r   r5   rO   r   r   r   test_muse_vmem_cachedS  s    z+FreeBSDSystemTestCase.test_muse_vmem_cachedc                 C   s&   t d}tt j| tk s"td S )NZFree)r   rF   r0   rN   rB   r   r5   rO   r   r   r   test_muse_vmem_freeY  s    z)FreeBSDSystemTestCase.test_muse_vmem_freec                 C   s&   t d}tt j| tk s"td S )NZBuffer)r   rF   r0   rN   r   r   r5   rO   r   r   r   test_muse_vmem_buffers_  s    z,FreeBSDSystemTestCase.test_muse_vmem_buffersc                 C   s"   t t jtd dk std S )Nzvm.stats.sys.v_swtch  )rF   r0   	cpu_statsctx_switchesr   r5   r6   r   r   r   test_cpu_stats_ctx_switchese  s    z1FreeBSDSystemTestCase.test_cpu_stats_ctx_switchesc                 C   s"   t t jtd dk std S )Nzvm.stats.sys.v_intrr   )rF   r0   r   
interruptsr   r5   r   r   r   r   test_cpu_stats_interruptsn  s    z/FreeBSDSystemTestCase.test_cpu_stats_interruptsc                 C   s"   t t jtd dk std S )Nzvm.stats.sys.v_softr   )rF   r0   r   Zsoft_interruptsr   r5   r   r   r   r   test_cpu_stats_soft_interruptst  s    z4FreeBSDSystemTestCase.test_cpu_stats_soft_interruptsc                 C   s"   t t jtd dk std S )Nzvm.stats.sys.v_syscalli@ )rF   r0   r   Zsyscallsr   r5   r   r   r   r   test_cpu_stats_syscalls}  s    z-FreeBSDSystemTestCase.test_cpu_stats_syscallsc                 C   s,   |   \}}}tt j| tk s(td S r%   )r   rF   r0   swap_memoryrB   r   r5   )r6   _total_usedrB   r   r   r   test_swapmem_free  s    z'FreeBSDSystemTestCase.test_swapmem_freec                 C   s,   |   \}}}tt j| tk s(td S r%   )r   rF   r0   r   rA   r   r5   )r6   r   rA   _freer   r   r   test_swapmem_used  s    z'FreeBSDSystemTestCase.test_swapmem_usedc                 C   s,   |   \}}}tt j| tk s(td S r%   )r   rF   r0   r   r@   r   r5   )r6   r@   r   r   r   r   r   test_swapmem_total  s    z(FreeBSDSystemTestCase.test_swapmem_totalc                 C   sL   t d}||dd d  }|d |d }t|}|t ksHtd S )Nzsysctl kern.boottimez sec =    ,)r   r   r   r0   	boot_timer5   )r6   sZbtimer   r   r   test_boot_time  s
    z$FreeBSDSystemTestCase.test_boot_timez
no batteryc                 C   s   dd }t d}tdd |dD }t }t|d dd	}|d
 }|j|ksZt|dkrt|j	tj
kstn||j	|kstd S )Nc                 S   s(   t | d\}}t |d\}}d||f S )N<   z%d:%02d)divmod)ZsecsmZ_shr   r   r   
secs2hours  s    z>FreeBSDSystemTestCase.test_sensors_battery.<locals>.secs2hourszacpiconf -i 0c                 S   s(   g | ] }| d d | d d fqS )	r   rn   )r   )r   xr   r   r   
<listcomp>  s     z>FreeBSDSystemTestCase.test_sensors_battery.<locals>.<listcomp>r   zRemaining capacity:%r-   zRemaining time:unknown)r   dictr   r0   sensors_batteryr   r.   percentr5   secsleftZPOWER_TIME_UNLIMITED)r6   r   r    rg   Zmetricsr   Zremaining_timer   r   r   test_sensors_battery  s    z*FreeBSDSystemTestCase.test_sensors_batteryc                 C   sl   t  jtdkstt  jtddkks0tt  j}|dk rTtddkshtn|tdd kshtd S )Nhw.acpi.battery.lifehw.acpi.acliner   r   hw.acpi.battery.timern   r   )r0   r   r   r   r5   Zpower_pluggedr   )r6   r   r   r   r   #test_sensors_battery_against_sysctl  s    



z9FreeBSDSystemTestCase.test_sensors_battery_against_sysctlzhas batteryc              	   C   sB   t t td td td W 5 Q R X t d ks>td S )Nr   r   r   )r	   ZraisesrT   r   r0   r   r5   r   r   r   r   test_sensors_battery_no_battery  s
    z5FreeBSDSystemTestCase.test_sensors_battery_no_batteryc              	   C   s   t d}t|D ]}d| }zttt|d d }W n tk
rX   tdY nX t	t 
 d | j| dk s|td| }ttt|d d }t 
 d | j|kstqd S )NTzdev.cpu.%s.temperaturern   z$temperatures not supported by kernelZcoretemprd   zdev.cpu.%s.coretemp.tjmax)r0   rK   ranger   r   r   rT   r	   r   rF   Zsensors_temperaturesr   r5   high)r6   Znum_cpuscpur   r   r   r   r   (test_sensors_temperatures_against_sysctl  s*    
z>FreeBSDSystemTestCase.test_sensors_temperatures_against_sysctlN)%rZ   r[   r\   staticmethodr   r   r
   r   r   r   r   r   r   r	   r_   r`   MUSE_AVAILABLEr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sf   







		
	


r   zOPENBSD onlyc                   @   s   e Zd Zdd ZdS )OpenBSDTestCasec                 C   s6   t d}tj|d}tjt }||ks2td S )Nzkern.boottimez%a %b %d %H:%M:%S %Y)r   datetimestrptimefromtimestampr0   r   r5   )r6   r   Zsys_btZ	psutil_btr   r   r   r     s    zOpenBSDTestCase.test_boot_timeN)rZ   r[   r\   r   r   r   r   r   r     s   r   zNETBSD onlyc                   @   sh   e Z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S )NetBSDTestCasec              
   C   s\   t d>}|D ]2}|| rt| d d   W  5 Q R  S qW 5 Q R X td|  d S )Nz/proc/meminfor   r;   zcan't find %s)openr   r   r   r   )Zlook_forfr!   r   r   r   parse_meminfo  s
    

0zNetBSDTestCase.parse_meminfoc                 C   s   t  j| dkstd S )Nz	MemTotal:)r0   rN   r@   r   r5   r   r   r   r   test_vmem_total	  s    zNetBSDTestCase.test_vmem_totalc                 C   s$   t t j| d tk s td S )NzMemFree:)rF   r0   rN   rB   r   r   r5   r   r   r   r   r     s    zNetBSDTestCase.test_vmem_freec                 C   s$   t t j| d tk s td S )NzBuffers:)rF   r0   rN   r   r   r   r5   r   r   r   r   r     s    z NetBSDTestCase.test_vmem_buffersc                 C   s$   t t j| d tk s td S )Nz
MemShared:)rF   r0   rN   Zsharedr   r   r5   r   r   r   r   test_vmem_shared  s    zNetBSDTestCase.test_vmem_sharedc                 C   s$   t t j| d tk s td S )NzCached:)rF   r0   rN   r   r   r   r5   r   r   r   r   r   $  s    zNetBSDTestCase.test_vmem_cachedc                 C   s$   t t j| d tk s td S )Nz
SwapTotal:)rF   r0   r   r@   r   r   r5   r   r   r   r   r   ,  s    z!NetBSDTestCase.test_swapmem_totalc                 C   s$   t t j| d tk s td S )Nz	SwapFree:)rF   r0   r   rB   r   r   r5   r   r   r   r   r   2  s    z NetBSDTestCase.test_swapmem_freec                 C   s"   t  }|j|j|j kstd S r%   )r0   r   rA   r@   rB   r5   )r6   Zsmemr   r   r   r   8  s    z NetBSDTestCase.test_swapmem_usedc              	   C   sd   t dd6}|D ]"}|drt| d } q<qtdW 5 Q R X tt j| dk s`t	d S )N
/proc/statrbs   intrr   couldn't find liner   )
r   r   r   r   r   rF   r0   r   r   r5   )r6   r   r!   r   r   r   r   r   >  s    
z(NetBSDTestCase.test_cpu_stats_interruptsc              	   C   sd   t dd6}|D ]"}|drt| d } q<qtdW 5 Q R X tt j| dk s`t	d S )Nr   r   s   ctxtr   r   r   )
r   r   r   r   r   rF   r0   r   r   r5   )r6   r   r!   r   r   r   r   r   H  s    
z*NetBSDTestCase.test_cpu_stats_ctx_switchesN)rZ   r[   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
			
r   )"r]   r   osrU   r2   r0   r   r   r   r   Zpsutil.testsr   r   r   r	   r
   r   r   r   r   Zpsutil._psutil_posixr   r   getuidr   r   r   r_   r`   r$   ra   r   r   r   r   r   r   r   <module>
   sJ   QX x