o
    Qœ_>!  ã                   @   sb  d dl Z d dl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mZmZ d dlmZmZ z.d d	lmZmZmZ d d
lmZ d dlmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$ dZ%W n e&y}   dZ%Y nw d dl'Ze (e%d¡Z)dd„ Z*dd„ Z+e)G dd„ dej,ƒƒZ-e)G dd„ deƒƒZ.e/dkr¯e 0¡  dS dS )é    N)Úutf8)Úgen)ÚAsyncHTTPClient)Ú
HTTPServer)ÚIOLoop)Úbind_unused_portÚAsyncTestCaseÚgen_test)ÚRequestHandlerÚApplication)ÚDeferredÚinlineCallbacksÚreturnValue)ÚProtocol)ÚAsyncioSelectorReactor)ÚAgentÚreadBody)ÚResource)ÚSiteTFztwisted module not presentc                  C   sV   i } t jt jg}tt dƒr| t j¡ |D ]	}t  |¡| |< qdt| ƒv r)tdƒ‚| S )NÚSIGCHLDÚtwistedz)twisted signal handlers already installed)	ÚsignalÚSIGINTÚSIGTERMÚhasattrÚappendr   Ú	getsignalÚreprÚ	Exception)ÚsavedÚsignalsÚsig© r"   ú;/usr/lib/python3/dist-packages/tornado/test/twisted_test.pyÚsave_signal_handlers4   s   
r$   c                 C   s"   |   ¡ D ]
\}}t ||¡ qd S ©N)Úitemsr   )r   r!   Úhandlerr"   r"   r#   Úrestore_signal_handlersA   s   ÿr(   c                   @   sd   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
dd„ Zdd„ Zdd„ ZdS )ÚCompatibilityTestsc                 C   sH   t ƒ | _t ¡ | _ttdƒrt t ¡ ¡ tƒ | _	| j	 
¡  tƒ | _d S )NÚWindowsSelectorEventLoopPolicy)r$   Úsaved_signalsÚasyncioÚget_event_loop_policyÚsaved_policyr   Úset_event_loop_policyr*   r   Úio_loopÚmake_currentr   Úreactor©Úselfr"   r"   r#   ÚsetUpL   s   


zCompatibilityTests.setUpc                 C   s<   | j  ¡  | j ¡  | jjdd� t | j¡ t| j	ƒ d S )NT)Úall_fds)
r2   ÚdisconnectAllr0   Úclear_currentÚcloser,   r/   r.   r(   r+   r3   r"   r"   r#   ÚtearDownY   s
   

zCompatibilityTests.tearDownc                 C   s<   G dd„ dt ƒ}t|ƒ ƒ}| jjd|dd�}| ¡ j| _d S )Nc                   @   s   e Zd ZdZdd„ ZdS )z>CompatibilityTests.start_twisted_server.<locals>.HelloResourceTc                 S   s   dS )Nó   Hello from twisted!r"   )r4   Úrequestr"   r"   r#   Ú
render_GETd   s   zICompatibilityTests.start_twisted_server.<locals>.HelloResource.render_GETN)Ú__name__Ú
__module__Ú__qualname__ÚisLeafr=   r"   r"   r"   r#   ÚHelloResourcea   s    rB   r   z	127.0.0.1)Ú	interface)r   r   r2   Ú	listenTCPÚgetHostÚportÚtwisted_port)r4   rB   ÚsiterF   r"   r"   r#   Ústart_twisted_server`   s   
z'CompatibilityTests.start_twisted_serverc                 C   sJ   G dd„ dt ƒ}td|fgdd„ d�}t|ƒ}tƒ \}| _| |g¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z=CompatibilityTests.start_tornado_server.<locals>.HelloHandlerc                 S   s   |   d¡ d S )NzHello from tornado!)Úwriter3   r"   r"   r#   Úgetm   ó   zACompatibilityTests.start_tornado_server.<locals>.HelloHandler.getN)r>   r?   r@   rK   r"   r"   r"   r#   ÚHelloHandlerl   s    rM   ú/c                 S   s   d S r%   r"   )Úxr"   r"   r#   Ú<lambda>p   s    z9CompatibilityTests.start_tornado_server.<locals>.<lambda>)Úlog_function)r
   r   r   r   Útornado_portÚadd_sockets)r4   rM   ÚappÚserverÚsockr"   r"   r#   Ústart_tornado_serverk   s
   z'CompatibilityTests.start_tornado_serverc                 C   s"   | j j| _| j j| _| j  ¡  d S r%   )r2   ÚstopÚ	stop_loopÚrunr3   r"   r"   r#   Úrun_reactoru   s   

zCompatibilityTests.run_reactorc                    s6   t ƒ }t | |¡¡}| ‡ fdd„¡ |ƒ  | ¡ S )Nc                    s   ˆ   ¡ S r%   )rY   )Úfr3   r"   r#   rP   „   s    z2CompatibilityTests.tornado_fetch.<locals>.<lambda>)r   r,   Úensure_futureÚfetchÚadd_done_callbackÚresult)r4   ÚurlÚrunnerÚclientÚfutr"   r3   r#   Útornado_fetch�   s
   z CompatibilityTests.tornado_fetchc                    sx   g ‰t ˆjƒ}| dt|ƒ¡}G ‡fdd„dtƒ‰ ‡ fdd„}| |¡ ‡fdd„}| |¡ |ƒ  ˆ ˆ¡ d ˆ¡S )	Nó   GETc                       s(   e Zd Zdd„ Z‡ fdd„Zdd„ ZdS )z5CompatibilityTests.twisted_fetch.<locals>.Accumulatorc                 S   s
   || _ d S r%   )Úfinished)r4   rg   r"   r"   r#   Ú__init__�   s   
z>CompatibilityTests.twisted_fetch.<locals>.Accumulator.__init__c                    s   ˆ   |¡ d S r%   )r   )r4   Údata©Úchunksr"   r#   ÚdataReceived’   rL   zBCompatibilityTests.twisted_fetch.<locals>.Accumulator.dataReceivedc                 S   s   | j  d ¡ d S r%   )rg   Úcallback)r4   Úreasonr"   r"   r#   ÚconnectionLost•   s   zDCompatibilityTests.twisted_fetch.<locals>.Accumulator.connectionLostN)r>   r?   r@   rh   rl   ro   r"   rj   r"   r#   ÚAccumulatorŽ   s    rp   c                    s   t ƒ }|  ˆ |ƒ¡ |S r%   )r   ÚdeliverBody)Úresponserg   )rp   r"   r#   rm   ˜   s   z2CompatibilityTests.twisted_fetch.<locals>.callbackc                    sL   t ˆ dƒrˆ  ¡  d S | d ur$z|  ¡  W d S    tjddd� Y d S d S )NrY   zexception before starting loopT)Úexc_info)r   rY   ÚraiseExceptionÚloggingÚerror)Úfailurer3   r"   r#   ÚshutdownŸ   s   
ùz2CompatibilityTests.twisted_fetch.<locals>.shutdownó    )	r   r2   r<   r   r   ÚaddCallbackÚaddBothÚ
assertTrueÚjoin)r4   ra   rb   rc   Údrm   rx   r"   )rp   rk   r4   r#   Útwisted_fetchˆ   s   





z CompatibilityTests.twisted_fetchc                    s6   d g‰ t j‡ ‡‡fdd„ƒ}ˆj |¡ |ƒ  ˆ d S )Nc                  3   sn   � t ˆjƒ} |  dtˆƒ¡V }t ¡ � tjdtd� t|ƒV ˆ d< W d   ƒ n1 s,w   Y  ˆ 	¡  d S )Nrf   Úignore)Úcategoryr   )
r   r2   r<   r   ÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningr   rY   )rc   rr   ©Úbodyr4   ra   r"   r#   r\   ³   s   €

üz5CompatibilityTests.twisted_coroutine_fetch.<locals>.fr   )r   Ú	coroutiner0   Úadd_callback)r4   ra   rb   r\   r"   r†   r#   Útwisted_coroutine_fetch°   s   z*CompatibilityTests.twisted_coroutine_fetchc                 C   s.   |   ¡  |  d| j | j¡}|  |jd¡ d S )Núhttp://127.0.0.1:%dr;   )rI   re   rG   r[   ÚassertEqualr‡   ©r4   rr   r"   r"   r#   Ú%testTwistedServerTornadoClientReactorÅ   s
   ÿz8CompatibilityTests.testTwistedServerTornadoClientReactorc                 C   ó,   |   ¡  |  d| j | j¡}|  |d¡ d S ©Nr‹   s   Hello from tornado!)rW   r   rR   r[   rŒ   r�   r"   r"   r#   Ú%testTornadoServerTwistedClientReactorÌ   ó
   ÿz8CompatibilityTests.testTornadoServerTwistedClientReactorc                 C   r�   r�   )rW   rŠ   rR   r[   rŒ   r�   r"   r"   r#   Ú.testTornadoServerTwistedCoroutineClientReactorÓ   r’   zACompatibilityTests.testTornadoServerTwistedCoroutineClientReactorN)r>   r?   r@   r5   r:   rI   rW   r[   re   r   rŠ   rŽ   r‘   r“   r"   r"   r"   r#   r)   J   s    
(r)   c                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )ÚConvertDeferredTestc                 c   s&   � t dd„ ƒ}|ƒ V }|  |d¡ d S )Nc                   s   s   � 	 t dƒ d S )NFé*   )r   r"   r"   r"   r#   Úfnß   s   €z,ConvertDeferredTest.test_success.<locals>.fnr•   )r   rŒ   )r4   r–   Úresr"   r"   r#   Útest_successÝ   s
   €
z ConvertDeferredTest.test_successc                 c   sF   � t dd„ ƒ}|  t¡� |ƒ V  W d   ƒ d S 1 sw   Y  d S )Nc                   s   s   � 	 dd  d S )NFé   r   r"   r"   r"   r"   r#   r–   ì   s   €z,ConvertDeferredTest.test_failure.<locals>.fn)r   ÚassertRaisesÚZeroDivisionError)r4   r–   r"   r"   r#   Útest_failureê   s   €

"ÿz ConvertDeferredTest.test_failureN)r>   r?   r@   r	   r˜   rœ   r"   r"   r"   r#   r”   Û   s
    
r”   Ú__main__)1r,   ru   r   Úunittestr‚   Útornado.escaper   Útornador   Útornado.httpclientr   Útornado.httpserverr   Útornado.ioloopr   Útornado.testingr   r   r	   Útornado.webr
   r   Útwisted.internet.deferr   r   r   Útwisted.internet.protocolr   Útwisted.internet.asyncioreactorr   Útwisted.web.clientr   r   Útwisted.web.resourcer   Útwisted.web.serverr   Úhave_twistedÚImportErrorÚtornado.platform.twistedÚ
skipUnlessÚskipIfNoTwistedr$   r(   ÚTestCaser)   r”   r>   Úmainr"   r"   r"   r#   Ú<module>   sF   ÿ	 ÿ