B
    çÚ†\@  ã               @   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 ddlmZ ddlmZ d%dd„Zdd„ Z dd„ Z!e "e d¡G d d!„ d!ej#ƒƒZ$e "e d¡G d"d#„ d#ej#ƒƒZ%e&d$kr°ee'ƒ dS )&zPOSIX specific tests.é    N)ÚAIX)ÚBSD)ÚLINUX)ÚMACOS)ÚOPENBSD)ÚPOSIX)ÚSUNOS)ÚAPPVEYOR)Úget_kernel_version)Úget_test_subprocess)ÚHAS_NET_IO_COUNTERS)Úmock)Ú
PYTHON_EXE)Úreap_children)Úretry_before_failing)Úrun_test_module_by_name)Úsh)Úskip_on_access_denied)ÚTRAVIS)Úunittest)Úwait_for_pid)Úwhichc          	   C   sø   dg}t r| d¡ |dk	r0| dt|ƒg¡ ntr@| d¡ n
| d¡ trfddd	d
h}| | | ¡} | d| g¡ t|ƒ}t rŠ| ¡ }n| ¡ dd… }g }x@|D ]8}| ¡ }yt	|ƒ}W n t
k
rÐ   Y nX | |¡ q¤W |dkrì|S |d S dS )z|
    Wrapper 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ÚcommandÚcommÚstartZstimez-oé   r   )r   ÚappendÚextendÚstrr   Úgetr   Ú
splitlinesÚstripÚintÚ
ValueError)ZfmtÚpidÚcmdZfmt_mapÚoutputZ
all_outputÚline© r)   ú6lib/python3.7/site-packages/psutil/tests/test_posix.pyr   *   s8    



r   c             C   s   d}t rd}t|| ƒ ¡ d S )Nr   r   r   )r   r   Úsplit)r%   Úfieldr)   r)   r*   Úps_nameg   s    r-   c             C   s   d}t strd}t|| ƒS )Nr   Úargs)r   r   r   )r%   r,   r)   r)   r*   Úps_argsn   s    r/   z
POSIX onlyc               @   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 epžed¡dd„ ƒZdd „ Zd!d"„ Ze ed#¡e ed$¡d%d&„ ƒƒZ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| _t| jƒ d S )Nz-Ez-O)Ústdin)r   r   Ú
subprocessÚPIPEr%   r   )Úclsr)   r)   r*   Ú
setUpClassy   s    
zTestProcess.setUpClassc             C   s
   t ƒ  d S )N)r   )r4   r)   r)   r*   ÚtearDownClass   s    zTestProcess.tearDownClassc             C   s,   t d| jƒ}t | j¡ ¡ }|  ||¡ d S )NÚppid)r   r%   ÚpsutilÚProcessr7   ÚassertEqual)ÚselfZppid_psZppid_psutilr)   r)   r*   Ú	test_ppidƒ   s    zTestProcess.test_ppidc             C   s.   t d| jƒ}t | j¡ ¡ j}|  ||¡ d S )NZuid)r   r%   r8   r9   ÚuidsÚrealr:   )r;   Zuid_psZ
uid_psutilr)   r)   r*   Útest_uidˆ   s    zTestProcess.test_uidc             C   s.   t d| jƒ}t | j¡ ¡ j}|  ||¡ d S )NZrgid)r   r%   r8   r9   Zgidsr>   r:   )r;   Zgid_psZ
gid_psutilr)   r)   r*   Útest_gid   s    zTestProcess.test_gidc             C   s,   t d| jƒ}t | j¡ ¡ }|  ||¡ d S )NÚuser)r   r%   r8   r9   Úusernamer:   )r;   Zusername_psZusername_psutilr)   r)   r*   Útest_username’   s    zTestProcess.test_usernamec          	   C   sJ   t  ¡ }tjdtd*}|  | ¡ t| ¡ j	ƒ¡ |j
s<t‚W d Q R X d S )Nzpsutil.pwd.getpwuid)Úside_effect)r8   r9   r   ÚpatchÚKeyErrorr:   rB   r   r=   r>   ÚcalledÚAssertionError)r;   ÚpZfunr)   r)   r*   Útest_username_no_resolution—   s    z'TestProcess.test_username_no_resolutionc             C   s>   t  d¡ td| jƒ}t | j¡ ¡ d d }|  ||¡ d S )Ngš™™™™™¹?Zrssr   i   )ÚtimeÚsleepr   r%   r8   r9   Úmemory_infor:   )r;   Zrss_psZ
rss_psutilr)   r)   r*   Útest_rss_memory    s    
zTestProcess.test_rss_memoryc             C   s>   t  d¡ td| jƒ}t | j¡ ¡ d d }|  ||¡ d S )Ngš™™™™™¹?Zvszr   i   )rK   rL   r   r%   r8   r9   rM   r:   )r;   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|¡}|  ||¡ d S )Nz\d.\dÚ z\d)r-   r%   ÚosÚpathÚbasenameÚlowerr8   r9   ÚnameÚreÚsubr:   )r;   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¡ W d Q R X W d Q R X d S )Nzlong-program-namezlong-program-name-extendedZfooZbarzpsutil._psplatform.Process.name)Úreturn_valuez"psutil._psplatform.Process.cmdline)r   rE   r8   r9   r:   rU   )r;   rU   ÚcmdlinerI   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¡ W d Q R X W d Q R X d S )Nzlong-program-namezpsutil._psplatform.Process.name)rY   z"psutil._psplatform.Process.cmdliner   rP   )rD   )r   rE   r8   ÚAccessDeniedr9   r:   rU   )r;   rU   rI   r)   r)   r*   Útest_name_long_cmdline_ad_excÏ   s    
z)TestProcess.test_name_long_cmdline_ad_excc          
   C   s\   d}t jd|d@ t jdt dd¡d t ¡ }|  tj|j¡ W d Q R X W d Q R X d S )Nzlong-program-namezpsutil._psplatform.Process.name)rY   z"psutil._psplatform.Process.cmdliner   rP   )rD   )r   rE   r8   ZNoSuchProcessr9   ÚassertRaisesrU   )r;   rU   rI   r)   r)   r*   Útest_name_long_cmdline_nsp_excÛ   s    
z*TestProcess.test_name_long_cmdline_nsp_exczps -o start not availablec             C   s\   t d| jƒ}t | j¡ ¡ }tj |¡ d¡}t|ƒ}tj |¡ d¡}|  	|||g¡ d S )Nr   z%H:%M:%S)
r   r%   r8   r9   Zcreate_timeÚdatetimeZfromtimestampZstrftimeÚroundÚassertIn)r;   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¡ ¡ }y|  ||¡ W n0 tk
rZ   |d t|ƒ… }|  ||¡ Y nX d S )N)r-   r%   r8   r9   Zexer:   rH   Úlen)r;   Zps_pathnameZpsutil_pathnameZadjusted_ps_pathnamer)   r)   r*   Útest_exeó   s    
zTestProcess.test_exec             C   s0   t | jƒ}d t | j¡ ¡ ¡}|  ||¡ d S )Nú )r/   r%   Újoinr8   r9   rZ   r:   )r;   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 ¡  ¡ }|  ||¡ d S )NÚnice)r   r%   r8   r9   ri   r:   )r;   Zps_niceZpsutil_nicer)   r)   r*   Ú	test_nice  s    zTestProcess.test_nicec       	         s"  ‡ fdd„}t  t ¡ ¡}g }ddddddd	d
ddddg}trRtƒ dk rR| d¡ trjtƒ dk rj| d¡ x˜tt jƒD ]Š‰ ˆ  d¡svˆ |krqvqvy0| 	¡ }xt
dƒD ]}||ˆ ƒ q¤W | 	¡ }W n t jk
rÖ   Y qvX t|| ƒdkrvdˆ ||f }| |¡ qvW |r|  dd |¡ ¡ d S )Nc                sB   d}t | ˆ d ƒ}|d k	r:t|ƒr:ˆ dkr0tjf}||Ž  n| d S )Nr)   Úrlimit)ÚgetattrÚcallabler8   ZRLIMIT_NOFILE)rI   Úattrr.   )rU   r)   r*   Úcall  s    
z&TestProcess.test_num_fds.<locals>.callZ	terminateÚkillZsuspendZresumeri   Zsend_signalÚwaitZchildrenZas_dictZmemory_info_exÚparentÚparents)é   é   é$   rk   )rt   ru   é   Znum_ctx_switchesÚ_rt   r   z@failure while processing Process.%s method (before=%s, after=%s)Ú
)r8   r9   rQ   Úgetpidr   r
   r   ÚdirÚ
startswithZnum_fdsÚranger\   ÚabsÚfailrg   )	r;   ro   rI   ZfailuresZignored_namesZnum1ÚxZnum2r   r)   )rU   r*   Útest_num_fds  s4    




zTestProcess.test_num_fdsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr5   r6   r<   r?   r@   rC   rJ   r   r   rN   rO   rX   r[   r]   r_   r   ÚskipIfr   r   rc   re   rh   r   r   rj   r   r)   r)   r)   r*   r0   u   s,   			

r0   c               @   sº   e Zd ZdZeƒ dd„ ƒZe ed¡e e	d¡e e
dƒ d¡e e d¡d	d
„ ƒƒƒƒZe epne	one ¡  d¡eƒ dd„ ƒƒZdd„ Zdd„ Zdd„ Zdd„ Ze ed¡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)   )Ú.0r€   )Úpids_psr)   r*   ú
<listcomp>N  s    z,TestSystemAPIs.test_pids.<locals>.<listcomp>c                s   g | ]}|ˆ kr|‘qS r)   r)   )r‰   r€   )Úpids_psutilr)   r*   r‹   O  s    zdifference: )
Úsortedr   r8   Zpidsr   r   Úinsertrd   r   r   )r;   Ú
differencer)   )rŠ   rŒ   r*   Ú	test_pidsA  s    zTestSystemAPIs.test_pidszunreliable on SUNOSzunreliable on TRAVISZifconfigzno ifconfig cmdznot supportedc             C   sV   t dƒ}xHtjdd ¡ D ]4}x.| ¡ D ]}| |¡r(P q(W |  d||f ¡ qW d S )Nzifconfig -aT)Zpernicz/couldn't find %s nic in 'ifconfig -a' output
%s)r   r8   Znet_io_countersÚkeysr+   r|   r   )r;   r'   Znicr(   r)   r)   r*   Útest_nic_namesT  s    
zTestSystemAPIs.test_nic_namesz unreliable on APPVEYOR or TRAVISc             C   sx   t dƒ}| d¡}dd„ |D ƒ}dd„ |D ƒ}|  t|ƒtt ¡ ƒ¡ x,t ¡ D ] }|  |j|¡ |  |j|¡ qPW d S )NZwhory   c             S   s   g | ]}|  ¡ d  ‘qS )r   )r+   )r‰   r€   r)   r)   r*   r‹   j  s    z-TestSystemAPIs.test_users.<locals>.<listcomp>c             S   s   g | ]}|  ¡ d  ‘qS )r   )r+   )r‰   r€   r)   r)   r*   r‹   k  s    )	r   r+   r:   rd   r8   Úusersrb   rU   Zterminal)r;   ÚoutÚlinesr“   Z	terminalsÚur)   r)   r*   Ú
test_usersd  s    
zTestSystemAPIs.test_usersc          	   C   sF   t jdttjdƒd&}|  ttjjt	 
¡ ¡ |js8t‚W d Q R X d S )Nzpsutil._psposix.os.killrP   )rD   )r   rE   ÚOSErrorÚerrnoÚEBADFr^   r8   Ú_psposixZ
pid_existsrQ   rz   rG   rH   )r;   Úmr)   r)   r*   Útest_pid_exists_let_raiseq  s    z(TestSystemAPIs.test_pid_exists_let_raisec          	   C   sF   t jdttjdƒd&}|  ttjjt	 
¡ ¡ |js8t‚W d Q R X d S )Nzpsutil._psposix.os.waitpidrP   )rD   )r   rE   r˜   r™   rš   r^   r8   r›   Úwait_pidrQ   rz   rG   rH   )r;   rœ   r)   r)   r*   Útest_os_waitpid_let_raisez  s    z(TestSystemAPIs.test_os_waitpid_let_raisec          	   C   sN   t jdttjdƒd.}| jtjjtjj	t
 ¡ dd |js@t‚W d Q R X d S )Nzpsutil._psposix.os.waitpidrP   )rD   g{®Gáz„?)Ztimeout)r   rE   r˜   r™   ZEINTRr^   r8   r›   ZTimeoutExpiredrž   rQ   rz   rG   rH   )r;   rœ   r)   r)   r*   Útest_os_waitpid_eintr‚  s    z$TestSystemAPIs.test_os_waitpid_eintrc          	   C   s>   t jddd&}|  ttjjt ¡ ¡ |j	s0t
‚W d Q R X d S )Nzpsutil._psposix.os.waitpid)r   éÿÿÿÿ)rY   )r   rE   r^   r$   r8   r›   rž   rQ   rz   rG   rH   )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d„ }d}xÌt jddD ]¼}t  |j¡}y||jƒ\}}}}W nL tk
rŒ }	 z.t|	ƒ ¡ }	d|	ksvd|	ksvd|	krzwn‚ W d d }	~	X Y qX | j|j	||d	 | j|j
||d	 | j|j||d	 | j|j|d
d	 qW d S )Nc             S   sv   t d|  ƒ ¡ }| d¡d }| ¡ }t|d ƒd }t|d ƒd }t|d ƒd }t|d  dd	¡ƒ}||||fS )
Nzdf -k %sry   r   i   rt   é   é   ú%rP   )r   r"   r+   r#   ÚfloatÚreplace)Údevicer”   r(   ZfieldsÚtotalÚusedÚfreeÚpercentr)   r)   r*   Údf–  s    z*TestSystemAPIs.test_disk_usage.<locals>.dfi  @ F)Úallzno such file or directoryzraw devices not supportedzpermission denied)Zdeltar   )r8   Zdisk_partitionsZ
disk_usageZ
mountpointr¨   ÚRuntimeErrorr   rT   ZassertAlmostEqualr©   rª   r«   r¬   )
r;   r­   Z	toleranceÚpartZusager©   rª   r«   r¬   Úerrr)   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	   r8   r“   r—   r   rŸ   r    r¢   r   r²   r)   r)   r)   r*   rˆ   =  s   

			rˆ   Ú__main__)N)(r…   r`   r™   rQ   rV   r2   rK   r8   r   r   r   r   r   r   r   Zpsutil.testsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r/   r‡   ZTestCaser0   rˆ   r‚   Ú__file__r)   r)   r)   r*   Ú<module>   sN   
=
 H
y
