o
    ,wi                     @   s   d dl Z d dl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eeddG dd deZedkrme  dS dS )    N)backdoor)socket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)connpostfixreadresult r   X/home/ubuntu/sommelier/.venv/lib/python3.10/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__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+   '      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 Zdd Z	dd Z
d ddZ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$   r4   tearDownr,   r)   r   r   r8   ;   s   zTest.tearDownc                 C   s   t S r   r   r,   r   r   r   _server_listen_argument?      zTest._server_listen_argumentc                 O   s(   t j|  g|R i |}|  |S r   )r   BackdoorServerr9   start)r&   r'   r(   serverr   r   r   _make_and_start_serverB   s   zTest._make_and_start_serverc                 C   s   t |jffS r   )r   server_portr&   r=   r   r   r   _connection_argumentsG   r-   zTest._connection_argumentsc                 C   s   dS )Nr   r   r,   r   r   r   _socket_argumentsJ   r:   zTest._socket_argumentsc                 C   sF   t |   }z|j| |  | |}W n   |   ||_|S r   )r!   rB   connectrA   _wait_for_promptcloser#   )r&   r=   r   r#   r   r   r   _create_connectionM   s   zTest._create_connectionc                 C   s
   t |dS )N   >>> )r   )r&   r   r   r   r   rD   Z   s   
zTest._wait_for_prompt	   quit()
)c                 C   s*   | | t|}| |d |  d S )N )sendallr   assertEqualrE   )r&   r   cmdliner   r   r   _close]   s   
zTest._closezcSometimes fails to get the right answers; https://travis-ci.org/github/gevent/gevent/jobs/692184822c                    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)rF   rJ   r   rK   stripreprrN   )r   rM   r@   r   r   rC   i   s   
"z Test.test_multi.<locals>.connectc                    s   g | ]}t  qS r   )r   spawn).0_)rC   r   r   
<listcomp>p   s    z#Test.test_multi.<locals>.<listcomp>r5   T)raise_errorF)r>   ranger6   joinallrK   len)r&   jobsdoner   )rC   r&   r=   r   
test_multic   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   r>   rF   rN   r&   r=   r   r   r   r   	test_quitx   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)
r]   r^   r   r   r   test_sys_exit}   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"   )r>   rF   r#   rN   rK   rY   )r&   expected_bannerr=   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__"]
rG   i,  zlocals() unusable: %s...)msg)r>   rF   rJ   r   rN   
assertLessrY   )r&   r=   r   responser   r   r   test_builtins   s   



zTest.test_builtinsc              	      s   ddl m  ddl m  fdd}| jd|id,}| |}|d | |}| | W d    n1 s;w   Y  W d    n1 sJw   Y  |d	d
}| 	d| d S )Nr   )Empty)Queuec                     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getr6   r7   )qrg   rh   r   r   bad   s   
z!Test.test_switch_exc.<locals>.badro   )localss   bad()
z

zHswitching out, then throwing in
Got Empty
switching out
switched in
>>> )
gevent.queuerg   rh   r>   rF   rJ   rD   rN   replacerK   )r&   ro   r=   r   re   r   rn   r   test_switch_exc   s    

zTest.test_switch_exc)rH   )r   r   r   __timeout__r8   r9   r>   rA   rB   rF   rD   rN   	greentestskipOnMacOnCIr\   r_   r`   rb   rf   rt   r3   r   r   r)   r   r4   .   s&    


r4   AF_UNIXzNeeds AF_UNIX supportc                       s@   e Zd Z fddZ fddZdd Zdd Zd	d
 Z  ZS )TestUnixSocketc                    s   t    t | _d S r   )r$   setUptempfilemktempunix_socket_pathr,   r)   r   r   rz      s   
zTestUnixSocket.setUpc                    s(   t j| jrt | j t   d S r   )ospathexistsr}   unlinkr$   r8   r,   r)   r   r   r8      s   zTestUnixSocket.tearDownc              
   C   sf   t  t jt j}z|| j |t j W |S  ty2 } z|  t	d| j d| d }~ww )NzFailed to bind Unix socket at z: )
r   rx   SOCK_STREAMbindr}   listen	SOMAXCONN	ExceptionrE   RuntimeError)r&   listenerexr   r   r   r9      s   z&TestUnixSocket._server_listen_argumentc                 C   s   | j fS r   )r}   r@   r   r   r   rA      s   z$TestUnixSocket._connection_argumentsc                 C   s   t jt jfS r   )r   rx   r   r,   r   r   r   rB      r-   z TestUnixSocket._socket_arguments)	r   r   r   rz   r8   r9   rA   rB   r3   r   r   r)   r   ry      s    ry   __main__)r~   r{   r6   gevent.testingtestingrv   r   r   gevent.testing.paramsr   r   r   r   Greenletr   r!   skipOnAppVeyorTestCaser4   
skipUnlesshasattrry   r   mainr   r   r   r   <module>   s0    	z