B
    3\h                 @   s,  d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl	Z	ddl
mZmZ ddlZddlmZ ejjZyddlmZ W n  ek
r   ddlmZ Y nX ddlZdd	lm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Z%dZ&G dd de'Z(G dd deZ)edddZ*dS )zBase class for notebook tests.    )print_function)hexlify)contextmanagerN)ThreadEvent)TestCase)patch)IOLoop)Config   )NotebookApp)url_path_join)TemporaryDirectory   g?c               @   s   e Zd ZdS )TimeoutErrorN)__name__
__module____qualname__ r   r   <lib/python3.7/site-packages/notebook/tests/launchnotebook.pyr   $   s   r   c               @   sp   e Zd ZdZdZdZdZedd Zedd Z	ed	d
 Z
edd Zedd Zedd Zedd ZdS )NotebookTestBasezA base class for tests that need a running notebook.

    This create some empty config and runtime directories
    and then starts the notebook server with them.
    i50  Nz/a%40b/c             C   s   |   d }xjtttt D ]V}yt| W n> tk
rn } z | j	 sTt
dtt W dd}~X Y qX dS qW tddS )zWait for the server to be alivezapi/contentsz#The notebook server failed to startNz.The notebook server didn't start up correctly.)base_urlrangeintMAX_WAITTIMEPOLL_INTERVALrequestsget	Exceptionnotebook_threadis_aliveRuntimeErrortimeZsleepr   )clsZurl_er   r   r   wait_until_alive4   s    
z!NotebookTestBase.wait_until_alivec             C   s$   | j jtd | j  r tddS )z7Wait for the server process to terminate after shutdown)ZtimeoutzUndead notebook serverN)r   joinr   r    r   )r#   r   r   r   wait_until_deadD   s    
z NotebookTestBase.wait_until_deadc             C   s   i }| j rd| j  |d< |S )Nztoken %sZAuthorization)token)r#   headersr   r   r   auth_headersK   s    zNotebookTestBase.auth_headersc             K   s8   | di }||   tj|t|  |f|}|S )zYSend a request to my server
        
        with authentication and everything.
        r*   )
setdefaultupdater+   r   requestr   r   )r#   Zverbpathkwargsr*   responser   r   r   r.   R   s    zNotebookTestBase.requestc                sF  t   _ fdd}|d _|d } _|d } _|d } _|d _td jt	j
tjt jd	d
|||d _ j  tjtj|ddg|dddg|ddg|dddgd _ j   jpt dj_tt	dd _t  fdd}t|d _d j_  j  !   "  d S )Nc           
      sZ   t jj jjf|  }yt | W n0 tk
rT } z|jtjkrD W d d }~X Y nX |S )N)	osr/   r'   tmp_dirnamemakedirsOSErrorerrnoZEEXIST)partsr/   r%   )r#   r   r   tmpb   s    z)NotebookTestBase.setup_class.<locals>.tmphomedataconfigZruntimeZ	notebooksz
os.environz.ipython1)HOMEZ
PYTHONPATHZ
IPYTHONDIRZJUPYTER_NO_CONFIGZJUPYTER_CONFIG_DIRZJUPYTER_DATA_DIRZJUPYTER_RUNTIME_DIRZshareZjupyterenvetc)ZSYSTEM_JUPYTER_PATHZENV_JUPYTER_PATHZSYSTEM_CONFIG_PATHZENV_CONFIG_PATHz:memory:   asciic                 s   dt jkr dd l} | |   t jdd j j j	 j
 jd jd } _dd |_d|j_g |j_|jg d d|j_g |j_t }|j z|  W d   |j  X d S )	Nasyncior   FT)portZport_retriesZopen_browser
config_dirdata_dirruntime_dirnotebook_dirr   r<   Z
allow_rootr)   c               S   s   d S )Nr   r   r   r   r   <lambda>       zDNotebookTestBase.setup_class.<locals>.start_thread.<locals>.<lambda>)argv)sysmodulesrC   Zset_event_loopZnew_event_loopr   rD   rE   rF   rG   rH   
url_prefixr)   notebookZinit_signallogZ	propagateZhandlersZ
initializer	   ZcurrentZadd_callbacksetstartZsession_managerclose)rC   ZappZloop)r#   r<   startedr   r   start_thread   s6    

z2NotebookTestBase.setup_class.<locals>.start_thread)targetT)#r   r3   Zhome_dirrF   rE   rG   rH   r   dictr2   pathsepr'   rL   r/   pjoin	env_patchrR   Zmultiplejupyter_corepaths
path_patchr<   r
   ZNotebookNotaryZdb_filer   urandomdecoder)   r   r   r   daemonwaitr&   )r#   r9   rF   rE   rG   rU   r   )r#   r<   rT   r   setup_class_   sB    	






"
zNotebookTestBase.setup_classc             C   sn   | j   |   | j  | j  | j  dd }t|d}d|_|	  |
d | rjtdd S )Nc               S   s   t j   d S )N)zmqZContextinstanceZtermr   r   r   r   cleanup_zmq   s    z4NotebookTestBase.teardown_class.<locals>.cleanup_zmq)rV   T   zFFailed to teardown zmq Context, open sockets likely left lying around.)rO   stopr(   rZ   r]   r3   Zcleanupr   r`   rR   r'   r    r!   )r#   re   tr   r   r   teardown_class   s    





zNotebookTestBase.teardown_classc             C   s   d| j | jf S )Nzhttp://localhost:%i%s)rD   rN   )r#   r   r   r   r      s    zNotebookTestBase.base_url)r   r   r   __doc__rD   r<   rN   classmethodr&   r(   r+   r.   rb   ri   r   r   r   r   r   r   '   s   Rr   c          
   c   sx   y
d V  W n\ t jk
rf } z<|jj}|| ks>td| |f |rV|t|ksVt|W d d }~X Y nX dsttdd S )NzExpected status %d, got %dFzExpected HTTP error status)r   Z	HTTPErrorr1   Zstatus_codeAssertionErrorstr)Zstatusmsgr%   Zreal_statusr   r   r   assert_http_error   s    

&ro   )N)+rj   Z
__future__r   Zbinasciir   
contextlibr   r7   r2   rL   Z	threadingr   r   r"   Zunittestr   r/   r'   rY   Zunittest.mockr   ImportErrorZmockr   Ztornado.ioloopr	   rc   Zjupyter_core.pathsr[   Ztraitlets.configr
   Znotebookappr   Zutilsr   Zipython_genutils.tempdirr   r   r   r   r   r   ro   r   r   r   r   <module>   s:    "