
    c8-                     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Zd dl	Z	d dl
Z	d dlZ	d dlmZ d dlmZmZmZmZ ej        d          dk    rHej        d         dk    r7ej                            d          r e j         e j                               d	Zd
Z ee          ej        d<   dZ G d d          Z G d de	j        j                  Z G d de          Z  G d de          Z! G d de          Z" G d de          Z#e$dk    r ej%                     dS dS )    N)platform)IOLoop)NamedTermManagerSingleTermManager
TermSocketUniqueTermManager         wing      ?   ASYNC_TEST_TIMEOUTc                   X    e Zd ZdZdZd Zd ZefdZd Z	efdZ
efdZd	 Zd
 Zd ZdS )TestTermClientz%Test connection to a terminal managerFc                 "    || _         d | _        d S N)wspending_read)self	websockets     :lib/python3.11/site-packages/terminado/tests/basic_test.py__init__zTestTermClient.__init__/   s         c                    K   | j         | j                                        | _         | j          d {V }d | _         |rt          j        |          }|S r   )r   r   read_messagejsonloads)r   responses     r   read_msgzTestTermClient.read_msg3   sg        	7 $ 4 4 6 6D*******  	,z(++Hr   c                   K   g }t          j        |          }	 	 |                                 }t          j                            ||           d{V }n# t          j        j        $ r |cY S w xY w|                    |           n)z"Read messages until read times outsecondsTN)datetime	timedeltar   tornadogenwith_timeoutTimeoutErrorappend)r   timeoutmsglistdeltamfmsgs         r   read_all_msgzTestTermClient.read_all_msg@   s      "7333	 ]]__#K44UB????????;+    NN3	 s   :A A0/A0c                 n   K   | j                             t          j        |                     d {V  d S r   )r   write_messager   dumps)r   r.   s     r   	write_msgzTestTermClient.write_msgM   s<      g##DJsOO44444444444r   c                    K   |                      |           d{V }d                    d |D                       }d |D             }||fS )zhRead standard output until timeout read reached,
        return stdout and any non-stdout msgs received.N c                 6    g | ]}|d          dk    |d         S )r   stdoutr
    .0r.   s     r   
<listcomp>z.TestTermClient.read_stdout.<locals>.<listcomp>T   s*    JJJSs1v7IJ#a&JJJr   c                 *    g | ]}|d          dk    |S )r   r7   r8   r9   s     r   r;   z.TestTermClient.read_stdout.<locals>.<listcomp>U   s&    AAACc!f.@ACAAAr   )r/   join)r   r*   r+   r7   othermsgs        r   read_stdoutzTestTermClient.read_stdoutP   sk       ))'22222222JJGJJJKKAA7AAA!!r   c                 d  K   g }d}t          j        |          }	 	 |                                 }t          j                            ||           d{V }n# t          j        j        $ r ||fcY S w xY w|d         dk    r|t          |d                   z  }n|                    |           )zRead standard output messages, discarding the data
        as it's received. Return the number of bytes discarded
        and any non-stdout msgsr   r!   TNr7   r
   )	r#   r$   r   r%   r&   r'   r(   lenr)   )r   r*   r>   bytes_discardedr,   r-   r.   s          r   discard_stdoutzTestTermClient.discard_stdoutX   s       "7333		%1]]__#K44UB????????;+ 1 1 1&000011v! %3s1v;;.$$$		%s   :A A43A4c                 D   K   |                      d|g           d{V  dS )zWrite to terminal stdinstdinN)r3   )r   datas     r   write_stdinzTestTermClient.write_stdinj   s4      nngt_-----------r   c                   K   |                                   d{V  |                     d           d{V  |                                   d{V \  }}t          j        dk    rNt	          j        dt          |                    }|J t          |                                d                   }n=|	                                D ](}t	          j
        d|          rt          |          } n)|S )z(Get process ID of terminal shell processNzecho $$ntzecho \$\$\\.*?\\r\\n(\d+)r   z\d+$)r?   rG   osnameresearchreprintgroups
splitlinesmatch)r   r7   extrarR   pidlis         r   get_pidzTestTermClient.get_pidn   s              {+++++++++ $ 0 0 2 22222227d? 
	I:DLLIIE$$$ellnnQ'((CC ''))  8GR(( b''CE 
r   c                 8    | j                                          d S r   )r   close)r   s    r   rX   zTestTermClient.close   s    r   N)__name__
__module____qualname____doc____test__r   r   DONE_TIMEOUTr/   r3   r?   rC   rG   rV   rX   r8   r   r   r   r   *   s        //H! ! !   *6        5 5 5 )5 " " " " ,8 % % % %$. . .  $    r   r   c                   Z     e Zd Zd Zd Zd Z fdZd Zdej	        dk    rdnd	z   Z
 xZS )
TermTestCasec                    K   |                                  }d||fz  }t          j                            |dd|z  i          }t          j                            |           d {V }t          |          S )Nzws://127.0.0.1:%d%sOriginzhttp://127.0.0.1:%d)headers)get_http_portr%   
httpclientHTTPRequestr   websocket_connectr   )r   pathporturlrequestr   s         r   get_term_clientzTermTestCase.get_term_client   s      !!###tTl2$00($9D$@A 1 
 
 $66w????????b!!!r   c                 H    K   t          j         fd|D               d {V S )Nc              3   B   K   | ]}                     |          V  d S r   )rl   )r:   rh   r   s     r   	<genexpr>z0TermTestCase.get_term_clients.<locals>.<genexpr>   s1      %S%STd&:&:4&@&@%S%S%S%S%S%Sr   )asynciogather)r   pathss   ` r   get_term_clientszTermTestCase.get_term_clients   s;      ^%S%S%S%SU%S%S%STTTTTTTTr   c                 v   K   g }|D ]1}|                                  d {V }|                    |           2|S r   )rV   r)   )r   tm_listpidstmrT   s        r   get_pidszTermTestCase.get_pids   sS       	 	B

$$$$$$CKKr   c                     t          j                    j        } || j        j                    || j        j                    || j        j                   t                                                       d S r   )	r   currentrun_syncnamed_tmkill_all	single_tm	unique_tmsupertearDown)r   run	__class__s     r   r   zTermTestCase.tearDown   sn    n'DM"###DN#$$$DN#$$$r   c           	         t          dgt                    | _        t          dg          | _        t          dgt                    | _        | j         G fddt          j        j	                  }t          j        
                    d|fdt          d| j        ifd	t          d| j        ifd
t          d| j        ifgd          S )Nbash)shell_commandmax_terminals)r   c                       e Zd ZdZ fdZdS )0TermTestCase.get_app.<locals>.NewTerminalHandlerz,Create a new named terminal, return redirectc                 j                                     \  }}|                     d|z   d           d S )Nz/named/F)	permanent)new_named_terminalredirect)r   rK   terminalr|   s      r   getz4TermTestCase.get_app.<locals>.NewTerminalHandler.get   s9    !)!<!<!>!>hi$.%@@@@@r   N)rY   rZ   r[   r\   r   )r|   s   r   NewTerminalHandlerr      s;        >>A A A A A A Ar   r   /newz/named/(\w+)term_manager/single/uniqueT)debug)r   	MAX_TERMSr|   r   r~   r   r   r%   webRequestHandlerApplicationr   )r   r   r|   s     @r   get_appzTermTestCase.get_app   s   (!(#
 
 

 +&BBB*!(#
 
 

 =	A 	A 	A 	A 	A 	A 	A!; 	A 	A 	A {&&,- *~t}.MNZ.$.)IJZ.$.)IJ	  ' 
 
 	
r   )z/named/term1r   rI   )r   r8   )rY   rZ   r[   rl   rs   rx   r   r   rJ   rK   	test_urls__classcell__)r   s   @r   r`   r`      s        " " "U U U      
 
 
@ ,rw$/V||TVWIIIIIr   r`   c                   b    e Zd Zej        j        d             Zej        j        d             ZdS )CommonTestsc                   K   | j         D ]}|                     |           d {V }|                                 d {V }|                     |di g           |                                 d {V }|                     |d         d           |                     t          |d                   d           |                                 d S )Nsetupr   r7   r
   )r   rl   r   assertEqualassertGreaterrA   rX   )r   rj   rw   r   s       r   
test_basiczCommonTests.test_basic   s      > 		 		C++C00000000B[[]]******HX}555  [[]]******HXa[(333s8A;//333HHJJJJ		 		r   c                   K   | j         D ]}|                     |           d {V }|                                 d {V  |                    d           d {V  |                                 d {V \  }}t
          j        dk    rd|v sJ n|                    d          sJ |g k    sJ |                                 d S )Nzwhoami
rI   whoamiwho)	r   rl   r/   rG   r?   rJ   rK   
startswithrX   )r   rj   rw   r7   others        r   test_basic_commandzCommonTests.test_basic_command   s     > 
	 
	C++C00000000B//#########..,,,,,,,,,$&NN$4$4444444OVUw$ 06)))))((/////B;HHJJJJ
	 
	r   N)rY   rZ   r[   r%   testinggen_testr   r   r8   r   r   r   r      sT        _
 
 
 _    r   r   c                       e Zd Zd Zej        j        d             Zej        j        ej	        
                    devd          d                         ZdS )NamedTermTestsc                     |                      dd          }|                     |j        d           |j        d         }|                    d          d         }|                     || j        j                   d S )Nr   F)follow_redirectsi.  Location/   )fetchr   coderc   splitassertInr|   	terminals)r   r   rj   rK   s       r   test_newzNamedTermTests.test_new   sq    ::fu:==,,,z* yy~~a dDM344444r   c                   K   dgdz  dgdz  z   }|                      |           d {V }|                     |           d {V }|                     |d         |d                    |                     |d         |d                    |                     |d         |d                    | j        j        d         }|                    d           d {V }|sJ |j                                        rJ |j        j	        sJ d S )	Nz/named/1r   z/named/2r   r
   r	   1T)
rs   rx   r   assertNotEqualr|   r   	terminateptyprocisaliveclosed)r   namestmsrv   r   killeds         r   test_namespacezNamedTermTests.test_namespace   s0     q J<!#33))%00000000]]3''''''''a$q'***a$q'***DGT!W---=*3/))$////////#++-----&&&&&&r   linuxIt only works on Linuxreasonc                 ~  K   d t          t          dz             D             }|                     |d t                              d {V }|                     |           d {V }|                     |t                              d {V }|                                 d {V }|                     |d            d S )Nc                     g | ]}d |z  S )z	/named/%dr8   )r:   is     r   r;   z5NamedTermTests.test_max_terminals.<locals>.<listcomp>  s    >>>Aa>>>r   r
   )ranger   rs   rx   rl   r   r   )r   urlsr   _rw   r.   s         r   test_max_terminalsz!NamedTermTests.test_max_terminals   s       ?>y1})=)=>>>))$z	z*:;;;;;;;;--$$$$$$$$ ''Y88888888KKMM!!!!!!d#####r   N)rY   rZ   r[   r   r%   r   r   r   pytestmarkskipifr   r   r8   r   r   r   r      s        5 5 5 _' ' ' _[x/8PQQ$ $ RQ $ $ $r   r   c                   8    e Zd Zej        j        d             ZdS )SingleTermTestsc                 \  K   |                      ddg           d {V }|                     |           d {V }|                     |d         |d                    | j        j        J | j        j                            d           d {V }|sJ | j        j        j        j        sJ d S )Nr   r   r
   T)rs   rx   r   r~   r   r   r   r   )r   r   rv   r   s       r   test_single_processz#SingleTermTests.test_single_process  s      ))9i*@AAAAAAAA]]3''''''''a$q'***~&222~.88>>>>>>>>~&.555555r   N)rY   rZ   r[   r%   r   r   r   r8   r   r   r   r     s3        _6 6 6 6 6r   r   c                      e Zd Zej        j        d             Zej        j        ej        	                    de
vd          d                         Zej        j        ej                            ed          d                         Zd	S )
UniqueTermTestsc                    K   |                      ddg           d {V }|                     |           d {V }|                     |d         |d                    d S )Nr   r   r
   )rs   rx   r   )r   r   rv   s      r   test_unique_processesz%UniqueTermTests.test_unique_processes  sw      ))9i*@AAAAAAAA]]3''''''''DGT!W-----r   r   r   r   c                   K   |                      dgt          z             d {V }|                     |           d {V }|                     t	          t          |                    t                     |                     d           d {V }|                                 d {V }|                     |d            |d                                          |d                                          d {V }|                     |d            |                     d           d {V }|                                 d {V }|                     |d         d           d S )Nr   r   r   )	rs   r   rx   r   rA   setrl   r   rX   )r   r   rv   rw   r.   s        r   r   z"UniqueTermTests.test_max_terminals  s      ))9+	*ABBBBBBBB]]3''''''''SYY333 ''	22222222KKMM!!!!!!d### 	AFOO%%%%%%%%d### ''	22222222KKMM!!!!!!Q)))))r   thread)r*   methodc                 X  K   ddz  }d|z   dz   }|                      d           d {V }|                                 d {V  |                    |           d {V  |                                 d {V \  }}dt          vr|dk    sJ |g k    sJ |                                 d S )Nz
ten bytes i  zecho 
r   r   i'  )rl   r/   rG   rC   r   rX   )r   massive_payloadrw   rB   r   s        r   test_large_io_doesnt_hangz)UniqueTermTests.test_large_io_doesnt_hang5  s       '-!O3d:''	22222222oonn_--------- (*'8'8':':!:!:!:!:!:!:  	+"U****{





r   N)rY   rZ   r[   r%   r   r   r   r   r   r   r   r   r*   r   r   r8   r   r   r   r     s        _. . .
 _[x/8PQQ* * RQ *( _[!3HEE  FE   r   r   __main__)&rp   r#   r   rJ   rL   sysunittestr   r   r%   tornado.httpservertornado.testingtornado.ioloopr   	terminador   r   r   r   version_infor   set_event_loop_policyWindowsSelectorEventLoopPolicyr^   r   strenvironr   r   r   AsyncHTTPTestCaser`   r   r   r   r   rY   mainr8   r   r   <module>r      s      				 				 


                  ! ! ! ! ! ! X X X X X X X X X X X XA! L 0 3q 8 LS\=T=TUZ=[=[ L!G!"H'"H"J"JKKK  #&3'9#:#:
  	W W W W W W W Wt@X @X @X @X @X7?4 @X @X @XF    ,   :$$ $$ $$ $$ $$\ $$ $$ $$N
6 
6 
6 
6 
6l 
6 
6 
63 3 3 3 3l 3 3 3l z HMOOOOO r   