U
    !h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
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r>d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)mock)AIX)BSD)LINUX)MACOS)OPENBSD)POSIX)SUNOS)AARCH64)HAS_NET_IO_COUNTERS)
PYTHON_EXE)PsutilTestCase)pytest)retry_on_failure)sh)skip_on_access_denied)spawn_subproc)	terminate)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)ZfmtpidcmdoutputZ
all_outputline r$   =./venv/lib/python3.8/site-packages/psutil/tests/test_posix.pyr   ,   s0    

r   c                 C   s"   d}t rd}t||  }|d S )NcommandZcommr   )r	   r   split)r    fieldr&   r$   r$   r%   ps_namec   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_argsk   s    
r/   c                 C   s   d}t rd}t|| S )NZrssZrssizer   r   r    r(   r$   r$   r%   ps_rssu   s    r2   c                 C   s   d}t rd}t|| S )NZvszZvsizer0   r1   r$   r$   r%   ps_vsz|   s    r3   c           	   
   C   s   zt d|   }W n> tk
rT } z dt| krBt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 zdevice busyzdf returned EBUSY
r               %r+   )r   r   RuntimeErrorr   lowerr   skipr'   r   floatr   )	devicer.   errr#   Zfields	sys_totalsys_usedsys_freesys_percentr$   r$   r%   df   s    
rD   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    rK   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ProcessrP   AssertionError)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    rQ   rR   uidsrealrS   )rT   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    rQ   rR   ZgidsrX   rS   )rT   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    rQ   rR   usernamerS   )rT   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)rQ   rR   r   patchKeyErrorr\   r   rW   rX   rS   called)rT   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   r5   )timesleepr2   r    rQ   rR   memory_inforS   )rT   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 )Nrd   r   r5   )re   rf   r3   r    rQ   rR   rg   rS   )rT   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.\dr+   z\d)r)   r    ospathbasenamer;   rQ   rR   namer,   r-   rS   )rT   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fooZbarpsutil._psplatform.Process.nameZreturn_value"psutil._psplatform.Process.cmdline)r   r_   rQ   rR   rm   rS   )rT   rm   cmdlinerb   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 Nro   rp   rq   rr   r   r+   r^   )r   r_   rQ   ZAccessDeniedrR   rm   rS   rT   rm   rb   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 ru   )r   r_   rQ   ZNoSuchProcessrR   r   raisesrm   rv   r$   r$   r%   test_name_long_cmdline_nsp_exc   s    
z*TestProcess.test_name_long_cmdline_nsp_exczps -o start not availablerE   c                 C   s\   t d| j}t| j }tj|d}t|}tj|d}|||hksXt	d S )Nr   z%H:%M:%S)
r   r    rQ   rR   Zcreate_timedatetimefromtimestampstrftimeroundrS   )rT   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 rN   )r)   r    rQ   rR   exerS   len)rT   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 )
r/   r    joinrQ   rR   rs   r
   r   
startswithrS   )rT   Z
ps_cmdlineZpsutil_cmdliner$   r$   r%   test_cmdline*  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    rQ   rR   r   rS   )rT   Zps_niceZpsutil_nicer$   r$   r%   	test_nice8  s    zTestProcess.test_niceN)__name__
__module____qualname____doc__classmethodrM   rO   rU   rY   rZ   r]   rc   r   r   rh   ri   rn   rt   rw   ry   r   markskipifr   r   r~   r   r   r	   r   r   r$   r$   r$   r%   rG      s8   

	

rG   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  }t	dt
| d S )Nr    r   r   c                    s   g | ]}| kr|qS r$   r$   .0x)pids_psr$   r%   
<listcomp>Q  s      z,TestSystemAPIs.test_pids.<locals>.<listcomp>c                    s   g | ]}| kr|qS r$   r$   r   )pids_psutilr$   r%   r   Q  s     zdifference: )sortedr   rQ   Zpidsr   r   insertr   r   failr   )rT   
differencer$   )r   r   r%   	test_pidsD  s    zTestSystemAPIs.test_pidszunreliable on SUNOSrE   Zifconfigzno ifconfig cmdznot supportedc                 C   sP   t d}tjddD ]6}| D ]}||r  qq td| d| qd S )Nzifconfig -aT)Zperniczcouldn't find z nic in 'ifconfig -a' output
)r   rQ   Znet_io_countersr'   r   r   r   )rT   r"   Znicr#   r$   r$   r%   test_nic_namesX  s    
zTestSystemAPIs.test_nic_namesc              	   C   s,  t d}| stdg }| D ]~}| d }| d }tsJtrzt| d }W n$ t	k
r   t| d }Y nX |
|||f q&|
||f q&tstrdd t D }nd	d t D }t|t|kstt|t|kstt D ]"}|jd k	r|jdkstqd S )
Nwho -uno users on this systemr   r   c                 S   s   g | ]}|j |j|jfqS r$   )rm   terminalr    r   ur$   r$   r%   r   {  s     z-TestSystemAPIs.test_users.<locals>.<listcomp>c                 S   s   g | ]}|j |jfqS r$   )rm   r   r   r$   r$   r%   r   }  s     )r   r   r   r<   r   r'   r   r   r   r   r   rQ   usersr   rS   r   r    )rT   r.   Zsusersr#   r[   r   r    Zpusersr$   r$   r%   
test_usersg  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
)rQ   Zwho)r   r   r   r<   r,   findallZsubTestrQ   r   	enumeraterz   r{   startedr|   rS   )rT   r.   Ztstampr   idxr   Zpsutil_valuer$   r$   r%   test_users_started  s6    
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.killr+   r^   )r   r_   OSErrorerrnoEBADFr   rx   rQ   _psposixZ
pid_existsrj   getpidra   rS   rT   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.waitpidr+   r^   )r   r_   r   r   r   r   rx   rQ   r   wait_pidrj   r   ra   rS   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   r+   r^   g{Gz?)timeout)r   r_   r   r   ZEINTRr   rx   rQ   r   ZTimeoutExpiredr   rj   r   ra   rS   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   r   rq   )r   r_   r   rx   r   rQ   r   r   rj   r   ra   rS   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   )rQ   Zdisk_partitions
disk_usageZ
mountpointrD   r>   r:   r   r;   abstotalrS   usedfreepercent)	rT   Z	tolerancepartusager@   rA   rB   rC   r?   r$   r$   r%   test_disk_usage  s&    zTestSystemAPIs.test_disk_usageN)r   r   r   r   r   r   r   r   r   r	   shutilwhichr   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r   @  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   rS   resourcemmapZPAGESIZE)rT   Zpagesizer$   r$   r%   test_getpagesize  s    zTestMisc.test_getpagesizeN)r   r   r   r   r$   r$   r$   r%   r     s   r   )N),r   rz   r   rj   r,   r   rI   re   Zunittestr   rQ   r   r   r   r   r   r   r	   Zpsutil.testsr
   r   r   r   r   r   r   r   r   r   r   r   Zpsutil._psutil_posixr   r   r)   r/   r2   r3   rD   r   r   rG   r   r   r$   r$   r$   r%   <module>   sX   
7
 - .