o
    ¯bXc  ã                   @   sb  d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ edƒZeejƒZej  ej!¡ed< G dd„ deƒZ"ddlm#Z# ddlm$Z$ ddl%m&Z& G dd„ dej'ƒZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1ddl	m2Z2 z dd l3m4Z4m5Z5m6Z6m7Z7m8Z8 dd!l9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? W n e@yÆ   d"ZAY nGw d#ZAG d$d%„ d%e:jBƒZCG d&d'„ d'e;jDƒZEG d(d)„ d)e?jFƒZGG d*d+„ d+e>jHƒZIG d,d-„ d-e7ƒZJG d.d/„ d/e6ƒZKG d0d1„ d1e8ƒZLe MeKeLe=jN¡ G d2d3„ d3e$jOƒZPG d4d5„ d5ƒZQG d6d7„ d7eQƒZRdd8lSmTZT G d9d:„ d:ejUeTjVƒZWG d;d<„ d<ejXeTjVƒZYG d=d>„ d>eQƒZZG d?d@„ d@eQƒZ[G dAdB„ dBƒZ\G dCdD„ dDeZee\ƒZ]G dEdF„ dFeRee\ƒZ^ee dGƒG dHdI„ dIe[ee\ƒƒZ_G dJdK„ dKƒZ`G dLdM„ dMeZee`ƒZaG dNdO„ dOeRee`ƒZbee dPƒG dQdR„ dRe[ee`ƒƒZcG dSdT„ dTeƒZddS )UzU
Tests for L{twisted.conch.recvline} and fixtures for testing related
functionality.
é    N)ÚskipIf)Úrecvline)Úinsults)Úportal)ÚdeferÚerror)Ú
componentsÚfilepathÚreflect)Ú	iterbytes)ÚrequireModule)ÚStringTransport)ÚSkipTestÚTestCaseztwisted.conch.stdioÚ
PYTHONPATHc                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚArrowsTestsc                    sF   t ƒ ˆ _t ¡ ˆ _t ¡ ˆ _‡ fdd„ˆ j_ˆ ˆ j_	ˆ j 
ˆ j¡ d S )Nc                      s   ˆ j S ©N)Úp© ©Úselfr   úB/usr/lib/python3/dist-packages/twisted/conch/test/test_recvline.pyÚ<lambda>"   s    z#ArrowsTests.setUp.<locals>.<lambda>)r   ÚunderlyingTransportr   ÚServerProtocolÚptr   ÚHistoricRecvLiner   ÚprotocolFactoryÚfactoryÚmakeConnectionr   r   r   r   ÚsetUp   s   

zArrowsTests.setUpc                 C   s@   | j  dd¡ | j  dd¡ | j  dd¡ |  | j  ¡ d¡ dS )zy
        When L{HistoricRecvLine} receives a printable character,
        it adds it to the current line buffer.
        ó   xNó   yó   z©ó   xyzó    )r   ÚkeystrokeReceivedÚassertEqualÚcurrentLineBufferr   r   r   r   Útest_printableCharacters&   s   z$ArrowsTests.test_printableCharactersc                    sF  ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ dS )	zµ
        When L{HistoricRecvLine} receives a LEFT_ARROW or
        RIGHT_ARROW keystroke it moves the cursor left or right
        in the current line buffer, respectively.
        c                    ó   ˆ j  | d ¡S r   ©r   r'   ©Úchr   r   r   r   7   ó    z3ArrowsTests.test_horizontalArrows.<locals>.<lambda>r%   r$   )ó   xyr#   )r!   s   yz)r&   r%   N)r   r(   r   r)   r   ÚRIGHT_ARROWÚ
LEFT_ARROW©r   ÚkRr.   r   r   r   Útest_horizontalArrows1   s,   
z!ArrowsTests.test_horizontalArrowsc                    s|   ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ |dƒ |dƒ |dƒ ˆ  ˆ j ¡ d¡ |dƒ ˆ  ˆ j ¡ d	¡ d
S )z‡
        When {HistoricRecvLine} receives a newline, it adds the current
        line buffer to the end of its history buffer.
        c                    r+   r   r,   r-   r   r   r   r   ]   r/   z*ArrowsTests.test_newline.<locals>.<lambda>ó   xyz
abc
123
©©r%   ó   abcó   123r   ó   có   bó   aó   
))r%   r9   r:   s   cbar   N)r   r(   r   ÚcurrentHistoryBufferr3   r   r   r   Útest_newlineX   s   

ÿzArrowsTests.test_newlinec                    s6  ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ ˆ  ˆ j ¡ d	¡ |ˆ jjƒ ˆ  ˆ j ¡ d
¡ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d
¡ ˆ  ˆ j ¡ d¡ tdƒD ]}|ˆ jjƒ q‡ˆ  ˆ j ¡ d¡ dS )a  
        When L{HistoricRecvLine} receives UP_ARROW or DOWN_ARROW
        keystrokes it move the current index in the current history
        buffer up or down, and resets the current line buffer to the
        previous or next line in history, respectively for each.
        c                    r+   r   r,   r-   r   r   r   r   u   r/   z1ArrowsTests.test_verticalArrows.<locals>.<lambda>r6   r7   ©r&   r&   ))r%   r9   )r:   )r:   r&   ))r%   )r9   r:   )r9   r&   )r   r8   r$   é   N)	r   r(   r   r?   r)   r   ÚUP_ARROWÚrangeÚ
DOWN_ARROW)r   r4   r.   Úir   r   r   Útest_verticalArrowsn   s(   
zArrowsTests.test_verticalArrowsc                    sV   ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ dS )z�
        When L{HistoricRecvLine} receives a HOME keystroke it moves the
        cursor to the beginning of the current line buffer.
        c                    r+   r   r,   r-   r   r   r   r   –   r/   z'ArrowsTests.test_home.<locals>.<lambda>ó   hello, world©rH   r&   )r&   rH   N)r   r(   r   r)   r   ÚHOMEr3   r   r   r   Ú	test_home‘   s   
zArrowsTests.test_homec                    sb   ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ |ˆ jjƒ |ˆ jjƒ ˆ  ˆ j ¡ d¡ dS )z‡
        When L{HistoricRecvLine} receives an END keystroke it moves the cursor
        to the end of the current line buffer.
        c                    r+   r   r,   r-   r   r   r   r   ¤   r/   z&ArrowsTests.test_end.<locals>.<lambda>rH   rI   N)r   r(   r   r)   r   rJ   ÚENDr3   r   r   r   Útest_endŸ   s   
zArrowsTests.test_endc                    sž   ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ dS )z‰
        When L{HistoricRecvLine} receives a BACKSPACE keystroke it deletes
        the character immediately before the cursor.
        c                    r+   r   r,   r-   r   r   r   r   ³   r/   z,ArrowsTests.test_backspace.<locals>.<lambda>r%   r$   ©r0   r&   )r&   r"   N)r   r(   r   r)   r   Ú	BACKSPACEr2   r3   r   r   r   Útest_backspace®   s   
zArrowsTests.test_backspacec                    sò   ‡ fdd„}t dƒD ]}||ƒ q
ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ |ˆ jjƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ ˆ  ˆ j ¡ d¡ dS )	z…
        When L{HistoricRecvLine} receives a DELETE keystroke, it
        delets the character immediately after the cursor.
        c                    r+   r   r,   r-   r   r   r   r   È   r/   z)ArrowsTests.test_delete.<locals>.<lambda>r%   r$   rN   )r!   r&   rA   N)r   r(   r   r)   r   ÚDELETEr2   r3   r   r   r   Útest_deleteÃ   s"   
zArrowsTests.test_deletec                    sr   ‡ fdd„}t dƒD ]}||ƒ q
|ˆ jjƒ |dƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ |dƒ ˆ  ˆ j ¡ d¡ dS )	z‹
        When not in INSERT mode, L{HistoricRecvLine} inserts the typed
        character at the cursor before the next character.
        c                    r+   r   r,   r-   r   r   r   r   å   r/   z)ArrowsTests.test_insert.<locals>.<lambda>r%   ó   A)ó   xyAr#   ó   B)ó   xyBs   AzN)r   r   r2   r(   r   r)   r3   r   r   r   Útest_insertà   s   
zArrowsTests.test_insertc                    s~   ‡ fdd„}t dƒD ]}||ƒ q
|ˆ jjƒ |ˆ jjƒ |dƒ ˆ  ˆ j ¡ d¡ |ˆ jjƒ |dƒ ˆ  ˆ j ¡ d¡ dS )	a  
        When in INSERT mode and upon receiving a keystroke with a printable
        character, L{HistoricRecvLine} replaces the character at
        the cursor with the typed character rather than inserting before.
        Ah, the ironies of INSERT mode.
        c                    r+   r   r,   r-   r   r   r   r   ù   r/   z+ArrowsTests.test_typeover.<locals>.<lambda>r%   rS   )rT   r&   rU   )rV   r&   N)r   r   ÚINSERTr2   r(   r   r)   r3   r   r   r   Útest_typeoverò   s   
zArrowsTests.test_typeoverc                    sr   ‡ fdd„}ˆ j }|j|j|j|j|j|j|j|j|j	|j
|j|j|j|jfD ]}||ƒ ˆ  ˆ j ¡ d¡ q'dS )z¡
        When L{HistoricRecvLine} receives a keystroke for an unprintable
        function key with no assigned behavior, the line buffer is unmodified.
        c                    r+   r   r,   r-   r   r   r   r     r/   z8ArrowsTests.test_unprintableCharacters.<locals>.<lambda>rA   N)r   ÚF1ÚF2ÚF3ÚF4ÚF5ÚF6ÚF7ÚF8ÚF9ÚF10ÚF11ÚF12ÚPGUPÚPGDNr(   r   r)   )r   r4   r   r.   r   r   r   Útest_unprintableCharacters  s(   òïz&ArrowsTests.test_unprintableCharactersN)Ú__name__Ú
__module__Ú__qualname__r    r*   r5   r@   rG   rK   rM   rP   rR   rW   rY   rh   r   r   r   r   r      s    '#r   )Útelnet)Úhelper)ÚLoopbackRelayc                   @   ó   e Zd Zdd„ ZdS )Ú
EchoServerc                 C   s    | j  |d | j| j  ¡ d S )Nr>   )ÚterminalÚwriteÚpsÚpn)r   Úliner   r   r   ÚlineReceived*  s    zEchoServer.lineReceivedN)ri   rj   rk   rv   r   r   r   r   rp   )  ó    rp   s   [Ds   [Cs   [As   [Bs   [2~s   [1~s   [3~s   [4~ó   )Úcheckers)ÚConchFactoryÚTerminalRealmÚTerminalSessionÚTerminalSessionTransportÚTerminalUser)ÚchannelÚ
connectionÚkeysÚsessionÚ	transportÚuserauthFTc                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚSessionChannels   sessionc                 O   ó<   t jj| g|¢R i |¤Ž || _|| _|| _|| _|| _d S r   )r   Ú
SSHChannelÚ__init__r   ÚprotocolArgsÚprotocolKwArgsÚwidthÚheight©r   r   r‰   rŠ   r‹   rŒ   ÚaÚkwr   r   r   rˆ   S  ó   
zSessionChannel.__init__c                 C   sh   t  d| j| jddfd¡}| j | d|¡ | j | dd¡ | j| ji | j¤Ž| _	| | j	_
| j	 | ¡ d S )Ns   vt102r   r&   s   pty-reqs   shell)r‚   ÚpackRequest_pty_reqrŒ   r‹   ÚconnÚsendRequestr   r‰   rŠ   Ú_protocolInstancer   r   )r   ÚdataÚtermr   r   r   ÚchannelOpen_  s   ÿÿÿzSessionChannel.channelOpenc                 C   s   | j  t ¡ ¡ d S r   )r”   ÚconnectionLostr   ÚConnectionDoner   r   r   r   Úclosedl  s   zSessionChannel.closedc                 C   ó   | j  |¡ d S r   )r”   ÚdataReceived©r   r•   r   r   r   rœ   o  ó   zSessionChannel.dataReceivedN)ri   rj   rk   Únamerˆ   r—   rš   rœ   r   r   r   r   r…   P  s    r…   c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestConnectionc                 O   r†   r   )r€   ÚSSHConnectionrˆ   r   r‰   rŠ   r‹   rŒ   r�   r   r   r   rˆ   s  r�   zTestConnection.__init__c                 C   s,   t | j| j| j| j| jƒ| _|  | j¡ d S r   )r…   r   r‰   rŠ   r‹   rŒ   Ú_TestConnection__channelÚopenChannelr   r   r   r   ÚserviceStarted  s   ûzTestConnection.serviceStartedc                 C   ó   | j  |¡S r   )r£   rr   r�   r   r   r   rr   ‰  ó   zTestConnection.writeN)ri   rj   rk   rˆ   r¥   rr   r   r   r   r   r¡   r  s    
r¡   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚTestAuthc                 O   s&   t jj| |g|¢R i |¤Ž || _d S r   )r„   ÚSSHUserAuthClientrˆ   Úpassword)r   Úusernamer«   rŽ   r�   r   r   r   rˆ   �  s   
zTestAuth.__init__c                 C   s   t  | j¡S r   )r   Úsucceedr«   r   r   r   r   ÚgetPassword‘  r§   zTestAuth.getPasswordN)ri   rj   rk   rˆ   r®   r   r   r   r   r©   Œ  s    r©   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestTransportc           
      O   s.   || _ || _|| _|| _|| _|| _|| _d S r   )r   r‰   rŠ   r¬   r«   r‹   rŒ   )
r   r   r‰   rŠ   r¬   r«   r‹   rŒ   rŽ   r�   r   r   r   rˆ   •  s   
zTestTransport.__init__c                 C   s
   t  d¡S )NT)r   r­   )r   ÚhostKeyÚfingerprintr   r   r   ÚverifyHostKey©  s   
zTestTransport.verifyHostKeyc                 C   s8   t | j| j| j| j| jƒ| _|  t| j	| j
| jƒ¡ d S r   )r¡   r   r‰   rŠ   r‹   rŒ   Ú_TestTransport__connectionÚrequestServicer©   r¬   r«   r   r   r   r   ÚconnectionSecure¬  s   ûÿzTestTransport.connectionSecurec                 C   r¦   r   )r³   rr   r�   r   r   r   rr   ¸  r§   zTestTransport.writeN)ri   rj   rk   rˆ   r²   rµ   rr   r   r   r   r   r¯   ”  s
    r¯   c                   @   ro   )ÚTestSessionTransportc                 C   s   | j jjj ¡ S r   )Úavatarr’   rƒ   r   ÚserverProtocolr   r   r   r   r   ¼  rž   z$TestSessionTransport.protocolFactoryN)ri   rj   rk   r   r   r   r   r   r¶   »  rw   r¶   c                   @   s   e Zd ZeZdS )ÚTestSessionN)ri   rj   rk   r¶   ÚtransportFactoryr   r   r   r   r¹   ¿  s    r¹   c                   @   ó   e Zd ZdS )ÚTestUserN©ri   rj   rk   r   r   r   r   r¼   Â  ó    r¼   c                   @   r    )ÚNotifyingExpectableBufferc                 C   s   t  ¡ | _t  ¡ | _d S r   )r   ÚDeferredÚonConnectionÚonDisconnectionr   r   r   r   rˆ   É  s   
z"NotifyingExpectableBuffer.__init__c                 C   s   t j | ¡ | j | ¡ d S r   )rm   ÚExpectableBufferÚconnectionMaderÁ   Úcallbackr   r   r   r   rÄ   Í  s   z(NotifyingExpectableBuffer.connectionMadec                 C   r›   r   )rÂ   Úerrback)r   Úreasonr   r   r   r˜   Ñ  rž   z(NotifyingExpectableBuffer.connectionLostN)ri   rj   rk   rˆ   rÄ   r˜   r   r   r   r   r¿   È  s    r¿   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )Ú
_BaseMixinéP   é   c                 C   sª   | j  ¡  ¡ }|dg| jt|ƒ d   }|  t|ƒt|ƒ¡ tt|ƒƒD ]-}|  || || d |td|d ƒ|d … ¡d d |td|d ƒ|d … ¡ ¡ q%d S )Nr&   é   r   s    != )	ÚrecvlineClientÚ	__bytes__Ú
splitlinesÚHEIGHTÚlenr(   rD   ÚjoinÚmax)r   ÚlinesÚreceivedLinesÚexpectedLinesrF   r   r   r   Ú_assertBufferÙ  s   ÿþýÿz_BaseMixin._assertBufferc                    s.   ˆj  d¡}ˆ |¡ ‡ ‡fdd„}| |¡S )Ns   donec                    s   ˆ  ˆ ¡ d S r   )rÖ   )Úign©Úoutputr   r   r   Úfinishedë  s   z)_BaseMixin._trivialTest.<locals>.finished)rÌ   ÚexpectÚ
_testwriteÚaddCallback)r   Ú	inputLinerÙ   ÚdonerÚ   r   rØ   r   Ú_trivialTestæ  s   

z_BaseMixin._trivialTestN)ri   rj   rk   ÚWIDTHrÏ   rÖ   rà   r   r   r   r   rÈ   Õ  s
    rÈ   c                   @   r¨   )Ú	_SSHMixinc                    s>  t stdƒ‚d\}}tƒ }t|_‡fdd„|_t ¡ }| ||¡ t	 
|¡}| |¡ t|ƒ}tjt |  ¡ ¡dd�}||jd< ||jd< | j|_| ¡  |  ¡ ‰t ‡fdd„¡‰| d ¡}t|ƒ}	tƒ ‰t ‡fd	d„¡‰ t‡ fd
d„di ||| j| jƒ}
t|
ƒ}|
 |	¡ | |¡ ˆ| _ |
| _!|| _"|	| _#|| _$ˆj%S )NzMcryptography requirements missing, can't run historic recvline tests over ssh)s   testusers   testpassc                      ó   ˆ S r   r   r   ©ÚinsultsServerr   r   r   ü  ó    z!_SSHMixin.setUp.<locals>.<lambda>i   )ÚkeySizes   ssh-rsac                      rã   r   r   r   ©ÚrecvlineServerr   r   r     ræ   c                      rã   r   r   r   ©rÌ   r   r   r     ræ   c                      rã   r   r   r   ©ÚinsultsClientr   r   r     ræ   r   )&Ússhr   r{   r¼   ÚuserFactoryÚchainedProtocolFactoryry   Ú'InMemoryUsernamePasswordDatabaseDontUseÚaddUserr   ÚPortalÚregisterCheckerrz   r�   Ú_getPersistentRSAKeyr	   ÚFilePathÚmktempÚ
publicKeysÚprivateKeysr¸   ÚstartFactoryr   r   ÚbuildProtocolrn   r¿   ÚClientProtocolr¯   rá   rÏ   r   rÌ   Ú	sshClientÚ	sshServerÚclientTransportÚserverTransportrÁ   )r   Úur   ÚrlmÚcheckerÚptlÚ
sshFactoryÚsshKeyrý   rþ   rü   rÿ   r   ©rì   rå   rÌ   ré   r   r    ò  sL   ÿ

ÿ


ÿ

z_SSHMixin.setUpc                 C   r›   r   )rü   rr   r�   r   r   r   rÜ   $  rž   z_SSHMixin._testwriteN©ri   rj   rk   r    rÜ   r   r   r   r   râ   ñ  s    2râ   )Útest_telnetc                   @   r»   )ÚTestInsultsClientProtocolNr½   r   r   r   r   r	  +  r¾   r	  c                   @   r»   )ÚTestInsultsServerProtocolNr½   r   r   r   r   r
  /  r¾   r
  c                   @   r¨   )Ú_TelnetMixinc                    s¤   |   ¡ ‰t‡fdd„ƒ‰t ‡fdd„¡}t|ƒ}tƒ ‰t‡fdd„ƒ‰ t ‡ fdd„¡}t|ƒ}| |¡ | |¡ | ¡  | ¡  ˆ| _	|| _
|| _|| _ˆjS )Nc                      rã   r   r   r   rè   r   r   r   6  ræ   z$_TelnetMixin.setUp.<locals>.<lambda>c                      rã   r   r   r   rä   r   r   r   7  ræ   c                      rã   r   r   r   rê   r   r   r   ;  ræ   c                      rã   r   r   r   rë   r   r   r   <  ræ   )r¸   r
  rl   ÚTelnetTransportrn   r¿   r	  r   ÚclearBufferrÌ   ÚtelnetClientrþ   rÿ   rÁ   )r   ÚtelnetServerrþ   r  rÿ   r   r  r   r    4  s"   

z_TelnetMixin.setUpc                 C   r›   r   )r  rr   r�   r   r   r   rÜ   L  rž   z_TelnetMixin._testwriteNr  r   r   r   r   r  3  s    r  c                   @   r    )Ú_StdioMixinc                    s´   t ƒ ‰ t ‡ fdd„¡}t |¡}tj}tj}| d¡s!| d¡r'|d d… }||t	 
| j¡g}ddlm} |j|||tdd	�}ˆ  | _| _|| _|| _t td |jˆ  d
¡gƒ¡S )Nc                      rã   r   r   r   ©ÚtestTerminalr   r   r   [  ræ   z#_StdioMixin.setUp.<locals>.<lambda>z.pycz.pyoéÿÿÿÿr   )ÚreactorT)ÚenvÚusePTYs   >>> )r¿   r   rû   ÚstdioÚTerminalProcessProtocolÚsysÚ
executableÚ__file__Úendswithr
   Úqualr¸   Útwisted.internetr  ÚspawnProcessÚ	properEnvrÌ   r  ÚprocessClientrþ   r   ÚgatherResultsÚfilterrÁ   rÛ   )r   rì   r!  ÚexeÚmoduleÚargsr  rþ   r   r  r   r    Q  s$   

ÿÿz_StdioMixin.setUpc              	      sD   zˆ j  d¡ W n tjtfy   Y nw ‡ fdd„}ˆ jj |¡S )NÚKILLc                    s.   |   tj¡ ˆ  | jj¡ ˆ  | jjd¡ d S )Né	   )Útrapr   ÚProcessTerminatedÚassertIsNoneÚvalueÚexitCoder(   Ústatus)Úfailurer   r   r   r)  ƒ  s   z"_StdioMixin.tearDown.<locals>.trap)rþ   ÚsignalProcessr   ÚProcessExitedAlreadyÚOSErrorr  rÂ   Ú
addErrback)r   r)  r   r   r   ÚtearDown|  s   ÿz_StdioMixin.tearDownc                 C   r›   r   )rþ   rr   r�   r   r   r   rÜ   Š  rž   z_StdioMixin._testwriteN)ri   rj   rk   r    r4  rÜ   r   r   r   r   r  P  s    +r  c                   @   sX   e Zd ZeZdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚRecvlineLoopbackMixinc                 C   s   |   dg d¢¡S )Ns   first line
done)ó   >>> first lineó
   first lineó   >>> done)rà   r   r   r   r   Ú
testSimple‘  s   ÿz RecvlineLoopbackMixin.testSimplec                 C   s    |   td td  d g d¢¡S )Nr7  rB   ó	   xxxx
done)s   >>> first xxxxs
   first xxxxr8  )rà   ÚinsertÚleftr   r   r   r   ÚtestLeftArrow–  ó   þz#RecvlineLoopbackMixin.testLeftArrowc                 C   s(   |   td td  td  d g d¢¡S )Ns
   right linerB   é   s   xx
done)s   >>> right lixxs
   right lixxr8  )rà   r;  r<  Úrightr   r   r   r   ÚtestRightArrowœ  s   þz$RecvlineLoopbackMixin.testRightArrowc                 C   ó   |   dtd  d g d¢¡S )Nó   second linerB   r:  )s   >>> second xxxxs   second xxxxr8  )rà   Ú	backspacer   r   r   r   ÚtestBackspace¢  ó   þz#RecvlineLoopbackMixin.testBackspacec                 C   s$   |   dtd  td  d g d¢¡S )Ns   delete xxxxrB   ó	   line
done)s   >>> delete lines   delete liner8  )rà   r<  Údeleter   r   r   r   Ú
testDelete¨  s   þz RecvlineLoopbackMixin.testDeletec                 C   rB  )Ns	   third ineé   ó   l
done)s   >>> third lines
   third liner8  )rà   r<  r   r   r   r   Ú
testInsert®  rF  z RecvlineLoopbackMixin.testInsertc                 C   ó    |   dtd  t d g d¢¡S )Ns   fourth xinerB   rK  )s   >>> fourth lines   fourth liner8  )rà   r<  r;  r   r   r   r   ÚtestTypeover´  r>  z"RecvlineLoopbackMixin.testTypeoverc                 C   s   |   td t d g d¢¡S )Ns	   blah lines	   home
done)s   >>> home lines	   home liner8  )rà   r;  Úhomer   r   r   r   ÚtestHomeº  rF  zRecvlineLoopbackMixin.testHomec                 C   rM  )Ns   end rB   rG  )s   >>> end lines   end liner8  )rà   r<  Úendr   r   r   r   ÚtestEndÀ  r>  zRecvlineLoopbackMixin.testEndN)ri   rj   rk   rp   r¸   r9  r=  rA  rE  rI  rL  rN  rP  rR  r   r   r   r   r5  Ž  s    r5  c                   @   r»   )ÚRecvlineLoopbackTelnetTestsNr½   r   r   r   r   rS  Ç  r¾   rS  c                   @   r»   )ÚRecvlineLoopbackSSHTestsNr½   r   r   r   r   rT  Ë  r¾   rT  zBTerminal requirements missing, can't run recvline tests over stdioc                   @   r»   )ÚRecvlineLoopbackStdioTestsNr½   r   r   r   r   rU  Ï  s    rU  c                   @   s(   e Zd ZeZdd„ Zdd„ Zdd„ ZdS )ÚHistoricRecvlineLoopbackMixinc                 C   s   |   dt d g d¢¡S )Ns   first line
ó   
done)r6  r7  r6  r7  r8  )rà   Úupr   r   r   r   ÚtestUpArrow×  s   
þz)HistoricRecvlineLoopbackMixin.testUpArrowc                 C   s   |   dt t d g d¢¡S )aH  
        Pressing down arrow to visit an entry that was added to the
        history by pressing the up arrow instead of return does not
        raise a L{TypeError}.

        @see: U{http://twistedmatrix.com/trac/ticket/9031}

        @return: A L{defer.Deferred} that fires when C{b"done"} is
            echoed back.
        s   first line
partial linerW  )r6  r7  s   >>> partial lines   partial liner8  ©rà   rX  Údownr   r   r   r   Ú$test_DownArrowToPartialLineInHistoryã  s   þzBHistoricRecvlineLoopbackMixin.test_DownArrowToPartialLineInHistoryc                 C   rM  )Ns   first line
second line
r?  rW  )r6  r7  ó   >>> second linerC  r]  rC  r8  rZ  r   r   r   r   ÚtestDownArrowú  r>  z+HistoricRecvlineLoopbackMixin.testDownArrowN)ri   rj   rk   rp   r¸   rY  r\  r^  r   r   r   r   rV  Ô  s
    rV  c                   @   r»   )Ú#HistoricRecvlineLoopbackTelnetTestsNr½   r   r   r   r   r_  	  ó    r_  c                   @   r»   )Ú HistoricRecvlineLoopbackSSHTestsNr½   r   r   r   r   ra    r`  ra  zKTerminal requirements missing, can't run historic recvline tests over stdioc                   @   r»   )Ú"HistoricRecvlineLoopbackStdioTestsNr½   r   r   r   r   rb    s    rb  c                   @   s   e Zd ZdZdd„ ZdS )ÚTransportSequenceTestsz5
    L{twisted.conch.recvline.TransportSequence}
    c                 C   s   |   ttj¡ dS )zh
        Initializing a L{recvline.TransportSequence} with no args
        raises an assertion.
        N)ÚassertRaisesÚAssertionErrorr   ÚTransportSequencer   r   r   r   Útest_invalidSequence$  s   z+TransportSequenceTests.test_invalidSequenceN)ri   rj   rk   Ú__doc__rg  r   r   r   r   rc    s    rc  )erh  Úosr  Úunittestr   Útwisted.conchr   Útwisted.conch.insultsr   Útwisted.credr   r  r   r   Útwisted.pythonr   r	   r
   Útwisted.python.compatr   Útwisted.python.reflectr   Útwisted.test.proto_helpersr   Útwisted.trial.unittestr   r   r  ÚdictÚenvironr   ÚpathseprÑ   Úpathr   rl   rm   Útwisted.conch.test.loopbackrn   r   rp   r<  r@  rX  r[  r;  rO  rH  rQ  rD  ry   Útwisted.conch.manhole_sshrz   r{   r|   r}   r~   Útwisted.conch.sshr   r€   r�   r‚   rƒ   r„   ÚImportErrorrí   r‡   r…   r¢   r¡   rª   r©   ÚSSHClientTransportr¯   r¶   r¹   r¼   ÚregisterAdapterÚISessionrÃ   r¿   rÈ   râ   Útwisted.conch.testr  rû   ÚTestProtocolr	  r   r
  r  r  r5  rS  rT  rU  rV  r_  ra  rb  rc  r   r   r   r   Ú<module>   s˜   
  	$ÿ"'7>9

5ÿ
ÿþ
ÿ