o
    ‡e‘  ã                   @   sR   d dl mZ d dlZd dlZd dlmZ G dd„ dejƒZedkr'e 	¡  dS dS )é    )ÚcontextmanagerN)Úignores_leakcheckc                   @   sD   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZ	ed	d
„ ƒZ
dS )ÚTestJoinc                 C   s`   t  ¡  ¡ }|  |¡ |  t  ¡ j¡ t  ¡  ¡ }|  |¡ t  d¡ t  ¡  ¡ }|  |¡ d S )Ng{®Gáz„?)ÚgeventÚget_hubÚjoinÚ
assertTrueZassertFalseZdeadÚsleep)ÚselfÚres© r   úKD:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__hub_join.pyÚtest_join_many_times
   s   


zTestJoin.test_join_many_timesc                  C   s,   dd l } tdƒD ]}|  ¡ r	 |  ¡ sqd S )Nr   é   )ÚgcÚrangeZcollect)r   Ú_r   r   r   Z__clean   s   ÿ€ÿzTestJoin.__cleanc                 c   sT    ddl m} | j}|ƒ  t|ƒ ƒ}d V  t|ƒ ƒ}||kr"|d8 }|  ||¡ d S )Nr   )Úget_reachable_greenletsé   )Zgevent._greenlet_primitivesr   Ú_TestJoin__cleanÚlenÚassertEqual)r
   r   ÚcleanZcount_beforeZcount_afterr   r   r   Úassert_no_greenlet_growth    s   €

z"TestJoin.assert_no_greenlet_growthc                    sl   dd l ‰| j‰ dd„ }‡ ‡fdd„}|  ¡  tdƒD ]}||ƒ q~~W d   ƒ d S 1 s/w   Y  d S )Nr   c                  S   sB   t jdd„ d} |  ¡  |  ¡  t  ¡ }| ¡  |jdd ~d S )Nc                   S   ó   dS ©Nr   r   r   r   r   r   Ú<lambda>9   ó    zcTestJoin.test_join_in_new_thread_doesnt_leak_hub_or_greenlet.<locals>.thread_main.<locals>.<lambda>©ÚrunT©Zdestroy_loop)r   ÚGreenletÚstartr   r   Údestroy)ÚgÚhubr   r   r   Úthread_main8   s   zQTestJoin.test_join_in_new_thread_doesnt_leak_hub_or_greenlet.<locals>.thread_mainc                    s&   ˆj | d}| ¡  | ¡  ˆ ƒ  d S )N)Útarget)ÚThreadr"   r   )ÚmainÚt©r   Ú	threadingr   r   ÚtesterA   s   
zLTestJoin.test_join_in_new_thread_doesnt_leak_hub_or_greenlet.<locals>.testeré
   )r,   r   r   r   )r
   r&   r-   r   r   r+   r   Ú3test_join_in_new_thread_doesnt_leak_hub_or_greenlet2   s   	

"ûz<TestJoin.test_join_in_new_thread_doesnt_leak_hub_or_greenletc                 C   sH   dd l }| j}G dd„ d|jƒ}dd„ }tdƒD ]}|||ƒ q~~d S )Nr   c                   @   s   e Zd ZdZdd„ ZdS )zDTestJoin.test_destroy_in_main_thread_from_new_thread.<locals>.ThreadNc                 S   s<   t jdd„ d}| ¡  | ¡  ~t  ¡ }| ¡  || _d S )Nc                   S   r   r   r   r   r   r   r   r   X   r   zZTestJoin.test_destroy_in_main_thread_from_new_thread.<locals>.Thread.run.<locals>.<lambda>r   )r   r!   r"   r   r   r%   )r
   r$   r%   r   r   r   r   W   s   
zHTestJoin.test_destroy_in_main_thread_from_new_thread.<locals>.Thread.run)Ú__name__Ú
__module__Ú__qualname__r%   r   r   r   r   r   r(   U   s    r(   c                 S   s6   | ƒ }|  ¡  | ¡  |jjdd d |_~|ƒ  d S )NTr    )r"   r   r%   r#   )r(   r   r*   r   r   r   r-   `   s   
zDTestJoin.test_destroy_in_main_thread_from_new_thread.<locals>.testerr.   )r,   r   r(   r   )r
   r,   r   r(   r-   r   r   r   r   Ú+test_destroy_in_main_thread_from_new_threadO   s   z4TestJoin.test_destroy_in_main_thread_from_new_threadN)r0   r1   r2   r   Ústaticmethodr   r   r   r   r/   r3   r   r   r   r   r      s    


r   Ú__main__)
Ú
contextlibr   Zunittestr   Zgevent.testingr   ZTestCaser   r0   r)   r   r   r   r   Ú<module>   s    lÿ