ó
    Ö›‘hšL  ã                   óð  • S r SSKJr  SSKJrJrJrJrJrJ	r	J
r
JrJr  SSKJrJr  SSKJr  SSKJr  SSKJrJrJr  SSKJrJrJr  SS	KJrJr  SS
KJ r J!r!  SSK"J#r#  SSK$J%r%  SSK&J'r'J(r(J)r)J*r*  SSK+J,r,  SSK-J.r/   " S S\,5      r0S r1S r2 " S S5      r3\" \)5       " S S5      5       r4 " S S\/5      r5 " S S\/5      r6\" \*5       " S S5      5       r7 " S S\/5      r8 " S  S!\!5      r9 " S" S#\/5      r:g$)%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                   ó   • \ rS rSrSrS rSrg)ÚDeterministicThreadPoolé/   z.
Create a deterministic L{ThreadPool} object.
c                 óH   • SU l         SU l        SU l        / U l        Xl        g)z5
Create a L{DeterministicThreadPool} from a L{Team}.
é   N)ÚminÚmaxÚnameÚthreadsÚ_team)ÚselfÚteams     ÚgC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/internet/test/test_resolver.pyÚ__init__Ú DeterministicThreadPool.__init__4   s%   € ð ˆŒØˆŒØˆŒ	ØˆŒØ�
ó    )r,   r)   r(   r*   r+   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r0   Ú__static_attributes__© r2   r/   r$   r$   /   s   † ñõr2   r$   c            	      óŒ   ^• [        5       u  mn [        [        [        [	        5       [        5       5      U4S jS 5      5      U 4$ )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                  ó   >• T $ ©Nr9   ©Úworkers   €r/   Ú<lambda>Ú#deterministicPool.<locals>.<lambda>I   s   ø€ ±vr2   c                  ó   • g r<   r9   r9   r2   r/   r?   r@   I   s   € Èr2   )r   r$   r   r   r   r   )Údoerr>   s    @r/   ÚdeterministicPoolrC   ?   s?   ø€ ô &Ó'�L€FˆDäÜ”œD›F¤E£GÓ,¬~ÁÓMó	
ð 	ð	ð r2   c                  óJ   ^• [        5       u  mn  " U4S jS5      nU" 5       U 4$ )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                   ó"   >• \ rS rSrU 4S jrSrg)Ú(deterministicReactorThreads.<locals>.CFTéY   c                 ó:   >^^^• TR                  UUU4S j5        g )Nc                  ó   >• T" T 0 TD6$ r<   r9   )ÚaÚfÚks   €€€r/   r?   ÚIdeterministicReactorThreads.<locals>.CFT.callFromThread.<locals>.<lambda>[   s   ø€ ™a ˜j ašjr2   )Údo)r-   rK   rJ   rL   r>   s    ```€r/   ÚcallFromThreadÚ7deterministicReactorThreads.<locals>.CFT.callFromThreadZ   s   û€ Ø�I‰IÖ(Õ)r2   r9   N)r3   r4   r5   r6   rO   r8   r=   s   €r/   ÚCFTrF   Y   s   ø† ÷	*ð 	*r2   rQ   )r   )rB   rQ   r>   s     @r/   ÚdeterministicReactorThreadsrR   O   s)   ø€ ô &Ó'�L€FˆD÷*ô *ñ ‹5�$ˆ;Ðr2   c                   ó:   • \ rS rSrSrS rS	S jr\\\	S4S jr
Srg)
ÚFakeAddrInfoGetteré`   z'
Test object implementing getaddrinfo.
c                 ó:   • / U l         [        [        5      U l        g)z!
Create a L{FakeAddrInfoGetter}.
N)Úcallsr   ÚlistÚresults©r-   s    r/   r0   ÚFakeAddrInfoGetter.__init__e   s   € ð ˆŒ
Ü"¤4Ó(ˆ�r2   c                 óŽ   • U R                   R                  XX4XV45        U R                  U   nU(       a  U$ [        [        S5      e)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)rW   ÚappendrY   r   r   )r-   ÚhostÚportÚfamilyÚsocktypeÚprotoÚflagsrY   s           r/   r   ÚFakeAddrInfoGetter.getaddrinfol   sA   € ð$ 	�
‰
×Ñ˜4 v¸ÐFÔGØ—,‘,˜tÑ$ˆÞØˆNäœ:Ð'UÓVÐVr2   r2   c                 óF   • U R                   U   R                  X4XVU45        g)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)rY   r]   )r-   r^   Úsockaddrr`   ra   rb   Ú	canonnames          r/   ÚaddResultForHostÚ#FakeAddrInfoGetter.addResultForHost…   s#   € ðH 	�‰�TÑ×!Ñ! 6°UÀxÐ"PÕQr2   )rW   rY   N)r   r   r   r   )r3   r4   r5   r6   r7   r0   r   r   r
   r   rh   r8   r9   r2   r/   rT   rT   `   s&   † ñò)ôWð: ØØØ÷$Rr2   rT   c                   ó8   • \ rS rSrSrSrSrS rS rS r	S r
Srg	)
ÚResultHolderé¬   zA
A resolution receiver which holds onto the results it received.
Fc                 ó   • Xl         g)z.
Create a L{ResultHolder} with a L{UnitTest}.
N)Ú	_testCase)r-   ÚtestCases     r/   r0   ÚResultHolder.__init__µ   s	   € ð "�r2   c                 ó,   • SU l         Xl        / U l        g)zO
Hostname resolution began.

@param hostResolution: see L{IResolutionReceiver}
TN)Ú_startedÚ_resolutionÚ
_addresses)r-   ÚhostResolutions     r/   ÚresolutionBeganÚResultHolder.resolutionBegan»   s   € ð ˆŒØ)ÔØˆ�r2   c                 ó:   • U R                   R                  U5        g)zF
An address was resolved.

@param address: see L{IResolutionReceiver}
N)rt   r]   )r-   Úaddresss     r/   ÚaddressResolvedÚResultHolder.addressResolvedÅ   s   € ð 	�‰×Ñ˜wÕ'r2   c                 ó   • SU l         g)z"
Hostname resolution is complete.
TN)Ú_endedrZ   s    r/   ÚresolutionCompleteÚResultHolder.resolutionCompleteÍ   s   € ð ˆ�r2   )rt   r}   rs   rr   rn   N)r3   r4   r5   r6   r7   rr   r}   r0   rv   rz   r~   r8   r9   r2   r/   rk   rk   ¬   s'   † ñð €HØ€Fò"òò(õr2   rk   c                   ó   • \ rS rSrSrS rSrg)ÚHelperTestséÔ   z7
Tests for error cases of helpers used in this module.
c                 óê   • [        5       u  U l        U l        S nU R                  R                  U5        U R                  5         U R	                  [        U R                  [        5      5      S5        g)zY
L{DeterministicThreadPool} will log any exceptions that its "thread"
workers encounter.
c                  ó   • SS-  $ )Nr'   r   r9   r9   r2   r/   ÚdivideByZeroÚ9HelperTests.test_logErrorsInThreads.<locals>.divideByZeroà   s   € Ø�q‘5ˆLr2   r'   N)rC   Ú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ÈÕKr2   )rˆ   r‡   N)r3   r4   r5   r6   r7   rŽ   r8   r9   r2   r/   r�   r�   Ô   s   † ñõLr2   r�   c                   óT   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)ÚHostnameResolutionTestséè   z 
Tests for hostname resolution.
c                 óè   ^ • [        5       u  T l        T l        [        5       u  T l        T l        [        5       T l        [        T R                  U 4S jT R                  R                  5      T l
        g)z
Set up a L{GAIResolver}.
c                  ó   >• T R                   $ r<   ©r‡   rZ   s   €r/   r?   Ú/HostnameResolutionTests.setUp.<locals>.<lambda>õ   ó	   ø€  $§)¢)r2   N)rC   r‡   rˆ   rR   ÚreactorÚdoReactorWorkrT   Úgetterr   r   ÚresolverrZ   s   `r/   ÚsetUpÚHostnameResolutionTests.setUpí   sU   ø€ ô (9Ó':Ñ$ˆŒ	�4Ô$Ü+FÓ+HÑ(ˆŒ�dÔ(Ü(Ó*ˆŒÜ#Ø�L‰LÔ+¨T¯[©[×-DÑ-Dó
ˆ�r2   c                 óú  • [        U 5      nU R                  R                  SS5        U R                  R	                  US5      nU R                  UR                  U5        U R                  UR                  S5        U R                  UR                  S5        U R                  5         U R                  5         U R                  UR                  S5        U R                  UR                  [        SSS5      /5        g)	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)rk   rš   rh   r›   ÚresolveHostNameÚassertIsrs   rŠ   rr   r}   rˆ   r™   rt   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ÕQr2   c           
      ó  • [        U 5      nSnSnU R                  R                  SSSX#4[        S9  U R                  R                  US5      nU R                  UR                  U5        U R                  UR                  S5        U R                  UR                  S5        U R                  5         U R                  5         U R                  UR                  S5        U R                  UR                  [        S	SSX#5      /5        g
)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'   é   rŸ   ú::1r   )r`   TFr¡   N)rk   rš   rh   r   r›   r¢   r£   rs   rŠ   rr   r}   rˆ   r™   rt   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õ	
r2   c                 ór  • [        U 5      nU R                  R                  US5      nU R                  UR                  U5        U R                  5         U R                  5         U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  / 5        g)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)rk   r›   r¢   r£   rs   rˆ   r™   rŠ   rr   r}   rt   r¤   s      r/   Útest_gaierrorÚ%HostnameResolutionTests.test_gaierror!  s‘   € ô   Ó%ˆØ—]‘]×2Ñ2°8Ð=QÓRˆ
Ø�‰�h×*Ñ*¨JÔ7Ø×ÑÔØ×ÑÔØ×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¨bÕ1r2   c                 ó$  • [        U 5      nU R                  R                  USUS9nU R                  UR                  U5        U R                  5         U R                  5         U R                  R                  S   u  pVpxpšU R                  Xr5        g)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)
rk   r›   r¢   r£   rs   rˆ   r™   rš   rW   rŠ   )r-   Ú	addrTypesÚ
expectedAFr¥   r¦   r^   r_   r`   ra   rb   rc   s              r/   Ú_resolveOnlyTestÚ(HostnameResolutionTests._resolveOnlyTest1  s†   € ô   Ó%ˆØ—]‘]×2Ñ2ØÐ*¸ð 3ð 
ˆ
ð 	�‰�h×*Ñ*¨JÔ7Ø×ÑÔØ×ÑÔØ59·[±[×5FÑ5FÀqÑ5IÑ2ˆ�F eØ×Ñ˜Õ,r2   c                 ó:   • U R                  [        /[        5        g)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   rZ   s    r/   Útest_resolveOnlyIPv4Ú,HostnameResolutionTests.test_resolveOnlyIPv4D  s   € ð
 	×Ñœ{˜m¬WÕ5r2   c                 ó:   • U R                  [        /[        5        g)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   rZ   s    r/   Útest_resolveOnlyIPv6Ú,HostnameResolutionTests.test_resolveOnlyIPv6K  s   € ð
 	×Ñœ{˜m¬XÕ6r2   c                 óp   • U R                  [        [        /[        5        U R                  S[        5        g)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   rZ   s    r/   Útest_resolveBothÚ(HostnameResolutionTests.test_resolveBothR  s)   € ð 	×Ñœ{¬KÐ8¼)ÔDØ×Ñ˜d¤IÕ.r2   c                 óè  • [        U 5      nU R                  R                  USSS9  [        U 5      nU R                  R                  USSS9  U R                  5         U R	                  5         U R                  5         U R	                  5         U R
                  R                  S   u  p4pVpxU R
                  R                  S   u  p4pYpxU R                  U[        5        U R                  U	[        5        g)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)
rk   r›   r¢   rˆ   r™   rš   rW   rŠ   r
   r	   )
r-   r¥   Ú	receiver2r^   r_   r`   Ú	socktypeTrb   rc   Ú	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Õ/r2   c                 óD  • [        U 5      nSnSn[        [        4 HF  nU R                  R	                  SSSX#4[
        US9  U R                  R	                  SS[        US9  MH     U R                  R                  US5        U R                  5         U R                  5         UR                  u  pVpxU R                  UR                  S5        U R                  UR                  S5        U R                  UR                  S	5        U R                  UR                  S	5        g
)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`   ra   )z	127.0.0.3r   r¡   rÅ   N)rk   r
   r	   rš   rh   r   r   r›   r¢   rˆ   r™   rt   rŠ   Útype)	r-   r¥   r¬   r­   ra   Ú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Õ,r2   ©r™   rˆ   rš   r‡   r˜   r›   N)r3   r4   r5   r6   r7   rœ   r§   r®   r±   r·   rº   r½   rÀ   rÉ   rÑ   r8   r9   r2   r/   r‘   r‘   è   s:   † ñò	
òRò"
ò02ò -ò&6ò7ò/ò0õ*-r2   r‘   c                   ó(   • \ rS rSrSrS rSS jrSrg)ÚSillyResolverSimplei�  z.
Trivial implementation of L{IResolverSimple}
c                 ó   • / U l         g)zL
Create a L{SillyResolverSimple} with a queue of requests it is working
on.
N©Ú	_requestsrZ   s    r/   r0   ÚSillyResolverSimple.__init__“  s   € ð
 ˆ�r2   c                 óf   • U R                   R                  [        5       5        U R                   S   $ )zÈ
Implement L{IResolverSimple.getHostByName}.

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

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

@return: see L{IResolverSimple.getHostByName}.
éÿÿÿÿ)rØ   r]   r   )r-   r*   Útimeouts      r/   ÚgetHostByNameÚ!SillyResolverSimple.getHostByNameš  s'   € ð 	�‰×Ñœh›jÔ)Ø�~‰~˜bÑ!Ð!r2   r×   N)r9   )r3   r4   r5   r6   r7   r0   rÝ   r8   r9   r2   r/   rÕ   rÕ   �  s   † ñò÷"r2   rÕ   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
Ú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                 ó  • [        5       n[        U5      n[        U 5      nU R                  UR                  S5        UR                  US5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  / 5        UR                  S   R                  S5        U R                  UR                  [        SSS5      /5        U R                  UR                  S5        g)zj
L{SimpleResolverComplexifier} translates C{resolveHostName} into
L{IResolutionReceiver.addressResolved}.
FrÃ   Tr   ú192.168.1.1r¡   N)rÕ   r   rk   rŠ   rr   r¢   r}   rt   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Ø×Ñ˜Ÿ™¨$Õ/r2   c                 ó  • [        5       n[        U5      n[        U 5      nU R                  UR                  S5        UR                  US5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  / 5        UR                  S   R                  [        S5      5        U R                  UR                  S5        U R                  UR                  / 5        g)z}
L{SimpleResolverComplexifier} translates a known error result from
L{IResolverSimple.resolveHostName} into an empty result.
FrÃ   Tr   ÚnopeN)rÕ   r   rk   rŠ   rr   r¢   r}   rt   rØ   Úerrbackr   rä   s       r/   Útest_failureÚ%LegacyCompatibilityTests.test_failureÀ  sÎ   € ô
 %Ó&ˆÜ,¨VÓ4ˆÜ Ó%ˆØ×Ñ˜×*Ñ*¨EÔ2Ø×Ñ ¨-Ô8Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×Ñ˜×,Ñ,¨bÔ1Ø×Ñ˜Ñ×#Ñ#¤N°6Ó$:Ô;Ø×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¨bÕ1r2   c                 ób  • [        5       n[        U5      n[        U 5      nU R                  UR                  S5        UR                  US5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  / 5        UR                  S   R                  [        S5      5        U R                  [        U R                  [        5      5      S5        U R                  UR                  S5        U R                  UR                  / 5        g)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   rk   rŠ   rr   r¢   r}   rt   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Õ1r2   c                 ó®  ^ • [        5       u  T l        T l        [        5       u  T l        T l        [        5       T l        [        T R                  U 4S jT R                  R                  5      T l
        [        T R                  5      nT R                  R                  SS5        UR                  S5      nUR                  S5      nT R                  5         T R                  5         T R                  5         T R                  5         T R                  T R                  U5      R                   ["        5        T R                  T R%                  U5      S5        g)z¢
L{ComplexResolverSimplifier} translates an L{IHostnameResolver} into an
L{IResolverSimple} for applications that still expect the old
interfaces to be in place.
c                  ó   >• T R                   $ r<   r•   rZ   s   €r/   r?   Ú:LegacyCompatibilityTests.test_simplifier.<locals>.<lambda>î  r—   r2   rÃ   )ú192.168.3.4éá  znx.example.comrõ   N)rC   r‡   rˆ   rR   r˜   r™   rT   rš   r   r   r›   r   rh   rÝ   rŠ   ÚfailureResultOfrÌ   r   ÚsuccessResultOf)r-   ÚsimpleResolverÚsuccessÚfailures   `   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¸ÕFr2   c                 óÖ  • [        5       n[        U5      n[        U 5      nUR                  USS5        U R	                  UR
                  S5        U R	                  UR                  S5        U R	                  UR                  / 5        UR                  S   R                  S5        U R	                  UR                  [        SSS5      /5        U R	                  UR                  S5        g)	zv
L{SimpleResolverComplexifier} preserves the C{port} argument passed to
C{resolveHostName} in its returned addresses.
rÃ   rö   TFr   râ   r¡   N)rÕ   r   rk   r¢   rŠ   rr   r}   rt   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Ø×Ñ˜Ÿ™¨$Õ/r2   rÓ   N)r3   r4   r5   r6   r7   rç   rì   rð   rü   rÿ   r8   r9   r2   r/   rà   rà   ¨  s!   † ñò0ò"2ò"2ò&Gõ.0r2   rà   c                   ó   • \ rS rSrSrS rSrg)ÚJustEnoughReactori  zL
Just enough subclass implementation to be a valid L{ReactorBase} subclass.
c                 ó   • g)z
Do nothing.
Nr9   rZ   s    r/   ÚinstallWakerÚJustEnoughReactor.installWaker  s   � r2   r9   N)r3   r4   r5   r6   r7   r  r8   r9   r2   r/   r  r    s   † ñõr2   r  c                   ó*   • \ rS rSrSrS rS rS rSrg)Ú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                 ó    • [        5       n[        [        U5        [        [        UR                  5        [        [
        UR                  5        g)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ÜÔ&¨×(<Ñ(<Õ=r2   c                 óö   • [        5       n[        5       n[        [        UR	                  U5      5        U R                  UR                  [        5        U R                  UR                  R                  U5        g)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Õ?r2   c                 ó˜  • [        5       nU R                  UR                  [        5        U R	                  UR                  R
                  [        5        U R                  UR                  [        5        U R	                  UR                  R                  U5        U R	                  UR                  R                  UR                  5        g)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ÕKr2   r9   N)	r3   r4   r5   r6   r7   r  r  r  r8   r9   r2   r/   r  r    s   † ñò>ò	@õ	Lr2   r  N);r7   Ú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$   rC   rR   rT   rk   r�   r‘   rÕ   rà   r  r  r9   r2   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r2   