o
    Óó·iÈ¢  ã                   @   sî   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZ G dd	„ d	eƒZd
d„ ZG dd„ dejƒZG dd„ dejƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ ZG dd„ dejƒZdS )z)
Test cases for L{twisted.names.server}.
é    )ÚverifyClass)Údefer)ÚIProtocolFactory)ÚdnsÚerrorÚresolveÚserver)ÚfailureÚlog)Úunittestc                   @   ó   e Zd ZdZdd„ ZdS )ÚRaisedArgumentszD
    An exception containing the arguments raised by L{raiser}.
    c                 C   s   || _ || _d S ©N©ÚargsÚkwargs©Úselfr   r   © r   údC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/names/test/test_server.pyÚ__init__   s   
zRaisedArguments.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      ó    r   c                  O   s
   t | |ƒ‚)z¡
    Raise a L{RaisedArguments} exception containing the supplied arguments.

    Used as a fake when testing the call signatures of  methods and functions.
    N)r   r   r   r   r   Úraiser   s   
r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNoResponseDNSServerFactorya  
    A L{server.DNSServerFactory} subclass which does not attempt to reply to any
    received messages.

    Used for testing logged messages in C{messageReceived} without having to
    fake or patch the preceding code which attempts to deliver a response
    message.
    c                 C   ó   dS )a  
        Deny all queries.

        @param message: See L{server.DNSServerFactory.allowQuery}
        @param protocol: See L{server.DNSServerFactory.allowQuery}
        @param address: See L{server.DNSServerFactory.allowQuery}

        @return: L{False}
        @rtype: L{bool}
        FNr   )r   ÚmessageÚprotocolÚaddressr   r   r   Ú
allowQuery.   s   z%NoResponseDNSServerFactory.allowQueryc                 C   r   )zé
        A noop send reply.

        @param protocol: See L{server.DNSServerFactory.sendReply}
        @param message: See L{server.DNSServerFactory.sendReply}
        @param address: See L{server.DNSServerFactory.sendReply}
        Nr   )r   r    r   r!   r   r   r   Ú	sendReply;   ó    z$NoResponseDNSServerFactory.sendReplyN)r   r   r   r   r"   r#   r   r   r   r   r   $   s    	r   c                   @   ó(   e Zd ZdZG dd„ deƒZdd„ ZdS )ÚRaisingDNSServerFactoryzÚ
    A L{server.DNSServerFactory} subclass whose methods raise an exception
    containing the supplied arguments.

    Used for stopping L{messageReceived} and testing the arguments supplied to
    L{allowQuery}.
    c                   @   ó   e Zd ZdZdS )z+RaisingDNSServerFactory.AllowQueryArgumentsúG
        Contains positional and keyword arguments in C{args}.
        N©r   r   r   r   r   r   r   r   ÚAllowQueryArgumentsN   ó    r*   c                 O   ó   |   ||¡‚)aC  
        Raise the arguments supplied to L{allowQuery}.

        @param args: Positional arguments which will be recorded in the raised
            exception.
        @type args: L{tuple}

        @param kwargs: Keyword args which will be recorded in the raised
            exception.
        @type kwargs: L{dict}
        N)r*   r   r   r   r   r"   S   s   z"RaisingDNSServerFactory.allowQueryN)r   r   r   r   Ú	Exceptionr*   r"   r   r   r   r   r&   E   s    r&   c                   @   r%   )ÚRaisingProtocolzm
    A partial fake L{IProtocol} whose methods raise an exception containing the
    supplied arguments.
    c                   @   r'   )z%RaisingProtocol.WriteMessageArgumentsr(   Nr)   r   r   r   r   ÚWriteMessageArgumentsh   r+   r/   c                 O   r,   ©z»
        Raises the supplied arguments.

        @param args: Positional arguments
        @type args: L{tuple}

        @param kwargs: Keyword args
        @type kwargs: L{dict}
        N)r/   r   r   r   r   ÚwriteMessagem   ó   
zRaisingProtocol.writeMessageN)r   r   r   r   r-   r/   r1   r   r   r   r   r.   b   ó    r.   c                   @   r   )ÚNoopProtocolzT
    A partial fake L{dns.DNSProtocolMixin} with a noop L{writeMessage} method.
    c                 O   r   )zÔ
        A noop version of L{dns.DNSProtocolMixin.writeMessage}.

        @param args: Positional arguments
        @type args: L{tuple}

        @param kwargs: Keyword args
        @type kwargs: L{dict}
        Nr   r   r   r   r   r1      r$   zNoopProtocol.writeMessageN)r   r   r   r   r1   r   r   r   r   r4   z   r   r4   c                   @   r%   )ÚRaisingResolverzm
    A partial fake L{IResolver} whose methods raise an exception containing the
    supplied arguments.
    c                   @   r'   )zRaisingResolver.QueryArgumentsr(   Nr)   r   r   r   r   ÚQueryArguments‘   r+   r6   c                 O   r,   r0   )r6   r   r   r   r   Úquery–   r2   zRaisingResolver.queryN)r   r   r   r   r-   r6   r7   r   r   r   r   r5   ‹   r3   r5   c                   @   r%   )ÚRaisingCachez}
    A partial fake L{twisted.names.cache.Cache} whose methods raise an exception
    containing the supplied arguments.
    c                   @   r'   )z!RaisingCache.CacheResultArgumentsr(   Nr)   r   r   r   r   ÚCacheResultArguments©   r+   r9   c                 O   r,   r0   )r9   r   r   r   r   ÚcacheResult®   r2   zRaisingCache.cacheResultN)r   r   r   r   r-   r9   r:   r   r   r   r   r8   £   r3   r8   c                 O   sH   g }t  |j¡ |  t j|j¡ ||i |¤Ž |  dd„ |D ƒ|¡ dS )a  
    Assert that the callable logs the expected messages when called.

    XXX: Put this somewhere where it can be re-used elsewhere. See #6677.

    @param testCase: The test case controlling the test which triggers the
        logged messages and on which assertions will be called.
    @type testCase: L{unittest.SynchronousTestCase}

    @param expectedMessages: A L{list} of the expected log messages
    @type expectedMessages: L{list}

    @param callable: The function which is expected to produce the
        C{expectedMessages} when called.
    @type callable: L{callable}

    @param args: Positional arguments to be passed to C{callable}.
    @type args: L{list}

    @param kwargs: Keyword arguments to be passed to C{callable}.
    @type kwargs: L{dict}
    c                 S   s   g | ]}|d  d ‘qS )r   r   r   )Ú.0Úmr   r   r   Ú
<listcomp>Ø   s    z$assertLogMessage.<locals>.<listcomp>N)r
   ZaddObserverÚappendZ
addCleanupZremoveObserverÚassertEqual)ZtestCaseZexpectedMessagesÚcallabler   r   ZloggedMessagesr   r   r   ÚassertLogMessage»   s
   rA   c                   @   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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(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2d`da„ Z3dbdc„ Z4ddde„ Z5dfdg„ Z6dhdi„ Z7djdk„ Z8dldm„ Z9dndo„ Z:dpdq„ Z;drds„ Z<dtdu„ Z=dvdw„ Z>dxdy„ Z?dzd{„ Z@d|d}„ ZAd~d„ ZBd€d�„ ZCd‚S )ƒÚDNSServerFactoryTestsz/
    Tests for L{server.DNSServerFactory}.
    c                 C   s   |   t ¡ jtj¡ dS )zd
        L{server.DNSServerFactory.resolver} is a L{resolve.ResolverChain}
        instance
        N)ZassertIsInstancer   ÚDNSServerFactoryÚresolverr   ZResolverChain©r   r   r   r   Útest_resolverTypeà   ó   z'DNSServerFactoryTests.test_resolverTypec                 C   s   |   t ¡ jjg ¡ dS )zn
        L{server.DNSServerFactory.resolver} is an empty L{resolve.ResolverChain}
        by default.
        N©r?   r   rC   rD   Ú	resolversrE   r   r   r   Útest_resolverDefaultEmptyç   rG   z/DNSServerFactoryTests.test_resolverDefaultEmptyc                 C   ó&   t ƒ }|  tj|gd�jj|g¡ dS )zÎ
        L{server.DNSServerFactory.__init__} accepts an C{authorities}
        argument. The value of this argument is a list and is used to extend the
        C{resolver} L{resolve.ResolverChain}.
        )ÚauthoritiesN©Úobjectr?   r   rC   rD   rI   ©r   ZdummyResolverr   r   r   Útest_authoritiesî   ó
   þz&DNSServerFactoryTests.test_authoritiesc                 C   rK   )zÈ
        L{server.DNSServerFactory.__init__} accepts a C{caches} argument. The
        value of this argument is a list and is used to extend the C{resolver}
        L{resolve.ResolverChain}.
        ©ÚcachesNrM   rO   r   r   r   Útest_cachesú   rQ   z!DNSServerFactoryTests.test_cachesc                 C   rK   )zÉ
        L{server.DNSServerFactory.__init__} accepts a C{clients} argument. The
        value of this argument is a list and is used to extend the C{resolver}
        L{resolve.ResolverChain}.
        ©ÚclientsNrM   rO   r   r   r   Útest_clients  rQ   z"DNSServerFactoryTests.test_clientsc                 C   sV   G dd„ dƒ}G dd„ dƒ}G dd„ dƒ}|   tj|g|g|gd�jj|||g¡ dS )	zz
        L{server.DNSServerFactory.resolver} contains an ordered list of
        authorities, caches and clients.
        c                   @   ó   e Zd ZdS )z@DNSServerFactoryTests.test_resolverOrder.<locals>.DummyAuthorityN©r   r   r   r   r   r   r   ÚDummyAuthority  ó    rZ   c                   @   rX   )z<DNSServerFactoryTests.test_resolverOrder.<locals>.DummyCacheNrY   r   r   r   r   Ú
DummyCache  r[   r\   c                   @   rX   )z=DNSServerFactoryTests.test_resolverOrder.<locals>.DummyClientNrY   r   r   r   r   ÚDummyClient  r[   r]   )rL   rS   rV   NrH   )r   rZ   r\   r]   r   r   r   Útest_resolverOrder  s   ÿüz(DNSServerFactoryTests.test_resolverOrderc                 C   ó   |   t ¡ j¡ dS )zI
        L{server.DNSServerFactory.cache} is L{None} by default.
        N)ZassertIsNoner   rC   ÚcacherE   r   r   r   Útest_cacheDefault)  ó   z'DNSServerFactoryTests.test_cacheDefaultc                 C   s&   t ƒ }|  tjt ƒ |gd�j|¡ dS )z�
        L{server.DNSServerFactory.__init__} assigns the last object in the
        C{caches} list to L{server.DNSServerFactory.cache}.
        rR   N)rN   r?   r   rC   r`   rO   r   r   r   Útest_cacheOverride/  s
   þz(DNSServerFactoryTests.test_cacheOverridec                 C   r_   )z¶
        L{server.DNSServerFactory.canRecurse} is a flag indicating that this
        server is capable of performing recursive DNS lookups. It defaults to
        L{False}.
        N)ÚassertFalser   rC   Ú
canRecurserE   r   r   r   Útest_canRecurseDefault:  s   z,DNSServerFactoryTests.test_canRecurseDefaultc                 C   s   |   tjdgd�jd¡ dS )z~
        L{server.DNSServerFactory.__init__} sets C{canRecurse} to L{True} if it
        is supplied with C{clients}.
        NrU   T)r?   r   rC   re   rE   r   r   r   Útest_canRecurseOverrideB  s   z-DNSServerFactoryTests.test_canRecurseOverridec                 C   r_   )zJ
        L{server.DNSServerFactory.verbose} defaults to L{False}.
        N)rd   r   rC   ÚverboserE   r   r   r   Útest_verboseDefaultI  rb   z)DNSServerFactoryTests.test_verboseDefaultc                 C   s   |   tjdd�j¡ dS )z�
        L{server.DNSServerFactory.__init__} accepts a C{verbose} argument which
        overrides L{server.DNSServerFactory.verbose}.
        T©rh   N)Ú
assertTruer   rC   rh   rE   r   r   r   Útest_verboseOverrideO  rG   z*DNSServerFactoryTests.test_verboseOverridec                 C   s   |   tttjƒ¡ dS )zL
        L{server.DNSServerFactory} implements L{IProtocolFactory}.
        N)rk   r   r   r   rC   rE   r   r   r   Útest_interfaceV  ó   z$DNSServerFactoryTests.test_interfacec                 C   s   |   tjjtj¡ dS )zU
        L{server.DNSServerFactory.protocol} defaults to L{dns.DNSProtocol}.
        N)ÚassertIsr   rC   r    r   ZDNSProtocolrE   r   r   r   Útest_defaultProtocol\  rn   z*DNSServerFactoryTests.test_defaultProtocolc                    s\   G dd„ dƒ}|ƒ ‰ ‡ fdd„}t  ¡ }||_|jdd�}|  ˆ |fi f||j|jf¡ dS )z³
        L{server.DNSServerFactory.buildProtocol} builds a protocol by calling
        L{server.DNSServerFactory.protocol} with its self as a positional
        argument.
        c                   @   s   e Zd ZdZdZdZdS )zNDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.FakeProtocolN)r   r   r   Úfactoryr   r   r   r   r   r   ÚFakeProtocoli  s    rr   c                     s   | ˆ _ |ˆ _ˆ S r   r   r   ©ÚstubProtocolr   r   ÚfakeProtocolFactoryp  s   zUDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.fakeProtocolFactoryN)Úaddr)r   rC   r    ZbuildProtocolr?   r   r   )r   rr   ru   ÚfÚpr   rs   r   Ú"test_buildProtocolProtocolOverrideb  s   "z8DNSServerFactoryTests.test_buildProtocolProtocolOverridec                 C   s   t  ¡ }t| g |jdƒ dS )zm
        L{server.DNSServerFactory._verboseLog} does not log messages unless
        C{verbose > 0}.
        úFoo BarN©r   rC   rA   Z_verboseLog©r   rw   r   r   r   Útest_verboseLogQuiet{  s   z*DNSServerFactoryTests.test_verboseLogQuietc                 C   s"   t jdd�}t| dg|jdƒ dS )zZ
        L{server.DNSServerFactory._verboseLog} logs a message if C{verbose > 0}.
        é   rj   rz   Nr{   r|   r   r   r   Útest_verboseLogVerboseƒ  s   z,DNSServerFactoryTests.test_verboseLogVerbosec                 C   s.   t  ¡ }tdd�}t| dg|j|ddd� dS )z•
        L{server.DNSServerFactory.messageReceived} logs about an empty query if
        the message had no queries and C{verbose} is C{>0}.
        r~   rj   z$Empty query from ('192.0.2.100', 53)N©z192.0.2.100é5   ©r   Úprotor!   )r   ÚMessager   rA   ÚmessageReceived©r   r<   rw   r   r   r   Ú"test_messageReceivedLoggingNoQueryŠ  s   

úz8DNSServerFactoryTests.test_messageReceivedLoggingNoQueryc                 C   óN   t  ¡ }|jdt jd� |jdt jd� tdd�}t| dg|j|ddd� dS )	z•
        L{server.DNSServerFactory.messageReceived} logs the query types of all
        queries in the message if C{verbose} is set to C{1}.
        úexample.com©ÚnameÚtyper~   rj   z&MX AAAA query from ('192.0.2.100', 53)Nr€   r‚   ©r   r„   ÚaddQueryZMXZAAAAr   rA   r…   r†   r   r   r   Útest_messageReceivedLogging1›  s   

úz2DNSServerFactoryTests.test_messageReceivedLogging1c                 C   rˆ   )	zŽ
        L{server.DNSServerFactory.messageReceived} logs the repr of all queries
        in the message if C{verbose} is set to C{2}.
        r‰   rŠ   é   rj   zT<Query example.com MX IN> <Query example.com AAAA IN> query from ('192.0.2.100', 53)Nr€   r‚   r�   r†   r   r   r   Útest_messageReceivedLogging2®  s   
ÿ
÷z2DNSServerFactoryTests.test_messageReceivedLogging2c                    sN   t  ¡ }tƒ }tƒ ‰ |  tjd‡ fdd„¡ |j|ddd� |  |j	ˆ ¡ dS )zv
        L{server.DNSServerFactory.messageReceived} assigns a unix timestamp to
        the received message.
        Útimec                      ó   ˆ S r   r   r   ©Útr   r   Ú<lambda>Ì  r$   zEDNSServerFactoryTests.test_messageReceivedTimestamp.<locals>.<lambda>Nr‚   )
r   r„   r   rN   Úpatchr   r’   r…   r?   ÚtimeReceivedr†   r   r”   r   Útest_messageReceivedTimestampÄ  s   z3DNSServerFactoryTests.test_messageReceivedTimestampc                 C   s^   t  ¡ }tƒ }tƒ }tƒ }| jtj|j|||d�}|j\}}|  ||||f¡ |  |i ¡ dS )z¿
        L{server.DNSServerFactory.messageReceived} passes all messages to
        L{server.DNSServerFactory.allowQuery} along with the receiving protocol
        and origin address.
        r‚   N)	r   r„   rN   r&   ÚassertRaisesr*   r…   r   r?   )r   r   ZdummyProtocolÚdummyAddressrw   Úer   r   r   r   r   Útest_messageReceivedAllowQueryÑ  s   û
z4DNSServerFactoryTests.test_messageReceivedAllowQueryc                    sj   G dd„ dt ƒ‰ G ‡ fdd„dtjƒ}|ƒ }| jˆ |jt ¡ ddd�}|j\\}}}}|  |j	tj
¡ dS )z»
        If C{allowQuery} returns C{False},
        L{server.DNSServerFactory.messageReceived} calls L{server.sendReply}
        with a message whose C{rCode} is L{dns.EREFUSED}.
        c                   @   rX   )zFDNSServerFactoryTests.test_allowQueryFalse.<locals>.SendReplyExceptionNrY   r   r   r   r   ÚSendReplyExceptionî  r[   rž   c                       s    e Zd Zdd„ Z‡ fdd„ZdS )zKDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactoryc                 _   r   )NFr   r   r   r   r   r"   ò  ó   zVDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.allowQueryc                    s
   ˆ ||ƒ‚r   r   r   ©rž   r   r   r#   õ  s   
zUDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.sendReplyN)r   r   r   r"   r#   r   r    r   r   r&   ñ  s    r&   Nr‚   )r-   r   rC   rš   r…   r   r„   r   r?   ÚrCodeZEREFUSED)r   r&   rw   rœ   rƒ   r   r!   r   r   r    r   Útest_allowQueryFalseç  s   ûz*DNSServerFactoryTests.test_allowQueryFalsec                    sX   dg|_ g ‰ ‡ fdd„}tƒ }t d¡}t|||ƒ | ||¡ |  ˆ ||dfg¡ dS )a¤  
        Assert that the named method is called with the given message when it is
        passed to L{DNSServerFactory.messageReceived}.

        @param methodName: The name of the method which is expected to be
            called.
        @type methodName: L{str}

        @param message: The message which is expected to be passed to the
            C{methodName} method.
        @type message: L{dns.Message}
        Nc                    s   ˆ   | ||f¡ d S r   ©r>   ©r   r    r!   ©ZreceivedMessagesr   r   ÚfakeHandler  s   z?DNSServerFactoryTests._messageReceivedTest.<locals>.fakeHandler)Úqueriesr4   r   rC   Úsetattrr…   r?   )r   Ú
methodNamer   r¦   r    rq   r   r¥   r   Ú_messageReceivedTest  s   
z*DNSServerFactoryTests._messageReceivedTestc                 C   ó   |   dtjtjd�¡ dS )z’
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_QUERY} on to L{DNSServerFactory.handleQuery}.
        ÚhandleQuery©ZopCodeN)rª   r   r„   ZOP_QUERYrE   r   r   r   Útest_queryMessageReceived   ó   z/DNSServerFactoryTests.test_queryMessageReceivedc                 C   r«   )z›
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_INVERSE} on to L{DNSServerFactory.handleInverseQuery}.
        ÚhandleInverseQueryr­   N)rª   r   r„   Z
OP_INVERSErE   r   r   r   Ú test_inverseQueryMessageReceived'  s   ÿz6DNSServerFactoryTests.test_inverseQueryMessageReceivedc                 C   r«   )z”
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_STATUS} on to L{DNSServerFactory.handleStatus}.
        ÚhandleStatusr­   N)rª   r   r„   Z	OP_STATUSrE   r   r   r   Útest_statusMessageReceived0  r¯   z0DNSServerFactoryTests.test_statusMessageReceivedc                 C   r«   )z”
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_NOTIFY} on to L{DNSServerFactory.handleNotify}.
        ÚhandleNotifyr­   N)rª   r   r„   Z	OP_NOTIFYrE   r   r   r   Útest_notifyMessageReceived7  r¯   z0DNSServerFactoryTests.test_notifyMessageReceivedc                 C   r«   )zß
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_UPDATE} on to L{DNSServerFactory.handleOther}.

        This may change if the implementation ever covers update messages.
        ÚhandleOtherr­   N)rª   r   r„   Z	OP_UPDATErE   r   r   r   Útest_updateMessageReceived>  s   z0DNSServerFactoryTests.test_updateMessageReceivedc                 C   s‚   t ƒ t ƒ }}t ¡ }| |¡ |  |j|g¡ | |¡ |  |j||g¡ | |¡ |  |j|g¡ | |¡ |  |jg ¡ dS )zÌ
        The C{connectionMade} and C{connectionLost} methods of
        L{DNSServerFactory} cooperate to keep track of all L{DNSProtocol}
        objects created by a factory which are connected.
        N)rN   r   rC   ZconnectionMader?   ÚconnectionsZconnectionLost)r   ZprotoAZprotoBrq   r   r   r   Útest_connectionTrackingG  s   



z-DNSServerFactoryTests.test_connectionTrackingc                 C   sh   t  ¡ }| d¡ | d¡ t ¡ }tƒ |_| jtj|j	|t
ƒ dd�}|j\\}}|  ||jd ¡ dS )z¸
        L{server.DNSServerFactory.handleQuery} takes the first query from the
        supplied message and dispatches it to
        L{server.DNSServerFactory.resolver.query}.
        ó   one.example.coms   two.example.comNr¤   r   )r   r„   rŽ   r   rC   r5   rD   rš   r6   r¬   r4   r   r?   r§   )r   r<   rw   rœ   r7   r   r   r   r   Útest_handleQueryX  s   

ûz&DNSServerFactoryTests.test_handleQueryc                    sœ   t  ¡ }t ¡ ‰ G ‡ fdd„dƒ}|ƒ |_g ‰‡fdd„}||_t ¡ }| d¡ t	ƒ }t
ƒ }|j|||d� t
ƒ }ˆ  |¡ |  ˆ||||fi fg¡ dS )aC  
        L{server.DNSServerFactory.handleQuery} adds
        L{server.DNSServerFactory.resolver.gotResolverResponse} as a callback to
        the deferred returned by L{server.DNSServerFactory.resolver.query}. It
        is called with the query response, the original protocol, message and
        origin address.
        c                       ó   e Zd Z‡ fdd„ZdS )zDDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolverc                    r“   r   r   r   ©Údr   r   r7   {  rŸ   zJDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolver.queryN©r   r   r   r7   r   r½   r   r   ÚFakeResolverz  ó    rÀ   c                     ó   ˆ   | |f¡ d S r   r£   r   )ÚgotResolverResponseArgsr   r   ÚfakeGotResolverResponse‚  ó   zODNSServerFactoryTests.test_handleQueryCallback.<locals>.fakeGotResolverResponserº   r¤   N)r   rC   r   ÚDeferredrD   ÚgotResolverResponser   r„   rŽ   r4   rN   r¬   Úcallbackr?   )r   rw   rÀ   rÄ   r<   rt   r›   ZdummyResponser   )r¾   rÃ   r   Útest_handleQueryCallbackn  s$   

þz.DNSServerFactoryTests.test_handleQueryCallbackc                    s¢   t  ¡ }t ¡ ‰ G ‡ fdd„dƒ}|ƒ |_g ‰‡fdd„}||_t ¡ }| d¡ t	ƒ }t
ƒ }|j|||d� t tƒ ¡}ˆ  |¡ |  ˆ||||fi fg¡ dS )a?  
        L{server.DNSServerFactory.handleQuery} adds
        L{server.DNSServerFactory.resolver.gotResolverError} as an errback to
        the deferred returned by L{server.DNSServerFactory.resolver.query}. It
        is called with the query failure, the original protocol, message and
        origin address.
        c                       r¼   )zCDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolverc                    r“   r   r   r   r½   r   r   r7   £  rŸ   zIDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolver.queryNr¿   r   r½   r   r   rÀ   ¢  rÁ   rÀ   c                     rÂ   r   r£   r   )ÚgotResolverErrorArgsr   r   ÚfakeGotResolverErrorª  rÅ   zKDNSServerFactoryTests.test_handleQueryErrback.<locals>.fakeGotResolverErrorrº   r¤   N)r   rC   r   rÆ   rD   ÚgotResolverErrorr   r„   rŽ   r4   rN   r¬   r	   ÚFailurer-   Zerrbackr?   )r   rw   rÀ   rË   r<   rt   r›   ZstubFailurer   )r¾   rÊ   r   Útest_handleQueryErrback–  s"   

ÿz-DNSServerFactoryTests.test_handleQueryErrbackc                 C   st   t  ¡ }g }g }g }| jtj|j|||ftƒ t ¡ dd�}|j\\}}|  	|j
|¡ |  	|j|¡ |  	|j|¡ dS )zÁ
        L{server.DNSServerFactory.gotResolverResponse} accepts a tuple of
        resource record lists and triggers a response message containing those
        resource record lists.
        N©r    r   r!   )r   rC   rš   r.   r/   rÇ   r   r„   r   ro   ÚanswersÚ	authorityÚ
additional)r   rw   rÐ   rÑ   rÒ   rœ   r   r   r   r   r   Útest_gotResolverResponse½  s    úz.DNSServerFactoryTests.test_gotResolverResponsec              
   C   sd   t ƒ }t|_t ¡ }d|_| jt|jg g g fd|dd�}|  	dt
|tjg g g d�f|j|jf¡ dS )z–
        L{server.DNSServerFactory.gotResolverResponse} calls
        L{server.DNSServerFactory._responseFromMessage} to generate a response.
        r~   NrÏ   r   )r   r¡   rÐ   rÑ   rÒ   )r   r   Ú_responseFromMessager   r„   r˜   rš   r   rÇ   r?   ÚdictÚOKr   r   ©r   rq   Úrequestrœ   r   r   r   Ú0test_gotResolverResponseCallsResponseFromMessageÕ  s0   úûþ

õzFDNSServerFactoryTests.test_gotResolverResponseCallsResponseFromMessagec                 C   s4   t  ¡ }tjddd�}|j|d�f}|  ||¡ dS )zŽ
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message which is a copy of the request message.
        F)ÚanswerÚrecAv©r   N)r   rC   r   r„   rÔ   ZassertIsNot©r   rq   rØ   Úresponser   r   r   Ú"test_responseFromMessageNewMessageö  s   z8DNSServerFactoryTests.test_responseFromMessageNewMessagec                 C   sT   t  ¡ }d|_|jtjdd�d�}d|_|jtjdd�d�}|  d|j|jf¡ dS )zÇ
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message whose C{recAV} attribute is L{True} if
        L{server.DNSServerFactory.canRecurse} is L{True}.
        TF)rÛ   rÜ   ©TFN)r   rC   re   rÔ   r   r„   r?   rÛ   ©r   rq   Z	response1Z	response2r   r   r   Ú*test_responseFromMessageRecursionAvailable  s   z@DNSServerFactoryTests.test_responseFromMessageRecursionAvailablec                 C   ó6   t  ¡ }t ¡ }d|_|j|d�}|  |j|j¡ dS )z¿
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message whose C{timeReceived} attribute has the same value as that found
        on the request.
        iÒ  rÜ   N)r   rC   r   r„   r˜   rÔ   r?   rÝ   r   r   r   Ú$test_responseFromMessageTimeReceived  ó
   z:DNSServerFactoryTests.test_responseFromMessageTimeReceivedc                 C   rã   )zº
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message whose C{maxSize} attribute has the same value as that found
        on the request.
        r   rÜ   N)r   rC   r   r„   ZmaxSizerÔ   r?   rÝ   r   r   r   Útest_responseFromMessageMaxSize  rå   z5DNSServerFactoryTests.test_responseFromMessageMaxSizec                 C   s   |   tjtjj¡ dS )z{
        L{server.DNSServerFactory} has a C{_messageFactory} attribute which is
        L{dns.Message} by default.
        N)ro   r   r„   r   rC   Ú_messageFactoryrE   r   r   r   Útest_messageFactory(  ó   z)DNSServerFactoryTests.test_messageFactoryc              
   C   sd   t  ¡ }|  tdt¡ t ¡ }| jt|j|tj	d�}|  
dt|j|tj	|jdd�f|j|jf¡ dS )a4  
        L{server.DNSServerFactory._responseFromMessage} calls
        C{dns._responseFromMessage} to generate a response
        message from the request message. It supplies the request message and
        other keyword arguments which should be passed to the response message
        initialiser.
        rÔ   ©r   r¡   r   F)ZresponseConstructorr   r¡   rÛ   ÚauthN)r   rC   r—   r   r   r„   rš   r   rÔ   rÖ   r?   rÕ   rç   re   r   r   r×   r   r   r   Ú+test_responseFromMessageCallsMessageFactory/  s$   ÿûþ

õzADNSServerFactoryTests.test_responseFromMessageCallsMessageFactoryc                 C   sX   t  ¡ }|jt ¡ tjdd�gd�}|jt ¡ tjdd�gd�}|  d|j|jf¡ dS )z¥
        L{server.DNSServerFactory._responseFromMessage} marks the response
        message as authoritative if any of the answer records are authoritative.
        T)rë   )r   rÐ   Frà   N)r   rC   rÔ   r   r„   ÚRRHeaderr?   rë   rá   r   r   r   Ú,test_responseFromMessageAuthoritativeMessageL  s   ÿÿ
þzBDNSServerFactoryTests.test_responseFromMessageAuthoritativeMessagec              	   C   sR   t dd�}t ¡ g}t ¡ g}t ¡ g}t| dg|j|||ftƒ t ¡ dd� dS )zŒ
        L{server.DNSServerFactory.gotResolverResponse} logs the total number of
        records in the response if C{verbose > 0}.
        r~   rj   zLookup found 3 recordsNrÏ   )r   r   rí   rA   rÇ   r4   r„   )r   rw   rÐ   rÑ   rÒ   r   r   r   Útest_gotResolverResponseLogging]  s   




ùz5DNSServerFactoryTests.test_gotResolverResponseLoggingc                 C   s    t tƒ gd�}t ¡ }| d¡ t ¡ g}g }g }| jtj|j|||ft	ƒ |dd�}|j
\\}\}}	}
}|  |jjd¡ |  ||¡ |  |	|¡ |  |
|¡ dS )z“
        L{server.DNSServerFactory.gotResolverResponse} caches the response if at
        least one cache was provided in the constructor.
        rR   s   example.comNrÏ   )r   r8   r   r„   rŽ   rí   rš   r9   rÇ   r4   r   r?   r‹   ro   )r   rw   r<   ZexpectedAnswersZexpectedAuthorityZexpectedAdditionalrœ   r7   rÐ   rÑ   rÒ   r   r   r   r   Útest_gotResolverResponseCachingq  s&   

úz5DNSServerFactoryTests.test_gotResolverResponseCachingc                 C   sb   t ƒ }t|_t ¡ }d|_| jt|jt	 
t ¡ ¡d|dd�}|  dt|tjd�f|j|jf¡ dS )z“
        L{server.DNSServerFactory.gotResolverError} calls
        L{server.DNSServerFactory._responseFromMessage} to generate a response.
        r~   NrÏ   r   rê   )r   r   rÔ   r   r„   r˜   rš   r   rÌ   r	   rÍ   r   ÚDomainErrorr?   rÕ   ÚENAMEr   r   r×   r   r   r   Ú-test_gotResolverErrorCallsResponseFromMessage�  s   úÿzCDNSServerFactoryTests.test_gotResolverErrorCallsResponseFromMessagec                 C   sL   t  ¡ }| jtj|jt |¡tƒ t 	¡ dd�}|j
\\}}|  |j|¡ dS )a{  
        L{server.DNSServerFactory.gotResolver} accepts a L{failure.Failure} and
        triggers a response message whose rCode corresponds to the DNS error
        contained in the C{Failure}.

        @param responseError: The L{Exception} instance which is expected to
            trigger C{expectedMessageCode} when it is supplied to
            C{gotResolverError}
        @type responseError: L{Exception}

        @param expectedMessageCode: The C{rCode} which is expected in the
            message returned by C{gotResolverError} in response to
            C{responseError}.
        @type expectedMessageCode: L{int}
        NrÏ   )r   rC   rš   r.   r/   rÌ   r	   rÍ   r   r„   r   r?   r¡   )r   ZresponseErrorZexpectedMessageCoderw   rœ   r   r   r   r   r   Ú_assertMessageRcodeForError¤  s   úz1DNSServerFactoryTests._assertMessageRcodeForErrorc                 C   ó   |   t ¡ tj¡ dS )z¦
        L{server.DNSServerFactory.gotResolver} triggers a response message with
        an C{rCode} of L{dns.ENAME} if supplied with a L{error.DomainError}.
        N)rô   r   rñ   r   rò   rE   r   r   r   Ú test_gotResolverErrorDomainErrorÁ  ré   z6DNSServerFactoryTests.test_gotResolverErrorDomainErrorc                 C   rõ   )z»
        L{server.DNSServerFactory.gotResolver} triggers a response message with
        an C{rCode} of L{dns.ENAME} if supplied with a
        L{error.AuthoritativeDomainError}.
        N)rô   r   ZAuthoritativeDomainErrorr   rò   rE   r   r   r   Ú-test_gotResolverErrorAuthoritativeDomainErrorÈ  s   zCDNSServerFactoryTests.test_gotResolverErrorAuthoritativeDomainErrorc                 C   s.   |   tƒ tj¡ |  t¡}|  t|ƒd¡ dS )zÂ
        L{server.DNSServerFactory.gotResolver} triggers a response message with
        an C{rCode} of L{dns.ESERVER} if supplied with another type of error and
        logs the error.
        r~   N)rô   ÚKeyErrorr   ZESERVERZflushLoggedErrorsr?   Úlen)r   rœ   r   r   r   Útest_gotResolverErrorOtherErrorÐ  s   
z5DNSServerFactoryTests.test_gotResolverErrorOtherErrorc              	   C   s8   t dd�}t| dg|jt t ¡ ¡tƒ t 	¡ dd� dS )zZ
        L{server.DNSServerFactory.gotResolver} logs a message if C{verbose > 0}.
        r~   rj   zLookup failedNrÏ   )
r   rA   rÌ   r	   rÍ   r   rñ   r4   r   r„   r|   r   r   r   Útest_gotResolverErrorLoggingÚ  s   

ùz2DNSServerFactoryTests.test_gotResolverErrorLoggingc                    sŠ   t  ¡ }g ‰ ‡ fdd„|_tjddd�}tƒ tƒ g|_tƒ tƒ g|_tƒ tƒ g|_|j	t
 t ¡ ¡d|dd� |  tjddd�gˆ ¡ dS )	zÙ
        L{server.DNSServerFactory.gotResolverError} does not allow request
        attributes to leak into the response ie it sends a response with AD, CD
        set to 0 and empty response record sections.
        c                    ó
   ˆ   |¡S r   r£   ©r    rÞ   r!   ©Ú	responsesr   r   r–   ñ  ó    ÿzUDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributes.<locals>.<lambda>T©ZauthenticDataZcheckingDisabledNrÏ   é   ©r¡   rÚ   )r   rC   r#   r   r„   rN   rÐ   rÑ   rÒ   rÌ   r	   rÍ   r   rñ   r?   ©r   rq   rØ   r   rþ   r   Ú-test_gotResolverErrorResetsResponseAttributesé  s   üzCDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributesc                    s†   t  ¡ }g ‰ ‡ fdd„|_tjddd�}tƒ tƒ g|_tƒ tƒ g|_tƒ tƒ g|_|j	g g g fd|dd� |  
tjddd�gˆ ¡ dS )	a  
        L{server.DNSServerFactory.gotResolverResponse} does not allow request
        attributes to leak into the response ie it sends a response with AD, CD
        set to 0 and none of the records in the request answer sections are
        copied to the response.
        c                    rü   r   r£   rý   rþ   r   r   r–   
  r   zXDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes.<locals>.<lambda>Tr  NrÏ   r   r  )r   rC   r#   r   r„   rN   rÐ   rÑ   rÒ   rÇ   r?   r  r   rþ   r   Ú0test_gotResolverResponseResetsResponseAttributes  s   ÿzFDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributesc                 C   sZ   t  ¡ }tƒ }t ¡ }| jtj|jtƒ ||d�}|j	\}}|  
|||f¡ |  
|i ¡ dS )zµ
        If L{server.DNSServerFactory.sendReply} is supplied with a protocol
        *and* an address tuple it will supply that address to
        C{protocol.writeMessage}.
        rÏ   N)r   r„   rN   r   rC   rš   r.   r/   r#   r   r?   )r   r<   r›   rw   rœ   r   r   r   r   r   Útest_sendReplyWithAddress  s   û
z/DNSServerFactoryTests.test_sendReplyWithAddressc                 C   sR   t  ¡ }t ¡ }| jtj|jtƒ |dd�}|j\}}|  	||f¡ |  	|i ¡ dS )zµ
        If L{server.DNSServerFactory.sendReply} is supplied with a protocol but
        no address tuple it will supply only a message to
        C{protocol.writeMessage}.
        NrÏ   )
r   r„   r   rC   rš   r.   r/   r#   r   r?   )r   r<   rw   rœ   r   r   r   r   r   Útest_sendReplyWithoutAddress,  s   û
z2DNSServerFactoryTests.test_sendReplyWithoutAddressc                 C   sN   |   tjddd„ ¡ t ¡ }d|_tjdd�}t| ddg|jt	ƒ |d	d
� d	S )z…
        If L{server.DNSServerFactory.sendReply} logs a "no answers" message if
        the supplied message has no answers.
        r’   c                   S   r   ©Ni‚Q r   r   r   r   r   r–   D  r$   zFDNSServerFactoryTests.test_sendReplyLoggingNoAnswers.<locals>.<lambda>é�Q r�   rj   zReplying with no answersú Processed query in 1.000 secondsNrÏ   )
r—   r   r’   r   r„   r˜   rC   rA   r#   r4   r†   r   r   r   Útest_sendReplyLoggingNoAnswers?  s   
úz4DNSServerFactoryTests.test_sendReplyLoggingNoAnswersc                 C   sœ   |   tjddd„ ¡ t ¡ }|j tjt d¡d�¡ |j	 tjt d¡d�¡ |j
 tjt d¡d�¡ d|_tjdd�}t| g d	¢|jtƒ |d
d� d
S )z»
        If L{server.DNSServerFactory.sendReply} logs a message for answers,
        authority, additional if the supplied a message has records in any of
        those sections.
        r’   c                   S   r   r	  r   r   r   r   r   r–   W  r$   zHDNSServerFactoryTests.test_sendReplyLoggingWithAnswers.<locals>.<lambda>z	127.0.0.1)Úpayloadr
  r�   rj   )z*Answers are <A address=127.0.0.1 ttl=None>z+Authority is <A address=127.0.0.1 ttl=None>z,Additional is <A address=127.0.0.1 ttl=None>r  NrÏ   )r—   r   r’   r   r„   rÐ   r>   rí   ZRecord_ArÑ   rÒ   r˜   rC   rA   r#   r4   r†   r   r   r   Ú test_sendReplyLoggingWithAnswersQ  s   
õz6DNSServerFactoryTests.test_sendReplyLoggingWithAnswersc                 C   óF   t  ¡ }| jtj|jt ¡ tƒ dd�}|j\\}}|  	|j
tj¡ dS )z—
        L{server.DNSServerFactory.handleInverseQuery} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr¤   )r   rC   rš   r.   r/   r°   r   r„   r   r?   r¡   ÚENOTIMP©r   rw   rœ   r   r   r   r   r   Útest_handleInverseQueryl  ó   ûz-DNSServerFactoryTests.test_handleInverseQueryc                 C   ó,   t dd�}t| dg|jt ¡ tƒ dd� dS )zz
        L{server.DNSServerFactory.handleInverseQuery} logs the message origin
        address if C{verbose > 0}.
        r~   rj   zInverse query from ('::1', 53)©z::1r�   r¤   N)r   rA   r°   r   r„   r4   r|   r   r   r   Útest_handleInverseQueryLogging}  ó   

úz4DNSServerFactoryTests.test_handleInverseQueryLoggingc                 C   r  )z‘
        L{server.DNSServerFactory.handleStatus} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr¤   )r   rC   rš   r.   r/   r²   r   r„   r   r?   r¡   r  r  r   r   r   Útest_handleStatusŒ  r  z'DNSServerFactoryTests.test_handleStatusc                 C   r  )zt
        L{server.DNSServerFactory.handleStatus} logs the message origin address
        if C{verbose > 0}.
        r~   rj   zStatus request from ('::1', 53)r  r¤   N)r   rA   r²   r   r„   r4   r|   r   r   r   Útest_handleStatusLogging�  r  z.DNSServerFactoryTests.test_handleStatusLoggingc                 C   r  )z‘
        L{server.DNSServerFactory.handleNotify} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr¤   )r   rC   rš   r.   r/   r´   r   r„   r   r?   r¡   r  r  r   r   r   Útest_handleNotify¬  r  z'DNSServerFactoryTests.test_handleNotifyc                 C   r  )zt
        L{server.DNSServerFactory.handleNotify} logs the message origin address
        if C{verbose > 0}.
        r~   rj   zNotify message from ('::1', 53)r  r¤   N)r   rA   r´   r   r„   r4   r|   r   r   r   Útest_handleNotifyLogging½  r  z.DNSServerFactoryTests.test_handleNotifyLoggingc                 C   r  )z�
        L{server.DNSServerFactory.handleOther} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr¤   )r   rC   rš   r.   r/   r¶   r   r„   r   r?   r¡   r  r  r   r   r   Útest_handleOtherÌ  r  z&DNSServerFactoryTests.test_handleOtherc                 C   r  )zs
        L{server.DNSServerFactory.handleOther} logs the message origin address
        if C{verbose > 0}.
        r~   rj   z$Unknown op code (0) from ('::1', 53)r  r¤   N)r   rA   r¶   r   r„   r4   r|   r   r   r   Útest_handleOtherLoggingÝ  r  z-DNSServerFactoryTests.test_handleOtherLoggingN)Dr   r   r   r   rF   rJ   rP   rT   rW   r^   ra   rc   rf   rg   ri   rl   rm   rp   ry   r}   r   r‡   r�   r‘   r™   r�   r¢   rª   r®   r±   r³   rµ   r·   r¹   r»   rÉ   rÎ   rÓ   rÙ   rß   râ   rä   ræ   rè   rì   rî   rï   rð   ró   rô   rö   r÷   rú   rû   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   rB   Û   s„    		('!
rB   N)r   Zzope.interface.verifyr   Ztwisted.internetr   Ztwisted.internet.interfacesr   Ztwisted.namesr   r   r   r   Ztwisted.pythonr	   r
   Ztwisted.trialr   r-   r   r   rC   r   r&   r.   r4   r5   r8   rA   ZTestCaserB   r   r   r   r   Ú<module>   s"   
	! 