U
    ;g D                     @   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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rNddlZddlZddlm Z  d,ddZ!dd Z"dd Z#d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+dS )-zPOSIX specific tests.    N)AIX)BSD)LINUX)MACOS)OPENBSD)POSIX)SUNOS)AARCH64)HAS_NET_IO_COUNTERS)
PYTHON_EXE)	QEMU_USER)PsutilTestCase)mock)pytest)retry_on_failure)sh)skip_on_access_denied)spawn_testproc)	terminate)which)getpagesizec              	   C   s   dg}t r|d |dk	r0|dt|g nts8trD|d n
|d tr^| dd} |d	| g t|}t r| n| d
d }g }|D ]8}|	 }zt
|}W n tk
r   Y nX || q|dkr|S |d S dS )zwWrapper for calling the ps command with a little bit of cross-platform
    support for a narrow range of features.
    psz--no-headersNz-pz-AZaxstartZstimez-o   r   )r   appendextendstrr   r   replacer   
splitlinesstripint
ValueError)fmtpidcmdoutput
all_outputline r(   ;/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_posix.pyr   /   s0    

r   c                 C   s>   d}t rd}t||  }tr6d|d ks.t|d S |d S )NcommandZcommz
/bin/qemu-r   r   )r   r   splitr   AssertionError)r#   fieldr*   r(   r(   r)   ps_nameg   s    r.   c                 C   s0   d}t strd}t|| }tdd|}| S )Nr*   argsz\(python.*?\)$ )r   r   r   resubr   )r#   r-   outr(   r(   r)   ps_argsr   s    
r4   c                 C   s   d}t rd}t|| S )NZrssZrssizer   r   r#   r-   r(   r(   r)   ps_rss|   s    r7   c                 C   s   d}t rd}t|| S )NZvszZvsizer5   r6   r(   r(   r)   ps_vsz   s    r8   c           	   
   C   s   zt d|   }W n> tk
rR } z dt| kr@td W 5 d }~X Y nX |dd }| }t|d d }t|d d }t|d d }t	|d	 
d
d}||||fS )Nzdf -k %szdevice busyzdf returned EBUSY
r               %r0   )r   r   RuntimeErrorr   lowerr   skipr+   r    floatr   )	devicer3   errr'   fields	sys_totalsys_usedsys_freesys_percentr(   r(   r)   df   s    
rJ   z
POSIX onlyreasonc                   @   s   e Zd ZdZedd Zedd Zdd Zdd	 Zd
d Z	dd Z
dd Ze e dd Ze e dd Zdd Zdd Zdd Zdd Zejjepedddd Zd d! Ze d"d# Zejjed$dejjed%dd&d' Zd(S ))TestProcesszBCompare psutil results against 'ps' command line utility (mainly).c                 C   s   t tddgtjdj| _d S )Nz-Ez-O)stdin)r   r   
subprocessPIPEr#   clsr(   r(   r)   
setUpClass   s     zTestProcess.setUpClassc                 C   s   t | j d S N)r   r#   rQ   r(   r(   r)   tearDownClass   s    zTestProcess.tearDownClassc                 C   s,   t d| j}t| j }||ks(td S )Nppid)r   r#   psutilProcessrV   r,   )selfZppid_psZppid_psutilr(   r(   r)   	test_ppid   s    zTestProcess.test_ppidc                 C   s.   t d| j}t| j j}||ks*td S )Nuid)r   r#   rW   rX   uidsrealr,   )rY   Zuid_psZ
uid_psutilr(   r(   r)   test_uid   s    zTestProcess.test_uidc                 C   s.   t d| j}t| j j}||ks*td S )NZrgid)r   r#   rW   rX   Zgidsr]   r,   )rY   Zgid_psZ
gid_psutilr(   r(   r)   test_gid   s    zTestProcess.test_gidc                 C   s,   t d| j}t| j }||ks(td S )Nuser)r   r#   rW   rX   usernamer,   )rY   Zusername_psZusername_psutilr(   r(   r)   test_username   s    zTestProcess.test_usernamec              	   C   sJ   t  }tjdtd*}| t| jks2t	|j
s<t	W 5 Q R X d S )Nzpsutil.pwd.getpwuidZside_effect)rW   rX   r   patchKeyErrorra   r   r\   r]   r,   called)rY   pZfunr(   r(   r)   test_username_no_resolution   s    z'TestProcess.test_username_no_resolutionc                 C   s<   t d t| j}t| j d d }||ks8td S )N皙?r   r:   )timesleepr7   r#   rW   rX   memory_infor,   )rY   Zrss_psZ
rss_psutilr(   r(   r)   test_rss_memory   s    

zTestProcess.test_rss_memoryc                 C   s<   t d t| j}t| j d d }||ks8td S )Nri   r   r:   )rj   rk   r8   r#   rW   rX   rl   r,   )rY   Zvsz_psZ
vsz_psutilr(   r(   r)   test_vsz_memory   s    

zTestProcess.test_vsz_memoryc                 C   sv   t | j}tj| }t| j  }t	
dd|}t	
dd|}t	
dd|}t	
dd|}||ksrtd S )Nz\d.\dr0   z\d)r.   r#   ospathbasenamer@   rW   rX   namer1   r2   r,   )rY   Zname_psZname_psutilr(   r(   r)   	test_name   s    
zTestProcess.test_namec              
   C   s^   d}dddg}t jd|d8 t jd|d t }| dksFtW 5 Q R X W 5 Q R X d S )Nlong-program-namezlong-program-name-extendedZfoobarpsutil._psplatform.Process.nameZreturn_value"psutil._psplatform.Process.cmdline)r   rd   rW   rX   rr   r,   )rY   rr   cmdlinerg   r(   r(   r)   test_name_long   s    
 zTestProcess.test_name_longc              
   C   s\   d}t jd|d@ t jdtddd t }| dksDtW 5 Q R X W 5 Q R X d S Nrt   rv   rw   rx   r   r0   rc   )r   rd   rW   ZAccessDeniedrX   rr   r,   rY   rr   rg   r(   r(   r)   test_name_long_cmdline_ad_exc   s    
z)TestProcess.test_name_long_cmdline_ad_excc                 C   sl   d}t jd|dP t jdtddd. t }ttj |  W 5 Q R X W 5 Q R X W 5 Q R X d S r{   )r   rd   rW   ZNoSuchProcessrX   r   raisesrr   r|   r(   r(   r)   test_name_long_cmdline_nsp_exc  s    
z*TestProcess.test_name_long_cmdline_nsp_exczps -o start not availablerK   c                 C   s\   t d| j}t| j }tj|d}t|}tj|d}|||fksXt	d S )Nr   z%H:%M:%S)
r   r#   rW   rX   Zcreate_timedatetimefromtimestampstrftimeroundr,   )rY   Ztime_psZtime_psutilZtime_psutil_tstampZround_time_psutilZround_time_psutil_tstampr(   r(   r)   test_create_time  s    zTestProcess.test_create_timec                 C   s`   t | j}t| j }z||ks(tW n0 tk
rZ   |d t| }||ksVtY nX d S rT   )r.   r#   rW   rX   Zexer,   len)rY   Zps_pathnameZpsutil_pathnameZadjusted_ps_pathnamer(   r(   r)   test_exe  s    
zTestProcess.test_exec                 C   sT   t | j}dt| j }trDt|t|k rD||sPt	n||ksPt	d S )N )
r4   r#   joinrW   rX   ry   r	   r   
startswithr,   )rY   Z
ps_cmdlineZpsutil_cmdliner(   r(   r)   test_cmdline1  s
    
zTestProcess.test_cmdlineznot reliable on SUNOSznot reliable on AIXc                 C   s(   t d| j}t  }||ks$td S )Nnice)r   r#   rW   rX   r   r,   )rY   Zps_niceZpsutil_nicer(   r(   r)   	test_nice?  s    zTestProcess.test_niceN)__name__
__module____qualname____doc__classmethodrS   rU   rZ   r^   r_   rb   rh   r   r   rm   rn   rs   rz   r}   r   r   markskipifr   r   r   r   r   r   r   r   r(   r(   r(   r)   rM      s8   

	

rM   c                   @   s   e Zd ZdZe dd Zejje	ddejje
d ddejje ddd	d
 Ze dd Ze dd Zdd Zdd Zdd Zdd Zejjedde dd ZdS )TestSystemAPIszTest some system APIs.c                    s~   t td t ts$tr0d kr0 dd t t dkrz fddD fdd D  }| dt	| d S )Nr#   r   r   c                    s   g | ]}| kr|qS r(   r(   .0x)pids_psr(   r)   
<listcomp>X  s      z,TestSystemAPIs.test_pids.<locals>.<listcomp>c                    s   g | ]}| kr|qS r(   r(   r   )pids_psutilr(   r)   r   X  s     zdifference: )
sortedr   rW   Zpidsr   r   insertr   failr   )rY   
differencer(   )r   r   r)   	test_pidsK  s    zTestSystemAPIs.test_pidszunreliable on SUNOSrK   Zifconfigzno ifconfig cmdznot supportedc                 C   sL   t d}tjddD ]2}| D ]}||r  qq | d||f qd S )Nzifconfig -aT)Zpernicz/couldn't find %s nic in 'ifconfig -a' output
%s)r   rW   Znet_io_countersr+   r   r   )rY   r%   Znicr'   r(   r(   r)   test_nic_names_  s    
zTestSystemAPIs.test_nic_namesc              	   C   s   t d}| std|d}dd |D }dd |D }t|tt ksXt| j	t |dV t
t D ]B\}}|j|| kst|j|| kst|jd k	rxt|j qxW 5 Q R X d S )Nwho -uno users on this systemr9   c                 S   s   g | ]}|  d  qS )r   r+   r   r(   r(   r)   r   v  s     z-TestSystemAPIs.test_users.<locals>.<listcomp>c                 S   s   g | ]}|  d  qS )r   r   r   r(   r(   r)   r   w  s     rW   Zwho)r   r   r   rA   r+   r   rW   usersr,   subTest	enumeraterr   Zterminalr#   rX   )rY   r3   linesr   Z	terminalsidxur(   r(   r)   
test_usersp  s    


zTestSystemAPIs.test_usersc              	   C   s   t d}| stdd }td|}|r4d}nNtd|}|rJd}n8td|}|r`d}n"td	|}|rd}d
d |D }|std| | jt |d@ t	t D ],\}}t
j
|j|}||| kstqW 5 Q R X d S )Nr   r   z\d\d\d\d-\d\d-\d\d \d\d:\d\dz%Y-%m-%d %H:%Mz[A-Z][a-z][a-z] \d\d \d\d:\d\dz%b %d %H:%Mz[A-Z][a-z][a-z] \d\dz%b %dz[a-z][a-z][a-z] \d\dc                 S   s   g | ]}|  qS r(   )
capitalizer   r(   r(   r)   r     s     z5TestSystemAPIs.test_users_started.<locals>.<listcomp>z(cannot interpret tstamp in who output
%sr   )r   r   r   rA   r1   findallr   rW   r   r   r   r   startedr   r,   )rY   r3   Ztstampr   r   r   Zpsutil_valuer(   r(   r)   test_users_started  s:    
z!TestSystemAPIs.test_users_startedc              
   C   sV   t jdttjdd6}tt tj	t
  W 5 Q R X |jsHtW 5 Q R X d S )Nzpsutil._psposix.os.killr0   rc   )r   rd   OSErrorerrnoEBADFr   r~   rW   _psposixZ
pid_existsro   getpidrf   r,   rY   mr(   r(   r)   test_pid_exists_let_raise  s     
z(TestSystemAPIs.test_pid_exists_let_raisec              
   C   sV   t jdttjdd6}tt tj	t
  W 5 Q R X |jsHtW 5 Q R X d S )Npsutil._psposix.os.waitpidr0   rc   )r   rd   r   r   r   r   r~   rW   r   wait_pidro   r   rf   r,   r   r(   r(   r)   test_os_waitpid_let_raise  s     
z(TestSystemAPIs.test_os_waitpid_let_raisec              
   C   s^   t jdttjdd>}ttjj	 tjj
t dd W 5 Q R X |jsPtW 5 Q R X d S )Nr   r0   rc   g{Gz?)timeout)r   rd   r   r   ZEINTRr   r~   rW   r   TimeoutExpiredr   ro   r   rf   r,   r   r(   r(   r)   test_os_waitpid_eintr  s     
z$TestSystemAPIs.test_os_waitpid_eintrc              
   C   sN   t jddd6}tt tjt	  W 5 Q R X |j
s@tW 5 Q R X d S )Nr   )r   rw   )r   rd   r   r~   r!   rW   r   r   ro   r   rf   r,   r   r(   r(   r)   test_os_waitpid_bad_ret_status  s     z-TestSystemAPIs.test_os_waitpid_bad_ret_statuszunreliable on AIXc           	      C   s   d}t jddD ]}t |j}zt|j\}}}}W nP tk
r } z2t| }d|ksld|ksld|krtW Y q W 5 d }~X Y qX t	|j
| |k stt	|j| |k stt	|j| |k stt	|j| dkstqd S )Ni  @ F)allzno such file or directoryzraw devices not supportedzpermission deniedr   )rW   Zdisk_partitions
disk_usageZ
mountpointrJ   rC   r?   r   r@   abstotalr,   usedfreepercent)	rY   Z	tolerancepartusagerF   rG   rH   rI   rD   r(   r(   r)   test_disk_usage  s&    zTestSystemAPIs.test_disk_usageN)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   G  s$   


&
	
r   c                   @   s   e Zd Zdd ZdS )TestMiscc                 C   s4   t  }|dkst|t  ks"t|tjks0td S )Nr   )r   r,   resourcemmapZPAGESIZE)rY   Zpagesizer(   r(   r)   test_getpagesize  s    zTestMisc.test_getpagesizeN)r   r   r   r   r(   r(   r(   r)   r     s   r   )N),r   r   r   ro   r1   rO   rj   rW   r   r   r   r   r   r   r   Zpsutil.testsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zpsutil._psutil_posixr   r   r.   r4   r7   r8   rJ   r   r   rM   r   r   r(   r(   r(   r)   <module>   sZ   
8
 - #