+
    DfjL                        R t ^ RIHt ^ RIHtHtHtHtHtH	t	H
t
HtHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ RIHtHtHt ^ RIHtHt ^ R	IH t H!t! ^ R
I"H#t# ^ RI$H%t% ^ RI&H't'H(t(H)t)H*t* ^ RI+H,t, ^ RI-H.t/  ! R R],4      t0R t1R t2 ! R R4      t3]! ])4       ! R R4      4       t4 ! R R]/4      t5 ! R R]/4      t6]! ]*4       ! R R4      4       t7 ! R R]/4      t8 ! R R ]!4      t9 ! R! R"]/4      t:R## )$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                   *   a  ] tR t^/t o RtR tRtV tR# )DeterministicThreadPoolz.
Create a deterministic L{ThreadPool} object.
c                J    ^V n         ^V n        RV n        . V n        Wn        R# )z5
Create a L{DeterministicThreadPool} from a L{Team}.
N)minmaxnamethreads_team)selfteams   &&E/usr/lib/python3/dist-packages/twisted/internet/test/test_resolver.py__init__ DeterministicThreadPool.__init__4   s%     	
    )r)   r&   r%   r'   r(   N)__name__
__module____qualname____firstlineno____doc__r-   __static_attributes____classdictcell____classdict__s   @r,   r#   r#   /   s      r/   r#   c            	        a \        4       w  op \        \        \        \	        4       \        4       4      V3R lR 4      4      V 3# )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 # N )workers   r,   <lambda>#deterministicPool.<locals>.<lambda>I   s    vr/   c                      R # r;   r<   r<   r/   r,   r>   r?   I   s    r/   )r   r#   r   r   r   r   )doerr=   s    @r,   deterministicPoolrB   ?   s?     &'LFDDFEG,~M	
 		 r/   c                 J   a \        4       w  op  ! V3R lR4      pV! 4       V 3# )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                   .   <a  ] tR t^Yt o V3R ltRtV tR# )(deterministicReactorThreads.<locals>.CFTc                <   <aaa SP                  VVV3R  l4       R# )c                     < S! S / SB # r;   r<   )afks   r,   r>   IdeterministicReactorThreads.<locals>.CFT.callFromThread.<locals>.<lambda>[   s    ajajr/   N)do)r*   rI   rH   rJ   r=   s   &fjlr,   callFromThread7deterministicReactorThreads.<locals>.CFT.callFromThreadZ   s    II()r/   r<   N)r0   r1   r2   r3   rM   r5   r6   )r8   r=   s   @r,   CFTrE   Y   s     	* 	*r/   rO   )r   )rA   rO   r=   s     @r,   deterministicReactorThreadsrP   O   s)     &'LFD* * 5$;r/   c                   F   a  ] tR t^`t o RtR tRR lt]]]	R3R lt
RtV tR# )	FakeAddrInfoGetterz'
Test object implementing getaddrinfo.
c                <    . V n         \        \        4      V n        R# )z!
Create a L{FakeAddrInfoGetter}.
N)callsr   listresultsr*   s   &r,   r-   FakeAddrInfoGetter.__init__e   s     
"4(r/   c                    V P                   P                  WW4WV34       V P                  V,          pV'       d   V# \        \        R4      h)a9  
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)rT   appendrV   r
   r   )r*   hostportfamilysocktypeprotoflagsrV   s   &&&&&&& r,   r   FakeAddrInfoGetter.getaddrinfol   sA    $ 	

4vFG,,t$N:'UVVr/   r/   c                P    V P                   V,          P                  W4WVV34       R# )aH  
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)rV   rZ   )r*   r[   sockaddrr]   r^   r_   	canonnames   &&&&&&&r,   addResultForHost#FakeAddrInfoGetter.addResultForHost   s#    H 	T!!6Ux"PQr/   )rT   rV   N)    rg   rg   rg   )r0   r1   r2   r3   r4   r-   r   r   r	   r   re   r5   r6   r7   s   @r,   rR   rR   `   s/     )W: $R $Rr/   rR   c                   D   a  ] tR t^t o RtRtRtR tR tR t	R t
RtV tR# )	ResultHolderzA
A resolution receiver which holds onto the results it received.
Fc                    Wn         R# )z.
Create a L{ResultHolder} with a L{UnitTest}.
N)	_testCase)r*   testCases   &&r,   r-   ResultHolder.__init__   s	     "r/   c                .    RV n         Wn        . V n        R# )zO
Hostname resolution began.

@param hostResolution: see L{IResolutionReceiver}
TN)_started_resolution
_addresses)r*   hostResolutions   &&r,   resolutionBeganResultHolder.resolutionBegan   s     )r/   c                <    V P                   P                  V4       R# )zF
An address was resolved.

@param address: see L{IResolutionReceiver}
N)rq   rZ   )r*   addresss   &&r,   addressResolvedResultHolder.addressResolved   s     	w'r/   c                    RV n         R# )z"
Hostname resolution is complete.
TN)_endedrW   s   &r,   resolutionCompleteResultHolder.resolutionComplete   s     r/   )rq   rz   rp   ro   rk   N)r0   r1   r2   r3   r4   ro   rz   r-   rs   rw   r{   r5   r6   r7   s   @r,   ri   ri      s/      HF"( r/   ri   c                   *   a  ] tR t^t o RtR tRtV tR# )HelperTestsz7
Tests for error cases of helpers used in this module.
c                    \        4       w  V n        V n        R pV P                  P                  V4       V P                  4        V P	                  \        V P                  \        4      4      ^4       R# )zY
L{DeterministicThreadPool} will log any exceptions that its "thread"
workers encounter.
c                      ^^ ,          # )   r<   r<   r/   r,   divideByZero9HelperTests.test_logErrorsInThreads.<locals>.divideByZero   s    q5Lr/   N)rB   pooldoThreadWorkcallInThreadassertEquallenflushLoggedErrorsZeroDivisionError)r*   r   s   & r,   test_logErrorsInThreads#HelperTests.test_logErrorsInThreads   s\    
 (9':$	4$	 			|,T334EFGKr/   )r   r   N)r0   r1   r2   r3   r4   r   r5   r6   r7   s   @r,   r~   r~      s     L Lr/   r~   c                   `   a  ] tR t^t o RtR tR tR tR tR t	R t
R tR	 tR
 tR tRtV tR# )HostnameResolutionTestsz 
Tests for hostname resolution.
c                   a  \        4       w  S n        S n        \        4       w  S n        S n        \        4       S n        \        S P                  V 3R lS P                  P                  4      S n
        R# )z
Set up a L{GAIResolver}.
c                     < S P                   # r;   r   rW   s   r,   r>   /HostnameResolutionTests.setUp.<locals>.<lambda>   	    $))r/   N)rB   r   r   rP   reactordoReactorWorkrR   getterr   r   resolverrW   s   fr,   setUpHostnameResolutionTests.setUp   sU     (9':$	4$+F+H(d((*#LL+T[[-D-D
r/   c                   \        V 4      pV P                  P                  RR4       V P                  P	                  VR4      pV P                  VP                  V4       V P                  VP                  R4       V P                  VP                  R4       V P                  4        V P                  4        V P                  VP                  R4       V P                  VP                  \        RR^ 4      .4       R# )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.1TFTCPN)r   rg   )ri   r   re   r   resolveHostNameassertIsrp   r   ro   rz   r   r   rq   r   r*   receiver
resolutions   &  r,   test_resolveOneHost+HostnameResolutionTests.test_resolveOneHost   s      %$$%9>J]]228=QR
h**J7**D1%0$/,,{5)Q/O.PQr/   c           
        \        V 4      p^p^pV P                  P                  RR^ W#3\        R7       V P                  P                  VR4      pV P                  VP                  V4       V P                  VP                  R4       V P                  VP                  R4       V P                  4        V P                  4        V P                  VP                  R4       V P                  VP                  \        RR^ W#4      .4       R# )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}; C{addressResolved} will
receive an L{IPv6Address}.
r   ::1)r]   TFr   N)ri   r   re   r   r   r   r   rp   r   ro   rz   r   r   rq   r   )r*   r   flowInfoscopeIDr   s   &    r,   test_resolveOneIPv6Host/HostnameResolutionTests.test_resolveOneIPv6Host	  s      %$$ 5!X"? 	% 	
 ]]228=QR
h**J7**D1%0$/+eUAx"Q!R	
r/   c                t   \        V 4      pV P                  P                  VR4      pV P                  VP                  V4       V P                  4        V P                  4        V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  . 4       R# )z
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)ri   r   r   r   rp   r   r   r   ro   rz   rq   r   s   &  r,   test_gaierror%HostnameResolutionTests.test_gaierror!  s      %]]228=QR
h**J7**D1$/,,b1r/   c                4   \        V 4      pV P                  P                  VRVR7      pV P                  VP                  V4       V P                  4        V P                  4        V P                  P                  ^ ,          w  rVrxrV P                  Wr4       R# )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   )addressTypesN)
ri   r   r   r   rp   r   r   r   rT   r   )r*   	addrTypes
expectedAFr   r   r[   r\   r]   r^   r_   r`   s   &&&        r,   _resolveOnlyTest(HostnameResolutionTests._resolveOnlyTest1  s      %]]22* 3 

 	h**J759[[5F5Fq5I2Fe,r/   c                <    V P                  \        .\        4       R# )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   rW   s   &r,   test_resolveOnlyIPv4,HostnameResolutionTests.test_resolveOnlyIPv4D  s    
 	{mW5r/   c                <    V P                  \        .\        4       R# )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   rW   s   &r,   test_resolveOnlyIPv6,HostnameResolutionTests.test_resolveOnlyIPv6K  s    
 	{mX6r/   c                r    V P                  \        \        .\        4       V P                  R\        4       R# )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   rW   s   &r,   test_resolveBoth(HostnameResolutionTests.test_resolveBothR  s)     	{K8)DdI.r/   c                   \        V 4      pV P                  P                  VRRR7       \        V 4      pV P                  P                  VRRR7       V P                  4        V P	                  4        V P                  4        V P	                  4        V P
                  P                  ^ ,          w  r4rVrxV P
                  P                  ^,          w  r4rYrxV P                  V\        4       V P                  V	\        4       R# )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UDPN)
ri   r   r   r   r   r   rT   r   r	   r   )
r*   r   	receiver2r[   r\   r]   	socktypeTr_   r`   	socktypeUs
   &         r,   #test_transportSemanticsToSocketType;HostnameResolutionTests.test_transportSemanticsToSocketType[  s      %%%hRW%X &	%%} 	& 	
 	6:kk6G6G6J3Fu6:kk6G6G6J3FuK0J/r/   c                R   \        V 4      p^p^p\        \        3 FL  pV P                  P	                  RR^ W#3\
        VR7       V P                  P	                  RR\        VR7       KN  	  V P                  P                  VR4       V P                  4        V P                  4        VP                  w  rVrxV P                  VP                  R4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  R4       R# )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   r   N)z	127.0.0.3rg   )ri   r	   r   r   re   r   r   r   r   r   r   rq   r   type)	r*   r   r   r   r^   stream4stream6dgram4dgram6s	   &        r,   test_socketTypeToAddressType4HostnameResolutionTests.test_socketTypeToAddressTypep  s     %#Z/HKK((8-!	 )  KK((/( )  0 	%%h>+3+>+>(&u-u-e,e,r/   r   r   r   r   r   r   N)r0   r1   r2   r3   r4   r   r   r   r   r   r   r   r   r   r   r5   r6   r7   s   @r,   r   r      sB     	
R"
02 -&67/0*- -r/   r   c                   4   a  ] tR tRt o RtR tRR ltRtV tR# )SillyResolverSimplei  z.
Trivial implementation of L{IResolverSimple}
c                    . V n         R# )zL
Create a L{SillyResolverSimple} with a queue of requests it is working
on.
N	_requestsrW   s   &r,   r-   SillyResolverSimple.__init__  s    
 r/   c                n    V P                   P                  \        4       4       V P                   R,          # )z
Implement L{IResolverSimple.getHostByName}.

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

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

@return: see L{IResolverSimple.getHostByName}.
)r   rZ   r   )r*   r'   timeouts   &&&r,   getHostByName!SillyResolverSimple.getHostByName  s'     	hj)~~b!!r/   r   N)r<   )	r0   r1   r2   r3   r4   r-   r   r5   r6   r7   s   @r,   r   r     s     " "r/   r   c                   B   a  ] tR tRt o RtR tR tR tR tR t	Rt
V tR	# )
LegacyCompatibilityTestsi  z
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                   \        4       p\        V4      p\        V 4      pV P                  VP                  R4       VP                  VR4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  . 4       VP                  ^ ,          P                  R4       V P                  VP                  \        RR^ 4      .4       V P                  VP                  R4       R# )zj
L{SimpleResolverComplexifier} translates C{resolveHostName} into
L{IResolutionReceiver.addressResolved}.
Fr   T192.168.1.1r   N)r   r   ri   r   ro   r   rz   rq   r   callbackr   r*   simplecomplexr   s   &   r,   test_success%LegacyCompatibilityTests.test_success  s    
 %&,V4%**E2-8**D1%0,,b1$$]3,,{5-QR/S.TU$/r/   c                   \        4       p\        V4      p\        V 4      pV P                  VP                  R4       VP                  VR4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  . 4       VP                  ^ ,          P                  \        R4      4       V P                  VP                  R4       V P                  VP                  . 4       R# )z}
L{SimpleResolverComplexifier} translates a known error result from
L{IResolverSimple.resolveHostName} into an empty result.
Fr   TnopeN)r   r   ri   r   ro   r   rz   rq   r   errbackr   r   s   &   r,   test_failure%LegacyCompatibilityTests.test_failure  s    
 %&,V4%**E2-8**D1%0,,b1##N6$:;$/,,b1r/   c                l   \        4       p\        V4      p\        V 4      pV P                  VP                  R4       VP                  VR4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  . 4       VP                  ^ ,          P                  \        R4      4       V P                  \        V P                  \        4      4      ^4       V P                  VP                  R4       V P                  VP                  . 4       R# )z
L{SimpleResolverComplexifier} translates an unknown error result from
L{IResolverSimple.resolveHostName} into an empty result and a logged
error.
Fr   TzowN)r   r   ri   r   ro   r   rz   rq   r   r   r   r   r   r   s   &   r,   
test_error#LegacyCompatibilityTests.test_error  s     %&,V4%**E2-8**D1%0,,b1##$5e$<=T334EFGK$/,,b1r/   c                  a  \        4       w  S n        S n        \        4       w  S n        S n        \        4       S n        \        S P                  V 3R lS P                  P                  4      S n
        \        S P                  4      pS P                  P                  RR4       VP                  R4      pVP                  R4      pS P                  4        S P                  4        S P                  4        S P                  4        S P                  S P                  V4      P                   \"        4       S P                  S P%                  V4      R4       R# )z
L{ComplexResolverSimplifier} translates an L{IHostnameResolver} into an
L{IResolverSimple} for applications that still expect the old
interfaces to be in place.
c                     < S P                   # r;   r   rW   s   r,   r>   :LegacyCompatibilityTests.test_simplifier.<locals>.<lambda>  r   r/   r   192.168.3.4znx.example.comN)r     )rB   r   r   rP   r   r   rR   r   r   r   r   r   re   r   r   failureResultOfr   r   successResultOf)r*   simpleResolversuccessfailures   f   r,   test_simplifier(LegacyCompatibilityTests.test_simplifier  s    (9':$	4$+F+H(d((*#LL+T[[-D-D
 34==A$$]4IJ ..}= ../?@--g6;;^L--g6Fr/   c                   \        4       p\        V4      p\        V 4      pVP                  VRR4       V P	                  VP
                  R4       V P	                  VP                  R4       V P	                  VP                  . 4       VP                  ^ ,          P                  R4       V P	                  VP                  \        RRR4      .4       V P	                  VP                  R4       R# )zv
L{SimpleResolverComplexifier} preserves the C{port} argument passed to
C{resolveHostName} in its returned addresses.
r   r   TFr   r   N)r   r   ri   r   r   ro   rz   rq   r   r   r   r   s   &   r,   test_portNumber(LegacyCompatibilityTests.test_portNumber  s    
 %&,V4%->**D1%0,,b1$$]3,,{5-QU/V.WX$/r/   r   N)r0   r1   r2   r3   r4   r   r   r   r   r   r5   r6   r7   s   @r,   r   r     s)     0"2"2&G.0 0r/   r   c                   *   a  ] tR tRt o RtR tRtV tR# )JustEnoughReactori  zL
Just enough subclass implementation to be a valid L{ReactorBase} subclass.
c                    R# )z
Do nothing.
Nr<   rW   s   &r,   installWakerJustEnoughReactor.installWaker  s    r/   r<   N)r0   r1   r2   r3   r4   r   r5   r6   r7   s   @r,   r   r     s      r/   r   c                   6   a  ] tR tRt o RtR tR tR tRtV t	R# )ReactorInstallationTestsi  z
Tests for installing old and new resolvers onto a
L{PluggableResolverMixin} and L{ReactorBase} (from which all of Twisted's
reactor implementations derive).
c                    \        4       p\        \        V4       \        \        VP                  4       \        \
        VP                  4       R# )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_interfaceCompliance1ReactorInstallationTests.test_interfaceCompliance  s8    
 )*2G<_g&6&67&(<(<=r/   c                    \        4       p\        4       p\        \        VP	                  V4      4       V P                  VP                  \        4       V P                  VP                  P                  V4       R# )zN
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_installingOldStyleResolver8ReactorInstallationTests.test_installingOldStyleResolver(  sZ    
 )* "_g&=&=b&ABg224NOg**::B?r/   c                   \        4       pV P                  VP                  \        4       V P	                  VP                  P
                  \        4       V P                  VP                  \        4       V P	                  VP                  P                  V4       V P	                  VP                  P                  VP                  4       R# )z4
L{ReactorBase} defaults to using a L{GAIResolver}.
N)r   r
  r  r   r   _getaddrinfor   r   r   _reactor_nameResolverr  s   & r,   test_defaultToGAIResolver2ReactorInstallationTests.test_defaultToGAIResolver3  s     $%g22K@g**77Eg..0IJg**33W=g&&44g6J6JKr/   r<   N)
r0   r1   r2   r3   r4   r  r  r  r5   r6   r7   s   @r,   r  r    s!     >	@	L 	Lr/   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#   rB   rP   rR   ri   r~   r   r   r   r   r  r<   r/   r,   <module>r$     s   $
 
 
 " & . A A 
 > E + 1  1 Bj   "IR IRX  !$ $ "$NL( L(b-h b-J _" " "4a0x a0H %Lx %Lr/   