B
    v9a@                 @   s  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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 Z!e!dZ"e!dZ#e!dZ$e!dZ%ddddddddddd
Z&dd Z'dd d!d"Z(d#d$ Z)d%d& Z*d_d(d)Z+d*d+ Z,G d,d- d-eZ-G d.d/ d/eZ.G d0d1 d1Z/G d2d3 d3e/e.Z0d4d5d6d7Z1e2ed8r`G d9d: d:ej3eZ4G d;d< d<e4eZ5G d=d> d>e5Z6G d?d@ d@e/e6Z7dAdB Z8ej9dCdD Z:ej9d4d5dEdFZ;ej9dGd d4dHdIdJZ<dKdL Z=G dMdN dNej>Z?G dOdP dPej@ZAdQdR ZBG dSdT dTeCZDG dUdV dVZEdWdX ZFG dYdZ dZejGZGej9d[d\ ZHejIejJejKfd]d^ZLdS )`    N)mock)
HTTPServer)WSGIRequestHandler
WSGIServer)base_events)events)format_helpers)futures)tasks)logger)supportc             C   s^   t tdr*tjtj| }tj|r*|S tjtjtd| }tj|rR|S t	| d S )NTEST_HOME_DIRz..)
hasattrr   ospathjoinr   isfiledirname__file__FileNotFoundError)filenamefullname r   /usr/lib/python3.7/utils.py	data_file&   s    
r   zssl_cert.pemzssl_key.pemzkeycert3.pemzpycacert.pem)z)http://testca.pythontest.net/testca/ocsp/)z0http://testca.pythontest.net/testca/pycacert.cer)z2http://testca.pythontest.net/testca/revocation.crl)))countryNameXY))organizationNamezPython Software Foundation CA))
commonNamezour-ca-serverzJul  7 14:23:16 2028 GMTzAug 29 14:23:16 2018 GMTZCB2D80995A69525C)))r   r   ))ZlocalityNamezCastle Anthrax))r   zPython Software Foundation))r   	localhost))ZDNSr      )
ZOCSPZ	caIssuersZcrlDistributionPointsZissuerZnotAfterZ	notBeforeZserialNumberZsubjectZsubjectAltNameversionc              C   s*   t t j} | tt d| _t j| _| S )NF)	ssl
SSLContextZPROTOCOL_TLS_SERVERload_cert_chainONLYCERTONLYKEYcheck_hostname	CERT_NONEverify_mode)Zserver_contextr   r   r   simple_server_sslcontextH   s
    r*   T)disable_verifyc             C   s"   t t j}d|_| rt j|_|S )NF)r"   r#   ZPROTOCOL_TLS_CLIENTr'   r(   r)   )r+   Zclient_contextr   r   r   simple_client_sslcontextP   s
    r,   c               C   s   t d krd S t t jS d S )N)r"   r#   ZPROTOCOL_TLSr   r   r   r   dummy_ssl_contextX   s    r-   c             C   s<   dd }| }|  |}d|_z| | W d |  X d S )Nc                  s   d S )Nr   r   r   r   r   once`   s    zrun_briefly.<locals>.onceF)Zcreate_taskZ_log_destroy_pendingrun_until_completeclose)loopr.   gentr   r   r   run_briefly_   s    
r4      c             C   sT   t  | }xB| sN|d k	r8|t   }|dkr8t | tjd| d qW d S )Nr   gMbP?)r1   )timeZ	monotonicr	   TimeoutErrorr/   r
   Zsleep)r1   ZpredtimeoutZdeadliner   r   r   	run_untilm   s    r9   c             C   s   |  | j |   d S )N)Z	call_soonstopZrun_forever)r1   r   r   r   run_oncew   s    r;   c               @   s   e Zd Zdd Zdd ZdS )SilentWSGIRequestHandlerc             C   s   t  S )N)ioStringIO)selfr   r   r   
get_stderr   s    z#SilentWSGIRequestHandler.get_stderrc             G   s   d S )Nr   )r?   formatargsr   r   r   log_message   s    z$SilentWSGIRequestHandler.log_messageN)__name__
__module____qualname__r@   rC   r   r   r   r   r<      s   r<   c                   s(   e Zd ZdZ fddZdd Z  ZS )SilentWSGIServer   c                s"   t   \}}|| j ||fS )N)superget_request
settimeoutrequest_timeout)r?   requestclient_addr)	__class__r   r   rJ      s    zSilentWSGIServer.get_requestc             C   s   d S )Nr   )r?   rM   client_addressr   r   r   handle_error   s    zSilentWSGIServer.handle_error)rD   rE   rF   rL   rJ   rQ   __classcell__r   r   )rO   r   rG      s   rG   c               @   s   e Zd Zdd ZdS )SSLWSGIServerMixinc             C   sV   t  }|tt |j|dd}y| |||  |  W n tk
rP   Y nX d S )NT)Zserver_side)	r"   r#   r$   r%   r&   Zwrap_socketZRequestHandlerClassr0   OSError)r?   rM   rP   contextZssockr   r   r   finish_request   s    z!SSLWSGIServerMixin.finish_requestN)rD   rE   rF   rV   r   r   r   r   rS      s   rS   c               @   s   e Zd ZdS )SSLWSGIServerN)rD   rE   rF   r   r   r   r   rW      s   rW   F)use_sslc             #   sv   dd }|r|n|}|| t   |  j _tj fddd}|  z
 V  W d       |	  X d S )Nc             S   s   d}dg}||| dgS )Nz200 OK)zContent-typez
text/plains   Test messager   )environZstart_response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>       z"_run_test_server.<locals>.<lambda>)target)
r<   Zset_appZserver_addressaddress	threadingZThreadstartshutdownZserver_closer   )r`   rX   
server_clsserver_ssl_clsr[   Zserver_classZserver_threadr   )r\   r   _run_test_server   s    


rf   ZAF_UNIXc               @   s   e Zd Zdd ZdS )UnixHTTPServerc             C   s   t j|  d| _d| _d S )Nz	127.0.0.1P   )socketserverUnixStreamServerserver_bindZserver_nameZserver_port)r?   r   r   r   rk      s    zUnixHTTPServer.server_bindN)rD   rE   rF   rk   r   r   r   r   rg      s   rg   c                   s(   e Zd ZdZdd Z fddZ  ZS )UnixWSGIServerrH   c             C   s   t |  |   d S )N)rg   rk   Zsetup_environ)r?   r   r   r   rk      s    
zUnixWSGIServer.server_bindc                s"   t   \}}|| j |dfS )N)z	127.0.0.1 )rI   rJ   rK   rL   )r?   rM   rN   )rO   r   r   rJ      s    zUnixWSGIServer.get_request)rD   rE   rF   rL   rk   rJ   rR   r   r   )rO   r   rl      s   rl   c               @   s   e Zd Zdd ZdS )SilentUnixWSGIServerc             C   s   d S )Nr   )r?   rM   rP   r   r   r   rQ      s    z!SilentUnixWSGIServer.handle_errorN)rD   rE   rF   rQ   r   r   r   r   rn      s   rn   c               @   s   e Zd ZdS )UnixSSLWSGIServerN)rD   rE   rF   r   r   r   r   ro      s   ro   c           	   C   s   t  } | jS Q R X d S )N)tempfileZNamedTemporaryFilename)filer   r   r   gen_unix_socket_path   s    
rs   c              c   s<   t  } z
| V  W d yt|  W n tk
r4   Y nX X d S )N)rs   r   unlinkrT   )r   r   r   r   unix_socket_path   s    
ru   c          	   c   s,   t  }t|| ttdE d H  W d Q R X d S )N)r`   rX   rd   re   )ru   rf   rn   ro   )rX   r   r   r   r   run_test_unix_server  s    rv   z	127.0.0.1)hostportrX   c             c   s   t | |f|ttdE d H  d S )N)r`   rX   rd   re   )rf   rG   rW   )rw   rx   rX   r   r   r   run_test_server	  s    
ry   c             C   sP   i }x4t | D ](}|dr(|dr(qtd d||< qW td| f| j | S )N__)return_valueZTestProtocol)dir
startswithendswithMockCallbacktype	__bases__)baseZdctrq   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)r?   r   r   r   __init__  s    zTestSelector.__init__Nc             C   s   t |d||}|| j|< |S )Nr   )	selectorsZSelectorKeyr   )r?   fileobjr   datakeyr   r   r   register  s    
zTestSelector.registerc             C   s   | j |S )N)r   pop)r?   r   r   r   r   
unregister$  s    zTestSelector.unregisterc             C   s   g S )Nr   )r?   r8   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)N)rD   rE   rF   r   r   r   r   r   r   r   r   r   r     s
   
r   c                   s   e 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dd& fd'd(
Zd)d* Zd+d, Z  ZS ).TestLoopNc                sv   t    |d kr"dd }d| _nd| _| | _t| j d| _d| _g | _t | _	i | _
i | _|   t | _d S )Nc               s   s
   d V  d S )Nr   r   r   r   r   r2   E  s    zTestLoop.__init__.<locals>.genFTr   g&.>)rI   r   _check_on_close_gennext_timeZ_clock_resolution_timersr   Z	_selectorreaderswritersreset_countersweakrefZWeakValueDictionary_transports)r?   r2   )rO   r   r   r   A  s    

zTestLoop.__init__c             C   s   | j S )N)r   )r?   r   r   r   r6   X  s    zTestLoop.timec             C   s   |r|  j |7  _ d S )N)r   )r?   advancer   r   r   advance_time[  s    zTestLoop.advance_timec                sB   t    | jr>y| jd W n tk
r4   Y n
X tdd S )Nr   zTime generator is not finished)rI   r0   r   r   sendStopIterationAssertionError)r?   )rO   r   r   r0   `  s    
zTestLoop.closec             G   s   t ||| d | j|< d S )N)r   Handler   )r?   fdcallbackrB   r   r   r   _add_readerj  s    zTestLoop._add_readerc             C   s0   | j |  d7  < || jkr(| j|= dS dS d S )N   TF)remove_reader_countr   )r?   r   r   r   r   _remove_readerm  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)r?   r   r   rB   handler   r   r   assert_readeru  s    



zTestLoop.assert_readerc             C   s   || j krtd| dd S )Nzfd z is registered)r   r   )r?   r   r   r   r   assert_no_reader  s    
zTestLoop.assert_no_readerc             G   s   t ||| d | j|< d S )N)r   r   r   )r?   r   r   rB   r   r   r   _add_writer  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   )r?   r   r   r   r   _remove_writer  s
    
zTestLoop._remove_writerc             G   s   | j | }d S )N)r   )r?   r   r   rB   r   r   r   r   assert_writer  s    
zTestLoop.assert_writerc          
   C   s~   t |tsFyt| }W n* tttfk
rD   td|d Y nX y| j| }W n tk
rh   Y nX t	d||d S )NzInvalid file object: {!r}z.File descriptor {!r} is used by transport {!r})

isinstanceintfilenoAttributeError	TypeError
ValueErrorrA   r   KeyErrorRuntimeError)r?   r   Z	transportr   r   r   _ensure_fd_no_transport  s    
z TestLoop._ensure_fd_no_transportc             G   s   |  | | j||f| S )N)r   r   )r?   r   r   rB   r   r   r   
add_reader  s    
zTestLoop.add_readerc             C   s   |  | | |S )N)r   r   )r?   r   r   r   r   remove_reader  s    
zTestLoop.remove_readerc             G   s   |  | | j||f| S )N)r   r   )r?   r   r   rB   r   r   r   
add_writer  s    
zTestLoop.add_writerc             C   s   |  | | |S )N)r   r   )r?   r   r   r   r   remove_writer  s    
zTestLoop.remove_writerc             C   s   t t| _t t| _d S )N)collectionsdefaultdictr   r   r   )r?   r   r   r   r     s    zTestLoop.reset_countersc                s:   t    x$| jD ]}| j|}| | qW g | _d S )N)rI   	_run_oncer   r   r   r   )r?   whenr   )rO   r   r   r     s
    
zTestLoop._run_once)rU   c               s&   | j | t j||f|d|iS )NrU   )r   appendrI   call_at)r?   r   r   rU   rB   )rO   r   r   r     s    zTestLoop.call_atc             C   s   d S )Nr   )r?   Z
event_listr   r   r   _process_events  s    zTestLoop._process_eventsc             C   s   d S )Nr   )r?   r   r   r   _write_to_self  s    zTestLoop._write_to_self)N)rD   rE   rF   r   r6   r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rR   r   r   )rO   r   r   .  s*   
r   c              K   s   t jf ddgi| S )Nspec__call__)r   ZMock)kwargsr   r   r   r     s    r   c               @   s   e Zd Zdd ZdS )MockPatternc             C   s   t tt| |tjS )N)boolresearchstrS)r?   otherr   r   r   __eq__  s    zMockPattern.__eq__N)rD   rE   rF   r   r   r   r   r   r     s   	r   c               @   s   e Zd Zdd Zdd ZdS )MockInstanceOfc             C   s
   || _ d S )N)_type)r?   r   r   r   r   r     s    zMockInstanceOf.__init__c             C   s   t || jS )N)r   r   )r?   r   r   r   r   r     s    zMockInstanceOf.__eq__N)rD   rE   rF   r   r   r   r   r   r   r     s   r   c             C   s$   t | }|d kr td| f |S )Nzunable to get the source of %r)r   Z_get_function_sourcer   )funcsourcer   r   r   get_function_source  s    
r   c               @   sH   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	dS )TestCasec             C   s&   | j }|d k	r|jdd |   d S )NT)wait)Z_default_executorrc   r0   )r1   executorr   r   r   
close_loop  s    zTestCase.close_loopT)cleanupc            C   s    t d  |r| | j| d S )N)r   set_event_loopZ
addCleanupr   )r?   r1   r   r   r   r   r     s    
zTestCase.set_event_loopNc             C   s   t |}| | |S )N)r   r   )r?   r2   r1   r   r   r   new_test_loop  s    
zTestCase.new_test_loopc             C   s   | j t_ d S )N)_get_running_loopr   )r?   r   r   r   unpatch_get_running_loop  s    z!TestCase.unpatch_get_running_loopc             C   s    t j| _dd t _t | _d S )Nc               S   s   d S )Nr   r   r   r   r   r]     r^   z TestCase.setUp.<locals>.<lambda>)r   r   r   Zthreading_setup_thread_cleanup)r?   r   r   r   setUp	  s    
zTestCase.setUpc             C   sB   |    td  | t d |   tj| j	  t
  d S )N)NNN)r   r   r   ZassertEqualsysexc_infoZ
doCleanupsr   Zthreading_cleanupr   Zreap_children)r?   r   r   r   tearDown  s    
zTestCase.tearDown)N)
rD   rE   rF   staticmethodr   r   r   r   r   r   r   r   r   r   r     s   
r   c           	   c   s2   t j} zt tjd  d V  W d t |  X d S )Nr   )r   levelZsetLevelloggingZCRITICAL)Z	old_levelr   r   r   disable_logger  s
    
r   c             C   s*   t tj}| |_||_||_d|j_|S )Ng        )r   Z	MagicMocksocketprotor   familyZ
gettimeoutr{   )r   r   r   Zsockr   r   r   mock_nonblocking_socket*  s    r   )r5   )Mr   
contextlibr=   r   r   r   r   r   ri   r   rp   ra   r6   Zunittestr   r   Zhttp.serverr   Zwsgiref.simple_serverr   r   r"   ImportErrorZasyncior   r   r   r	   r
   Zasyncio.logr   Ztestr   r   r%   r&   ZSIGNED_CERTFILEZ
SIGNING_CAZPEERCERTr*   r,   r-   r4   r9   r;   r<   rG   rS   rW   rf   r   rj   rg   rl   rn   ro   rs   contextmanagerru   rv   ry   r   ZBaseSelectorr   ZBaseEventLoopr   r   r   r   r   r   r   r   ZIPPROTO_TCPZSOCK_STREAMZAF_INETr   r   r   r   r   <module>   s   


	
 %*