ó
    Ö›‘hÈ¢  ã                   óP  • S r SSKJr  SSKJr  SSKJr  SSKJrJ	r	J
r
Jr  SSKJrJr  SSKJr   " S S	\5      rS
 r " S S\R(                  5      r " S S\R(                  5      r " S S5      r " S S5      r " S S5      r " S S5      rS r " S S\R8                  5      rg)z)
Test cases for L{twisted.names.server}.
é    )ÚverifyClass)Údefer)ÚIProtocolFactory)ÚdnsÚerrorÚresolveÚserver)ÚfailureÚlog)Úunittestc                   ó   • \ rS rSrSrS rSrg)ÚRaisedArgumentsé   z<
An exception containing the arguments raised by L{raiser}.
c                 ó   • Xl         X l        g ©N©ÚargsÚkwargs©Úselfr   r   s      ÚbC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/names/test/test_server.pyÚ__init__ÚRaisedArguments.__init__   s   € ØŒ	Ø�ó    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__© r   r   r   r      s   † ñõr   r   c                  ó   • [        X5      e)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                   ó$   • \ rS rSrSrS rS rSrg)ÚNoResponseDNSServerFactoryé$   zú
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                 ó   • g)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}
Fr!   )r   ÚmessageÚprotocolÚaddresss       r   Ú
allowQueryÚ%NoResponseDNSServerFactory.allowQuery.   s   € ð r   c                 ó   • g)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   r   r%   r%   $   s   † ñòõr   r%   c                   ó4   • \ rS rSrSr " S S\5      rS rSrg)ÚRaisingDNSServerFactoryéE   zÆ
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                   ó   • \ rS rSrSrSrg)Ú+RaisingDNSServerFactory.AllowQueryArgumentséN   ú7
Contains positional and keyword arguments in C{args}.
r!   N©r   r   r   r   r   r    r!   r   r   ÚAllowQueryArgumentsr5   N   ó   † ô	r   r9   c                 ó$   • U R                  X5      e)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}
)r9   r   s      r   r+   Ú"RaisingDNSServerFactory.allowQueryS   s   € ð ×&Ñ& tÓ4Ð4r   r!   N)	r   r   r   r   r   Ú	Exceptionr9   r+   r    r!   r   r   r2   r2   E   s   † ñô˜iô õ
5r   r2   c                   ó4   • \ rS rSrSr " S S\5      rS rSrg)ÚRaisingProtocoléb   za
A partial fake L{IProtocol} whose methods raise an exception containing the
supplied arguments.
c                   ó   • \ rS rSrSrSrg)Ú%RaisingProtocol.WriteMessageArgumentséh   r7   r!   Nr8   r!   r   r   ÚWriteMessageArgumentsrB   h   r:   r   rD   c                 ó$   • U R                  X5      e©z‹
Raises the supplied arguments.

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

@param kwargs: Keyword args
@type kwargs: L{dict}
)rD   r   s      r   ÚwriteMessageÚRaisingProtocol.writeMessagem   s   € ð ×(Ñ(¨Ó6Ð6r   r!   N)	r   r   r   r   r   r=   rD   rG   r    r!   r   r   r?   r?   b   s   † ñô
 	ô õ

7r   r?   c                   ó   • \ rS rSrSrS rSrg)ÚNoopProtocoléz   zL
A partial fake L{dns.DNSProtocolMixin} with a noop L{writeMessage} method.
c                 ó   • g)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   rG   ÚNoopProtocol.writeMessage   r0   r   r!   N)r   r   r   r   r   rG   r    r!   r   r   rJ   rJ   z   s   † ñõ	r   rJ   c                   ó4   • \ rS rSrSr " S S\5      rS rSrg)ÚRaisingResolveré‹   za
A partial fake L{IResolver} whose methods raise an exception containing the
supplied arguments.
c                   ó   • \ rS rSrSrSrg)ÚRaisingResolver.QueryArgumentsé‘   r7   r!   Nr8   r!   r   r   ÚQueryArgumentsrR   ‘   r:   r   rT   c                 ó$   • U R                  X5      erF   )rT   r   s      r   ÚqueryÚRaisingResolver.query–   s   € ð ×!Ñ! $Ó/Ð/r   r!   N)	r   r   r   r   r   r=   rT   rV   r    r!   r   r   rO   rO   ‹   s   † ñô
˜ô õ

0r   rO   c                   ó4   • \ rS rSrSr " S S\5      rS rSrg)ÚRaisingCacheé£   zq
A partial fake L{twisted.names.cache.Cache} whose methods raise an exception
containing the supplied arguments.
c                   ó   • \ rS rSrSrSrg)Ú!RaisingCache.CacheResultArgumentsé©   r7   r!   Nr8   r!   r   r   ÚCacheResultArgumentsr\   ©   r:   r   r^   c                 ó$   • U R                  X5      erF   )r^   r   s      r   ÚcacheResultÚRaisingCache.cacheResult®   s   € ð ×'Ñ'¨Ó5Ð5r   r!   N)	r   r   r   r   r   r=   r^   r`   r    r!   r   r   rY   rY   £   s   † ñô
˜yô õ

6r   rY   c                 ó  • / n[         R                  " UR                  5        U R                  [         R                  UR                  5        U" U0 UD6  U R                  U Vs/ s H
  ofS   S   PM     snU5        gs  snf )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   ÚassertLogMessagerm   »   sm   € ð. €NÜ‡O‚O�N×)Ñ)Ô*Ø×Ñœ×*Ñ*¨N×,AÑ,AÔBáˆdÐ�fÒà×Ñ±>ÓB²>¨a˜I™, qœ/±>ÑBÐDTÕUùÒBs   Á$A>c                   ó˜  • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1S0 r2S1 r3S2 r4S3 r5S4 r6S5 r7S6 r8S7 r9S8 r:S9 r;S: r<S; r=S< r>S= r?S> r@S? rAS@ rBSA rCSB rDSCrEgD)EÚDNSServerFactoryTestséÛ   z'
Tests for L{server.DNSServerFactory}.
c                 ó~   • U R                  [        R                  " 5       R                  [        R
                  5        g)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                 óv   • U R                  [        R                  " 5       R                  R                  / 5        g)zV
L{server.DNSServerFactory.resolver} is an empty L{resolve.ResolverChain}
by default.
N©rg   r	   rs   rt   Ú	resolversrv   s    r   Útest_resolverDefaultEmptyÚ/DNSServerFactoryTests.test_resolverDefaultEmptyç   s)   € ð
 	×Ñœ×0Ò0Ó2×;Ñ;×EÑEÀrÕJr   c                 óŒ   • [        5       nU R                  [        R                  " U/S9R                  R
                  U/5        g)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©Úobjectrg   r	   rs   rt   r{   ©r   ÚdummyResolvers     r   Útest_authoritiesÚ&DNSServerFactoryTests.test_authoritiesî   s:   € ô ›ˆØ×ÑÜ×#Ò#°°Ñ@×IÑI×SÑSØˆOõ	
r   c                 óŒ   • [        5       nU R                  [        R                  " U/S9R                  R
                  U/5        g)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}.
©ÚcachesNr€   r‚   s     r   Útest_cachesÚ!DNSServerFactoryTests.test_cachesú   s:   € ô ›ˆØ×ÑÜ×#Ò#¨M¨?Ñ;×DÑD×NÑNØˆOõ	
r   c                 óŒ   • [        5       nU R                  [        R                  " U/S9R                  R
                  U/5        g)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}.
©ÚclientsNr€   r‚   s     r   Útest_clientsÚ"DNSServerFactoryTests.test_clients  s:   € ô ›ˆØ×ÑÜ×#Ò#¨]¨OÑ<×EÑE×OÑOØˆOõ	
r   c                 ó¾   •  " S S5      n " S S5      n " S S5      nU R                  [        R                  " U/U/U/S9R                  R                  XU/5        g)	zb
L{server.DNSServerFactory.resolver} contains an ordered list of
authorities, caches and clients.
c                   ó   • \ rS rSrSrg)Ú@DNSServerFactoryTests.test_resolverOrder.<locals>.DummyAuthorityi  r!   N©r   r   r   r   r    r!   r   r   ÚDummyAuthorityr’     ó   † Úr   r”   c                   ó   • \ rS rSrSrg)Ú<DNSServerFactoryTests.test_resolverOrder.<locals>.DummyCachei  r!   Nr“   r!   r   r   Ú
DummyCacher—     r•   r   r˜   c                   ó   • \ rS rSrSrg)Ú=DNSServerFactoryTests.test_resolverOrder.<locals>.DummyClienti  r!   Nr“   r!   r   r   ÚDummyClientrš     r•   r   r›   )r   rˆ   r�   Nrz   )r   r”   r˜   r›   s       r   Útest_resolverOrderÚ(DNSServerFactoryTests.test_resolverOrder  s]   € ÷	ñ 	÷	ñ 	÷	ñ 	ð 	×ÑÜ×#Ò#Ø+Ð,°j°\ÈKÈ=ñç‰h—y‘yØ¨Ð5õ		
r   c                 ó`   • U R                  [        R                  " 5       R                  5        g)z9
L{server.DNSServerFactory.cache} is L{None} by default.
N)ÚassertIsNoner	   rs   Úcacherv   s    r   Útest_cacheDefaultÚ'DNSServerFactoryTests.test_cacheDefault)  s!   € ð 	×Ñœ&×1Ò1Ó3×9Ñ9Õ:r   c                 óˆ   • [        5       nU R                  [        R                  " [        5       U/S9R                  U5        g)zx
L{server.DNSServerFactory.__init__} assigns the last object in the
C{caches} list to L{server.DNSServerFactory.cache}.
r‡   N)r�   rg   r	   rs   r    r‚   s     r   Útest_cacheOverrideÚ(DNSServerFactoryTests.test_cacheOverride/  s7   € ô
 ›ˆØ×ÑÜ×#Ò#¬F«H°mÐ+DÑE×KÑKØõ	
r   c                 ó`   • U R                  [        R                  " 5       R                  5        g)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	   rs   Ú
canRecurserv   s    r   Útest_canRecurseDefaultÚ,DNSServerFactoryTests.test_canRecurseDefault:  s!   € ð 	×Ñœ×0Ò0Ó2×=Ñ=Õ>r   c                 ób   • U R                  [        R                  " S/S9R                  S5        g)zf
L{server.DNSServerFactory.__init__} sets C{canRecurse} to L{True} if it
is supplied with C{clients}.
NrŒ   T)rg   r	   rs   r¨   rv   s    r   Útest_canRecurseOverrideÚ-DNSServerFactoryTests.test_canRecurseOverrideB  s'   € ð
 	×Ñœ×0Ò0¸$¸Ñ@×KÑKÈTÕRr   c                 ó`   • U R                  [        R                  " 5       R                  5        g)z:
L{server.DNSServerFactory.verbose} defaults to L{False}.
N)r§   r	   rs   Úverboserv   s    r   Útest_verboseDefaultÚ)DNSServerFactoryTests.test_verboseDefaultI  s!   € ð 	×Ñœ×0Ò0Ó2×:Ñ:Õ;r   c                 ó^   • U R                  [        R                  " SS9R                  5        g)zw
L{server.DNSServerFactory.__init__} accepts a C{verbose} argument which
overrides L{server.DNSServerFactory.verbose}.
T©r¯   N)Ú
assertTruer	   rs   r¯   rv   s    r   Útest_verboseOverrideÚ*DNSServerFactoryTests.test_verboseOverrideO  s!   € ð
 	�‰œ×/Ò/¸Ñ=×EÑEÕFr   c                 ó^   • U R                  [        [        [        R                  5      5        g)z<
L{server.DNSServerFactory} implements L{IProtocolFactory}.
N)r´   r   r   r	   rs   rv   s    r   Útest_interfaceÚ$DNSServerFactoryTests.test_interfaceV  s   € ð 	�‰œÔ$4´f×6MÑ6MÓNÕOr   c                 ót   • U R                  [        R                  R                  [        R
                  5        g)zE
L{server.DNSServerFactory.protocol} defaults to L{dns.DNSProtocol}.
N)ÚassertIsr	   rs   r)   r   ÚDNSProtocolrv   s    r   Útest_defaultProtocolÚ*DNSServerFactoryTests.test_defaultProtocol\  s"   € ð 	�‰”f×-Ñ-×6Ñ6¼¿¹ÕHr   c                 óà   ^•  " S S5      nU" 5       mU4S jn[         R                  " 5       nX#l        UR                  SS9nU R	                  TU40 4XDR
                  UR                  45        g)z“
L{server.DNSServerFactory.buildProtocol} builds a protocol by calling
L{server.DNSServerFactory.protocol} with its self as a positional
argument.
c                   ó    • \ rS rSrSrSrSrSrg)ÚNDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.FakeProtocolii  Nr!   )r   r   r   r   Úfactoryr   r   r    r!   r   r   ÚFakeProtocolrÁ   i  s   † ØˆGØˆDØ‹Fr   rÃ   c                  ó$   >• U Tl         UTl        T$ r   r   )r   r   ÚstubProtocols     €r   ÚfakeProtocolFactoryÚUDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.fakeProtocolFactoryp  s   ø€ Ø $ˆLÔØ"(ˆLÔØÐr   N)Úaddr)r	   rs   r)   ÚbuildProtocolrg   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                 ó^   • [         R                  " 5       n[        U / UR                  S5        g)zU
L{server.DNSServerFactory._verboseLog} does not log messages unless
C{verbose > 0}.
úFoo BarN©r	   rs   rm   Ú_verboseLog©r   rÊ   s     r   Útest_verboseLogQuietÚ*DNSServerFactoryTests.test_verboseLogQuiet{  s$   € ô
 ×#Ò#Ó%ˆÜ˜˜r 1§=¡=°)Õ<r   c                 ó^   • [         R                  " SS9n[        U S/UR                  S5        g)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           	      ór   • [         R                  " 5       n[        SS9n[        U S/UR                  USSS9  g)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%   rm   ÚmessageReceived©r   rl   rÊ   s      r   Ú"test_messageReceivedLoggingNoQueryÚ8DNSServerFactoryTests.test_messageReceivedLoggingNoQueryŠ  s<   € ô
 �KŠK‹MˆÜ&¨qÑ1ˆäØØ3Ð4Ø×ÑØØØ'ó	
r   c           	      óê   • [         R                  " 5       nUR                  S[         R                  S9  UR                  S[         R                  S9  [        SS9n[        U S/UR                  USSS9  g)	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%   rm   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           	      óê   • [         R                  " 5       nUR                  S[         R                  S9  UR                  S[         R                  S9  [        SS9n[        U S/UR                  USSS9  g)	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                 óü   ^• [         R                  " 5       n[        5       n[        5       mU R	                  [
        R                  SU4S j5        UR                  USSS9  U R                  UR                  T5        g)z^
L{server.DNSServerFactory.messageReceived} assigns a unix timestamp to
the received message.
Útimec                  ó   >• T $ r   r!   )Úts   €r   Ú<lambda>ÚEDNSServerFactoryTests.test_messageReceivedTimestamp.<locals>.<lambda>Ì  s   ø€ ±r   NrÜ   )
r   rÞ   r%   r�   Úpatchr	   ró   rß   rg   ÚtimeReceived)r   rl   rÊ   rõ   s      @r   Útest_messageReceivedTimestampÚ3DNSServerFactoryTests.test_messageReceivedTimestampÄ  s\   ø€ ô
 �KŠK‹MˆÜ&Ó(ˆÜ‹HˆØ�
‰
”6—;‘; ¬	Ô2Ø	×Ñ !¨4¸ÐÑ>à×Ñ˜Ÿ™¨Õ+r   c                 ó&  • [         R                  " 5       n[        5       n[        5       n[        5       nU R	                  [        R
                  UR                  UUUS9nUR                  u  pgU R                  XaX#45        U R                  U0 5        g)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Þ   r�   r2   ÚassertRaisesr9   rß   r   rg   )r   r(   ÚdummyProtocolÚdummyAddressrÊ   Úer   r   s           r   Útest_messageReceivedAllowQueryÚ4DNSServerFactoryTests.test_messageReceivedAllowQueryÑ  s…   € ô —+’+“-ˆÜ›ˆÜ“xˆä#Ó%ˆØ×ÑÜ#×7Ñ7Ø×ÑØØØ ð ð 
ˆð —v‘v‰ˆØ×Ñ˜¨ÐEÔFØ×Ñ˜ Õ$r   c                 ó@  ^•  " S S[         5      m " U4S jS[        R                  5      nU" 5       nU R                  TUR                  [
        R                  " 5       SSS9nUR                  u  u  pEpgU R                  UR                  [
        R                  5        g)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                   ó   • \ rS rSrSrg)ÚFDNSServerFactoryTests.test_allowQueryFalse.<locals>.SendReplyExceptioniî  r!   Nr“   r!   r   r   ÚSendReplyExceptionr  î  r•   r   r  c                   ó(   >• \ rS rSrS rU 4S jrSrg)ÚKDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactoryiñ  c                 ó   • g)NFr!   r   s      r   r+   ÚVDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.allowQueryò  s   € Ør   c                 ó   >• T" X5      e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  s   €r   r2   r  ñ  s   ø† ò÷7ð 7r   r2   NrÜ   )r=   r	   rs   rý   rß   r   rÞ   r   rg   Ú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                 óÊ   ^• S/Ul         / mU4S jn[        5       n[        R                  " S5      n[	        XQU5        UR                  X$5        U R                  TX$S4/5        g)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                 ó,   >• TR                  XU45        g r   ©rd   )r(   r)   r*   ÚreceivedMessagess      €r   ÚfakeHandlerÚ?DNSServerFactoryTests._messageReceivedTest.<locals>.fakeHandler  s   ø€ Ø×#Ñ# W¸Ð$@ÕAr   )ÚqueriesrJ   r	   rs   Úsetattrrß   rg   )r   Ú
methodNamer(   r  r)   rÂ   r  s         @r   Ú_messageReceivedTestÚ*DNSServerFactoryTests._messageReceivedTest  sd   ø€ ð  ˜&ˆŒàÐõ	Bô  “>ˆÜ×)Ò)¨$Ó/ˆÜ� [Ô1Ø×Ñ Ô2Ø×ÑÐ)¨WÀÐ,EÐ+FÕGr   c                 óh   • U R                  S[        R                  " [        R                  S95        g)zz
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_QUERY} on to L{DNSServerFactory.handleQuery}.
ÚhandleQuery©ÚopCodeN)r  r   rÞ   ÚOP_QUERYrv   s    r   Útest_queryMessageReceivedÚ/DNSServerFactoryTests.test_queryMessageReceived   s!   € ð
 	×!Ñ! -´·²ÄCÇLÁLÑ1QÕRr   c                 óh   • U R                  S[        R                  " [        R                  S95        g)zƒ
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_INVERSE} on to L{DNSServerFactory.handleInverseQuery}.
ÚhandleInverseQueryr  N)r  r   rÞ   Ú
OP_INVERSErv   s    r   Ú test_inverseQueryMessageReceivedÚ6DNSServerFactoryTests.test_inverseQueryMessageReceived'  s$   € ð
 	×!Ñ!Ø ¤#§+¢+´S·^±^Ñ"Dõ	
r   c                 óh   • U R                  S[        R                  " [        R                  S95        g)z|
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_STATUS} on to L{DNSServerFactory.handleStatus}.
ÚhandleStatusr  N)r  r   rÞ   Ú	OP_STATUSrv   s    r   Útest_statusMessageReceivedÚ0DNSServerFactoryTests.test_statusMessageReceived0  ó!   € ð
 	×!Ñ! .´#·+²+ÄSÇ]Á]Ñ2SÕTr   c                 óh   • U R                  S[        R                  " [        R                  S95        g)z|
L{DNSServerFactory.messageReceived} passes messages with an opcode of
C{OP_NOTIFY} on to L{DNSServerFactory.handleNotify}.
ÚhandleNotifyr  N)r  r   rÞ   Ú	OP_NOTIFYrv   s    r   Útest_notifyMessageReceivedÚ0DNSServerFactoryTests.test_notifyMessageReceived7  r-  r   c                 óh   • U R                  S[        R                  " [        R                  S95        g)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_UPDATErv   s    r   Útest_updateMessageReceivedÚ0DNSServerFactoryTests.test_updateMessageReceived>  s!   € ð 	×!Ñ! -´·²ÄCÇMÁMÑ1RÕSr   c                 óÂ  • [        5       [        5       p![        R                  " 5       nUR                  U5        U R	                  UR
                  U/5        UR                  U5        U R	                  UR
                  X/5        UR                  U5        U R	                  UR
                  U/5        UR                  U5        U R	                  UR
                  / 5        g)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)r�   r	   rs   ÚconnectionMaderg   Ú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                 ó|  • [         R                  " 5       nUR                  S5        UR                  S5        [        R                  " 5       n[        5       Ul        U R                  [
        R                  UR                  U[        5       SS9nUR                  u  u  pEU R                  XAR                  S   5        g)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	   rs   rO   rt   rý   rT   r  rJ   r   rg   r  )r   rl   rÊ   r   rV   r   s         r   Útest_handleQueryÚ&DNSServerFactoryTests.test_handleQueryX  s—   € ô �KŠK‹MˆØ	�
‰
Ð%Ô&Ø	�
‰
Ð%Ô&Ü×#Ò#Ó%ˆÜ$Ó&ˆŒ
à×ÑÜ×*Ñ*Ø�M‰MØÜ!“^Øð ð 
ˆð Ÿ6™6Ñ‰ˆØ×Ñ˜§	¡	¨!¡Õ-r   c                 ó¢  ^^	• [         R                  " 5       n[        R                  " 5       m " U4S jS5      nU" 5       Ul        / m	U	4S jnX1l        [        R                  " 5       nUR                  S5        [        5       n[        5       nUR                  XEUS9  [        5       nTR                  U5        U R                  T	XuXF40 4/5        g)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                   ó"   >• \ rS rSrU 4S jrSrg)ÚDDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolveriz  c                 ó   >• T$ r   r!   ©r   r   r   Úds      €r   rV   ÚJDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolver.query{  ó   ø€ Ø�r   r!   N©r   r   r   r   rV   r    ©rJ  s   €r   ÚFakeResolverrG  z  ó   ø† ÷ð r   rO  c                  ó*   >• TR                  X45        g r   r  )r   r   ÚgotResolverResponseArgss     €r   ÚfakeGotResolverResponseÚODNSServerFactoryTests.test_handleQueryCallback.<locals>.fakeGotResolverResponse‚  s   ø€ Ø#×*Ñ*¨D¨>Õ:r   rA  rB  N)r	   rs   r   ÚDeferredrt   ÚgotResolverResponser   rÞ   ré   rJ   r�   r  Úcallbackrg   )
r   rÊ   rO  rS  rl   rÅ   rÿ   ÚdummyResponserJ  rR  s
           @@r   Útest_handleQueryCallbackÚ.DNSServerFactoryTests.test_handleQueryCallbackn  s±   ù€ ô ×#Ò#Ó%ˆä�NŠNÓˆ÷	ô 	ñ "“^ˆŒ
à"$Ðõ	;ð !8Ôä�KŠK‹MˆØ	�
‰
Ð%Ô&Ü#“~ˆÜ“xˆà	�‰˜aÀˆÑMä›ˆØ	�
‰
�=Ô!à×ÑØ#Ø¨AÐ<¸bÐAÐBõ	
r   c                 óÊ  ^^	• [         R                  " 5       n[        R                  " 5       m " U4S jS5      nU" 5       Ul        / m	U	4S jnX1l        [        R                  " 5       nUR                  S5        [        5       n[        5       nUR                  XEUS9  [        R                  " [        5       5      nTR                  U5        U R!                  T	XuXF40 4/5        g)a  
L{server.DNSServerFactory.handleQuery} adds
L{server.DNSServerFactory.resolver.gotResolverError} as an errback to
the deferred returned by L{server.DNSServerFactory.resolver.query}. It
is called with the query failure, the original protocol, message and
origin address.
c                   ó"   >• \ rS rSrU 4S jrSrg)ÚCDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolveri¢  c                 ó   >• T$ r   r!   rI  s      €r   rV   ÚIDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolver.query£  rL  r   r!   NrM  rN  s   €r   rO  r]  ¢  rP  r   rO  c                  ó*   >• TR                  X45        g r   r  )r   r   ÚgotResolverErrorArgss     €r   ÚfakeGotResolverErrorÚKDNSServerFactoryTests.test_handleQueryErrback.<locals>.fakeGotResolverErrorª  s   ø€ Ø ×'Ñ'¨¨Õ7r   rA  rB  N)r	   rs   r   rU  rt   ÚgotResolverErrorr   rÞ   ré   rJ   r�   r  r
   ÚFailurer=   Úerrbackrg   )
r   rÊ   rO  rb  rl   rÅ   rÿ   ÚstubFailurerJ  ra  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           	      ó”  • [         R                  " 5       n/ n/ n/ nU R                  [        R                  UR
                  X#U4[        5       [        R                  " 5       SS9nUR                  u  u  pgU R                  UR                  U5        U R                  UR                  U5        U R                  UR                  U5        g)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	   rs   rý   r?   rD   rV  r   rÞ   r   r»   ÚanswersÚ	authorityÚ
additional)r   rÊ   rl  rm  rn  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                 ó6  • [        5       n[        Ul        [        R                  " 5       nSUl        U R                  [        UR                  / / / 4SUSS9nU R                  S[        U[        R                  / / / S94UR                  UR                  45        g)z~
L{server.DNSServerFactory.gotResolverResponse} calls
L{server.DNSServerFactory._responseFromMessage} to generate a response.
rÖ   Nrk  r!   )r(   r  rl  rm  rn  )r%   r#   Ú_responseFromMessager   rÞ   rù   rý   r   rV  rg   ÚdictÚOKr   r   ©r   rÂ   Úrequestr   s       r   Ú0test_gotResolverResponseCallsResponseFromMessageÚFDNSServerFactoryTests.test_gotResolverResponseCallsResponseFromMessageÕ  sŸ   € ô
 -Ó.ˆÜ'-ˆÔ$ä—+’+“-ˆØ ˆÔà×ÑÜØ×'Ñ'Ø��RˆLØØØð ð 
ˆð 	×ÑàÜØ#ÜŸ&™&ØØ Ø!ñð	ð �V‰V�Q—X‘XÐõ	
r   c                 óš   • [         R                  " 5       n[        R                  " SSS9nUR	                  US94nU R                  X#5        g)zv
L{server.DNSServerFactory._responseFromMessage} generates a response
message which is a copy of the request message.
F)ÚanswerÚrecAv©r(   N)r	   rs   r   rÞ   rr  ÚassertIsNot©r   rÂ   rv  Úresponses       r   Ú"test_responseFromMessageNewMessageÚ8DNSServerFactoryTests.test_responseFromMessageNewMessageö  sF   € ô
 ×)Ò)Ó+ˆÜ—+’+ U°%Ñ8ˆØ×0Ñ0¸Ð0ÐAÐCˆà×Ñ˜Õ+r   c                 ó  • [         R                  " 5       nSUl        UR                  [        R
                  " SS9S9nSUl        UR                  [        R
                  " SS9S9nU R                  SUR                  UR                  45        g)z§
L{server.DNSServerFactory._responseFromMessage} generates a response
message whose C{recAV} attribute is L{True} if
L{server.DNSServerFactory.canRecurse} is L{True}.
TF)r{  r|  ©TFN)r	   rs   r¨   rr  r   rÞ   rg   r{  ©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                 óÐ   • [         R                  " 5       n[        R                  " 5       nSUl        UR                  US9nU R                  UR                  UR                  5        g)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	   rs   r   rÞ   rù   rr  rg   r~  s       r   Ú$test_responseFromMessageTimeReceivedÚ:DNSServerFactoryTests.test_responseFromMessageTimeReceived  sT   € ô ×)Ò)Ó+ˆÜ—+’+“-ˆØ#ˆÔØ×/Ñ/¸Ð/Ð@ˆà×Ñ˜×-Ñ-¨x×/DÑ/DÕEr   c                 óÐ   • [         R                  " 5       n[        R                  " 5       nSUl        UR                  US9nU R                  UR                  UR                  5        g)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	   rs   r   rÞ   ÚmaxSizerr  rg   r~  s       r   Útest_responseFromMessageMaxSizeÚ5DNSServerFactoryTests.test_responseFromMessageMaxSize  sQ   € ô ×)Ò)Ó+ˆÜ—+’+“-ˆØˆŒØ×/Ñ/¸Ð/Ð@ˆà×Ñ˜Ÿ™¨(×*:Ñ*:Õ;r   c                 ót   • U R                  [        R                  [        R                  R
                  5        g)zc
L{server.DNSServerFactory} has a C{_messageFactory} attribute which is
L{dns.Message} by default.
N)r»   r   rÞ   r	   rs   Ú_messageFactoryrv   s    r   Útest_messageFactoryÚ)DNSServerFactoryTests.test_messageFactory(  s"   € ð
 	�‰”c—k‘k¤6×#:Ñ#:×#JÑ#JÕKr   c                 ó˜  • [         R                  " 5       nU R                  [        S[        5        [        R
                  " 5       nU R                  [        UR                  U[        R                  S9nU R                  S[        UR                  U[        R                  UR                  SS94UR                  UR                  45        g)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.
rr  ©r(   r  r!   F)ÚresponseConstructorr(   r  r{  ÚauthN)r	   rs   rø   r   r#   rÞ   rý   r   rr  rt  rg   rs  r‘  r¨   r   r   ru  s       r   Ú+test_responseFromMessageCallsMessageFactoryÚADNSServerFactoryTests.test_responseFromMessageCallsMessageFactory/  sª   € ô ×)Ò)Ó+ˆØ�
‰
”3Ð.´Ô7ä—+’+“-ˆØ×ÑÜ˜W×9Ñ9À7ÔRU×RXÑRXð ð 
ˆð 	×ÑàÜØ(/×(?Ñ(?Ø#ÜŸ&™&Ø!×,Ñ,Øñð	ð �V‰V�Q—X‘XÐõ	
r   c                 óV  • [         R                  " 5       nUR                  [        R                  " 5       [        R
                  " SS9/S9nUR                  [        R                  " 5       [        R
                  " SS9/S9nU R                  SUR                  UR                  45        g)z�
L{server.DNSServerFactory._responseFromMessage} marks the response
message as authoritative if any of the answer records are authoritative.
T)r—  )r(   rl  Frƒ  N)r	   rs   rr  r   rÞ   ÚRRHeaderrg   r—  r„  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           
      ó  • [        SS9n[        R                  " 5       /n[        R                  " 5       /n[        R                  " 5       /n[        U S/UR                  X#U4[        5       [        R                  " 5       SS9  g)zt
L{server.DNSServerFactory.gotResolverResponse} logs the total number of
records in the response if C{verbose > 0}.
rÖ   r³   zLookup found 3 recordsNrk  )r%   r   r›  rm   rV  rJ   rÞ   )r   rÊ   rl  rm  rn  s        r   Útest_gotResolverResponseLoggingÚ5DNSServerFactoryTests.test_gotResolverResponseLogging]  sk   € ô
 '¨qÑ1ˆÜ—<’<“>Ð"ˆÜ—\’\“^Ð$ˆ	Ü—l’l“nÐ%ˆ
äØØ%Ð&Ø×!Ñ!Ø Ð,Ü!“^Ü—K’K“MØó	
r   c           	      óî  • [        [        5       /S9n[        R                  " 5       nUR	                  S5        [        R
                  " 5       /n/ n/ nU R                  [        R                  UR                  X4U4[        5       USS9nUR                  u  u  nu  p‰p«U R                  UR                  R                  S5        U R                  Xƒ5        U R                  X”5        U R                  X¥5        g)z{
L{server.DNSServerFactory.gotResolverResponse} caches the response if at
least one cache was provided in the constructor.
r‡   s   example.comNrk  )r%   rY   r   rÞ   ré   r›  rý   r^   rV  rJ   r   rg   ræ   r»   )r   rÊ   rl   ÚexpectedAnswersÚexpectedAuthorityÚexpectedAdditionalr   rV   rl  rm  rn  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           	      óx  • [        5       n[        Ul        [        R                  " 5       nSUl        U R                  [        UR                  [        R                  " [        R                  " 5       5      SUSS9nU R                  S[        U[        R                  S94UR                   UR"                  45        g)z{
L{server.DNSServerFactory.gotResolverError} calls
L{server.DNSServerFactory._responseFromMessage} to generate a response.
rÖ   Nrk  r!   r•  )r%   r#   rr  r   rÞ   rù   rý   r   rd  r
   re  r   ÚDomainErrorrg   rs  ÚENAMEr   r   ru  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           	      ó<  • [         R                  " 5       nU R                  [        R                  UR
                  [        R                  " U5      [        5       [        R                  " 5       SS9nUR                  u  u  pVU R                  UR                  U5        g)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}
Nrk  )r	   rs   rý   r?   rD   rd  r
   re  r   rÞ   r   rg   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                 ój   • U R                  [        R                  " 5       [        R                  5        g)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©  rv   s    r   Ú test_gotResolverErrorDomainErrorÚ6DNSServerFactoryTests.test_gotResolverErrorDomainErrorÁ  s!   € ð
 	×(Ñ(¬×):Ò):Ó)<¼c¿i¹iÕHr   c                 ój   • U R                  [        R                  " 5       [        R                  5        g)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©  rv   s    r   Ú-test_gotResolverErrorAuthoritativeDomainErrorÚCDNSServerFactoryTests.test_gotResolverErrorAuthoritativeDomainErrorÈ  s!   € ð 	×(Ñ(¬×)GÒ)GÓ)IÌ3Ï9É9ÕUr   c                 ó´   • U R                  [        5       [        R                  5        U R	                  [        5      nU R                  [        U5      S5        g)z¢
L{server.DNSServerFactory.gotResolver} triggers a response message with
an C{rCode} of L{dns.ESERVER} if supplied with another type of error and
logs the error.
rÖ   N)r¯  ÚKeyErrorr   ÚESERVERÚflushLoggedErrorsrg   Úlen)r   r   s     r   Útest_gotResolverErrorOtherErrorÚ5DNSServerFactoryTests.test_gotResolverErrorOtherErrorÐ  s>   € ð 	×(Ñ(¬«´S·[±[ÔAØ×"Ñ"¤8Ó,ˆØ×Ñœ˜Q› Õ#r   c           
      óÎ   • [        SS9n[        U S/UR                  [        R                  " [
        R                  " 5       5      [        5       [        R                  " 5       SS9  g)zJ
L{server.DNSServerFactory.gotResolver} logs a message if C{verbose > 0}.
rÖ   r³   zLookup failedNrk  )
r%   rm   rd  r
   re  r   r¨  rJ   r   rÞ   rÒ   s     r   Útest_gotResolverErrorLoggingÚ2DNSServerFactoryTests.test_gotResolverErrorLoggingÚ  sN   € ô '¨qÑ1ˆÜØØÐØ×ÑÜ�OŠOœE×-Ò-Ó/Ó0Ü!“^Ü—K’K“MØó	
r   c                 óÈ  ^• [         R                  " 5       n/ mU4S jUl        [        R                  " SSS9n[        5       [        5       /Ul        [        5       [        5       /Ul        [        5       [        5       /Ul        UR                  [        R                  " [        R                  " 5       5      SUSS9  U R                  [        R                  " SSS9/T5        g)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                 ó&   >• TR                  U5      $ r   r  ©r)   r  r*   Ú	responsess      €r   rö   ÚUDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributes.<locals>.<lambda>ñ  ó   ø€ À	×@PÑ@PØôA
r   T©ÚauthenticDataÚcheckingDisabledNrk  é   ©r  rz  )r	   rs   r.   r   rÞ   r�   rl  rm  rn  rd  r
   re  r   r¨  rg   ©r   rÂ   rv  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                 ó€  ^• [         R                  " 5       n/ mU4S jUl        [        R                  " SSS9n[        5       [        5       /Ul        [        5       [        5       /Ul        [        5       [        5       /Ul        UR                  / / / 4SUSS9  U R                  [        R                  " SSS9/T5        g)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                 ó&   >• TR                  U5      $ r   r  rÄ  s      €r   rö   ÚXDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes.<locals>.<lambda>
  rÇ  r   TrÈ  Nrk  r   rÌ  )r	   rs   r.   r   rÞ   r�   rl  rm  rn  rV  rg   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                 ó8  • [         R                  " 5       n[        5       n[        R                  " 5       nU R                  [        R                  UR                  [        5       UUS9nUR                  u  pVU R                  XQU45        U R                  U0 5        g)z•
If L{server.DNSServerFactory.sendReply} is supplied with a protocol
*and* an address tuple it will supply that address to
C{protocol.writeMessage}.
rk  N)r   rÞ   r�   r	   rs   rý   r?   rD   r.   r   rg   )r   rl   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                 ó"  • [         R                  " 5       n[        R                  " 5       nU R	                  [
        R                  UR                  [        5       USS9nUR                  u  pEU R                  XA45        U R                  U0 5        g)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}.
Nrk  )
r   rÞ   r	   rs   rý   r?   rD   r.   r   rg   )r   rl   rÊ   r   r   r   s         r   Útest_sendReplyWithoutAddressÚ2DNSServerFactoryTests.test_sendReplyWithoutAddress,  s{   € ô �KŠK‹MˆÜ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�K‰KÜ$Ó&ØØð ð 
ˆð —v‘v‰ˆØ×Ñ˜˜tÔ$Ø×Ñ˜ Õ$r   c           	      óì   • U R                  [        R                  SS 5        [        R                  " 5       nSUl        [        R                  " SS9n[        U SS/UR                  [        5       USS	9  g)
zm
If L{server.DNSServerFactory.sendReply} logs a "no answers" message if
the supplied message has no answers.
ró   c                  ó   • g©Ni‚Q r!   r!   r   r   rö   ÚFDNSServerFactoryTests.test_sendReplyLoggingNoAnswers.<locals>.<lambda>D  ó   € °r   é�Q rï   r³   zReplying with no answersú Processed query in 1.000 secondsNrk  )
rø   r	   ró   r   rÞ   rù   rs   rm   r.   rJ   rà   s      r   Útest_sendReplyLoggingNoAnswersÚ4DNSServerFactoryTests.test_sendReplyLoggingNoAnswers?  s`   € ð
 	�
‰
”6—;‘; ©Ô6Ü�KŠK‹MˆØˆŒÜ×#Ò#¨AÑ.ˆÜØØ'Ð)KÐLØ�K‰KÜ!“^ØØó	
r   c           	      ór  • U R                  [        R                  SS 5        [        R                  " 5       nUR
                  R                  [        R                  " [        R                  " S5      S95        UR                  R                  [        R                  " [        R                  " S5      S95        UR                  R                  [        R                  " [        R                  " S5      S95        SUl        [        R                  " SS9n[        U / SQUR                  [        5       US	S
9  g	)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                  ó   • grÝ  r!   r!   r   r   rö   ÚHDNSServerFactoryTests.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á  Nrk  )rø   r	   ró   r   rÞ   rl  rd   r›  ÚRecord_Arm  rn  rù   rs   rm   r.   rJ   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                 ó.  • [         R                  " 5       nU R                  [        R                  UR
                  [        R                  " 5       [        5       SS9nUR                  u  u  p4U R                  UR                  [        R                  5        g)z
L{server.DNSServerFactory.handleInverseQuery} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
NrB  )r	   rs   rý   r?   rD   r$  r   rÞ   r   rg   r  ÚENOTIMP©r   rÊ   r   r(   r   s        r   Útest_handleInverseQueryÚ-DNSServerFactoryTests.test_handleInverseQueryl  ss   € ô
 ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø× Ñ Ü—K’K“MÜ$Ó&Øð ð 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™¬¯©Õ4r   c           	      ó~   • [        SS9n[        U S/UR                  [        R                  " 5       [        5       SS9  g)zb
L{server.DNSServerFactory.handleInverseQuery} logs the message origin
address if C{verbose > 0}.
rÖ   r³   zInverse query from ('::1', 53)©z::1rÛ   rB  N)r%   rm   r$  r   rÞ   rJ   rÒ   s     r   Útest_handleInverseQueryLoggingÚ4DNSServerFactoryTests.test_handleInverseQueryLogging}  s9   € ô
 '¨qÑ1ˆÜØØ-Ð.Ø× Ñ Ü—K’K“MÜ!“^Øó	
r   c                 ó.  • [         R                  " 5       nU R                  [        R                  UR
                  [        R                  " 5       [        5       SS9nUR                  u  u  p4U R                  UR                  [        R                  5        g)zy
L{server.DNSServerFactory.handleStatus} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
NrB  )r	   rs   rý   r?   rD   r)  r   rÞ   r   rg   r  rì  rí  s        r   Útest_handleStatusÚ'DNSServerFactoryTests.test_handleStatusŒ  óq   € ô
 ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�N‰NÜ—K’K“MÜ$Ó&Øð ð 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™¬¯©Õ4r   c           	      ó~   • [        SS9n[        U S/UR                  [        R                  " 5       [        5       SS9  g)z\
L{server.DNSServerFactory.handleStatus} logs the message origin address
if C{verbose > 0}.
rÖ   r³   zStatus request from ('::1', 53)rñ  rB  N)r%   rm   r)  r   rÞ   rJ   rÒ   s     r   Útest_handleStatusLoggingÚ.DNSServerFactoryTests.test_handleStatusLogging�  ó7   € ô
 '¨qÑ1ˆÜØØ.Ð/Ø�N‰NÜ—K’K“MÜ!“^Øó	
r   c                 ó.  • [         R                  " 5       nU R                  [        R                  UR
                  [        R                  " 5       [        5       SS9nUR                  u  u  p4U R                  UR                  [        R                  5        g)zy
L{server.DNSServerFactory.handleNotify} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
NrB  )r	   rs   rý   r?   rD   r/  r   rÞ   r   rg   r  rì  rí  s        r   Útest_handleNotifyÚ'DNSServerFactoryTests.test_handleNotify¬  r÷  r   c           	      ó~   • [        SS9n[        U S/UR                  [        R                  " 5       [        5       SS9  g)z\
L{server.DNSServerFactory.handleNotify} logs the message origin address
if C{verbose > 0}.
rÖ   r³   zNotify message from ('::1', 53)rñ  rB  N)r%   rm   r/  r   rÞ   rJ   rÒ   s     r   Útest_handleNotifyLoggingÚ.DNSServerFactoryTests.test_handleNotifyLogging½  rû  r   c                 ó.  • [         R                  " 5       nU R                  [        R                  UR
                  [        R                  " 5       [        5       SS9nUR                  u  u  p4U R                  UR                  [        R                  5        g)zx
L{server.DNSServerFactory.handleOther} triggers the sending of a
response message with C{rCode} set to L{dns.ENOTIMP}.
NrB  )r	   rs   rý   r?   rD   r4  r   rÞ   r   rg   r  rì  rí  s        r   Útest_handleOtherÚ&DNSServerFactoryTests.test_handleOtherÌ  sq   € ô
 ×#Ò#Ó%ˆØ×ÑÜ×1Ñ1Ø�M‰MÜ—K’K“MÜ$Ó&Øð ð 
ˆð ŸV™VÑ‰
ˆà×Ñ˜Ÿ™¬¯©Õ4r   c           	      ó~   • [        SS9n[        U S/UR                  [        R                  " 5       [        5       SS9  g)z[
L{server.DNSServerFactory.handleOther} logs the message origin address
if C{verbose > 0}.
rÖ   r³   z$Unknown op code (0) from ('::1', 53)rñ  rB  N)r%   rm   r4  r   rÞ   rJ   rÒ   s     r   Útest_handleOtherLoggingÚ-DNSServerFactoryTests.test_handleOtherLoggingÝ  s7   € ô
 '¨qÑ1ˆÜØØ3Ð4Ø�M‰MÜ—K’K“MÜ!“^Øó	
r   r!   N)Fr   r   r   r   r   rw   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+  r1  r6  r>  rC  rY  rh  ro  rw  r€  r‡  rŠ  rŽ  r’  r˜  rœ  rŸ  r¥  rª  r¯  r²  r¶  r½  rÀ  rÎ  rÓ  rÖ  rÙ  râ  ré  rî  rò  rõ  rù  rý  r   r  r  r    r!   r   r   ro   ro   Û   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   ro   N)r   Úzope.interface.verifyr   Útwisted.internetr   Útwisted.internet.interfacesr   Útwisted.namesr   r   r   r	   Útwisted.pythonr
   r   Útwisted.trialr   r=   r   r#   rs   r%   r2   r?   rJ   rO   rY   rm   ÚTestCasero   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   