+
    üÐjÈ¢  ã                   óR  € R t ^ RIHt ^ RIHt ^ RIHt ^ RIHtH	t	H
t
Ht ^ RIHtHt ^ RIHt  ! R R]4      tR	 t ! R
 R]P(                  4      t ! R R]P(                  4      t ! R R4      t ! R R4      t ! R R4      t ! R R4      tR t ! R R]P8                  4      tR# )z)
Test cases for L{twisted.names.server}.
)ÚverifyClass)Údefer)ÚIProtocolFactory)ÚdnsÚerrorÚresolveÚserver)ÚfailureÚlog)Úunittestc                   ó*   a € ] tR t^t o RtR tRtV tR# )ÚRaisedArgumentsz<
An exception containing the arguments raised by L{raiser}.
c                ó   € Wn         W n        R # ©N©ÚargsÚkwargs©Úselfr   r   s   &&&Ú@/usr/lib/python3/dist-packages/twisted/names/test/test_server.pyÚ__init__ÚRaisedArguments.__init__   s   € ØŒ	ØŽó    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r      s   ø‡ € ñ÷ð r   r   c                 ó   € \        W4      h)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                   ó0   a € ] tR t^$t o RtR tR tRtV tR# )ÚNoResponseDNSServerFactoryzú
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                ó   € R# )zæ
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}
F© )r   ÚmessageÚprotocolÚaddresss   &&&&r   Ú
allowQueryÚ%NoResponseDNSServerFactory.allowQuery.   s   € ñ r   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*   s   &&&&r   Ú	sendReplyÚ$NoResponseDNSServerFactory.sendReply;   ó   ‚ r   r'   N)	r   r   r   r   r   r+   r.   r   r   r    s   @r   r%   r%   $   s   ø‡ € ñò÷ð r   r%   c                   ó@   a € ] tR t^Et o Rt ! R R]4      tR tRtV t	R# )Ú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                   ó   € ] tR t^NtRtRtR# )Ú+RaisingDNSServerFactory.AllowQueryArgumentsú7
Contains positional and keyword arguments in C{args}.
r'   N©r   r   r   r   r   r   r'   r   r   ÚAllowQueryArgumentsr4   N   ó   † õ	r   r7   c                ó$   € V P                  W4      h)a  
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}
)r7   r   s   &*,r   r+   Ú"RaisingDNSServerFactory.allowQueryS   s   € ð ×&Ñ& tÓ4Ð4r   r'   N)
r   r   r   r   r   Ú	Exceptionr7   r+   r   r   r    s   @r   r2   r2   E   s    ø‡ € ñô˜iô ÷
5ð 5r   r2   c                   ó@   a € ] tR t^bt o Rt ! R R]4      tR tRtV t	R# )ÚRaisingProtocolza
A partial fake L{IProtocol} whose methods raise an exception containing the
supplied arguments.
c                   ó   € ] tR t^htRtRtR# )Ú%RaisingProtocol.WriteMessageArgumentsr5   r'   Nr6   r'   r   r   ÚWriteMessageArgumentsr?   h   r8   r   r@   c                ó$   € V P                  W4      h©z‹
Raises the supplied arguments.

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

@param kwargs: Keyword args
@type kwargs: L{dict}
)r@   r   s   &*,r   ÚwriteMessageÚRaisingProtocol.writeMessagem   s   € ð ×(Ñ(¨Ó6Ð6r   r'   N)
r   r   r   r   r   r;   r@   rC   r   r   r    s   @r   r=   r=   b   s    ø‡ € ñô
 	ô ÷

7ð 
7r   r=   c                   ó*   a € ] tR t^zt o RtR tRtV tR# )ÚNoopProtocolzL
A partial fake L{dns.DNSProtocolMixin} with a noop L{writeMessage} method.
c                ó   € 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   s   &*,r   rC   ÚNoopProtocol.writeMessage   r0   r   r'   N)r   r   r   r   r   rC   r   r   r    s   @r   rF   rF   z   s   ø‡ € ñ÷	ð 	r   rF   c                   ó@   a € ] tR t^‹t o Rt ! R R]4      tR tRtV t	R# )ÚRaisingResolverza
A partial fake L{IResolver} whose methods raise an exception containing the
supplied arguments.
c                   ó   € ] tR t^‘tRtRtR# )ÚRaisingResolver.QueryArgumentsr5   r'   Nr6   r'   r   r   ÚQueryArgumentsrL   ‘   r8   r   rM   c                ó$   € V P                  W4      hrB   )rM   r   s   &*,r   ÚqueryÚRaisingResolver.query–   s   € ð ×!Ñ! $Ó/Ð/r   r'   N)
r   r   r   r   r   r;   rM   rO   r   r   r    s   @r   rJ   rJ   ‹   s    ø‡ € ñô
˜ô ÷

0ð 
0r   rJ   c                   ó@   a € ] tR t^£t o Rt ! R R]4      tR tRtV t	R# )ÚRaisingCachezq
A partial fake L{twisted.names.cache.Cache} whose methods raise an exception
containing the supplied arguments.
c                   ó   € ] tR t^©tRtRtR# )Ú!RaisingCache.CacheResultArgumentsr5   r'   Nr6   r'   r   r   ÚCacheResultArgumentsrT   ©   r8   r   rU   c                ó$   € V P                  W4      hrB   )rU   r   s   &*,r   ÚcacheResultÚRaisingCache.cacheResult®   s   € ð ×'Ñ'¨Ó5Ð5r   r'   N)
r   r   r   r   r   r;   rU   rW   r   r   r    s   @r   rR   rR   £   s    ø‡ € ñô
˜yô ÷

6ð 
6r   rR   c                ó  € . p\         P                  ! VP                  4       V P                  \         P                  VP                  4       V! V/ VB  T P                  V Uu. uF  qfR,          ^ ,          NK  	  upV4       R# u upi )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(   N)r
   ÚaddObserverÚappendÚ
addCleanupÚremoveObserverÚassertEqual)ÚtestCaseÚexpectedMessagesÚcallabler   r   ÚloggedMessagesÚms   &&&*,  r   ÚassertLogMessagerd   »   so   € ð. €NÜ‡O‚O�N×)Ñ)Ô*Ø×Ñœ×*Ñ*¨N×,AÑ,AÔBáˆdÐ�fÒà×Ñ±>ÓB±>¨a˜I�, qŸ/˜/±>ÑBÐDTÖUùÒBs   Á$Bc                   ó¤  a € ] tR t^Ût o RtR tR tR tR tR t	R t
R tR	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR t R t!R t"R  t#R! t$R" t%R# t&R$ t'R% t(R& t)R' t*R( t+R) t,R* t-R+ t.R, t/R- t0R. t1R/ t2R0 t3R1 t4R2 t5R3 t6R4 t7R5 t8R6 t9R7 t:R8 t;R9 t<R: t=R; t>R< t?R= t@R> tAR? tBR@ tCRA tDRBtEV tFRC# )DÚDNSServerFactoryTestsz'
Tests for L{server.DNSServerFactory}.
c                ó€   € V P                  \        P                  ! 4       P                  \        P
                  4       R# )zL
L{server.DNSServerFactory.resolver} is a L{resolve.ResolverChain}
instance
N)ÚassertIsInstancer   ÚDNSServerFactoryÚresolverr   ÚResolverChain©r   s   &r   Útest_resolverTypeÚ'DNSServerFactoryTests.test_resolverTypeà   s)   € ð
 	×Ñœf×5Ò5Ó7×@Ñ@Ä'×BWÑBWÖXr   c                óx   € V P                  \        P                  ! 4       P                  P                  . 4       R# )zV
L{server.DNSServerFactory.resolver} is an empty L{resolve.ResolverChain}
by default.
N©r^   r   ri   rj   Ú	resolversrl   s   &r   Útest_resolverDefaultEmptyÚ/DNSServerFactoryTests.test_resolverDefaultEmptyç   s)   € ð
 	×Ñœ×0Ò0Ó2×;Ñ;×EÑEÀrÖJr   c                ó”   € \        4       pV P                  \        P                  ! V.R7      P                  P
                  V.4       R# )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   ri   rj   rq   ©r   ÚdummyResolvers   & r   Útest_authoritiesÚ&DNSServerFactoryTests.test_authoritiesî   s:   € ô ›ˆØ×ÑÜ×#Ò#°°Ô@×IÑI×SÑSØˆOö	
r   c                ó”   € \        4       pV P                  \        P                  ! V.R7      P                  P
                  V.4       R# )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}.
©ÚcachesNrv   rx   s   & r   Útest_cachesÚ!DNSServerFactoryTests.test_cachesú   s:   € ô ›ˆØ×ÑÜ×#Ò#¨M¨?Ô;×DÑD×NÑNØˆOö	
r   c                ó”   € \        4       pV P                  \        P                  ! V.R7      P                  P
                  V.4       R# )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}.
©ÚclientsNrv   rx   s   & r   Útest_clientsÚ"DNSServerFactoryTests.test_clients  s:   € ô ›ˆØ×ÑÜ×#Ò#¨]¨OÔ<×EÑE×OÑOØˆOö	
r   c                óÆ   €  ! R R4      p ! R R4      p ! R R4      pV P                  \        P                  ! V.V.V.R7      P                  P                  WV.4       R# )	zb
L{server.DNSServerFactory.resolver} contains an ordered list of
authorities, caches and clients.
c                   ó   € ] tR tRtRtR# )Ú@DNSServerFactoryTests.test_resolverOrder.<locals>.DummyAuthorityi  r'   N©r   r   r   r   r   r'   r   r   ÚDummyAuthorityrˆ     ó   † Ûr   rŠ   c                   ó   € ] tR tRtRtR# )Ú<DNSServerFactoryTests.test_resolverOrder.<locals>.DummyCachei  r'   Nr‰   r'   r   r   Ú
DummyCacher�     r‹   r   rŽ   c                   ó   € ] tR tRtRtR# )Ú=DNSServerFactoryTests.test_resolverOrder.<locals>.DummyClienti  r'   Nr‰   r'   r   r   ÚDummyClientr�     r‹   r   r‘   )ru   r~   rƒ   Nrp   )r   rŠ   rŽ   r‘   s   &   r   Útest_resolverOrderÚ(DNSServerFactoryTests.test_resolverOrder  s]   € ÷	ñ 	÷	ñ 	÷	ñ 	ð 	×ÑÜ×#Ò#Ø+Ð,°j°\ÈKÈ=ôç‰h—y‘yØ¨Ð5ö		
r   c                ób   € V P                  \        P                  ! 4       P                  4       R# )z9
L{server.DNSServerFactory.cache} is L{None} by default.
N)ÚassertIsNoner   ri   Úcacherl   s   &r   Útest_cacheDefaultÚ'DNSServerFactoryTests.test_cacheDefault)  s!   € ð 	×Ñœ&×1Ò1Ó3×9Ñ9Ö:r   c                ó�   € \        4       pV P                  \        P                  ! \        4       V.R7      P                  V4       R# )zx
L{server.DNSServerFactory.__init__} assigns the last object in the
C{caches} list to L{server.DNSServerFactory.cache}.
r}   N)rw   r^   r   ri   r–   rx   s   & r   Útest_cacheOverrideÚ(DNSServerFactoryTests.test_cacheOverride/  s7   € ô
 ›ˆØ×ÑÜ×#Ò#¬F«H°mÐ+DÔE×KÑKØö	
r   c                ób   € V P                  \        P                  ! 4       P                  4       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   ri   Ú
canRecurserl   s   &r   Útest_canRecurseDefaultÚ,DNSServerFactoryTests.test_canRecurseDefault:  s!   € ð 	×Ñœ×0Ò0Ó2×=Ñ=Ö>r   c                ój   € V P                  \        P                  ! R.R7      P                  R4       R# )zf
L{server.DNSServerFactory.__init__} sets C{canRecurse} to L{True} if it
is supplied with C{clients}.
Nr‚   T)r^   r   ri   rž   rl   s   &r   Útest_canRecurseOverrideÚ-DNSServerFactoryTests.test_canRecurseOverrideB  s'   € ð
 	×Ñœ×0Ò0¸$¸Ô@×KÑKÈTÖRr   c                ób   € V P                  \        P                  ! 4       P                  4       R# )z:
L{server.DNSServerFactory.verbose} defaults to L{False}.
N)r�   r   ri   Úverboserl   s   &r   Útest_verboseDefaultÚ)DNSServerFactoryTests.test_verboseDefaultI  s!   € ð 	×Ñœ×0Ò0Ó2×:Ñ:Ö;r   c                óf   € V P                  \        P                  ! RR7      P                  4       R# )zw
L{server.DNSServerFactory.__init__} accepts a C{verbose} argument which
overrides L{server.DNSServerFactory.verbose}.
T©r¥   N)Ú
assertTruer   ri   r¥   rl   s   &r   Útest_verboseOverrideÚ*DNSServerFactoryTests.test_verboseOverrideO  s!   € ð
 	�‰œ×/Ò/¸Ô=×EÑEÖFr   c                ó`   € V P                  \        \        \        P                  4      4       R# )z<
L{server.DNSServerFactory} implements L{IProtocolFactory}.
N)rª   r   r   r   ri   rl   s   &r   Útest_interfaceÚ$DNSServerFactoryTests.test_interfaceV  s   € ð 	�‰œÔ$4´f×6MÑ6MÓNÖOr   c                óv   € V P                  \        P                  P                  \        P
                  4       R# )zE
L{server.DNSServerFactory.protocol} defaults to L{dns.DNSProtocol}.
N)ÚassertIsr   ri   r)   r   ÚDNSProtocolrl   s   &r   Útest_defaultProtocolÚ*DNSServerFactoryTests.test_defaultProtocol\  s"   € ð 	�‰”f×-Ñ-×6Ñ6¼¿¹ÖHr   c                óè   a€  ! R R4      pV! 4       oV3R lp\         P                  ! 4       pW#n        VP                  RR7      pV P	                  SV3/ 3WDP
                  VP                  34       R# )z“
L{server.DNSServerFactory.buildProtocol} builds a protocol by calling
L{server.DNSServerFactory.protocol} with its self as a positional
argument.
c                   ó"   € ] tR tRtRtRtRtRtR# )ÚNDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.FakeProtocolii  Nr'   )r   r   r   r   Úfactoryr   r   r   r'   r   r   ÚFakeProtocolr·   i  s   † ØˆGØˆDØŒFr   r¹   c                  ó$   <€ V Sn         VSn        S# r   r   )r   r   ÚstubProtocols   *,€r   ÚfakeProtocolFactoryÚUDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.fakeProtocolFactoryp  s   ø€ Ø $ˆLÔØ"(ˆLÔØÐr   N)Úaddr)r   ri   r)   ÚbuildProtocolr^   r   r   )r   r¹   r¼   ÚfÚpr»   s   &    @r   Ú"test_buildProtocolProtocolOverrideÚ8DNSServerFactoryTests.test_buildProtocolProtocolOverrideb  sf   ø€ ÷	ñ 	ñ
 $“~ˆõ	 ô
 ×#Ò#Ó%ˆØ(Œ
Ø�O‰O ˆOÓ&ˆà×Ñ˜,¨¨¨bÐ1°A·v±v¸q¿x¹xÐ3HÖIr   c                ó`   € \         P                  ! 4       p\        V . VP                  R4       R# )zU
L{server.DNSServerFactory._verboseLog} does not log messages unless
C{verbose > 0}.
úFoo BarN©r   ri   rd   Ú_verboseLog©r   rÀ   s   & r   Útest_verboseLogQuietÚ*DNSServerFactoryTests.test_verboseLogQuiet{  s$   € ô
 ×#Ò#Ó%ˆÜ˜˜r 1§=¡=°)Ö<r   c                óf   € \         P                  ! ^R7      p\        V R.VP                  R4       R# )zJ
L{server.DNSServerFactory._verboseLog} logs a message if C{verbose > 0}.
r©   rÅ   NrÆ   rÈ   s   & r   Útest_verboseLogVerboseÚ,DNSServerFactoryTests.test_verboseLogVerboseƒ  s(   € ô ×#Ò#¨AÔ.ˆÜ˜ 	˜{¨A¯M©M¸9ÖEr   c           	     ó€   € \         P                  ! 4       p\        ^R7      p\        V R.VP                  VRRR7       R# )z}
L{server.DNSServerFactory.messageReceived} logs about an empty query if
the message had no queries and C{verbose} is C{>0}.
r©   z$Empty query from ('192.0.2.100', 53)N©r(   Úprotor*   ©z192.0.2.100é5   )r   ÚMessager%   rd   ÚmessageReceived©r   rc   rÀ   s   &  r   Ú"test_messageReceivedLoggingNoQueryÚ8DNSServerFactoryTests.test_messageReceivedLoggingNoQueryŠ  s<   € ô
 �KŠK‹MˆÜ&¨qÔ1ˆäØØ3Ð4Ø×ÑØØØ'÷	
r   c           	     ó  € \         P                  ! 4       pVP                  R\         P                  R7       VP                  R\         P                  R7       \        ^R7      p\        V R.VP                  VRRR7       R# )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©   z&MX AAAA query from ('192.0.2.100', 53)NrÏ   rÑ   ©r   rÓ   ÚaddQueryÚMXÚAAAAr%   rd   rÔ   rÕ   s   &  r   Útest_messageReceivedLogging1Ú2DNSServerFactoryTests.test_messageReceivedLogging1›  sd   € ô
 �KŠK‹MˆØ	�
‰
˜¬C¯F©Fˆ
Ô3Ø	�
‰
˜¬C¯H©Hˆ
Ô5Ü&¨qÔ1ˆäØØ5Ð6Ø×ÑØØØ'÷	
r   c           	     ó  € \         P                  ! 4       pVP                  R\         P                  R7       VP                  R\         P                  R7       \        ^R7      p\        V R.VP                  VRRR7       R# )zv
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_messageReceivedLogging2Ú2DNSServerFactoryTests.test_messageReceivedLogging2®  sk   € ô
 �KŠK‹MˆØ	�
‰
˜¬C¯F©Fˆ
Ô3Ø	�
‰
˜¬C¯H©Hˆ
Ô5Ü&¨qÔ1ˆäØðMðð ×ÑØØØ'÷
	
r   c                ó  a€ \         P                  ! 4       p\        4       p\        4       oV P	                  \
        P                  RV3R l4       VP                  VRRR7       V P                  VP                  S4       R# )z^
L{server.DNSServerFactory.messageReceived} assigns a unix timestamp to
the received message.
Útimec                  ó   <€ S # r   r'   )Úts   €r   Ú<lambda>ÚEDNSServerFactoryTests.test_messageReceivedTimestamp.<locals>.<lambda>Ì  s   ø€ ±r   NrÏ   )
r   rÓ   r%   rw   Úpatchr   rç   rÔ   r^   ÚtimeReceived)r   rc   rÀ   ré   s   &  @r   Útest_messageReceivedTimestampÚ3DNSServerFactoryTests.test_messageReceivedTimestampÄ  s\   ø€ ô
 �KŠK‹MˆÜ&Ó(ˆÜ‹HˆØ�
‰
”6—;‘; ¬	Ô2Ø	×Ñ !¨4¸ÐÔ>à×Ñ˜Ÿ™¨Ö+r   c                ó.  € \         P                  ! 4       p\        4       p\        4       p\        4       pV P	                  \        P
                  VP                  VVVR7      pVP                  w  rgV P                  WaW#34       V P                  V/ 4       R# )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Ó   rw   r2   ÚassertRaisesr7   rÔ   r   r^   )r   r(   ÚdummyProtocolÚdummyAddressrÀ   Úer   r   s   &       r   Útest_messageReceivedAllowQueryÚ4DNSServerFactoryTests.test_messageReceivedAllowQueryÑ  s…   € ô —+’+“-ˆÜ›ˆÜ“xˆä#Ó%ˆØ×ÑÜ#×7Ñ7Ø×ÑØØØ ð ó 
ˆð —v‘v‰ˆØ×Ñ˜¨ÐEÔFØ×Ñ˜ Ö$r   c                óH  a€  ! R R\         4      o ! V3R lR\        P                  4      pV! 4       pV P                  SVP                  \
        P                  ! 4       RRR7      pVP                  w  w  rErgV P                  VP                  \
        P                  4       R# )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                   ó   € ] tR tRtRtR# )ÚFDNSServerFactoryTests.test_allowQueryFalse.<locals>.SendReplyExceptioniî  r'   Nr‰   r'   r   r   ÚSendReplyExceptionrù   î  r‹   r   rú   c                   ó4   <a € ] tR tRt o R tV3R ltRtV tR# )ÚKDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactoryiñ  c                ó   € R # )Fr'   r   s   &*,r   r+   ÚVDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.allowQueryò  s   € Ùr   c                ó   <€ S! W4      hr   r'   )r   r   r   rú   s   &*,€r   r.   ÚUDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.sendReplyõ  s   ø€ Ù(¨Ó6Ð6r   r'   N)r   r   r   r   r+   r.   r   r   )r!   rú   s   @€r   r2   rü   ñ  s   ù‡ € ò÷7ó 7r   r2   NrÏ   )r;   r   ri   rñ   rÔ   r   rÓ   r   r^   ÚrCodeÚEREFUSED)	r   r2   rÀ   rô   rÐ   r(   r*   r   rú   s	   &       @r   Útest_allowQueryFalseÚ*DNSServerFactoryTests.test_allowQueryFalseç  s†   ø€ ô	¤ô 	÷	7¤f×&=Ñ&=ô 	7ñ $Ó%ˆØ×ÑØØ×ÑÜ—K’K“MØØð ó 
ˆð -.¯F©FÑ)Ñ!ˆ˜à×Ñ˜Ÿ™¬¯©Ö5r   c                óÌ   a€ R.Vn         . oV3R lp\        4       p\        P                  ! R4      p\	        WQV4       VP                  W$4       V P                  SW$R3.4       R# )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P                  WV34       R # r   ©r[   )r(   r)   r*   ÚreceivedMessagess   &&&€r   ÚfakeHandlerÚ?DNSServerFactoryTests._messageReceivedTest.<locals>.fakeHandler  s   ø€ Ø×#Ñ# W¸Ð$@ÖAr   )ÚqueriesrF   r   ri   ÚsetattrrÔ   r^   )r   Ú
methodNamer(   r	  r)   r¸   r  s   &&&   @r   Ú_messageReceivedTestÚ*DNSServerFactoryTests._messageReceivedTest  sd   ø€ ð  ˜&ˆŒàÐõ	Bô  “>ˆÜ×)Ò)¨$Ó/ˆÜ� [Ô1Ø×Ñ Ô2Ø×ÑÐ)¨WÀÐ,EÐ+FÖGr   c                óp   € V P                  R\        P                  ! \        P                  R7      4       R# )zz
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_QUERY} on to L{DNSServerFactory.handleQuery}.
ÚhandleQuery©ÚopCodeN)r  r   rÓ   ÚOP_QUERYrl   s   &r   Útest_queryMessageReceivedÚ/DNSServerFactoryTests.test_queryMessageReceived   s!   € ð
 	×!Ñ! -´·²ÄCÇLÁLÔ1QÖRr   c                óp   € V P                  R\        P                  ! \        P                  R7      4       R# )zƒ
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_INVERSE} on to L{DNSServerFactory.handleInverseQuery}.
ÚhandleInverseQueryr  N)r  r   rÓ   Ú
OP_INVERSErl   s   &r   Ú test_inverseQueryMessageReceivedÚ6DNSServerFactoryTests.test_inverseQueryMessageReceived'  s$   € ð
 	×!Ñ!Ø ¤#§+¢+´S·^±^Ô"Dö	
r   c                óp   € V P                  R\        P                  ! \        P                  R7      4       R# )z|
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_STATUS} on to L{DNSServerFactory.handleStatus}.
ÚhandleStatusr  N)r  r   rÓ   Ú	OP_STATUSrl   s   &r   Útest_statusMessageReceivedÚ0DNSServerFactoryTests.test_statusMessageReceived0  ó!   € ð
 	×!Ñ! .´#·+²+ÄSÇ]Á]Ô2SÖTr   c                óp   € V P                  R\        P                  ! \        P                  R7      4       R# )z|
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_NOTIFY} on to L{DNSServerFactory.handleNotify}.
ÚhandleNotifyr  N)r  r   rÓ   Ú	OP_NOTIFYrl   s   &r   Útest_notifyMessageReceivedÚ0DNSServerFactoryTests.test_notifyMessageReceived7  r!  r   c                óp   € V P                  R\        P                  ! \        P                  R7      4       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Ó   Ú	OP_UPDATErl   s   &r   Útest_updateMessageReceivedÚ0DNSServerFactoryTests.test_updateMessageReceived>  s!   € ð 	×!Ñ! -´·²ÄCÇMÁMÔ1RÖSr   c                óÄ  € \        4       \        4       r!\        P                  ! 4       pVP                  V4       V P	                  VP
                  V.4       VP                  V4       V P	                  VP
                  W.4       VP                  V4       V P	                  VP
                  V.4       VP                  V4       V P	                  VP
                  . 4       R# )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)rw   r   ri   ÚconnectionMader^   ÚconnectionsÚconnectionLost)r   ÚprotoAÚprotoBr¸   s   &   r   Útest_connectionTrackingÚ-DNSServerFactoryTests.test_connectionTrackingG  s´   € ô  ›¤6£8�Ü×)Ò)Ó+ˆØ×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨v¨hÔ7Ø×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨vÐ.>Ô?Ø×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨v¨hÔ7Ø×Ñ˜vÔ&Ø×Ñ˜×,Ñ,¨bÖ1r   c                óŒ  € \         P                  ! 4       pVP                  R4       VP                  R4       \        P                  ! 4       p\        4       Vn        V P                  \
        P                  VP                  V\        4       RR7      pVP                  w  w  rEV P                  WAP                  ^ ,          4       R# )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   ri   rJ   rj   rñ   rM   r  rF   r   r^   r  )r   rc   rÀ   rô   rO   r   s   &     r   Útest_handleQueryÚ&DNSServerFactoryTests.test_handleQueryX  s—   € ô �KŠK‹MˆØ	�
‰
Ð%Ô&Ø	�
‰
Ð%Ô&Ü×#Ò#Ó%ˆÜ$Ó&ˆŒ
à×ÑÜ×*Ñ*Ø�M‰MØÜ!“^Øð ó 
ˆð Ÿ6™6Ñ‰ˆØ×Ñ˜§	¡	¨!¥Ö-r   c                óª  aa	€ \         P                  ! 4       p\        P                  ! 4       o ! V3R lR4      pV! 4       Vn        . o	V	3R lpW1n        \        P                  ! 4       pVP                  R4       \        4       p\        4       pVP                  WEVR7       \        4       pSP                  V4       V P                  S	WuWF3/ 3.4       R# )a  
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                   ó.   <a € ] tR tRt o V3R ltRtV tR# )ÚDDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolveriz  c                ó   <€ S# r   r'   ©r   r   r   Úds   &*,€r   rO   ÚJDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolver.query{  ó   ø€ Ø�r   r'   N©r   r   r   r   rO   r   r   ©r!   r>  s   @€r   ÚFakeResolverr;  z  ó   ù‡ € ÷ó r   rC  c                  ó,   <€ SP                  W34       R # r   r  )r   r   ÚgotResolverResponseArgss   *,€r   ÚfakeGotResolverResponseÚODNSServerFactoryTests.test_handleQueryCallback.<locals>.fakeGotResolverResponse‚  s   ø€ Ø#×*Ñ*¨D¨>Ö:r   r5  r6  N)r   ri   r   ÚDeferredrj   ÚgotResolverResponser   rÓ   rÞ   rF   rw   r  Úcallbackr^   )
r   rÀ   rC  rG  rc   r»   ró   ÚdummyResponser>  rF  s
   &       @@r   Útest_handleQueryCallbackÚ.DNSServerFactoryTests.test_handleQueryCallbackn  s±   ù€ ô ×#Ò#Ó%ˆä�NŠNÓˆ÷	ô 	ñ "“^ˆŒ
à"$Ðõ	;ð !8Ôä�KŠK‹MˆØ	�
‰
Ð%Ô&Ü#“~ˆÜ“xˆà	�‰˜aÀˆÔMä›ˆØ	�
‰
�=Ô!à×ÑØ#Ø¨AÐ<¸bÐAÐBö	
r   c                óÒ  aa	€ \         P                  ! 4       p\        P                  ! 4       o ! V3R lR4      pV! 4       Vn        . o	V	3R lpW1n        \        P                  ! 4       pVP                  R4       \        4       p\        4       pVP                  WEVR7       \        P                  ! \        4       4      pSP                  V4       V P!                  S	WuWF3/ 3.4       R# )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                   ó.   <a € ] tR tRt o V3R ltRtV tR# )ÚCDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolveri¢  c                ó   <€ S# r   r'   r=  s   &*,€r   rO   ÚIDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolver.query£  r@  r   r'   NrA  rB  s   @€r   rC  rQ  ¢  rD  r   rC  c                  ó,   <€ SP                  W34       R # r   r  )r   r   ÚgotResolverErrorArgss   *,€r   ÚfakeGotResolverErrorÚKDNSServerFactoryTests.test_handleQueryErrback.<locals>.fakeGotResolverErrorª  s   ø€ Ø ×'Ñ'¨¨Ö7r   r5  r6  N)r   ri   r   rI  rj   ÚgotResolverErrorr   rÓ   rÞ   rF   rw   r  r	   ÚFailurer;   Úerrbackr^   )
r   rÀ   rC  rV  rc   r»   ró   ÚstubFailurer>  rU  s
   &       @@r   Útest_handleQueryErrbackÚ-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           	     óœ  € \         P                  ! 4       p. p. p. pV P                  \        P                  VP
                  W#V3\        4       \        P                  ! 4       RR7      pVP                  w  w  rgV P                  VP                  V4       V P                  VP                  V4       V P                  VP                  V4       R# )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   ri   rñ   r=   r@   rJ  r   rÓ   r   r±   ÚanswersÚ	authorityÚ
additional)r   rÀ   r`  ra  rb  rô   r(   r   s   &       r   Útest_gotResolverResponseÚ.DNSServerFactoryTests.test_gotResolverResponse½  s¬   € ô ×#Ò#Ó%ˆØˆØˆ	Øˆ
Ø×ÑÜ×1Ñ1Ø×!Ñ!Ø Ð,Ü$Ó&Ü—K’K“MØð ó 
ˆð ŸV™VÑ‰
ˆà�‰�g—o‘o wÔ/Ø�‰�g×'Ñ'¨Ô3Ø�‰�g×(Ñ(¨*Ö5r   c                óD  € \        4       p\        Vn        \        P                  ! 4       p^Vn        V P                  \        VP                  . . . 3RVRR7      pV P                  R\        V\        P                  . . . R7      3VP                  VP                  34       R# )z~
L{server.DNSServerFactory.gotResolverResponse} calls
L{server.DNSServerFactory._responseFromMessage} to generate a response.
Nr_  )r(   r  r`  ra  rb  r'   )r%   r#   Ú_responseFromMessager   rÓ   rí   rñ   r   rJ  r^   ÚdictÚOKr   r   ©r   r¸   Úrequestrô   s   &   r   Ú0test_gotResolverResponseCallsResponseFromMessageÚFDNSServerFactoryTests.test_gotResolverResponseCallsResponseFromMessageÕ  sŸ   € ô
 -Ó.ˆÜ'-ˆÔ$ä—+’+“-ˆØ ˆÔà×ÑÜØ×'Ñ'Ø��RˆLØØØð ó 
ˆð 	×ÑàÜØ#ÜŸ&™&ØØ Ø!ôð	ð �V‰V�Q—X‘XÐö	
r   c                ó¨   € \         P                  ! 4       p\        P                  ! RRR7      pVP	                  VR7      3pV P                  W#4       R# )zv
L{server.DNSServerFactory._responseFromMessage} generates a response
message which is a copy of the request message.
F)ÚanswerÚrecAv©r(   N)r   ri   r   rÓ   rf  ÚassertIsNot©r   r¸   rj  Úresponses   &   r   Ú"test_responseFromMessageNewMessageÚ8DNSServerFactoryTests.test_responseFromMessageNewMessageö  sF   € ô
 ×)Ò)Ó+ˆÜ—+’+ U°%Ô8ˆØ×0Ñ0¸Ð0ÓAÐCˆà×Ñ˜Ö+r   c                ó8  € \         P                  ! 4       pRVn        VP                  \        P
                  ! RR7      R7      pRVn        VP                  \        P
                  ! RR7      R7      pV P                  RVP                  VP                  34       R# )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)ro  rp  N©TF)r   ri   rž   rf  r   rÓ   r^   ro  ©r   r¸   Ú	response1Ú	response2s   &   r   Ú*test_responseFromMessageRecursionAvailableÚ@DNSServerFactoryTests.test_responseFromMessageRecursionAvailable  sw   € ô ×)Ò)Ó+ˆØ!ˆÔØ×0Ñ0¼¿ºÈ5Ô9QÐ0ÓRˆ	Ø"ˆÔØ×0Ñ0¼¿ºÈ4Ô9PÐ0ÓQˆ	Ø×Ñ˜¨¯©¸)¿/¹/Ð(JÖKr   c                óØ   € \         P                  ! 4       p\        P                  ! 4       pRVn        VP                  VR7      pV P                  VP                  VP                  4       R# )zŸ
L{server.DNSServerFactory._responseFromMessage} generates a response
message whose C{timeReceived} attribute has the same value as that found
on the request.
iÒ  rp  N)r   ri   r   rÓ   rí   rf  r^   rr  s   &   r   Ú$test_responseFromMessageTimeReceivedÚ:DNSServerFactoryTests.test_responseFromMessageTimeReceived  sT   € ô ×)Ò)Ó+ˆÜ—+’+“-ˆØ#ˆÔØ×/Ñ/¸Ð/Ó@ˆà×Ñ˜×-Ñ-¨x×/DÑ/DÖEr   c                óØ   € \         P                  ! 4       p\        P                  ! 4       p^ Vn        VP                  VR7      pV P                  VP                  VP                  4       R# )zš
L{server.DNSServerFactory._responseFromMessage} generates a response
message whose C{maxSize} attribute has the same value as that found
on the request.
rp  N)r   ri   r   rÓ   ÚmaxSizerf  r^   rr  s   &   r   Útest_responseFromMessageMaxSizeÚ5DNSServerFactoryTests.test_responseFromMessageMaxSize  sQ   € ô ×)Ò)Ó+ˆÜ—+’+“-ˆØˆŒØ×/Ñ/¸Ð/Ó@ˆà×Ñ˜Ÿ™¨(×*:Ñ*:Ö;r   c                óv   € V P                  \        P                  \        P                  P
                  4       R# )zc
L{server.DNSServerFactory} has a C{_messageFactory} attribute which is
L{dns.Message} by default.
N)r±   r   rÓ   r   ri   Ú_messageFactoryrl   s   &r   Útest_messageFactoryÚ)DNSServerFactoryTests.test_messageFactory(  s"   € ð
 	�‰”c—k‘k¤6×#:Ñ#:×#JÑ#JÖKr   c                ó¦  € \         P                  ! 4       pV P                  \        R\        4       \        P
                  ! 4       pV P                  \        VP                  V\        P                  R7      pV P                  R\        VP                  V\        P                  VP                  RR7      3VP                  VP                  34       R# )a  
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.
rf  ©r(   r  F)ÚresponseConstructorr(   r  ro  ÚauthNr'   )r   ri   rì   r   r#   rÓ   rñ   r   rf  rh  r^   rg  r…  rž   r   r   ri  s   &   r   Ú+test_responseFromMessageCallsMessageFactoryÚADNSServerFactoryTests.test_responseFromMessageCallsMessageFactory/  sª   € ô ×)Ò)Ó+ˆØ�
‰
”3Ð.´Ô7ä—+’+“-ˆØ×ÑÜ˜W×9Ñ9À7ÔRU×RXÑRXð ó 
ˆð 	×ÑàÜØ(/×(?Ñ(?Ø#ÜŸ&™&Ø!×,Ñ,Øôð	ð �V‰V�Q—X‘XÐö	
r   c                óp  € \         P                  ! 4       pVP                  \        P                  ! 4       \        P
                  ! RR7      .R7      pVP                  \        P                  ! 4       \        P
                  ! RR7      .R7      pV P                  RVP                  VP                  34       R# )z�
L{server.DNSServerFactory._responseFromMessage} marks the response
message as authoritative if any of the answer records are authoritative.
T)r‹  )r(   r`  FNrw  )r   ri   rf  r   rÓ   ÚRRHeaderr^   r‹  rx  s   &   r   Ú,test_responseFromMessageAuthoritativeMessageÚBDNSServerFactoryTests.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           
     ó  € \        ^R7      p\        P                  ! 4       .p\        P                  ! 4       .p\        P                  ! 4       .p\        V R.VP                  W#V3\        4       \        P                  ! 4       RR7       R# )zt
L{server.DNSServerFactory.gotResolverResponse} logs the total number of
records in the response if C{verbose > 0}.
r©   zLookup found 3 recordsNr_  )r%   r   r�  rd   rJ  rF   rÓ   )r   rÀ   r`  ra  rb  s   &    r   Útest_gotResolverResponseLoggingÚ5DNSServerFactoryTests.test_gotResolverResponseLogging]  sk   € ô
 '¨qÔ1ˆÜ—<’<“>Ð"ˆÜ—\’\“^Ð$ˆ	Ü—l’l“nÐ%ˆ
äØØ%Ð&Ø×!Ñ!Ø Ð,Ü!“^Ü—K’K“MØ÷	
r   c           	     óü  € \        \        4       .R7      p\        P                  ! 4       pVP	                  R4       \        P
                  ! 4       .p. p. pV P                  \        P                  VP                  W4V3\        4       VRR7      pVP                  w  w  pw  r‰r«V P                  VP                  P                  R4       V P                  Wƒ4       V P                  W”4       V P                  W¥4       R# )z{
L{server.DNSServerFactory.gotResolverResponse} caches the response if at
least one cache was provided in the constructor.
r}   s   example.comNr_  )r%   rR   r   rÓ   rÞ   r�  rñ   rU   rJ  rF   r   r^   rÛ   r±   )r   rÀ   rc   ÚexpectedAnswersÚexpectedAuthorityÚexpectedAdditionalrô   rO   r`  ra  rb  r   s   &           r   Útest_gotResolverResponseCachingÚ5DNSServerFactoryTests.test_gotResolverResponseCachingq  sÓ   € ô
 '¬|«~Ð.>Ô?ˆä�KŠK‹MˆØ	�
‰
�>Ô"ÜŸ<š<›>Ð*ˆØÐØÐà×ÑÜ×-Ñ-Ø×!Ñ!ØÐ1CÐDÜ!“^ØØð ó 
ˆð =>¿F¹FÑ9Ñ1ˆÑ0� Zà×Ñ˜Ÿ™Ÿ™¨.Ô9Ø�‰�gÔ/Ø�‰�iÔ3Ø�‰�jÖ5r   c           	     ó†  € \        4       p\        Vn        \        P                  ! 4       p^Vn        V P                  \        VP                  \        P                  ! \        P                  ! 4       4      RVRR7      pV P                  R\        V\        P                  R7      3VP                   VP"                  34       R# )z{
L{server.DNSServerFactory.gotResolverError} calls
L{server.DNSServerFactory._responseFromMessage} to generate a response.
Nr_  r‰  r'   )r%   r#   rf  r   rÓ   rí   rñ   r   rX  r	   rY  r   ÚDomainErrorr^   rg  ÚENAMEr   r   ri  s   &   r   Ú-test_gotResolverErrorCallsResponseFromMessageÚCDNSServerFactoryTests.test_gotResolverErrorCallsResponseFromMessage�  s˜   € ô
 -Ó.ˆÜ'-ˆÔ$ä—+’+“-ˆØ ˆÔà×ÑÜØ×$Ñ$Ü�OŠOœE×-Ò-Ó/Ó0ØØØð ó 
ˆð 	×ÑØ”˜g¬S¯Y©YÔ7Ð8¸1¿6¹6À1Ç8Á8Ð:Lö	
r   c           	     óD  € \         P                  ! 4       pV P                  \        P                  VP
                  \        P                  ! V4      \        4       \        P                  ! 4       RR7      pVP                  w  w  rVV P                  VP                  V4       R# )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   ri   rñ   r=   r@   rX  r	   rY  r   rÓ   r   r^   r  )r   ÚresponseErrorÚexpectedMessageCoderÀ   rô   r(   r   s   &&&    r   Ú_assertMessageRcodeForErrorÚ1DNSServerFactoryTests._assertMessageRcodeForError¤  s|   € ô  ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø×ÑÜ�OŠO˜MÓ*Ü$Ó&Ü—K’K“MØð ó 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™Ð(;Ö<r   c                ól   € V P                  \        P                  ! 4       \        P                  4       R# )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�  rl   s   &r   Ú test_gotResolverErrorDomainErrorÚ6DNSServerFactoryTests.test_gotResolverErrorDomainErrorÁ  s!   € ð
 	×(Ñ(¬×):Ò):Ó)<¼c¿i¹iÖHr   c                ól   € V P                  \        P                  ! 4       \        P                  4       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   ÚAuthoritativeDomainErrorr   r�  rl   s   &r   Ú-test_gotResolverErrorAuthoritativeDomainErrorÚCDNSServerFactoryTests.test_gotResolverErrorAuthoritativeDomainErrorÈ  s!   € ð 	×(Ñ(¬×)GÒ)GÓ)IÌ3Ï9É9ÖUr   c                ó¶   € V P                  \        4       \        P                  4       V P	                  \        4      pV P                  \        V4      ^4       R# )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.
N)r£  ÚKeyErrorr   ÚESERVERÚflushLoggedErrorsr^   Úlen)r   rô   s   & r   Útest_gotResolverErrorOtherErrorÚ5DNSServerFactoryTests.test_gotResolverErrorOtherErrorÐ  s>   € ð 	×(Ñ(¬«´S·[±[ÔAØ×"Ñ"¤8Ó,ˆØ×Ñœ˜Q› Ö#r   c           
     óÜ   € \        ^R7      p\        V R.VP                  \        P                  ! \
        P                  ! 4       4      \        4       \        P                  ! 4       RR7       R# )zJ
L{server.DNSServerFactory.gotResolver} logs a message if C{verbose > 0}.
r©   zLookup failedNr_  )
r%   rd   rX  r	   rY  r   rœ  rF   r   rÓ   rÈ   s   & r   Útest_gotResolverErrorLoggingÚ2DNSServerFactoryTests.test_gotResolverErrorLoggingÚ  sN   € ô '¨qÔ1ˆÜØØÐØ×ÑÜ�OŠOœE×-Ò-Ó/Ó0Ü!“^Ü—K’K“MØ÷	
r   c                óÜ  a€ \         P                  ! 4       p. oV3R lVn        \        P                  ! RRR7      p\        4       \        4       .Vn        \        4       \        4       .Vn        \        4       \        4       .Vn        VP                  \        P                  ! \        P                  ! 4       4      RVRR7       V P                  \        P                  ! ^RR7      .S4       R# )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P                  V4      # r   r  ©r)   rs  r*   Ú	responsess   &&&€r   rê   ÚUDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributes.<locals>.<lambda>ñ  ó   ø€ À	×@PÑ@PØôA
r   T©ÚauthenticDataÚcheckingDisabledNr_  ©r  rn  )r   ri   r.   r   rÓ   rw   r`  ra  rb  rX  r	   rY  r   rœ  r^   ©r   r¸   rj  r¹  s   &  @r   Ú-test_gotResolverErrorResetsResponseAttributesÚCDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributesé  s·   ø€ ô ×)Ò)Ó+ˆØˆ	ô
ˆÔô —+’+¨DÀ4ÔHˆÜ!›8¤V£XÐ.ˆŒÜ#›X¤v£xÐ0ˆÔÜ$›h¬«Ð1ˆÔØ× Ñ Ü�OŠOœE×-Ò-Ó/Ó0ØØØð	 	!ô 	
ð 	×Ñœ#Ÿ+š+¨A°dÔ;Ð<¸iÖHr   c                ó”  a€ \         P                  ! 4       p. oV3R lVn        \        P                  ! RRR7      p\        4       \        4       .Vn        \        4       \        4       .Vn        \        4       \        4       .Vn        VP                  . . . 3RVRR7       V P                  \        P                  ! ^ RR7      .S4       R# )zë
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                 ó&   <€ SP                  V4      # r   r  r¸  s   &&&€r   rê   ÚXDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes.<locals>.<lambda>
  r»  r   Tr¼  Nr_  r¿  )r   ri   r.   r   rÓ   rw   r`  ra  rb  rJ  r^   rÀ  s   &  @r   Ú0test_gotResolverResponseResetsResponseAttributesÚFDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes  s¨   ø€ ô ×)Ò)Ó+ˆØˆ	ô
ˆÔô —+’+¨DÀ4ÔHˆÜ!›8¤V£XÐ.ˆŒÜ#›X¤v£xÐ0ˆÔÜ$›h¬«Ð1ˆÔà×#Ñ#Ø��RˆL 4°À$ð 	$ô 	
ð 	×Ñœ#Ÿ+š+¨A°dÔ;Ð<¸iÖHr   c                ó@  € \         P                  ! 4       p\        4       p\        P                  ! 4       pV P                  \        P                  VP                  \        4       VVR7      pVP                  w  rVV P                  WQV34       V P                  V/ 4       R# )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Ó   rw   r   ri   rñ   r=   r@   r.   r   r^   )r   rc   ró   rÀ   rô   r   r   s   &      r   Útest_sendReplyWithAddressÚ/DNSServerFactoryTests.test_sendReplyWithAddress  s…   € ô �KŠK‹MˆÜ“xˆÜ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�K‰KÜ$Ó&ØØ ð ó 
ˆð —v‘v‰ˆØ×Ñ˜ <Ð0Ô1Ø×Ñ˜ Ö$r   c                ó*  € \         P                  ! 4       p\        P                  ! 4       pV P	                  \
        P                  VP                  \        4       VRR7      pVP                  w  rEV P                  WA34       V P                  V/ 4       R# )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   ri   rñ   r=   r@   r.   r   r^   )r   rc   rÀ   rô   r   r   s   &     r   Útest_sendReplyWithoutAddressÚ2DNSServerFactoryTests.test_sendReplyWithoutAddress,  s{   € ô �KŠK‹MˆÜ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�K‰KÜ$Ó&ØØð ó 
ˆð —v‘v‰ˆØ×Ñ˜˜tÔ$Ø×Ñ˜ Ö$r   c           	     óú   € V P                  \        P                  RR 4       \        P                  ! 4       pRVn        \        P                  ! ^R7      p\        V RR.VP                  \        4       VRR7       R# )	zm
If L{server.DNSServerFactory.sendReply} logs a "no answers" message if
the supplied message has no answers.
rç   c                  ó   € R # ©i‚Q r'   r'   r   r   rê   ÚFDNSServerFactoryTests.test_sendReplyLoggingNoAnswers.<locals>.<lambda>D  ó   € ±r   é�Q r©   zReplying with no answersú Processed query in 1.000 secondsNr_  )
rì   r   rç   r   rÓ   rí   ri   rd   r.   rF   rÕ   s   &  r   Útest_sendReplyLoggingNoAnswersÚ4DNSServerFactoryTests.test_sendReplyLoggingNoAnswers?  s`   € ð
 	�
‰
”6—;‘; ©Ô6Ü�KŠK‹MˆØˆŒÜ×#Ò#¨AÔ.ˆÜØØ'Ð)KÐLØ�K‰KÜ!“^ØØ÷	
r   c           	     ó’  € V P                  \        P                  RR 4       \        P                  ! 4       pVP
                  P                  \        P                  ! \        P                  ! R4      R7      4       VP                  P                  \        P                  ! \        P                  ! R4      R7      4       VP                  P                  \        P                  ! \        P                  ! R4      R7      4       RVn        \        P                  ! ^R7      p\        V . R	OVP                  \        4       VRR7       R# )
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                  ó   € R # rÐ  r'   r'   r   r   rê   ÚHDNSServerFactoryTests.test_sendReplyLoggingWithAnswers.<locals>.<lambda>W  rÒ  r   z	127.0.0.1)ÚpayloadrÓ  r©   Nr_  )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Ô  )rì   r   rç   r   rÓ   r`  r[   r�  ÚRecord_Ara  rb  rí   ri   rd   r.   rF   rÕ   s   &  r   Ú test_sendReplyLoggingWithAnswersÚ6DNSServerFactoryTests.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                ó6  € \         P                  ! 4       pV P                  \        P                  VP
                  \        P                  ! 4       \        4       RR7      pVP                  w  w  r4V P                  VP                  \        P                  4       R# )z
L{server.DNSServerFactory.handleInverseQuery} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
Nr6  )r   ri   rñ   r=   r@   r  r   rÓ   r   r^   r  ÚENOTIMP©r   rÀ   rô   r(   r   s   &    r   Útest_handleInverseQueryÚ-DNSServerFactoryTests.test_handleInverseQueryl  ss   € ô
 ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø× Ñ Ü—K’K“MÜ$Ó&Øð ó 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™¬¯©Ö4r   c           	     óŒ   € \        ^R7      p\        V R.VP                  \        P                  ! 4       \        4       RR7       R# )zb
L{server.DNSServerFactory.handleInverseQuery} logs the message origin
address if C{verbose > 0}.
r©   zInverse query from ('::1', 53)r6  N©z::1rÒ   )r%   rd   r  r   rÓ   rF   rÈ   s   & r   Útest_handleInverseQueryLoggingÚ4DNSServerFactoryTests.test_handleInverseQueryLogging}  s9   € ô
 '¨qÔ1ˆÜØØ-Ð.Ø× Ñ Ü—K’K“MÜ!“^Ø÷	
r   c                ó6  € \         P                  ! 4       pV P                  \        P                  VP
                  \        P                  ! 4       \        4       RR7      pVP                  w  w  r4V P                  VP                  \        P                  4       R# )zy
L{server.DNSServerFactory.handleStatus} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
Nr6  )r   ri   rñ   r=   r@   r  r   rÓ   r   r^   r  rß  rà  s   &    r   Útest_handleStatusÚ'DNSServerFactoryTests.test_handleStatusŒ  óq   € ô
 ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�N‰NÜ—K’K“MÜ$Ó&Øð ó 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™¬¯©Ö4r   c           	     óŒ   € \        ^R7      p\        V R.VP                  \        P                  ! 4       \        4       RR7       R# )z\
L{server.DNSServerFactory.handleStatus} logs the message origin address
if C{verbose > 0}.
r©   zStatus request from ('::1', 53)r6  Nrä  )r%   rd   r  r   rÓ   rF   rÈ   s   & r   Útest_handleStatusLoggingÚ.DNSServerFactoryTests.test_handleStatusLogging�  ó7   € ô
 '¨qÔ1ˆÜØØ.Ð/Ø�N‰NÜ—K’K“MÜ!“^Ø÷	
r   c                ó6  € \         P                  ! 4       pV P                  \        P                  VP
                  \        P                  ! 4       \        4       RR7      pVP                  w  w  r4V P                  VP                  \        P                  4       R# )zy
L{server.DNSServerFactory.handleNotify} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
Nr6  )r   ri   rñ   r=   r@   r#  r   rÓ   r   r^   r  rß  rà  s   &    r   Útest_handleNotifyÚ'DNSServerFactoryTests.test_handleNotify¬  rê  r   c           	     óŒ   € \        ^R7      p\        V R.VP                  \        P                  ! 4       \        4       RR7       R# )z\
L{server.DNSServerFactory.handleNotify} logs the message origin address
if C{verbose > 0}.
r©   zNotify message from ('::1', 53)r6  Nrä  )r%   rd   r#  r   rÓ   rF   rÈ   s   & r   Útest_handleNotifyLoggingÚ.DNSServerFactoryTests.test_handleNotifyLogging½  rî  r   c                ó6  € \         P                  ! 4       pV P                  \        P                  VP
                  \        P                  ! 4       \        4       RR7      pVP                  w  w  r4V P                  VP                  \        P                  4       R# )zx
L{server.DNSServerFactory.handleOther} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
Nr6  )r   ri   rñ   r=   r@   r(  r   rÓ   r   r^   r  rß  rà  s   &    r   Útest_handleOtherÚ&DNSServerFactoryTests.test_handleOtherÌ  sq   € ô
 ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�M‰MÜ—K’K“MÜ$Ó&Øð ó 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™¬¯©Ö4r   c           	     óŒ   € \        ^R7      p\        V R.VP                  \        P                  ! 4       \        4       RR7       R# )z[
L{server.DNSServerFactory.handleOther} logs the message origin address
if C{verbose > 0}.
r©   z$Unknown op code (0) from ('::1', 53)r6  Nrä  )r%   rd   r(  r   rÓ   rF   rÈ   s   & r   Útest_handleOtherLoggingÚ-DNSServerFactoryTests.test_handleOtherLoggingÝ  s7   € ô
 '¨qÔ1ˆÜØØ3Ð4Ø�M‰MÜ—K’K“MÜ!“^Ø÷	
r   r'   N)Gr   r   r   r   r   rm   rr   rz   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*  r2  r7  rM  r\  rc  rk  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   r   r    s   @r   rf   rf   Û   sf  ø‡ € ñò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   rf   N)r   Úzope.interface.verifyr   Útwisted.internetr   Útwisted.internet.interfacesr   Útwisted.namesr   r   r   r   Útwisted.pythonr	   r
   Útwisted.trialr   r;   r   r#   ri   r%   r2   r=   rF   rJ   rR   rd   ÚTestCaserf   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   