B
    ÐH/\ë  ã               @   sv  d Z ddlmZ ddlmZ ddlZejd dkr@edƒ eZ	nG dd„ deƒZ	ddlZe	e_ddl
mZ dd	lmZ e ¡  dd
l
mZ ddlmZ yddlmZ W n  ek
rÆ   ddlmZ Y nX ddlmZ ddlZddlZddlZe	e_dZejred9 Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"e #d¡e $ej%oFej&d¡G dd„ dej'ƒƒƒZ(e)dkrre *¡  dS )zjThis test checks that underlying socket instances (gevent.socket.socket._sock)
are not leaked by the hub.
é    )Úprint_function)ÚsocketNé   r   c               @   s   e Zd ZdZdS )ÚSocketz"Something we can have a weakref toN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r
   r
   ú:lib/python3.7/site-packages/gevent/tests/test__refcount.pyr   %   s   r   )Úmonkey)Úflaky)Úpformat)Ústart_new_thread)Úsleepgš™™™™™¹?é   c              C   s<   t   ¡ } |  t¡ |  t jt jd¡ |  d¡ |  d¡ | S )Né   )z	127.0.0.1r   é   )r   Z
settimeoutÚSOCKET_TIMEOUTZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbindZlisten)Úsr
   r
   r   Úinit_server?   s    


r   c             C   sh   y|   ¡ \}}W n" tjk
r2   |r*‚ nd S Y nX | d¡}|dksRtt|ƒƒ‚| d¡}| ¡  d S )Néd   s   hellos   bye)Zacceptr   ÚtimeoutÚrecvÚAssertionErrorÚreprÚsendÚclose)r   Zraise_on_timeoutZconnÚ_Úresr
   r
   r   Úhandle_requestH   s    


r    c             C   sJ   t   ¡ }| d| f¡ | d¡}| d¡}|dks>tt|ƒƒ‚| ¡  d S )Nz	127.0.0.1s   hellor   s   bye)r   Zconnectr   r   r   r   r   )Úportr   r   r
   r
   r   Úmake_requestZ   s    

r"   c             C   s€   t ƒ }tt|| fƒ | r0| ¡ d }tt|fƒ tdt ƒ t |j	¡}| 
¡  tjr|ytdt ƒ W n tk
rz   Y nX |S )Nr   gš™™™™™¹?)r   r   r    Zgetsocknamer"   r   r   ÚweakrefÚrefZ_sockr   Ú	greentestZWINÚ	Exception)Ú
run_clientr   r!   Úwr
   r
   r   Úrun_interactiong   s    r)   c             C   s‚   t | d}tjrt ¡  |ƒ r~ttt |ƒ ¡ƒƒ xBt |ƒ ¡D ]2}tt|ƒƒ x t |¡D ]}tdt|ƒƒ q\W q@W tdƒ‚d S )N)r'   ú-zserver should be dead by now)	r)   r%   ZPYPYÚgcZcollectÚprintr   Zget_referrersr   )r'   r(   ÚxÚyr
   r
   r   Úrun_and_check~   s    
r/   zCOften fail with timeouts or force closed connections; not sure why.z8Often fail with force closed connections; not sure why. c               @   s:   e Zd ZejZe ej	¡dd„ ƒZ
e ej	¡dd„ ƒZdS )ÚTestc             C   s   t dƒ t dƒ d S )NT)r/   )Úselfr
   r
   r   Útest_clean_exit–   s    zTest.test_clean_exitc             C   s   t dƒ t dƒ d S )NF)r/   )r1   r
   r
   r   Útest_timeout_exit›   s    zTest.test_timeout_exitN)r   r   r   r%   ZLARGE_TIMEOUTZ__timeout__r   Zreraises_flaky_timeoutr   r   r2   r3   r
   r
   r
   r   r0      s   r0   Ú__main__)+r	   Z
__future__r   Z_socketr   Zc_socketÚsysÚversion_infoÚ
__import__r   Zgevent.testingZtestingr%   Zgeventr   Z	patch_allr   Zpprintr   Zthreadr   ÚImportErrorÚ_threadZtimer   r#   r+   Z_realsocketr   ZRUNNING_ON_CIr   r    r"   r)   r/   ZskipOnCIZskipIfZRUN_LEAKCHECKSZPY3ZTestCaser0   r   Úmainr
   r
   r
   r   Ú<module>   sL    	
