§
    Ètºfš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:d$S )%zh
Tests for implementations of L{IHostnameResolver} and their interactions with
reactor implementations.
é    )Údefaultdict)	ÚAF_INETÚAF_INET6Ú	AF_UNSPECÚ
EAI_NONAMEÚIPPROTO_TCPÚ
SOCK_DGRAMÚSOCK_STREAMÚgaierrorÚgetaddrinfo)ÚLockÚlocal)Úimplementer)ÚverifyObject)Ú
LockWorkerÚTeamÚcreateMemoryWorker)ÚComplexResolverSimplifierÚGAIResolverÚSimpleResolverComplexifier)ÚIPv4AddressÚIPv6Address)ÚPluggableResolverMixinÚReactorBase)ÚDeferred)ÚDNSLookupError)ÚIHostnameResolverÚIReactorPluggableNameResolverÚIResolutionReceiverÚIResolverSimple)Ú
ThreadPool)ÚSynchronousTestCasec                   ó   — e Zd ZdZd„ ZdS )ÚDeterministicThreadPoolz6
    Create a deterministic L{ThreadPool} object.
    c                 óL   — d| _         d| _        d| _        g | _        || _        dS )zE
        Create a L{DeterministicThreadPool} from a L{Team}.
        é   N)ÚminÚmaxÚnameÚthreadsÚ_team)ÚselfÚteams     úb/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/internet/test/test_resolver.pyÚ__init__z DeterministicThreadPool.__init__4   s+   € ð ˆŒØˆŒØˆŒ	ØˆŒØˆŒ
ˆ
ˆ
ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   © r0   r.   r$   r$   /   s-   € € € € € ðð ðð ð ð ð r0   r$   c            	      óº   ‡— t          ¦   «         \  Š} t          t          t          t	          ¦   «         t          ¦   «         ¦  «        ˆfd„d„ ¦  «        ¦  «        | fS )zž
    Create a deterministic threadpool.

    @return: 2-tuple of L{ThreadPool}, 0-argument C{work} callable; when
        C{work} is called, do the work.
    c                  ó   •— ‰ S ©Nr5   ©Úworkers   €r.   ú<lambda>z#deterministicPool.<locals>.<lambda>I   s   ø€ °v€ r0   c                  ó   — d S r8   r5   r5   r0   r.   r;   z#deterministicPool.<locals>.<lambda>I   s   € È€ r0   )r   r$   r   r   r   r   )Údoerr:   s    @r.   ÚdeterministicPoolr>   ?   sY   ø€ õ &Ñ'Ô'�L€FˆDåÝ•�D™FœF¥E¡G¤GÑ,Ô,¨~¨~¨~¨~ÀÀÑMÔMñ	
ô 	
ð 	ð	ð r0   c                  ó\   ‡— t          ¦   «         \  Š}  G ˆfd„d¦  «        } |¦   «         | fS )zü
    Create a deterministic L{IReactorThreads}

    @return: a 2-tuple consisting of an L{IReactorThreads}-like object and a
        0-argument callable that will perform one unit of work invoked via that
        object's C{callFromThread} method.
    c                   ó   •— e Zd Zˆ fd„ZdS )ú(deterministicReactorThreads.<locals>.CFTc                 óB   •‡‡‡— ‰                      ˆˆˆfd„¦  «         d S )Nc                  ó   •—  ‰‰ i ‰¤ŽS r8   r5   )ÚaÚfÚks   €€€r.   r;   zIdeterministicReactorThreads.<locals>.CFT.callFromThread.<locals>.<lambda>[   s   ø€ ˜a˜a ˜j a˜j˜j€ r0   )Údo)r,   rE   rD   rF   r:   s    ```€r.   ÚcallFromThreadz7deterministicReactorThreads.<locals>.CFT.callFromThreadZ   s.   øøøø€ Ø�IŠIÐ(Ð(Ð(Ð(Ð(Ð(Ñ)Ô)Ð)Ð)Ð)r0   N)r1   r2   r3   rH   r9   s   €r.   ÚCFTrA   Y   s.   ø€ € € € € ð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*r0   rI   )r   )r=   rI   r:   s     @r.   ÚdeterministicReactorThreadsrJ   O   sX   ø€ õ &Ñ'Ô'�L€FˆDð*ð *ð *ð *ð *ð *ð *ñ *ô *ð *ð ˆ3‰5Œ5�$ˆ;Ðr0   c                   ó0   — e Zd ZdZd„ Zdd„Zeeedfd„Z	dS )	ÚFakeAddrInfoGetterz/
    Test object implementing getaddrinfo.
    c                 óF   — g | _         t          t          ¦  «        | _        dS )z1
        Create a L{FakeAddrInfoGetter}.
        N)Úcallsr   ÚlistÚresults©r,   s    r.   r/   zFakeAddrInfoGetter.__init__e   s   € ð ˆŒ
Ý"¥4Ñ(Ô(ˆŒˆˆr0   r   c                 óŽ   — | j                              ||||||f¦  «         | j        |         }|r|S t          t          d¦  «        ‚)a�  
        Mock for L{socket.getaddrinfo}.

        @param host: see L{socket.getaddrinfo}

        @param port: see L{socket.getaddrinfo}

        @param family: see L{socket.getaddrinfo}

        @param socktype: see L{socket.getaddrinfo}

        @param proto: see L{socket.getaddrinfo}

        @param flags: see L{socket.getaddrinfo}

        @return: L{socket.getaddrinfo}
        z,nodename nor servname provided, or not known)rN   ÚappendrP   r   r   )r,   ÚhostÚportÚfamilyÚsocktypeÚprotoÚflagsrP   s           r.   r   zFakeAddrInfoGetter.getaddrinfol   sR   € ð$ 	Œ
×Ò˜4  v¨x¸ÀÐFÑGÔGÐGØ”,˜tÔ$ˆØð 	WØˆNå�:Ð'UÑVÔVÐVr0   r0   c                 óP   — | j         |                              |||||f¦  «         dS )aà  
        Add a result for a given hostname.  When this hostname is resolved, the
        result will be a L{list} of all results C{addResultForHost} has been
        called with using that hostname so far.

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

        @type canonname: native L{str}

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

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

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

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

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

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

        @param address: see L{IResolutionReceiver}
        N)rf   rS   )r,   Úaddresss     r.   ÚaddressResolvedzResultHolder.addressResolvedÅ   s    € ð 	Œ×Ò˜wÑ'Ô'Ð'Ð'Ð'r0   c                 ó   — d| _         dS )z2
        Hostname resolution is complete.
        TN)Ú_endedrQ   s    r.   ÚresolutionCompletezResultHolder.resolutionCompleteÍ   s   € ð ˆŒˆˆr0   N)
r1   r2   r3   r4   rd   rm   r/   rh   rk   rn   r5   r0   r.   r_   r_   ¬   sf   € € € € € ðð ð €HØ€Fð"ð "ð "ðð ð ð(ð (ð (ðð ð ð ð r0   r_   c                   ó   — e Zd ZdZd„ ZdS )ÚHelperTestsz?
    Tests for error cases of helpers used in this module.
    c                 ó  — t          ¦   «         \  | _        | _        d„ }| j                             |¦  «         |                      ¦   «          |                      t          |                      t          ¦  «        ¦  «        d¦  «         dS )zq
        L{DeterministicThreadPool} will log any exceptions that its "thread"
        workers encounter.
        c                  ó   — ddz  S )Nr&   r   r5   r5   r0   r.   ÚdivideByZeroz9HelperTests.test_logErrorsInThreads.<locals>.divideByZeroà   s   € Ø�q‘5ˆLr0   r&   N)r>   ÚpoolÚdoThreadWorkÚcallInThreadÚassertEqualÚlenÚflushLoggedErrorsÚZeroDivisionError)r,   rs   s     r.   Útest_logErrorsInThreadsz#HelperTests.test_logErrorsInThreadsÙ   s…   € õ
 (9Ñ':Ô':Ñ$ˆŒ	�4Ô$ð	ð 	ð 	ð 	Œ	×Ò˜|Ñ,Ô,Ð,Ø×ÒÑÔÐØ×Ò�˜T×3Ò3Õ4EÑFÔFÑGÔGÈÑKÔKÐKÐKÐKr0   N)r1   r2   r3   r4   r{   r5   r0   r.   rp   rp   Ô   s2   € € € € € ðð ðLð Lð Lð Lð Lr0   rp   c                   óN   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ ZdS )ÚHostnameResolutionTestsz(
    Tests for hostname resolution.
    c                 óê   ‡ — t          ¦   «         \  ‰ _        ‰ _        t          ¦   «         \  ‰ _        ‰ _        t          ¦   «         ‰ _        t          ‰ j        ˆ fd„‰ j        j	        ¦  «        ‰ _
        dS )z*
        Set up a L{GAIResolver}.
        c                  ó   •— ‰ j         S r8   ©rt   rQ   s   €r.   r;   z/HostnameResolutionTests.setUp.<locals>.<lambda>õ   ó	   ø€  $¤)€ r0   N)r>   rt   ru   rJ   ÚreactorÚdoReactorWorkrL   Úgetterr   r   ÚresolverrQ   s   `r.   ÚsetUpzHostnameResolutionTests.setUpí   si   ø€ õ (9Ñ':Ô':Ñ$ˆŒ	�4Ô$Ý+FÑ+HÔ+HÑ(ˆŒ�dÔ(Ý(Ñ*Ô*ˆŒÝ#ØŒLÐ+Ð+Ð+Ð+¨T¬[Ô-Dñ
ô 
ˆŒˆˆr0   c                 ó  — t          | ¦  «        }| j                             dd¦  «         | j                             |d¦  «        }|                      |j        |¦  «         |                      |j        d¦  «         |                      |j	        d¦  «         |  
                    ¦   «          |                      ¦   «          |                      |j	        d¦  «         |                      |j        t          ddd¦  «        g¦  «         dS )	zÓ
        Resolving an individual hostname that results in one address from
        getaddrinfo results in a single call each to C{resolutionBegan},
        C{addressResolved}, and C{resolutionComplete}.
        úsample.example.com)ú4.3.2.1r   TFÚTCPr‰   r   N)r_   r„   r]   r…   ÚresolveHostNameÚassertIsre   rw   rd   rm   ru   rƒ   rf   r   ©r,   ÚreceiverÚ
resolutions      r.   Útest_resolveOneHostz+HostnameResolutionTests.test_resolveOneHostø   sô   € õ   Ñ%Ô%ˆØŒ×$Ò$Ð%9¸>ÑJÔJÐJØ”]×2Ò2°8Ð=QÑRÔRˆ
Ø�Š�hÔ*¨JÑ7Ô7Ð7Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨%Ñ0Ô0Ð0Ø×ÒÑÔÐØ×ÒÑÔÐØ×Ò˜œ¨$Ñ/Ô/Ð/Ø×Ò˜Ô,­{¸5À)ÈQÑ/OÔ/OÐ.PÑQÔQÐQÐQÐQr0   c           
      ó0  — t          | ¦  «        }d}d}| j                             ddd||ft          ¬¦  «         | j                             |d¦  «        }|                      |j        |¦  «         |                      |j	        d¦  «         |                      |j
        d¦  «         |                      ¦   «          |                      ¦   «          |                      |j
        d¦  «         |                      |j        t          d	dd||¦  «        g¦  «         d
S )a  
        Resolving an individual hostname that results in one address from
        getaddrinfo results in a single call each to C{resolutionBegan},
        C{addressResolved}, and C{resolutionComplete}; C{addressResolved} will
        receive an L{IPv6Address}.
        r&   é   rˆ   ú::1r   )rV   TFrŠ   N)r_   r„   r]   r   r…   r‹   rŒ   re   rw   rd   rm   ru   rƒ   rf   r   )r,   rŽ   ÚflowInfoÚscopeIDr�   s        r.   Útest_resolveOneIPv6Hostz/HostnameResolutionTests.test_resolveOneIPv6Host	  s%  € õ   Ñ%Ô%ˆØˆØˆØŒ×$Ò$Ø  5¨!¨X°wÐ"?Íð 	%ñ 	
ô 	
ð 	
ð ”]×2Ò2°8Ð=QÑRÔRˆ
Ø�Š�hÔ*¨JÑ7Ô7Ð7Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨%Ñ0Ô0Ð0Ø×ÒÑÔÐØ×ÒÑÔÐØ×Ò˜œ¨$Ñ/Ô/Ð/Ø×ÒØÔ¥+¨e°U¸A¸xÈÑ"QÔ"QÐ!Rñ	
ô 	
ð 	
ð 	
ð 	
r0   c                 ó‚  — t          | ¦  «        }| j                             |d¦  «        }|                      |j        |¦  «         |                      ¦   «          |                      ¦   «          |                      |j        d¦  «         |                      |j	        d¦  «         |                      |j
        g ¦  «         dS )a
  
        Resolving a hostname that results in C{getaddrinfo} raising a
        L{gaierror} will result in the L{IResolutionReceiver} receiving a call
        to C{resolutionComplete} with no C{addressResolved} calls in between;
        no failure is logged.
        rˆ   TN)r_   r…   r‹   rŒ   re   ru   rƒ   rw   rd   rm   rf   r�   s      r.   Útest_gaierrorz%HostnameResolutionTests.test_gaierror!  s´   € õ   Ñ%Ô%ˆØ”]×2Ò2°8Ð=QÑRÔRˆ
Ø�Š�hÔ*¨JÑ7Ô7Ð7Ø×ÒÑÔÐØ×ÒÑÔÐØ×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨$Ñ/Ô/Ð/Ø×Ò˜Ô,¨bÑ1Ô1Ð1Ð1Ð1r0   c                 óB  — t          | ¦  «        }| j                             |d|¬¦  «        }|                      |j        |¦  «         |                      ¦   «          |                      ¦   «          | j        j        d         \  }}}}}	}
|  	                    ||¦  «         dS )zù
        Verify that the given set of address types results in the given C{AF_}
        constant being passed to C{getaddrinfo}.

        @param addrTypes: iterable of L{IAddress} implementers

        @param expectedAF: an C{AF_*} constant
        rˆ   )ÚaddressTypesr   N)
r_   r…   r‹   rŒ   re   ru   rƒ   r„   rN   rw   )r,   Ú	addrTypesÚ
expectedAFrŽ   r�   rT   rU   rV   rW   rX   rY   s              r.   Ú_resolveOnlyTestz(HostnameResolutionTests._resolveOnlyTest1  sª   € õ   Ñ%Ô%ˆØ”]×2Ò2ØÐ*¸ð 3ñ 
ô 
ˆ
ð 	�Š�hÔ*¨JÑ7Ô7Ð7Ø×ÒÑÔÐØ×ÒÑÔÐØ59´[Ô5FÀqÔ5IÑ2ˆˆd�F˜H e¨UØ×Ò˜ Ñ,Ô,Ð,Ð,Ð,r0   c                 óH   — |                       t          gt          ¦  «         dS )z™
        When passed an C{addressTypes} parameter containing only
        L{IPv4Address}, L{GAIResolver} will pass C{AF_INET} to C{getaddrinfo}.
        N)r�   r   r   rQ   s    r.   Útest_resolveOnlyIPv4z,HostnameResolutionTests.test_resolveOnlyIPv4D  s"   € ð
 	×Ò�{˜m­WÑ5Ô5Ð5Ð5Ð5r0   c                 óH   — |                       t          gt          ¦  «         dS )zš
        When passed an C{addressTypes} parameter containing only
        L{IPv6Address}, L{GAIResolver} will pass C{AF_INET6} to C{getaddrinfo}.
        N)r�   r   r   rQ   s    r.   Útest_resolveOnlyIPv6z,HostnameResolutionTests.test_resolveOnlyIPv6K  s"   € ð
 	×Ò�{˜m­XÑ6Ô6Ð6Ð6Ð6r0   c                 óŠ   — |                       t          t          gt          ¦  «         |                       dt          ¦  «         dS )zò
        When passed an C{addressTypes} parameter containing both L{IPv4Address}
        and L{IPv6Address} (or the default of C{None}, which carries the same
        meaning), L{GAIResolver} will pass C{AF_UNSPEC} to C{getaddrinfo}.
        N)r�   r   r   r   rQ   s    r.   Útest_resolveBothz(HostnameResolutionTests.test_resolveBothR  s;   € ð 	×Ò�{­KÐ8½)ÑDÔDÐDØ×Ò˜d¥IÑ.Ô.Ð.Ð.Ð.r0   c                 ó&  — t          | ¦  «        }| j                             |dd¬¦  «         t          | ¦  «        }| j                             |dd¬¦  «         |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          | j        j        d         \  }}}}}}| j        j        d         \  }}}}	}}|                      |t          ¦  «         |                      |	t          ¦  «         dS )zÝ
        When passed a C{transportSemantics} paramter, C{'TCP'} (the value
        present in L{IPv4Address.type} to indicate a stream transport) maps to
        C{SOCK_STREAM} and C{'UDP'} maps to C{SOCK_DGRAM}.
        úexample.comrŠ   )ÚtransportSemanticsÚUDPr   r&   N)
r_   r…   r‹   ru   rƒ   r„   rN   rw   r
   r	   )
r,   rŽ   Ú	receiver2rT   rU   rV   Ú	socktypeTrX   rY   Ú	socktypeUs
             r.   Ú#test_transportSemanticsToSocketTypez;HostnameResolutionTests.test_transportSemanticsToSocketType[  s  € õ   Ñ%Ô%ˆØŒ×%Ò% h°ÐRWÐ%ÑXÔXÐXÝ  Ñ&Ô&ˆ	ØŒ×%Ò%Ø�}¸ð 	&ñ 	
ô 	
ð 	
ð 	×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ6:´kÔ6GÈÔ6JÑ3ˆˆd�F˜I u¨eØ6:´kÔ6GÈÔ6JÑ3ˆˆd�F˜I u¨eØ×Ò˜¥KÑ0Ô0Ð0Ø×Ò˜¥JÑ/Ô/Ð/Ð/Ð/r0   c                 óX  — t          | ¦  «        }d}d}t          t          fD ]L}| j                             ddd||ft
          |¬¦  «         | j                             ddt          |¬¦  «         ŒM| j                             |d¦  «         |  	                    ¦   «          |  
                    ¦   «          |j        \  }}}}|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d	¦  «         |                      |j        d	¦  «         d
S )zé
        When L{GAIResolver} receives a C{SOCK_DGRAM} result from
        C{getaddrinfo}, it returns a C{'TCP'} L{IPv4Address} or L{IPv6Address};
        if it receives C{SOCK_STREAM} then it returns a C{'UDP'} type of same.
        r&   r’   r¥   r“   r   )rV   rW   )z	127.0.0.3r   rŠ   r§   N)r_   r
   r	   r„   r]   r   r   r…   r‹   ru   rƒ   rf   rw   Útype)	r,   rŽ   r”   r•   rW   Ústream4Ústream6Údgram4Údgram6s	            r.   Útest_socketTypeToAddressTypez4HostnameResolutionTests.test_socketTypeToAddressTypep  sH  € õ   Ñ%Ô%ˆØˆØˆÝ#¥ZÐ/ð 		ð 		ˆHØŒK×(Ò(ØØ˜˜8 WÐ-ÝØ!ð	 )ñ ô ð ð ŒK×(Ò(ØÐ/½È(ð )ñ ô ð ð ð 	Œ×%Ò% h°Ñ>Ô>Ð>Ø×ÒÑÔÐØ×ÒÑÔÐØ+3Ô+>Ñ(ˆ�˜& &Ø×Ò˜œ uÑ-Ô-Ð-Ø×Ò˜œ uÑ-Ô-Ð-Ø×Ò˜œ eÑ,Ô,Ð,Ø×Ò˜œ eÑ,Ô,Ð,Ð,Ð,r0   N)r1   r2   r3   r4   r†   r�   r–   r˜   r�   rŸ   r¡   r£   r«   r²   r5   r0   r.   r}   r}   è   s·   € € € € € ðð ð	
ð 	
ð 	
ðRð Rð Rð"
ð 
ð 
ð02ð 2ð 2ð -ð -ð -ð&6ð 6ð 6ð7ð 7ð 7ð/ð /ð /ð0ð 0ð 0ð*-ð -ð -ð -ð -r0   r}   c                   ó    — e Zd ZdZd„ Zdd„ZdS )ÚSillyResolverSimplez6
    Trivial implementation of L{IResolverSimple}
    c                 ó   — g | _         dS )zd
        Create a L{SillyResolverSimple} with a queue of requests it is working
        on.
        N)Ú	_requestsrQ   s    r.   r/   zSillyResolverSimple.__init__“  s   € ð
 ˆŒˆˆr0   r5   c                 óh   — | j                              t          ¦   «         ¦  «         | j         d         S )zð
        Implement L{IResolverSimple.getHostByName}.

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

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

        @return: see L{IResolverSimple.getHostByName}.
        éÿÿÿÿ)r¶   rS   r   )r,   r)   Útimeouts      r.   ÚgetHostByNamez!SillyResolverSimple.getHostByNameš  s+   € ð 	Œ×Ò�h™jœjÑ)Ô)Ð)ØŒ~˜bÔ!Ð!r0   N)r5   )r1   r2   r3   r4   r/   rº   r5   r0   r.   r´   r´   �  sA   € € € € € ðð ðð ð ð"ð "ð "ð "ð "ð "r0   r´   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚLegacyCompatibilityTestszÌ
    Older applications may supply an object to the reactor via
    C{installResolver} that only provides L{IResolverSimple}.
    L{SimpleResolverComplexifier} is a wrapper for an L{IResolverSimple}.
    c                 ó.  — t          ¦   «         }t          |¦  «        }t          | ¦  «        }|                      |j        d¦  «         |                     |d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        g ¦  «         |j        d          	                    d¦  «         |                      |j        t          ddd¦  «        g¦  «         |                      |j        d¦  «         dS )z‚
        L{SimpleResolverComplexifier} translates C{resolveHostName} into
        L{IResolutionReceiver.addressResolved}.
        Fr¥   Tr   ú192.168.1.1rŠ   N)r´   r   r_   rw   rd   r‹   rm   rf   r¶   Úcallbackr   ©r,   ÚsimpleÚcomplexrŽ   s       r.   Útest_successz%LegacyCompatibilityTests.test_success¯  s  € õ
 %Ñ&Ô&ˆÝ,¨VÑ4Ô4ˆÝ Ñ%Ô%ˆØ×Ò˜Ô*¨EÑ2Ô2Ð2Ø×Ò ¨-Ñ8Ô8Ð8Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨%Ñ0Ô0Ð0Ø×Ò˜Ô,¨bÑ1Ô1Ð1ØÔ˜Ô×$Ò$ ]Ñ3Ô3Ð3Ø×Ò˜Ô,­{¸5À-ÐQRÑ/SÔ/SÐ.TÑUÔUÐUØ×Ò˜œ¨$Ñ/Ô/Ð/Ð/Ð/r0   c                 ó(  — t          ¦   «         }t          |¦  «        }t          | ¦  «        }|                      |j        d¦  «         |                     |d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        g ¦  «         |j        d          	                    t          d¦  «        ¦  «         |                      |j        d¦  «         |                      |j        g ¦  «         dS )z•
        L{SimpleResolverComplexifier} translates a known error result from
        L{IResolverSimple.resolveHostName} into an empty result.
        Fr¥   Tr   ÚnopeN)r´   r   r_   rw   rd   r‹   rm   rf   r¶   Úerrbackr   rÀ   s       r.   Útest_failurez%LegacyCompatibilityTests.test_failureÀ  sý   € õ
 %Ñ&Ô&ˆÝ,¨VÑ4Ô4ˆÝ Ñ%Ô%ˆØ×Ò˜Ô*¨EÑ2Ô2Ð2Ø×Ò ¨-Ñ8Ô8Ð8Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨%Ñ0Ô0Ð0Ø×Ò˜Ô,¨bÑ1Ô1Ð1ØÔ˜Ô×#Ò#¥N°6Ñ$:Ô$:Ñ;Ô;Ð;Ø×Ò˜œ¨$Ñ/Ô/Ð/Ø×Ò˜Ô,¨bÑ1Ô1Ð1Ð1Ð1r0   c                 óž  — t          ¦   «         }t          |¦  «        }t          | ¦  «        }|                      |j        d¦  «         |                     |d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        g ¦  «         |j        d          	                    t          d¦  «        ¦  «         |                      t          |                      t          ¦  «        ¦  «        d¦  «         |                      |j        d¦  «         |                      |j        g ¦  «         dS )z³
        L{SimpleResolverComplexifier} translates an unknown error result from
        L{IResolverSimple.resolveHostName} into an empty result and a logged
        error.
        Fr¥   Tr   Úzowr&   N)r´   r   r_   rw   rd   r‹   rm   rf   r¶   rÆ   rz   rx   ry   rÀ   s       r.   Ú
test_errorz#LegacyCompatibilityTests.test_errorÑ  s+  € õ %Ñ&Ô&ˆÝ,¨VÑ4Ô4ˆÝ Ñ%Ô%ˆØ×Ò˜Ô*¨EÑ2Ô2Ð2Ø×Ò ¨-Ñ8Ô8Ð8Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨%Ñ0Ô0Ð0Ø×Ò˜Ô,¨bÑ1Ô1Ð1ØÔ˜Ô×#Ò#Õ$5°eÑ$<Ô$<Ñ=Ô=Ð=Ø×Ò�˜T×3Ò3Õ4EÑFÔFÑGÔGÈÑKÔKÐKØ×Ò˜œ¨$Ñ/Ô/Ð/Ø×Ò˜Ô,¨bÑ1Ô1Ð1Ð1Ð1r0   c                 óô  ‡ — t          ¦   «         \  ‰ _        ‰ _        t          ¦   «         \  ‰ _        ‰ _        t          ¦   «         ‰ _        t          ‰ j        ˆ fd„‰ j        j	        ¦  «        ‰ _
        t          ‰ j
        ¦  «        }‰ j                             dd¦  «         |                     d¦  «        }|                     d¦  «        }‰                      ¦   «          ‰                      ¦   «          ‰                      ¦   «          ‰                      ¦   «          ‰                      ‰                      |¦  «        j        t"          ¦  «         ‰                      ‰                      |¦  «        d¦  «         dS )zÂ
        L{ComplexResolverSimplifier} translates an L{IHostnameResolver} into an
        L{IResolverSimple} for applications that still expect the old
        interfaces to be in place.
        c                  ó   •— ‰ j         S r8   r€   rQ   s   €r.   r;   z:LegacyCompatibilityTests.test_simplifier.<locals>.<lambda>î  r�   r0   r¥   )ú192.168.3.4éá  znx.example.comrÍ   N)r>   rt   ru   rJ   r‚   rƒ   rL   r„   r   r   r…   r   r]   rº   rw   ÚfailureResultOfr­   r   ÚsuccessResultOf)r,   ÚsimpleResolverÚsuccessÚfailures   `   r.   Útest_simplifierz(LegacyCompatibilityTests.test_simplifierä  sO  ø€ õ (9Ñ':Ô':Ñ$ˆŒ	�4Ô$Ý+FÑ+HÔ+HÑ(ˆŒ�dÔ(Ý(Ñ*Ô*ˆŒÝ#ØŒLÐ+Ð+Ð+Ð+¨T¬[Ô-Dñ
ô 
ˆŒõ 3°4´=ÑAÔAˆØŒ×$Ò$ ]Ð4IÑJÔJÐJØ ×.Ò.¨}Ñ=Ô=ˆØ ×.Ò.Ð/?Ñ@Ô@ˆØ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ×Ò˜×-Ò-¨gÑ6Ô6Ô;½^ÑLÔLÐLØ×Ò˜×-Ò-¨gÑ6Ô6¸ÑFÔFÐFÐFÐFr0   c                 óú  — t          ¦   «         }t          |¦  «        }t          | ¦  «        }|                     |dd¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        g ¦  «         |j        d          	                    d¦  «         |                      |j        t          ddd¦  «        g¦  «         |                      |j        d¦  «         dS )	zŽ
        L{SimpleResolverComplexifier} preserves the C{port} argument passed to
        C{resolveHostName} in its returned addresses.
        r¥   rÎ   TFr   r¾   rŠ   N)r´   r   r_   r‹   rw   rd   rm   rf   r¶   r¿   r   rÀ   s       r.   Útest_portNumberz(LegacyCompatibilityTests.test_portNumberû  sî   € õ
 %Ñ&Ô&ˆÝ,¨VÑ4Ô4ˆÝ Ñ%Ô%ˆØ×Ò ¨-¸Ñ>Ô>Ð>Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ¨%Ñ0Ô0Ð0Ø×Ò˜Ô,¨bÑ1Ô1Ð1ØÔ˜Ô×$Ò$ ]Ñ3Ô3Ð3Ø×Ò˜Ô,­{¸5À-ÐQUÑ/VÔ/VÐ.WÑXÔXÐXØ×Ò˜œ¨$Ñ/Ô/Ð/Ð/Ð/r0   N)	r1   r2   r3   r4   rÃ   rÇ   rÊ   rÔ   rÖ   r5   r0   r.   r¼   r¼   ¨  sl   € € € € € ðð ð0ð 0ð 0ð"2ð 2ð 2ð"2ð 2ð 2ð&Gð Gð Gð.0ð 0ð 0ð 0ð 0r0   r¼   c                   ó   — e Zd ZdZd„ ZdS )ÚJustEnoughReactorzT
    Just enough subclass implementation to be a valid L{ReactorBase} subclass.
    c                 ó   — dS )z
        Do nothing.
        Nr5   rQ   s    r.   ÚinstallWakerzJustEnoughReactor.installWaker  s   € € € r0   N)r1   r2   r3   r4   rÚ   r5   r0   r.   rØ   rØ     s-   € € € € € ðð ðð ð ð ð r0   rØ   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚReactorInstallationTestsz®
    Tests for installing old and new resolvers onto a
    L{PluggableResolverMixin} and L{ReactorBase} (from which all of Twisted's
    reactor implementations derive).
    c                 ó´   — t          ¦   «         }t          t          |¦  «         t          t          |j        ¦  «         t          t
          |j        ¦  «         dS )zš
        L{PluggableResolverMixin} (and its subclasses) implement both
        L{IReactorPluggableNameResolver} and L{IReactorPluggableResolver}.
        N)r   r   r   r    r…   r   ÚnameResolver©r,   r‚   s     r.   Útest_interfaceCompliancez1ReactorInstallationTests.test_interfaceCompliance  sM   € õ
 )Ñ*Ô*ˆÝÕ2°GÑ<Ô<Ð<Ý•_ gÔ&6Ñ7Ô7Ð7ÝÕ&¨Ô(<Ñ=Ô=Ð=Ð=Ð=r0   c                 ó  — t          ¦   «         }t          ¦   «         }t          t          |                     |¦  «        ¦  «         |                      |j        t          ¦  «         |                      |j        j	        |¦  «         dS )zf
        L{PluggableResolverMixin} will wrap an L{IResolverSimple} in a
        complexifier.
        N)
r   r´   r   r    ÚinstallResolverÚassertIsInstancerÞ   r   rŒ   Ú_simpleResolver)r,   r‚   Úits      r.   Útest_installingOldStyleResolverz8ReactorInstallationTests.test_installingOldStyleResolver(  sr   € õ
 )Ñ*Ô*ˆÝ Ñ"Ô"ˆÝ•_ g×&=Ò&=¸bÑ&AÔ&AÑBÔBÐBØ×Ò˜gÔ2Õ4NÑOÔOÐOØ�Š�gÔ*Ô:¸BÑ?Ô?Ð?Ð?Ð?r0   c                 óv  — t          ¦   «         }|                      |j        t          ¦  «         |                      |j        j        t          ¦  «         |                      |j        t          ¦  «         |                      |j        j	        |¦  «         |                      |j        j
        |j        ¦  «         dS )zD
        L{ReactorBase} defaults to using a L{GAIResolver}.
        N)rØ   rã   rÞ   r   rŒ   Ú_getaddrinfor   r…   r   Ú_reactorÚ_nameResolverrß   s     r.   Útest_defaultToGAIResolverz2ReactorInstallationTests.test_defaultToGAIResolver3  s™   € õ $Ñ%Ô%ˆØ×Ò˜gÔ2µKÑ@Ô@Ð@Ø�Š�gÔ*Ô7½ÑEÔEÐEØ×Ò˜gÔ.Õ0IÑJÔJÐJØ�Š�gÔ*Ô3°WÑ=Ô=Ð=Ø�Š�gÔ&Ô4°gÔ6JÑKÔKÐKÐKÐKr0   N)r1   r2   r3   r4   rà   ræ   rë   r5   r0   r.   rÜ   rÜ     sS   € € € € € ðð ð>ð >ð >ð	@ð 	@ð 	@ð	Lð 	Lð 	Lð 	Lð 	Lr0   rÜ   N);r4   Úcollectionsr   Úsocketr   r   r   r   r   r	   r
   r   r   Ú	threadingr   r   Úzope.interfacer   Úzope.interface.verifyr   Útwisted._threadsr   r   r   Útwisted.internet._resolverr   r   r   Útwisted.internet.addressr   r   Útwisted.internet.baser   r   Útwisted.internet.deferr   Útwisted.internet.errorr   Útwisted.internet.interfacesr   r   r   r    Útwisted.python.threadpoolr!   Útwisted.trial.unittestr"   ÚUnitTestr$   r>   rJ   rL   r_   rp   r}   r´   r¼   rØ   rÜ   r5   r0   r.   ú<module>rû      sØ  ððð ð $Ð #Ð #Ð #Ð #Ð #ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð "Ð !Ð !Ð !Ð !Ð !Ð !Ð !à &Ð &Ð &Ð &Ð &Ð &Ø .Ð .Ð .Ð .Ð .Ð .à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aðð ð ð ð ð ð ð ð ð ð
 >Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ +Ð +Ð +Ð +Ð +Ð +Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð ð ð ð ð ð ð 1Ð 0Ð 0Ð 0Ð 0Ð 0Ø BÐ BÐ BÐ BÐ BÐ Bðð ð ð ð ˜jñ ô ð ð ð ð ð ð ð ð"IRð IRð IRð IRð IRñ IRô IRð IRðX €Ð Ñ!Ô!ð$ð $ð $ð $ð $ñ $ô $ñ "Ô!ð$ðNLð Lð Lð Lð L�(ñ Lô Lð Lð(b-ð b-ð b-ð b-ð b-˜hñ b-ô b-ð b-ðJ €ˆ_ÑÔð"ð "ð "ð "ð "ñ "ô "ñ Ôð"ð4a0ð a0ð a0ð a0ð a0˜xñ a0ô a0ð a0ðHð ð ð ð ˜ñ ô ð ð%Lð %Lð %Lð %Lð %L˜xñ %Lô %Lð %Lð %Lð %Lr0   