
    ^h!                     J   S r SSKJr  SSKJr  SSKrSSKrSSKrSSKJ	r	J
r
  SSKrSSKJr  \R                  R                  rSSKJr  SSKrSSKJr  SSKrSSKrSS	KJr  S
SKJrJr  S
SKJr  SSK J!r!  Sr"Sr# " S S\$5      r% " S S\5      r& " S S\&5      r'\SS j5       r(g)zBase class for notebook tests.    )hexlify)contextmanagerN)ThreadEvent)TestCase)patch)IOLoop)Config   )NotebookAppurlencode_unix_socket)url_path_join)TemporaryDirectory   g?c                       \ rS rSrSrg)TimeoutError    N)__name__
__module____qualname____firstlineno____static_attributes__r       X/home/james-whalen/.local/lib/python3.13/site-packages/nbclassic/tests/launchnotebook.pyr   r      s    r   r   c                       \ rS rSrSrSrSrSr\S 5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSrg)NotebookTestBase"   zA 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                    U R                  5       S-   n[        [        [        [        -  5      5       H  n U R                  U5          g   [        S5      e! [         a  nUeSnAf[         aP  nU R                  R                  5       (       d  [        S5      Ue[        R                  " [        5         SnAM  SnAff = f)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_alive!NotebookTestBase.wait_until_alive/   s     lln~-s<567A
c"  8 KLL '  ***3355&'LMSTT

=))*s$   A
C !A##C 0AB;;C c                     U R                   R                  [        S9  U R                   R                  5       (       a  [	        S5      eg)z7Wait for the server process to terminate after shutdown)timeoutzUndead notebook serverN)r(   joinr#   r)   r   r-   s    r   wait_until_dead NotebookTestBase.wait_until_deadB   sA     	   6''))788 *r   c                 P    0 nU R                   (       a  SU R                    3US'   U$ )Nztoken Authorization)token)r-   headerss     r   auth_headersNotebookTestBase.auth_headersI   s(    99)/		{';GO$r   c                 .    [         R                  " U 5      $ N)requestsget)r.   s    r   r%   NotebookTestBase.fetch_urlP   s    ||C  r   c                     UR                  S0 5      nUR                  U R                  5       5        [        R                  " U[        U R                  5       U5      40 UD6nU$ )zASend a request to my server

with authentication and everything.
r=   )
setdefaultupdater>   rB   requestr   r    )r-   verbpathkwargsr=   responses         r   rH   NotebookTestBase.requestT   s\     ##Ir2s'')*##D#,,.$/ r   c                     U R                   [        R                  R                  [        R
                  5      [        U R                   S5      SU R                  U R                  U R                  S.$ )Nz.ipython1)HOME
PYTHONPATH
IPYTHONDIRJUPYTER_NO_CONFIGJUPYTER_CONFIG_DIRJUPYTER_DATA_DIRJUPYTER_RUNTIME_DIR)
home_dirospathsepr6   sysrJ   pjoin
config_dirdata_dirruntime_dirr7   s    r   get_patch_envNotebookTestBase.get_patch_enva   sO     LL**//#((3j9!$#&>>!$#&??
 	
r   c                     / $ rA   r   r7   s    r   get_argvNotebookTestBase.get_argvm   s    	r   c                 (    [        U R                  S9$ )N)port)dictre   r7   s    r   get_bind_argsNotebookTestBase.get_bind_argsq       ""r   c                   ^ ^^ [        5       T l        U 4S jnU" S5      T l        U" S5      =nT l        U" S5      =nT l        U" S5      =nT l        U" S5      T l        [        R                  " ST R                  5       5      T l
        T R                  R                  5         [        R                  " [        R                  U" SS	5      /U" S
S	5      /S9T l        T R                  R                  5         T R                   =(       d
    [#        5       mSTR$                  l        [)        [*        R,                  " S5      5      R/                  S5      T l        [3        5       mU UU4S jn[5        US9T l        ST R6                  l        T R6                  R                  5         TR;                  5         T R=                  5         g )Nc                    > [         R                  R                  " TR                  R                  /U Q76 n [         R
                  " U5        U$ ! [         a*  nUR                  [        R                  :w  a  e  S nAU$ S nAff = frA   )	rX   rJ   r6   tmp_dirnamemakedirsOSErrorerrnoEEXIST)partsrJ   r1   r-   s      r   tmp)NotebookTestBase.setup_class.<locals>.tmpx   sk    77<< 0 0959DD! K  77ell* +Ks   A 
BA??Bhomedataconfigruntime	notebooksz
os.environsharejupyteretc)SYSTEM_JUPYTER_PATHSYSTEM_CONFIG_PATHz:memory:   asciic                    >  TR                  5       n [        SSSTR                  TR                  TR                  TR
                  TR                  TSTR                  S.
U D6=nTl        S[        R                  ;   aG  UR                  5         SS KnUR                  UR                  5       5        SS KnUR!                  5         S Ul        SUR$                  l        / UR$                  l        UR+                  TR-                  5       S9  SUR$                  l        / UR$                  l        [.        R0                  " 5       nUR3                  TR4                  5        UR7                  5         TR5                  5         UR8                  R;                  5         g ! TR5                  5         WR8                  R;                  5         f = f)	Nr   FT)
port_retriesopen_browserr\   r]   r^   notebook_dirr    rw   
allow_rootr<   asyncioc                      g rA   r   r   r   r   <lambda>DNotebookTestBase.setup_class.<locals>.start_thread.<locals>.<lambda>   s    4r   )argvr   )rg   r   r\   r]   r^   r   
url_prefixr<   notebookrZ   modules_init_asyncio_patchr   set_event_loopnew_event_loopnest_asyncioapplyinit_signallog	propagatehandlers
initializerb   r	   currentadd_callbacksetstartsession_managerclose)	bind_argsappr   r   loopr-   rw   starteds        r   start_thread2NotebookTestBase.setup_class.<locals>.start_thread   se   (,--/	%0 &!"!&"~~ \\ #!$!1!1 ^^!#))&  & cl +++-"**7+A+A+CD ( &&("/ %)!#% CLLN3$(!#% ~~'!!'++.		 ##))+ ##))+s   E-F ,GtargetT)r   rl   rW   r]   r\   r^   r   r   rf   r_   	env_patchr   multiplejupyter_corepaths
path_patchrw   r
   NotebookNotarydb_filer   rX   urandomdecoder<   r   r   r(   daemonwaitr2   )r-   rs   r]   r\   r^   r   rw   r   s   `     @@r   setup_classNotebookTestBase.setup_classu   s\   (*	 6{"%f+-3<&)(m3
S^(+I6co{+

<1B1B1DE !$Wi!8 9 #E9 56

 	'vx(2%BJJqM*11':	')	,T %L9%)"!!#r   c                    U R                   R                  5         U R                  5         U R                  R                  5         U R                  R                  5         U R
                  R                  5         S n[        US9nSUl        UR                  5         UR                  S5        UR                  5       (       a  [        S5      eg )Nc                  \    [         R                  R                  5       R                  5         g rA   )zmqContextinstancetermr   r   r   cleanup_zmq4NotebookTestBase.teardown_class.<locals>.cleanup_zmq   s    KK  "'')r   r   T   zFFailed to teardown zmq Context, open sockets likely left lying around.)r   stopr8   r   r   rl   cleanupr   r   r   r6   r)   r*   )r-   r   ts      r   teardown_classNotebookTestBase.teardown_class   s    	*+&			q	::<<ghh r   c                 8    SU R                    U R                   3$ )Nzhttp://localhost:)re   r   r7   s    r   r    NotebookTestBase.base_url   s    "388*S^^,<==r   r   )r   r   r   r   __doc__re   rw   r   classmethodr2   r8   r>   staticmethodr%   rH   r_   rb   rg   r   r   r    r   r   r   r   r   r   "   s     DF JM M$ 9 9   ! ! 
 
 	
 	
   # # R Rh i i" > >r   r   c                   n    \ rS rSrS\R
                  " 5        S3r\S 5       r\S 5       r	\
S 5       rSrg)	UNIXSocketNotebookTestBase   z/tmp/.notebook.z.sockc                 (    [        U R                  S9$ )N)sock)rf   r   r7   s    r   rg   (UNIXSocketNotebookTestBase.get_bind_args   ri   r   c                 H    [        U R                  5       U R                   3$ rA   )r   r   r   r7   s    r   r    #UNIXSocketNotebookTestBase.base_url   s     '123>>2BCCr   c                     [         R                  S:w  a  SS KnWR                  5          [        R
                  " U 5      sS S S 5        $ ! , (       d  f       g = f)Nntr   )rX   rm   requests_unixsocketmonkeypatchrB   rC   )r.   r   s     r   r%   $UNIXSocketNotebookTestBase.fetch_url   s6     77d?& ,,.<<$ /..s   A		
Ar   N)r   r   r   r   rX   getpidr   r   rg   r    r   r%   r   r   r   r   r   r      sT     RYY[M/D# # D D % %r   r   c              #      #     S v    S5       e! [         R                   aT  nUR                  R                  nX0:X  d   SU  SU 35       eU(       a  U[	        U5      ;   d   U5       e S nAg  S nAg S nAff = f7f)NzExpected HTTP error statuszExpected status z, got )rB   	HTTPErrorrL   status_codestr)statusmsgr1   real_statuss       r   assert_http_errorr      s     	3 	322u  $jj,,$ 	;vhf[M:	;$#a&=#!#= 	$s+   A: A:A7AA2(
A:2A77A:rA   ))r   binasciir   
contextlibr   rp   rX   rZ   	threadingr   r   r+   unittestr   rJ   r6   r[   unittest.mockr   rB   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	9 	|>x |>~%!1 %, 
3 
3r   