
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \ó:  ã               @   s   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	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mZ yddlZW n ek
rÀ   dZY nX 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"m#Z# e	j$dk�rHddl%m&Z& nddlm&Z& dd„ Z'e'dƒZ(e'dƒZ)dd„ Z*dd„ Z+dRdd„Z,dd„ Z-G dd „ d eƒZ.G d!d"„ d"eƒZ/G d#d$„ d$ƒZ0G d%d&„ d&e0e/ƒZ1d'd(œd)d*„Z2e3ed+ƒ�rZG d,d-„ d-ej4eƒZ5G d.d/„ d/e5eƒZ6G d0d1„ d1e6ƒZ7G d2d3„ d3e0e7ƒZ8d4d5„ Z9ej:d6d7„ ƒZ;ej:d'd(œd8d9„ƒZ<ej:d:dd'd;œd<d=„ƒZ=d>d?„ Z>G d@dA„ dAej?ƒZ@G dBdC„ dCejAƒZBdDdE„ ZCG dFdG„ dGeDƒZEdHdI„ ZFG dJdK„ dKejGƒZGej:dLdM„ ƒZHejIejJejKfdNdO„ZLdPdQ„ ZMdS )SzUtilities shared by tests.é    N)Úmock)Ú
HTTPServer)ÚWSGIRequestHandlerÚ
WSGIServeré   )Úbase_events)Úcompat)Úevents)Úfutures)Ú	selectors)Útasks)Ú	coroutine)Úlogger)ÚsupportZwin32)Ú
socketpairc             C   s`   t tdƒr*tjjtj| ƒ}tjj|ƒr*|S tjjtjjtjƒd| ƒ}tjj|ƒrT|S t	| ƒ‚d S )NÚTEST_HOME_DIRÚtest)
Úhasattrr   ÚosÚpathÚjoinr   ÚisfileÚdirnameÚ__file__ÚFileNotFoundError)ÚfilenameÚfullname© r   ú*/usr/lib64/python3.6/asyncio/test_utils.pyÚ	data_file-   s    
r   zssl_cert.pemzssl_key.pemc               C   s   t d krd S t jt jƒS d S )N)ÚsslÚ
SSLContextZPROTOCOL_SSLv23r   r   r   r   Údummy_ssl_context<   s    r"   c          
   C   s@   t dd„ ƒ}|ƒ }| j|ƒ}d|_z| j|ƒ W d |jƒ  X d S )Nc               S   s   d S )Nr   r   r   r   r   ÚonceD   s    zrun_briefly.<locals>.onceF)r   Zcreate_taskZ_log_destroy_pendingÚrun_until_completeÚclose)Úloopr#   ÚgenÚtr   r   r   Úrun_brieflyC   s    
r)   é   c             C   sT   t j ƒ | }xB|ƒ sN|d k	r8|t j ƒ  }|dkr8tjƒ ‚| jtjd| d�ƒ qW d S )Nr   gü©ñÒMbP?)r&   )Útimer
   ÚTimeoutErrorr$   r   Zsleep)r&   ZpredÚtimeoutZdeadliner   r   r   Ú	run_untilR   s    r.   c             C   s   | j | jƒ | jƒ  dS )zÊLegacy API to run once through the event loop.

    This is the recommended pattern for test code.  It will poll the
    selector once and run all callbacks scheduled in response to I/O
    events.
    N)Z	call_soonÚstopZrun_forever)r&   r   r   r   Úrun_once\   s    r0   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚSilentWSGIRequestHandlerc             C   s   t jƒ S )N)ÚioÚStringIO)Úselfr   r   r   Ú
get_stderri   s    z#SilentWSGIRequestHandler.get_stderrc             G   s   d S )Nr   )r4   ÚformatÚargsr   r   r   Úlog_messagel   s    z$SilentWSGIRequestHandler.log_messageN)Ú__name__Ú
__module__Ú__qualname__r5   r8   r   r   r   r   r1   g   s   r1   c                   s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚSilentWSGIServeré   c                s"   t ƒ jƒ \}}|j| jƒ ||fS )N)ÚsuperÚget_requestÚ
settimeoutÚrequest_timeout)r4   ÚrequestÚclient_addr)Ú	__class__r   r   r?   t   s    zSilentWSGIServer.get_requestc             C   s   d S )Nr   )r4   rB   Úclient_addressr   r   r   Úhandle_errory   s    zSilentWSGIServer.handle_error)r9   r:   r;   rA   r?   rF   Ú__classcell__r   r   )rD   r   r<   p   s   r<   c               @   s   e Zd Zdd„ ZdS )ÚSSLWSGIServerMixinc             C   s^   t }t}tjƒ }|j||ƒ |j|dd�}y| j||| ƒ |jƒ  W n tk
rX   Y nX d S )NT)Zserver_side)	ÚONLYKEYÚONLYCERTr    r!   Zload_cert_chainZwrap_socketZRequestHandlerClassr%   ÚOSError)r4   rB   rE   ZkeyfileZcertfileÚcontextZssockr   r   r   Úfinish_request   s    z!SSLWSGIServerMixin.finish_requestN)r9   r:   r;   rM   r   r   r   r   rH   }   s   rH   c               @   s   e Zd ZdS )ÚSSLWSGIServerN)r9   r:   r;   r   r   r   r   rN   ’   s   rN   F)Úuse_sslc          
   #   sv   dd„ }|r|n|}|| t ƒ‰ ˆ j|ƒ ˆ jˆ _tj‡ fdd„d�}|jƒ  z
ˆ V  W d ˆ jƒ  ˆ jƒ  |j	ƒ  X d S )Nc             S   s   d}dg}|||ƒ dgS )Nz200 OKúContent-typeú
text/plains   Test message)rP   rQ   r   )ÚenvironZstart_responseZstatusZheadersr   r   r   Úapp˜   s    
z_run_test_server.<locals>.appc                  s   ˆ j dd�S )Ngš™™™™™©?)Zpoll_interval)Zserve_foreverr   )Úhttpdr   r   Ú<lambda>¥   s    z"_run_test_server.<locals>.<lambda>)Útarget)
r1   Zset_appZserver_addressÚaddressÚ	threadingZThreadÚstartÚshutdownZserver_closer   )rW   rO   Ú
server_clsÚserver_ssl_clsrS   Zserver_classZserver_threadr   )rT   r   Ú_run_test_server–   s    


r]   ZAF_UNIXc               @   s   e Zd Zdd„ ZdS )ÚUnixHTTPServerc             C   s   t jj| ƒ d| _d| _d S )Nz	127.0.0.1éP   )ÚsocketserverÚUnixStreamServerÚserver_bindZserver_nameZserver_port)r4   r   r   r   rb   ³   s    zUnixHTTPServer.server_bindN)r9   r:   r;   rb   r   r   r   r   r^   ±   s   r^   c                   s(   e Zd ZdZdd„ Z‡ fdd„Z‡  ZS )ÚUnixWSGIServerr=   c             C   s   t j| ƒ | jƒ  d S )N)r^   rb   Zsetup_environ)r4   r   r   r   rb   ½   s    
zUnixWSGIServer.server_bindc                s"   t ƒ jƒ \}}|j| jƒ |dfS )Nú	127.0.0.1Ú )rd   re   )r>   r?   r@   rA   )r4   rB   rC   )rD   r   r   r?   Á   s    zUnixWSGIServer.get_request)r9   r:   r;   rA   rb   r?   rG   r   r   )rD   r   rc   ¹   s   rc   c               @   s   e Zd Zdd„ ZdS )ÚSilentUnixWSGIServerc             C   s   d S )Nr   )r4   rB   rE   r   r   r   rF   Ï   s    z!SilentUnixWSGIServer.handle_errorN)r9   r:   r;   rF   r   r   r   r   rf   Í   s   rf   c               @   s   e Zd ZdS )ÚUnixSSLWSGIServerN)r9   r:   r;   r   r   r   r   rg   Ó   s   rg   c           	   C   s   t jƒ �} | jS Q R X d S )N)ÚtempfileZNamedTemporaryFileÚname)Úfiler   r   r   Úgen_unix_socket_path×   s    
rk   c              c   s<   t ƒ } z
| V  W d ytj| ƒ W n tk
r4   Y nX X d S )N)rk   r   ÚunlinkrK   )r   r   r   r   Úunix_socket_pathÜ   s    
rm   c             c   s,   t ƒ �}t|| ttd�E d H  W d Q R X d S )N)rW   rO   r[   r\   )rm   r]   rf   rg   )rO   r   r   r   r   Úrun_test_unix_serverè   s    rn   z	127.0.0.1)ÚhostÚportrO   c             c   s   t | |f|ttd�E d H  d S )N)rW   rO   r[   r\   )r]   r<   rN   )ro   rp   rO   r   r   r   Úrun_test_serverð   s    
rq   c             C   sP   i }x4t | ƒD ](}|jdƒr(|jdƒr(qtd d�||< qW td| f| j |ƒƒ S )NÚ__)Úreturn_valueZTestProtocol)ÚdirÚ
startswithÚendswithÚMockCallbackÚtypeÚ	__bases__)ÚbaseZdctri   r   r   r   Úmake_test_protocol÷   s    r{   c               @   s6   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestSelectorc             C   s
   i | _ d S )N)Úkeys)r4   r   r   r   Ú__init__  s    zTestSelector.__init__Nc             C   s   t j|d||ƒ}|| j|< |S )Nr   )r   ZSelectorKeyr}   )r4   Úfileobjr	   ÚdataÚkeyr   r   r   Úregister  s    
zTestSelector.registerc             C   s   | j j|ƒS )N)r}   Úpop)r4   r   r   r   r   Ú
unregister  s    zTestSelector.unregisterc             C   s   g S )Nr   )r4   r-   r   r   r   Úselect  s    zTestSelector.selectc             C   s   | j S )N)r}   )r4   r   r   r   Úget_map  s    zTestSelector.get_map)N)r9   r:   r;   r~   r‚   r„   r…   r†   r   r   r   r   r|     s
   
r|   c                   sÎ   e Zd ZdZd-‡ fdd„	Zdd„ Zd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„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Z‡ fd%d&„Z‡ fd'd(„Zd)d*„ Zd+d,„ Z‡  ZS ).ÚTestLoopañ  Loop for unittests.

    It manages self time directly.
    If something scheduled to be executed later then
    on next loop iteration after all ready handlers done
    generator passed to __init__ is calling.

    Generator should be like this:

        def gen():
            ...
            when = yield ...
            ... = yield time_advance

    Value returned by yield is absolute time of next scheduled handler.
    Value passed to yield is time advance to move loop's time forward.
    Nc                sv   t ƒ jƒ  |d kr"dd„ }d| _nd| _|ƒ | _t| jƒ d| _d| _g | _tƒ | _	i | _
i | _| jƒ  tjƒ | _d S )Nc               s   s
   d V  d S )Nr   r   r   r   r   r'   ,  s    zTestLoop.__init__.<locals>.genFTr   g•Ö&è.>)r>   r~   Ú_check_on_closeÚ_genÚnextÚ_timeZ_clock_resolutionÚ_timersr|   Z	_selectorÚreadersÚwritersÚreset_countersÚweakrefÚWeakValueDictionaryÚ_transports)r4   r'   )rD   r   r   r~   (  s    

zTestLoop.__init__c             C   s   | j S )N)r‹   )r4   r   r   r   r+   ?  s    zTestLoop.timec             C   s   |r|  j |7  _ dS )zMove test time forward.N)r‹   )r4   Úadvancer   r   r   Úadvance_timeB  s    zTestLoop.advance_timec                sB   t ƒ jƒ  | jr>y| jjdƒ W n tk
r4   Y n
X tdƒ‚d S )Nr   zTime generator is not finished)r>   r%   rˆ   r‰   ÚsendÚStopIterationÚAssertionError)r4   )rD   r   r   r%   G  s    
zTestLoop.closec             G   s   t j||| ƒ| j|< d S )N)r	   ÚHandler�   )r4   ÚfdÚcallbackr7   r   r   r   Ú_add_readerQ  s    zTestLoop._add_readerc             C   s0   | j |  d7  < || jkr(| j|= dS dS d S )Nr   TF)Úremove_reader_countr�   )r4   r™   r   r   r   Ú_remove_readerT  s
    
zTestLoop._remove_readerc             G   sh   || j krtd|› d�ƒ‚| j | }|j|krDtd|j› d|› �ƒ‚|j|krdtd|j› d|› �ƒ‚d S )Nzfd z is not registeredzunexpected callback: z != zunexpected callback args: )r�   r—   Z	_callbackZ_args)r4   r™   rš   r7   Úhandler   r   r   Úassert_reader\  s    



zTestLoop.assert_readerc             C   s   || j krtd|› d�ƒ‚d S )Nzfd z is registered)r�   r—   )r4   r™   r   r   r   Úassert_no_readerg  s    
zTestLoop.assert_no_readerc             G   s   t j||| ƒ| j|< d S )N)r	   r˜   rŽ   )r4   r™   rš   r7   r   r   r   Ú_add_writerk  s    zTestLoop._add_writerc             C   s0   | j |  d7  < || jkr(| j|= dS dS d S )Nr   TF)Úremove_writer_countrŽ   )r4   r™   r   r   r   Ú_remove_writern  s
    
zTestLoop._remove_writerc             G   s   | j | }d S )N)rŽ   )r4   r™   rš   r7   rž   r   r   r   Úassert_writerv  s    
zTestLoop.assert_writerc             C   s8   y| j | }W n tk
r"   Y nX tdj||ƒƒ‚d S )Nz.File descriptor {!r} is used by transport {!r})r’   ÚKeyErrorÚRuntimeErrorr6   )r4   r™   Z	transportr   r   r   Ú_ensure_fd_no_transport~  s    z TestLoop._ensure_fd_no_transportc             G   s   | j |ƒ | j||f|žŽ S )zAdd a reader callback.)r§   r›   )r4   r™   rš   r7   r   r   r   Ú
add_readerˆ  s    
zTestLoop.add_readerc             C   s   | j |ƒ | j|ƒS )zRemove a reader callback.)r§   r�   )r4   r™   r   r   r   Úremove_reader�  s    
zTestLoop.remove_readerc             G   s   | j |ƒ | j||f|žŽ S )zAdd a writer callback..)r§   r¡   )r4   r™   rš   r7   r   r   r   Ú
add_writer’  s    
zTestLoop.add_writerc             C   s   | j |ƒ | j|ƒS )zRemove a writer callback.)r§   r£   )r4   r™   r   r   r   Úremove_writer—  s    
zTestLoop.remove_writerc             C   s   t jtƒ| _t jtƒ| _d S )N)ÚcollectionsÚdefaultdictÚintrœ   r¢   )r4   r   r   r   r�   œ  s    zTestLoop.reset_countersc                s:   t ƒ jƒ  x$| jD ]}| jj|ƒ}| j|ƒ qW g | _d S )N)r>   Ú	_run_oncerŒ   r‰   r•   r”   )r4   Úwhenr“   )rD   r   r   r¯      s
    
zTestLoop._run_oncec                s    | j j|ƒ tƒ j||f|žŽ S )N)rŒ   Úappendr>   Úcall_at)r4   r°   rš   r7   )rD   r   r   r²   §  s    zTestLoop.call_atc             C   s   d S )Nr   )r4   Z
event_listr   r   r   Ú_process_events«  s    zTestLoop._process_eventsc             C   s   d S )Nr   )r4   r   r   r   Ú_write_to_self®  s    zTestLoop._write_to_self)N)r9   r:   r;   Ú__doc__r~   r+   r”   r%   r›   r�   rŸ   r    r¡   r£   r¤   r§   r¨   r©   rª   r«   r�   r¯   r²   r³   r´   rG   r   r   )rD   r   r‡     s,   

r‡   c              K   s   t jf ddgi| —ŽS )NÚspecÚ__call__)r   ZMock)Úkwargsr   r   r   rw   ²  s    rw   c               @   s   e Zd ZdZdd„ ZdS )ÚMockPatternzõA regex based str with a fuzzy __eq__.

    Use this helper with 'mock.assert_called_with', or anywhere
    where a regex comparison between strings is needed.

    For instance:
       mock_call.assert_called_with(MockPattern('spam.*ham'))
    c             C   s   t tjt| ƒ|tjƒƒS )N)ÚboolÚreÚsearchÚstrÚS)r4   Úotherr   r   r   Ú__eq__¿  s    zMockPattern.__eq__N)r9   r:   r;   rµ   rÀ   r   r   r   r   r¹   ¶  s   r¹   c             C   s$   t j| ƒ}|d kr td| f ƒ‚|S )Nzunable to get the source of %r)r	   Z_get_function_sourceÚ
ValueError)ÚfuncÚsourcer   r   r   Úget_function_sourceÃ  s    
rÄ   c               @   sV   e Zd Zedd„ ƒZddœdd„Zddd	„Zd
d„ Zdd„ Zdd„ Z	e
jsRdd„ ZdS )ÚTestCasec             C   s&   | j }|d k	r|jdd� | jƒ  d S )NT)Úwait)Z_default_executorrZ   r%   )r&   Zexecutorr   r   r   Ú
close_loopË  s    zTestCase.close_loopT)Úcleanupc            C   s    t jd ƒ |r| j| j|ƒ d S )N)r	   Úset_event_loopZ
addCleanuprÇ   )r4   r&   rÈ   r   r   r   rÉ   Ò  s    
zTestCase.set_event_loopNc             C   s   t |ƒ}| j|ƒ |S )N)r‡   rÉ   )r4   r'   r&   r   r   r   Únew_test_loopÙ  s    
zTestCase.new_test_loopc             C   s   | j t_ d S )N)Ú_get_running_loopr	   )r4   r   r   r   Úunpatch_get_running_loopÞ  s    z!TestCase.unpatch_get_running_loopc             C   s    t j| _dd„ t _tjƒ | _d S )Nc               S   s   d S )Nr   r   r   r   r   rU   ã  s    z TestCase.setUp.<locals>.<lambda>)r	   rË   r   Zthreading_setupÚ_thread_cleanup)r4   r   r   r   ÚsetUpá  s    
zTestCase.setUpc             C   sB   | j ƒ  tjd ƒ | jtjƒ dƒ | jƒ  tj| j	Ž  tj
ƒ  d S )N)NNN)rÌ   r	   rÉ   ZassertEqualÚsysÚexc_infoZ
doCleanupsr   Zthreading_cleanuprÍ   Zreap_children)r4   r   r   r   ÚtearDownæ  s    
zTestCase.tearDownc             O   s   G dd„ dƒ}|ƒ S )Nc               @   s   e Zd Zdd„ Zdd„ ZdS )z!TestCase.subTest.<locals>.EmptyCMc             S   s   d S )Nr   )r4   r   r   r   Ú	__enter__÷  s    z+TestCase.subTest.<locals>.EmptyCM.__enter__c             W   s   d S )Nr   )r4   Úexcr   r   r   Ú__exit__ù  s    z*TestCase.subTest.<locals>.EmptyCM.__exit__N)r9   r:   r;   rÒ   rÔ   r   r   r   r   ÚEmptyCMö  s   rÕ   r   )r4   r7   r¸   rÕ   r   r   r   ÚsubTestõ  s    zTestCase.subTest)N)r9   r:   r;   ÚstaticmethodrÇ   rÉ   rÊ   rÌ   rÎ   rÑ   r   ZPY34rÖ   r   r   r   r   rÅ   Ê  s   
rÅ   c              c   s2   t j} zt jtjd ƒ dV  W dt j| ƒ X dS )zrContext manager to disable asyncio logger.

    For example, it can be used to ignore warnings in debug mode.
    r   N)r   ÚlevelZsetLevelÚloggingZCRITICAL)Z	old_levelr   r   r   Údisable_loggerþ  s
    
rÚ   c             C   s*   t jtjƒ}| |_||_||_d|j_|S )z'Create a mock of a non-blocking socket.g        )r   Z	MagicMockÚsocketÚprotorx   ÚfamilyZ
gettimeoutrs   )rÜ   rx   rÝ   Zsockr   r   r   Úmock_nonblocking_socket  s    rÞ   c               C   s   t jddd�S )Nz'asyncio.sslproto._is_sslproto_availableF)rs   )r   Zpatchr   r   r   r   Úforce_legacy_ssl_support  s    rß   )r*   )Nrµ   r¬   Ú
contextlibr2   rÙ   r   r»   rÛ   r`   rÏ   rh   rX   r+   Zunittestr�   r   Zhttp.serverr   Zwsgiref.simple_serverr   r   r    ÚImportErrorre   r   r   r	   r
   r   r   Z
coroutinesr   Úlogr   r   r   ÚplatformZwindows_utilsr   r   rJ   rI   r"   r)   r.   r0   r1   r<   rH   rN   r]   r   ra   r^   rc   rf   rg   rk   Úcontextmanagerrm   rn   rq   r{   ZBaseSelectorr|   ZBaseEventLoopr‡   rw   r½   r¹   rÄ   rÅ   rÚ   ZIPPROTO_TCPZSOCK_STREAMZAF_INETrÞ   rß   r   r   r   r   Ú<module>   sˆ   


	
 4
