
W2                 @   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 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  Z0 Gd+ d,   d, e0  Z1 Gd- d.   d. e* e1  Z2 d/ d0   Z3 e j4 d1 d2    Z5 e j4 d" d# d3 d4   Z6 e j4 d5 d6 d7 d d" d# d8 d9   Z7 d: d;   Z8 Gd< d=   d= e j9  Z: Gd> d?   d? e j;  Z< d@ dA   Z= GdB dC   dC e>  Z? dD dE   Z@ GdF dG   dG e jA  ZA e j4 dH dI    ZB e jC e jD e jE dJ dK  ZF dL dM   ZG d S)NzUtilities shared by tests.    N)mock)
HTTPServer)WSGIRequestHandler
WSGIServer   )base_events)compat)events)futures)	selectors)tasks)	coroutine)loggerwin32)
socketpairc               C   s$   t  d  k r d  St  j t  j  Sd  S)N)sslZ
SSLContextZPROTOCOL_SSLv23 r   r   ?/afs/.cs/s/python-3.5.2/amd64_ubu14/lib/python3.5/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   once2   s    zrun_briefly.<locals>.onceF)r   Zcreate_taskZ_log_destroy_pendingrun_until_completeclose)loopr   gentr   r   r   run_briefly1   s    		r      c             C   st   t  j    | } x] |   so | d  k	 rP | t  j    } | d k rP t j    |  j t j d d |   q Wd  S)Nr   gMbP?r   )timer
   TimeoutErrorr   r   sleep)r   Zpredtimeoutdeadliner   r   r   	run_until@   s    r"   c             C   s   |  j  |  j  |  j   d S)zLegacy 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_onceJ   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_stderrW   s    z#SilentWSGIRequestHandler.get_stderrc             G   s   d  S)Nr   )r(   formatargsr   r   r   log_messageZ   s    z$SilentWSGIRequestHandler.log_messageN)__name__
__module____qualname__r)   r,   r   r   r   r   r%   U   s   r%   c                   s4   e  Z d  Z d Z   f d d   Z d d   Z   S)SilentWSGIServer   c                s/   t    j   \ } } | j |  j  | | f S)N)superget_request
settimeoutrequest_timeout)r(   requestclient_addr)	__class__r   r   r3   b   s    zSilentWSGIServer.get_requestc             C   s   d  S)Nr   )r(   r6   client_addressr   r   r   handle_errorg   s    zSilentWSGIServer.handle_error)r-   r.   r/   r5   r3   r:   r   r   )r8   r   r0   ^   s   r0   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  } 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tests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(   r6   r9   herer=   r>   Zssockr   r   r   finish_requestm   s    $	z!SSLWSGIServerMixin.finish_requestN)r-   r.   r/   rG   r   r   r   r   r;   k   s   r;   c               @   s   e  Z d  Z d S)SSLWSGIServerN)r-   r.   r/   r   r   r   r   rH      s   rH   use_sslFc          
   #   s   d d   } | r | n | } | |  t       j |    j   _ t j d   f d d    } | 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)rJ   rK   r   )environZstart_responsestatusZheadersr   r   r   app   s    	z_run_test_server.<locals>.apptargetc                  s     j  d d  S)NZpoll_intervalg?)Zserve_foreverr   )httpdr   r   <lambda>   s    z"_run_test_server.<locals>.<lambda>)
r%   Zset_appZserver_addressaddress	threadingThreadstartshutdownZserver_closerA   )rR   rI   
server_clsserver_ssl_clsrN   Zserver_classZserver_threadr   )rP   r   _run_test_server   s    	
	

rY   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   r_      s    	zUnixHTTPServer.server_bindN)r-   r.   r/   r_   r   r   r   r   r[      s   r[   c                   s4   e  Z d  Z d Z d d   Z   f d d   Z   S)UnixWSGIServerr1   c             C   s   t  j |   |  j   d  S)N)r[   r_   Zsetup_environ)r(   r   r   r   r_      s    zUnixWSGIServer.server_bindc                s/   t    j   \ } } | j |  j  | d f S)N	127.0.0.1 )ra   rb   )r2   r3   r4   r5   )r(   r6   r7   )r8   r   r   r3      s    zUnixWSGIServer.get_request)r-   r.   r/   r5   r_   r3   r   r   )r8   r   r`      s   r`   c               @   s   e  Z d  Z d d   Z d S)SilentUnixWSGIServerc             C   s   d  S)Nr   )r(   r6   r9   r   r   r   r:      s    z!SilentUnixWSGIServer.handle_errorN)r-   r.   r/   r:   r   r   r   r   rc      s   rc   c               @   s   e  Z d  Z d S)UnixSSLWSGIServerN)r-   r.   r/   r   r   r   r   rd      s   rd   c           	   C   s!   t  j    }  |  j SWd  QRXd  S)N)tempfileNamedTemporaryFilename)filer   r   r   gen_unix_socket_path   s    ri   c              c   s@   t    }  z	 |  VWd  y t j |   Wn t k
 r: Yn XXd  S)N)ri   r?   unlinkrE   )r@   r   r   r   unix_socket_path   s    		rk   c             c   s;   t    + } t d | d |  d t d t  Ed  HWd  QRXd  S)NrR   rI   rW   rX   )rk   rY   rc   rd   )rI   r@   r   r   r   run_test_unix_server   s    rl   hostz	127.0.0.1portc          	   c   s.   t  d |  | f d | d t d t  Ed  Hd  S)NrR   rI   rW   rX   )rY   r0   rH   )rm   rn   rI   r   r   r   run_test_server   s    ro   c             C   sn   i  } xH t  |   D]: } | j d  r: | j d  r: q t d d   | | <q Wt d |  f |  j |    S)N__return_valueZTestProtocol)dir
startswithendswithMockCallbacktype	__bases__)basedctrg   r   r   r   make_test_protocol   s    rz   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   SelectorKeyr|   )r(   fileobjr	   datakeyr   r   r   register   s    zTestSelector.registerc             C   s   |  j  j |  S)N)r|   pop)r(   r   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)r|   )r(   r   r   r   get_map  s    zTestSelector.get_map)r-   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   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&.>)r2   r}   _check_on_close_gennext_timeZ_clock_resolution_timersr{   	_selectorreaderswritersreset_counters)r(   r   )r8   r   r   r}     s    						zTestLoop.__init__c             C   s   |  j  S)N)r   )r(   r   r   r   r   /  s    zTestLoop.timec             C   s   | r |  j  | 7_  d S)zMove test time forward.N)r   )r(   advancer   r   r   advance_time2  s    zTestLoop.advance_timec                sO   t    j   |  j rK y |  j j d  Wn t k
 r> Yn Xt d   d  S)Nr   zTime generator is not finished)r2   r   r   r   sendStopIterationAssertionError)r(   )r8   r   r   r   7  s    	zTestLoop.closec             G   s    t  j | | |   |  j | <d  S)N)r	   Handler   )r(   fdcallbackr+   r   r   r   
add_readerA  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_readerD  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_readerL  s    $zTestLoop.assert_readerc             G   s    t  j | | |   |  j | <d  S)N)r	   r   r   )r(   r   r   r+   r   r   r   
add_writerT  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_writerW  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_writer_  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   g  s    zTestLoop.reset_countersc                sM   t    j   x0 |  j D]% } |  j j |  } |  j |  q Wg  |  _ d  S)N)r2   	_run_oncer   r   r   r   )r(   whenr   )r8   r   r   r   k  s
    zTestLoop._run_oncec                s&   |  j  j |  t   j | | |  S)N)r   appendr2   call_at)r(   r   r   r+   )r8   r   r   r   r  s    zTestLoop.call_atc             C   s   d  S)Nr   )r(   Z
event_listr   r   r   _process_eventsv  s    zTestLoop._process_eventsc             C   s   d  S)Nr   )r(   r   r   r   _write_to_selfy  s    zTestLoop._write_to_self)r-   r.   r/   __doc__r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r8   r   r     s    
r   c              K   s   t  j d d g |   S)Nspec__call__)r   ZMock)kwargsr   r   r   ru   }  s    ru   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   r   c             C   s2   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               @   sR   e  Z d  Z d d d d  Z d d d  Z d d	   Z e j sN d
 d   Z d S)TestCasecleanupTc            C   s9   | d  k	 s t   t j d   | r5 |  j | j  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)r   r   )r(   r   r   r   r   r   new_test_loop  s    zTestCase.new_test_loopc             C   s'   t  j d   |  j t j   d  d  S)N)NNN)r	   r   ZassertEqualsysexc_info)r(   r   r   r   tearDown  s    zTestCase.tearDownc             O   s   Gd 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   )r(   r   r   r   	__enter__  s    z+TestCase.subTest.<locals>.EmptyCM.__enter__c             W   s   d  S)Nr   )r(   excr   r   r   __exit__  s    z*TestCase.subTest.<locals>.EmptyCM.__exit__N)r-   r.   r/   r   r   r   r   r   r   EmptyCM  s   r   r   )r(   r+   r   r   r   r   r   subTest  s    zTestCase.subTest)	r-   r.   r/   r   r   r   r   ZPY34r   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   levelsetLevellogging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protorv   family
gettimeoutrq   )r   rv   r   sockr   r   r   mock_nonblocking_socket  s    			r   c               C   s   t  j d d d S)Nz'asyncio.sslproto._is_sslproto_availablerq   F)r   Zpatchr   r   r   r   force_legacy_ssl_support  s    r   )Hr   r   
contextlibr&   r   r?   r   r   r]   r   re   rS   r   Zunittestr   Zhttp.serverr   Zwsgiref.simple_serverr   r   r   ImportErrorrb   r   r   r	   r
   r   r   Z
coroutinesr   logr   platformZwindows_utilsr   r   r   r"   r$   r%   r0   r;   rH   rY   hasattrr^   r[   r`   rc   rd   ri   contextmanagerrk   rl   ro   rz   BaseSelectorr{   ZBaseEventLoopr   ru   r   r   r   r   r   IPPROTO_TCPSOCK_STREAMAF_INETr   r   r   r   r   r   <module>   s|   
			
v
