o
    ‡eê  ã                   @   sZ  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 e ¡  ddlmZ dd
lmZ ddlmZ zddlmZ W n eyb   ddlmZ Y nw ddlmZ ddlZddlZddlZe	e_dZejred9 Zejrˆed9 ZG dd„ deƒZG dd„ deƒZ G dd„ dej!ƒZ"e#dkr«e $¡  dS 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
   úKD:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__refcount.pyr   &   s    r   )Úmonkey)Úsupport)Úparams)Ústart_new_thread)Úsleepgš™™™™™¹?é   c                   @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd„ ZdS )	ÚServerFNc                 C   sB   || _ t tjtj¡| _zt | jtj¡| _W d S    |  	¡  ‚ ©N)
Úraise_on_timeoutr   ÚAF_INETÚSOCK_STREAMr   Z	bind_portr   ZDEFAULT_BIND_ADDRÚserver_portÚclose)Úselfr   r
   r
   r   Ú__init__O   s   zServer.__init__c                 C   ó   | j  ¡  d | _ d S r   ©r   r   ©r   r
   r
   r   r   X   ó   

zServer.closec                 C   s¢   zK| j  t¡ | j  d¡ d| _z	| j  ¡ \}}W n t jy-   | jr%‚ Y W |  ¡  d S w z| 	d¡| _
| d¡ W | ¡  n| ¡  w W |  ¡  d S |  ¡  w )Né   Téd   ó   bye)r   Ú
settimeoutÚSOCKET_TIMEOUTÚlistenÚ	listeningÚacceptÚtimeoutr   r   ÚrecvÚclient_dataÚsend)r   ÚconnÚ_r
   r
   r   Úhandle_request\   s"   õzServer.handle_request)	r   r   r   r%   r)   r   r   r   r-   r
   r
   r
   r   r   I   s    	r   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )ÚClientNc                 C   s   t   t jt j¡| _ || _d S r   )r   r   r   r   )r   r   r
   r
   r   r   x   s   
zClient.__init__c                 C   r   r   r   r   r
   r
   r   r   }   r   zClient.closec                 C   sH   z| j  tj| jf¡ | j  d¡ | j  d¡| _W |  ¡  d S |  ¡  w )Nó   hellor    )	r   Úconnectr   ZDEFAULT_CONNECTr   r*   r(   Úserver_datar   r   r
   r
   r   Úmake_request   s
   zClient.make_request)r   r   r   r1   r   r   r2   r
   r
   r
   r   r.   t   s
    r.   c                   @   s2   e Zd ZejZdd„ Zdd„ Zdd„ Zdd„ Z	d	S )
ÚTestc                 C   s–   t |d}t |jj¡}d }t|jƒ |rt|jƒ}t|j	ƒ ||fD ]}|d u r*q#|jd ur8t
dƒ |jd us/q#|rI|  |jd¡ |  |jd¡ |S )N)r   g{®Gáz„?r/   r!   )r   ÚweakrefÚrefr   Ú_sockr   r-   r.   r   r2   r   ÚassertEqualr)   r1   )r   Ú
run_clientÚserverÚwref_to_hidden_server_socketÚclientÚobjr
   r
   r   Úrun_interaction   s$   





ÿ€zTest.run_interactionc                 C   sˆ   | j |d}t ¡  |ƒ rBddlm} t|t |ƒ ¡ƒƒ t |ƒ ¡D ]}t||ƒƒ t |¡D ]	}td||ƒƒ q0q#|  d¡ d S d S )N)r8   r   )Úpformatú-z#server socket should be dead by now)	r=   Ú	greentestZgc_collect_if_neededÚpprintr>   ÚprintÚgcZget_referrersZfail)r   r8   r:   r>   ÚxÚyr
   r
   r   Úrun_and_check§   s   ÿùzTest.run_and_checkc                 C   ó   |   d¡ |   d¡ d S )NT©rF   r   r
   r
   r   Útest_clean_exit³   ó   
zTest.test_clean_exitc                 C   rG   )NFrH   r   r
   r
   r   Útest_timeout_exit·   rJ   zTest.test_timeout_exitN)
r   r   r   r@   ZLARGE_TIMEOUTZ__timeout__r=   rF   rI   rK   r
   r
   r
   r   r3   Š   s    r3   Ú__main__)%r	   Ú
__future__r   Ú_socketr   Zc_socketÚsysÚversion_infoÚ
__import__r   Zgeventr   Z	patch_allZgevent.testingÚtestingr@   r   r   Úthreadr   ÚImportErrorÚ_threadÚtimer   r4   rC   Z_realsocketr#   ZRESOLVER_DNSPYTHONZRUNNING_ON_CIÚobjectr   r.   ZTestCaser3   r   Úmainr
   r
   r
   r   Ú<module>   sF   ÿ+2ÿ