
    A=d!                     N   d 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ddlmZ 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mZ d
dlmZ ddl m!Z! dZ"dZ# G d de$          Z% G d de          Z& G d de&          Z'edd            Z(dS )zBase class for notebook tests.    )hexlify)contextmanagerN)ThreadEvent)TestCase)patch)IOLoop)Config   )NotebookAppurlencode_unix_socket)url_path_join)TemporaryDirectory   g?c                       e Zd ZdS )TimeoutErrorN)__name__
__module____qualname__     >lib/python3.11/site-packages/nbclassic/tests/launchnotebook.pyr   r      s        Dr   r   c                      e Zd ZdZdZdZdZed             Zed             Z	ed             Z
ed             Zed	             Zed
             Zed             Zed             Zed             Zed             Ze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                    |                                  dz   }t          t          t          t          z                      D ]}	 |                     |            dS # t          $ r}|d}~wt          $ rL}| j        	                                st          d          |t          j        t                     Y d}~{d}~ww xY wt          d          )zWait for the server to be alivezapi/contentsNz#The notebook server failed to startz.The notebook server didn't start up correctly.)base_urlrangeintMAX_WAITTIMEPOLL_INTERVAL	fetch_urlModuleNotFoundError	Exceptionnotebook_threadis_aliveRuntimeErrortimesleepr   )clsurl_errores        r   wait_until_alivez!NotebookTestBase.wait_until_alive/   s     llnn~-s<56677 	 	A
c"""  '    * * **3355 U&'LMMSTT
=))))))))* KLLLs%   A
C&A((C5AB<<Cc                     | j                             t                     | j                                         rt	          d          dS )z7Wait for the server process to terminate after shutdown)timeoutzUndead notebook serverN)r$   joinr   r%   r   r)   s    r   wait_until_deadz NotebookTestBase.wait_until_deadB   sN     	   666'')) 	97888	9 	9r   c                 2    i }| j         rd| j          |d<   |S )Nztoken Authorization)token)r)   headerss     r   auth_headerszNotebookTestBase.auth_headersI   s*    9 	<';	';';GO$r   c                 *    t          j        |           S N)requestsget)r*   s    r   r!   zNotebookTestBase.fetch_urlP   s    |C   r   c                     |                     di           }|                    |                                            t          j        |t          |                                 |          fi |}|S )zQSend a request to my server

        with authentication and everything.
        r7   )
setdefaultupdater8   r;   requestr   r   )r)   verbpathkwargsr7   responses         r   r@   zNotebookTestBase.requestT   st     ##Ir22s''))***#D#,,..$//   r   c                     | j         t          j                            t          j                  t          | j         d          d| j        | j        | j	        dS )Nz.ipython1)HOME
PYTHONPATH
IPYTHONDIRJUPYTER_NO_CONFIGJUPYTER_CONFIG_DIRJUPYTER_DATA_DIRJUPYTER_RUNTIME_DIR)
home_dirospathsepr1   sysrB   pjoin
config_dirdata_dirruntime_dirr2   s    r   get_patch_envzNotebookTestBase.get_patch_enva   sL     L*//#(33j99!$#&>!$#&?
 
 	
r   c                     g S r:   r   r2   s    r   get_argvzNotebookTestBase.get_argvm   s    	r   c                 ,    t          | j                  S )N)port)dictrZ   r2   s    r   get_bind_argszNotebookTestBase.get_bind_argsq       """"r   c                     t                       _         fd} |d           _         |d          x} _         |d          x} _         |d          x} _         |d           _        t          j        d 	                                           _
         j
                                         t          j        t          j         |dd	          g |d
d	          g           _         j                                          j        pt#                      dj        _        t)          t+          j        d                                        d           _        t3                       fd}t5          |           _        d j        _         j                                                                                                            d S )Nc                      t          j        j        j        j        g| R  }	 t          j        |           n-# t          $ r }|j        t          j        k    r Y d }~nd }~ww xY w|S r:   )	rO   rB   r1   tmp_dirnamemakedirsOSErrorerrnoEEXIST)partsrB   r-   r)   s      r   tmpz)NotebookTestBase.setup_class.<locals>.tmpx   s    7< 095999DD!!!!   7el** +**** Ks   9 
A#AA#homedataconfigruntime	notebooksz
os.environsharejupyteretc)SYSTEM_JUPYTER_PATHSYSTEM_CONFIG_PATHz:memory:   asciic                  t   	                                  } t          dddj        j        j        j        j        dj        d
| x}_        dt          j
        v rW|                                 dd l}|                    |                                           dd l}|                                 d |_        d|j        _        g |j        _        |                                                               d|j        _        g |j        _        t/          j                    }|                    j                   |                                                                  |j                                         d S #                                  |j                                         w xY w)	Nr   FT)
port_retriesopen_browserrS   rT   rU   notebook_dirr   rj   
allow_rootr6   asyncioc                      d S r:   r   r   r   r   <lambda>zDNotebookTestBase.setup_class.<locals>.start_thread.<locals>.<lambda>   s    4 r   )argvr   )r\   r   rS   rT   rU   rw   
url_prefixr6   notebookrQ   modules_init_asyncio_patchry   set_event_loopnew_event_loopnest_asyncioapplyinit_signallog	propagatehandlers
initializerX   r	   currentadd_callbacksetstartsession_managerclose)	bind_argsappry   r   loopr)   rj   starteds        r   start_threadz2NotebookTestBase.setup_class.<locals>.start_thread   s   (,--//	%0 &!"!&"~ \ #!$!1 ^!#)& &  & & cl ++++---"NNN**7+A+A+C+CDDD (''' &&((("/- %)!#% CLLNN333$(!#% ~''!!'+...		 #))+++++ #))++++s   EF /F7targetT)r   r`   rN   rT   rS   rU   rw   r   r[   rV   	env_patchr   multiplejupyter_corepaths
path_patchrj   r
   NotebookNotarydb_filer   rO   urandomdecoder6   r   r   r$   daemonwaitr.   )r)   rg   rT   rS   rU   r   rj   r   s   `     @@r   setup_classzNotebookTestBase.setup_classu   s   (**	 	 	 	 	 s6{{"%#f++-3<&)c(mm3
S^(+I6co3{++
<1B1B1D1DEE !$Wi!8!8 9 #E9 5 56
 
 

 	'vxx(2%BJqMM**11'::	'')	, )	, )	, )	, )	, )	, )	,T %L999%)"!!###r   c                    | j                                          |                                  | j                                         | j                                         | j                                         d }t          |          }d|_        |	                                 |
                    d           |                                rt          d          d S )Nc                  f    t           j                                                                         d S r:   )zmqContextinstancetermr   r   r   cleanup_zmqz4NotebookTestBase.teardown_class.<locals>.cleanup_zmq   s(    K  ""'')))))r   r   T   zFFailed to teardown zmq Context, open sockets likely left lying around.)r~   stopr3   r   r   r`   cleanupr   r   r   r1   r%   r&   )r)   r   ts      r   teardown_classzNotebookTestBase.teardown_class   s    	* 	* 	*+&&&					q			::<< 	ighhh	i 	ir   c                 $    d| j          | j         S )Nzhttp://localhost:)rZ   r}   r2   s    r   r   zNotebookTestBase.base_url   s    =38=S^===r   )r   r   r   __doc__rZ   rj   r}   classmethodr.   r3   r8   staticmethodr!   r@   rV   rX   r\   r   r   r   r   r   r   r   r   "   sb         DF JM M [M$ 9 9 [9   [ ! ! \! 
 
 [
 	
 	
 [	
   [ # # [# R R [Rh i i [i" > > [> > >r   r   c                   v    e Zd Zd ej                     dZed             Zed             Ze	d             Z
dS )UNIXSocketNotebookTestBasez/tmp/.notebook.z.sockc                 ,    t          | j                  S )N)sock)r[   r   r2   s    r   r\   z(UNIXSocketNotebookTestBase.get_bind_args   r]   r   c                 <    t          | j                   | j         S r:   )r   r   r}   r2   s    r   r   z#UNIXSocketNotebookTestBase.base_url   s    '11C3>CCCr   c                     t           j        dk    rdd l}|                                5  t	          j        |           cd d d            S # 1 swxY w Y   d S )Nntr   )rO   ra   requests_unixsocketmonkeypatchr;   r<   )r*   r   s     r   r!   z$UNIXSocketNotebookTestBase.fetch_url   s     7d??&&&& ,,.. 	% 	%<$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   A

AAN)r   r   r   rO   getpidr   r   r\   r   r   r!   r   r   r   r   r      s         0YRY[[///D# # [# D D [D % % \% % %r   r   c              #      K   	 d V  J d            # t           j        $ rP}|j        j        }|| k    sJ d|  d|             |r|t	          |          v sJ |            Y d }~d S Y d }~d S d }~ww xY w)NFzExpected HTTP error statuszExpected status z, got )r;   	HTTPErrorrD   status_codestr)statusmsgr-   real_statuss       r   assert_http_errorr      s      	3 	32222  $ $ $j,f$$$:v::[:: %$$ 	$#a&&===!===	$ 	$ 	$ 	$ 	$ 	$ =====$s    A1?A,,A1r:   ))r   binasciir   
contextlibr   rd   rO   rQ   	threadingr   r   r'   unittestr   rB   r1   rR   unittest.mockr   r;   tornado.ioloopr	   r   jupyter_core.pathsr   traitlets.configr
   notebookappr   r   utilsr   ipython_genutils.tempdirr   r   r    r#   r   r   r   r   r   r   r   <module>r      s   $ $       % % % % % %  				 



 # # # # # # # #       
        ! ! ! ! ! ! 



     # # # # # # < < < < < < < < ! ! ! ! ! ! 7 7 7 7 7 7	 	 	 	 	9 	 	 	|> |> |> |> |>x |> |> |>~% % % % %!1 % % %, 
3 
3 
3 
3 
3 
3r   