o
    £€jc  ã                   @   sN   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G dd„ de jƒZdS )é    Nc                   @   sV   e Zd Zdd„ Zdd„ ZejsJ ‚dd„ Zdd„ Zd	d
„ Z	ddd„Z
ej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 ©N©ÚgreenletÚ
getcurrentÚparentÚswitch)Úargs© r   úD/usr/local/lib/python3.10/dist-packages/greenlet/tests/test_leaks.pyÚ<lambda>   s    z)TestLeaks.test_arg_refs.<locals>.<lambda>éd   )ÚsysÚgetrefcountr   Úranger   ÚassertEqual)Úselfr   Úrefcount_beforeÚgÚ_r   r   r   Útest_arg_refs   s   
ÿzTestLeaks.test_arg_refsc                 C   sF   i }t   dd„ ¡}tdƒD ]
}|jdi |¤Ž q|  t |¡d¡ d S )Nc                  [   s   t  ¡ jjdi | ¤ŽS )Nr   r   )Úkwargsr   r   r   r      s    z+TestLeaks.test_kwarg_refs.<locals>.<lambda>r   é   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   Útest_kwarg_refs   s   ÿzTestLeaks.test_kwarg_refsc                 C   s2   dd„ }t j|d}| ¡  t d¡ | ¡  d S )Nc                   S   s   t  d¡ d S )Nçü©ñÒMbP?)ÚtimeÚsleepr   r   r   r   Úworker)   s   z)TestLeaks.recycle_threads.<locals>.worker©Útargetr   )Ú	threadingÚThreadÚstartr   r   Újoin)r   r    Útr   r   r   Úrecycle_threads"   s
   
zTestLeaks.recycle_threadsc                    ó~   g ‰ ‡ fdd„}t dƒD ]}tj|d}| ¡  | ¡  ~qt ¡  |  ¡  t ¡  t 	¡  t ¡  ˆ D ]}|  
|ƒ ¡ q4d S )Nc                      s   ˆ   t t ¡ ¡¡ d S r   )ÚappendÚweakrefÚrefr   r	   r   ©Úggr   r   r    2   s   z,TestLeaks.test_threaded_leak.<locals>.workerr   r!   ©r   r#   r$   r%   r&   r   r	   r(   ÚgcÚcollectÚassertIsNone©r   r    r   r'   r   r   r-   r   Útest_threaded_leak0   s   ÿzTestLeaks.test_threaded_leakc                    r)   )Nc                     sN   g  ‰ t  ¡ _‡ fdd„} tdƒD ]	}t   | ¡ ¡  qˆ t t  ¡ ¡¡ d S )Nc                      s   ˆ   t ¡ ¡ d S r   )r*   r   r	   r   ©Úllr   r   Ú
additionalG   s   zDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionalr   )r   r	   r6   r   r   r*   r+   r,   )r7   r   r-   r5   r   r    D   s
   z0TestLeaks.test_threaded_adv_leak.<locals>.workerr   r!   r/   r3   r   r-   r   Útest_threaded_adv_leakB   s   ÿz TestLeaks.test_threaded_adv_leakTc           	         sð   t  g ¡sJ ‚tfdd„}t ¡  |tjƒ}t ¡ ‰t ¡ ‰ g ‰dd„ ‰‡ ‡‡‡‡fdd„}tj|d}| ¡  ˆ 	¡  |ƒ }t
ˆƒdksGJ ‚|  ˆd	 j¡ ˆd d …= ˆ  ¡  | d
¡ ~t ¡  |tjƒ}|ƒ }|  ||¡ |  ||¡ d S )Nc                    s8   t dƒD ]}t ¡  qt ¡  t‡ fdd„t ¡ D ƒƒS )Né   c                 3   s     | ]}t |ƒˆ u rd V  qdS )é   N)Útype)Ú.0Úx©Úkindr   r   Ú	<genexpr>i   s   € 
ý
ÿzaTestLeaks.test_issue251_killing_cross_thread_leaks_list.<locals>.count_objects.<locals>.<genexpr>)r   r0   r1   ÚsumÚget_objects)r?   r   r   r>   r   Úcount_objectsc   s   
þzNTestLeaks.test_issue251_killing_cross_thread_leaks_list.<locals>.count_objectsc                   S   s   t  ¡ j ¡  d S r   r   r   r   r   r   Úbackground_greenletx   s   zTTestLeaks.test_issue251_killing_cross_thread_leaks_list.<locals>.background_greenletc                     sB   t   ˆ¡} ˆ | ¡ |  ¡  ~ ˆ ¡  ˆ  ¡  ˆrt  ¡  d S d S r   )r   r*   r   ÚsetÚwaitr	   )Úglet©Úbackground_glet_killedÚbackground_glet_runningrD   Úbackground_greenletsÚmanually_collect_backgroundr   r   Úbackground_thread|   s   

ÿzRTestLeaks.test_issue251_killing_cross_thread_leaks_list.<locals>.background_threadr!   r:   r   é
   )r0   Ú
is_trackedÚlistr   r	   r#   ÚEventr$   r%   rF   ÚlenÚassertFalseÚdeadrE   r&   ÚassertLessEqualr   )	r   rL   rC   Úgreenlets_beforerM   r'   Úlists_beforeÚgreenlets_afterÚlists_afterr   rH   r   Ú-test_issue251_killing_cross_thread_leaks_listY   s0   



z7TestLeaks.test_issue251_killing_cross_thread_leaks_listc                 C   s   | j dd d S )NF)rL   )rZ   )r   r   r   r   Ú4test_issue251_issue252_need_to_collect_in_background©   s   	z>TestLeaks.test_issue251_issue252_need_to_collect_in_backgroundN)T)Ú__name__Ú
__module__Ú__qualname__r   r   r   ÚGREENLET_USE_GCr(   r4   r8   rZ   ÚunittestÚexpectedFailurer[   r   r   r   r   r      s    

	
Pr   )	r`   r   r0   r   r+   r#   r   ÚTestCaser   r   r   r   r   Ú<module>   s    