
    ْd8-                     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(  rNej&                  d   dk\  r<ej                  j)                  d      r! e j*                   e j,                                d	Zd
Z ee      ej4                  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jJ                          yy)    N)platform)IOLoop)NamedTermManagerSingleTermManager
TermSocketUniqueTermManager         wing      ?   ASYNC_TEST_TIMEOUTc                   V    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y)TestTermClientz%Test connection to a terminal managerFc                      || _         d | _        y N)wspending_read)self	websockets     </usr/lib/python3/dist-packages/terminado/tests/basic_test.py__init__zTestTermClient.__init__/   s         c                    K   | j                   | j                  j                         | _         | j                    d {   }d | _         |rt        j                  |      }|S 7 $wr   )r   r   read_messagejsonloads)r   responses     r   read_msgzTestTermClient.read_msg3   sZ      $ $ 4 4 6D*** zz(+H	 +s   ;A$A"%A$c                    K   g }t        j                  |      }	 	 | j                         }t        j                  j                  ||       d{   }|j                  |       K7 # t        j                  j                  $ r |cY S w xY ww)z"Read messages until read times outsecondsN)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]]_#KK44UB?? NN3  @;;++ s:   B3A) A'A) B'A) )BB
BBc                 |   K   | j                   j                  t        j                  |             d {    y 7 wr   )r   write_messager   dumps)r   r.   s     r   	write_msgzTestTermClient.write_msgM   s&     gg##DJJsO444s   2<:<c                    K   | j                  |       d{   }dj                  |D cg c]  }|d   dk(  s|d    c}      }|D cg c]  }|d   dk7  s| }}||fS 7 Kc c}w c c}w w)zhRead standard output until timeout read reached,
        return stdout and any non-stdout msgs received.N r   stdoutr
   )r/   join)r   r*   r+   r.   r6   othermsgs         r   read_stdoutzTestTermClient.read_stdoutP   sw      ))'22GJSs1v7I#a&JK#*ACc!f.@CAA!! 3JAs7   A/A#A/A%A% A/A*A*A/%
A/c                 \  K   g }d}t        j                  |      }	 	 | j                         }t        j                  j                  ||       d{   }|d   dk(  r|t        |d         z  }n|j                  |       e7 0# t        j                  j                  $ r ||fcY S w xY ww)zRead standard output messages, discarding the data
        as it's received. Return the number of bytes discarded
        and any non-stdout msgsr   r!   Nr6   r
   )	r#   r$   r   r%   r&   r'   r(   lenr)   )r   r*   r8   bytes_discardedr,   r-   r.   s          r   discard_stdoutzTestTermClient.discard_stdoutX   s      ""731]]_#KK44UB?? 1v!3s1v;.$  @;;++ 1&001s:   B,3B BB ,B,B !B)&B,(B))B,c                 F   K   | j                  d|g       d{    y7 w)zWrite to terminal stdinstdinN)r3   )r   datas     r   write_stdinzTestTermClient.write_stdinj   s     nngt_---s   !!c                   K   | j                          d{    | j                  d       d{    | j                          d{   \  }}t        j                  dk(  rAt	        j
                  dt        |            }|J t        |j                         d         }|S |j                         D ]&  }t	        j                  d|      st        |      } |S  S 7 7 7 w)z(Get process ID of terminal shell processNzecho $$ntzecho \$\$\\.*?\\r\\n(\d+)r   z\d+$)r9   rA   osnameresearchreprintgroups
splitlinesmatch)r   r6   extrarL   pidlis         r   get_pidzTestTermClient.get_pidn   s        {+++ $ 0 0 2277d?II:DLIE$$$ellnQ'(C 
	 '') 88GR(b'C
	 
 	!+2s8   C$CC$C C$C"BC$C$ C$"C$c                 8    | j                   j                          y r   )r   close)r   s    r   rR   zTestTermClient.close   s    r   N)__name__
__module____qualname____doc____test__r   r   DONE_TIMEOUTr/   r3   r9   r=   rA   rP   rR    r   r   r   r   *   sF    /H! *6  5 )5 " ,8 %$.$r   r   c                   b     e Zd Zd Zd Zd Z fdZd Zdej                  dk7  rdnd	z   Z
 xZS )
TermTestCasec                    K   | j                         }d||fz  }t        j                  j                  |dd|z  i      }t        j                  j                  |       d {   }t        |      S 7 w)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   sy     !!##tTl2$$00($9D$@A 1 
 $$66w??b!! @s   A A4"A2#A4c                 V    K   t        j                   fd|D          d {   S 7 w)Nc              3   @   K   | ]  }j                  |        y wr   )rg   ).0rc   r   s     r   	<genexpr>z0TermTestCase.get_term_clients.<locals>.<genexpr>   s     %STd&:&:4&@%Ss   )asynciogather)r   pathss   ` r   get_term_clientszTermTestCase.get_term_clients   s"     ^^%SU%STTTTs   )')c                 v   K   g }|D ]+  }|j                          d {   }|j                  |       - |S 7 wr   )rP   r)   )r   tm_listpidstmrN   s        r   get_pidszTermTestCase.get_pids   s@      	B

$CKK	  %s   979c                    t        j                         j                  } || j                  j                          || j
                  j                          || j                  j                         t        | !          y r   )	r   currentrun_syncnamed_tmkill_all	single_tm	unique_tmsupertearDown)r   run	__class__s     r   r}   zTermTestCase.tearDown   sV    nn''DMM""#DNN##$DNN##$r   c           	         t        dgt              | _        t        dg      | _        t        dgt              | _        | j                   G fddt        j                  j                        }t        j                  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y)0TermTestCase.get_app.<locals>.NewTerminalHandlerz,Create a new named terminal, return redirectc                 X    j                         \  }}| j                  d|z   d       y )Nz/named/F)	permanent)new_named_terminalredirect)r   rE   terminalrx   s      r   getz4TermTestCase.get_app.<locals>.NewTerminalHandler.get   s*    !)!<!<!>hi$.%@r   N)rS   rT   rU   rV   r   )rx   s   r   NewTerminalHandlerr      s    >Ar   r   /newz/named/(\w+)term_manager/single/uniqueT)debug)r   	MAX_TERMSrx   r   rz   r   r{   r%   webRequestHandlerApplicationr   )r   r   rx   s     @r   get_appzTermTestCase.get_app   s    (!(#

 +&B*!(#

 ==	A!;!; 	A {{&&,- *~t}}.MNZ.$..)IJZ.$..)IJ	  ' 
 	
r   )z/named/term1r   rC   )r   rY   )rS   rT   rU   rg   ro   rt   r}   r   rD   rE   	test_urls__classcell__)r   s   @r   r[   r[      s7    "U
@ ,rww$|TVWIr   r[   c                   |    e Zd Zej                  j
                  d        Zej                  j
                  d        Zy)CommonTestsc                 z  K   | j                   D ]  }| j                  |       d {   }|j                          d {   }| j                  |di g       |j                          d {   }| j                  |d   d       | j	                  t        |d         d       |j                           y 7 7 x7 Nw)Nsetupr   r6   r
   )r   rg   r   assertEqualassertGreaterr;   rR   )r   re   rs   r   s       r   
test_basiczCommonTests.test_basic   s     >> 		C++C00B[[]*HX}5  [[]*HXa[(3s8A;/3HHJ		0* +s2   $B;B5B;B7+B;*B9+AB;7B;9B;c                   K   | j                   D ]  }| j                  |       d {   }|j                          d {    |j                  d       d {    |j	                          d {   \  }}t
        j                  dk(  rd|v sJ |j                  d      sJ |g k(  sJ |j                           y 7 7 7 i7 Sw)Nzwhoami
rC   whoamiwho)	r   rg   r/   rA   r9   rD   rE   
startswithrR   )r   re   rs   r6   others        r   test_basic_commandzCommonTests.test_basic_command   s     >> 
	C++C00B//###..,,,$&NN$44OVUww$6)))((///B;;HHJ
	0#,4sD   $CB=CB?CCC/C0AC?CCCN)rS   rT   rU   r%   testinggen_testr   r   rY   r   r   r   r      s<    __
 
 __ r   r   c                       e Zd Zd Zej
                  j                  d        Zej
                  j                  ej                  j                  devd      d               Zy)NamedTermTestsc                     | j                  dd      }| j                  |j                  d       |j                  d   }|j	                  d      d   }| j                  || j                  j                         y )Nr   F)follow_redirectsi.  Location/   )fetchr   coder^   splitassertInrx   	terminals)r   r   re   rE   s       r   test_newzNamedTermTests.test_new   sd    ::fu:=,z* yy~a dDMM334r   c                   K   dgdz  dgdz  z   }| j                  |       d {   }| j                  |       d {   }| j                  |d   |d          | j                  |d   |d          | j                  |d   |d          | j                  j
                  d   }|j                  d       d {   }|sJ |j                  j                         rJ |j                  j                  sJ y 7 7 7 Aw)	Nz/named/1r   z/named/2r   r
   r	   1T)
ro   rt   r   assertNotEqualrx   r   	terminateptyprocisaliveclosed)r   namestmsrr   r   killeds         r   test_namespacezNamedTermTests.test_namespace   s     q J<!#33))%00]]3''a$q'*a$q'*DGT!W-==**3/))$//v##++---&&&& 1' 0s2   "C;C5C;C7A9C;7C98>C;7C;9C;linuxIt only works on Linuxreasonc                 p  K   t        t        dz         D cg c]  }d|z  	 }}| j                  |d t                d {   }| j                  |       d {   }| j	                  |t                  d {   }|j                          d {   }| j                  |d        y c c}w 7 m7 V7 87 "w)Nr
   z	/named/%d)ranger   ro   rt   rg   r   r   )r   iurlsr   _rs   r.   s          r   test_max_terminalsz!NamedTermTests.test_max_terminals   s      */y1})=>Aa>>))$z	*:;;--$$ ''Y88KKM!d# ?;$ 9!sQ   B6B)B6 B.B6B0B69B2:B6B4B60B62B64B6N)rS   rT   rU   r   r%   r   r   r   pytestmarkskipifr   r   rY   r   r   r   r      sf    5 __' ' __[[x/8PQ$ R $r   r   c                   D    e Zd Zej                  j
                  d        Zy)SingleTermTestsc                   K   | j                  ddg       d {   }| j                  |       d {   }| j                  |d   |d          | j                  j                  J | j                  j                  j                  d       d {   }|sJ | j                  j                  j                  j                  sJ y 7 7 7 9w)Nr   r   r
   T)ro   rt   r   rz   r   r   r   r   )r   r   rr   r   s       r   test_single_processz#SingleTermTests.test_single_process  s     ))9i*@AA]]3''a$q'*~~&&222~~..88>>v~~&&..5555 B' ?s2   CCCCACC	6CC	CN)rS   rT   rU   r%   r   r   r   rY   r   r   r   r     s    __6 6r   r   c                   8   e Zd Zej                  j
                  d        Zej                  j
                  ej                  j                  de
vd      d               Zej                  j
                  ej                  j                  ed      d               Zy	)
UniqueTermTestsc                    K   | j                  ddg       d {   }| j                  |       d {   }| j                  |d   |d          y 7 67 w)Nr   r   r
   )ro   rt   r   )r   r   rr   s      r   test_unique_processesz%UniqueTermTests.test_unique_processes  sQ     ))9i*@AA]]3''DGT!W- B's   AAAAAAr   r   r   c                   K   | j                  dgt        z         d {   }| j                  |       d {   }| j                  t	        t        |            t               | j                  d       d {   }|j                          d {   }| j                  |d        |d   j                          |d   j                          d {   }| j                  |d        | j                  d       d {   }|j                          d {   }| j                  |d   d       y 7 7 7 7 7 f7 =7 'w)Nr   r   r   )	ro   r   rt   r   r;   setrg   r   rR   )r   r   rr   rs   r.   s        r   r   z"UniqueTermTests.test_max_terminals  s     ))9+	*ABB]]3''SY3 ''	22KKM!d# 	AFOO%%d# ''	22KKM!Q)# C' 3!
 & 3!sz   D>D/D>D2A D>9D4:D>D6?D>D8*D><D:=D>D<D>2D>4D>6D>8D>:D><D>thread)r*   methodc                 L  K   ddz  }d|z   dz   }| j                  d       d {   }|j                          d {    |j                  |       d {    |j                          d {   \  }}dt        vr|dkD  sJ |g k(  sJ |j                          y 7 w7 a7 J7 4w)Nz
ten bytes i  zecho 
r   r   i'  )rg   r/   rA   r=   r   rR   )r   massive_payloadrs   r<   r   s        r   test_large_io_doesnt_hangz)UniqueTermTests.test_large_io_doesnt_hang5  s      '-!O3d:''	22oonn_--- (*'8'8':!: "U***{{

 3- ";sC   "B$BB$BB$B B$-B"./B$B$ B$"B$N)rS   rT   rU   r%   r   r   r   r   r   r   r   r   r*   r   r   rY   r   r   r   r     s    __. .
 __[[x/8PQ* R *( __[[!3HE F r   r   __main__)&rl   r#   r   rD   rF   sysunittestr   r   r%   tornado.httpservertornado.testingtornado.ioloopr   	terminador   r   r   r   version_infor   set_event_loop_policyWindowsSelectorEventLoopPolicyrX   r   strenvironr   r   r   AsyncHTTPTestCaser[   r   r   r   r   rS   mainrY   r   r   <module>r      s$      	 	        ! X XA! 0 0 3q 8S\\=T=TUZ=[!G!!"H'"H"H"JK  #&'9#:

  	W Wt@X7??44 @XF, :$$\ $$N
6l 
63l 3l zHMMO r   