U
    n5{i<  ã                   @   sø   d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ G d	d
„ d
ejƒZG dd„ dejƒZG dd„ dejƒZG dd„ deƒZG dd„ dejƒZe dd¡dd… dkrÚdZdZndZdZG dd„ dejƒZdS )z0
Test cases for twisted.protocols.ident module.
é    N)ÚStringIO)ÚdeferÚerror)ÚStringTransport)Úident)Úfailure)Úunittestc                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚClassParserTestsz*
    Test parsing of ident responses.
    c                 C   s   t  ¡ | _dS )z7
        Create an ident client used in tests.
        N)r   ZIdentClientÚclient©Úself© r   ú;/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/test/test_ident.pyÚsetUp   s    zClassParserTests.setUpc                 C   s6   t  ¡ }| jj |ddf¡ | j d¡ |  |tj¡S )zX
        'UNKNOWN-ERROR' error should map to the L{ident.IdentError} exception.
        é{   éÈ  z 123, 456 : ERROR : UNKNOWN-ERROR)	r   ÚDeferredr
   ÚqueriesÚappendÚlineReceivedÚassertFailurer   Ú
IdentError©r   Údr   r   r   Útest_indentError   s    z!ClassParserTests.test_indentErrorc                 C   s6   t  ¡ }| jj |ddf¡ | j d¡ |  |tj¡S )zN
        'NO-USER' error should map to the L{ident.NoUser} exception.
        éê   r   z234, 456 : ERROR : NO-USER)	r   r   r
   r   r   r   r   r   ÚNoUserr   r   r   r   Útest_noUSerError(   s    z!ClassParserTests.test_noUSerErrorc                 C   s6   t  ¡ }| jj |ddf¡ | j d¡ |  |tj¡S )zX
        'INVALID-PORT' error should map to the L{ident.InvalidPort} exception.
        iY  é7  z 345, 567 :  ERROR : INVALID-PORT)	r   r   r
   r   r   r   r   r   ÚInvalidPortr   r   r   r   Útest_invalidPortError1   s    z&ClassParserTests.test_invalidPortErrorc                 C   s6   t  ¡ }| jj |ddf¡ | j d¡ |  |tj¡S )zV
        'HIDDEN-USER' error should map to the L{ident.HiddenUser} exception.
        r   i  z567, 789 : ERROR : HIDDEN-USER)	r   r   r
   r   r   r   r   r   Ú
HiddenUserr   r   r   r   Útest_hiddenUserError:   s    z%ClassParserTests.test_hiddenUserErrorc                 C   s@   t  ¡ }| jj |ddf¡ | j t t 	¡ ¡¡ |  
|tj¡S )zy
        A pending query which failed because of a ConnectionLost should
        receive an L{ident.IdentError}.
        iý  i°  )r   r   r
   r   r   ZconnectionLostr   ZFailurer   ZConnectionLostr   r   r   r   r   r   r   Útest_lostConnectionC   s    z$ClassParserTests.test_lostConnectionN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r"   r#   r   r   r   r   r	      s   				r	   c                   @   s   e Zd Zdd„ ZdS )ÚTestIdentServerc                 C   s   | j S ©N)ÚresultValue©r   ZserverAddressZclientAddressr   r   r   ÚlookupO   s    zTestIdentServer.lookupN©r$   r%   r&   r,   r   r   r   r   r(   N   s   r(   c                   @   s   e Zd Zdd„ ZdS )ÚTestErrorIdentServerc                 C   s   |   ¡ ‚d S r)   )ÚexceptionTyper+   r   r   r   r,   T   s    zTestErrorIdentServer.lookupNr-   r   r   r   r   r.   S   s   r.   c                   @   s   e Zd ZdS )ÚNewExceptionN)r$   r%   r&   r   r   r   r   r0   X   s   r0   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚServerParserTestsc                 C   s4  t ƒ }| tƒ ¡ g }|j|_tj|_| d¡ |  	|d d¡ tj
|_| d¡ |  	|d d¡ tj|_| d¡ |  	|d d	¡ tj|_| d
¡ |  	|d d¡ t|_| d¡ |  	|d d¡ |  t¡}|  	t|ƒd¡ dD ]J}|d d …= | d|f ¡ | d|f ¡ |  	|d|f d|f g¡ qäd S )Nz123, 345r   z 123, 345 : ERROR : UNKNOWN-ERRORz432, 210é   z432, 210 : ERROR : NO-USERz987, 654é   z987, 654 : ERROR : INVALID-PORTz756, 827é   z756, 827 : ERROR : HIDDEN-USERz987, 789é   z 987, 789 : ERROR : UNKNOWN-ERROR)éÿÿÿÿr   i   i  z%d, 5z5, %dz%d, 5 : ERROR : INVALID-PORTz5, %d : ERROR : INVALID-PORT)r.   ÚmakeConnectionr   r   ÚsendLiner   r   r/   r   ÚassertEqualr   r   r!   r0   ZflushLoggedErrorsÚlen)r   ÚpÚLZerrsÚportr   r   r   Ú
testErrors]   s>    






þþzServerParserTests.testErrorsc                 C   sB   t ƒ }| tƒ ¡ g }|j|_d|_| d¡ |  |d d¡ d S )N)ZSYSÚUSERz123, 456r   z123, 456 : USERID : SYS : USER)r(   r7   r   r   r8   r*   r   r9   )r   r;   r<   r   r   r   ÚtestSuccess…   s    
zServerParserTests.testSuccessN)r$   r%   r&   r>   r@   r   r   r   r   r1   \   s   (r1   z=Lr2   ó   Z0100007FZ04030201Z7F000001Z01020304c                   @   sP   e Zd Zdeef Zde Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚProcMixinTestszj4: %s:0019 %s:02FA 0A 00000000:00000000 00:00000000 00000000     0        0 10927 1 f72a5b80 3000 0 0 2 -1zd  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   c                 C   s   t  ¡ }|  | t¡d¡ d S )Nú	127.0.0.1)r   ÚProcServerMixinr9   ZdottedQuadFromHexStringÚ_addr1©r   r;   r   r   r   ÚtestDottedQuadFromHexString£   s    z*ProcMixinTests.testDottedQuadFromHexStringc                 C   s"   t  ¡ }|  | td ¡d¡ d S )Nz:0277)rC   iw  )r   rD   r9   ZunpackAddressrE   rF   r   r   r   ÚtestUnpackAddress§   s    z ProcMixinTests.testUnpackAddressc                 C   s    t  ¡ }|  | | j¡d¡ d S )N)©rC   é   ©ú1.2.3.4éú  r   )r   rD   r9   Z	parseLineÚlinerF   r   r   r   ÚtestLineParser«   s
    
 ÿzProcMixinTests.testLineParserc                    sT   g ‰t  ¡ }‡ fdd„|_‡fdd„|_ˆ  | dd¡|jdf¡ ˆ  ˆdg¡ d S )Nc                      s   t ˆ jgƒS r)   ©ÚiterrN   r   r   r   r   Ú<lambda>´   ó    z4ProcMixinTests.testExistingAddress.<locals>.<lambda>c                    s   ˆ   | ¡dfd S )NÚrootr2   )r   )Úuid)Úusernamer   r   rR   µ   rS   rI   rK   rT   r   )r   rD   ÚentriesZgetUsernamer9   r,   ZSYSTEM_NAMErF   r   )r   rV   r   ÚtestExistingAddress±   s    
 ÿz"ProcMixinTests.testExistingAddressc                    sV   t  ¡ }‡ fdd„|_ˆ  t j|jdd¡ ˆ  t j|jdd¡ ˆ  t j|jdd¡ d S )Nc                      s   t ˆ jgƒS r)   rP   r   r   r   r   rR   ½   rS   z7ProcMixinTests.testNonExistingAddress.<locals>.<lambda>©rC   é   rK   rI   )z1.2.3.5rM   )rL   iû  )r   rD   rW   ÚassertRaisesr   r,   rF   r   r   r   ÚtestNonExistingAddress»   s
    z%ProcMixinTests.testNonExistingAddressc                    sR   g ‰ ‡ ‡fdd„}ˆ  td|¡ t ¡ }ˆ tj|jdd¡ ˆ di fgˆ ¡ dS )zS
        L{ident.ProcServerMixin.lookup} uses the Linux TCP process table.
        c                     s   ˆ   | |f¡ tˆjƒS )z[
            Mock for the open call to prevent actually opening /proc/net/tcp.
            )r   r   Ú
sampleFile)ÚargsÚkwargs©Z
open_callsr   r   r   Úmocked_openÈ   s    z8ProcMixinTests.testLookupProcNetTcp.<locals>.mocked_openÚopenrY   rK   )z/proc/net/tcpN)ÚpatchÚbuiltinsr   rD   r[   r   r,   r9   )r   ra   r;   r   r`   r   ÚtestLookupProcNetTcpÂ   s    z#ProcMixinTests.testLookupProcNetTcpN)r$   r%   r&   rE   Ú_addr2rN   r]   rG   rH   rO   rX   r\   re   r   r   r   r   rB   ˜   s   üÿÿ
rB   )r'   rd   ÚstructÚior   Ztwisted.internetr   r   Ztwisted.internet.testingr   Ztwisted.protocolsr   Ztwisted.pythonr   Ztwisted.trialr   ZTestCaser	   ZIdentServerr(   r.   ÚRuntimeErrorr0   r1   ÚpackrE   rf   rB   r   r   r   r   Ú<module>   s&   :4