
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    =_9                     @   s  d Z ddlm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# ddlm$Z$ dd lm%Z% ej&j'Z'e( Z)d!Z*d"d# Z+G d$d% d%e$Z,G d&d' d'e,Z-e%.e d(G d)d* d*e$Z/G d+d, d,e$Z0e1d-krdd.l2m3Z3 e3e4 dS )/a  
Tests for detecting function memory leaks (typically the ones
implemented in C). It does so by calling a function many times and
checking whether process memory usage keeps increasing between
calls or over time.
Note that this may produce false positives (especially on Windows
for some reason).
PyPy appears to be completely unstable for this framework, probably
because of how its JIT handles memory, so tests are skipped.
    )print_functionN)LINUX)MACOS)OPENBSD)POSIX)SUNOS)WINDOWS)ProcessLookupError)super)create_sockets)
get_testfn)HAS_CPU_AFFINITY)HAS_CPU_FREQ)HAS_ENVIRON)
HAS_IONICE)HAS_MEMORY_MAPS)HAS_NET_IO_COUNTERS)HAS_PROC_CPU_NUM)HAS_PROC_IO_COUNTERS)
HAS_RLIMIT)HAS_SENSORS_BATTERY)HAS_SENSORS_FANS)HAS_SENSORS_TEMPERATURES)process_namespace)skip_on_access_denied)spawn_testproc)system_namespace)	terminate)TestMemoryLeak)unittest   c                  C   s   dd } | S )zsDecorator for those Linux functions which are implemented in pure
    Python, and which we want to run faster.
    c                    s   t   fdd}|S )Nc                    sJ   t r6| jj}zt| j_ | f||W S || j_X n | f||S d S N)r   	__class__times	FEW_TIMES)selfargskwargsbeforefun M/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_memleaks.pywrapperA   s    z5fewtimes_if_linux.<locals>.decorator.<locals>.wrapper)	functoolswraps)r*   r-   r+   r)   r,   	decorator@   s    
z$fewtimes_if_linux.<locals>.decoratorr+   )r0   r+   r+   r,   fewtimes_if_linux<   s    r1   c                   @   s  e Zd ZdZeZdd Ze dd Ze dd Z	e dd	 Z
e d
d Zee de dd Zee de dd Ze dd Zdd Zdd Zee ddd Zee ddd Zee de dd Zeeddd  Ze d!d" Ze eed#d$d% Zee d&d'd( Zee de d)d* Z e d+d, Z!e eed#d-d. Z"e d/d0 Z#e ee$ dd1d2 Z%e d3d4 Z&e d5d6 Z'ee de d7d8 Z(d9d: Z)e d;d< Z*ee+ dd=d> Z,ee+ dd?d@ Z-e dAdB Z.ee/ de dCdD Z0ee1 dEee2 ddFdG Z3ee1 dEee2 ddHdI Z4e eedJdKdL Z5ee6 ddMdN Z7ee d&dOdP Z8dQS )RTestProcessObjectLeaksz$Test leaks of Process class methods.c                 C   s    t d }|| |j|j  d S r!   )r   test_class_coverageZgettersZsettersr%   nsr+   r+   r,   test_coverageZ   s    z$TestProcessObjectLeaks.test_coveragec                 C   s   |  | jj d S r!   )executeprocnamer%   r+   r+   r,   	test_name^   s    z TestProcessObjectLeaks.test_namec                 C   s   |  | jj d S r!   )r7   r8   Zcmdliner:   r+   r+   r,   test_cmdlineb   s    z#TestProcessObjectLeaks.test_cmdlinec                 C   s   |  | jj d S r!   )r7   r8   Zexer:   r+   r+   r,   test_exef   s    zTestProcessObjectLeaks.test_exec                 C   s   |  | jj d S r!   )r7   r8   ppidr:   r+   r+   r,   	test_ppidj   s    z TestProcessObjectLeaks.test_ppidz
POSIX onlyc                 C   s   |  | jj d S r!   )r7   r8   Zuidsr:   r+   r+   r,   	test_uidsn   s    z TestProcessObjectLeaks.test_uidsc                 C   s   |  | jj d S r!   )r7   r8   Zgidsr:   r+   r+   r,   	test_gidss   s    z TestProcessObjectLeaks.test_gidsc                 C   s   |  | jj d S r!   )r7   r8   statusr:   r+   r+   r,   test_statusx   s    z"TestProcessObjectLeaks.test_statusc                 C   s   |  | jj d S r!   )r7   r8   nicer:   r+   r+   r,   	test_nice|   s    z TestProcessObjectLeaks.test_nicec                    s    t    fdd d S )Nc                      s   j  S r!   )r8   rD   r+   Znicenessr%   r+   r,   <lambda>       z6TestProcessObjectLeaks.test_nice_set.<locals>.<lambda>)thisprocrD   r7   r:   r+   rF   r,   test_nice_set   s    z$TestProcessObjectLeaks.test_nice_setnot supportedc                 C   s   |  | jj d S r!   )r7   r8   ionicer:   r+   r+   r,   test_ionice   s    z"TestProcessObjectLeaks.test_ionicec                    sZ   t r"t   fdd n4  fdd ttjt	 dd} 
t| d S )Nc                      s    j S r!   )r8   rL   r+   r%   valuer+   r,   rG      rH   z8TestProcessObjectLeaks.test_ionice_set.<locals>.<lambda>c                      s    j tjS r!   )r8   rL   psutilZIOPRIO_CLASS_NONEr+   r:   r+   r,   rG      rH   r   )r   rI   rL   r7   r.   partialcextZproc_ioprio_setosgetpidexecute_w_excOSErrorr%   r*   r+   rN   r,   test_ionice_set   s    z&TestProcessObjectLeaks.test_ionice_setc                 C   s   |  | jj d S r!   )r7   r8   Zio_countersr:   r+   r+   r,   test_io_counters   s    z'TestProcessObjectLeaks.test_io_counterszworthless on POSIXc                 C   s   t    | | jj d S r!   )rP   Processusernamer7   r8   r:   r+   r+   r,   test_username   s    z$TestProcessObjectLeaks.test_usernamec                 C   s   |  | jj d S r!   )r7   r8   Zcreate_timer:   r+   r+   r,   test_create_time   s    z'TestProcessObjectLeaks.test_create_time)Zonly_ifc                 C   s   |  | jj d S r!   )r7   r8   num_threadsr:   r+   r+   r,   test_num_threads   s    z'TestProcessObjectLeaks.test_num_threadsWINDOWS onlyc                 C   s   |  | jj d S r!   )r7   r8   Znum_handlesr:   r+   r+   r,   test_num_handles   s    z'TestProcessObjectLeaks.test_num_handlesc                 C   s   |  | jj d S r!   )r7   r8   Znum_fdsr:   r+   r+   r,   test_num_fds   s    z#TestProcessObjectLeaks.test_num_fdsc                 C   s   |  | jj d S r!   )r7   r8   Znum_ctx_switchesr:   r+   r+   r,   test_num_ctx_switches   s    z,TestProcessObjectLeaks.test_num_ctx_switchesc                 C   s   |  | jj d S r!   )r7   r8   threadsr:   r+   r+   r,   test_threads   s    z#TestProcessObjectLeaks.test_threadsc                 C   s   |  | jj d S r!   )r7   r8   	cpu_timesr:   r+   r+   r,   test_cpu_times   s    z%TestProcessObjectLeaks.test_cpu_timesc                 C   s   |  | jj d S r!   )r7   r8   Zcpu_numr:   r+   r+   r,   test_cpu_num   s    z#TestProcessObjectLeaks.test_cpu_numc                 C   s   |  | jj d S r!   )r7   r8   Zmemory_infor:   r+   r+   r,   test_memory_info   s    z'TestProcessObjectLeaks.test_memory_infoc                 C   s   |  | jj d S r!   )r7   r8   Zmemory_full_infor:   r+   r+   r,   test_memory_full_info   s    z,TestProcessObjectLeaks.test_memory_full_infoc                 C   s   |  | jj d S r!   )r7   r8   terminalr:   r+   r+   r,   test_terminal   s    z$TestProcessObjectLeaks.test_terminalc                 C   s$   t rtn| j}| j| jj|d d S )Nr#   )r   r$   r#   r7   r8   resumer%   r#   r+   r+   r,   test_resume   s    z"TestProcessObjectLeaks.test_resumec                 C   s   |  | jj d S r!   )r7   r8   cwdr:   r+   r+   r,   test_cwd   s    zTestProcessObjectLeaks.test_cwdc                 C   s   |  | jj d S r!   )r7   r8   cpu_affinityr:   r+   r+   r,   test_cpu_affinity   s    z(TestProcessObjectLeaks.test_cpu_affinityc                    s4   t    fdd tfdd d S )Nc                      s   j  S r!   r8   rt   r+   Zaffinityr%   r+   r,   rG      rH   z>TestProcessObjectLeaks.test_cpu_affinity_set.<locals>.<lambda>c                      s    j dgS NrQ   rv   r+   r:   r+   r,   rG      rH   )rI   rt   r7   rV   
ValueErrorr:   r+   rw   r,   test_cpu_affinity_set   s     
z,TestProcessObjectLeaks.test_cpu_affinity_setc              	   C   s*   t t d | | jj W 5 Q R X d S )Nw)openr   r7   r8   Z
open_filesr:   r+   r+   r,   test_open_files   s    z&TestProcessObjectLeaks.test_open_filesc                 C   s   |  | jj d S r!   )r7   r8   Zmemory_mapsr:   r+   r+   r,   test_memory_maps   s    z'TestProcessObjectLeaks.test_memory_mapsz
LINUX onlyc                    s      fdd d S )Nc                      s    j tjS r!   r8   rlimitrP   RLIMIT_NOFILEr+   r:   r+   r,   rG      rH   z4TestProcessObjectLeaks.test_rlimit.<locals>.<lambda>r7   r:   r+   r:   r,   test_rlimit   s    z"TestProcessObjectLeaks.test_rlimitc                    s<   t tj  fdd ttffdd d S )Nc                      s   j tj S r!   r   r+   limitr%   r+   r,   rG      rH   z8TestProcessObjectLeaks.test_rlimit_set.<locals>.<lambda>c                      s    j dS rx   )r8   r   r+   r:   r+   r,   rG      rH   )rI   r   rP   r   r7   rV   rW   ry   r:   r+   r   r,   test_rlimit_set   s    z&TestProcessObjectLeaks.test_rlimit_setzworthless on WINDOWSc              	      s6   t  & trdnd  fdd W 5 Q R X d S )Ninetallc                      s   j  S r!   )r8   Zconnectionsr+   kindr%   r+   r,   rG      rH   z9TestProcessObjectLeaks.test_connections.<locals>.<lambda>)r   r   r7   r:   r+   r   r,   test_connections   s    z'TestProcessObjectLeaks.test_connectionsc                 C   s   |  | jj d S r!   )r7   r8   environr:   r+   r+   r,   test_environ  s    z#TestProcessObjectLeaks.test_environc                 C   s   |  dd  d S )Nc                   S   s   t t S r!   )rS   	proc_inforT   rU   r+   r+   r+   r,   rG     rH   z7TestProcessObjectLeaks.test_proc_info.<locals>.<lambda>r   r:   r+   r+   r,   test_proc_info  s    z%TestProcessObjectLeaks.test_proc_infoN)9__name__
__module____qualname____doc__rI   r8   r6   r1   r;   r<   r=   r?   r   skipIfr   r@   rA   rC   rE   rJ   r   rM   rY   r   rZ   r]   r^   r   r   r`   r   rb   rc   rd   rf   rh   r   ri   rj   rk   rm   rq   rs   r   ru   rz   r}   r   r~   r   r   r   r   r   r   r   r   r+   r+   r+   r,   r2   U   s   






	













r2   c                       sp   e Zd ZdZe fddZe fddZdd Zerhdd	 Z	d
d Z
dd Zdd Zdd Zdd Z  ZS )TestTerminatedProcessLeakszRepeat the tests above looking for leaks occurring when dealing
    with terminated processes raising NoSuchProcess exception.
    The C functions are still invoked but will follow different code
    paths. We'll check those code paths.
    c                    s:   t    t | _t| jj| _| j  | j	  d S r!   )
r
   
setUpClassr   subprP   r[   pidr8   killwaitclsr"   r+   r,   r     s
    

z%TestTerminatedProcessLeaks.setUpClassc                    s   t    t| j d S r!   )r
   tearDownClassr   r   r   r   r+   r,   r     s    
z(TestTerminatedProcessLeaks.tearDownClassc                 C   s&   z
|  W n t jk
r    Y nX d S r!   )rP   NoSuchProcessrX   r+   r+   r,   call  s    
zTestTerminatedProcessLeaks.callc                 C   s   |  | jj d S r!   )r7   r8   r   r:   r+   r+   r,   	test_kill'  s    z$TestTerminatedProcessLeaks.test_killc                 C   s   |  | jj d S r!   )r7   r8   r   r:   r+   r+   r,   test_terminate*  s    z)TestTerminatedProcessLeaks.test_terminatec                 C   s   |  | jj d S r!   )r7   r8   Zsuspendr:   r+   r+   r,   test_suspend-  s    z'TestTerminatedProcessLeaks.test_suspendc                 C   s   |  | jj d S r!   )r7   r8   ro   r:   r+   r+   r,   rq   0  s    z&TestTerminatedProcessLeaks.test_resumec                 C   s   |  | jj d S r!   )r7   r8   r   r:   r+   r+   r,   	test_wait3  s    z$TestTerminatedProcessLeaks.test_waitc                    s    fdd}  | d S )Nc                      s*   zt  jjW S  tk
r$   Y nX d S r!   )rS   r   r8   r   r	   r+   r:   r+   r,   r   8  s    z7TestTerminatedProcessLeaks.test_proc_info.<locals>.callr   )r%   r   r+   r:   r,   r   6  s    z)TestTerminatedProcessLeaks.test_proc_info)r   r   r   r   classmethodr   r   r   r   r   r   r   rq   r   r   __classcell__r+   r+   r   r,   r     s   r   ra   c                   @   s   e Zd Zdd Zdd ZdS )TestProcessDualImplementationc                 C   s   |  dd  d S )Nc                   S   s   t jt ddS )NTZuse_pebrS   Zproc_cmdlinerT   rU   r+   r+   r+   r,   rG   E  rH   zETestProcessDualImplementation.test_cmdline_peb_true.<locals>.<lambda>r   r:   r+   r+   r,   test_cmdline_peb_trueD  s    z3TestProcessDualImplementation.test_cmdline_peb_truec                 C   s   |  dd  d S )Nc                   S   s   t jt ddS )NFr   r   r+   r+   r+   r,   rG   H  rH   zFTestProcessDualImplementation.test_cmdline_peb_false.<locals>.<lambda>r   r:   r+   r+   r,   test_cmdline_peb_falseG  s    z4TestProcessDualImplementation.test_cmdline_peb_falseN)r   r   r   r   r   r+   r+   r+   r,   r   A  s   r   c                   @   s  e Zd Z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 ee ddd Zee ddd Zdd Zeeddd Zdd Zdd Zdd Zeeoejd d e d!d" Ze d#d$ Ze ee dd%d& Ze eeo*e  d'kd(d)d* Z!d+d, Z"d-d. Z#e ee$ dd/d0 Z%e ee& dd1d2 Z'e ee( dd3d4 Z)e d5d6 Z*d7d8 Z+erd9d: Z,d;d< Z-d=d> Z.d?d@ Z/dAdB Z0dCS )DTestModuleFunctionsLeaksz&Test leaks of psutil module functions.c                 C   s   t  }|| |j d S r!   )r   r3   r   r4   r+   r+   r,   r6   S  s    z&TestModuleFunctionsLeaks.test_coveragec                 C   s   |  dd  d S )Nc                   S   s   t jddS )NTZlogicalrP   	cpu_countr+   r+   r+   r,   rG   [  rH   z9TestModuleFunctionsLeaks.test_cpu_count.<locals>.<lambda>r   r:   r+   r+   r,   test_cpu_countY  s    z'TestModuleFunctionsLeaks.test_cpu_countc                 C   s   |  dd  d S )Nc                   S   s   t jddS )NFr   r   r+   r+   r+   r,   rG   _  rH   zBTestModuleFunctionsLeaks.test_cpu_count_physical.<locals>.<lambda>r   r:   r+   r+   r,   test_cpu_count_physical]  s    z0TestModuleFunctionsLeaks.test_cpu_count_physicalc                 C   s   |  tj d S r!   )r7   rP   rg   r:   r+   r+   r,   rh   a  s    z'TestModuleFunctionsLeaks.test_cpu_timesc                 C   s   |  dd  d S )Nc                   S   s   t jddS )NT)Zpercpu)rP   rg   r+   r+   r+   r,   rG   g  rH   z=TestModuleFunctionsLeaks.test_per_cpu_times.<locals>.<lambda>r   r:   r+   r+   r,   test_per_cpu_timese  s    z+TestModuleFunctionsLeaks.test_per_cpu_timesc                 C   s   |  tj d S r!   )r7   rP   Z	cpu_statsr:   r+   r+   r,   test_cpu_statsi  s    z'TestModuleFunctionsLeaks.test_cpu_statsrK   c                 C   s   |  tj d S r!   )r7   rP   Zcpu_freqr:   r+   r+   r,   test_cpu_freqm  s    z&TestModuleFunctionsLeaks.test_cpu_freqra   c                 C   s   t   | t j d S r!   )rP   
getloadavgr7   r:   r+   r+   r,   test_getloadavgr  s    z(TestModuleFunctionsLeaks.test_getloadavgc                 C   s   |  tj d S r!   )r7   rP   Zvirtual_memoryr:   r+   r+   r,   test_virtual_memoryy  s    z,TestModuleFunctionsLeaks.test_virtual_memoryz&worthless on SUNOS (uses a subprocess)c                 C   s   |  tj d S r!   )r7   rP   Zswap_memoryr:   r+   r+   r,   test_swap_memory}  s    z)TestModuleFunctionsLeaks.test_swap_memoryc                 C   s$   t rtn| j}| jdd |d d S )Nc                   S   s   t t S r!   )rP   Z
pid_existsrT   rU   r+   r+   r+   r,   rG     rH   z:TestModuleFunctionsLeaks.test_pid_exists.<locals>.<lambda>rn   r   r$   r#   r7   rp   r+   r+   r,   test_pid_exists  s    z(TestModuleFunctionsLeaks.test_pid_existsc                 C   s$   t rtn| j}| jdd |d d S )Nc                   S   s
   t dS )N.)rP   
disk_usager+   r+   r+   r,   rG     rH   z:TestModuleFunctionsLeaks.test_disk_usage.<locals>.<lambda>rn   r   rp   r+   r+   r,   test_disk_usage  s    z(TestModuleFunctionsLeaks.test_disk_usagec                 C   s   |  tj d S r!   )r7   rP   Zdisk_partitionsr:   r+   r+   r,   test_disk_partitions  s    z-TestModuleFunctionsLeaks.test_disk_partitionsz/proc/diskstatsz3/proc/diskstats not available on this Linux versionc                 C   s   |  dd  d S )Nc                   S   s   t jddS NF)Znowrap)rP   Zdisk_io_countersr+   r+   r+   r,   rG     rH   z@TestModuleFunctionsLeaks.test_disk_io_counters.<locals>.<lambda>r   r:   r+   r+   r,   test_disk_io_counters  s    z.TestModuleFunctionsLeaks.test_disk_io_countersc                 C   s   |  tj d S r!   )r7   rP   Zpidsr:   r+   r+   r,   	test_pids  s    z"TestModuleFunctionsLeaks.test_pidsc                 C   s   |  dd  d S )Nc                   S   s   t jddS r   )rP   Znet_io_countersr+   r+   r+   r,   rG     rH   z?TestModuleFunctionsLeaks.test_net_io_counters.<locals>.<lambda>r   r:   r+   r+   r,   test_net_io_counters  s    z-TestModuleFunctionsLeaks.test_net_io_countersr   zneed root accessc              	   C   s0   t jdd t  | dd  W 5 Q R X d S )Nr   r   c                   S   s   t jddS )Nr   r   )rP   net_connectionsr+   r+   r+   r,   rG     rH   z?TestModuleFunctionsLeaks.test_net_connections.<locals>.<lambda>)rP   r   r   r7   r:   r+   r+   r,   test_net_connections  s    z-TestModuleFunctionsLeaks.test_net_connectionsc                 C   s"   t rdn| j}| jtj|d d S )Ni @ )	tolerance)r   r   r7   rP   Znet_if_addrs)r%   r   r+   r+   r,   test_net_if_addrs  s    z*TestModuleFunctionsLeaks.test_net_if_addrsc                 C   s   |  tj d S r!   )r7   rP   Znet_if_statsr:   r+   r+   r,   test_net_if_stats  s    z*TestModuleFunctionsLeaks.test_net_if_statsc                 C   s   |  tj d S r!   )r7   rP   Zsensors_batteryr:   r+   r+   r,   test_sensors_battery  s    z-TestModuleFunctionsLeaks.test_sensors_batteryc                 C   s   |  tj d S r!   )r7   rP   Zsensors_temperaturesr:   r+   r+   r,   test_sensors_temperatures  s    z2TestModuleFunctionsLeaks.test_sensors_temperaturesc                 C   s   |  tj d S r!   )r7   rP   Zsensors_fansr:   r+   r+   r,   test_sensors_fans  s    z*TestModuleFunctionsLeaks.test_sensors_fansc                 C   s   |  tj d S r!   )r7   rP   Z	boot_timer:   r+   r+   r,   test_boot_time  s    z'TestModuleFunctionsLeaks.test_boot_timec                 C   s   |  tj d S r!   )r7   rP   Zusersr:   r+   r+   r,   
test_users  s    z#TestModuleFunctionsLeaks.test_usersc                 C   s   |  tj d S r!   )r7   rS   Zwinservice_enumerater:   r+   r+   r,   test_win_service_iter  s    z.TestModuleFunctionsLeaks.test_win_service_iterc                 C   s   d S r!   r+   r:   r+   r+   r,   test_win_service_get  s    z-TestModuleFunctionsLeaks.test_win_service_getc                    s&   t t   |  fdd d S )Nc                      s
   t  S r!   )rS   Zwinservice_query_configr+   r9   r+   r,   rG     rH   zFTestModuleFunctionsLeaks.test_win_service_get_config.<locals>.<lambda>nextrP   Zwin_service_iterr9   r7   r:   r+   r   r,   test_win_service_get_config  s    z4TestModuleFunctionsLeaks.test_win_service_get_configc                    s&   t t   |  fdd d S )Nc                      s
   t  S r!   )rS   Zwinservice_query_statusr+   r   r+   r,   rG     rH   zFTestModuleFunctionsLeaks.test_win_service_get_status.<locals>.<lambda>r   r:   r+   r   r,   test_win_service_get_status  s    z4TestModuleFunctionsLeaks.test_win_service_get_statusc                    s&   t t   |  fdd d S )Nc                      s
   t  S r!   )rS   Zwinservice_query_descrr+   r   r+   r,   rG     rH   zKTestModuleFunctionsLeaks.test_win_service_get_description.<locals>.<lambda>r   r:   r+   r   r,    test_win_service_get_description  s    z9TestModuleFunctionsLeaks.test_win_service_get_descriptionN)1r   r   r   r   r6   r1   r   r   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   pathexistsr   r   r   r   r   getuidr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   r   P  sp   









r   __main__)run_from_name)5r   
__future__r   r.   rT   rP   Zpsutil._commonr   r   r   r   r   r   Zpsutil._compatr	   r
   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_psplatformrS   r[   rI   r$   r1   r2   r   r   r   r   r   Zpsutil.tests.runnerr   __file__r+   r+   r+   r,   <module>   s`    76 
