B
    tZV#  ã               @   s  d dl mZmZ d dlZd dlT d dlZd dl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Zd dlZd dlZdZdejd< d	ZG d
d„ deƒZG dd„ dejjƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedkrþe ¡  dS )é    )Úabsolute_importÚprint_functionN)Ú*)Ú	HTTPError)ÚIOLoopg      ð?Z20ZASYNC_TEST_TIMEOUTé   c               @   sx   e Zd ZdZdd„ Zejjdd„ ƒZejje	fdd„ƒZ
dd	„ Zejje	fd
d„ƒZdd„ Zejjdd„ ƒZdd„ ZdS )ÚTestTermClientz%Test connection to a terminal managerc             C   s   || _ d | _d S )N)ÚwsÚpending_read)ÚselfÚ	websocket© r   ú9lib/python3.7/site-packages/terminado/tests/basic_test.pyÚ__init__"   s    zTestTermClient.__init__c             c   sB   | j d kr| j ¡ | _ | j V }d | _ |r2t |¡}tj |¡‚d S )N)r
   r	   Zread_messageÚjsonÚloadsÚtornadoÚgenÚReturn)r   Úresponser   r   r   Úread_msg&   s    

zTestTermClient.read_msgc             c   sf   g }t j|d}xPy|  ¡ }tj ||¡V }W n$ tjjk
rR   tj |¡‚Y nX | |¡ qW dS )z"Read messages until read times out)ZsecondsN)	ÚdatetimeZ	timedeltar   r   r   Zwith_timeoutÚTimeoutErrorr   Úappend)r   ÚtimeoutÚmsglistZdeltaZmfÚmsgr   r   r   Úread_all_msg4   s    zTestTermClient.read_all_msgc             C   s   | j  t |¡¡ d S )N)r	   Zwrite_messager   Údumps)r   r   r   r   r   Ú	write_msgB   s    zTestTermClient.write_msgc             c   sB   |   |¡V }d dd„ |D ƒ¡}dd„ |D ƒ}tj ||f¡‚dS )zkRead standard output until timeout read reached,
           return stdout and any non-stdout msgs received.Ú c             S   s    g | ]}|d  dkr|d ‘qS )r   Ústdouté   r   )Ú.0r   r   r   r   ú
<listcomp>J   s    z.TestTermClient.read_stdout.<locals>.<listcomp>c             S   s   g | ]}|d  dkr|‘qS )r   r!   r   )r#   r   r   r   r   r$   K   s    N)r   Újoinr   r   r   )r   r   r   r!   Zothermsgr   r   r   Úread_stdoutE   s    zTestTermClient.read_stdoutc             C   s   |   d|g¡ dS )zWrite to terminal stdinÚstdinN)r   )r   Údatar   r   r   Úwrite_stdinN   s    zTestTermClient.write_stdinc             c   sl   |   ¡ V  |  d¡ |   ¡ V \}}tjdkrJt d|¡}t| ¡ d ƒ}nt| d¡d ƒ}t	j
 |¡‚dS )z(Get process ID of terminal shell processzecho $$Úntzecho \$\$\x1b\[0K\r\n(\d+)r   Ú
r"   N)r&   r)   ÚosÚnameÚreÚsearchÚintÚgroupsÚsplitr   r   r   )r   r!   ZextraÚmatchÚpidr   r   r   Úget_pidR   s    


zTestTermClient.get_pidc             C   s   | j  ¡  d S )N)r	   Úclose)r   r   r   r   r6   _   s    zTestTermClient.closeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Ú	coroutiner   ÚDONE_TIMEOUTr   r   r&   r)   r5   r6   r   r   r   r   r       s   r   c               @   sH   e Zd Zejjdd„ ƒZejjdd„ ƒZejjdd„ ƒZdd„ Z	d	Z
d
S )ÚTermTestCasec             c   sN   |   ¡ }d||f }tjj|dd| id}tj |¡V }tj t|ƒ¡‚d S )Nzws://127.0.0.1:%d%sZOriginzhttp://127.0.0.1:%d)Úheaders)	Zget_http_portr   Z
httpclientZHTTPRequestr   Zwebsocket_connectr   r   r   )r   ÚpathZportÚurlZrequestr	   r   r   r   Úget_term_clientf   s    zTermTestCase.get_term_clientc             #   s$   ‡ fdd„|D ƒV }t j |¡‚d S )Nc                s   g | ]}ˆ   |¡‘qS r   )rA   )r#   r?   )r   r   r   r$   r   s    z1TermTestCase.get_term_clients.<locals>.<listcomp>)r   r   r   )r   ÚpathsÚtmsr   )r   r   Úget_term_clientsp   s    zTermTestCase.get_term_clientsc             c   s6   g }x |D ]}|  ¡ V }| |¡ q
W tj |¡‚d S )N)r5   r   r   r   r   )r   Ztm_listÚpidsÚtmr4   r   r   r   Úget_pidsu   s
    

zTermTestCase.get_pidsc                s˜   t dgt| jd| _tdg| jd| _tdgt| jd| _| j‰ G ‡ fd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dS )NZbash)Úshell_commandZmax_terminalsÚioloop)rH   rI   c                   s   e Zd ZdZ‡ fdd„ZdS )z0TermTestCase.get_app.<locals>.NewTerminalHandlerz,Create a new named terminal, return redirectc                s"   ˆ   ¡ \}}| jd| dd d S )Nz/named/F)Z	permanent)Znew_named_terminalZredirect)r   r-   Zterminal)Únamed_tmr   r   Úget‹   s    z4TermTestCase.get_app.<locals>.NewTerminalHandler.getN)r7   r8   r9   r:   rK   r   )rJ   r   r   ÚNewTerminalHandler‰   s   rL   z/newz/named/(\w+)Zterm_managerz/singlez/uniqueT)Údebug)ZNamedTermManagerÚ	MAX_TERMSZio_looprJ   ZSingleTermManagerZ	single_tmZUniqueTermManagerZ	unique_tmr   ZwebZRequestHandlerZApplicationZ
TermSocket)r   rL   r   )rJ   r   Úget_app~   s     zTermTestCase.get_app)z/named/term1z/uniquez/singleN)r7   r8   r9   r   r   r;   rA   rD   rG   rO   Ú	test_urlsr   r   r   r   r=   b   s
   
	r=   c               @   s,   e Zd Zejjdd„ ƒZejjdd„ ƒZdS )ÚCommonTestsc             c   sp   xj| j D ]`}|  |¡V }| ¡ V }|  |di g¡ | ¡ V }|  |d d¡ |  t|d ƒd¡ | ¡  qW d S )NÚsetupr   r!   r"   )rP   rA   r   ÚassertEqualZassertGreaterÚlenr6   )r   r@   rF   r   r   r   r   Ú
test_basic™   s    

zCommonTests.test_basicc             c   s|   xv| j D ]l}|  |¡V }| ¡ V  | d¡ | ¡ V \}}tjdkrRd|ks`t‚n| d¡s`t‚|g kslt‚| 	¡  qW d S )Nzwhoami
r*   ZwhoamiZwho)
rP   rA   r   r)   r&   r,   r-   ÚAssertionErrorÚ
startswithr6   )r   r@   rF   r!   Úotherr   r   r   Útest_basic_command¦   s    


zCommonTests.test_basic_commandN)r7   r8   r9   r   ÚtestingÚgen_testrU   rY   r   r   r   r   rQ   ˜   s   rQ   c               @   s4   e Zd Zdd„ Zejjdd„ ƒZejjdd„ ƒZdS )ÚNamedTermTestsc             C   sH   | j ddd}|  |jd¡ |jd }| d¡d }|  || jj¡ d S )Nz/newF)Zfollow_redirectsi.  ZLocationú/é   )ZfetchrS   Úcoder>   r2   ZassertInrJ   Z	terminals)r   r   r@   r-   r   r   r   Útest_newµ   s
    
zNamedTermTests.test_newc             c   sl   dgd dgd  }|   |¡V }|  |¡V }|  |d |d ¡ |  |d |d ¡ |  |d |d ¡ d S )Nz/named/1r^   z/named/2r   r"   r   )rD   rG   rS   ÚassertNotEqual)r   ÚnamesrC   rE   r   r   r   Útest_namespace¾   s    zNamedTermTests.test_namespacec             c   s`   dd„ t td ƒD ƒ}|  |d t… ¡V }|  |¡V }|  |t ¡V }| ¡ V }|  |d ¡ d S )Nc             S   s   g | ]}d | ‘qS )z	/named/%dr   )r#   Úir   r   r   r$   Ê   s    z5NamedTermTests.test_max_terminals.<locals>.<listcomp>r"   )ÚrangerN   rD   rG   rA   r   rS   )r   ZurlsrC   rE   rF   r   r   r   r   Útest_max_terminalsÈ   s    
z!NamedTermTests.test_max_terminalsN)	r7   r8   r9   r`   r   rZ   r[   rc   rf   r   r   r   r   r\   ´   s   	
r\   c               @   s   e Zd Zejjdd„ ƒZdS )ÚSingleTermTestsc             c   s4   |   ddg¡V }|  |¡V }|  |d |d ¡ d S )Nz/singler   r"   )rD   rG   rS   )r   rC   rE   r   r   r   Útest_single_processÔ   s    z#SingleTermTests.test_single_processN)r7   r8   r9   r   rZ   r[   rh   r   r   r   r   rg   Ó   s   rg   c               @   s,   e Zd Zejjdd„ ƒZejjdd„ ƒZdS )ÚUniqueTermTestsc             c   s4   |   ddg¡V }|  |¡V }|  |d |d ¡ d S )Nz/uniquer   r"   )rD   rG   ra   )r   rC   rE   r   r   r   Útest_unique_processesÛ   s    z%UniqueTermTests.test_unique_processesc             c   s¤   |   dgt ¡V }|  |¡V }|  tt|ƒƒt¡ |  d¡V }| ¡ V }|  |d ¡ |d  ¡  |d  ¡ V }|  	|d ¡ |  d¡V }| ¡ V }|  	|d d¡ d S )Nz/uniquer   rR   )
rD   rN   rG   rS   rT   ÚsetrA   r   r6   ZassertEquals)r   rC   rE   rF   r   r   r   r   rf   á   s    

z"UniqueTermTests.test_max_terminalsN)r7   r8   r9   r   rZ   r[   rj   rf   r   r   r   r   ri   Ú   s   ri   Ú__main__)Z
__future__r   r   ZunittestZ	terminador   Ztornado.httpserverZtornado.httpclientr   Ztornado.ioloopr   Ztornado.testingr   Zloggingr   r,   r.   r<   ÚenvironrN   Úobjectr   rZ   ZAsyncHTTPTestCaser=   rQ   r\   rg   ri   r7   Úmainr   r   r   r   Ú<module>   s.   
B6