U
    ø×cc  ã                   @   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"t‚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   ú=/tmp/pip-unpacked-wheel-z1hn3a16/greenlet/tests/test_leaks.pyÚ<lambda>   ó    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   sB   i }t   dd„ ¡}tdƒD ]}|jf |Ž q|  t |¡d¡ d S )Nc                  [   s   t  ¡ jjf | ŽS r   r   )Úkwargsr   r   r   r      r   z+TestLeaks.test_kwarg_refs.<locals>.<lambda>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                    s~   g ‰ ‡ fdd„}t dƒD ]"}tj|d}| ¡  | ¡  ~qt ¡  |  ¡  t ¡  t 	¡  t ¡  ˆ D ]}|  
|ƒ ¡ qhd 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                    s~   g ‰ ‡ fdd„}t dƒD ]"}tj|d}| ¡  | ¡  ~qt ¡  |  ¡  t ¡  t 	¡  t ¡  ˆ D ]}|  
|ƒ ¡ qhd S )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t‚tfdd„}t ¡  |tjƒ}t ¡ ‰t ¡ ‰ g ‰dd„ ‰‡ ‡‡‡‡fdd„}tj|d}| 	¡  ˆ 
¡  |ƒ }tˆƒdksŽt‚|  ˆ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 |ƒˆ k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                     s>   t   ˆ¡} ˆ | ¡ |  ¡  ~ ˆ ¡  ˆ  ¡  ˆr:t  ¡  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ÚAssertionErrorÚ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   )rK   )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_GCrG   r(   r1   r5   rK   ÚunittestZexpectedFailurerL   r   r   r   r   r      s   
	

Pr   )	rP   r   r.   r   r*   r#   r   ZTestCaser   r   r   r   r   Ú<module>   s   