o
    eK                     @   s   d dl mZ d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dl	mZ dd	 Zd
d ZG dd dejZG dd dejZedG dd dejZedkr`e  dS dS )    )print_function)absolute_importN)socket)backdoor)DEFAULT_BIND_ADDR_TUPLE)DEFAULT_CONNECTc                 C   sd   d}t |ts	J ||s&| d}|std||f ||7 }||rt |tr-|S |dS )N       z)Connection ended before %r. Data read:
%rzutf-8)
isinstancebytesendswithrecvAssertionErrorstrdecode)connZpostfixreadresult r   KD:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__backdoor.py
read_until   s   


r   c                 C   s4   |   }| W  d    S 1 sw   Y  d S N)makefilereadline)r   fr   r   r   r      s   
$r   c                   @   s   e Zd ZdZdS )WorkerGreenlet   N)__name__
__module____qualname__Zspawning_stack_limitr   r   r   r   r      s    r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )SocketWithBannerbannerc                    s    d | _ tt| j|i | d S r   )r"   superr    __init__)selfargskwargs	__class__r   r   r$   #   s   zSocketWithBanner.__init__c                 C   s   t j | S r   )r   	__enter__r%   r   r   r   r*   '   s   zSocketWithBanner.__enter__c                 C   s   t j | |||S r   )r   __exit__)r%   tvtbr   r   r   r,   *   s   zSocketWithBanner.__exit__)r   r   r   	__slots__r$   r*   r,   __classcell__r   r   r(   r   r        s
    r    a  With the update to libev 4.31 and potentially closing sockets in the background, alternate tests started hanging on appveyor. Something like .E.E.E. See https://ci.appveyor.com/project/denik/gevent/build/job/n9fynkoyt2bvk8b5 It's not clear why, but presumably a socket isn't getting closed and a watcher is tied to the wrong file descriptor. I haven't been able to reproduce. If it were a systemic problem I'd expect to see more failures, so it is probably specific to resource management in this test.c                       s   e Zd ZdZ fddZdd Zdd Zdd	 ZdddZe	
de	ddd Zdd Zdd Zdd Zdd Zdd Z  ZS )Test
   c                    s   t   tt|   d S r   )geventsleepr#   r2   tearDownr+   r(   r   r   r6   ;   s   zTest.tearDownc                 O   s$   t jtg|R i |}|  |S r   )r   ZBackdoorServerr   start)r%   r&   r'   serverr   r   r   _make_and_start_server?   s   zTest._make_and_start_serverc                 C   s@   t  }|t|jf z| |}W n   |   ||_|S r   )r    connectr   Zserver_port_wait_for_promptcloser"   )r%   r8   r   r"   r   r   r   _create_connectionD   s   zTest._create_connectionc                 C   s
   t |dS )N   >>> )r   )r%   r   r   r   r   r;   P   s   
zTest._wait_for_prompt	   quit()
)c                 C   s*   | | t|}| |d |  d S )N )sendallr   assertEqualr<   )r%   r   cmdliner   r   r   _closeS   s   
zTest._closezcSometimes fails to get the right answers; https://travis-ci.org/github/gevent/gevent/jobs/692184822z9segfaults; See https://github.com/gevent/gevent/pull/1156c                    s     ?fdd  fddtdD }ztj|dd}W tj|dd ntj|dd w t|t|| W d    d S 1 sFw   Y  d S )	Nc                     sb     "} | d t| } | dt|  |  W d    d S 1 s*w   Y  d S )Ns   2+2
4)r=   rA   r   rB   stripreprrE   )r   rD   )r%   r8   r   r   r:   b   s   
"z Test.test_multi.<locals>.connectc                    s   g | ]}t  qS r   )r   Zspawn).0_)r:   r   r   
<listcomp>i   s    z#Test.test_multi.<locals>.<listcomp>r3   T)Zraise_errorF)r9   ranger4   ZjoinallrB   len)r%   jobsdoner   )r:   r%   r8   r   
test_multiY   s   
 "zTest.test_multic              	   C   sr   |   +}| |}| | W d    n1 sw   Y  W d    d S W d    d S 1 s2w   Y  d S r   r9   r=   rE   r%   r8   r   r   r   r   	test_quitq   s   
"zTest.test_quitc              	   C   st   |   ,}| |}| |d W d    n1 sw   Y  W d    d S W d    d S 1 s3w   Y  d S )Ns   import sys; sys.exit(0)
rQ   rR   r   r   r   test_sys_exitv   s   
"zTest.test_sys_exitc              	   C   s   d}| j |d%}| |}|j}| | W d    n1 s!w   Y  W d    n1 s0w   Y  | |d t| || d S )NzWelcome stranger!r!   )r9   r=   r"   rE   rB   rM   )r%   Zexpected_bannerr8   r   r"   r   r   r   test_banner{   s   zTest.test_bannerc              	   C   s   |   ,}| |}|d t|d}| | W d    n1 s$w   Y  W d    n1 s3w   Y  | jt|dd| d d S )Ns   locals()["__builtins__"]
r>   i,  zlocals() unusable: %s...)msg)r9   r=   rA   r   rE   Z
assertLessrM   )r%   r8   r   responser   r   r   test_builtins   s   



zTest.test_builtinsc              	      s   ddl mm   fdd}| jd|id,}| |}|d | |}| | W d    n1 s7w   Y  W d    n1 sFw   Y  |dd	}| 	d
| d S )Nr   )QueueEmptyc                     sZ    } t d z	| jddd W n  y   t d Y nw t d td t d d S )Nzswitching out, then throwing inTg?)blocktimeoutz	Got Emptyzswitching outzswitched in)printgetr4   r5   )qrZ   rY   r   r   bad   s   
z!Test.test_switch_exc.<locals>.badra   )localss   bad()
z

zHswitching out, then throwing in
Got Empty
switching out
switched in
>>> )
Zgevent.queuerY   rZ   r9   r=   rA   r;   rE   replacerB   )r%   ra   r8   r   rW   r   r`   r   test_switch_exc   s   

zTest.test_switch_exc)r?   )r   r   r   Z__timeout__r6   r9   r=   r;   rE   	greentestZskipOnMacOnCIZskipOnLibuvOnTravisOnCPython27rP   rS   rT   rU   rX   re   r1   r   r   r(   r   r2   .   s&    

r2   __main__)
__future__r   r   r4   r   r   Zgevent.testingtestingrf   Zgevent.testing.paramsr   r   r   r   ZGreenletr   r    ZskipOnAppVeyorZTestCaser2   r   mainr   r   r   r   <module>   s&    	s