
\[\w.                 @   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 m Z d d l m Z d d l m Z m Z y d d l Z Wn e k
 rd Z Yn Xd 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 rd d l! m" Z" n d d l m" Z" d d   Z# d d   Z$ d d d  Z% d d   Z& Gd d   d e  Z' Gd d   d e  Z( Gd d   d  Z) Gd d    d  e) e(  Z* d! d" d# d$  Z+ e, e d%  rGd& d'   d' e j- e  Z. Gd( d)   d) e. e  Z/ Gd* d+   d+ e/  Z0 Gd, d-   d- e) e0  Z1 d. d/   Z2 e j3 d0 d1    Z4 e j3 d! d" d2 d3   Z5 n  e j3 d4 d5 d6 d d! d" d7 d8   Z6 d9 d:   Z7 Gd; d<   d< e j8  Z9 Gd= d>   d> e j:  Z; d? d@   Z< GdA dB   dB e=  Z> dC dD   Z? GdE dF   dF e j@  Z@ e j3 dG dH    ZA dI dJ   ZB d S)KzUtilities shared by tests.    N)mock)
HTTPServer)WSGIRequestHandler
WSGIServer   )base_events)events)futures)	selectors)tasks)	coroutine)loggerZwin32)
socketpairc               C   s$   t  d  k r d  St  j t  j  Sd  S)N)sslZ
SSLContextZPROTOCOL_SSLv23 r   r   (/usr/lib/python3.4/asyncio/test_utils.pydummy_ssl_context)   s    r   c          
   C   sV   t  d d    } |   } |  j |  } d | _ z |  j |  Wd  | j   Xd  S)Nc               S   s   d  S)Nr   r   r   r   r   once1   s    zrun_briefly.<locals>.onceF)r   Zcreate_taskZ_log_destroy_pendingrun_until_completeclose)loopr   gentr   r   r   run_briefly0   s    		r      c             C   sz   t  j    | } xc |   su | d  k	 rV | t  j    } | d k rV t j    qV n  |  j t j d d |   q Wd  S)Nr   gMbP?r   )timer	   TimeoutErrorr   r   Zsleep)r   ZpredtimeoutZdeadliner   r   r   	run_until?   s    r   c             C   s   |  j    |  j   d S)zloop.stop() schedules _raise_stop_error()
    and run_forever() runs until _raise_stop_error() callback.
    this wont work if test waits for some IO events, because
    _raise_stop_error() runs before any of io events callbacks.
    N)stopZrun_forever)r   r   r   r   run_onceI   s    
r    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_stderrU   s    z#SilentWSGIRequestHandler.get_stderrc             G   s   d  S)Nr   )r$   formatargsr   r   r   log_messageX   s    z$SilentWSGIRequestHandler.log_messageN)__name__
__module____qualname__r%   r(   r   r   r   r   r!   S   s   r!   c               @   s   e  Z d  Z d d   Z d S)SilentWSGIServerc             C   s   d  S)Nr   )r$   requestclient_addressr   r   r   handle_error^   s    zSilentWSGIServer.handle_errorN)r)   r*   r+   r/   r   r   r   r   r,   \   s   r,   c               @   s   e  Z d  Z d d   Z d S)SSLWSGIServerMixinc             C   s   t  j j t  j j t  d d  } t  j j |  s` t  j j t  j j t  j  d d  } n  t  j j | d  } t  j j | d  } t j | d | d | d	 d
 } y! |  j | | |   | j	   Wn t
 k
 r Yn Xd  S)Nz..ZtestsZtestZtest_asynciozssl_key.pemzssl_cert.pemkeyfilecertfileZserver_sideT)ospathjoindirname__file__isdirr   Zwrap_socketZRequestHandlerClassr   OSError)r$   r-   r.   herer1   r2   Zssockr   r   r   finish_requestd   s    $	z!SSLWSGIServerMixin.finish_requestN)r)   r*   r+   r;   r   r   r   r   r0   b   s   r0   c               @   s   e  Z d  Z d S)SSLWSGIServerN)r)   r*   r+   r   r   r   r   r<   {   s   r<   use_sslFc          
   c   s   d d   } | r | n | } | |  t   } | j |  | j | _ t j d | j  } | j   z	 | VWd  | j   | j	   | j
   Xd  S)Nc             S   s#   d } d g } | | |  d g S)Nz200 OKContent-type
text/plains   Test message)r>   r?   r   )environZstart_responseZstatusZheadersr   r   r   app   s    	z_run_test_server.<locals>.apptarget)r!   Zset_appZserver_addressaddress	threadingZThreadZserve_foreverstartZshutdownZserver_closer5   )rC   r=   
server_clsserver_ssl_clsrA   Zserver_classZhttpdZserver_threadr   r   r   _run_test_server   s    
	

rH   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.1P   )socketserverUnixStreamServerserver_bindZserver_nameZserver_port)r$   r   r   r   rM      s    	zUnixHTTPServer.server_bindN)r)   r*   r+   rM   r   r   r   r   rI      s   rI   c                   s.   e  Z d  Z d d   Z   f d d   Z   S)UnixWSGIServerc             C   s   t  j |   |  j   d  S)N)rI   rM   Zsetup_environ)r$   r   r   r   rM      s    zUnixWSGIServer.server_bindc                s   t    j   \ } } | d f S)N	127.0.0.1 )rO   rP   )superget_request)r$   r-   Zclient_addr)	__class__r   r   rR      s    zUnixWSGIServer.get_request)r)   r*   r+   rM   rR   r   r   )rS   r   rN      s   rN   c               @   s   e  Z d  Z d d   Z d S)SilentUnixWSGIServerc             C   s   d  S)Nr   )r$   r-   r.   r   r   r   r/      s    z!SilentUnixWSGIServer.handle_errorN)r)   r*   r+   r/   r   r   r   r   rT      s   rT   c               @   s   e  Z d  Z d S)UnixSSLWSGIServerN)r)   r*   r+   r   r   r   r   rU      s   rU   c              C   s    t  j    }  |  j SWd  QXd  S)N)tempfileZNamedTemporaryFilename)filer   r   r   gen_unix_socket_path   s    rY   c              c   s@   t    }  z	 |  VWd  y t j |   Wn t k
 r: Yn XXd  S)N)rY   r3   unlinkr9   )r4   r   r   r   unix_socket_path   s    		r[   c             c   s:   t    + } t d | d |  d t d t  Dd  HWd  QXd  S)NrC   r=   rF   rG   )r[   rH   rT   rU   )r=   r4   r   r   r   run_test_unix_server   s    r\   hostz	127.0.0.1portc          	   c   s.   t  d |  | f d | d t d t  Dd  Hd  S)NrC   r=   rF   rG   )rH   r,   r<   )r]   r^   r=   r   r   r   run_test_server   s    r_   c             C   sq   i  } xK t  |   D]= } | j d  r= | j d  r= q n  t d d   | | <q Wt d |  f |  j |    S)N__return_valueZTestProtocol)dir
startswithendswithMockCallbacktype	__bases__)baseZdctrW   r   r   r   make_test_protocol   s    ri   c               @   sO   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)r$   r   r   r   __init__   s    zTestSelector.__init__Nc             C   s)   t  j | d | |  } | |  j | <| S)Nr   )r
   ZSelectorKeyrk   )r$   fileobjr   datakeyr   r   r   register   s    zTestSelector.registerc             C   s   |  j  j |  S)N)rk   pop)r$   rm   r   r   r   
unregister   s    zTestSelector.unregisterc             C   s   g  S)Nr   )r$   r   r   r   r   select   s    zTestSelector.selectc             C   s   |  j  S)N)rk   )r$   r   r   r   get_map   s    zTestSelector.get_map)r)   r*   r+   rl   rp   rr   rs   rt   r   r   r   r   rj      s
   rj   c                   s   e  Z d  Z d Z d   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   f d d   Z   f d d   Z d d   Z d d    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                s   t    j   | d  k r1 d d   } d |  _ n	 d |  _ |   |  _ t |  j  d |  _ d |  _ g  |  _ t   |  _	 i  |  _
 i  |  _ |  j   d  S)Nc               s   s	   d  Vd  S)Nr   r   r   r   r   r     s    zTestLoop.__init__.<locals>.genFTr   g&.>)rQ   rl   _check_on_close_gennext_timeZ_clock_resolution_timersrj   Z	_selectorreaderswritersreset_counters)r$   r   )rS   r   r   rl     s    						zTestLoop.__init__c             C   s   |  j  S)N)ry   )r$   r   r   r   r   "  s    zTestLoop.timec             C   s   | r |  j  | 7_  n  d S)zMove test time forward.N)ry   )r$   advancer   r   r   advance_time%  s    zTestLoop.advance_timec             C   sE   |  j  rA y |  j j d  Wn t k
 r1 YqA Xt d   n  d  S)Nr   zTime generator is not finished)rv   rw   sendStopIterationAssertionError)r$   r   r   r   r   *  s    	zTestLoop.closec             G   s    t  j | | |   |  j | <d  S)N)r   Handler{   )r$   fdcallbackr'   r   r   r   
add_reader3  s    zTestLoop.add_readerc             C   s6   |  j  | d 7<| |  j k r. |  j | =d Sd Sd  S)Nr   TF)remove_reader_countr{   )r$   r   r   r   r   remove_reader6  s
    
zTestLoop.remove_readerc             G   s   | |  j  k s$ t d j |    |  j  | } | j | k s[ t d j | j |    | j | k s t d j | j |    d  S)Nzfd {} is not registeredz{!r} != {!r})r{   r   r&   	_callback_args)r$   r   r   r'   handler   r   r   assert_reader>  s    $zTestLoop.assert_readerc             G   s    t  j | | |   |  j | <d  S)N)r   r   r|   )r$   r   r   r'   r   r   r   
add_writerF  s    zTestLoop.add_writerc             C   s6   |  j  | d 7<| |  j k r. |  j | =d Sd Sd  S)Nr   TF)remove_writer_countr|   )r$   r   r   r   r   remove_writerI  s
    
zTestLoop.remove_writerc             G   s   | |  j  k s$ t d j |    |  j  | } | j | k s[ t d j | j |    | j | k s t d j | j |    d  S)Nzfd {} is not registeredz{!r} != {!r})r|   r   r&   r   r   )r$   r   r   r'   r   r   r   r   assert_writerQ  s    $zTestLoop.assert_writerc             C   s(   t  j t  |  _ t  j t  |  _ d  S)N)collectionsdefaultdictintr   r   )r$   r   r   r   r}   Y  s    zTestLoop.reset_countersc                sM   t    j   x0 |  j D]% } |  j j |  } |  j |  q Wg  |  _ d  S)N)rQ   	_run_oncerz   rw   r   r   )r$   whenr~   )rS   r   r   r   ]  s
    zTestLoop._run_oncec                s&   |  j  j |  t   j | | |  S)N)rz   appendrQ   call_at)r$   r   r   r'   )rS   r   r   r   d  s    zTestLoop.call_atc             C   s   d  S)Nr   )r$   Z
event_listr   r   r   _process_eventsh  s    zTestLoop._process_eventsc             C   s   d  S)Nr   )r$   r   r   r   _write_to_selfk  s    zTestLoop._write_to_self)r)   r*   r+   __doc__rl   r   r   r   r   r   r   r   r   r   r}   r   r   r   r   r   r   )rS   r   ru      s    	ru   c              K   s   t  j d d g |   S)Nspec__call__)r   Mock)kwargsr   r   r   re   o  s    re   c               @   s"   e  Z d  Z d Z d d   Z d S)MockPatternzA 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)r$   otherr   r   r   __eq__|  s    zMockPattern.__eq__N)r)   r*   r+   r   r   r   r   r   r   r   s  s   r   c             C   s5   t  j |   } | d  k r1 t d |  f   n  | 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               @   s=   e  Z d  Z d d d d  Z d d d  Z d d	   Z d S)
TestCasecleanupTc            C   s<   | d  k	 s t   t j d   | r8 |  j | j  n  d  S)N)r   r   set_event_loopZ
addCleanupr   )r$   r   r   r   r   r   r     s    zTestCase.set_event_loopNc             C   s   t  |  } |  j |  | S)N)ru   r   )r$   r   r   r   r   r   new_test_loop  s    zTestCase.new_test_loopc             C   s   t  j d   d  S)N)r   r   )r$   r   r   r   tearDown  s    zTestCase.tearDown)r)   r*   r+   r   r   r   r   r   r   r   r     s   r   c              c   s;   t  j }  z t  j t j d  d VWd t  j |   Xd 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   r   socketZ
gettimeoutra   )Zsockr   r   r   mock_nonblocking_socket  s    r   )Cr   r   
contextlibr"   r   r3   r   r   rK   sysrV   rD   r   Zunittestr   Zhttp.serverr   Zwsgiref.simple_serverr   r   r   ImportErrorrP   r   r   r	   r
   r   Z
coroutinesr   logr   platformZwindows_utilsr   r   r   r   r    r!   r,   r0   r<   rH   hasattrrL   rI   rN   rT   rU   rY   contextmanagerr[   r\   r_   ri   ZBaseSelectorrj   ZBaseEventLoopru   re   r   r   r   r   r   r   r   r   r   r   <module>   sv   

			
u