Ë
    ojšL  ã                   óð  — 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:y$)%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y)ÚDeterministicThreadPoolz6
    Create a deterministic L{ThreadPool} object.
    c                 óJ   — d| _         d| _        d| _        g | _        || _        y)zE
        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__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                   ó   — y r8   r5   r5   r0   r.   r;   z#deterministicPool.<locals>.<lambda>I   ó   � r0   )r   r$   r   r   r   r   )Údoerr:   s    @r.   ÚdeterministicPoolr?   ?   s?   ø€ ô &Ó'�L€FˆDäÜ”œD›F¤E£GÓ,«~ÁÓMó	
ð 	ð	ð r0   c                  óH   ‡— 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y)ú(deterministicReactorThreads.<locals>.CFTc                 ó8   •‡‡‡— ‰j                  ˆˆˆfd„«       y )Nc                  ó   •—  ‰‰ i ‰¤ŽS r8   r5   )ÚaÚfÚks   €€€r.   r;   zIdeterministicReactorThreads.<locals>.CFT.callFromThread.<locals>.<lambda>[   s   ø€ ™a ˜j a™j€ r0   )Údo)r,   rF   rE   rG   r:   s    ```€r.   ÚcallFromThreadz7deterministicReactorThreads.<locals>.CFT.callFromThreadZ   s   û€ Ø�I‰IÕ(Õ)r0   N)r1   r2   r3   rI   r9   s   €r.   ÚCFTrB   Y   s   ø„ õ	*r0   rJ   )r   )r>   rJ   r:   s     @r.   ÚdeterministicReactorThreadsrK   O   s)   ø€ ô &Ó'�L€FˆD÷*ó *ñ ‹5�$ˆ;Ðr0   c                   ó.   — e Zd ZdZd„ Zdd„Zeeedfd„Z	y)ÚFakeAddrInfoGetterz/
    Test object implementing getaddrinfo.
    c                 ó:   — g | _         t        t        «      | _        y)z1
        Create a L{FakeAddrInfoGetter}.
        N)Úcallsr   ÚlistÚresults©r,   s    r.   r/   zFakeAddrInfoGetter.__init__e   s   € ð ˆŒ
Ü"¤4Ó(ˆ�r0   c                 óŠ   — | j                   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)rO   ÚappendrQ   r   r   )r,   ÚhostÚportÚfamilyÚsocktypeÚprotoÚflagsrQ   s           r.   r   zFakeAddrInfoGetter.getaddrinfol   sG   € ð$ 	�
‰
×Ñ˜4  v¨x¸ÀÐFÔGØ—,‘,˜tÑ$ˆÙØˆNäœ:Ð'UÓVÐVr0   r0   c                 óJ   — | j                   |   j                  |||||f«       y)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)rQ   rT   )r,   rU   ÚsockaddrrW   rX   rY   Ú	canonnames          r.   ÚaddResultForHostz#FakeAddrInfoGetter.addResultForHost…   s'   € ðH 	�‰�TÑ×!Ñ! 6¨8°U¸IÀxÐ"PÕQr0   N)r   r   r   r   )
r1   r2   r3   r4   r/   r   r   r
   r   r^   r5   r0   r.   rM   rM   `   s&   „ ñò)óWð: ØØØô$Rr0   rM   c                   ó0   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	y)ÚResultHolderzI
    A resolution receiver which holds onto the results it received.
    Fc                 ó   — || _         y)z>
        Create a L{ResultHolder} with a L{UnitTest}.
        N)Ú	_testCase)r,   ÚtestCases     r.   r/   zResultHolder.__init__µ   s   € ð "ˆ�r0   c                 ó.   — d| _         || _        g | _        y)zg
        Hostname resolution began.

        @param hostResolution: see L{IResolutionReceiver}
        TN)Ú_startedÚ_resolutionÚ
_addresses)r,   ÚhostResolutions     r.   ÚresolutionBeganzResultHolder.resolutionBegan»   s   € ð ˆŒØ)ˆÔØˆ�r0   c                 ó:   — | j                   j                  |«       y)z^
        An address was resolved.

        @param address: see L{IResolutionReceiver}
        N)rg   rT   )r,   Úaddresss     r.   ÚaddressResolvedzResultHolder.addressResolvedÅ   s   € ð 	�‰×Ñ˜wÕ'r0   c                 ó   — d| _         y)z2
        Hostname resolution is complete.
        TN)Ú_endedrR   s    r.   ÚresolutionCompletezResultHolder.resolutionCompleteÍ   s   € ð ˆ�r0   N)
r1   r2   r3   r4   re   rn   r/   ri   rl   ro   r5   r0   r.   r`   r`   ¬   s'   „ ñð €HØ€Fò"òò(ór0   r`   c                   ó   — e Zd ZdZd„ Zy)ÚHelperTestsz?
    Tests for error cases of helpers used in this module.
    c                 óê   — t        «       \  | _        | _        d„ }| j                  j                  |«       | j                  «        | j	                  t        | j                  t        «      «      d«       y)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   € Ø�q‘5ˆLr0   r&   N)r?   ÚpoolÚdoThreadWorkÚcallInThreadÚassertEqualÚlenÚflushLoggedErrorsÚZeroDivisionError)r,   rt   s     r.   Útest_logErrorsInThreadsz#HelperTests.test_logErrorsInThreadsÙ   s\   € ô
 (9Ó':Ñ$ˆŒ	�4Ô$ò	ð 	�	‰	×Ñ˜|Ô,Ø×ÑÔØ×Ñœ˜T×3Ñ3Ô4EÓFÓGÈÕKr0   N)r1   r2   r3   r4   r|   r5   r0   r.   rq   rq   Ô   s   „ ñóLr0   rq   c                   óL   — 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y)ÚHostnameResolutionTestsz(
    Tests for hostname resolution.
    c                 óæ   ‡ — t        «       \  ‰ _        ‰ _        t        «       \  ‰ _        ‰ _        t        «       ‰ _        t        ‰ j                  ˆ fd„‰ j                  j                  «      ‰ _
        y)z*
        Set up a L{GAIResolver}.
        c                  ó   •— ‰ j                   S r8   ©ru   rR   s   €r.   r;   z/HostnameResolutionTests.setUp.<locals>.<lambda>õ   ó   ø€  $§)¡)€ r0   N)r?   ru   rv   rK   ÚreactorÚdoReactorWorkrM   Úgetterr   r   ÚresolverrR   s   `r.   ÚsetUpzHostnameResolutionTests.setUpí   sU   ø€ ô (9Ó':Ñ$ˆŒ	�4Ô$Ü+FÓ+HÑ(ˆŒ�dÔ(Ü(Ó*ˆŒÜ#Ø�L‰LÓ+¨T¯[©[×-DÑ-Dó
ˆ�r0   c                 óú  — t        | «      }| j                  j                  dd«       | j                  j	                  |d«      }| j                  |j                  |«       | j                  |j                  d«       | j                  |j                  d«       | j                  «        | j                  «        | j                  |j                  d«       | j                  |j                  t        ddd«      g«       y)	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ÚassertIsrf   rx   re   rn   rv   r„   rg   r   ©r,   ÚreceiverÚ
resolutions      r.   Útest_resolveOneHostz+HostnameResolutionTests.test_resolveOneHostø   sÆ   € ô   Ó%ˆØ�‰×$Ñ$Ð%9¸>ÔJØ—]‘]×2Ñ2°8Ð=QÓRˆ
Ø�‰�h×*Ñ*¨JÔ7Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×ÑÔØ×ÑÔØ×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¬{¸5À)ÈQÓ/OÐ.PÕQr0   c           
      ó  — t        | «      }d}d}| j                  j                  ddd||ft        ¬«       | j                  j                  |d«      }| j                  |j                  |«       | j                  |j                  d«       | j                  |j                  d«       | j                  «        | j                  «        | j                  |j                  d«       | j                  |j                  t        d	dd||«      g«       y
)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   )rW   TFr‹   N)r`   r…   r^   r   r†   rŒ   r�   rf   rx   re   rn   rv   r„   rg   r   )r,   r�   ÚflowInfoÚscopeIDr�   s        r.   Útest_resolveOneIPv6Hostz/HostnameResolutionTests.test_resolveOneIPv6Host	  së   € ô   Ó%ˆØˆØˆØ�‰×$Ñ$Ø  5¨!¨X°wÐ"?Ìð 	%ô 	
ð —]‘]×2Ñ2°8Ð=QÓRˆ
Ø�‰�h×*Ñ*¨JÔ7Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×ÑÔØ×ÑÔØ×Ñ˜Ÿ™¨$Ô/Ø×ÑØ×Ñ¤+¨e°U¸A¸xÈÓ"QÐ!Rõ	
r0   c                 ór  — t        | «      }| j                  j                  |d«      }| j                  |j                  |«       | j                  «        | j                  «        | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  g «       y)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�   rf   rv   r„   rx   re   rn   rg   rŽ   s      r.   Útest_gaierrorz%HostnameResolutionTests.test_gaierror!  s‘   € ô   Ó%ˆØ—]‘]×2Ñ2°8Ð=QÓRˆ
Ø�‰�h×*Ñ*¨JÔ7Ø×ÑÔØ×ÑÔØ×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¨bÕ1r0   c                 ó2  — t        | «      }| j                  j                  |d|¬«      }| j                  |j                  |«       | j                  «        | j                  «        | j                  j                  d   \  }}}}}	}
| j                  ||«       y)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�   rf   rv   r„   r…   rO   rx   )r,   Ú	addrTypesÚ
expectedAFr�   r�   rU   rV   rW   rX   rY   rZ   s              r.   Ú_resolveOnlyTestz(HostnameResolutionTests._resolveOnlyTest1  sŽ   € ô   Ó%ˆØ—]‘]×2Ñ2ØÐ*¸ð 3ó 
ˆ
ð 	�‰�h×*Ñ*¨JÔ7Ø×ÑÔØ×ÑÔØ59·[±[×5FÑ5FÀqÑ5IÑ2ˆˆd�F˜H e¨UØ×Ñ˜ Õ,r0   c                 ó:   — | j                  t        gt        «       y)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   rR   s    r.   Útest_resolveOnlyIPv4z,HostnameResolutionTests.test_resolveOnlyIPv4D  s   € ð
 	×Ñœ{˜m¬WÕ5r0   c                 ó:   — | j                  t        gt        «       y)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   rR   s    r.   Útest_resolveOnlyIPv6z,HostnameResolutionTests.test_resolveOnlyIPv6K  s   € ð
 	×Ñœ{˜m¬XÕ6r0   c                 óp   — | j                  t        t        gt        «       | j                  dt        «       y)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   rR   s    r.   Útest_resolveBothz(HostnameResolutionTests.test_resolveBothR  s)   € ð 	×Ñœ{¬KÐ8¼)ÔDØ×Ñ˜d¤IÕ.r0   c                 ó   — t        | «      }| j                  j                  |dd¬«       t        | «      }| j                  j                  |dd¬«       | j                  «        | j	                  «        | j                  «        | j	                  «        | j
                  j                  d   \  }}}}}}| j
                  j                  d   \  }}}}	}}| j                  |t        «       | j                  |	t        «       y)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Œ   rv   r„   r…   rO   rx   r
   r	   )
r,   r�   Ú	receiver2rU   rV   rW   Ú	socktypeTrY   rZ   Ú	socktypeUs
             r.   Ú#test_transportSemanticsToSocketTypez;HostnameResolutionTests.test_transportSemanticsToSocketType[  sä   € ô   Ó%ˆØ�‰×%Ñ% h°ÐRWÐ%ÔXÜ  Ó&ˆ	Ø�‰×%Ñ%Ø�}¸ð 	&ô 	
ð 	×ÑÔØ×ÑÔØ×ÑÔØ×ÑÔØ6:·k±k×6GÑ6GÈÑ6JÑ3ˆˆd�F˜I u¨eØ6:·k±k×6GÑ6GÈÑ6JÑ3ˆˆd�F˜I u¨eØ×Ñ˜¤KÔ0Ø×Ñ˜¤JÕ/r0   c                 óR  — t        | «      }d}d}t        t        fD ]L  }| j                  j	                  ddd||ft
        |¬«       | j                  j	                  ddt        |¬«       ŒN | j                  j                  |d«       | j                  «        | j                  «        |j                  \  }}}}| j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d	«       | j                  |j                  d	«       y
)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   )rW   rX   )z	127.0.0.3r   r‹   r¨   N)r`   r
   r	   r…   r^   r   r   r†   rŒ   rv   r„   rg   rx   Útype)	r,   r�   r•   r–   rX   Ústream4Ústream6Údgram4Údgram6s	            r.   Útest_socketTypeToAddressTypez4HostnameResolutionTests.test_socketTypeToAddressTypep  s  € ô   Ó%ˆØˆØˆÜ#¤ZÐ/ò 		ˆHØ�K‰K×(Ñ(ØØ˜˜8 WÐ-ÜØ!ð	 )ô ð �K‰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ò"
ò02ò -ò&6ò7ò/ò0ó*-r0   r~   c                   ó   — e Zd ZdZd„ Zdd„Zy)ÚSillyResolverSimplez6
    Trivial implementation of L{IResolverSimple}
    c                 ó   — g | _         y)zd
        Create a L{SillyResolverSimple} with a queue of requests it is working
        on.
        N)Ú	_requestsrR   s    r.   r/   zSillyResolverSimple.__init__“  s   € ð
 ˆ�r0   c                 óf   — | j                   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·   rT   r   )r,   r)   Útimeouts      r.   ÚgetHostByNamez!SillyResolverSimple.getHostByNameš  s'   € ð 	�‰×Ñœh›jÔ)Ø�~‰~˜bÑ!Ð!r0   N)r5   )r1   r2   r3   r4   r/   r»   r5   r0   r.   rµ   rµ   �  s   „ ñòô"r0   rµ   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)Ú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                  |j                  d«       |j                  |d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  g «       |j                  d   j                  d«       | j                  |j                  t        ddd«      g«       | j                  |j                  d«       y)z‚
        L{SimpleResolverComplexifier} translates C{resolveHostName} into
        L{IResolutionReceiver.addressResolved}.
        Fr¦   Tr   ú192.168.1.1r‹   N)rµ   r   r`   rx   re   rŒ   rn   rg   r·   Úcallbackr   ©r,   ÚsimpleÚcomplexr�   s       r.   Útest_successz%LegacyCompatibilityTests.test_success¯  sÖ   € ô
 %Ó&ˆÜ,¨VÓ4ˆÜ Ó%ˆØ×Ñ˜×*Ñ*¨EÔ2Ø×Ñ ¨-Ô8Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×Ñ˜×,Ñ,¨bÔ1Ø×Ñ˜Ñ×$Ñ$ ]Ô3Ø×Ñ˜×,Ñ,¬{¸5À-ÐQRÓ/SÐ.TÔUØ×Ñ˜Ÿ™¨$Õ/r0   c                 ó  — t        «       }t        |«      }t        | «      }| j                  |j                  d«       |j                  |d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  g «       |j                  d   j                  t        d«      «       | j                  |j                  d«       | j                  |j                  g «       y)z•
        L{SimpleResolverComplexifier} translates a known error result from
        L{IResolverSimple.resolveHostName} into an empty result.
        Fr¦   Tr   ÚnopeN)rµ   r   r`   rx   re   rŒ   rn   rg   r·   Úerrbackr   rÁ   s       r.   Útest_failurez%LegacyCompatibilityTests.test_failureÀ  sÎ   € ô
 %Ó&ˆÜ,¨VÓ4ˆÜ Ó%ˆØ×Ñ˜×*Ñ*¨EÔ2Ø×Ñ ¨-Ô8Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×Ñ˜×,Ñ,¨bÔ1Ø×Ñ˜Ñ×#Ñ#¤N°6Ó$:Ô;Ø×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¨bÕ1r0   c                 ób  — t        «       }t        |«      }t        | «      }| j                  |j                  d«       |j                  |d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  g «       |j                  d   j                  t        d«      «       | j                  t        | j                  t        «      «      d«       | j                  |j                  d«       | j                  |j                  g «       y)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`   rx   re   rŒ   rn   rg   r·   rÇ   r{   ry   rz   rÁ   s       r.   Ú
test_errorz#LegacyCompatibilityTests.test_errorÑ  sð   € ô %Ó&ˆÜ,¨VÓ4ˆÜ Ó%ˆØ×Ñ˜×*Ñ*¨EÔ2Ø×Ñ ¨-Ô8Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×Ñ˜×,Ñ,¨bÔ1Ø×Ñ˜Ñ×#Ñ#Ô$5°eÓ$<Ô=Ø×Ñœ˜T×3Ñ3Ô4EÓFÓGÈÔKØ×Ñ˜Ÿ™¨$Ô/Ø×Ñ˜×,Ñ,¨bÕ1r0   c                 ó¬  ‡ — t        «       \  ‰ _        ‰ _        t        «       \  ‰ _        ‰ _        t        «       ‰ _        t        ‰ j                  ˆ fd„‰ j                  j                  «      ‰ _
        t        ‰ j                  «      }‰ j                  j                  dd«       |j                  d«      }|j                  d«      }‰ j                  «        ‰ j                  «        ‰ j                  «        ‰ j                  «        ‰ j                  ‰ j                  |«      j                   t"        «       ‰ j                  ‰ j%                  |«      d«       y)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�   rR   s   €r.   r;   z:LegacyCompatibilityTests.test_simplifier.<locals>.<lambda>î  r‚   r0   r¦   )ú192.168.3.4éá  znx.example.comrÎ   N)r?   ru   rv   rK   rƒ   r„   rM   r…   r   r   r†   r   r^   r»   rx   ÚfailureResultOfr®   r   ÚsuccessResultOf)r,   ÚsimpleResolverÚsuccessÚfailures   `   r.   Útest_simplifierz(LegacyCompatibilityTests.test_simplifierä  s  ø€ ô (9Ó':Ñ$ˆŒ	�4Ô$Ü+FÓ+HÑ(ˆŒ�dÔ(Ü(Ó*ˆŒÜ#Ø�L‰LÓ+¨T¯[©[×-DÑ-Dó
ˆŒô 3°4·=±=ÓAˆØ�‰×$Ñ$ ]Ð4IÔJØ ×.Ñ.¨}Ó=ˆØ ×.Ñ.Ð/?Ó@ˆØ×ÑÔØ×ÑÔØ×ÑÔØ×ÑÔØ×Ñ˜×-Ñ-¨gÓ6×;Ñ;¼^ÔLØ×Ñ˜×-Ñ-¨gÓ6¸ÕFr0   c                 óÖ  — t        «       }t        |«      }t        | «      }|j                  |dd«       | j	                  |j
                  d«       | j	                  |j                  d«       | j	                  |j                  g «       |j                  d   j                  d«       | j	                  |j                  t        ddd«      g«       | j	                  |j                  d«       y)	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Œ   rx   re   rn   rg   r·   rÀ   r   rÁ   s       r.   Útest_portNumberz(LegacyCompatibilityTests.test_portNumberû  sÂ   € ô
 %Ó&ˆÜ,¨VÓ4ˆÜ Ó%ˆØ×Ñ ¨-¸Ô>Ø×Ñ˜×*Ñ*¨DÔ1Ø×Ñ˜Ÿ™¨%Ô0Ø×Ñ˜×,Ñ,¨bÔ1Ø×Ñ˜Ñ×$Ñ$ ]Ô3Ø×Ñ˜×,Ñ,¬{¸5À-ÐQUÓ/VÐ.WÔXØ×Ñ˜Ÿ™¨$Õ/r0   N)	r1   r2   r3   r4   rÄ   rÈ   rË   rÕ   r×   r5   r0   r.   r½   r½   ¨  s!   „ ñò0ò"2ò"2ò&Gó.0r0   r½   c                   ó   — e Zd ZdZd„ Zy)ÚJustEnoughReactorzT
    Just enough subclass implementation to be a valid L{ReactorBase} subclass.
    c                  ó   — y)z
        Do nothing.
        Nr5   rR   s    r.   ÚinstallWakerzJustEnoughReactor.installWaker  r=   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y)Ú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                  «       y)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  s8   € ô
 )Ó*ˆÜÔ2°GÔ<Ü”_ g×&6Ñ&6Ô7ÜÔ&¨×(<Ñ(<Õ=r0   c                 óö   — t        «       }t        «       }t        t        |j	                  |«      «       | j                  |j                  t        «       | j                  |j                  j                  |«       y)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(  sZ   € ô
 )Ó*ˆÜ Ó"ˆÜ”_ g×&=Ñ&=¸bÓ&AÔBØ×Ñ˜g×2Ñ2Ô4NÔOØ�‰�g×*Ñ*×:Ñ:¸BÕ?r0   c                 ó˜  — t        «       }| j                  |j                  t        «       | j	                  |j                  j
                  t        «       | j                  |j                  t        «       | j	                  |j                  j                  |«       | j	                  |j                  j                  |j                  «       y)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×2Ñ2´KÔ@Ø�‰�g×*Ñ*×7Ñ7¼ÔEØ×Ñ˜g×.Ñ.Ô0IÔJØ�‰�g×*Ñ*×3Ñ3°WÔ=Ø�‰�g×&Ñ&×4Ñ4°g×6JÑ6JÕKr0   N)r1   r2   r3   r4   rá   rç   rì   r5   r0   r.   rÝ   rÝ     s   „ ñò>ò	@ó	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?   rK   rM   r`   rq   r~   rµ   r½   rÙ   rÝ   r5   r0   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r0   