o
    av                     @   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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' G dd de"Z(e)d d!Z*G d"d# d#e"Z+e',ej-.e! d$G d%d& d&e"Z/e0d'krdd(l1m2Z2 e2e3 dS dS ))z
Miscellaneous tests.
    N)LINUX)POSIX)WINDOWS)debug)memoize)memoize_when_activated)supports_ipv6)wrap_numbers)PY3)redirect_stderr)APPVEYOR)
CI_TESTING)HAS_BATTERY)HAS_MEMORY_MAPS)HAS_NET_IO_COUNTERS)HAS_SENSORS_BATTERY)HAS_SENSORS_FANS)HAS_SENSORS_TEMPERATURES)
PYTHON_EXE)ROOT_DIR)SCRIPTS_DIR)PsutilTestCase)import_module_by_path)mock)reload_module)sh)unittestc                   @   s   e Zd Zef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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ed+d,d- Zd.d/ Zd0d1 Zd2d3 Zd4S )5TestMiscc                 C   s   t |  j}||}| d| | d|j | | dt|  |dd | d| | d| |	  |
  ||}| d| | d| tjjt jd	t t d
% t  }||}| d|j | | d| | d| W d    n1 sw   Y  tjjt jd	t t d
% t  }||}| d|j | | d| | d| W d    n1 sw   Y  tjjt jd	t t d
  t  }||}| d|j | | d| W d    d S 1 sw   Y  d S )Nzpsutil.Processzpid=%sz	name='%s'zname=u'zname='zstatus=z	exitcode=zstatus='terminated'nameZside_effectzstatus='zombie'zname=Z
terminated)psutilProcessZspawn_testprocpidassertInstrr   replaceassertNotInZ	terminatewaitr   patchobjectZombieProcessosgetpidNoSuchProcessAccessDenied)selffuncpr r3   8/usr/lib/python3/dist-packages/psutil/tests/test_misc.pytest_process__repr__;   sP   
"zTestMisc.test_process__repr__c                 C   s   | j td d S )N)r0   )r5   r$   r/   r3   r3   r4   test_process__str___      zTestMisc.test_process__str__c                 C   6   |  ttdd |  ttjddddd d S )NA  z=psutil.NoSuchProcess(pid=321, msg='process no longer exists')r   msgr   r;   z5psutil.NoSuchProcess(pid=321, name='name', msg='msg'))assertEqualreprr    r-   r6   r3   r3   r4   test_no_such_process__repr__b      z%TestMisc.test_no_such_process__repr__c                 C   r9   )Nr:   z"process no longer exists (pid=321)r   r;   r<   msg (pid=321, name='name'))r=   r$   r    r-   r6   r3   r3   r4   test_no_such_process__str__j   r@   z$TestMisc.test_no_such_process__str__c              	   C   8   |  ttdd |  ttjdddddd d S )Nr:   zGpsutil.ZombieProcess(pid=321, msg="PID still exists but it's a zombie")r   @  foor   Zppidr;   z?psutil.ZombieProcess(pid=321, ppid=320, name='name', msg='foo'))r=   r>   r    r*   r6   r3   r3   r4   test_zombie_process__repr__r   s   z$TestMisc.test_zombie_process__repr__c              	   C   rC   )Nr:   z,PID still exists but it's a zombie (pid=321)r   rD   rE   rF   z$foo (pid=321, ppid=320, name='name'))r=   r$   r    r*   r6   r3   r3   r4   test_zombie_process__str__{   s   z#TestMisc.test_zombie_process__str__c                 C   r9   )Nr:   zpsutil.AccessDenied(pid=321)r   r;   r<   z4psutil.AccessDenied(pid=321, name='name', msg='msg'))r=   r>   r    r.   r6   r3   r3   r4   test_access_denied__repr__   r@   z#TestMisc.test_access_denied__repr__c                 C   r9   )Nr:   z	(pid=321)r   r;   r<   rA   )r=   r$   r    r.   r6   r3   r3   r4   test_access_denied__str__   r@   z"TestMisc.test_access_denied__str__c                 C   r9   )N   z?psutil.TimeoutExpired(seconds=5, msg='timeout after 5 seconds')r:   r   r"   r   zUpsutil.TimeoutExpired(pid=321, name='name', seconds=5, msg='timeout after 5 seconds'))r=   r>   r    TimeoutExpiredr6   r3   r3   r4   test_timeout_expired__repr__   r@   z%TestMisc.test_timeout_expired__repr__c                 C   r9   )NrK   ztimeout after 5 secondsr:   r   rL   z.timeout after 5 seconds (pid=321, name='name'))r=   r$   r    rM   r6   r3   r3   r4   test_timeout_expired__str__   r@   z$TestMisc.test_timeout_expired__str__c                 C   s>   t  }t  }| || d|_| || | |d d S )N)r   r   rE   )r    r!   r=   Z_identZassertNotEqual)r/   Zp1Zp2r3   r3   r4   test_process__eq__   s   zTestMisc.test_process__eq__c                 C   s(   t t t g}| t|d d S )N   )setr    r!   r=   len)r/   sr3   r3   r4   test_process__hash__   s   zTestMisc.test_process__hash__c              	   C   s   t t}|D ]?}|dv rq|dsEzt| W q tyD   |tjvrBtt|}|d u r/Y q|jd urBd|j vrB| 	d|  Y qw qtjD ]}| 
|| qId S )N)ZlongZteststestPermissionErrorProcessLookupError_Z
deprecatedz%r not in psutil.__all__)dirr    
startswith
__import__ImportError__all__getattr__doc__lowerfailr#   )r/   Z
dir_psutilr   Zfunr3   r3   r4   test__all__   s,   




zTestMisc.test__all__c                 C   s$   |  ddd tjD tj d S )N.c                 S   s   g | ]}t |qS r3   )r$   ).0xr3   r3   r4   
<listcomp>   s    z)TestMisc.test_version.<locals>.<listcomp>)r=   joinr    version_info__version__r6   r3   r3   r4   test_version   s   zTestMisc.test_versionc                 C   s"   t  }d|_| d|  d S )N1rE   )r    r!   rE   r&   as_dict)r/   r1   r3   r3   r4   !test_process_as_dict_no_new_names   s   z*TestMisc.test_process_as_dict_no_new_namesc                    s  t  fdd}g  tdD ]}| }di f}| || | t d qtdD ]}|d}di f}| || | t d q*tdD ]}|ddd}dddif}| || | t d	 qG|  | }di f}| || | t d
 | |jd d S )Nc                     s     d | |fS )foo docstringNappend)argskwargsZcallsr3   r4   rE      s   
z"TestMisc.test_memoize.<locals>.foo   r3   rQ   )rQ   )barrv         ro   )r   ranger=   rS   cache_clearr`   )r/   rE   rf   retZexpectedr3   rt   r4   test_memoize   s0   zTestMisc.test_memoizec                    s   G  fddd}| }g  |   |   | t d g  |j | |   |   | t d g  |j | |   |   | t d d S )Nc                       s   e Zd Ze fddZdS )z1TestMisc.test_memoize_when_activated.<locals>.Fooc                    s     d  d S Nrp   r6   rt   r3   r4   rE         z5TestMisc.test_memoize_when_activated.<locals>.Foo.fooN)__name__
__module____qualname__r   rE   r3   rt   r3   r4   Foo   s    r   ru   rQ   )rE   r=   rS   Zcache_activateZcache_deactivate)r/   r   fr3   rt   r4   test_memoize_when_activated   s    z$TestMisc.test_memoize_when_activatedc                 C   s   ddl m} dd }| |d|ddi | |d|dd|d	d
i | |d|dd|d	di | |d|dd|d	d
i | |d|ddi | |d|ddi | |d|ddi d S )Nr   )parse_environ_blockc                 S   s   t r|  S | S r}   )r   upper)rT   r3   r3   r4   k  r8   z,TestMisc.test_parse_environ_block.<locals>.kza=1 arl   z	a=1 b=2  b2za=1 b=   za=1 b=2  c=3 zxxx a=1 z	a=1 =b=2 za=1 b=2)psutil._commonr   r=   )r/   r   r   r3   r3   r4   test_parse_environ_block  s"   




z!TestMisc.test_parse_environ_blockc              	   C   s  |  tj t rtd}d|_t  t rJ W d    n1 s%w   Y  t  tjdtjd}t r<J |jsAJ W d    n1 sKw   Y  t  tjdtj	d}t rbJ t  |jskJ W d    n1 suw   Y  t  tjdtj	d}t rJ t  |jsJ W d    d S 1 sw   Y  d S | 
t" ttjtj}z|d W |  n|  w W d    d S 1 sw   Y  d S )Nzpsutil._common.socketFzpsutil._common.socket.socketr   z!psutil._common.socket.socket.bind)z::1r   )Z
addCleanupr   rz   r   r(   Zhas_ipv6socketerrorcalledZgaierrorassertRaises	ExceptionZAF_INET6ZSOCK_STREAMZbindclose)r/   rT   Zsockr3   r3   r4   test_supports_ipv6&  sN   


""zTestMisc.test_supports_ipv6c                 C   sB  ddl m} tjt}||sJ |tj|rJ tjdt	t
jdd | t	|| W d    n1 s9w   Y  tjdt	t
jdd | t	|| W d    n1 s[w   Y  tjdt	t
jdd ||rrJ W d    n1 s|w   Y  tjddd ||rJ W d    d S 1 sw   Y  d S )	Nr   )isfile_strictzpsutil._common.os.statrE   r   zpsutil._common.stat.S_ISREGFZreturn_value)r   r   r+   pathabspath__file__dirnamer   r(   OSErrorerrnoEPERMr   ZEACCESENOENT)r/   r   Z	this_filer3   r3   r4   test_isfile_strictI  s,   


"zTestMisc.test_isfile_strictc                    s    fdd}|t    |t   |t   |t   |t jdd |t   tr7t	j
ds7nts?|t   |t   |t t	  |t   d S )Nc                    s<   t d urt t |  t| }t|} | | d S r}   )jsonloadsdumpspickler=   )r{   r   r   r6   r3   r4   check[  s
   

z*TestMisc.test_serialization.<locals>.checkr   )intervalz/proc/diskstats)r    r!   rm   Zvirtual_memoryZswap_memoryZ	cpu_timesZcpu_times_percentnet_io_countersr   r+   r   existsr   disk_io_countersZdisk_partitions
disk_usagegetcwdusers)r/   r   r3   r6   r4   test_serializationZ  s   zTestMisc.test_serializationz*temporarily disabled due to setuptools bugc                 C   sT   t jtd}trt j|s| dS t|}| t	|j
 | | tj d S )Nzsetup.pyzcan't find setup.py)r+   r   rh   r   r   r   skipTestr   r   
SystemExitZsetupr=   Zget_versionr    rj   )r/   Zsetup_pymoduler3   r3   r4   test_setup_scriptr  s   
zTestMisc.test_setup_scriptc              	   C   s
  t jjtjdtjd}t  |jsJ W d    n1 sw   Y  t jjtjdtdd}t  |js;J W d    n1 sEw   Y  t jjtjdtd'}| 	t t  W d    n1 siw   Y  |jssJ W d    d S 1 s~w   Y  d S )NZcreate_timer   rQ   )
r   r(   r)   r    r!   r.   r   r*   
ValueErrorr   )r/   Zmethr3   r3   r4   test_ad_on_process_creation{  s.   
"z$TestMisc.test_ad_on_process_creationc              	   C   s|   t jddd- | t}tt W d    n1 sw   Y  | dt|j	  W d    d S 1 s7w   Y  d S )Nzpsutil._psplatform.cext.versionz0.0.0r   zversion conflict)
r   r(   r   r]   r   r    r#   r$   Z	exceptionra   )r/   cmr3   r3   r4   test_sanity_version_check  s   
"z"TestMisc.test_sanity_version_checkc                 C   sF  t r	ddlm} nddlm} t| }td W d    n1 s#w   Y  | }|ds5J || d| | t	dd| t| }tt
d W d    n1 s[w   Y  | }| d| | d	| t| }td
d}d|_t| W d    n1 sw   Y  | }| d| | d| d S )Nr   )StringIOZhellozpsutil-debugz.pyc.pyzthis is an errorzignoring ValueErrorz'this is an error'ru   zno such filez/foo)r
   ior   r   r   getvaluer[   r#   r   r%   r   r   filename)r/   r   r   r;   excr3   r3   r4   
test_debug  s0   


zTestMisc.test_debugN) r   r   r   r>   r5   r7   r?   rB   rG   rH   rI   rJ   rN   rO   rP   rU   rc   rk   rn   r|   r   r   r   r   r   r   skipIfr   r   r   r   r   r3   r3   r3   r4   r   9   s6    $		##

r   rE   za b cc                   @   s   e Zd Zdd Ze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dd Zee ddd ZdS )TestWrapNumbersc                 C   s   t   d S r}   )r	   rz   r6   r3   r3   r4   setUp  s   zTestWrapNumbers.setUpc                 C   s&   dt dddi}| t|d| d S Ndisk1rK   disk_iontr=   r	   r/   inputr3   r3   r4   test_first_call  s   zTestWrapNumbers.test_first_callc                 C   s8   dt dddi}| t|d| | t|d| d S r   r   r   r3   r3   r4   test_input_hasnt_changed  s   z(TestWrapNumbers.test_input_hasnt_changedc                 C   s   dt dddi}| t|d| dt dddi}| t|d| dt dddi}| t|d| dt dddi}| t|d| d S )	Nr   rK   r   
               r   r   r3   r3   r4   test_increase_but_no_wrap  s   z)TestWrapNumbers.test_increase_but_no_wrapc                 C   s  dt dddi}| t|d| dt dddi}| t|ddt dddi dt dddi}| t|ddt dddi dt dddi}| t|ddt dddi dt dddi}| t|ddt ddd	i dt dddi}| t|ddt ddd	i dt d
ddi}| t|ddt ddd	i dt dddi}| t|ddt ddd	i dt dddi}| t|ddt ddd	i d S )Nr   d   r   r   n   Z      r      2      (   r   r   r3   r3   r4   	test_wrap  sD   zTestWrapNumbers.test_wrapc                 C   st   dt dddi}| t|d| t dddt dddd}| t|d| dt dddi}| t|d| d S )Nr   rK   r      r   Zdisk2   r   r   r3   r3   r4   test_changing_keys  s   

z"TestWrapNumbers.test_changing_keysc                 C   s.  t dddt dddd}| t|d| t dddt dddd}| t|dt dddt dddd dt dddi}| t|d| t dddt dddd}| t|d| t dddt dddd}| t|d| t dddt dddd}| t|dt dddt dddd d S )Nr   r   r   r   r   r   r   r   r   r3   r3   r4   test_changing_keys_w_wrap  s<   













z)TestWrapNumbers.test_changing_keys_w_wrapc                 C   sb   ddddd}|  t|d| |  t|d| ddddd}t|d}|  |d d	 d
 d S )N)	i,      #  R       ȷ  )	i  ru   i tU i   i  r   r   r   r   )	6   r   i $ i N rx      r   i     )	iU	  i  i"  r   i  i4  i  i  i\  )nvme0n1Z	nvme0n1p1Z	nvme0n1p2Z	nvme0n1p3r   )	r   r   r   r   r   r   r   r   r   r   r   i  )r=   r	   )r/   doutr3   r3   r4   test_real_data#  s   
zTestWrapNumbers.test_real_datac                 C   sb   dt dddi}t|d t }| |d d|i | |d di i | |d di i d S )Nr   rK   r   r   rQ   ru   r   r	   
cache_infor=   r/   r   cacher3   r3   r4   test_cache_first_call4  s   
z%TestWrapNumbers.test_cache_first_callc                 C   s   dt dddi}t|d dt dddi}t|d t }| |d d|i | |d dddddi | |d di i d S )	Nr   rK   r   r   r   rQ   )r   r   )r   rQ   r   ru   ru   r   r   r3   r3   r4   test_cache_call_twice<  s   

z%TestWrapNumbers.test_cache_call_twicec                    s  dt dddi}t|d dt dddi}t|d t } |d d|i  |d dddddi  |d ddtd	gii  fd
d}dt dddi}t|d t } |d d|i |  dt dddi}t|d t } |d d|i |  dt dddi}t|d t } |d d|i  |d dddddi  |d ddtd	gii d S )Nr   r   r   r   r   rQ   r   ru   r   c                     sF   t  }  | d dddddi  | d ddtdgii d S )	NrQ   r   r   r   r   ru   r   r   )r	   r   r=   rR   )r   r6   r3   r4   assert_W  s   
z0TestWrapNumbers.test_cache_wrap.<locals>.assert_r   r   r   )r   r	   r   r=   rR   )r/   r   r   r   r3   r6   r4   test_cache_wrapH  s>   





"zTestWrapNumbers.test_cache_wrapc                 C   s   dt dddi}t|d t dddt dddd}t|d t }| |d d|i | |d dddddi | |d	 di i d S )
Nr   rK   r   r   r   r   rQ   r   ru   r   r   r3   r3   r4   test_cache_changing_keysx  s   



z(TestWrapNumbers.test_cache_changing_keysc                 C   s\   dt dddi}t|d t|d td | t i i i f td td d S )Nr   rK   r   z?!?)r   r	   rz   r=   r   r   r3   r3   r4   test_cache_clear  s   



z TestWrapNumbers.test_cache_clearnot supportedc                 C   s   t  rt  s| dS t   t   t }|D ]}| d| | d| qt j  t }|D ]}| d| | d| q5t j  t }| 	|i i i f d S )Nzno disks or NICs availablezpsutil.disk_io_counterszpsutil.net_io_counters)
r    r   r   r   r	   r   r#   rz   r&   r=   )r/   Zcachesr   r3   r3   r4   test_cache_clear_public_apis  s    


z,TestWrapNumbers.test_cache_clear_public_apisN)r   r   r   r   ZtearDownr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r3   r3   r4   r     s"    
%0	r   zcan't locate scripts directoryc                   @   s~  e Zd ZdZedd Zed<ddZdd Ze	e
 d	d
d Zdd Zdd Zdd Zdd Ze	eo:e  ddd Zdd Zdd Zdd Zdd Ze	e dd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Ze	e  d.d/d0 Z!d1d2 Z"e	e# dd3d4 Z$e	e% dd5d6 Z&e	e' de	e( d7d8d9 Z)e	e' de	e( d7d:d; Z*dS )=TestScriptsz-Tests for scripts in the "scripts" directory.c              
   O   s   dt jt|  } t| g}|D ]}|| qzt|fi | }W n ty@ } zdt	|v r;t	|W  Y d }~S  d }~ww |sGJ ||S )Nz%sr.   )
r+   r   rh   r   r   rq   r   stripRuntimeErrorr$   )exerr   rs   cmdargr   errr3   r3   r4   assert_stdout  s   zTestScripts.assert_stdoutNc                 C   sf   t jt| } trt| ddd}nt| d}| | }W d    n1 s'w   Y  t| d S )NZrtutf8)encoding)	r+   r   rh   r   r
   openreadastparse)r   rr   r   srcr3   r3   r4   assert_syntax  s   

zTestScripts.assert_syntaxc                 C   sV   t | }ttD ]}|dr(dtj|d  |vr(| dtjt|  q	d S )Nr   Ztest_r   zno test defined for %r script)	rZ   r+   listdirr   endswithr   splitextrb   rh   )r/   Zmethsr   r3   r3   r4   test_coverage  s   
zTestScripts.test_coveragez
POSIX onlyc                 C   s`   t tD ](\}}}|D ] }|dr,t j||}tjt |tj @ s,| 	d| qqd S )Nr   z%r is not executable)
r+   walkr   r
  r   rh   statS_IXUSRST_MODErb   )r/   rootdirsfilesfiler   r3   r3   r4   test_executable  s   
zTestScripts.test_executablec                 C      |  d d S )Nzdisk_usage.pyr   r6   r3   r3   r4   test_disk_usage     zTestScripts.test_disk_usagec                 C   r  )Nzfree.pyr  r6   r3   r3   r4   	test_free  r  zTestScripts.test_freec                 C   r  )Nz
meminfo.pyr  r6   r3   r3   r4   test_meminfo  r  zTestScripts.test_meminfoc                 C      |  dtt  d S )Nzprocinfo.pyr   r$   r+   r,   r6   r3   r3   r4   test_procinfo  s   zTestScripts.test_procinfozno usersc                 C   r  )Nzwho.pyr  r6   r3   r3   r4   test_who  r~   zTestScripts.test_whoc                 C   r  )Nzps.pyr  r6   r3   r3   r4   test_ps  r  zTestScripts.test_psc                 C   r  )Nz	pstree.pyr  r6   r3   r3   r4   test_pstree  r  zTestScripts.test_pstreec                 C   r  )Nz
netstat.pyr  r6   r3   r3   r4   test_netstat  r  zTestScripts.test_netstatc                 C   r  )Nzifconfig.pyr  r6   r3   r3   r4   test_ifconfig  r  zTestScripts.test_ifconfigr   c                 C   r  )Nzpmap.pyr  r6   r3   r3   r4   	test_pmap  s   zTestScripts.test_pmapc                 C   s*   dt   jvr| d| d d S )NZussr   zprocsmem.py)r    r!   Zmemory_full_info_fieldsr   r   r6   r3   r3   r4   test_procsmem  s   
zTestScripts.test_procsmemc                 C   r  )Nz
killall.pyr  r6   r3   r3   r4   test_killall  r  zTestScripts.test_killallc                 C   r  )Nz	nettop.pyr'  r6   r3   r3   r4   test_nettop  r  zTestScripts.test_nettopc                 C   r  )Nztop.pyr'  r6   r3   r3   r4   test_top  r  zTestScripts.test_topc                 C   r  )Nziotop.pyr'  r6   r3   r3   r4   
test_iotop
  r  zTestScripts.test_iotopc                 C   s,   |  dt  }| tt | d S )Nzpidof.py)r   r    r!   r   r#   r$   r+   r,   )r/   outputr3   r3   r4   
test_pidof  s   zTestScripts.test_pidofzWINDOWS onlyc                 C   r  )Nzwinservices.pyr  r6   r3   r3   r4   test_winservices  r~   zTestScripts.test_winservicesc                 C   r  )Nzcpu_distribution.pyr'  r6   r3   r3   r4   test_cpu_distribution  r  z!TestScripts.test_cpu_distributionc                 C       t  s	| d | d d S )Nzno temperaturesztemperatures.py)r    Zsensors_temperaturesr   r   r6   r3   r3   r4   test_temperatures     
zTestScripts.test_temperaturesc                 C   r0  )Nzno fanszfans.py)r    Zsensors_fansr   r   r6   r3   r3   r4   	test_fans  r2  zTestScripts.test_fansz
no batteryc                 C   r  )Nz
battery.pyr  r6   r3   r3   r4   test_battery$     zTestScripts.test_batteryc                 C   r  )Nz
sensors.pyr  r6   r3   r3   r4   test_sensors)  r5  zTestScripts.test_sensorsr}   )+r   r   r   r`   staticmethodr   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/  r   r1  r   r3  r   r   r4  r6  r3   r3   r3   r4   r     sP    








r   __main__)run_from_name)4r`   r  collectionsr   r   r+   r   r   r  r    Zpsutil.testsr   r   r   r   r   r   r   r   r	   Zpsutil._compatr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
namedtupler   r   r   r   r   r   r   Zpsutil.tests.runnerr9  r   r3   r3   r3   r4   <module>   sl       p 
