Ë
    ojÈ¢  ã                   óP  — 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	e«      Zd
„ Z G d„ dej(                  «      Z G d„ dej(                  «      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Zd„ Z G d„ dej8                  «      Zy)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„ Zy)ÚRaisedArgumentszD
    An exception containing the arguments raised by L{raiser}.
    c                 ó    — || _         || _        y ©N©ÚargsÚkwargs©Úselfr   r   s      ú@/usr/lib/python3/dist-packages/twisted/names/test/test_server.pyÚ__init__zRaisedArguments.__init__   s   € ØˆŒ	Øˆ�ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   © r   r   r   r      s   „ ñór   r   c                  ó   — t        | |«      ‚)z¡
    Raise a L{RaisedArguments} exception containing the supplied arguments.

    Used as a fake when testing the call signatures of  methods and functions.
    )r   r   s     r   Úraiserr      s   € ô ˜$ Ó
'Ð'r   c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú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                  ó   — y)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}
        Fr   )r   ÚmessageÚprotocolÚaddresss       r   Ú
allowQueryz%NoResponseDNSServerFactory.allowQuery.   s   € ð r   c                  ó   — y)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%   s       r   Ú	sendReplyz$NoResponseDNSServerFactory.sendReply;   ó   � r   N)r   r   r   r   r&   r(   r   r   r   r!   r!   $   s   „ ñòór   r!   c                   ó,   — e Zd ZdZ G d„ de«      Zd„ Zy)Ú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y)ú+RaisingDNSServerFactory.AllowQueryArgumentsúG
        Contains positional and keyword arguments in C{args}.
        N©r   r   r   r   r   r   r   ÚAllowQueryArgumentsr-   N   ó   „ ò	r   r0   c                 ó&   — | j                  ||«      ‚)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}
        )r0   r   s      r   r&   z"RaisingDNSServerFactory.allowQueryS   s   € ð ×&Ñ& t¨VÓ4Ð4r   N)r   r   r   r   Ú	Exceptionr0   r&   r   r   r   r+   r+   E   s   „ ñô˜iô ó
5r   r+   c                   ó,   — e Zd ZdZ G d„ de«      Zd„ Zy)ÚRaisingProtocolzm
    A partial fake L{IProtocol} whose methods raise an exception containing the
    supplied arguments.
    c                   ó   — e Zd ZdZy)ú%RaisingProtocol.WriteMessageArgumentsr.   Nr/   r   r   r   ÚWriteMessageArgumentsr7   h   r1   r   r8   c                 ó&   — | j                  ||«      ‚©z»
        Raises the supplied arguments.

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

        @param kwargs: Keyword args
        @type kwargs: L{dict}
        )r8   r   s      r   ÚwriteMessagezRaisingProtocol.writeMessagem   s   € ð ×(Ñ(¨¨vÓ6Ð6r   N)r   r   r   r   r3   r8   r;   r   r   r   r5   r5   b   s   „ ñô
 	ô ó

7r   r5   c                   ó   — e Zd ZdZd„ Zy)ÚNoopProtocolzT
    A partial fake L{dns.DNSProtocolMixin} with a noop L{writeMessage} method.
    c                  ó   — y)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   s      r   r;   zNoopProtocol.writeMessage   r)   r   N)r   r   r   r   r;   r   r   r   r=   r=   z   s   „ ñó	r   r=   c                   ó,   — e Zd ZdZ G d„ de«      Zd„ Zy)ÚRaisingResolverzm
    A partial fake L{IResolver} whose methods raise an exception containing the
    supplied arguments.
    c                   ó   — e Zd ZdZy)úRaisingResolver.QueryArgumentsr.   Nr/   r   r   r   ÚQueryArgumentsrB   ‘   r1   r   rC   c                 ó&   — | j                  ||«      ‚r:   )rC   r   s      r   ÚqueryzRaisingResolver.query–   s   € ð ×!Ñ! $¨Ó/Ð/r   N)r   r   r   r   r3   rC   rE   r   r   r   r@   r@   ‹   s   „ ñô
˜ô ó

0r   r@   c                   ó,   — e Zd ZdZ G d„ de«      Zd„ Zy)ÚRaisingCachez}
    A partial fake L{twisted.names.cache.Cache} whose methods raise an exception
    containing the supplied arguments.
    c                   ó   — e Zd ZdZy)ú!RaisingCache.CacheResultArgumentsr.   Nr/   r   r   r   ÚCacheResultArgumentsrI   ©   r1   r   rJ   c                 ó&   — | j                  ||«      ‚r:   )rJ   r   s      r   ÚcacheResultzRaisingCache.cacheResult®   s   € ð ×'Ñ'¨¨fÓ5Ð5r   N)r   r   r   r   r3   rJ   rL   r   r   r   rG   rG   £   s   „ ñô
˜yô ó

6r   rG   c                 ó   — g }t        j                  |j                  «       | j                  t         j                  |j                  «        ||i |¤Ž | j                  |D �cg c]
  }|d   d   ‘Œ c}|«       yc c}w )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}
    r#   r   N)r   ÚaddObserverÚappendÚ
addCleanupÚremoveObserverÚassertEqual)ÚtestCaseÚexpectedMessagesÚcallabler   r   ÚloggedMessagesÚms          r   ÚassertLogMessagerX   »   sk   € ð. €NÜ‡O�O�N×)Ñ)Ô*Ø×Ñœ×*Ñ*¨N×,AÑ,AÔBáˆdÐ�fÒà×Ñ°>ÖB¨a˜!˜I™, q›/ÒBÐDTÕUùÒBs   Á#A;c                   ó�  — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%d$„ Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d1„ Z3d2„ Z4d3„ Z5d4„ Z6d5„ Z7d6„ Z8d7„ Z9d8„ Z:d9„ Z;d:„ Z<d;„ Z=d<„ Z>d=„ Z?d>„ Z@d?„ ZAd@„ ZBdA„ ZCyB)CÚDNSServerFactoryTestsz/
    Tests for L{server.DNSServerFactory}.
    c                 ó|   — | j                  t        j                  «       j                  t        j
                  «       y)zd
        L{server.DNSServerFactory.resolver} is a L{resolve.ResolverChain}
        instance
        N)ÚassertIsInstancer	   ÚDNSServerFactoryÚresolverr   ÚResolverChain©r   s    r   Útest_resolverTypez'DNSServerFactoryTests.test_resolverTypeà   s)   € ð
 	×Ñœf×5Ñ5Ó7×@Ñ@Ä'×BWÑBWÕXr   c                 ót   — | j                  t        j                  «       j                  j                  g «       y)zn
        L{server.DNSServerFactory.resolver} is an empty L{resolve.ResolverChain}
        by default.
        N©rR   r	   r]   r^   Ú	resolversr`   s    r   Útest_resolverDefaultEmptyz/DNSServerFactoryTests.test_resolverDefaultEmptyç   s)   € ð
 	×Ñœ×0Ñ0Ó2×;Ñ;×EÑEÀrÕJr   c                 ó�   — t        «       }| j                  t        j                  |g¬«      j                  j
                  |g«       y)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©ÚobjectrR   r	   r]   r^   rd   ©r   ÚdummyResolvers     r   Útest_authoritiesz&DNSServerFactoryTests.test_authoritiesî   s:   € ô ›ˆØ×ÑÜ×#Ñ#°°Ô@×IÑI×SÑSØˆOõ	
r   c                 ó�   — t        «       }| j                  t        j                  |g¬«      j                  j
                  |g«       y)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}.
        ©ÚcachesNrh   rj   s     r   Útest_cachesz!DNSServerFactoryTests.test_cachesú   s:   € ô ›ˆØ×ÑÜ×#Ñ#¨M¨?Ô;×DÑD×NÑNØˆOõ	
r   c                 ó�   — t        «       }| j                  t        j                  |g¬«      j                  j
                  |g«       y)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}.
        ©ÚclientsNrh   rj   s     r   Útest_clientsz"DNSServerFactoryTests.test_clients  s:   € ô ›ˆØ×ÑÜ×#Ñ#¨]¨OÔ<×EÑE×OÑOØˆOõ	
r   c                 óÄ   —  G d„ d«      } G d„ d«      } G d„ d«      }| j                  t        j                  |g|g|g¬«      j                  j                  |||g«       y)	zz
        L{server.DNSServerFactory.resolver} contains an ordered list of
        authorities, caches and clients.
        c                   ó   — e Zd Zy)ú@DNSServerFactoryTests.test_resolverOrder.<locals>.DummyAuthorityN©r   r   r   r   r   r   ÚDummyAuthorityrw     ó   „ Ør   ry   c                   ó   — e Zd Zy)ú<DNSServerFactoryTests.test_resolverOrder.<locals>.DummyCacheNrx   r   r   r   Ú
DummyCacher|     rz   r   r}   c                   ó   — e Zd Zy)ú=DNSServerFactoryTests.test_resolverOrder.<locals>.DummyClientNrx   r   r   r   ÚDummyClientr     rz   r   r€   )rg   ro   rs   Nrc   )r   ry   r}   r€   s       r   Útest_resolverOrderz(DNSServerFactoryTests.test_resolverOrder  s_   € ÷	ñ 	÷	ñ 	÷	ñ 	ð 	×ÑÜ×#Ñ#Ø+Ð,°j°\ÈKÈ=ôç‰h—y‘yØ˜Z¨Ð5õ		
r   c                 ó^   — | j                  t        j                  «       j                  «       y)zI
        L{server.DNSServerFactory.cache} is L{None} by default.
        N)ÚassertIsNoner	   r]   Úcacher`   s    r   Útest_cacheDefaultz'DNSServerFactoryTests.test_cacheDefault)  s!   € ð 	×Ñœ&×1Ñ1Ó3×9Ñ9Õ:r   c                 óŒ   — t        «       }| j                  t        j                  t        «       |g¬«      j                  |«       y)z�
        L{server.DNSServerFactory.__init__} assigns the last object in the
        C{caches} list to L{server.DNSServerFactory.cache}.
        rn   N)ri   rR   r	   r]   r„   rj   s     r   Útest_cacheOverridez(DNSServerFactoryTests.test_cacheOverride/  s7   € ô
 ›ˆØ×ÑÜ×#Ñ#¬F«H°mÐ+DÔE×KÑKØõ	
r   c                 ó^   — | j                  t        j                  «       j                  «       y)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	   r]   Ú
canRecurser`   s    r   Útest_canRecurseDefaultz,DNSServerFactoryTests.test_canRecurseDefault:  s!   € ð 	×Ñœ×0Ñ0Ó2×=Ñ=Õ>r   c                 óf   — | j                  t        j                  dg¬«      j                  d«       y)z~
        L{server.DNSServerFactory.__init__} sets C{canRecurse} to L{True} if it
        is supplied with C{clients}.
        Nrr   T)rR   r	   r]   rŠ   r`   s    r   Útest_canRecurseOverridez-DNSServerFactoryTests.test_canRecurseOverrideB  s'   € ð
 	×Ñœ×0Ñ0¸$¸Ô@×KÑKÈTÕRr   c                 ó^   — | j                  t        j                  «       j                  «       y)zJ
        L{server.DNSServerFactory.verbose} defaults to L{False}.
        N)r‰   r	   r]   Úverboser`   s    r   Útest_verboseDefaultz)DNSServerFactoryTests.test_verboseDefaultI  s!   € ð 	×Ñœ×0Ñ0Ó2×:Ñ:Õ;r   c                 ób   — | j                  t        j                  d¬«      j                  «       y)z�
        L{server.DNSServerFactory.__init__} accepts a C{verbose} argument which
        overrides L{server.DNSServerFactory.verbose}.
        T©r�   N)Ú
assertTruer	   r]   r�   r`   s    r   Útest_verboseOverridez*DNSServerFactoryTests.test_verboseOverrideO  s!   € ð
 	�‰œ×/Ñ/¸Ô=×EÑEÕFr   c                 ó^   — | j                  t        t        t        j                  «      «       y)zL
        L{server.DNSServerFactory} implements L{IProtocolFactory}.
        N)r“   r   r   r	   r]   r`   s    r   Útest_interfacez$DNSServerFactoryTests.test_interfaceV  s   € ð 	�‰œÔ$4´f×6MÑ6MÓNÕOr   c                 ót   — | j                  t        j                  j                  t        j
                  «       y)zU
        L{server.DNSServerFactory.protocol} defaults to L{dns.DNSProtocol}.
        N)ÚassertIsr	   r]   r$   r   ÚDNSProtocolr`   s    r   Útest_defaultProtocolz*DNSServerFactoryTests.test_defaultProtocol\  s"   € ð 	�‰”f×-Ñ-×6Ñ6¼¿¹ÕHr   c                 óæ   ‡—  G d„ d«      } |«       Šˆfd„}t        j                  «       }||_        |j                  d¬«      }| j	                  ‰|fi f||j
                  |j                  f«       y)z³
        L{server.DNSServerFactory.buildProtocol} builds a protocol by calling
        L{server.DNSServerFactory.protocol} with its self as a positional
        argument.
        c                   ó   — e Zd ZdZdZdZy)úNDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.FakeProtocolN)r   r   r   Úfactoryr   r   r   r   r   ÚFakeProtocolr�   i  s   „ ØˆGØˆDØ‰Fr   rŸ   c                  ó$   •— | ‰_         |‰_        ‰S r   r   )r   r   ÚstubProtocols     €r   ÚfakeProtocolFactoryzUDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.fakeProtocolFactoryp  s   ø€ Ø $ˆLÔØ"(ˆLÔØÐr   N)Úaddr)r	   r]   r$   ÚbuildProtocolrR   r   r   )r   rŸ   r¢   ÚfÚpr¡   s        @r   Ú"test_buildProtocolProtocolOverridez8DNSServerFactoryTests.test_buildProtocolProtocolOverrideb  sj   ø€ ÷	ñ 	ñ
 $“~ˆô	 ô
 ×#Ñ#Ó%ˆØ(ˆŒ
Ø�O‰O ˆOÓ&ˆà×Ñ˜,¨¨¨bÐ1°A°q·v±v¸q¿x¹xÐ3HÕIr   c                 ó\   — t        j                  «       }t        | g |j                  d«       y)zm
        L{server.DNSServerFactory._verboseLog} does not log messages unless
        C{verbose > 0}.
        úFoo BarN©r	   r]   rX   Ú_verboseLog©r   r¥   s     r   Útest_verboseLogQuietz*DNSServerFactoryTests.test_verboseLogQuiet{  s$   € ô
 ×#Ñ#Ó%ˆÜ˜˜r 1§=¡=°)Õ<r   c                 ób   — t        j                  d¬«      }t        | dg|j                  d«       y)zZ
        L{server.DNSServerFactory._verboseLog} logs a message if C{verbose > 0}.
        é   r’   r©   Nrª   r¬   s     r   Útest_verboseLogVerbosez,DNSServerFactoryTests.test_verboseLogVerboseƒ  s(   € ô ×#Ñ#¨AÔ.ˆÜ˜ 	˜{¨A¯M©M¸9ÕEr   c                 ó|   — t        j                  «       }t        d¬«      }t        | dg|j                  |dd¬«       y)z•
        L{server.DNSServerFactory.messageReceived} logs about an empty query if
        the message had no queries and C{verbose} is C{>0}.
        r¯   r’   z$Empty query from ('192.0.2.100', 53)N©z192.0.2.100é5   ©r#   Úprotor%   )r   ÚMessager!   rX   ÚmessageReceived©r   rW   r¥   s      r   Ú"test_messageReceivedLoggingNoQueryz8DNSServerFactoryTests.test_messageReceivedLoggingNoQueryŠ  s<   € ô
 �K‰K‹MˆÜ&¨qÔ1ˆäØØ3Ð4Ø×ÑØØØ'ö	
r   c                 ó   — t        j                  «       }|j                  dt         j                  ¬«       |j                  dt         j                  ¬«       t        d¬«      }t        | dg|j                  |dd¬«       y)	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¯   r’   z&MX AAAA query from ('192.0.2.100', 53)Nr²   r´   ©r   r¶   ÚaddQueryÚMXÚAAAAr!   rX   r·   r¸   s      r   Útest_messageReceivedLogging1z2DNSServerFactoryTests.test_messageReceivedLogging1›  sd   € ô
 �K‰K‹MˆØ	�
‰
˜¬C¯F©Fˆ
Ô3Ø	�
‰
˜¬C¯H©Hˆ
Ô5Ü&¨qÔ1ˆäØØ5Ð6Ø×ÑØØØ'ö	
r   c                 ó   — t        j                  «       }|j                  dt         j                  ¬«       |j                  dt         j                  ¬«       t        d¬«      }t        | dg|j                  |dd¬«       y)	zŽ
        L{server.DNSServerFactory.messageReceived} logs the repr of all queries
        in the message if C{verbose} is set to C{2}.
        r»   r¼   é   r’   zT<Query example.com MX IN> <Query example.com AAAA IN> query from ('192.0.2.100', 53)Nr²   r´   r¿   r¸   s      r   Útest_messageReceivedLogging2z2DNSServerFactoryTests.test_messageReceivedLogging2®  sk   € ô
 �K‰K‹MˆØ	�
‰
˜¬C¯F©Fˆ
Ô3Ø	�
‰
˜¬C¯H©Hˆ
Ô5Ü&¨qÔ1ˆäØðMðð ×ÑØØØ'ö
	
r   c                 óþ   ‡— t        j                  «       }t        «       }t        «       Š| j	                  t
        j                  dˆfd„«       |j                  |dd¬«       | j                  |j                  ‰«       y)zv
        L{server.DNSServerFactory.messageReceived} assigns a unix timestamp to
        the received message.
        Útimec                  ó   •— ‰ S r   r   )Úts   €r   ú<lambda>zEDNSServerFactoryTests.test_messageReceivedTimestamp.<locals>.<lambda>Ì  s   ø€ °€ r   Nr´   )
r   r¶   r!   ri   Úpatchr	   rÈ   r·   rR   ÚtimeReceived)r   rW   r¥   rÊ   s      @r   Útest_messageReceivedTimestampz3DNSServerFactoryTests.test_messageReceivedTimestampÄ  s\   ø€ ô
 �K‰K‹MˆÜ&Ó(ˆÜ‹HˆØ�
‰
”6—;‘; «	Ô2Ø	×Ñ !¨4¸ÐÔ>à×Ñ˜Ÿ™¨Õ+r   c                 ó0  — t        j                  «       }t        «       }t        «       }t        «       }| j	                  t        j
                  |j                  |||¬«      }|j                  \  }}| j                  ||||f«       | j                  |i «       y)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¶   ri   r+   ÚassertRaisesr0   r·   r   rR   )r   r#   ÚdummyProtocolÚdummyAddressr¥   Úer   r   s           r   Útest_messageReceivedAllowQueryz4DNSServerFactoryTests.test_messageReceivedAllowQueryÑ  s‹   € ô —+‘+“-ˆÜ›ˆÜ“xˆä#Ó%ˆØ×ÑÜ#×7Ñ7Ø×ÑØØØ ð ó 
ˆð —v‘v‰ˆˆfØ×Ñ˜ ¨¸ÐEÔFØ×Ñ˜ Õ$r   c                 óF  ‡—  G d„ dt         «      Š G ˆfd„dt        j                  «      } |«       }| j                  ‰|j                  t        j                  «       dd¬«      }|j                  \  \  }}}}| j                  |j                  t
        j                  «       y)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                   ó   — e Zd Zy)úFDNSServerFactoryTests.test_allowQueryFalse.<locals>.SendReplyExceptionNrx   r   r   r   ÚSendReplyExceptionr×   î  rz   r   rØ   c                   ó   •— e Zd Zd„ Zˆ fd„Zy)úKDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactoryc                  ó   — y)NFr   r   s      r   r&   zVDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.allowQueryò  s   € Ør   c                 ó   •—  ‰||«      ‚r   r   )r   r   r   rØ   s      €r   r(   zUDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.sendReplyõ  s   ø€ Ù(¨¨vÓ6Ð6r   N)r   r   r   r&   r(   )rØ   s   €r   r+   rÚ   ñ  s   ø„ òõ7r   r+   Nr´   )r3   r	   r]   rÐ   r·   r   r¶   r   rR   ÚrCodeÚEREFUSED)	r   r+   r¥   rÓ   rµ   r#   r%   r   rØ   s	           @r   Útest_allowQueryFalsez*DNSServerFactoryTests.test_allowQueryFalseç  sŠ   ø€ ô	¤ô 	ö	7¤f×&=Ñ&=ô 	7ñ $Ó%ˆØ×ÑØØ×ÑÜ—K‘K“MØØð ó 
ˆð -.¯F©FÑ)Ñ!ˆ�˜ 6à×Ñ˜Ÿ™¬¯©Õ5r   c                 óÌ   ‡— dg|_         g Šˆfd„}t        «       }t        j                  d«      }t	        |||«       |j                  ||«       | j                  ‰||dfg«       y)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                 ó.   •— ‰j                  | ||f«       y r   ©rO   )r#   r$   r%   ÚreceivedMessagess      €r   ÚfakeHandlerz?DNSServerFactoryTests._messageReceivedTest.<locals>.fakeHandler  s   ø€ Ø×#Ñ# W¨h¸Ð$@ÕAr   )Úqueriesr=   r	   r]   Úsetattrr·   rR   )r   Ú
methodNamer#   rä   r$   rž   rã   s         @r   Ú_messageReceivedTestz*DNSServerFactoryTests._messageReceivedTest  sj   ø€ ð  ˜&ˆŒàÐô	Bô  “>ˆÜ×)Ñ)¨$Ó/ˆÜ�˜ [Ô1Ø×Ñ ¨Ô2Ø×ÑÐ)¨W°hÀÐ,EÐ+FÕGr   c                 ól   — | j                  dt        j                  t        j                  ¬«      «       y)z’
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_QUERY} on to L{DNSServerFactory.handleQuery}.
        ÚhandleQuery©ÚopCodeN)rè   r   r¶   ÚOP_QUERYr`   s    r   Útest_queryMessageReceivedz/DNSServerFactoryTests.test_queryMessageReceived   s!   € ð
 	×!Ñ! -´·±ÄCÇLÁLÔ1QÕRr   c                 ól   — | j                  dt        j                  t        j                  ¬«      «       y)z›
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_INVERSE} on to L{DNSServerFactory.handleInverseQuery}.
        ÚhandleInverseQueryrë   N)rè   r   r¶   Ú
OP_INVERSEr`   s    r   Ú test_inverseQueryMessageReceivedz6DNSServerFactoryTests.test_inverseQueryMessageReceived'  s$   € ð
 	×!Ñ!Ø ¤#§+¡+´S·^±^Ô"Dõ	
r   c                 ól   — | j                  dt        j                  t        j                  ¬«      «       y)z”
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_STATUS} on to L{DNSServerFactory.handleStatus}.
        ÚhandleStatusrë   N)rè   r   r¶   Ú	OP_STATUSr`   s    r   Útest_statusMessageReceivedz0DNSServerFactoryTests.test_statusMessageReceived0  ó!   € ð
 	×!Ñ! .´#·+±+ÄSÇ]Á]Ô2SÕTr   c                 ól   — | j                  dt        j                  t        j                  ¬«      «       y)z”
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_NOTIFY} on to L{DNSServerFactory.handleNotify}.
        ÚhandleNotifyrë   N)rè   r   r¶   Ú	OP_NOTIFYr`   s    r   Útest_notifyMessageReceivedz0DNSServerFactoryTests.test_notifyMessageReceived7  r÷   r   c                 ól   — | j                  dt        j                  t        j                  ¬«      «       y)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¶   Ú	OP_UPDATEr`   s    r   Útest_updateMessageReceivedz0DNSServerFactoryTests.test_updateMessageReceived>  s!   € ð 	×!Ñ! -´·±ÄCÇMÁMÔ1RÕSr   c                 óÄ  — t        «       t        «       }}t        j                  «       }|j                  |«       | j	                  |j
                  |g«       |j                  |«       | j	                  |j
                  ||g«       |j                  |«       | j	                  |j
                  |g«       |j                  |«       | j	                  |j
                  g «       y)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)ri   r	   r]   ÚconnectionMaderR   ÚconnectionsÚconnectionLost)r   ÚprotoAÚprotoBrž   s       r   Útest_connectionTrackingz-DNSServerFactoryTests.test_connectionTrackingG  s¸   € ô  ›¤6£8�ˆÜ×)Ñ)Ó+ˆØ×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨v¨hÔ7Ø×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨v°vÐ.>Ô?Ø×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨v¨hÔ7Ø×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨bÕ1r   c                 ó‚  — t        j                  «       }|j                  d«       |j                  d«       t        j                  «       }t        «       |_        | j                  t
        j                  |j                  |t        «       d¬«      }|j                  \  \  }}| j                  ||j                  d   «       y)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.comN©r#   r$   r%   r   )r   r¶   rÀ   r	   r]   r@   r^   rÐ   rC   rê   r=   r   rR   rå   )r   rW   r¥   rÓ   rE   r   s         r   Útest_handleQueryz&DNSServerFactoryTests.test_handleQueryX  s›   € ô �K‰K‹MˆØ	�
‰
Ð%Ô&Ø	�
‰
Ð%Ô&Ü×#Ñ#Ó%ˆÜ$Ó&ˆŒ
à×ÑÜ×*Ñ*Ø�M‰MØÜ!“^Øð ó 
ˆð Ÿ6™6Ñ‰ˆ�&Ø×Ñ˜ §	¡	¨!¡Õ-r   c                 ó¦  ‡‡	— t        j                  «       }t        j                  «       Š G ˆfd„d«      } |«       |_        g Š	ˆ	fd„}||_        t        j                  «       }|j                  d«       t        «       }t        «       }|j                  |||¬«       t        «       }‰j                  |«       | j                  ‰	||||fi fg«       y)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„Zy)úDDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolverc                 ó   •— ‰S r   r   ©r   r   r   Úds      €r   rE   zJDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolver.query{  ó   ø€ Ø�r   N©r   r   r   rE   ©r  s   €r   ÚFakeResolverr  z  ó   ø„ õr   r  c                  ó,   •— ‰j                  | |f«       y r   râ   )r   r   ÚgotResolverResponseArgss     €r   ÚfakeGotResolverResponsezODNSServerFactoryTests.test_handleQueryCallback.<locals>.fakeGotResolverResponse‚  s   ø€ Ø#×*Ñ*¨D°&¨>Õ:r   r  r	  N)r	   r]   r   ÚDeferredr^   ÚgotResolverResponser   r¶   rÀ   r=   ri   rê   ÚcallbackrR   )
r   r¥   r  r  rW   r¡   rÒ   ÚdummyResponser  r  s
           @@r   Útest_handleQueryCallbackz.DNSServerFactoryTests.test_handleQueryCallbackn  s¹   ù€ ô ×#Ñ#Ó%ˆä�N‰NÓˆ÷	ó 	ñ "“^ˆŒ
à"$Ðô	;ð !8ˆÔä�K‰K‹MˆØ	�
‰
Ð%Ô&Ü#“~ˆÜ“xˆà	�‰˜a¨,ÀˆÔMä›ˆØ	�
‰
�=Ô!à×ÑØ#Ø˜l¨A¨|Ð<¸bÐAÐBõ	
r   c                 óÌ  ‡‡	— t        j                  «       }t        j                  «       Š G ˆfd„d«      } |«       |_        g Š	ˆ	fd„}||_        t        j                  «       }|j                  d«       t        «       }t        «       }|j                  |||¬«       t        j                  t        «       «      }‰j                  |«       | j!                  ‰	||||fi fg«       y)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                   ó   •— e Zd Zˆ fd„Zy)úCDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolverc                 ó   •— ‰S r   r   r  s      €r   rE   zIDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolver.query£  r  r   Nr  r  s   €r   r  r   ¢  r  r   r  c                  ó,   •— ‰j                  | |f«       y r   râ   )r   r   ÚgotResolverErrorArgss     €r   ÚfakeGotResolverErrorzKDNSServerFactoryTests.test_handleQueryErrback.<locals>.fakeGotResolverErrorª  s   ø€ Ø ×'Ñ'¨¨v¨Õ7r   r  r	  N)r	   r]   r   r  r^   ÚgotResolverErrorr   r¶   rÀ   r=   ri   rê   r
   ÚFailurer3   ÚerrbackrR   )
r   r¥   r  r$  rW   r¡   rÒ   ÚstubFailurer  r#  s
           @@r   Útest_handleQueryErrbackz-DNSServerFactoryTests.test_handleQueryErrback–  sÂ   ù€ ô ×#Ñ#Ó%ˆä�N‰NÓˆ÷	ó 	ñ "“^ˆŒ
à!Ðô	8ð 2ˆÔä�K‰K‹MˆØ	�
‰
Ð%Ô&Ü#“~ˆÜ“xˆà	�‰˜a¨,ÀˆÔMä—o‘o¤i£kÓ2ˆØ	�	‰	�+Ôà×ÑØ  [°,ÀÀ<Ð$PÐRTÐ#UÐ"Võ	
r   c                 óš  — t        j                  «       }g }g }g }| j                  t        j                  |j
                  |||ft        «       t        j                  «       d¬«      }|j                  \  \  }}| j                  |j                  |«       | j                  |j                  |«       | j                  |j                  |«       y)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	   r]   rÐ   r5   r8   r  r   r¶   r   r˜   ÚanswersÚ	authorityÚ
additional)r   r¥   r,  r-  r.  rÓ   r#   r   s           r   Útest_gotResolverResponsez.DNSServerFactoryTests.test_gotResolverResponse½  s°   € ô ×#Ñ#Ó%ˆØˆØˆ	Øˆ
Ø×ÑÜ×1Ñ1Ø×!Ñ!Ø�i Ð,Ü$Ó&Ü—K‘K“MØð ó 
ˆð ŸV™VÑ‰
ˆ�Fà�‰�g—o‘o wÔ/Ø�‰�g×'Ñ'¨Ô3Ø�‰�g×(Ñ(¨*Õ5r   c           
      ó@  — t        «       }t        |_        t        j                  «       }d|_        | j                  t        |j                  g g g fd|d¬«      }| j                  dt        |t        j                  g g g ¬«      f|j                  |j                  f«       y)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  rR   ÚdictÚOKr   r   ©r   rž   ÚrequestrÓ   s       r   Ú0test_gotResolverResponseCallsResponseFromMessagezFDNSServerFactoryTests.test_gotResolverResponseCallsResponseFromMessageÕ  sŸ   € ô
 -Ó.ˆÜ'-ˆÔ$ä—+‘+“-ˆØ ˆÔà×ÑÜØ×'Ñ'Ø��RˆLØØØð ó 
ˆð 	×ÑàÜØ#ÜŸ&™&ØØ Ø!ôð	ð �V‰V�Q—X‘XÐõ	
r   c                 ó¤   — t        j                  «       }t        j                  dd¬«      }|j	                  |¬«      f}| j                  ||«       y)zŽ
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message which is a copy of the request message.
        F)ÚanswerÚrecAv©r#   N)r	   r]   r   r¶   r1  ÚassertIsNot©r   rž   r5  Úresponses       r   Ú"test_responseFromMessageNewMessagez8DNSServerFactoryTests.test_responseFromMessageNewMessageö  sH   € ô
 ×)Ñ)Ó+ˆÜ—+‘+ U°%Ô8ˆØ×0Ñ0¸Ð0ÓAÐCˆà×Ñ˜ (Õ+r   c                 ó0  — t        j                  «       }d|_        |j                  t	        j
                  d¬«      ¬«      }d|_        |j                  t	        j
                  d¬«      ¬«      }| j                  d|j                  |j                  f«       y)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)r9  r:  ©TFN)r	   r]   rŠ   r1  r   r¶   rR   r9  ©r   rž   Ú	response1Ú	response2s       r   Ú*test_responseFromMessageRecursionAvailablez@DNSServerFactoryTests.test_responseFromMessageRecursionAvailable  sw   € ô ×)Ñ)Ó+ˆØ!ˆÔØ×0Ñ0¼¿¹È5Ô9QÐ0ÓRˆ	Ø"ˆÔØ×0Ñ0¼¿¹È4Ô9PÐ0ÓQˆ	Ø×Ñ˜¨¯©¸)¿/¹/Ð(JÕKr   c                 óÒ   — t        j                  «       }t        j                  «       }d|_        |j                  |¬«      }| j                  |j                  |j                  «       y)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	   r]   r   r¶   rÍ   r1  rR   r<  s       r   Ú$test_responseFromMessageTimeReceivedz:DNSServerFactoryTests.test_responseFromMessageTimeReceived  sT   € ô ×)Ñ)Ó+ˆÜ—+‘+“-ˆØ#ˆÔØ×/Ñ/¸Ð/Ó@ˆà×Ñ˜×-Ñ-¨x×/DÑ/DÕEr   c                 óÒ   — t        j                  «       }t        j                  «       }d|_        |j                  |¬«      }| j                  |j                  |j                  «       y)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	   r]   r   r¶   ÚmaxSizer1  rR   r<  s       r   Útest_responseFromMessageMaxSizez5DNSServerFactoryTests.test_responseFromMessageMaxSize  sQ   € ô ×)Ñ)Ó+ˆÜ—+‘+“-ˆØˆŒØ×/Ñ/¸Ð/Ó@ˆà×Ñ˜Ÿ™¨(×*:Ñ*:Õ;r   c                 ót   — | j                  t        j                  t        j                  j
                  «       y)z{
        L{server.DNSServerFactory} has a C{_messageFactory} attribute which is
        L{dns.Message} by default.
        N)r˜   r   r¶   r	   r]   Ú_messageFactoryr`   s    r   Útest_messageFactoryz)DNSServerFactoryTests.test_messageFactory(  s"   € ð
 	�‰”c—k‘k¤6×#:Ñ#:×#JÑ#JÕKr   c           
      ó   — t        j                  «       }| j                  t        dt        «       t        j
                  «       }| j                  t        |j                  |t        j                  ¬«      }| j                  dt        |j                  |t        j                  |j                  d¬«      f|j                  |j                  f«       y)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.
        r1  ©r#   rÝ   r   F)ÚresponseConstructorr#   rÝ   r9  ÚauthN)r	   r]   rÌ   r   r   r¶   rÐ   r   r1  r3  rR   r2  rK  rŠ   r   r   r4  s       r   Ú+test_responseFromMessageCallsMessageFactoryzADNSServerFactoryTests.test_responseFromMessageCallsMessageFactory/  sª   € ô ×)Ñ)Ó+ˆØ�
‰
”3Ð.´Ô7ä—+‘+“-ˆØ×ÑÜ˜W×9Ñ9À7ÔRU×RXÑRXð ó 
ˆð 	×ÑàÜØ(/×(?Ñ(?Ø#ÜŸ&™&Ø!×,Ñ,Øôð	ð �V‰V�Q—X‘XÐõ	
r   c                 ód  — t        j                  «       }|j                  t        j                  «       t        j
                  d¬«      g¬«      }|j                  t        j                  «       t        j
                  d¬«      g¬«      }| j                  d|j                  |j                  f«       y)z¥
        L{server.DNSServerFactory._responseFromMessage} marks the response
        message as authoritative if any of the answer records are authoritative.
        T)rP  )r#   r,  Fr@  N)r	   r]   r1  r   r¶   ÚRRHeaderrR   rP  rA  s       r   Ú,test_responseFromMessageAuthoritativeMessagezBDNSServerFactoryTests.test_responseFromMessageAuthoritativeMessageL  s�   € ô
 ×)Ñ)Ó+ˆØ×0Ñ0Ü—K‘K“M¬C¯L©L¸dÔ,CÐ+Dð 1ó 
ˆ	ð ×0Ñ0Ü—K‘K“M¬C¯L©L¸eÔ,DÐ+Eð 1ó 
ˆ	ð 	×ÑØØ�^‰^˜YŸ^™^Ð,õ	
r   c           	      ó  — t        d¬«      }t        j                  «       g}t        j                  «       g}t        j                  «       g}t        | dg|j                  |||ft        «       t        j                  «       d¬«       y)zŒ
        L{server.DNSServerFactory.gotResolverResponse} logs the total number of
        records in the response if C{verbose > 0}.
        r¯   r’   zLookup found 3 recordsNr+  )r!   r   rS  rX   r  r=   r¶   )r   r¥   r,  r-  r.  s        r   Útest_gotResolverResponseLoggingz5DNSServerFactoryTests.test_gotResolverResponseLogging]  sm   € ô
 '¨qÔ1ˆÜ—<‘<“>Ð"ˆÜ—\‘\“^Ð$ˆ	Ü—l‘l“nÐ%ˆ
äØØ%Ð&Ø×!Ñ!Ø�i Ð,Ü!“^Ü—K‘K“MØö	
r   c                 ó  — t        t        «       g¬«      }t        j                  «       }|j	                  d«       t        j
                  «       g}g }g }| j                  t        j                  |j                  |||ft        «       |d¬«      }|j                  \  \  }\  }}	}
}| j                  |j                  j                  d«       | j                  ||«       | j                  |	|«       | j                  |
|«       y)z“
        L{server.DNSServerFactory.gotResolverResponse} caches the response if at
        least one cache was provided in the constructor.
        rn   s   example.comNr+  )r!   rG   r   r¶   rÀ   rS  rÐ   rJ   r  r=   r   rR   r½   r˜   )r   r¥   rW   ÚexpectedAnswersÚexpectedAuthorityÚexpectedAdditionalrÓ   rE   r,  r-  r.  r   s               r   Útest_gotResolverResponseCachingz5DNSServerFactoryTests.test_gotResolverResponseCachingq  sâ   € ô
 '¬|«~Ð.>Ô?ˆä�K‰K‹MˆØ	�
‰
�>Ô"ÜŸ<™<›>Ð*ˆØÐØÐà×ÑÜ×-Ñ-Ø×!Ñ!ØÐ/Ð1CÐDÜ!“^ØØð ó 
ˆð =>¿F¹FÑ9Ñ1ˆÑ0�˜) Z°6à×Ñ˜Ÿ™Ÿ™¨.Ô9Ø�‰�g˜Ô/Ø�‰�iÐ!2Ô3Ø�‰�jÐ"4Õ5r   c                 ó~  — t        «       }t        |_        t        j                  «       }d|_        | j                  t        |j                  t        j                  t        j                  «       «      d|d¬«      }| j                  dt        |t        j                  ¬«      f|j                   |j"                  f«       y)z“
        L{server.DNSServerFactory.gotResolverError} calls
        L{server.DNSServerFactory._responseFromMessage} to generate a response.
        r¯   Nr+  r   rN  )r!   r   r1  r   r¶   rÍ   rÐ   r   r%  r
   r&  r   ÚDomainErrorrR   r2  ÚENAMEr   r   r4  s       r   Ú-test_gotResolverErrorCallsResponseFromMessagezCDNSServerFactoryTests.test_gotResolverErrorCallsResponseFromMessage�  s˜   € ô
 -Ó.ˆÜ'-ˆÔ$ä—+‘+“-ˆØ ˆÔà×ÑÜØ×$Ñ$Ü�O‰OœE×-Ñ-Ó/Ó0ØØØð ó 
ˆð 	×ÑØ”˜g¬S¯Y©YÔ7Ð8¸1¿6¹6À1Ç8Á8Ð:Lõ	
r   c                 ó>  — t        j                  «       }| j                  t        j                  |j
                  t        j                  |«      t        «       t        j                  «       d¬«      }|j                  \  \  }}| j                  |j                  |«       y)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	   r]   rÐ   r5   r8   r%  r
   r&  r   r¶   r   rR   rÝ   )r   ÚresponseErrorÚexpectedMessageCoder¥   rÓ   r#   r   s          r   Ú_assertMessageRcodeForErrorz1DNSServerFactoryTests._assertMessageRcodeForError¤  s~   € ô  ×#Ñ#Ó%ˆØ×ÑÜ×1Ñ1Ø×ÑÜ�O‰O˜MÓ*Ü$Ó&Ü—K‘K“MØð ó 
ˆð ŸV™VÑ‰
ˆ�Fà×Ñ˜Ÿ™Ð(;Õ<r   c                 óh   — | j                  t        j                  «       t        j                  «       y)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)rc  r   r]  r   r^  r`   s    r   Ú test_gotResolverErrorDomainErrorz6DNSServerFactoryTests.test_gotResolverErrorDomainErrorÁ  s!   € ð
 	×(Ñ(¬×):Ñ):Ó)<¼c¿i¹iÕHr   c                 óh   — | j                  t        j                  «       t        j                  «       y)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)rc  r   ÚAuthoritativeDomainErrorr   r^  r`   s    r   Ú-test_gotResolverErrorAuthoritativeDomainErrorzCDNSServerFactoryTests.test_gotResolverErrorAuthoritativeDomainErrorÈ  s!   € ð 	×(Ñ(¬×)GÑ)GÓ)IÌ3Ï9É9ÕUr   c                 ó´   — | j                  t        «       t        j                  «       | j	                  t        «      }| j                  t        |«      d«       y)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)rc  ÚKeyErrorr   ÚESERVERÚflushLoggedErrorsrR   Úlen)r   rÓ   s     r   Útest_gotResolverErrorOtherErrorz5DNSServerFactoryTests.test_gotResolverErrorOtherErrorÐ  s>   € ð 	×(Ñ(¬«´S·[±[ÔAØ×"Ñ"¤8Ó,ˆØ×Ñœ˜Q› Õ#r   c           	      óÔ   — t        d¬«      }t        | dg|j                  t        j                  t        j                  «       «      t        «       t        j                  «       d¬«       y)zZ
        L{server.DNSServerFactory.gotResolver} logs a message if C{verbose > 0}.
        r¯   r’   zLookup failedNr+  )
r!   rX   r%  r
   r&  r   r]  r=   r   r¶   r¬   s     r   Útest_gotResolverErrorLoggingz2DNSServerFactoryTests.test_gotResolverErrorLoggingÚ  sN   € ô '¨qÔ1ˆÜØØÐØ×ÑÜ�O‰OœE×-Ñ-Ó/Ó0Ü!“^Ü—K‘K“MØö	
r   c                 óÎ  ‡— t        j                  «       }g Šˆfd„|_        t        j                  dd¬«      }t        «       t        «       g|_        t        «       t        «       g|_        t        «       t        «       g|_        |j                  t        j                  t        j                  «       «      d|d¬«       | j                  t        j                  dd¬«      g‰«       y)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                 ó&   •— ‰j                  |«      S r   râ   ©r$   r=  r%   Ú	responsess      €r   rË   zUDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributes.<locals>.<lambda>ñ  ó   ø€ À	×@PÑ@PØóA
€ r   T©ÚauthenticDataÚcheckingDisabledNr+  é   ©rÝ   r8  )r	   r]   r(   r   r¶   ri   r,  r-  r.  r%  r
   r&  r   r]  rR   ©r   rž   r5  rt  s      @r   Ú-test_gotResolverErrorResetsResponseAttributeszCDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributesé  s·   ø€ ô ×)Ñ)Ó+ˆØˆ	ó
ˆÔô —+‘+¨DÀ4ÔHˆÜ!›8¤V£XÐ.ˆŒÜ#›X¤v£xÐ0ˆÔÜ$›h¬«Ð1ˆÔØ× Ñ Ü�O‰OœE×-Ñ-Ó/Ó0ØØØð	 	!ô 	
ð 	×Ñœ#Ÿ+™+¨A°dÔ;Ð<¸iÕHr   c                 óŠ  ‡— t        j                  «       }g Šˆfd„|_        t        j                  dd¬«      }t        «       t        «       g|_        t        «       t        «       g|_        t        «       t        «       g|_        |j                  g g g fd|d¬«       | j                  t        j                  dd¬«      g‰«       y)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                 ó&   •— ‰j                  |«      S r   râ   rs  s      €r   rË   zXDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes.<locals>.<lambda>
  ru  r   Trv  Nr+  r   rz  )r	   r]   r(   r   r¶   ri   r,  r-  r.  r  rR   r{  s      @r   Ú0test_gotResolverResponseResetsResponseAttributeszFDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes  s¨   ø€ ô ×)Ñ)Ó+ˆØˆ	ó
ˆÔô —+‘+¨DÀ4ÔHˆÜ!›8¤V£XÐ.ˆŒÜ#›X¤v£xÐ0ˆÔÜ$›h¬«Ð1ˆÔà×#Ñ#Ø��RˆL 4°À$ð 	$ô 	
ð 	×Ñœ#Ÿ+™+¨A°dÔ;Ð<¸iÕHr   c                 ó>  — t        j                  «       }t        «       }t        j                  «       }| j                  t        j                  |j                  t        «       ||¬«      }|j                  \  }}| j                  |||f«       | j                  |i «       y)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¶   ri   r	   r]   rÐ   r5   r8   r(   r   rR   )r   rW   rÒ   r¥   rÓ   r   r   s          r   Útest_sendReplyWithAddressz/DNSServerFactoryTests.test_sendReplyWithAddress  s‰   € ô �K‰K‹MˆÜ“xˆÜ×#Ñ#Ó%ˆØ×ÑÜ×1Ñ1Ø�K‰KÜ$Ó&ØØ ð ó 
ˆð —v‘v‰ˆˆfØ×Ñ˜  <Ð0Ô1Ø×Ñ˜ Õ$r   c                 ó(  — t        j                  «       }t        j                  «       }| j	                  t
        j                  |j                  t        «       |d¬«      }|j                  \  }}| j                  ||f«       | j                  |i «       y)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	   r]   rÐ   r5   r8   r(   r   rR   )r   rW   r¥   rÓ   r   r   s         r   Útest_sendReplyWithoutAddressz2DNSServerFactoryTests.test_sendReplyWithoutAddress,  s   € ô �K‰K‹MˆÜ×#Ñ#Ó%ˆØ×ÑÜ×1Ñ1Ø�K‰KÜ$Ó&ØØð ó 
ˆð —v‘v‰ˆˆfØ×Ñ˜ ˜tÔ$Ø×Ñ˜ Õ$r   c                 óô   — | j                  t        j                  dd„ «       t        j                  «       }d|_        t        j                  d¬«      }t        | ddg|j                  t        «       |d¬	«       y)
z…
        If L{server.DNSServerFactory.sendReply} logs a "no answers" message if
        the supplied message has no answers.
        rÈ   c                   ó   — y©Ni‚Q r   r   r   r   rË   zFDNSServerFactoryTests.test_sendReplyLoggingNoAnswers.<locals>.<lambda>D  r)   r   é�Q rÅ   r’   zReplying with no answersú Processed query in 1.000 secondsNr+  )
rÌ   r	   rÈ   r   r¶   rÍ   r]   rX   r(   r=   r¸   s      r   Útest_sendReplyLoggingNoAnswersz4DNSServerFactoryTests.test_sendReplyLoggingNoAnswers?  s`   € ð
 	�
‰
”6—;‘; ©Ô6Ü�K‰K‹MˆØˆŒÜ×#Ñ#¨AÔ.ˆÜØØ'Ð)KÐLØ�K‰KÜ!“^ØØö	
r   c                 ó€  — | j                  t        j                  dd„ «       t        j                  «       }|j
                  j                  t        j                  t        j                  d«      ¬«      «       |j                  j                  t        j                  t        j                  d«      ¬«      «       |j                  j                  t        j                  t        j                  d«      ¬«      «       d|_        t        j                  d¬«      }t        | g d¢|j                  t        «       |d	¬
«       y	)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                   ó   — yr†  r   r   r   r   rË   zHDNSServerFactoryTests.test_sendReplyLoggingWithAnswers.<locals>.<lambda>W  r)   r   z	127.0.0.1)Úpayloadr‡  rÅ   r’   )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,  rO   rS  ÚRecord_Ar-  r.  rÍ   r]   rX   r(   r=   r¸   s      r   Ú test_sendReplyLoggingWithAnswersz6DNSServerFactoryTests.test_sendReplyLoggingWithAnswersQ  sÊ   € ð 	�
‰
”6—;‘; ©Ô6Ü�K‰K‹MˆØ	�	‰	×ÑœŸ™¬c¯l©l¸;Ó.GÔHÔIØ	�‰×Ñœ3Ÿ<™<´·±¸[Ó0IÔJÔKØ	�‰×ÑœCŸL™L´·±¸kÓ1JÔKÔLØˆŒÜ×#Ñ#¨AÔ.ˆÜØòð �K‰KÜ!“^ØØö	
r   c                 ó2  — t        j                  «       }| j                  t        j                  |j
                  t        j                  «       t        «       d¬«      }|j                  \  \  }}| j                  |j                  t        j                  «       y)z—
        L{server.DNSServerFactory.handleInverseQuery} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr	  )r	   r]   rÐ   r5   r8   rð   r   r¶   r   rR   rÝ   ÚENOTIMP©r   r¥   rÓ   r#   r   s        r   Útest_handleInverseQueryz-DNSServerFactoryTests.test_handleInverseQueryl  su   € ô
 ×#Ñ#Ó%ˆØ×ÑÜ×1Ñ1Ø× Ñ Ü—K‘K“MÜ$Ó&Øð ó 
ˆð ŸV™VÑ‰
ˆ�Fà×Ñ˜Ÿ™¬¯©Õ4r   c                 óˆ   — t        d¬«      }t        | dg|j                  t        j                  «       t        «       d¬«       y)zz
        L{server.DNSServerFactory.handleInverseQuery} logs the message origin
        address if C{verbose > 0}.
        r¯   r’   zInverse query from ('::1', 53)©z::1r³   r	  N)r!   rX   rð   r   r¶   r=   r¬   s     r   Útest_handleInverseQueryLoggingz4DNSServerFactoryTests.test_handleInverseQueryLogging}  s9   € ô
 '¨qÔ1ˆÜØØ-Ð.Ø× Ñ Ü—K‘K“MÜ!“^Øö	
r   c                 ó2  — t        j                  «       }| j                  t        j                  |j
                  t        j                  «       t        «       d¬«      }|j                  \  \  }}| j                  |j                  t        j                  «       y)z‘
        L{server.DNSServerFactory.handleStatus} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr	  )r	   r]   rÐ   r5   r8   rô   r   r¶   r   rR   rÝ   r�  r‘  s        r   Útest_handleStatusz'DNSServerFactoryTests.test_handleStatusŒ  ós   € ô
 ×#Ñ#Ó%ˆØ×ÑÜ×1Ñ1Ø�N‰NÜ—K‘K“MÜ$Ó&Øð ó 
ˆð ŸV™VÑ‰
ˆ�Fà×Ñ˜Ÿ™¬¯©Õ4r   c                 óˆ   — t        d¬«      }t        | dg|j                  t        j                  «       t        «       d¬«       y)zt
        L{server.DNSServerFactory.handleStatus} logs the message origin address
        if C{verbose > 0}.
        r¯   r’   zStatus request from ('::1', 53)r”  r	  N)r!   rX   rô   r   r¶   r=   r¬   s     r   Útest_handleStatusLoggingz.DNSServerFactoryTests.test_handleStatusLogging�  ó7   € ô
 '¨qÔ1ˆÜØØ.Ð/Ø�N‰NÜ—K‘K“MÜ!“^Øö	
r   c                 ó2  — t        j                  «       }| j                  t        j                  |j
                  t        j                  «       t        «       d¬«      }|j                  \  \  }}| j                  |j                  t        j                  «       y)z‘
        L{server.DNSServerFactory.handleNotify} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr	  )r	   r]   rÐ   r5   r8   rù   r   r¶   r   rR   rÝ   r�  r‘  s        r   Útest_handleNotifyz'DNSServerFactoryTests.test_handleNotify¬  r˜  r   c                 óˆ   — t        d¬«      }t        | dg|j                  t        j                  «       t        «       d¬«       y)zt
        L{server.DNSServerFactory.handleNotify} logs the message origin address
        if C{verbose > 0}.
        r¯   r’   zNotify message from ('::1', 53)r”  r	  N)r!   rX   rù   r   r¶   r=   r¬   s     r   Útest_handleNotifyLoggingz.DNSServerFactoryTests.test_handleNotifyLogging½  r›  r   c                 ó2  — t        j                  «       }| j                  t        j                  |j
                  t        j                  «       t        «       d¬«      }|j                  \  \  }}| j                  |j                  t        j                  «       y)z�
        L{server.DNSServerFactory.handleOther} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr	  )r	   r]   rÐ   r5   r8   rý   r   r¶   r   rR   rÝ   r�  r‘  s        r   Útest_handleOtherz&DNSServerFactoryTests.test_handleOtherÌ  ss   € ô
 ×#Ñ#Ó%ˆØ×ÑÜ×1Ñ1Ø�M‰MÜ—K‘K“MÜ$Ó&Øð ó 
ˆð ŸV™VÑ‰
ˆ�Fà×Ñ˜Ÿ™¬¯©Õ4r   c                 óˆ   — t        d¬«      }t        | dg|j                  t        j                  «       t        «       d¬«       y)zs
        L{server.DNSServerFactory.handleOther} logs the message origin address
        if C{verbose > 0}.
        r¯   r’   z$Unknown op code (0) from ('::1', 53)r”  r	  N)r!   rX   rý   r   r¶   r=   r¬   s     r   Útest_handleOtherLoggingz-DNSServerFactoryTests.test_handleOtherLoggingÝ  s7   € ô
 '¨qÔ1ˆÜØØ3Ð4Ø�M‰MÜ—K‘K“MÜ!“^Øö	
r   N)Dr   r   r   r   ra   re   rl   rp   rt   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/  r6  r>  rD  rF  rI  rL  rQ  rT  rV  r[  r_  rc  re  rh  rn  rp  r|  r  r�  rƒ  r‰  rŽ  r’  r•  r—  rš  r�  rŸ  r¡  r£  r   r   r   rZ   rZ   Û   s^  „ ñòYòKò

ò

ò

ò
ò.;ò	
ò?òSò<òGòPòIòJò2=òFò
ò"
ò&
ò,,ò%ò,6ò:Hò8Sò
òUòUòTò2ò".ò,&
òP%
òN6ò0
òB	,òLòFò<òLò
ò:
ò"
ò(6ò8
ò.=ò:IòVò$ò
òIò0Iò.%ò(%ò&
ò$
ò65ò"
ò5ò"
ò5ò"
ò5ó"
r   rZ   N)r   Úzope.interface.verifyr   Útwisted.internetr   Útwisted.internet.interfacesr   Útwisted.namesr   r   r   r	   Útwisted.pythonr
   r   Útwisted.trialr   r3   r   r   r]   r!   r+   r5   r=   r@   rG   rX   ÚTestCaserZ   r   r   r   ú<module>r«     sš   ðñõ .å "Ý 8ß 5Ó 5ß 'Ý "ô�iô ò(ô ×!8Ñ!8ô ôB5˜f×5Ñ5ô 5÷:7ñ 7÷0ñ ÷"0ñ 0÷06ñ 6ò0Vô@O
˜H×-Ñ-õ O
r   