o
    h:                     @   s  d 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! ej"j#Z#e$ Z%dZ&d d! Z'G d"d# d#eZ(G d$d% d%e(Z)ej*j+e
 d&d'G d(d) d)eZ,G d*d+ d+eZ-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.
    N)LINUX)MACOS)OPENBSD)POSIX)SUNOS)WINDOWS)AARCH64)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)TestMemoryLeak)create_sockets)
get_testfn)process_namespace)pytest)skip_on_access_denied)spawn_subproc)system_namespace)	terminate   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                    sV   t r | jj}zt| j_ | g|R i |W || j_S || j_w  | g|R i |S N)r   	__class__times	FEW_TIMES)selfargskwargsbeforefun P/var/www/html/ai/venv/lib/python3.10/site-packages/psutil/tests/test_memleaks.pywrapper>   s   z5fewtimes_if_linux.<locals>.decorator.<locals>.wrapper)	functoolswraps)r(   r+   r)   r'   r*   	decorator=   s   z$fewtimes_if_linux.<locals>.decoratorr)   )r.   r)   r)   r*   fewtimes_if_linux8   s   r/   c                   @   s0  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jje dde dd Zejje dde dd Ze dd Zdd Zdd Zejje dddd Zejje dddd Zejje dde dd Zejjeddd d! Ze d"d# Ze eed$d%d& Zejje d'dd(d) Z ejje dde d*d+ Z!e d,d- Z"e eed$d.d/ Z#e d0d1 Z$e ejje% ddd2d3 Z&e d4d5 Z'e d6d7 Z(ejje dde d8d9 Z)d:d; Z*e d<d= Z+ejje, ddd>d? Z-ejje, ddd@dA Z.e dBdC Z/ejje0 dde dDdE Z1ejje2 dFdejje3 dddGdH Z4ejje2 dFdejje3 dddIdJ Z5e ejjedKddLdM Z6ejje7 dddNdO Z8ejje d'ddPdQ Z9dRS )STestProcessObjectLeaksz$Test leaks of Process class methods.c                 C   s    t d }|| |j|j  d S r   )r   test_class_coveragegetterssettersr#   nsr)   r)   r*   test_coverageY      z$TestProcessObjectLeaks.test_coveragec                 C      |  | jj d S r   )executeprocnamer#   r)   r)   r*   	test_name]      z TestProcessObjectLeaks.test_namec                 C   r8   r   )r9   r:   cmdliner<   r)   r)   r*   test_cmdlinea   r>   z#TestProcessObjectLeaks.test_cmdlinec                 C   r8   r   )r9   r:   exer<   r)   r)   r*   test_exee   r>   zTestProcessObjectLeaks.test_exec                 C   r8   r   )r9   r:   ppidr<   r)   r)   r*   	test_ppidi   r>   z TestProcessObjectLeaks.test_ppidz
POSIX onlyreasonc                 C   r8   r   )r9   r:   uidsr<   r)   r)   r*   	test_uidsm      z TestProcessObjectLeaks.test_uidsc                 C   r8   r   )r9   r:   gidsr<   r)   r)   r*   	test_gidsr   rI   z TestProcessObjectLeaks.test_gidsc                 C   r8   r   )r9   r:   statusr<   r)   r)   r*   test_statusw   r>   z"TestProcessObjectLeaks.test_statusc                 C   r8   r   )r9   r:   nicer<   r)   r)   r*   	test_nice{      z TestProcessObjectLeaks.test_nicec                    s    t    fdd d S )Nc                         j  S r   )r:   rN   r)   nicenessr#   r)   r*   <lambda>       z6TestProcessObjectLeaks.test_nice_set.<locals>.<lambda>)thisprocrN   r9   r<   r)   rR   r*   test_nice_set~   r7   z$TestProcessObjectLeaks.test_nice_setnot supportedc                 C   r8   r   )r9   r:   ionicer<   r)   r)   r*   test_ionice   r>   z"TestProcessObjectLeaks.test_ionicec                    s\   t rt   fdd d S   fdd ttjt	 dd} 
t| d S )Nc                      s    j S r   )r:   rY   r)   r#   valuer)   r*   rT      rU   z8TestProcessObjectLeaks.test_ionice_set.<locals>.<lambda>c                          j tjS r   )r:   rY   psutilIOPRIO_CLASS_NONEr)   r<   r)   r*   rT          r   )r   rV   rY   r9   r,   partialcextproc_ioprio_setosgetpidexecute_w_excOSErrorr#   r(   r)   r[   r*   test_ionice_set   s   z&TestProcessObjectLeaks.test_ionice_setc                 C   r8   r   )r9   r:   io_countersr<   r)   r)   r*   test_io_counters   rI   z'TestProcessObjectLeaks.test_io_counterszworthless on POSIXc                 C   s   t    | | jj d S r   )r^   Processusernamer9   r:   r<   r)   r)   r*   test_username   s   z$TestProcessObjectLeaks.test_usernamec                 C   r8   r   )r9   r:   create_timer<   r)   r)   r*   test_create_time   r>   z'TestProcessObjectLeaks.test_create_time)only_ifc                 C   r8   r   )r9   r:   num_threadsr<   r)   r)   r*   test_num_threads   rI   z'TestProcessObjectLeaks.test_num_threadsWINDOWS onlyc                 C   r8   r   )r9   r:   num_handlesr<   r)   r)   r*   test_num_handles   r>   z'TestProcessObjectLeaks.test_num_handlesc                 C   r8   r   )r9   r:   num_fdsr<   r)   r)   r*   test_num_fds   rI   z#TestProcessObjectLeaks.test_num_fdsc                 C   r8   r   )r9   r:   num_ctx_switchesr<   r)   r)   r*   test_num_ctx_switches   r>   z,TestProcessObjectLeaks.test_num_ctx_switchesc                 C   r8   r   )r9   r:   threadsr<   r)   r)   r*   test_threads   rI   z#TestProcessObjectLeaks.test_threadsc                 C   r8   r   )r9   r:   	cpu_timesr<   r)   r)   r*   test_cpu_times   r>   z%TestProcessObjectLeaks.test_cpu_timesc                 C   r8   r   )r9   r:   cpu_numr<   r)   r)   r*   test_cpu_num   rI   z#TestProcessObjectLeaks.test_cpu_numc                 C   r8   r   )r9   r:   memory_infor<   r)   r)   r*   test_memory_info   r>   z'TestProcessObjectLeaks.test_memory_infoc                 C   r8   r   )r9   r:   memory_full_infor<   r)   r)   r*   test_memory_full_info   r>   z,TestProcessObjectLeaks.test_memory_full_infoc                 C   r8   r   )r9   r:   terminalr<   r)   r)   r*   test_terminal   rI   z$TestProcessObjectLeaks.test_terminalc                 C   s$   t rtn| j}| j| jj|d d S )Nr!   )r   r"   r!   r9   r:   resumer#   r!   r)   r)   r*   test_resume      z"TestProcessObjectLeaks.test_resumec                 C   r8   r   )r9   r:   cwdr<   r)   r)   r*   test_cwd   r>   zTestProcessObjectLeaks.test_cwdc                 C   r8   r   )r9   r:   cpu_affinityr<   r)   r)   r*   test_cpu_affinity   r>   z(TestProcessObjectLeaks.test_cpu_affinityc                    s4   t    fdd tfdd d S )Nc                      rQ   r   r:   r   r)   affinityr#   r)   r*   rT      rU   z>TestProcessObjectLeaks.test_cpu_affinity_set.<locals>.<lambda>c                      s    j dgS Nra   r   r)   r<   r)   r*   rT      r`   )rV   r   r9   rg   
ValueErrorr<   r)   r   r*   test_cpu_affinity_set   s   z,TestProcessObjectLeaks.test_cpu_affinity_setc                 C   s@   t t d | | jj W d    d S 1 sw   Y  d S )Nw)openr   r9   r:   
open_filesr<   r)   r)   r*   test_open_files   s   "z&TestProcessObjectLeaks.test_open_filesc                 C   r8   r   )r9   r:   memory_mapsr<   r)   r)   r*   test_memory_maps   rI   z'TestProcessObjectLeaks.test_memory_mapsz
LINUX onlyc                    s      fdd d S )Nc                      r]   r   r:   rlimitr^   RLIMIT_NOFILEr)   r<   r)   r*   rT      r`   z4TestProcessObjectLeaks.test_rlimit.<locals>.<lambda>r9   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*   rT      s    z8TestProcessObjectLeaks.test_rlimit_set.<locals>.<lambda>c                      s    j dS r   )r:   r   r)   r<   r)   r*   rT      rU   )rV   r   r^   r   r9   rg   rh   r   r<   r)   r   r*   test_rlimit_set   s   z&TestProcessObjectLeaks.test_rlimit_setzworthless on WINDOWSc                    sL   t   trdnd  fdd W d    d S 1 sw   Y  d S )Ninetallc                      rQ   r   )r:   net_connectionsr)   kindr#   r)   r*   rT      rU   z=TestProcessObjectLeaks.test_net_connections.<locals>.<lambda>)r   r   r9   r<   r)   r   r*   test_net_connections   s   "z+TestProcessObjectLeaks.test_net_connectionsc                 C   r8   r   )r9   r:   environr<   r)   r)   r*   test_environ   r>   z#TestProcessObjectLeaks.test_environc                 C      |  dd  d S )Nc                   S      t t S r   )rc   	proc_infore   rf   r)   r)   r)   r*   rT     r`   z7TestProcessObjectLeaks.test_proc_info.<locals>.<lambda>r   r<   r)   r)   r*   test_proc_info  r>   z%TestProcessObjectLeaks.test_proc_infoN):__name__
__module____qualname____doc__rV   r:   r6   r/   r=   r@   rB   rD   r   markskipifr   rH   rK   rM   rO   rW   r   rZ   rj   r   rl   ro   rq   r   r   rt   r   rw   ry   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*   r0   T   s    






	











r0   c                       sx   e Zd ZdZe fddZe fddZdd Zer8dd	 Z	d
d Z
dd Zdd Zdd Zdd Z  ZS   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   )
super
setUpClassr   subpr^   rm   pidr:   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 d S  t jy   Y d S w r   )r^   NoSuchProcessri   r)   r)   r*   call  s
   zTestTerminatedProcessLeaks.callc                 C   r8   r   )r9   r:   r   r<   r)   r)   r*   	test_kill%  rP   z$TestTerminatedProcessLeaks.test_killc                 C   r8   r   )r9   r:   r   r<   r)   r)   r*   test_terminate(  rP   z)TestTerminatedProcessLeaks.test_terminatec                 C   r8   r   )r9   r:   suspendr<   r)   r)   r*   test_suspend+  rP   z'TestTerminatedProcessLeaks.test_suspendc                 C   r8   r   )r9   r:   r   r<   r)   r)   r*   r   .  rP   z&TestTerminatedProcessLeaks.test_resumec                 C   r8   r   )r9   r:   r   r<   r)   r)   r*   	test_wait1  rP   z$TestTerminatedProcessLeaks.test_waitc                    s    fdd}  | d S )Nc                      s&   zt  jjW S  ty   Y d S w r   )rc   r   r:   r   ProcessLookupErrorr)   r<   r)   r*   r   6  s
   z7TestTerminatedProcessLeaks.test_proc_info.<locals>.callr   )r#   r   r)   r<   r*   r   4  s   z)TestTerminatedProcessLeaks.test_proc_info)r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   __classcell__r)   r)   r   r*   r   	  s    r   ru   rE   c                   @   s   e Zd Zdd Zdd ZdS )TestProcessDualImplementationc                 C   r   )Nc                   S      t jt ddS )NTuse_pebrc   proc_cmdlinere   rf   r)   r)   r)   r*   rT   B      zETestProcessDualImplementation.test_cmdline_peb_true.<locals>.<lambda>r   r<   r)   r)   r*   test_cmdline_peb_trueA  rP   z3TestProcessDualImplementation.test_cmdline_peb_truec                 C   r   )Nc                   S   r   )NFr   r   r)   r)   r)   r*   rT   E  r   zFTestProcessDualImplementation.test_cmdline_peb_false.<locals>.<lambda>r   r<   r)   r)   r*   test_cmdline_peb_falseD  rP   z4TestProcessDualImplementation.test_cmdline_peb_falseN)r   r   r   r   r   r)   r)   r)   r*   r   ?  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jjeo5eddejje dddd Zejje dddd Zdd Zejjedddd Zdd Zdd Zdd  Zejjeo{ejd! d"de d#d$ Ze d%d& Ze ejje  ddd'd( Z!e ejjeoe" d)kd*dd+d, Z#d-d. Z$d/d0 Z%e ejje& ddd1d2 Z'e ejje( ddd3d4 Z)e ejje* ddd5d6 Z+e d7d8 Z,d9d: Z-d;d< Z.erd=d> Z/d?d@ Z0dAdB Z1dCdD Z2dEdF Z3dGS dGS )HTestModuleFunctionsLeaksz&Test leaks of psutil module functions.c                 C   s   t  }|| |j d S r   )r   r1   r   r4   r)   r)   r*   r6   P  s   z&TestModuleFunctionsLeaks.test_coveragec                 C   r   )Nc                   S      t jddS )NTlogicalr^   	cpu_countr)   r)   r)   r*   rT   X  rU   z9TestModuleFunctionsLeaks.test_cpu_count.<locals>.<lambda>r   r<   r)   r)   r*   test_cpu_countV  r>   z'TestModuleFunctionsLeaks.test_cpu_countc                 C   r   )Nc                   S   r   )NFr   r   r)   r)   r)   r*   rT   \  rU   z?TestModuleFunctionsLeaks.test_cpu_count_cores.<locals>.<lambda>r   r<   r)   r)   r*   test_cpu_count_coresZ  r>   z-TestModuleFunctionsLeaks.test_cpu_count_coresc                 C      |  tj d S r   )r9   r^   r~   r<   r)   r)   r*   r   ^     z'TestModuleFunctionsLeaks.test_cpu_timesc                 C   r   )Nc                   S   r   )NT)percpu)r^   r~   r)   r)   r)   r*   rT   d  rU   z=TestModuleFunctionsLeaks.test_per_cpu_times.<locals>.<lambda>r   r<   r)   r)   r*   test_per_cpu_timesb  r>   z+TestModuleFunctionsLeaks.test_per_cpu_timesc                 C   r   r   )r9   r^   	cpu_statsr<   r)   r)   r*   test_cpu_statsf  r   z'TestModuleFunctionsLeaks.test_cpu_statszskipped due to #1892rE   rX   c                 C   r   r   )r9   r^   cpu_freqr<   r)   r)   r*   test_cpu_freqj  s   z&TestModuleFunctionsLeaks.test_cpu_freqru   c                 C   s   t   | t j d S r   )r^   
getloadavgr9   r<   r)   r)   r*   test_getloadavgq  s   z(TestModuleFunctionsLeaks.test_getloadavgc                 C   r   r   )r9   r^   virtual_memoryr<   r)   r)   r*   test_virtual_memoryx     z,TestModuleFunctionsLeaks.test_virtual_memoryz&worthless on SUNOS (uses a subprocess)c                 C   r   r   )r9   r^   swap_memoryr<   r)   r)   r*   test_swap_memory|  r   z)TestModuleFunctionsLeaks.test_swap_memoryc                 C   $   t rtn| j}| jdd |d d S )Nc                   S   r   r   )r^   
pid_existsre   rf   r)   r)   r)   r*   rT     r`   z:TestModuleFunctionsLeaks.test_pid_exists.<locals>.<lambda>r   r   r"   r!   r9   r   r)   r)   r*   test_pid_exists  r   z(TestModuleFunctionsLeaks.test_pid_existsc                 C   r   )Nc                   S   
   t dS )N.)r^   
disk_usager)   r)   r)   r*   rT        
 z:TestModuleFunctionsLeaks.test_disk_usage.<locals>.<lambda>r   r   r   r)   r)   r*   test_disk_usage  r   z(TestModuleFunctionsLeaks.test_disk_usagec                 C   r   r   )r9   r^   disk_partitionsr<   r)   r)   r*   test_disk_partitions  r   z-TestModuleFunctionsLeaks.test_disk_partitionsz/proc/diskstatsz3/proc/diskstats not available on this Linux versionc                 C   r   )Nc                   S   r   NF)nowrap)r^   disk_io_countersr)   r)   r)   r*   rT     rU   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   r   r   )r9   r^   pidsr<   r)   r)   r*   	test_pids  r   z"TestModuleFunctionsLeaks.test_pidsc                 C   r   )Nc                   S   r   r   )r^   net_io_countersr)   r)   r)   r*   rT     rU   z?TestModuleFunctionsLeaks.test_net_io_counters.<locals>.<lambda>r   r<   r)   r)   r*   test_net_io_counters  rI   z-TestModuleFunctionsLeaks.test_net_io_countersr   zneed root accessc                 C   sF   t jdd t  | dd  W d    d S 1 sw   Y  d S )Nr   r   c                   S   r   )Nr   r   )r^   r   r)   r)   r)   r*   rT     rU   z?TestModuleFunctionsLeaks.test_net_connections.<locals>.<lambda>)r^   r   r   r9   r<   r)   r)   r*   r     s   "z-TestModuleFunctionsLeaks.test_net_connectionsc                 C   s"   t rdn| j}| jtj|d d S )Ni @ )	tolerance)r   r   r9   r^   net_if_addrs)r#   r   r)   r)   r*   test_net_if_addrs  s   z*TestModuleFunctionsLeaks.test_net_if_addrsc                 C   r   r   )r9   r^   net_if_statsr<   r)   r)   r*   test_net_if_stats  r   z*TestModuleFunctionsLeaks.test_net_if_statsc                 C   r   r   )r9   r^   sensors_batteryr<   r)   r)   r*   test_sensors_battery     z-TestModuleFunctionsLeaks.test_sensors_batteryc                 C   r   r   )r9   r^   sensors_temperaturesr<   r)   r)   r*   test_sensors_temperatures  r  z2TestModuleFunctionsLeaks.test_sensors_temperaturesc                 C   r   r   )r9   r^   sensors_fansr<   r)   r)   r*   test_sensors_fans  r  z*TestModuleFunctionsLeaks.test_sensors_fansc                 C   r   r   )r9   r^   	boot_timer<   r)   r)   r*   test_boot_time  r   z'TestModuleFunctionsLeaks.test_boot_timec                 C   r   r   )r9   r^   usersr<   r)   r)   r*   
test_users  r   z#TestModuleFunctionsLeaks.test_usersc                 C   r   )Nc                   S   r   )NF)r^   
_set_debugr)   r)   r)   r*   rT     r   z9TestModuleFunctionsLeaks.test_set_debug.<locals>.<lambda>r   r<   r)   r)   r*   test_set_debug  rP   z'TestModuleFunctionsLeaks.test_set_debugc                 C   r   r   )r9   rc   winservice_enumerater<   r)   r)   r*   test_win_service_iter  r   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                    &   t t   |  fdd d S )Nc                      
   t  S r   )rc   winservice_query_configr)   r;   r)   r*   rT     r   zFTestModuleFunctionsLeaks.test_win_service_get_config.<locals>.<lambda>nextr^   win_service_iterr;   r9   r<   r)   r  r*   test_win_service_get_config     z4TestModuleFunctionsLeaks.test_win_service_get_configc                    r  )Nc                      r  r   )rc   winservice_query_statusr)   r  r)   r*   rT     r   zFTestModuleFunctionsLeaks.test_win_service_get_status.<locals>.<lambda>r  r<   r)   r  r*   test_win_service_get_status  r  z4TestModuleFunctionsLeaks.test_win_service_get_statusc                    r  )Nc                      r  r   )rc   winservice_query_descrr)   r  r)   r*   rT     r   zKTestModuleFunctionsLeaks.test_win_service_get_description.<locals>.<lambda>r  r<   r)   r  r*    test_win_service_get_description  r  z9TestModuleFunctionsLeaks.test_win_service_get_descriptionN)4r   r   r   r   r6   r/   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   re   pathexistsr   r   r   r   getuidr   r  r  r   r  r   r	  r   r  r  r  r  r  r  r  r  r!  r)   r)   r)   r*   r   M  sz    








r   ).r   r,   re   r^   psutil._commonr   r   r   r   r   r   psutil.testsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _psplatformrc   rm   rV   r"   r/   r0   r   r   r   r   r   r)   r)   r)   r*   <module>   sV   
 66