B
    ÐH/\tA  ã               @   sH  d dl mZmZ 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Zd dlmZ G dd„ deƒZG d	d
„ d
eƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZej e¡fdd„ZG dd„ deƒZ G dd„ deƒZ!e"dkrDe #¡  dS ) é    )Úprint_functionÚdivisionN)ÚPY3)ÚDEFAULT_SOCKET_TIMEOUT)Úsocket)ÚStreamServerc               @   s   e Zd Zdd„ ZdS )ÚSimpleStreamServerc       	      C   s°   |  ¡ }z˜| ¡ }|sd S y| dd¡\}}}W n$ tk
rT   td|f ƒ ‚ Y nX |dkrj| d¡ n4|dkr”| d¡ x | d¡}|s~P q~W n
| d	¡ W d | ¡  X d S )
Nú é   z Failed to parse request line: %rz/pings   HTTP/1.0 200 OK

PONG)z/longz/shorts   helloé   s   HTTP/1.0 404 WTF?

)ÚmakefileÚreadlineÚsplitÚ	ExceptionÚprintZsendallÚrecvÚclose)	ÚselfZclient_socketZ_addressÚfdZrequest_lineÚ_methodÚpathZ_restÚdata© r   ú8lib/python3.7/site-packages/gevent/tests/test__server.pyÚhandle   s(    

zSimpleStreamServer.handleN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c               @   sP   e Zd ZeZeZdZdZe	dd„ ƒZ
e
Ze	dd„ ƒZe	dd„ ƒZe	dd	„ ƒZd
S )ÚSettingsTc             C   s   |   ¡ }| ¡ }|  |¡ d S )N)r   ÚreadÚassertFalse)ÚinstÚconnÚresultr   r   r   ÚassertAcceptedConnectionError0   s    z&Settings.assertAcceptedConnectionErrorc          
   C   sP   |   ¡  y|  ¡  W n6 tjk
rJ } z|jd tjkr:‚ W d d }~X Y nX d S )Nr   )Ú	assert500Úsend_requestr   ÚerrorÚargsÚ	greentestZCONN_ABORTED_ERRORS)r!   Úexr   r   r   Ú	assert5038   s    zSettings.assert503c          	   C   s(   |   tj¡ | jdd W d Q R X d S )Ng{®Gáz„?)Útimeout)ÚassertRaisesr   r,   ÚassertRequestSucceeded)r!   r   r   r   ÚassertPoolFullC   s    zSettings.assertPoolFullc             C   s   |  d|  ¡ ¡ |S )NÚspawn)Ú
setdefaultÚ	get_spawn)r!   Úkwargsr   r   r   Úfill_default_server_argsH   s    z!Settings.fill_default_server_argsN)r   r   r   r   ÚServerClassr   ÚServerSubClassÚrestartableZclose_socket_detectedÚstaticmethodr$   r%   r+   r/   r4   r   r   r   r   r   *   s   r   c               @   sè   e Zd ZejZeZdZdd„ Zdd„ Z	dd„ Z
edfd	d
„Zdedfdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zefdd„Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zed&d'„ ƒZd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z dS )2ÚTestCaseNc             C   s$   t | dd ƒd k	r | j ¡  d | _d S )NÚserver)Úgetattrr:   Ústop)r   r   r   r   ÚcleanupS   s    
zTestCase.cleanupc             C   s*   t   ¡ }| d¡ | d¡ |  |¡ |S )N)z	127.0.0.1r   é   )r   ÚbindÚlistenZ_close_on_teardown)r   Úsockr   r   r   Úget_listenerX   s
    


zTestCase.get_listenerc             C   sZ   | j j}|stj}n|dkr"tj}y| j jj}W n tk
rJ   tj}Y nX || j j	|fS )Nz::)
r:   Úserver_hostr)   ZDEFAULT_LOCAL_HOST_ADDRZDEFAULT_LOCAL_HOST_ADDR6r   ÚfamilyÚAttributeErrorZAF_INETÚserver_port)r   rC   rD   r   r   r   Úget_server_host_port_family_   s    z$TestCase.get_server_host_port_familyr   c       	      C   s’   |   ¡ \}}}tj|d}y| ||f¡ W n tk
rJ   | ¡  ‚ Y nX tr\|ddœ}nd|i}|jf |Ž}trz||_|j |¡ | ¡  |S )N)rD   Zrwb)Ú	bufferingÚmodeÚbufsize)	rG   r   Zconnectr   r   r   r   Ú_sockZ
settimeout)	r   r,   rJ   rC   rF   rD   rA   r3   Zrconnr   r   r   r   n   s     zTestCase.makefileú/c             C   s.   | j ||d}| d|  d¡¡ | ¡  |S )N)r,   rJ   zGET %s HTTP/1.0

zlatin-1)r   ÚwriteÚencodeÚflush)r   Zurlr,   rJ   r"   r   r   r   r&   ‡   s    zTestCase.send_requestc          	   C   sL   |   tj¡}|  ¡ }| ¡  W d Q R X |j}|  |jd tj	tj
f¡ d S )Nr   )r-   r   r'   r   r   Z	exceptionÚassertInr(   ÚerrnoZECONNREFUSEDZEADDRNOTAVAIL)r   Úexcr"   r*   r   r   r   ÚassertConnectionRefused   s
    z TestCase.assertConnectionRefusedc             C   s   | j  | ¡ d S )N)r   r%   )r   r   r   r   r%   •   s    zTestCase.assert500c             C   s   | j  | ¡ d S )N)r   r+   )r   r   r   r   r+   ˜   s    zTestCase.assert503c             C   s   | j  | ¡ d S )N)r   r$   )r   r   r   r   r$   ›   s    z&TestCase.assertAcceptedConnectionErrorc             C   s   | j  | ¡ d S )N)r   r/   )r   r   r   r   r/   ž   s    zTestCase.assertPoolFullc             C   s†   |   ¡ }| d¡ | ¡  d}y$x|j d¡}|s4P ||7 }q"W W n  tjk
rb   |  |¡ d S X |  | 	d¡t
|ƒ¡ | ¡  d S )Ns   GET / HTTP/1.0

ó    r   s"   HTTP/1.0 500 Internal Server Error)r   rM   rO   rK   r   r   r,   r    Ú
assertTrueÚ
startswithÚreprr   )r   r"   r#   r   r   r   r   ÚassertNotAccepted¡   s    

zTestCase.assertNotAcceptedc             C   s@   | j |d}| d¡ | ¡ }| ¡  | d¡s<tt|ƒƒ‚d S )N)r,   s   GET /ping HTTP/1.0

s   

PONG)r   rM   r   r   ÚendswithÚAssertionErrorrW   )r   r,   r"   r#   r   r   r   r.   ²   s
    
zTestCase.assertRequestSucceededc             C   s   | j  ¡  |  ¡  |  ¡  d S )N)r:   Ústartr.   )r   r   r   r   Ústart_server¹   s    
zTestCase.start_serverc             C   s   | j  ¡  |  ¡  d S )N)r:   r<   rS   )r   r   r   r   Ústop_server¾   s    
zTestCase.stop_serverc             C   s   d S )Nr   )r   Z_msgr   r   r   Úreport_netstatÂ   s    zTestCase.report_netstatc             C   s   |   tjdf¡S )Nr   )r6   r)   ÚDEFAULT_BIND_ADDR)r   r   r   r   Ú_create_serverÇ   s    zTestCase._create_serverc             C   s"   |   ¡ | _| j ¡  t d¡ d S )Ng{®Gáz„?)r`   r:   r[   ÚgeventÚsleep)r   r   r   r   Úinit_serverÊ   s    

zTestCase.init_serverc             C   s   | j jS )N)r:   r   )r   r   r   r   r   Ï   s    zTestCase.socketc             C   sb   z@|   tjdfdd„ ¡| _| j ¡  |  ¡  |  ¡  |  t¡ W d | j 	¡  dd l
}| ¡  X d S )Nr   c               S   s   d S )Nr   r   r   r   r   Ú<lambda>Õ   s    z1TestCase._test_invalid_callback.<locals>.<lambda>)r5   r)   r_   r:   r[   Úexpect_one_errorr%   Úassert_errorÚ	TypeErrorr<   ÚgcZcollect)r   rh   r   r   r   Ú_test_invalid_callbackÓ   s    

 zTestCase._test_invalid_callbackc             C   s   | j  | |¡S )N)r   r4   )r   r3   r   r   r   r4   ã   s    z!TestCase.fill_default_server_argsc             O   s   | j j||  |¡ŽS )N)r   r5   r4   )r   r(   r3   r   r   r   r5   æ   s    zTestCase.ServerClassc             O   s   | j j||  |¡ŽS )N)r   r6   r4   )r   r(   r3   r   r   r   r6   ê   s    zTestCase.ServerSubClassc             C   s   d S )Nr   )r   r   r   r   r2   î   s    zTestCase.get_spawn)!r   r   r   r)   ZLARGE_TIMEOUTZ__timeout__r   r:   r=   rB   rG   Ú_DEFAULT_SOCKET_TIMEOUTr   r&   rS   r%   r+   r$   r/   rX   r.   r\   r]   r^   r`   rc   Úpropertyr   ri   r4   r5   r6   r2   r   r   r   r   r9   M   s4   r9   c               @   sœ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
e ej¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zdd „ Zd!S )"ÚTestDefaultSpawnc             C   s   t jS )N)ra   r0   )r   r   r   r   r2   ó   s    zTestDefaultSpawn.get_spawnc             C   sv   |   d¡ |  ¡  |   d¡ |r`| jjr`| j ¡  |   d¡ |  ¡  | j ¡  |   d¡ |  ¡  |  	¡  |   d¡ d S )Nzbefore startzafter startzafter stop_acceptingzafter start_acceptingz
after stop)
r^   r\   r   r7   r:   Zstop_acceptingrX   Zstart_acceptingr.   r]   )r   r7   r   r   r   Ú_test_server_start_stopö   s    





z(TestDefaultSpawn._test_server_start_stopc          	   C   s4   d| _ |  t¡ | j|  ¡ ddd W d Q R X d S )NFé   )Úbacklogr   )Úswitch_expectedr-   rg   r5   rB   )r   r   r   r   Ú'test_backlog_is_not_accepted_for_socket  s    z8TestDefaultSpawn.test_backlog_is_not_accepted_for_socketc             C   s.   | j tjdfdd| _|  ¡  | jdd d S )Nr   rn   )ro   F)r7   )r6   r)   r_   r:   rS   rm   )r   r   r   r   Ú$test_backlog_is_accepted_for_address	  s    z5TestDefaultSpawn.test_backlog_is_accepted_for_addressc             C   s   |   |  ¡ ¡| _|  ¡  d S )N)r6   rB   r:   rX   )r   r   r   r   Útest_subclass_just_create  s    z*TestDefaultSpawn.test_subclass_just_createc             C   s(   |   |  ¡ ¡| _|  ¡  | jdd d S )NT)r7   )r6   rB   r:   rX   rm   )r   r   r   r   Útest_subclass_with_socket  s    z*TestDefaultSpawn.test_subclass_with_socketc             C   s*   |   tjdf¡| _|  ¡  | jdd d S )Nr   T)r7   )r6   r)   r_   r:   rS   rm   )r   r   r   r   Útest_subclass_with_address  s    z+TestDefaultSpawn.test_subclass_with_addressc             C   s   |   ¡  d S )N)ri   )r   r   r   r   Útest_invalid_callback  s    z&TestDefaultSpawn.test_invalid_callbackc             C   sZ   t  | jj¡}z4t  d¡ |  ¡  | j ¡  | jjr8t‚|  	¡  W d | 
¡  | ¡  X d S )Ng{®Gáz„?)ra   r0   r:   Zserve_foreverrb   r.   r<   ÚstartedrZ   rS   ÚkillÚget)r   Úgr   r   r   Ú_test_serve_forever!  s    

z$TestDefaultSpawn._test_serve_foreverc             C   s,   |   d¡| _| jjrt‚|  ¡  |  ¡  d S )N)z	127.0.0.1r   )r6   r:   rw   rZ   rS   r{   )r   r   r   r   Útest_serve_forever.  s    z#TestDefaultSpawn.test_serve_foreverc             C   sH   |   tjdf¡| _|  ¡  | jjr&t‚| j ¡  | jjs<t‚|  ¡  d S )Nr   )	r6   r)   r_   r:   rS   rw   rZ   r[   r{   )r   r   r   r   Útest_serve_forever_after_start4  s    
z/TestDefaultSpawn.test_serve_forever_after_startc             C   sÎ   |   tjdfdd„ ¡| _| j ¡  |  ¡ }tj d¡† zty&| 	¡ }|r^| 
d¡s^tt|ƒƒ‚W nH tjk
r¨ } z(|jd dkr„n|jd tjkr–n‚ W d d }~X Y nX W d | ¡  X W d Q R X |  ¡  d S )Nr   c              W   s   g S )Nr   )r(   r   r   r   rd   =  s    zDTestDefaultSpawn.test_server_closes_client_sockets.<locals>.<lambda>r   z"HTTP/1.0 500 Internal Server ErroriE'  )r5   r)   r_   r:   r[   r&   ra   ZTimeoutZ_start_new_or_dummyr   rV   rZ   rW   r   r'   r(   rQ   Z
ECONNRESETr   r]   )r   r"   r#   r*   r   r   r   Ú!test_server_closes_client_sockets<  s     
z2TestDefaultSpawn.test_server_closes_client_socketsc             C   s"   |   ¡ | _| j ¡  t d¡ d S )Ng{®Gáz„?)r`   r:   r[   ra   rb   )r   r   r   r   rc   R  s    

zTestDefaultSpawn.init_serverc             C   s   | j jS )N)r:   r   )r   r   r   r   r   W  s    zTestDefaultSpawn.socketc                sN   |   ¡  |  | jj¡ tdƒ‰ ‡ fdd„| j_|  ¡  |  ¡  |  tˆ ¡ d S )NÚtest_error_in_spawnc                 s   t  ¡  ˆ ¡S )N)ra   Z
getcurrentÚthrow)r(   )r'   r   r   rd   _  s    z6TestDefaultSpawn.test_error_in_spawn.<locals>.<lambda>)	rc   rU   r:   rw   ÚExpectedErrorZ_spawnre   r$   rf   )r   r   )r'   r   r   [  s    z$TestDefaultSpawn.test_error_in_spawnc             C   s    |   ¡  |  ¡  |  dt| jƒ¡ | j | jj¡ |  dt| jƒ¡ |  dt| jƒ¡ | j | j¡ |  dt| jƒ¡ dd„ }| j |¡ |  dt| jƒ¡ d S )NZServerzhandle=<bound methodzof self>Ú.test_server_repr_when_handle_is_instancemethodc               S   s   d S )Nr   r   r   r   r   r   q  s    zOTestDefaultSpawn.test_server_repr_when_handle_is_instancemethod.<locals>.handlezhandle=<function)rc   r\   rP   rW   r:   Z
set_handler   r‚   )r   r   r   r   r   r‚   d  s    z?TestDefaultSpawn.test_server_repr_when_handle_is_instancemethodN)r   r   r   r2   rm   rq   rr   rs   rt   ru   rv   r)   Zreraises_flaky_timeoutr   r,   r{   r|   r}   r~   rc   rk   r   r‚   r   r   r   r   rl   ñ   s    	rl   c               @   s   e Zd Zdd„ ZdS )ÚTestRawSpawnc             C   s   t jS )N)ra   Z	spawn_raw)r   r   r   r   r2   y  s    zTestRawSpawn.get_spawnN)r   r   r   r2   r   r   r   r   rƒ   w  s   rƒ   c               @   s0   e Zd Zdd„ Ze ejd¡dd„ ƒZde_dS )ÚTestPoolSpawnc             C   s   dS )Né   r   )r   r   r   r   r2     s    zTestPoolSpawn.get_spawnz™If we have bad timer resolution and hence increase timeouts, it can be hard to sleep for a correct amount of time that lets requests in the pool be full.c             C   s¢   |   ¡  |  d¡}|  d¡}t ¡ j ¡  t td ¡ |  ¡  |  ¡  |  ¡  |j	 
¡  trf| 
¡  t t¡ y|  ¡  W n tjk
rš   t ¡  Y nX ~d S )Nz/shortz/longg      $@)rc   r&   ra   Zget_hubZloopZ
update_nowrb   rj   r/   rK   r   r   r.   r   r,   r)   ZreraiseFlakyTestTimeout)r   Zshort_requestZlong_requestr   r   r   Útest_pool_full‚  s"    



zTestPoolSpawn.test_pool_fullFN)	r   r   r   r2   r)   ZskipIfZEXPECT_POOR_TIMER_RESOLUTIONr†   Zerror_fatalr   r   r   r   r„   }  s   !r„   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestNoneSpawnc             C   s   d S )Nr   )r   r   r   r   r2   ©  s    zTestNoneSpawn.get_spawnc             C   s   |   ¡  d S )N)ri   )r   r   r   r   rv   ¬  s    z#TestNoneSpawn.test_invalid_callbackc             C   sL   dd„ }| j jtjdf|d d| _| j ¡  |  ¡  |  ¡  |  t	d¡ d S )Nc              W   s   t  d¡ d S )Nr   )ra   rb   )Z_argsr   r   r   rb   °  s    z<TestNoneSpawn.test_assertion_in_blocking_func.<locals>.sleepr   )r0   z?Impossible to call blocking function in the event loop callback)
r   r5   r)   r_   r:   r[   re   r%   rf   rZ   )r   rb   r   r   r   Útest_assertion_in_blocking_func¯  s    
z-TestNoneSpawn.test_assertion_in_blocking_funcN)r   r   r   r2   rv   rˆ   r   r   r   r   r‡   §  s   r‡   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   ¹  s   r   c               @   s2   e Zd ZdZdd„ Ze eedƒd¡dd„ ƒZ	dS )	ÚTestSSLSocketNotAllowedFc             C   s   t jS )N)ra   r0   )r   r   r   r   r2   Â  s    z!TestSSLSocketNotAllowed.get_spawnÚsslzUses socket.sslc             C   sN   ddl m} ddl m} |ƒ }| d¡ | d¡ ||ƒ}|  t| j|¡ d S )Nr   )rŠ   )r   )z0.0.0.0r   r>   )Zgevent.socketrŠ   r   r?   r@   r-   rg   r6   )r   rŠ   ZgsocketZlistenerr   r   r   ÚtestÅ  s    

zTestSSLSocketNotAllowed.testN)
r   r   r   rp   r2   ÚunittestZ
skipUnlessÚhasattrr   r‹   r   r   r   r   r‰   ¾  s   r‰   c             C   s   t j t j || ¡¡S )N)Úosr   ÚabspathÚjoin)ÚnameÚherer   r   r   Ú_fileÏ  s    r“   c               @   s   e Zd ZdS )ÚBadWrapExceptionN)r   r   r   r   r   r   r   r”   Ó  s   r”   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestSSLGetCertificatec             C   s   | j tjdftdƒtdƒdS )Nr   z
server.keyz
server.crt)ZkeyfileZcertfile)r6   r)   r_   r“   )r   r   r   r   r`   Ù  s    z$TestSSLGetCertificate._create_serverc             C   s   t jS )N)ra   r0   )r   r   r   r   r2   Þ  s    zTestSSLGetCertificate.get_spawnc             C   sX   ddl m}m} |  | d¡¡ |  | d¡¡ |  ¡  |  ¡ \}}}| ||f¡ d S )Nr   )ÚmonkeyrŠ   rŠ   r   )ra   r–   rŠ   r    Zis_module_patchedrc   rG   Zget_server_certificate)r   r–   rŠ   rC   rF   Z_familyr   r   r   Útest_certificateá  s    z&TestSSLGetCertificate.test_certificatec          	   C   s@   |   ¡  dd„ }|| j_|  t¡ | j d d ¡ W d Q R X d S )Nc             [   s
   t ƒ ‚d S )N)r”   )Z_client_socketZ
_wrap_argsr   r   r   Úbad_wrapõ  s    zPTestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failure.<locals>.bad_wrap)rc   r:   Zwrap_socketr-   r”   Z_handle)r   r˜   r   r   r   Ú(test_wrap_socket_and_handle_wrap_failureî  s
    z>TestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failureN)r   r   r   r`   r2   r—   r™   r   r   r   r   r•   ×  s   r•   Ú__main__)$Z
__future__r   r   rŒ   rQ   rŽ   Zgevent.testingZtestingr)   r   r   rj   ra   r   Zgevent.serverr   r   Úobjectr   r9   rl   rƒ   r„   r‡   r   r   r‰   r   ÚdirnameÚ__file__r“   ÚBaseExceptionr”   r•   r   Úmainr   r   r   r   Ú<module>   s2   # % *+
