o
    U˟iiO                     @   s  d dl mZmZ d dl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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 d dlmZ G dd deZdd 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re
.  dS dS )(    )print_functiondivision)contextmanagerN)PY3)sysinfo)DEFAULT_SOCKET_TIMEOUT)SMALLEST_RELIABLE_DELAY)tcp_listener)WIN)socket)StreamServer)LoopExitc                   @      e Zd Zdd ZdS )SimpleStreamServerc           	      C   s   |  }z`| }|sW |  d S z|dd\}}}W n ty,   td|f   w |dkr7|d n |dv rK|d 	 |d	}|sInqAn|d
 W |  d S W |  d S W |  d S |  w )N    z Failed to parse request line: %rz/pings   HTTP/1.0 200 OK

PONG)/long/shorts   helloT   s   HTTP/1.0 404 WTF?

)makefilereadlineclosesplit	Exceptionprintsendallrecv)	selfclient_socket_addressfdrequest_line_methodpath_restdata r&   a/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/site-packages/gevent/tests/test__server.pyhandle   s8   


zSimpleStreamServer.handleN)__name__
__module____qualname__r(   r&   r&   r&   r'   r          r   c                  G   s.   zt tsdnt W d S  ty   Y d S w Nr   )geventsleepr
   r   r   _argsr&   r&   r'   sleep_to_clear_old_sockets0   s
   r2   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\   |   }z| }W n tjy   d }Y nw W d    n1 s"w   Y  | | d S N)r   readr   timeoutassertFalse)instconnresultr&   r&   r'   assertAcceptedConnectionErrorB   s   
z&Settings.assertAcceptedConnectionErrorc              
   C   sR   |    z|   W d S  tjy( } z|jd tjvr W Y d }~d S d }~ww r-   )	assert500send_requestr   errorargs	greentestCONN_ABORTED_ERRORS)r8   exr&   r&   r'   	assert503M   s   zSettings.assert503c                 C   s>   |  tj | jdd W d    d S 1 sw   Y  d S )Ng{Gz?r6   )assertRaisesr   r6   assertRequestSucceeded)r8   r&   r&   r'   assertPoolFullX   s   "zSettings.assertPoolFullc                 C   s   | d|   |S )Nspawn)
setdefault	get_spawn)r8   kwargsr&   r&   r'   fill_default_server_args]   s   z!Settings.fill_default_server_argsN)r)   r*   r+   r   ServerClassr   ServerSubClassrestartableclose_socket_detectedstaticmethodr;   r<   rC   rG   rL   r&   r&   r&   r'   r3   <   s    



r3   c                   @   s2  e Zd ZejZeZdZdd Zdd Z	dd Z
eedd	fd
dZdedfddZd8ddZdZejr8ejfZnejrAejrAdZn	ejrJeejf7 Zd9d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&d0d1 Z'd2d3 Z(d4d5 Z)d6d7 Z*dS ):TestCaseNc                 C   s*   t | dd d ur| j  d | _t  d S )Nserver)getattrrS   stopr2   r   r&   r&   r'   cleanuph   s   

zTestCase.cleanupc                 C   s   |  tddS )N   backlog)_close_on_teardownr	   rV   r&   r&   r'   get_listenern      zTestCase.get_listenerc                 C   sX   | j j}|s
tj}n|dkrtj}z| j jj}W n ty$   tj}Y nw || j j	|fS )Nz::)
rS   server_hostr@   DEFAULT_LOCAL_HOST_ADDRDEFAULT_LOCAL_HOST_ADDR6r   familyAttributeErrorAF_INETserver_port)r   r^   ra   r&   r&   r'   get_server_host_port_familyq   s   
z$TestCase.get_server_host_port_familyr   Fc              	   c   s    |   \}}}trdnd}||i}trd|d< tj|dB}	d }
|	||f |	| |	jdi |}
|s:|
n|
|	f}|V  W d    n1 sKw   Y  W d    d S W d    d S 1 scw   Y  d S )N	bufferingbufsizerwbmode)ra   r&   )re   r   r   connect
settimeoutr   )r   r6   rg   include_raw_socketr^   rd   ra   bufargmakefile_kwargssockrconnr:   r&   r&   r'   r      s"   
"zTestCase.makefile/c                 C   s@   | j ||d}| || W d    d S 1 sw   Y  d S )N)r6   rg   )r   send_request_to_fd)r   urlr6   rg   r9   r&   r&   r'   r=      s   "zTestCase.send_requestc                 C   s    | d| d |  d S )NzGET %s HTTP/1.0

zlatin-1)writeencodeflush)r   r    rs   r&   r&   r'   rr      s   zTestCase.send_request_to_fdr&   )iA'  Tc              	   C   s   z0|  tj }|  }|  W d    n1 sw   Y  W d    n1 s*w   Y  W n ty=   |s: Y d S w |j}| |jd t	j
t	jt	jt	jf| j ||jf d S r-   )rE   r   r>   r   r   r   	exceptionassertInr?   errnoECONNREFUSEDEADDRNOTAVAIL
ECONNRESETECONNABORTEDLOCAL_CONN_REFUSED_ERRORS)r   in_proc_serverexcr9   rB   r&   r&   r'   assertConnectionRefused   s,   

z TestCase.assertConnectionRefusedc                 C      | j |  d S r4   )r3   r<   rV   r&   r&   r'   r<      r]   zTestCase.assert500c                 C   r   r4   )r3   rC   rV   r&   r&   r'   rC      r]   zTestCase.assert503c                 C   r   r4   )r3   r;   rV   r&   r&   r'   r;      r]   z&TestCase.assertAcceptedConnectionErrorc                 C   r   r4   )r3   rG   rV   r&   r&   r'   rG      r]   zTestCase.assertPoolFullc              	   C   s   zM| j dd=\}}|d |  d}z	 |d}|sn||7 }qW n tjy<   | | Y W d    W d S w W d    n1 sGw   Y  W n
 tyW   Y d S w | |	dt
| d S )NT)rl   s   GET / HTTP/1.0

    r   s"   HTTP/1.0 500 Internal Server Error)r   rt   rv   r   r   r6   r7   r   
assertTrue
startswithrepr)r   r9   ro   r:   r%   r&   r&   r'   assertNotAccepted   s2   



zTestCase.assertNotAcceptedc                 C   sX   | j |d}|d | }W d    n1 sw   Y  | |dt| d S )NrD   s   GET /ping HTTP/1.0

s   

PONG)r   rt   r5   r   endswithr   )r   r6   r9   r:   r&   r&   r'   rF      s
   

zTestCase.assertRequestSucceededc                 C   s   | j   |   |   d S r4   )rS   startrF   rV   r&   r&   r'   start_server   s   
zTestCase.start_serverc                 C   s   | j   |   d S r4   )rS   rU   r   rV   r&   r&   r'   stop_server   s   
zTestCase.stop_serverc                 C      d S r4   r&   )r   _msgr&   r&   r'   report_netstat   s   zTestCase.report_netstatc                 O   s6   | d| j}| dtjdf}||g|R i |S )Nserver_kindserver_listen_addrr   )poprN   r@   DEFAULT_BIND_ADDR)r   r?   rK   kindaddrr&   r&   r'   _create_server   s   zTestCase._create_serverc                 O   s&   | j |i || _| j  t  d S r4   )r   rS   r   r2   r   r?   rK   r&   r&   r'   init_server   s   

zTestCase.init_serverc                 C      | j jS r4   rS   r   rV   r&   r&   r'   r        zTestCase.socketc                 C   sv   t jr| d z$| dd  |   |   | t W | j	  dd l
}|  d S | j	  dd l
}|  w )NzSometimes misses the errorc                   S   r   r4   r&   r&   r&   r&   r'   <lambda>      z1TestCase._test_invalid_callback.<locals>.<lambda>r   )r   RUNNING_ON_APPVEYORskipTestr   expect_one_errorr<   assert_error	TypeErrorrS   rU   gccollect)r   r   r&   r&   r'   _test_invalid_callback	  s   


zTestCase._test_invalid_callbackc                 C   s   | j | |S r4   )r3   rL   )r   rK   r&   r&   r'   rL        z!TestCase.fill_default_server_argsc                 O      | j j|i | |S r4   )r3   rM   rL   r   r&   r&   r'   rM        
zTestCase.ServerClassc                 O   r   r4   )r3   rN   rL   r   r&   r&   r'   rN   #  r   zTestCase.ServerSubClassc                 C   r   r4   r&   rV   r&   r&   r'   rJ   '     zTestCase.get_spawn)rq   )T)+r)   r*   r+   r@   LARGE_TIMEOUT__timeout__r3   rS   rW   r\   re   r   _DEFAULT_SOCKET_TIMEOUTr   r=   rr   r~   OSXry   
EPROTOTYPEr
   PYPY3RUNNING_ON_MANYLINUXEPIPEr   r<   rC   r;   rG   r   rF   r   r   r   r   r   propertyr   r   rL   rM   rN   rJ   r&   r&   r&   r'   rR   b   sJ    



rR   c                   @   s   e Zd Zdd Zdd Zdd Zededd	d
 Z	dd Z
eddd Zdd Zdd Zeejdd Zdd Zdd Zeejddd Zedd Zdd Zd d! Zd"S )#TestDefaultSpawnc                 C      t jS r4   r.   rH   rV   r&   r&   r'   rJ   ,     zTestDefaultSpawn.get_spawnc                 C   s|   |  d |   |  d |r3| jjr3| j  |  d |   | j  |  d t  | 	  | 
  |  d d S )Nzbefore startzafter startzafter stop_acceptingzafter start_acceptingz
after stop)r   r   r3   rO   rS   stop_acceptingr   start_acceptingr2   rF   r   )r   rO   r&   r&   r'   _test_server_start_stop/  s   





z(TestDefaultSpawn._test_server_start_stopc                 C   sH   d| _ | t | j|  dd W d    d S 1 sw   Y  d S )NF   rY   )switch_expectedrE   r   rM   r\   rV   r&   r&   r'   'test_backlog_is_not_accepted_for_socket>  s   "z8TestDefaultSpawn.test_backlog_is_not_accepted_for_socketzSometimes times outzSometimes times out.c                 C   s.   | j tjdfdd| _|   | jdd d S )Nr   r   rY   FrO   rN   r@   r   rS   r   r   rV   r&   r&   r'   $test_backlog_is_accepted_for_addressC  s   z5TestDefaultSpawn.test_backlog_is_accepted_for_addressc                 C   s   |  |  | _|   d S r4   )rN   r\   rS   r   rV   r&   r&   r'   test_subclass_just_createJ  s   z*TestDefaultSpawn.test_subclass_just_createc                 C   s(   |  |  | _|   | jdd d S )NTr   )rN   r\   rS   r   r   rV   r&   r&   r'   test_subclass_with_socketN  s   z*TestDefaultSpawn.test_subclass_with_socketc                 C   s*   |  tjdf| _|   | jdd d S )Nr   Tr   r   rV   r&   r&   r'   test_subclass_with_addressV  s   z+TestDefaultSpawn.test_subclass_with_addressc                 C      |    d S r4   r   rV   r&   r&   r'   test_invalid_callback[     z&TestDefaultSpawn.test_invalid_callbackc                 C   sz   t | jj}z't  |   | j  | | jj | 	  W |
  |  | j  d S |
  |  | j  w r4   )r.   rH   rS   serve_foreverr2   rF   rU   r7   startedr   killget)r   gr&   r&   r'   _test_serve_forever^  s   

z$TestDefaultSpawn._test_serve_foreverc                 C   s4   |  tjdf| _| | jj |   |   d S r-   )rN   r@   r   rS   r7   r   r   r   rV   r&   r&   r'   test_serve_foreverl  s   z#TestDefaultSpawn.test_serve_foreverc                 C   sL   |  tjdf| _|   | | jj | j  | | jj | 	  d S r-   )
rN   r@   r   rS   r   r7   r   r   r   r   rV   r&   r&   r'   test_serve_forever_after_startr  s   
z/TestDefaultSpawn.test_serve_forever_after_startzSometimes spuriously failsc                 C   s  |  tjdfdd | _| j  t  |  e}| | tj	
dJ z| }|r7|ds7J t|W n. tjyB   Y n% tjyf } z|jd dkrRn
|jd tjkr[n W Y d }~nd }~ww W d    n1 sqw   Y  W d    n1 sw   Y  |   d S )Nr   c                  W   s   g S r4   r&   )r?   r&   r&   r'   r   |  r   zDTestDefaultSpawn.test_server_closes_client_sockets.<locals>.<lambda>r   z"HTTP/1.0 500 Internal Server ErroriE'  )rM   r@   r   rS   r   r2   r   rr   r.   Timeout_start_new_or_dummyr5   r   r   r   r6   r>   r?   ry   r|   r   )r   r9   r:   rB   r&   r&   r'   !test_server_closes_client_socketsz  s4   


z2TestDefaultSpawn.test_server_closes_client_socketsc                 C   r   r4   r   rV   r&   r&   r'   r     r   zTestDefaultSpawn.socketc                    sR   |    | | jj td  fdd}|| j_|   |   | t  d S )Ntest_error_in_spawnc                     s   t    d S r4   )r.   
getcurrentthrowr0   r>   r&   r'   _spawn  s   z4TestDefaultSpawn.test_error_in_spawn.<locals>._spawn)	r   r   rS   r   ExpectedErrorr   r   r;   r   )r   r   r&   r   r'   r     s   z$TestDefaultSpawn.test_error_in_spawnc                 C   s   |    | jjs
J | 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 )NServerzhandle=<bound methodzof self>.test_server_repr_when_handle_is_instancemethodc                   S   r   r4   r&   r&   r&   r&   r'   r(     r   zOTestDefaultSpawn.test_server_repr_when_handle_is_instancemethod.<locals>.handlezhandle=<function)r   rS   r   rx   r   
set_handler(   r   )r   r(   r&   r&   r'   r     s   z?TestDefaultSpawn.test_server_repr_when_handle_is_instancemethodN)r)   r*   r+   rJ   r   r   r@   skipOnLibuvOnCIOnPyPyskipOnAppVeyorr   r   r   r   r   reraises_flaky_timeoutr   r6   r   r   r   skipIfEXPECT_POOR_TIMER_RESOLUTIONr   r   r   r   r&   r&   r&   r'   r   *  s,    




r   c                   @   r   )TestRawSpawnc                 C   r   r4   )r.   	spawn_rawrV   r&   r&   r'   rJ     r   zTestRawSpawn.get_spawnN)r)   r*   r+   rJ   r&   r&   r&   r'   r     r,   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&   rV   r&   r&   r'   rJ     r   zTestPoolSpawn.get_spawnzIf 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   |    |  B}|  .}| |d | |d t j  ttd  | 	  | 	  | 	  W d    n1 s>w   Y  W d    n1 sMw   Y  tt z| 
  W d S  tjym   t  Y d S w )Nr   r   g      $@)r   r   rr   r.   get_hubloop
update_nowr/   r   rG   rF   r   r6   r@   reraiseFlakyTestTimeout)r   long_requestshort_requestr&   r&   r'   test_pool_full  s&   



zTestPoolSpawn.test_pool_fullFN)	r)   r*   r+   rJ   r@   r   r   r   error_fatalr&   r&   r&   r'   r     s    

r   c                   @   s.   e Zd Zdd Zdd Zeddd ZdS )	TestNoneSpawnc                 C   r   r4   r&   rV   r&   r&   r'   rJ     r   zTestNoneSpawn.get_spawnc                 C   r   r4   r   rV   r&   r&   r'   r     r   z#TestNoneSpawn.test_invalid_callbackz Sometimes doesn't get the error.c                 C   s:   dd }| j || jd d |   |   | td d S )Nc                  W   s   t t d S r4   )r.   r/   r   r0   r&   r&   r'   r/     r   z<TestNoneSpawn.test_assertion_in_blocking_func.<locals>.sleep)r   rH   z?Impossible to call blocking function in the event loop callback)r   rN   r   r<   r   AssertionError)r   r/   r&   r&   r'   test_assertion_in_blocking_func  s
   z-TestNoneSpawn.test_assertion_in_blocking_funcN)r)   r*   r+   rJ   r   r@   r   r   r&   r&   r&   r'   r     s
    r   c                   @      e Zd ZdS )r   Nr)   r*   r+   r&   r&   r&   r'   r         r   c                   @   s2   e Zd ZdZdd Zeeedddd Z	dS )	TestSSLSocketNotAllowedFc                 C   r   r4   r   rV   r&   r&   r'   rJ     r   z!TestSSLSocketNotAllowed.get_spawnsslzUses socket.sslc                 C   s8   ddl m} | tdd}||}| t| j| d S )Nr   )r   rX   rY   )gevent.socketr   r[   r	   rE   r   rN   )r   r   listenerr&   r&   r'   test   s   zTestSSLSocketNotAllowed.testN)
r)   r*   r+   r   rJ   unittest
skipUnlesshasattrr   r   r&   r&   r&   r'   r     s
    r   c                 C   s   t jt j|| S r4   )osr#   abspathjoin)nameherer&   r&   r'   _file  s   r   c                   @   r   )BadWrapExceptionNr   r&   r&   r&   r'   r     r   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)keyfilecertfile)rN   r@   r   r   rV   r&   r&   r'   r     s   z$TestSSLGetCertificate._create_serverc                 C   r   r4   r   rV   r&   r&   r'   rJ     r   zTestSSLGetCertificate.get_spawnc                 C   sX   ddl m}m} | |d | |d |   |  \}}}|||f d S )Nr   )monkeyr   r   r   )r.   r  r   r7   is_module_patchedr   re   get_server_certificate)r   r  r   r^   rd   _familyr&   r&   r'   test_certificate  s   z&TestSSLGetCertificate.test_certificatec                 C   sV   |    dd }|| j_| t | jd d  W d    d S 1 s$w   Y  d S )Nc                 [   s   t  r4   )r   )_client_socket
_wrap_argsr&   r&   r'   bad_wrap-  r   zPTestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failure.<locals>.bad_wrap)r   rS   wrap_socketrE   r   _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   rJ   r  r  r&   r&   r&   r'   r     s
    r   __main__)/
__future__r   r   
contextlibr   r   ry   r   gevent.testingtestingr@   r   r   r   r   gevent.testing.timingr   gevent.testing.socketsr	   r
   r.   r   gevent.serverr   gevent.exceptionsr   r   r2   objectr3   rR   r   r   r   r   r   r   r   r#   dirname__file__r   BaseExceptionr   r   r)   mainr&   r&   r&   r'   <module>   sD    & I '+