
    YfȢ                     d   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZ  G d d	e          Zd
 Z G d dej                  Z G d dej                  Z G d d          Z G d d          Z G d d          Z G d d          Zd Z G d dej                  ZdS )z)
Test cases for L{twisted.names.server}.
    )verifyClass)defer)IProtocolFactory)dnserrorresolveserver)failurelog)unittestc                       e Zd ZdZd ZdS )RaisedArgumentszD
    An exception containing the arguments raised by L{raiser}.
    c                 "    || _         || _        d S Nargskwargsselfr   r   s      P/var/www/html/env/lib/python3.11/site-packages/twisted/names/test/test_server.py__init__zRaisedArguments.__init__   s    	    N)__name__
__module____qualname____doc__r    r   r   r   r      s-             r   r   c                  "    t          | |          )z
    Raise a L{RaisedArguments} exception containing the supplied arguments.

    Used as a fake when testing the call signatures of  methods and functions.
    )r   r   s     r   raiserr      s     $
'
''r   c                       e Zd ZdZd Zd ZdS )NoResponseDNSServerFactorya  
    A L{server.DNSServerFactory} subclass which does not attempt to reply to any
    received messages.

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

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

        @return: L{False}
        @rtype: L{bool}
        Fr   )r   messageprotocoladdresss       r   
allowQueryz%NoResponseDNSServerFactory.allowQuery.   s	     ur   c                     dS )z
        A noop send reply.

        @param protocol: See L{server.DNSServerFactory.sendReply}
        @param message: See L{server.DNSServerFactory.sendReply}
        @param address: See L{server.DNSServerFactory.sendReply}
        Nr   )r   r$   r#   r%   s       r   	sendReplyz$NoResponseDNSServerFactory.sendReply;         r   N)r   r   r   r   r&   r(   r   r   r   r!   r!   $   s<               r   r!   c                   4    e Zd ZdZ G d de          Zd ZdS )RaisingDNSServerFactoryz
    A L{server.DNSServerFactory} subclass whose methods raise an exception
    containing the supplied arguments.

    Used for stopping L{messageReceived} and testing the arguments supplied to
    L{allowQuery}.
    c                       e Zd ZdZdS )+RaisingDNSServerFactory.AllowQueryArgumentsG
        Contains positional and keyword arguments in C{args}.
        Nr   r   r   r   r   r   r   AllowQueryArgumentsr-   N           	 	 	 	r   r0   c                 .    |                      ||          )aC  
        Raise the arguments supplied to L{allowQuery}.

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

        @param kwargs: Keyword args which will be recorded in the raised
            exception.
        @type kwargs: L{dict}
        )r0   r   s      r   r&   z"RaisingDNSServerFactory.allowQueryS   s     &&tV444r   N)r   r   r   r   	Exceptionr0   r&   r   r   r   r+   r+   E   sW             i   
5 5 5 5 5r   r+   c                   4    e Zd ZdZ G d de          Zd ZdS )RaisingProtocolzm
    A partial fake L{IProtocol} whose methods raise an exception containing the
    supplied arguments.
    c                       e Zd ZdZdS )%RaisingProtocol.WriteMessageArgumentsr.   Nr/   r   r   r   WriteMessageArgumentsr7   h   r1   r   r8   c                 .    |                      ||          z
        Raises the supplied arguments.

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

        @param kwargs: Keyword args
        @type kwargs: L{dict}
        )r8   r   s      r   writeMessagezRaisingProtocol.writeMessagem   s     ((v666r   N)r   r   r   r   r3   r8   r;   r   r   r   r5   r5   b   sW         
    	   

7 
7 
7 
7 
7r   r5   c                       e Zd ZdZd ZdS )NoopProtocolzT
    A partial fake L{dns.DNSProtocolMixin} with a noop L{writeMessage} method.
    c                     dS )z
        A noop version of L{dns.DNSProtocolMixin.writeMessage}.

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

        @param kwargs: Keyword args
        @type kwargs: L{dict}
        Nr   r   s      r   r;   zNoopProtocol.writeMessage   r)   r   N)r   r   r   r   r;   r   r   r   r=   r=   z   s-         	 	 	 	 	r   r=   c                   4    e Zd ZdZ G d de          Zd ZdS )RaisingResolverzm
    A partial fake L{IResolver} whose methods raise an exception containing the
    supplied arguments.
    c                       e Zd ZdZdS )RaisingResolver.QueryArgumentsr.   Nr/   r   r   r   QueryArgumentsrB      r1   r   rC   c                 .    |                      ||          r:   )rC   r   s      r   queryzRaisingResolver.query   s     !!$///r   N)r   r   r   r   r3   rC   rE   r   r   r   r@   r@      sW         
       

0 
0 
0 
0 
0r   r@   c                   4    e Zd ZdZ G d de          Zd ZdS )RaisingCachez}
    A partial fake L{twisted.names.cache.Cache} whose methods raise an exception
    containing the supplied arguments.
    c                       e Zd ZdZdS )!RaisingCache.CacheResultArgumentsr.   Nr/   r   r   r   CacheResultArgumentsrI      r1   r   rJ   c                 .    |                      ||          r:   )rJ   r   s      r   cacheResultzRaisingCache.cacheResult   s     ''f555r   N)r   r   r   r   r3   rJ   rL   r   r   r   rG   rG      sW         
    y   

6 
6 
6 
6 
6r   rG   c                     g }t          j        |j                   |                     t           j        |j                    ||i | |                     d |D             |           dS )a  
    Assert that the callable logs the expected messages when called.

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

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

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

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

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

    @param kwargs: Keyword arguments to be passed to C{callable}.
    @type kwargs: L{dict}
    c                 *    g | ]}|d          d         S )r#   r   r   ).0ms     r   
<listcomp>z$assertLogMessage.<locals>.<listcomp>   s     BBBa!I,q/BBBr   N)r   addObserverappend
addCleanupremoveObserverassertEqual)testCaseexpectedMessagescallabler   r   loggedMessagess         r   assertLogMessager[      sy    . NON)****N,ABBBHdfBB>BBBDTUUUUUr   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdBS )CDNSServerFactoryTestsz/
    Tests for L{server.DNSServerFactory}.
    c                 r    |                      t          j                    j        t          j                   dS )zd
        L{server.DNSServerFactory.resolver} is a L{resolve.ResolverChain}
        instance
        N)assertIsInstancer	   DNSServerFactoryresolverr   ResolverChainr   s    r   test_resolverTypez'DNSServerFactoryTests.test_resolverType   s/    
 	f577@'BWXXXXXr   c                 h    |                      t          j                    j        j        g            dS )zn
        L{server.DNSServerFactory.resolver} is an empty L{resolve.ResolverChain}
        by default.
        NrV   r	   r`   ra   	resolversrc   s    r   test_resolverDefaultEmptyz/DNSServerFactoryTests.test_resolverDefaultEmpty   s/    
 	022;ErJJJJJr   c                     t                      }|                     t          j        |g          j        j        |g           dS )z
        L{server.DNSServerFactory.__init__} accepts an C{authorities}
        argument. The value of this argument is a list and is used to extend the
        C{resolver} L{resolve.ResolverChain}.
        )authoritiesNobjectrV   r	   r`   ra   rg   r   dummyResolvers     r   test_authoritiesz&DNSServerFactoryTests.test_authorities   sM     #@@@ISO	
 	
 	
 	
 	
r   c                     t                      }|                     t          j        |g          j        j        |g           dS )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}.
        cachesNrk   rm   s     r   test_cachesz!DNSServerFactoryTests.test_caches   sM     #M?;;;DNO	
 	
 	
 	
 	
r   c                     t                      }|                     t          j        |g          j        j        |g           dS )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}.
        clientsNrk   rm   s     r   test_clientsz"DNSServerFactoryTests.test_clients  sM     #]O<<<EOO	
 	
 	
 	
 	
r   c                      G d d          } G d d          } G d d          }|                      t          j        |g|g|g          j        j        |||g           dS )	zz
        L{server.DNSServerFactory.resolver} contains an ordered list of
        authorities, caches and clients.
        c                       e Zd ZdS )@DNSServerFactoryTests.test_resolverOrder.<locals>.DummyAuthorityNr   r   r   r   r   r   DummyAuthorityrz             Dr   r|   c                       e Zd ZdS )<DNSServerFactoryTests.test_resolverOrder.<locals>.DummyCacheNr{   r   r   r   
DummyCacher     r}   r   r   c                       e Zd ZdS )=DNSServerFactoryTests.test_resolverOrder.<locals>.DummyClientNr{   r   r   r   DummyClientr     r}   r   r   )rj   rr   rv   Nrf   )r   r|   r   r   s       r   test_resolverOrderz(DNSServerFactoryTests.test_resolverOrder  s    	 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	#+,j\K=  yZ5		
 	
 	
 	
 	
r   c                 \    |                      t          j                    j                   dS )zI
        L{server.DNSServerFactory.cache} is L{None} by default.
        N)assertIsNoner	   r`   cacherc   s    r   test_cacheDefaultz'DNSServerFactoryTests.test_cacheDefault)  s*     	&1339:::::r   c                     t                      }|                     t          j        t                      |g          j        |           dS )z
        L{server.DNSServerFactory.__init__} assigns the last object in the
        C{caches} list to L{server.DNSServerFactory.cache}.
        rq   N)rl   rV   r	   r`   r   rm   s     r   test_cacheOverridez(DNSServerFactoryTests.test_cacheOverride/  sO    
 #FHHm+DEEEK	
 	
 	
 	
 	
r   c                 \    |                      t          j                    j                   dS )z
        L{server.DNSServerFactory.canRecurse} is a flag indicating that this
        server is capable of performing recursive DNS lookups. It defaults to
        L{False}.
        N)assertFalser	   r`   
canRecurserc   s    r   test_canRecurseDefaultz,DNSServerFactoryTests.test_canRecurseDefault:  s*     	022=>>>>>r   c                 d    |                      t          j        dg          j        d           dS )z~
        L{server.DNSServerFactory.__init__} sets C{canRecurse} to L{True} if it
        is supplied with C{clients}.
        Nru   T)rV   r	   r`   r   rc   s    r   test_canRecurseOverridez-DNSServerFactoryTests.test_canRecurseOverrideB  s3    
 	0$@@@KTRRRRRr   c                 \    |                      t          j                    j                   dS )zJ
        L{server.DNSServerFactory.verbose} defaults to L{False}.
        N)r   r	   r`   verboserc   s    r   test_verboseDefaultz)DNSServerFactoryTests.test_verboseDefaultI  s*     	022:;;;;;r   c                 `    |                      t          j        d          j                   dS )z
        L{server.DNSServerFactory.__init__} accepts a C{verbose} argument which
        overrides L{server.DNSServerFactory.verbose}.
        Tr   N)
assertTruer	   r`   r   rc   s    r   test_verboseOverridez*DNSServerFactoryTests.test_verboseOverrideO  s-    
 	/===EFFFFFr   c                 j    |                      t          t          t          j                             dS )zL
        L{server.DNSServerFactory} implements L{IProtocolFactory}.
        N)r   r   r   r	   r`   rc   s    r   test_interfacez$DNSServerFactoryTests.test_interfaceV  s*     	$4f6MNNOOOOOr   c                 d    |                      t          j        j        t          j                   dS )zU
        L{server.DNSServerFactory.protocol} defaults to L{dns.DNSProtocol}.
        N)assertIsr	   r`   r$   r   DNSProtocolrc   s    r   test_defaultProtocolz*DNSServerFactoryTests.test_defaultProtocol\  s&     	f-6HHHHHr   c                      G d d          } |            fd}t          j                    }||_        |                    d          }|                     |fi f||j        |j        f           dS )z
        L{server.DNSServerFactory.buildProtocol} builds a protocol by calling
        L{server.DNSServerFactory.protocol} with its self as a positional
        argument.
        c                       e Zd ZdZdZdZdS )NDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.FakeProtocolN)r   r   r   factoryr   r   r   r   r   FakeProtocolr   i  s        GDFFFr   r   c                  $    | _         |_        S r   r   )r   r   stubProtocols     r   fakeProtocolFactoryzUDNSServerFactoryTests.test_buildProtocolProtocolOverride.<locals>.fakeProtocolFactoryp  s     $L"(Lr   N)addr)r	   r`   r$   buildProtocolrV   r   r   )r   r   r   fpr   s        @r   "test_buildProtocolProtocolOverridez8DNSServerFactoryTests.test_buildProtocolProtocolOverrideb  s    	 	 	 	 	 	 	 	
 $|~~	  	  	  	  	 
 #%%(
OOO&&,b1Aqvqx3HIIIIIr   c                 Z    t          j                    }t          | g |j        d           dS )zm
        L{server.DNSServerFactory._verboseLog} does not log messages unless
        C{verbose > 0}.
        Foo BarNr	   r`   r[   _verboseLogr   r   s     r   test_verboseLogQuietz*DNSServerFactoryTests.test_verboseLogQuiet{  s.    
 #%%r1=)<<<<<r   c                 `    t          j        d          }t          | dg|j        d           dS )zZ
        L{server.DNSServerFactory._verboseLog} logs a message if C{verbose > 0}.
           r   r   Nr   r   s     r   test_verboseLogVerbosez,DNSServerFactoryTests.test_verboseLogVerbose  s5     #A...	{AM9EEEEEr   c                     t          j                    }t          d          }t          | dg|j        |dd           dS )z
        L{server.DNSServerFactory.messageReceived} logs about an empty query if
        the message had no queries and C{verbose} is C{>0}.
        r   r   z$Empty query from ('192.0.2.100', 53)Nz192.0.2.1005   r#   protor%   )r   Messager!   r[   messageReceivedr   rP   r   s      r   "test_messageReceivedLoggingNoQueryz8DNSServerFactoryTests.test_messageReceivedLoggingNoQuery  sX    
 KMM&q11134'	
 	
 	
 	
 	
 	
r   c                    t          j                    }|                    dt           j                   |                    dt           j                   t          d          }t          | dg|j        |dd           dS )	z
        L{server.DNSServerFactory.messageReceived} logs the query types of all
        queries in the message if C{verbose} is set to C{1}.
        example.comnametyper   r   z&MX AAAA query from ('192.0.2.100', 53)Nr   r   r   r   addQueryMXAAAAr!   r[   r   r   s      r   test_messageReceivedLogging1z2DNSServerFactoryTests.test_messageReceivedLogging1  s    
 KMM	

CF
333	

CH
555&q11156'	
 	
 	
 	
 	
 	
r   c                    t          j                    }|                    dt           j                   |                    dt           j                   t          d          }t          | dg|j        |dd           dS )	z
        L{server.DNSServerFactory.messageReceived} logs the repr of all queries
        in the message if C{verbose} is set to C{2}.
        r   r      r   zT<Query example.com MX IN> <Query example.com AAAA IN> query from ('192.0.2.100', 53)Nr   r   r   r   s      r   test_messageReceivedLogging2z2DNSServerFactoryTests.test_messageReceivedLogging2  s    
 KMM	

CF
333	

CH
555&q111M '
	
 
	
 
	
 
	
 
	
 
	
r   c                    t          j                    }t                      }t                      |                     t
          j        dfd           |                    |dd           |                     |j	                   dS )zv
        L{server.DNSServerFactory.messageReceived} assigns a unix timestamp to
        the received message.
        timec                       S r   r   )ts   r   <lambda>zEDNSServerFactoryTests.test_messageReceivedTimestamp.<locals>.<lambda>  s     r   Nr   )
r   r   r!   rl   patchr	   r   r   rV   timeReceived)r   rP   r   r   s      @r   test_messageReceivedTimestampz3DNSServerFactoryTests.test_messageReceivedTimestamp  s{    
 KMM&((HH

6;				222	!4>>>+++++r   c                 D   t          j                    }t                      }t                      }t                      }|                     t          j        |j        |||          }|j        \  }}|                     ||||f           |                     |i            dS )z
        L{server.DNSServerFactory.messageReceived} passes all messages to
        L{server.DNSServerFactory.allowQuery} along with the receiving protocol
        and origin address.
        r   N)	r   r   rl   r+   assertRaisesr0   r   r   rV   )r   r#   dummyProtocoldummyAddressr   er   r   s           r   test_messageReceivedAllowQueryz4DNSServerFactoryTests.test_messageReceivedAllowQuery  s     +--xx#%%#7   
 
 vfEFFF$$$$$r   c                 <    G d dt                      G fddt          j                  } |            }|                     |j        t          j                    dd          }|j        \  \  }}}}|                     |j	        t
          j
                   dS )z
        If C{allowQuery} returns C{False},
        L{server.DNSServerFactory.messageReceived} calls L{server.sendReply}
        with a message whose C{rCode} is L{dns.EREFUSED}.
        c                       e Zd ZdS )FDNSServerFactoryTests.test_allowQueryFalse.<locals>.SendReplyExceptionNr{   r   r   r   SendReplyExceptionr     r}   r   r   c                        e Zd Zd Z fdZdS )KDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactoryc                     dS )NFr   r   s      r   r&   zVDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.allowQuery  s    ur   c                      ||          r   r   )r   r   r   r   s      r   r(   zUDNSServerFactoryTests.test_allowQueryFalse.<locals>.RaisingDNSServerFactory.sendReply  s    ((v666r   N)r   r   r   r&   r(   )r   s   r   r+   r     s=          7 7 7 7 7 7 7r   r+   Nr   )r3   r	   r`   r   r   r   r   r   rV   rCodeEREFUSED)	r   r+   r   r   r   r#   r%   r   r   s	           @r   test_allowQueryFalsez*DNSServerFactoryTests.test_allowQueryFalse  s    	 	 	 	 	 	 	 		7 	7 	7 	7 	7 	7 	7f&= 	7 	7 	7 $#%%KMM  
 
 -.F)!655555r   c                     dg|_         g fd}t                      }t          j        d          }t	          |||           |                    ||           |                     ||dfg           dS )a  
        Assert that the named method is called with the given message when it is
        passed to L{DNSServerFactory.messageReceived}.

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

        @param message: The message which is expected to be passed to the
            C{methodName} method.
        @type message: L{dns.Message}
        Nc                 8                         | ||f           d S r   rS   )r#   r$   r%   receivedMessagess      r   fakeHandlerz?DNSServerFactoryTests._messageReceivedTest.<locals>.fakeHandler  s$    ##Wh$@AAAAAr   )queriesr=   r	   r`   setattrr   rV   )r   
methodNamer#   r   r$   r   r   s         @r   _messageReceivedTestz*DNSServerFactoryTests._messageReceivedTest  s      &	B 	B 	B 	B 	B  >>)$//[111222)Wh,E+FGGGGGr   c                 l    |                      dt          j        t          j                             dS )z
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_QUERY} on to L{DNSServerFactory.handleQuery}.
        handleQueryopCodeN)r   r   r   OP_QUERYrc   s    r   test_queryMessageReceivedz/DNSServerFactoryTests.test_queryMessageReceived   s/    
 	!!-CL1Q1Q1QRRRRRr   c                 l    |                      dt          j        t          j                             dS )z
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_INVERSE} on to L{DNSServerFactory.handleInverseQuery}.
        handleInverseQueryr   N)r   r   r   
OP_INVERSErc   s    r    test_inverseQueryMessageReceivedz6DNSServerFactoryTests.test_inverseQueryMessageReceived'  s:    
 	!! #+S^"D"D"D	
 	
 	
 	
 	
r   c                 l    |                      dt          j        t          j                             dS )z
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_STATUS} on to L{DNSServerFactory.handleStatus}.
        handleStatusr   N)r   r   r   	OP_STATUSrc   s    r   test_statusMessageReceivedz0DNSServerFactoryTests.test_statusMessageReceived0  /    
 	!!.#+S]2S2S2STTTTTr   c                 l    |                      dt          j        t          j                             dS )z
        L{DNSServerFactory.messageReceived} passes messages with an opcode of
        C{OP_NOTIFY} on to L{DNSServerFactory.handleNotify}.
        handleNotifyr   N)r   r   r   	OP_NOTIFYrc   s    r   test_notifyMessageReceivedz0DNSServerFactoryTests.test_notifyMessageReceived7  r   r   c                 l    |                      dt          j        t          j                             dS )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_UPDATErc   s    r   test_updateMessageReceivedz0DNSServerFactoryTests.test_updateMessageReceived>  s/     	!!-CM1R1R1RSSSSSr   c                    t                      t                      }}t          j                    }|                    |           |                     |j        |g           |                    |           |                     |j        ||g           |                    |           |                     |j        |g           |                    |           |                     |j        g            dS )z
        The C{connectionMade} and C{connectionLost} methods of
        L{DNSServerFactory} cooperate to keep track of all L{DNSProtocol}
        objects created by a factory which are connected.
        N)rl   r	   r`   connectionMaderV   connectionsconnectionLost)r   protoAprotoBr   s       r   test_connectionTrackingz-DNSServerFactoryTests.test_connectionTrackingG  s      688)++v&&&,vh777v&&&,vv.>???v&&&,vh777v&&&,b11111r   c                    t          j                    }|                    d           |                    d           t          j                    }t                      |_        |                     t
          j        |j	        |t                      d          }|j        \  \  }}|                     ||j        d                    dS )z
        L{server.DNSServerFactory.handleQuery} takes the first query from the
        supplied message and dispatches it to
        L{server.DNSServerFactory.resolver.query}.
           one.example.coms   two.example.comNr#   r$   r%   r   )r   r   r   r	   r`   r@   ra   r   rC   r   r=   r   rV   r   )r   rP   r   r   rE   r   s         r   test_handleQueryz&DNSServerFactoryTests.test_handleQueryX  s     KMM	

%&&&	

%&&&#%%$&&
*M!^^  
 
 6&	!-----r   c                   	 t          j                    }t          j                     G fdd          } |            |_        g 		fd}||_        t          j                    }|                    d           t                      }t                      }|                    |||           t                      }                    |           |                     	||||fi fg           dS )aC  
        L{server.DNSServerFactory.handleQuery} adds
        L{server.DNSServerFactory.resolver.gotResolverResponse} as a callback to
        the deferred returned by L{server.DNSServerFactory.resolver.query}. It
        is called with the query response, the original protocol, message and
        origin address.
        c                       e Zd Z fdZdS )DDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolverc                     S r   r   r   r   r   ds      r   rE   zJDNSServerFactoryTests.test_handleQueryCallback.<locals>.FakeResolver.query{      r   Nr   r   r   rE   r  s   r   FakeResolverr  z  .              r   r  c                  6                         | |f           d S r   r   )r   r   gotResolverResponseArgss     r   fakeGotResolverResponsezODNSServerFactoryTests.test_handleQueryCallback.<locals>.fakeGotResolverResponse  s!    #**D&>:::::r   r  r  N)r	   r`   r   Deferredra   gotResolverResponser   r   r   r=   rl   r   callbackrV   )
r   r   r  r  rP   r   r   dummyResponser  r  s
           @@r   test_handleQueryCallbackz.DNSServerFactoryTests.test_handleQueryCallbackn  s'    #%%N	 	 	 	 	 	 	 	 	 	 "\^^
"$	; 	; 	; 	; 	; !8KMM	

%&&&#~~xx	a,MMM	

=!!!#lA|<bAB	
 	
 	
 	
 	
r   c                 
  	 t          j                    }t          j                     G fdd          } |            |_        g 		fd}||_        t          j                    }|                    d           t                      }t                      }|                    |||           t          j        t                                }                    |           |                     	||||fi fg           dS )a?  
        L{server.DNSServerFactory.handleQuery} adds
        L{server.DNSServerFactory.resolver.gotResolverError} as an errback to
        the deferred returned by L{server.DNSServerFactory.resolver.query}. It
        is called with the query failure, the original protocol, message and
        origin address.
        c                       e Zd Z fdZdS )CDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolverc                     S r   r   r  s      r   rE   zIDNSServerFactoryTests.test_handleQueryErrback.<locals>.FakeResolver.query  r  r   Nr  r  s   r   r  r#    r  r   r  c                  6                         | |f           d S r   r   )r   r   gotResolverErrorArgss     r   fakeGotResolverErrorzKDNSServerFactoryTests.test_handleQueryErrback.<locals>.fakeGotResolverError  s!     ''v77777r   r  r  N)r	   r`   r   r  ra   gotResolverErrorr   r   r   r=   rl   r   r
   Failurer3   errbackrV   )
r   r   r  r'  rP   r   r   stubFailurer  r&  s
           @@r   test_handleQueryErrbackz-DNSServerFactoryTests.test_handleQueryErrback  s1    #%%N	 	 	 	 	 	 	 	 	 	 "\^^
!	8 	8 	8 	8 	8 2KMM	

%&&&#~~xx	a,MMMoikk22			+ [,<$PRT#U"V	
 	
 	
 	
 	
r   c                    t          j                    }g }g }g }|                     t          j        |j        |||ft                      t          j                    d          }|j        \  \  }}| 	                    |j
        |           | 	                    |j        |           | 	                    |j        |           dS )z
        L{server.DNSServerFactory.gotResolverResponse} accepts a tuple of
        resource record lists and triggers a response message containing those
        resource record lists.
        Nr$   r#   r%   )r	   r`   r   r5   r8   r  r   r   r   r   answers	authority
additional)r   r   r/  r0  r1  r   r#   r   s           r   test_gotResolverResponsez.DNSServerFactoryTests.test_gotResolverResponse  s     #%%	
1!i,$&&KMM  
 
 V
Fgow///g'333g(*55555r   c           
      >   t                      }t          |_        t          j                    }d|_        |                     t          |j        g g g fd|d          }| 	                    dt          |t          j        g g g           f|j        |j        f           dS )z
        L{server.DNSServerFactory.gotResolverResponse} calls
        L{server.DNSServerFactory._responseFromMessage} to generate a response.
        r   Nr.  r   )r#   r   r/  r0  r1  )r!   r   _responseFromMessager   r   r   r   r   r  rV   dictOKr   r   r   r   requestr   s       r   0test_gotResolverResponseCallsResponseFromMessagezFDNSServerFactoryTests.test_gotResolverResponseCallsResponseFromMessage  s    
 -..'-$+-- 'RL  
 
 	#& !  	 VQX	
 	
 	
 	
 	
r   c                     t          j                    }t          j        dd          }|                    |          f}|                     ||           dS )z
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message which is a copy of the request message.
        F)answerrecAvr#   N)r	   r`   r   r   r4  assertIsNotr   r   r8  responses       r   "test_responseFromMessageNewMessagez8DNSServerFactoryTests.test_responseFromMessageNewMessage  s[    
 )+++U%888000AAC(+++++r   c                 0   t          j                    }d|_        |                    t	          j        d                    }d|_        |                    t	          j        d                    }|                     d|j        |j        f           dS )z
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message whose C{recAV} attribute is L{True} if
        L{server.DNSServerFactory.canRecurse} is L{True}.
        TF)r<  r=  TFN)r	   r`   r   r4  r   r   rV   r<  r   r   	response1	response2s       r   *test_responseFromMessageRecursionAvailablez@DNSServerFactoryTests.test_responseFromMessageRecursionAvailable  s     )++!0059Q9Q9Q0RR	"0049P9P9P0QQ	)/(JKKKKKr   c                     t          j                    }t          j                    }d|_        |                    |          }|                     |j        |j                   dS )z
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message whose C{timeReceived} attribute has the same value as that found
        on the request.
        i  r=  N)r	   r`   r   r   r   r4  rV   r?  s       r   $test_responseFromMessageTimeReceivedz:DNSServerFactoryTests.test_responseFromMessageTimeReceived  s]     )+++--#///@@-x/DEEEEEr   c                     t          j                    }t          j                    }d|_        |                    |          }|                     |j        |j                   dS )z
        L{server.DNSServerFactory._responseFromMessage} generates a response
        message whose C{maxSize} attribute has the same value as that found
        on the request.
        r   r=  N)r	   r`   r   r   maxSizer4  rV   r?  s       r   test_responseFromMessageMaxSizez5DNSServerFactoryTests.test_responseFromMessageMaxSize  s[     )+++--///@@(*:;;;;;r   c                 d    |                      t          j        t          j        j                   dS )z{
        L{server.DNSServerFactory} has a C{_messageFactory} attribute which is
        L{dns.Message} by default.
        N)r   r   r   r	   r`   _messageFactoryrc   s    r   test_messageFactoryz)DNSServerFactoryTests.test_messageFactory(  s&    
 	ck6#:#JKKKKKr   c           
         t          j                    }|                     t          dt                     t          j                    }|                     t          |j        |t          j	                  }| 
                    dt          |j        |t          j	        |j        d          f|j        |j        f           dS )a4  
        L{server.DNSServerFactory._responseFromMessage} calls
        C{dns._responseFromMessage} to generate a response
        message from the request message. It supplies the request message and
        other keyword arguments which should be passed to the response message
        initialiser.
        r4  r#   r   r   F)responseConstructorr#   r   r<  authN)r	   r`   r   r   r   r   r   r   r4  r6  rV   r5  rN  r   r   r   r7  s       r   +test_responseFromMessageCallsMessageFactoryzADNSServerFactoryTests.test_responseFromMessageCallsMessageFactory/  s     )++

3.777+--W97RURX  
 
 	(/(?#&!,  	 VQX	
 	
 	
 	
 	
r   c                 `   t          j                    }|                    t          j                    t          j        d          g          }|                    t          j                    t          j        d          g          }|                     d|j        |j        f           dS )z
        L{server.DNSServerFactory._responseFromMessage} marks the response
        message as authoritative if any of the answer records are authoritative.
        T)rS  )r#   r/  FrC  N)r	   r`   r4  r   r   RRHeaderrV   rS  rD  s       r   ,test_responseFromMessageAuthoritativeMessagezBDNSServerFactoryTests.test_responseFromMessageAuthoritativeMessageL  s    
 )++00KMMCLd,C,C,C+D 1 
 
	 00KMMCLe,D,D,D+E 1 
 
	 	^Y^,	
 	
 	
 	
 	
r   c           	         t          d          }t          j                    g}t          j                    g}t          j                    g}t          | dg|j        |||ft                      t          j                    d           dS )z
        L{server.DNSServerFactory.gotResolverResponse} logs the total number of
        records in the response if C{verbose > 0}.
        r   r   zLookup found 3 recordsNr.  )r!   r   rV  r[   r  r=   r   )r   r   r/  r0  r1  s        r   test_gotResolverResponseLoggingz5DNSServerFactoryTests.test_gotResolverResponseLogging]  s    
 'q111<>>"\^^$	lnn%
%&!i,!^^KMM	
 	
 	
 	
 	
 	
r   c                    t          t                      g          }t          j                    }|                    d           t          j                    g}g }g }|                     t          j        |j        |||ft                      |d          }|j
        \  \  }\  }}	}
}|                     |j        j        d           |                     ||           |                     |	|           |                     |
|           dS )z
        L{server.DNSServerFactory.gotResolverResponse} caches the response if at
        least one cache was provided in the constructor.
        rq   s   example.comNr.  )r!   rG   r   r   r   rV  r   rJ   r  r=   r   rV   r   r   )r   r   rP   expectedAnswersexpectedAuthorityexpectedAdditionalr   rE   r/  r0  r1  r   s               r   test_gotResolverResponseCachingz5DNSServerFactoryTests.test_gotResolverResponseCachingq  s	   
 '|~~.>???KMM	

>"""<>>*-!/1CD!^^  
 
 =>F910)Z6.999g///i!2333j"455555r   c                 x   t                      }t          |_        t          j                    }d|_        |                     t          |j        t          j
        t          j                              d|d          }|                     dt          |t          j                  f|j        |j        f           dS )z
        L{server.DNSServerFactory.gotResolverError} calls
        L{server.DNSServerFactory._responseFromMessage} to generate a response.
        r   Nr.  r   rQ  )r!   r   r4  r   r   r   r   r   r(  r
   r)  r   DomainErrorrV   r5  ENAMEr   r   r7  s       r   -test_gotResolverErrorCallsResponseFromMessagezCDNSServerFactoryTests.test_gotResolverErrorCallsResponseFromMessage  s    
 -..'-$+-- $OE-//00  
 
 	gSY77781618:L	
 	
 	
 	
 	
r   c                 ,   t          j                    }|                     t          j        |j        t          j        |          t                      t          j	                    d          }|j
        \  \  }}|                     |j        |           dS )a{  
        L{server.DNSServerFactory.gotResolver} accepts a L{failure.Failure} and
        triggers a response message whose rCode corresponds to the DNS error
        contained in the C{Failure}.

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

        @param expectedMessageCode: The C{rCode} which is expected in the
            message returned by C{gotResolverError} in response to
            C{responseError}.
        @type expectedMessageCode: L{int}
        Nr.  )r	   r`   r   r5   r8   r(  r
   r)  r   r   r   rV   r   )r   responseErrorexpectedMessageCoder   r   r#   r   s          r   _assertMessageRcodeForErrorz1DNSServerFactoryTests._assertMessageRcodeForError  s      #%%1OM**$&&KMM  
 
 V
F(;<<<<<r   c                 h    |                      t          j                    t          j                   dS )z
        L{server.DNSServerFactory.gotResolver} triggers a response message with
        an C{rCode} of L{dns.ENAME} if supplied with a L{error.DomainError}.
        N)rf  r   r`  r   ra  rc   s    r    test_gotResolverErrorDomainErrorz6DNSServerFactoryTests.test_gotResolverErrorDomainError  s+    
 	(():)<)<ciHHHHHr   c                 h    |                      t          j                    t          j                   dS )z
        L{server.DNSServerFactory.gotResolver} triggers a response message with
        an C{rCode} of L{dns.ENAME} if supplied with a
        L{error.AuthoritativeDomainError}.
        N)rf  r   AuthoritativeDomainErrorr   ra  rc   s    r   -test_gotResolverErrorAuthoritativeDomainErrorzCDNSServerFactoryTests.test_gotResolverErrorAuthoritativeDomainError  s+     	(()G)I)I39UUUUUr   c                     |                      t                      t          j                   |                     t                    }|                     t          |          d           dS )z
        L{server.DNSServerFactory.gotResolver} triggers a response message with
        an C{rCode} of L{dns.ESERVER} if supplied with another type of error and
        logs the error.
        r   N)rf  KeyErrorr   ESERVERflushLoggedErrorsrV   len)r   r   s     r   test_gotResolverErrorOtherErrorz5DNSServerFactoryTests.test_gotResolverErrorOtherError  sU     	((S[AAA""8,,Q#####r   c           	          t          d          }t          | dg|j        t          j        t          j                              t                      t          j	                    d           dS )zZ
        L{server.DNSServerFactory.gotResolver} logs a message if C{verbose > 0}.
        r   r   zLookup failedNr.  )
r!   r[   r(  r
   r)  r   r`  r=   r   r   r   s     r   test_gotResolverErrorLoggingz2DNSServerFactoryTests.test_gotResolverErrorLogging  sm     'q111OE-//00!^^KMM	
 	
 	
 	
 	
 	
r   c                    t          j                    }g fd|_        t          j        dd          }t                      t                      g|_        t                      t                      g|_        t                      t                      g|_        |	                    t          j        t          j                              d|d           |                     t          j        dd          g           dS )z
        L{server.DNSServerFactory.gotResolverError} does not allow request
        attributes to leak into the response ie it sends a response with AD, CD
        set to 0 and empty response record sections.
        c                 .                         |          S r   r   r$   r@  r%   	responsess      r   r   zUDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributes.<locals>.<lambda>      	@P@PA
 A
 r   TauthenticDatacheckingDisabledNr.     r   r;  )r	   r`   r(   r   r   rl   r/  r0  r1  r(  r
   r)  r   r`  rV   r   r   r8  rw  s      @r   -test_gotResolverErrorResetsResponseAttributeszCDNSServerFactoryTests.test_gotResolverErrorResetsResponseAttributes  s     )++	
 
 
 
 +D4HHH!88VXX.#XXvxx0$hh1  OE-//00	 	! 	
 	
 	
 	#+Ad;;;<iHHHHHr   c                    t          j                    }g fd|_        t          j        dd          }t                      t                      g|_        t                      t                      g|_        t                      t                      g|_        |	                    g g g fd|d           | 
                    t          j        dd          g           dS )a  
        L{server.DNSServerFactory.gotResolverResponse} does not allow request
        attributes to leak into the response ie it sends a response with AD, CD
        set to 0 and none of the records in the request answer sections are
        copied to the response.
        c                 .                         |          S r   r   rv  s      r   r   zXDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes.<locals>.<lambda>
  rx  r   Try  Nr.  r   r}  )r	   r`   r(   r   r   rl   r/  r0  r1  r  rV   r~  s      @r   0test_gotResolverResponseResetsResponseAttributeszFDNSServerFactoryTests.test_gotResolverResponseResetsResponseAttributes  s     )++	
 
 
 
 +D4HHH!88VXX.#XXvxx0$hh1##RL4$ 	$ 	
 	
 	
 	#+Ad;;;<iHHHHHr   c                 H   t          j                    }t                      }t          j                    }|                     t          j        |j        t                      ||          }|j	        \  }}| 
                    |||f           | 
                    |i            dS )z
        If L{server.DNSServerFactory.sendReply} is supplied with a protocol
        *and* an address tuple it will supply that address to
        C{protocol.writeMessage}.
        r.  N)r   r   rl   r	   r`   r   r5   r8   r(   r   rV   )r   rP   r   r   r   r   r   s          r   test_sendReplyWithAddressz/DNSServerFactoryTests.test_sendReplyWithAddress  s     KMMxx#%%1K$&&   
 
 vf<0111$$$$$r   c                 *   t          j                    }t          j                    }|                     t
          j        |j        t                      |d          }|j        \  }}| 	                    ||f           | 	                    |i            dS )z
        If L{server.DNSServerFactory.sendReply} is supplied with a protocol but
        no address tuple it will supply only a message to
        C{protocol.writeMessage}.
        Nr.  )
r   r   r	   r`   r   r5   r8   r(   r   rV   )r   rP   r   r   r   r   s         r   test_sendReplyWithoutAddressz2DNSServerFactoryTests.test_sendReplyWithoutAddress,  s     KMM#%%1K$&&  
 
 vft$$$$$$$$r   c                     |                      t          j        dd            t          j                    }d|_        t          j        d          }t          | ddg|j        t                      |d	           dS )
z
        If L{server.DNSServerFactory.sendReply} logs a "no answers" message if
        the supplied message has no answers.
        r   c                      dS NiQ r   r   r   r   r   zFDNSServerFactoryTests.test_sendReplyLoggingNoAnswers.<locals>.<lambda>D       r   Q r   r   zReplying with no answers Processed query in 1.000 secondsNr.  )
r   r	   r   r   r   r   r`   r[   r(   r=   r   s      r   test_sendReplyLoggingNoAnswersz4DNSServerFactoryTests.test_sendReplyLoggingNoAnswers?  s    
 	

6;666KMM#A...')KLK!^^	
 	
 	
 	
 	
 	
r   c                 r   |                      t          j        dd            t          j                    }|j                            t          j        t          j        d                               |j	                            t          j        t          j        d                               |j
                            t          j        t          j        d                               d|_        t          j        d          }t          | g d|j        t                      |d	
           d	S )z
        If L{server.DNSServerFactory.sendReply} logs a message for answers,
        authority, additional if the supplied a message has records in any of
        those sections.
        r   c                      dS r  r   r   r   r   r   zHDNSServerFactoryTests.test_sendReplyLoggingWithAnswers.<locals>.<lambda>W  r  r   z	127.0.0.1)payloadr  r   r   )z*Answers are <A address=127.0.0.1 ttl=None>z+Authority is <A address=127.0.0.1 ttl=None>z,Additional is <A address=127.0.0.1 ttl=None>r  Nr.  )r   r	   r   r   r   r/  rS   rV  Record_Ar0  r1  r   r`   r[   r(   r=   r   s      r    test_sendReplyLoggingWithAnswersz6DNSServerFactoryTests.test_sendReplyLoggingWithAnswersQ  s    	

6;666KMM		cl;.G.GHHHIII	3<[0I0IJJJKKK	CLk1J1JKKKLLL#A...   K!^^	
 	
 	
 	
 	
 	
r   c                    t          j                    }|                     t          j        |j        t          j                    t                      d          }|j        \  \  }}| 	                    |j
        t          j                   dS )z
        L{server.DNSServerFactory.handleInverseQuery} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr  )r	   r`   r   r5   r8   r   r   r   r   rV   r   ENOTIMPr   r   r   r#   r   s        r   test_handleInverseQueryz-DNSServerFactoryTests.test_handleInverseQueryl  s}    
 #%%1 KMM$&&  
 
 V
F44444r   c                     t          d          }t          | dg|j        t          j                    t                      d           dS )zz
        L{server.DNSServerFactory.handleInverseQuery} logs the message origin
        address if C{verbose > 0}.
        r   r   zInverse query from ('::1', 53)z::1r   r  N)r!   r[   r   r   r   r=   r   s     r   test_handleInverseQueryLoggingz4DNSServerFactoryTests.test_handleInverseQueryLogging}  sW    
 'q111-. KMM!^^	
 	
 	
 	
 	
 	
r   c                    t          j                    }|                     t          j        |j        t          j                    t                      d          }|j        \  \  }}| 	                    |j
        t          j                   dS )z
        L{server.DNSServerFactory.handleStatus} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr  )r	   r`   r   r5   r8   r   r   r   r   rV   r   r  r  s        r   test_handleStatusz'DNSServerFactoryTests.test_handleStatus  |    
 #%%1NKMM$&&  
 
 V
F44444r   c                     t          d          }t          | dg|j        t          j                    t                      d           dS )zt
        L{server.DNSServerFactory.handleStatus} logs the message origin address
        if C{verbose > 0}.
        r   r   zStatus request from ('::1', 53)r  r  N)r!   r[   r   r   r   r=   r   s     r   test_handleStatusLoggingz.DNSServerFactoryTests.test_handleStatusLogging  V    
 'q111./NKMM!^^	
 	
 	
 	
 	
 	
r   c                    t          j                    }|                     t          j        |j        t          j                    t                      d          }|j        \  \  }}| 	                    |j
        t          j                   dS )z
        L{server.DNSServerFactory.handleNotify} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr  )r	   r`   r   r5   r8   r   r   r   r   rV   r   r  r  s        r   test_handleNotifyz'DNSServerFactoryTests.test_handleNotify  r  r   c                     t          d          }t          | dg|j        t          j                    t                      d           dS )zt
        L{server.DNSServerFactory.handleNotify} logs the message origin address
        if C{verbose > 0}.
        r   r   zNotify message from ('::1', 53)r  r  N)r!   r[   r   r   r   r=   r   s     r   test_handleNotifyLoggingz.DNSServerFactoryTests.test_handleNotifyLogging  r  r   c                    t          j                    }|                     t          j        |j        t          j                    t                      d          }|j        \  \  }}| 	                    |j
        t          j                   dS )z
        L{server.DNSServerFactory.handleOther} triggers the sending of a
        response message with C{rCode} set to L{dns.ENOTIMP}.
        Nr  )r	   r`   r   r5   r8   r   r   r   r   rV   r   r  r  s        r   test_handleOtherz&DNSServerFactoryTests.test_handleOther  s|    
 #%%1MKMM$&&  
 
 V
F44444r   c                     t          d          }t          | dg|j        t          j                    t                      d           dS )zs
        L{server.DNSServerFactory.handleOther} logs the message origin address
        if C{verbose > 0}.
        r   r   z$Unknown op code (0) from ('::1', 53)r  r  N)r!   r[   r   r   r   r=   r   s     r   test_handleOtherLoggingz-DNSServerFactoryTests.test_handleOtherLogging  sV    
 'q11134MKMM!^^	
 	
 	
 	
 	
 	
r   N)Dr   r   r   r   rd   rh   ro   rs   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,  r2  r9  rA  rG  rI  rL  rO  rT  rW  rY  r^  rb  rf  rh  rk  rq  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r]   r]      s        Y Y YK K K

 

 



 

 



 

 


 
 
.; ; ;	
 	
 	
? ? ?S S S< < <G G GP P PI I IJ J J2= = =F F F
 
 
"
 
 
&
 
 
,, , ,% % %,6 6 6:H H H8S S S
 
 
U U UU U UT T T2 2 2". . .,&
 &
 &
P%
 %
 %
N6 6 60
 
 
B	, 	, 	,L L LF F F< < <L L L
 
 
:
 
 
"
 
 
(6 6 68
 
 
.= = =:I I IV V V$ $ $
 
 
I I I0I I I.% % %(% % %&
 
 
$
 
 
65 5 5"
 
 
5 5 5"
 
 
5 5 5"
 
 
5 5 5"
 
 
 
 
r   r]   N)r   zope.interface.verifyr   twisted.internetr   twisted.internet.interfacesr   twisted.namesr   r   r   r	   twisted.pythonr
   r   twisted.trialr   r3   r   r   r`   r!   r+   r5   r=   r@   rG   r[   TestCaser]   r   r   r   <module>r     s    . - - - - - " " " " " " 8 8 8 8 8 8 5 5 5 5 5 5 5 5 5 5 5 5 ' ' ' ' ' ' ' ' " " " " " "    i   ( ( (    !8   B5 5 5 5 5f5 5 5 5:7 7 7 7 7 7 7 70       "0 0 0 0 0 0 0 006 6 6 6 6 6 6 60V V V@O
 O
 O
 O
 O
H- O
 O
 O
 O
 O
r   