+
    üÐjšL  ã                   óò  € 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?   ø€ ô &Ó'�L€FˆDäÜ”œD›F¤E£GÓ,¬~ÁÓ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 ˜j ašjr/   N)Údo)r*   rI   rH   rJ   r=   s   &fjl€r,   ÚcallFromThreadÚ7deterministicReactorThreads.<locals>.CFT.callFromThreadZ   s   û€ Ø�I‰IÖ(Ö)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)   ø€ ô &Ó'�L€FˆD÷*ô *ñ ‹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   € ð$ 	�
‰
×Ñ˜4 v¸Ð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Õ×!Ñ! 6°UÀxÐ"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,   ÚdivideByZeroÚ9HelperTests.test_logErrorsInThreads.<locals>.divideByZeroà   s   € Ø�q•5ˆLr/   N)rB   ÚpoolÚdoThreadWorkÚcallInThreadÚassertEqualÚlenÚflushLoggedErrorsÚZeroDivisionError)r*   r‚   s   & r,   Útest_logErrorsInThreadsÚ#HelperTests.test_logErrorsInThreadsÙ   s\   € ô
 (9Ó':Ñ$ˆŒ	�4Ô$ò	ð 	�	‰	×Ñ˜|Ô,Ø×ÑÔØ×Ñœ˜T×3Ñ3Ô4EÓ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Ô(Ü(Ó*ˆŒÜ#Ø�L‰LÔ+¨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Ñ2°8Ð=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Ñ2°8Ð=QÓRˆ
Ø�‰�h×*Ñ*¨JÔ7Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×ÑÔØ×ÑÔØ×Ñ˜Ÿ™¨$Ô/Ø×ÑØ×Ñ¤+¨e°U¸A¸xÓ"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Ñ2°8Ð=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  rVrxršV 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·[±[×5FÑ5FÀqÕ5IÑ2ˆ�F eØ×Ñ˜Ö,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   € ð
 	×Ñœ{˜m¬WÖ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   € ð
 	×Ñœ{˜m¬XÖ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Ø×Ñ˜d¤IÖ.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:·k±k×6GÑ6GÈÕ6JÑ3ˆ�F uØ6:·k±k×6GÑ6GÈÕ6JÑ3ˆ�F uØ×Ñ˜¤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_socketTypeToAddressTypeÚ4HostnameResolutionTests.test_socketTypeToAddressTypep  s  € ô   Ó%ˆØˆØˆÜ#¤ZÓ/ˆHØ�K‰K×(Ñ(ØØ˜˜8Ð-ÜØ!ð	 )ô ð �K‰K×(Ñ(ØÐ/¼È(ð )ö ñ 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'   € ð 	�‰×Ñœh›jÔ)Ø�~‰~˜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Ø×Ñ˜Õ×#Ñ#¤N°6Ó$:Ô;Ø×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¨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Ø×Ñ˜Õ×#Ñ#Ô$5°eÓ$<Ô=Ø×Ñœ˜T×3Ñ3Ô4EÓ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Ô(Ü(Ó*ˆŒÜ#Ø�L‰LÔ+¨T¯[©[×-DÑ-Dó
ˆŒô 3°4·=±=Ó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_interfaceComplianceÚ1ReactorInstallationTests.test_interfaceCompliance  s8   € ô
 )Ó*ˆÜÔ2°GÔ<Ü”_ 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_installingOldStyleResolverÚ8ReactorInstallationTests.test_installingOldStyleResolver(  sZ   € ô
 )Ó*ˆÜ Ó"ˆÜ”_ g×&=Ñ&=¸bÓ&AÔBØ×Ñ˜g×2Ñ2Ô4NÔ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_defaultToGAIResolverÚ2ReactorInstallationTests.test_defaultToGAIResolver3  s�   € ô $Ó%ˆØ×Ñ˜g×2Ñ2´KÔ@Ø�‰�g×*Ñ*×7Ñ7¼ÔEØ×Ñ˜g×.Ñ.Ô0IÔJØ�‰�g×*Ñ*×3Ñ3°WÔ=Ø�‰�g×&Ñ&×4Ñ4°g×6JÑ6JÖ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0˜xô a0ôH˜ô ô%L˜xö %Lr/   