o
    âRc  ã                   @   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:\Flask\env\Lib\site-packages\greenlet/tests/test_leaks.pyÚ<lambda>   s    z)TestLeaks.test_arg_refs.<locals>.<lambda>éd   )ÚsysÚgetrefcountr   Úranger   ÚassertEqual)Úselfr   Z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   ©Zggr   r   r   2   s   z,TestLeaks.test_threaded_leak.<locals>.workerr   r    ©r   r"   r#   r$   r%   r   r	   r'   ÚgcÚcollectZ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	   r3   r   r   r)   r*   r+   )r4   r   r,   r2   r   r   D   s
   z0TestLeaks.test_threaded_adv_leak.<locals>.workerr   r    r-   r0   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   r.   r/   ÚsumZ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	   )Zglet©Zbackground_glet_killedZbackground_glet_runningr@   Zbackground_greenletsÚmanually_collect_backgroundr   r   Úbackground_thread|   s   

ÿzRTestLeaks.test_issue251_killing_cross_thread_leaks_list.<locals>.background_threadr    r7   r   é
   )r.   Z
is_trackedÚlistr   r	   r"   ÚEventr#   r$   rB   ÚlenZassertFalseZdeadrA   r%   ZassertLessEqualr   )	r   rD   r?   Zgreenlets_beforerE   r&   Zlists_beforeZgreenlets_afterZlists_afterr   rC   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)rD   )rJ   )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   ZGREENLET_USE_GCr'   r1   r5   rJ   ÚunittestZexpectedFailurerK   r   r   r   r   r      s    

	
Pr   )	rO   r   r.   r   r*   r"   r   ZTestCaser   r   r   r   r   Ú<module>   s    