
    YfL                     @   d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lmZmZ dd
lm Z 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, ddl-m.Z/  G d de,          Z0d Z1d Z2 G d d          Z3 ee)           G d d                      Z4 G d de/          Z5 G d de/          Z6 ee*           G d d                      Z7 G d de/          Z8 G d  d!e!          Z9 G d" d#e/          Z:d$S )%zh
Tests for implementations of L{IHostnameResolver} and their interactions with
reactor implementations.
    )defaultdict)	AF_INETAF_INET6	AF_UNSPEC
EAI_NONAMEIPPROTO_TCP
SOCK_DGRAMSOCK_STREAMgaierrorgetaddrinfo)Locklocal)implementer)verifyObject)
LockWorkerTeamcreateMemoryWorker)ComplexResolverSimplifierGAIResolverSimpleResolverComplexifier)IPv4AddressIPv6Address)PluggableResolverMixinReactorBase)Deferred)DNSLookupError)IHostnameResolverIReactorPluggableNameResolverIResolutionReceiverIResolverSimple)
ThreadPool)SynchronousTestCasec                       e Zd ZdZd ZdS )DeterministicThreadPoolz6
    Create a deterministic L{ThreadPool} object.
    c                 L    d| _         d| _        d| _        g | _        || _        dS )zE
        Create a L{DeterministicThreadPool} from a L{Team}.
           N)minmaxnamethreads_team)selfteams     U/var/www/html/env/lib/python3.11/site-packages/twisted/internet/test/test_resolver.py__init__z DeterministicThreadPool.__init__4   s+     	


    N)__name__
__module____qualname____doc__r/    r0   r.   r$   r$   /   s-             r0   r$   c            	          t                      \  } t          t          t          t	                      t                                fdd                     | fS )z
    Create a deterministic threadpool.

    @return: 2-tuple of L{ThreadPool}, 0-argument C{work} callable; when
        C{work} is called, do the work.
    c                       S Nr5   workers   r.   <lambda>z#deterministicPool.<locals>.<lambda>I   s    v r0   c                      d S r8   r5   r5   r0   r.   r;   z#deterministicPool.<locals>.<lambda>I   s     r0   )r   r$   r   r   r   r   )doerr:   s    @r.   deterministicPoolr>   ?   sY     &''LFDDFFEGG,,~~~~MM	
 	
 		 r0   c                  \    t                      \  }  G fdd          } |            | fS )z
    Create a deterministic L{IReactorThreads}

    @return: a 2-tuple consisting of an L{IReactorThreads}-like object and a
        0-argument callable that will perform one unit of work invoked via that
        object's C{callFromThread} method.
    c                       e Zd Z fdZdS )(deterministicReactorThreads.<locals>.CFTc                 B                         fd           d S )Nc                        i S r8   r5   )afks   r.   r;   zIdeterministicReactorThreads.<locals>.CFT.callFromThread.<locals>.<lambda>[   s    aajajj r0   )do)r,   rE   rD   rF   r:   s    ```r.   callFromThreadz7deterministicReactorThreads.<locals>.CFT.callFromThreadZ   s.    II(((((()))))r0   N)r1   r2   r3   rH   r9   s   r.   CFTrA   Y   s.        	* 	* 	* 	* 	* 	* 	*r0   rI   )r   )r=   rI   r:   s     @r.   deterministicReactorThreadsrJ   O   sX     &''LFD* * * * * * * * * * 355$;r0   c                   0    e Zd ZdZd ZddZeeedfdZ	dS )	FakeAddrInfoGetterz/
    Test object implementing getaddrinfo.
    c                 F    g | _         t          t                    | _        dS )z1
        Create a L{FakeAddrInfoGetter}.
        N)callsr   listresultsr,   s    r.   r/   zFakeAddrInfoGetter.__init__e   s     
"4((r0   r   c                     | j                             ||||||f           | j        |         }|r|S t          t          d          )a  
        Mock for L{socket.getaddrinfo}.

        @param host: see L{socket.getaddrinfo}

        @param port: see L{socket.getaddrinfo}

        @param family: see L{socket.getaddrinfo}

        @param socktype: see L{socket.getaddrinfo}

        @param proto: see L{socket.getaddrinfo}

        @param flags: see L{socket.getaddrinfo}

        @return: L{socket.getaddrinfo}
        z,nodename nor servname provided, or not known)rN   appendrP   r   r   )r,   hostportfamilysocktypeprotoflagsrP   s           r.   r   zFakeAddrInfoGetter.getaddrinfol   sR    $ 	
4vxFGGG,t$ 	WN:'UVVVr0   r0   c                 P    | j         |                             |||||f           dS )a  
        Add a result for a given hostname.  When this hostname is resolved, the
        result will be a L{list} of all results C{addResultForHost} has been
        called with using that hostname so far.

        @param host: The hostname to give this result for.  This will be the
            next result from L{FakeAddrInfoGetter.getaddrinfo} when passed this
            host.

        @type canonname: native L{str}

        @param sockaddr: The resulting socket address; should be a 2-tuple for
            IPv4 or a 4-tuple for IPv6.

        @param family: An C{AF_*} constant that will be returned from
            C{getaddrinfo}.

        @param socktype: A C{SOCK_*} constant that will be returned from
            C{getaddrinfo}.

        @param proto: An C{IPPROTO_*} constant that will be returned from
            C{getaddrinfo}.

        @param canonname: A canonical name that will be returned from
            C{getaddrinfo}.
        @type canonname: native L{str}
        N)rP   rS   )r,   rT   sockaddrrV   rW   rX   	canonnames          r.   addResultForHostz#FakeAddrInfoGetter.addResultForHost   s1    H 	T!!68UIx"PQQQQQr0   N)r   r   r   r   )
r1   r2   r3   r4   r/   r   r   r
   r   r]   r5   r0   r.   rL   rL   `   sm         ) ) )W W W W: $R $R $R $R $R $Rr0   rL   c                   2    e Zd ZdZdZdZd Zd Zd Zd Z	dS )ResultHolderzI
    A resolution receiver which holds onto the results it received.
    Fc                     || _         dS )z>
        Create a L{ResultHolder} with a L{UnitTest}.
        N)	_testCase)r,   testCases     r.   r/   zResultHolder.__init__   s     "r0   c                 0    d| _         || _        g | _        dS )zg
        Hostname resolution began.

        @param hostResolution: see L{IResolutionReceiver}
        TN)_started_resolution
_addresses)r,   hostResolutions     r.   resolutionBeganzResultHolder.resolutionBegan   s     )r0   c                 :    | j                             |           dS )z^
        An address was resolved.

        @param address: see L{IResolutionReceiver}
        N)rf   rS   )r,   addresss     r.   addressResolvedzResultHolder.addressResolved   s      	w'''''r0   c                     d| _         dS )z2
        Hostname resolution is complete.
        TN)_endedrQ   s    r.   resolutionCompletezResultHolder.resolutionComplete   s     r0   N)
r1   r2   r3   r4   rd   rm   r/   rh   rk   rn   r5   r0   r.   r_   r_      sf          HF" " "  ( ( (    r0   r_   c                       e Zd ZdZd ZdS )HelperTestsz?
    Tests for error cases of helpers used in this module.
    c                    t                      \  | _        | _        d }| j                            |           |                                  |                     t          |                     t                              d           dS )zq
        L{DeterministicThreadPool} will log any exceptions that its "thread"
        workers encounter.
        c                      ddz  S )Nr&   r   r5   r5   r0   r.   divideByZeroz9HelperTests.test_logErrorsInThreads.<locals>.divideByZero   s    q5Lr0   r&   N)r>   pooldoThreadWorkcallInThreadassertEquallenflushLoggedErrorsZeroDivisionError)r,   rs   s     r.   test_logErrorsInThreadsz#HelperTests.test_logErrorsInThreads   s    
 (9':':$	4$	 	 	 		|,,,T334EFFGGKKKKKr0   N)r1   r2   r3   r4   r{   r5   r0   r.   rp   rp      s2         L L L L Lr0   rp   c                   N    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S )HostnameResolutionTestsz(
    Tests for hostname resolution.
    c                      t                      \   _         _        t                      \   _         _        t                       _        t           j         fd j        j	                   _
        dS )z*
        Set up a L{GAIResolver}.
        c                       j         S r8   rt   rQ   s   r.   r;   z/HostnameResolutionTests.setUp.<locals>.<lambda>   	    $) r0   N)r>   rt   ru   rJ   reactordoReactorWorkrL   getterr   r   resolverrQ   s   `r.   setUpzHostnameResolutionTests.setUp   si     (9':':$	4$+F+H+H(d((**#L++++T[-D
 
r0   c                    t          |           }| j                            dd           | j                            |d          }|                     |j        |           |                     |j        d           |                     |j	        d           | 
                                 |                                  |                     |j	        d           |                     |j        t          ddd          g           dS )	z
        Resolving an individual hostname that results in one address from
        getaddrinfo results in a single call each to C{resolutionBegan},
        C{addressResolved}, and C{resolutionComplete}.
        sample.example.com)4.3.2.1r   TFTCPr   r   N)r_   r   r]   r   resolveHostNameassertIsre   rw   rd   rm   ru   r   rf   r   r,   receiver
resolutions      r.   test_resolveOneHostz+HostnameResolutionTests.test_resolveOneHost   s      %%$$%9>JJJ]228=QRR
h*J777*D111%000$///,{5)Q/O/O.PQQQQQr0   c           
      0   t          |           }d}d}| j                            ddd||ft                     | j                            |d          }|                     |j        |           |                     |j	        d           |                     |j
        d           |                                  |                                  |                     |j
        d           |                     |j        t          d	dd||          g           d
S )a  
        Resolving an individual hostname that results in one address from
        getaddrinfo results in a single call each to C{resolutionBegan},
        C{addressResolved}, and C{resolutionComplete}; C{addressResolved} will
        receive an L{IPv6Address}.
        r&      r   ::1r   )rV   TFr   N)r_   r   r]   r   r   r   r   re   rw   rd   rm   ru   r   rf   r   )r,   r   flowInfoscopeIDr   s        r.   test_resolveOneIPv6Hostz/HostnameResolutionTests.test_resolveOneIPv6Host	  s%     %%$$ 5!Xw"? 	% 	
 	
 	
 ]228=QRR
h*J777*D111%000$///+eUAx"Q"Q!R	
 	
 	
 	
 	
r0   c                    t          |           }| j                            |d          }|                     |j        |           |                                  |                                  |                     |j        d           |                     |j	        d           |                     |j
        g            dS )a
  
        Resolving a hostname that results in C{getaddrinfo} raising a
        L{gaierror} will result in the L{IResolutionReceiver} receiving a call
        to C{resolutionComplete} with no C{addressResolved} calls in between;
        no failure is logged.
        r   TN)r_   r   r   r   re   ru   r   rw   rd   rm   rf   r   s      r.   test_gaierrorz%HostnameResolutionTests.test_gaierror!  s      %%]228=QRR
h*J777*D111$///,b11111r0   c                 B   t          |           }| j                            |d|          }|                     |j        |           |                                  |                                  | j        j        d         \  }}}}}	}
| 	                    ||           dS )z
        Verify that the given set of address types results in the given C{AF_}
        constant being passed to C{getaddrinfo}.

        @param addrTypes: iterable of L{IAddress} implementers

        @param expectedAF: an C{AF_*} constant
        r   )addressTypesr   N)
r_   r   r   r   re   ru   r   r   rN   rw   )r,   	addrTypes
expectedAFr   r   rT   rU   rV   rW   rX   rY   s              r.   _resolveOnlyTestz(HostnameResolutionTests._resolveOnlyTest1  s      %%]22* 3 
 

 	h*J77759[5Fq5I2dFHeU,,,,,r0   c                 H    |                      t          gt                     dS )z
        When passed an C{addressTypes} parameter containing only
        L{IPv4Address}, L{GAIResolver} will pass C{AF_INET} to C{getaddrinfo}.
        N)r   r   r   rQ   s    r.   test_resolveOnlyIPv4z,HostnameResolutionTests.test_resolveOnlyIPv4D  s"    
 	{mW55555r0   c                 H    |                      t          gt                     dS )z
        When passed an C{addressTypes} parameter containing only
        L{IPv6Address}, L{GAIResolver} will pass C{AF_INET6} to C{getaddrinfo}.
        N)r   r   r   rQ   s    r.   test_resolveOnlyIPv6z,HostnameResolutionTests.test_resolveOnlyIPv6K  s"    
 	{mX66666r0   c                     |                      t          t          gt                     |                      dt                     dS )z
        When passed an C{addressTypes} parameter containing both L{IPv4Address}
        and L{IPv6Address} (or the default of C{None}, which carries the same
        meaning), L{GAIResolver} will pass C{AF_UNSPEC} to C{getaddrinfo}.
        N)r   r   r   r   rQ   s    r.   test_resolveBothz(HostnameResolutionTests.test_resolveBothR  s;     	{K8)DDDdI.....r0   c                 &   t          |           }| j                            |dd           t          |           }| j                            |dd           |                                  |                                  |                                  |                                  | j        j        d         \  }}}}}}| j        j        d         \  }}}}	}}|                     |t                     |                     |	t                     dS )z
        When passed a C{transportSemantics} paramter, C{'TCP'} (the value
        present in L{IPv4Address.type} to indicate a stream transport) maps to
        C{SOCK_STREAM} and C{'UDP'} maps to C{SOCK_DGRAM}.
        example.comr   )transportSemanticsUDPr   r&   N)
r_   r   r   ru   r   r   rN   rw   r
   r	   )
r,   r   	receiver2rT   rU   rV   	socktypeTrX   rY   	socktypeUs
             r.   #test_transportSemanticsToSocketTypez;HostnameResolutionTests.test_transportSemanticsToSocketType[  s     %%%%hRW%XXX &&	%%} 	& 	
 	
 	
 	6:k6G6J3dFIue6:k6G6J3dFIueK000J/////r0   c                 X   t          |           }d}d}t          t          fD ]L}| j                            ddd||ft
          |           | j                            ddt          |           M| j                            |d           | 	                                 | 
                                 |j        \  }}}}|                     |j        d           |                     |j        d           |                     |j        d	           |                     |j        d	           d
S )z
        When L{GAIResolver} receives a C{SOCK_DGRAM} result from
        C{getaddrinfo}, it returns a C{'TCP'} L{IPv4Address} or L{IPv6Address};
        if it receives C{SOCK_STREAM} then it returns a C{'UDP'} type of same.
        r&   r   r   r   r   )rV   rW   )z	127.0.0.3r   r   r   N)r_   r
   r	   r   r]   r   r   r   r   ru   r   rf   rw   type)	r,   r   r   r   rW   stream4stream6dgram4dgram6s	            r.   test_socketTypeToAddressTypez4HostnameResolutionTests.test_socketTypeToAddressTypep  sH     %%#Z/ 		 		HK((8W-!	 )    K((/( )     	%%h>>>+3+>(&&u---u---e,,,e,,,,,r0   N)r1   r2   r3   r4   r   r   r   r   r   r   r   r   r   r   r5   r0   r.   r}   r}      s         	
 	
 	
R R R"
 
 
02 2 2 - - -&6 6 67 7 7/ / /0 0 0*- - - - -r0   r}   c                        e Zd ZdZd ZddZdS )SillyResolverSimplez6
    Trivial implementation of L{IResolverSimple}
    c                     g | _         dS )zd
        Create a L{SillyResolverSimple} with a queue of requests it is working
        on.
        N)	_requestsrQ   s    r.   r/   zSillyResolverSimple.__init__  s    
 r0   r5   c                 h    | j                             t                                 | j         d         S )z
        Implement L{IResolverSimple.getHostByName}.

        @param name: see L{IResolverSimple.getHostByName}.

        @param timeout: see L{IResolverSimple.getHostByName}.

        @return: see L{IResolverSimple.getHostByName}.
        )r   rS   r   )r,   r)   timeouts      r.   getHostByNamez!SillyResolverSimple.getHostByName  s+     	hjj)))~b!!r0   N)r5   )r1   r2   r3   r4   r/   r   r5   r0   r.   r   r     sA           " " " " " "r0   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )LegacyCompatibilityTestsz
    Older applications may supply an object to the reactor via
    C{installResolver} that only provides L{IResolverSimple}.
    L{SimpleResolverComplexifier} is a wrapper for an L{IResolverSimple}.
    c                 .   t                      }t          |          }t          |           }|                     |j        d           |                    |d           |                     |j        d           |                     |j        d           |                     |j        g            |j        d         	                    d           |                     |j        t          ddd          g           |                     |j        d           dS )z
        L{SimpleResolverComplexifier} translates C{resolveHostName} into
        L{IResolutionReceiver.addressResolved}.
        Fr   Tr   192.168.1.1r   N)r   r   r_   rw   rd   r   rm   rf   r   callbackr   r,   simplecomplexr   s       r.   test_successz%LegacyCompatibilityTests.test_success  s   
 %&&,V44%%*E222-888*D111%000,b111$$]333,{5-QR/S/S.TUUU$/////r0   c                 (   t                      }t          |          }t          |           }|                     |j        d           |                    |d           |                     |j        d           |                     |j        d           |                     |j        g            |j        d         	                    t          d                     |                     |j        d           |                     |j        g            dS )z
        L{SimpleResolverComplexifier} translates a known error result from
        L{IResolverSimple.resolveHostName} into an empty result.
        Fr   Tr   nopeN)r   r   r_   rw   rd   r   rm   rf   r   errbackr   r   s       r.   test_failurez%LegacyCompatibilityTests.test_failure  s    
 %&&,V44%%*E222-888*D111%000,b111##N6$:$:;;;$///,b11111r0   c                    t                      }t          |          }t          |           }|                     |j        d           |                    |d           |                     |j        d           |                     |j        d           |                     |j        g            |j        d         	                    t          d                     |                     t          |                     t                              d           |                     |j        d           |                     |j        g            dS )z
        L{SimpleResolverComplexifier} translates an unknown error result from
        L{IResolverSimple.resolveHostName} into an empty result and a logged
        error.
        Fr   Tr   zowr&   N)r   r   r_   rw   rd   r   rm   rf   r   r   rz   rx   ry   r   s       r.   
test_errorz#LegacyCompatibilityTests.test_error  s+    %&&,V44%%*E222-888*D111%000,b111##$5e$<$<===T334EFFGGKKK$///,b11111r0   c                     t                      \   _         _        t                      \   _         _        t                       _        t           j         fd j        j	                   _
        t           j
                  } j                            dd           |                    d          }|                    d          }                                                                                                                                                                                  |          j        t"                                                               |          d           dS )z
        L{ComplexResolverSimplifier} translates an L{IHostnameResolver} into an
        L{IResolverSimple} for applications that still expect the old
        interfaces to be in place.
        c                       j         S r8   r   rQ   s   r.   r;   z:LegacyCompatibilityTests.test_simplifier.<locals>.<lambda>  r   r0   r   )192.168.3.4  znx.example.comr   N)r>   rt   ru   rJ   r   r   rL   r   r   r   r   r   r]   r   rw   failureResultOfr   r   successResultOf)r,   simpleResolversuccessfailures   `   r.   test_simplifierz(LegacyCompatibilityTests.test_simplifier  sO    (9':':$	4$+F+H+H(d((**#L++++T[-D
 
 34=AA$$]4IJJJ ..}== ../?@@--g66;^LLL--g66FFFFFr0   c                    t                      }t          |          }t          |           }|                    |dd           |                     |j        d           |                     |j        d           |                     |j        g            |j        d         	                    d           |                     |j        t          ddd          g           |                     |j        d           dS )	z
        L{SimpleResolverComplexifier} preserves the C{port} argument passed to
        C{resolveHostName} in its returned addresses.
        r   r   TFr   r   r   N)r   r   r_   r   rw   rd   rm   rf   r   r   r   r   s       r.   test_portNumberz(LegacyCompatibilityTests.test_portNumber  s    
 %&&,V44%%->>>*D111%000,b111$$]333,{5-QU/V/V.WXXX$/////r0   N)	r1   r2   r3   r4   r   r   r   r   r   r5   r0   r.   r   r     sl         0 0 0"2 2 2"2 2 2&G G G.0 0 0 0 0r0   r   c                       e Zd ZdZd ZdS )JustEnoughReactorzT
    Just enough subclass implementation to be a valid L{ReactorBase} subclass.
    c                     dS )z
        Do nothing.
        Nr5   rQ   s    r.   installWakerzJustEnoughReactor.installWaker  s      r0   N)r1   r2   r3   r4   r   r5   r0   r.   r   r     s-             r0   r   c                   $    e Zd ZdZd Zd Zd ZdS )ReactorInstallationTestsz
    Tests for installing old and new resolvers onto a
    L{PluggableResolverMixin} and L{ReactorBase} (from which all of Twisted's
    reactor implementations derive).
    c                     t                      }t          t          |           t          t          |j                   t          t
          |j                   dS )z
        L{PluggableResolverMixin} (and its subclasses) implement both
        L{IReactorPluggableNameResolver} and L{IReactorPluggableResolver}.
        N)r   r   r   r    r   r   nameResolverr,   r   s     r.   test_interfaceCompliancez1ReactorInstallationTests.test_interfaceCompliance  sM    
 )**2G<<<_g&6777&(<=====r0   c                    t                      }t                      }t          t          |                    |                     |                     |j        t                     |                     |j        j	        |           dS )zf
        L{PluggableResolverMixin} will wrap an L{IResolverSimple} in a
        complexifier.
        N)
r   r   r   r    installResolverassertIsInstancer   r   r   _simpleResolver)r,   r   its      r.   test_installingOldStyleResolverz8ReactorInstallationTests.test_installingOldStyleResolver(  sr    
 )** ""_g&=&=b&A&ABBBg24NOOOg*:B?????r0   c                 v   t                      }|                     |j        t                     |                     |j        j        t                     |                     |j        t                     |                     |j        j	        |           |                     |j        j
        |j                   dS )zD
        L{ReactorBase} defaults to using a L{GAIResolver}.
        N)r   r   r   r   r   _getaddrinfor   r   r   _reactor_nameResolverr   s     r.   test_defaultToGAIResolverz2ReactorInstallationTests.test_defaultToGAIResolver3  s     $%%g2K@@@g*7EEEg.0IJJJg*3W===g&4g6JKKKKKr0   N)r1   r2   r3   r4   r   r   r   r5   r0   r.   r   r     sS         > > >	@ 	@ 	@	L 	L 	L 	L 	Lr0   r   N);r4   collectionsr   socketr   r   r   r   r   r	   r
   r   r   	threadingr   r   zope.interfacer   zope.interface.verifyr   twisted._threadsr   r   r   twisted.internet._resolverr   r   r   twisted.internet.addressr   r   twisted.internet.baser   r   twisted.internet.deferr   twisted.internet.errorr   twisted.internet.interfacesr   r   r   r    twisted.python.threadpoolr!   twisted.trial.unittestr"   UnitTestr$   r>   rJ   rL   r_   rp   r}   r   r   r   r   r5   r0   r.   <module>r      s    $ # # # # #
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 " ! ! ! ! ! ! ! & & & & & & . . . . . . A A A A A A A A A A         
 > = = = = = = = E E E E E E E E + + + + + + 1 1 1 1 1 1            1 0 0 0 0 0 B B B B B B    j         "IR IR IR IR IR IR IR IRX  !!$ $ $ $ $ $ $ "!$NL L L L L( L L L(b- b- b- b- b-h b- b- b-J _" " " " " " " "4a0 a0 a0 a0 a0x a0 a0 a0H       %L %L %L %L %Lx %L %L %L %L %Lr0   