o
    ©"´iëI  ã                   @   sê   d Z ddlmZmZm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 e
jsSJ ‚G dd„ deƒZdd„ ZG dd„ deƒZedkrsedƒ ¡  dS dS )z)
Testing scenarios that may have leaked.
é    )Úprint_functionÚabsolute_importÚdivisionNé   )ÚTestCase)ÚPY314)ÚRUNNING_ON_FREETHREAD_BUILD)ÚWIN)Úfails_leakcheck)Úignores_leakcheck)ÚRUNNING_ON_MANYLINUXc                   @   s6   e Zd Zeƒ Zdd„ Zdd„ Zdd„ Zedd„ ƒZ	d	S )
ÚHasFinalizerTracksInstancesc                 C   s    t  |¡| _| j t| ƒ¡ d S ©N)ÚsysÚinternÚmsgÚEXTANT_INSTANCESÚaddÚid)Úselfr   © r   ú]/var/www/html/voicebot/backend/venv/lib/python3.10/site-packages/greenlet/tests/test_leaks.pyÚ__init__   s   z$HasFinalizerTracksInstances.__init__c                 C   s   | j  t| ƒ¡ d S r   )r   Úremover   ©r   r   r   r   Ú__del__"   s   z#HasFinalizerTracksInstances.__del__c                 C   s   dt | ƒ| jf S )Nz(<HasFinalizerTracksInstances at 0x%x %r>)r   r   r   r   r   r   Ú__repr__$   s   
ÿz$HasFinalizerTracksInstances.__repr__c                 C   s   | j  ¡  d S r   )r   Úclear)Úclsr   r   r   Úreset(   s   z!HasFinalizerTracksInstances.resetN)
Ú__name__Ú
__module__Ú__qualname__Úsetr   r   r   r   Úclassmethodr   r   r   r   r   r      s    r   c                 C   s   t r| S t| ƒS r   )r   r
   )Úfuncr   r   r   Ú&fails_leakcheck_except_on_free_thraded-   s   r&   c                   @   s¼   e Zd Zdd„ Zdd„ Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z			d'dd„Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdZdd„ Zedd„ ƒZd(d d!„Zed"d#„ ƒZed$d%„ ƒZd&S ))Ú	TestLeaksc                 C   sJ   d}t  |¡}t dd„ ¡}tdƒD ]}|j|Ž  q|  t  |¡|¡ d S )N)ÚaÚbÚcc                  W   s   t  ¡ jj| Ž S r   ©ÚgreenletÚ
getcurrentÚparentÚswitch)Úargsr   r   r   Ú<lambda><   s    z)TestLeaks.test_arg_refs.<locals>.<lambda>éd   )r   Úgetrefcountr,   Úranger/   ÚassertEqual)r   r0   Úrefcount_beforeÚgÚ_r   r   r   Útest_arg_refs7   s   
ÿzTestLeaks.test_arg_refsc                 C   sn   i }|   t |¡tsdnd¡ t dd„ ¡}tdƒD ]
}|jdi |¤Ž q|   t |¡ts2d¡ d S d¡ d S )Né   r   c                  [   s   t  ¡ jjdi | ¤ŽS )Nr   r+   )Úgkwargsr   r   r   r1   F   s    z+TestLeaks.test_kwarg_refs.<locals>.<lambda>r2   r   )r5   r   r3   r   r,   r4   r/   )r   Úkwargsr7   r8   r   r   r   Útest_kwarg_refsA   s   ÿ$zTestLeaks.test_kwarg_refsc                  C   s4   dd„ } t j| d}| ¡  t d¡ | d¡ d S )Nc                   S   s   t  d¡ d S )Nçü©ñÒMbP?)ÚtimeÚsleepr   r   r   r   ÚworkerV   s   z+TestLeaks.__recycle_threads.<locals>.worker©Útargetr>   é
   )Ú	threadingÚThreadÚstartr?   r@   Újoin)rA   Útr   r   r   Ú__recycle_threadsN   s
   
zTestLeaks.__recycle_threadsc                    ó€   g ‰ ‡ fdd„}t dƒD ]}tj|d}| ¡  | d¡ ~qt ¡  |  ¡  t ¡  t 	¡  t ¡  ˆ D ]}|  
|ƒ ¡ q5d S )Nc                      s   ˆ   t t ¡ ¡¡ d S r   )ÚappendÚweakrefÚrefr,   r-   r   ©Úggr   r   rA   _   s   z,TestLeaks.test_threaded_leak.<locals>.workerr:   rB   rD   ©r4   rE   rF   rG   rH   r,   r-   Ú_TestLeaks__recycle_threadsÚgcÚcollectÚassertIsNone©r   rA   r8   rI   r7   r   rO   r   Útest_threaded_leak]   s   
ÿzTestLeaks.test_threaded_leakc                    rK   )Nc                     sN   g  ‰ t  ¡ _‡ fdd„} tdƒD ]	}t   | ¡ ¡  qˆ t t  ¡ ¡¡ d S )Nc                      s   ˆ   t ¡ ¡ d S r   )rL   r,   r-   r   ©Úllr   r   Ú
additionalt   s   zDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionalr:   )r,   r-   rY   r4   r/   rL   rM   rN   )rZ   r8   rO   rX   r   rA   q   s
   z0TestLeaks.test_threaded_adv_leak.<locals>.workerr:   rB   rD   rQ   rV   r   rO   r   Útest_threaded_adv_leako   s   
ÿz TestLeaks.test_threaded_adv_leakc                 C   sL   t j ¡ }|  |d¡ t j d¡ t j ¡ }|  ||¡ |  t jjd¡ d S )Nr   Tr   )r,   Ú	_greenletÚ&get_clocks_used_doing_optional_cleanupÚassertGreaterEqualÚenable_optional_cleanupr5   ÚassertGreaterÚCLOCKS_PER_SEC)r   ÚusedÚused2r   r   r   ÚassertClocksUsed†   s   

zTestLeaks.assertClocksUsedTFc           	         s`  t  g ¡sJ ‚t ¡  t ¡  | jtjdd}t ¡ ‰t ¡ ‰ g ‰‡fdd„‰g ‰‡ ‡‡‡‡‡fdd„}tj	|d}| 
¡  ˆ d¡ t ¡  | jtd	d}tˆƒd
ksVJ ‚|  ˆd j¡ ˆd d …= ˆ  ¡  | d¡ ~|  ¡  | jtd	d}| jtjdd}|  ||¡ ˆs tj ¡ d ur |  ||¡ ˆrŸ|  tjtƒ ¡ n	 tj ¡ d ur®|  ¡  d S d S )NF)Ú
exact_kindc                     sN   t dƒ} tj dt dƒ¡ ˆ rt ¡ jj}|| gƒ d S t ¡ j | g¡ d S )NzDELETING STACK OBJECTÚtest_leaks_keyzDELETING THREAD STATE)r   r,   r\   Úset_thread_localr-   r.   r/   )ÚjdÚs)Úexplicit_reference_to_switchr   r   Úbackground_greenlet®   s   þz6TestLeaks._check_issue251.<locals>.background_greenletc                     sV   t   ˆ¡} ˆ t | j¡¡ ˆ | ¡ |  ¡  ~ ˆ ¡  ˆ  d¡ ˆr)t  ¡  d S d S )NrD   )	r,   rL   rM   rN   r.   r/   r#   Úwaitr-   )Úglet)Úbackground_glet_killedÚbackground_glet_runningrk   Úbackground_greenletsÚbg_main_wrefsÚmanually_collect_backgroundr   r   Úbackground_thread¾   s   


ÿz4TestLeaks._check_issue251.<locals>.background_threadrB   rD   Tr   r   )rS   Ú
is_trackedr   r   r,   r-   Úcount_objectsrE   ÚEventrF   rG   rl   ÚlistÚlenÚassertFalseÚdeadr#   rH   Úwait_for_pending_cleanupsÚassertLessEqualr\   r]   r5   r   rd   )	r   rr   rj   Úgreenlets_beforers   rI   Úlists_beforeÚlists_afterÚgreenlets_afterr   )rn   ro   rk   rp   rq   rj   rr   r   Ú_check_issue251   sF   


€ÿzTestLeaks._check_issue251c                 C   s   |   ¡  d S r   ©r   r   r   r   r   Ú-test_issue251_killing_cross_thread_leaks_list  s   z7TestLeaks.test_issue251_killing_cross_thread_leaks_listc              	   C   s6   t j d¡ z|  ¡  W t j d¡ d S t j d¡ w )NFT)r,   r\   r_   r   r   r   r   r   Ú#test_issue251_with_cleanup_disabled  s   
z-TestLeaks.test_issue251_with_cleanup_disabledc                 C   ó   | j dd d S )NF©rr   r‚   r   r   r   r   Ú4test_issue251_issue252_need_to_collect_in_background  s   z>TestLeaks.test_issue251_issue252_need_to_collect_in_backgroundc              	   C   s@   d| _ tj d¡ z| jdd W tj d¡ d S tj d¡ w )NTFr†   )Úexpect_greenlet_leakr,   r\   r_   r   r   r   r   r   ÚEtest_issue251_issue252_need_to_collect_in_background_cleanup_disabled,  s
   zOTestLeaks.test_issue251_issue252_need_to_collect_in_background_cleanup_disabledc                 C   s   | j ddd d S )NFT)rr   rj   r‚   r   r   r   r   Ú9test_issue251_issue252_explicit_reference_not_collectable5  s   
þzCTestLeaks.test_issue251_issue252_explicit_reference_not_collectabler2   c                 C   sD   t jd dks	J ‚t jd d… dk r|  d¡ tr |  d¡ d S d S )Nr   é   r:   )r‹   é   zOnly observed on 3.11z!Slow and not worth repeating here)r   Úversion_infoÚskipTestr   r   r   r   r   Ú_only_test_some_versions=  s   
ÿz"TestLeaks._only_test_some_versionsc                    sŽ   |   ¡  dd„ ‰d‰ ‡ ‡fdd„}tdƒD ]}|ƒ  q|  ¡ }t| jƒD ]}t||  ¡ ƒ}|ƒ  |  ¡ }||kr>|dkr> nq$|  ||¡ d S )Nc                   S   s   dS )Nr   r   r   r   r   r   ÚfQ  s   z:TestLeaks.test_untracked_memory_doesnt_increase.<locals>.fé'  c                     s    t ˆ ƒD ]	} t ˆ¡ ¡  qd S r   )r4   r,   r/   )r8   ©ÚITERr   r   r   Úrun_itU  s   ÿz?TestLeaks.test_untracked_memory_doesnt_increase.<locals>.run_itr‹   r   )r   r4   Úget_process_ussÚUNTRACK_ATTEMPTSÚmaxr|   )r   r”   r8   Ú
uss_beforeÚcountÚ	uss_afterr   r’   r   Ú%test_untracked_memory_doesnt_increaseJ  s   €z/TestLeaks.test_untracked_memory_doesnt_increasec                    sJ  |   ¡  |  ¡  dg‰ ‡ fdd„‰d‰‡‡fdd„‰| ‰G ‡‡‡fdd„dƒ}d  }}t| jƒD ]`}dˆ d< |ƒ }tj|d	}| ¡  | d
¡ |  | 	¡ ¡ |d u rV|j
}t||j
ƒ}ˆrp|  |jd¡ |  ˆ d ˆ|j ¡ ~~ˆs||  ˆ d d¡ ˆr‚|  ¡  |  ¡ }||kr|dkr nq0|  ¡  |  ¡ }|  ||d|f ¡ d S )Nr   c                      s8   z
t  ¡ j ¡  W dS  t jy   ˆ d  d7  < ‚ w )Nr   r   )r,   r-   r.   r/   ÚGreenletExitr   )Ú
EXIT_COUNTr   r   r   x  s   ýþz3TestLeaks._check_untracked_memory_thread.<locals>.fr‘   c                     s2   g } t ˆ ƒD ]}t ˆ¡}|  |¡ | ¡  q| S r   )r4   r,   rL   r/   )Úgletsr8   r7   r’   r   r   r”     s   


z8TestLeaks._check_untracked_memory_thread.<locals>.run_itc                       s,   e Zd Zd ZZdZdZ‡ ‡‡fdd„ZdS )z<TestLeaks._check_untracked_memory_thread.<locals>.ThreadFuncr   r   r:   c                    sb   ˆ  ¡ | _t| jƒD ]}|  jtˆƒ ƒ7  _q
| jD ]
}ˆ dt|ƒ¡ qˆ r*d| _ˆ  ¡ | _d S )Nzsuspended activer   )	r•   r˜   r4   r“   rž   ÚtupleÚassertInÚstrrš   )r   r8   r7   ©Údeallocate_in_threadr”   Útestr   r   Ú__call__“  s   

zETestLeaks._check_untracked_memory_thread.<locals>.ThreadFunc.__call__N)r    r!   r"   r˜   rš   rž   r“   r¥   r   r¢   r   r   Ú
ThreadFunc  s
    r¦   rB   é   r   r   zafter attempts %d)r   r•   r4   r–   rE   rF   rG   rH   ry   Úis_aliver˜   r—   r5   rž   r“   r{   r|   )r   r£   r¦   r˜   rš   r™   Úthread_funcrI   r   )r   r“   r£   r   r”   r¤   r   Ú_check_untracked_memory_threadl  sF   
€z(TestLeaks._check_untracked_memory_threadc                 C   r…   )NT©r£   )rª   r   r   r   r   ÚItest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_threadÂ  s   zSTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_threadc                 C   s&   t rtrtr|  d¡ | jdd d S )Nz6Windows 3.14t appears to leak. No other platform does.Fr«   )r	   r   r   rŽ   rª   r   r   r   r   ÚGtest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_mainÈ  s   
zQTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_mainN)TF)T)r    r!   r"   r9   r=   ÚstaticmethodrR   rW   r[   rd   r   rƒ   r„   r&   r‡   r‰   rŠ   r–   r   r   r›   rª   r¬   r­   r   r   r   r   r'   5   s8    



þ~




V
r'   Ú__main__Úunittest)Ú__doc__Ú
__future__r   r   r   r   rS   r?   rM   rE   r,   Ú r   r   r   r	   Ú	leakcheckr
   r   r   ÚGREENLET_USE_GCÚobjectr   r&   r'   r    Ú
__import__Úmainr   r   r   r   Ú<module>   s2   
   'ÿ