Ë
    ojÆ$  ã                   óö   — d Z ddlZddl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 dd	lmZ dd
lmZ ddlmZ  G d„ de«      Z G d„ dej2                  «      Z G d„ dej6                  «      Zy)z-
Test cases for L{twisted.names.srvconnect}.
é    N)ÚverifyObject)ÚdeferÚprotocol)ÚDNSLookupErrorÚServiceNameUnknownError)Ú
IConnector)ÚMemoryReactor)ÚclientÚdnsÚ
srvconnect)ÚResolverBase)ÚDNSNameError)Úunittestc                   ó   — e Zd ZdZdd„Zd„ Zy)ÚFakeResolveraˆ  
    Resolver that only gives out one given result.

    Either L{results} or L{failure} must be set and will be used for
    the return value of L{_lookup}

    @ivar results: List of L{dns.RRHeader} for the desired result.
    @type results: C{list}
    @ivar failure: Failure with an exception from L{twisted.names.error}.
    @type failure: L{Failure<twisted.python.failure.Failure>}
    Nc                 ó.   — || _         || _        g | _        y ©N)ÚresultsÚfailureÚlookups)Úselfr   r   s      úD/usr/lib/python3/dist-packages/twisted/names/test/test_srvconnect.pyÚ__init__zFakeResolver.__init__$   s   € ØˆŒØˆŒØˆ�ó    c                 óÚ   — | j                   j                  ||||f«       | j                  �"t        j                  | j                  g g f«      S t        j
                  | j                  «      S )z9
        Return the result or failure on lookup.
        )r   Úappendr   r   ÚsucceedÚfailr   )r   ÚnameÚclsÚqtypeÚtimeouts        r   Ú_lookupzFakeResolver._lookup)   sV   € ð 	�‰×Ñ˜T 3¨¨wÐ7Ô8Ø�<‰<Ð#Ü—=‘= $§,¡,°°BÐ!7Ó8Ð8ä—:‘:˜dŸl™lÓ+Ð+r   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   © r   r   r   r      s   „ ñ
óó
,r   r   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚDummyFactoryzL
    Dummy client factory that stores the reason of connection failure.
    c                 ó   — d | _         y r   ©Úreason©r   s    r   r   zDummyFactory.__init__9   s	   € Øˆ�r   c                 ó   — || _         y r   r,   )r   Ú	connectorr-   s      r   ÚclientConnectionFailedz#DummyFactory.clientConnectionFailed<   s	   € Øˆ�r   N)r$   r%   r&   r'   r   r1   r(   r   r   r*   r*   4   s   „ ñòór   r*   c                   ój   — 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„ Zd„ Zd„ Zd„ Zd„ Zy)ÚSRVConnectorTestsz/
    Tests for L{srvconnect.SRVConnector}.
    c                 óü   — | j                  t        dt        «       «       t        «       | _        t        «       | _        t        j                  | j                  dd| j                  «      | _	        g | _
        g | _        y )NÚtheResolverúxmpp-serverúexample.org)Úpatchr
   r   r	   Úreactorr*   Úfactoryr   ÚSRVConnectorr0   ÚrandIntArgsÚrandIntResultsr.   s    r   ÚsetUpzSRVConnectorTests.setUpE   s[   € Ø�
‰
”6˜=¬,«.Ô9Ü$“ˆŒÜ#“~ˆŒÜ#×0Ñ0Ø�L‰L˜-¨¸¿¹ó
ˆŒð ˆÔØ ˆÕr   c                 ór   — | j                   j                  ||f«       | j                  j                  d«      S )a�  
        Fake randint.

        Returns the first element of L{randIntResults} and records the
        arguments passed to it in L{randIntArgs}.

        @param min: Lower bound of the random number.
        @type min: L{int}

        @param max: Higher bound of the random number.
        @type max: L{int}

        @return: Fake random number from L{randIntResults}.
        @rtype: L{int}
        r   )r<   r   r=   Úpop)r   ÚminÚmaxs      r   Ú_randintzSRVConnectorTests._randintO   s3   € ð  	×Ñ×Ñ  c 
Ô+Ø×"Ñ"×&Ñ& qÓ)Ð)r   c                 ó8   — t        t        | j                  «       y)zF
        L{srvconnect.SRVConnector} implements L{IConnector}.
        N)r   r   r0   r.   s    r   Útest_interfacez SRVConnectorTests.test_interfaceb   s   € ô 	”Z §¡Õ0r   c                 ó´  — t        j                  ddd¬«      }t        j                  dt         j                  t         j                  d|¬«      gt
        j                  _        | j                  j                  «        | j                  | j                  j                  «       | j                  | j                  j                  j!                  «       dd d	«       y)
zS
        Test connectTCP gets called with the address from the SRV record.
        é}  úhost.example.orgé<   ©ÚportÚtargetÚttlr7   ©r   Útyper    rM   ÚpayloadNé   )rH   rG   )r   Ú
Record_SRVÚRRHeaderÚSRVÚINr
   r5   r   r0   ÚconnectÚassertIsNoner:   r-   ÚassertEqualr9   Ú
tcpClientsr@   ©r   rP   s     r   Útest_SRVPresentz!SRVConnectorTests.test_SRVPresenth   s›   € ô —.‘. dÐ3EÈ2ÔNˆä�L‰LØ"¬¯©´c·f±fÀ"Ègôð&
Œ×ÑÔ"ð
 	�‰×ÑÔ à×Ñ˜$Ÿ,™,×-Ñ-Ô.Ø×Ñ˜Ÿ™×0Ñ0×4Ñ4Ó6°r¸Ð:Ð<VÕWr   c                 ó,  — t        d«      t        j                  _        | j                  j                  «        | j                  | j                  j                  «       | j                  | j                  j                  j                  «       dd d«       y)zS
        Test connectTCP gets called with fallback parameters on NXDOMAIN.
        s   example.orgNrQ   ©r7   r6   )r   r
   r5   r   r0   rV   rW   r:   r-   rX   r9   rY   r@   r.   s    r   Útest_SRVNotPresentz$SRVConnectorTests.test_SRVNotPresentw   sm   € ô &2°.Ó%AŒ×ÑÔ"Ø�‰×ÑÔ à×Ñ˜$Ÿ,™,×-Ñ-Ô.Ø×ÑØ�L‰L×#Ñ#×'Ñ'Ó)¨"¨1Ð-Ð/Mõ	
r   c                 ó  — g t         j                  _        | j                  j	                  «        | j                  | j                  j                  «       | j                  | j                  j                  j                  «       dd d«       y)zW
        Test connectTCP gets called with fallback parameters on empty result.
        NrQ   r]   )r
   r5   r   r0   rV   rW   r:   r-   rX   r9   rY   r@   r.   s    r   Útest_SRVNoResultz"SRVConnectorTests.test_SRVNoResultƒ   sh   € ð &(Œ×ÑÔ"Ø�‰×ÑÔ à×Ñ˜$Ÿ,™,×-Ñ-Ô.Ø×ÑØ�L‰L×#Ñ#×'Ñ'Ó)¨"¨1Ð-Ð/Mõ	
r   c                 ó�  — t        j                  | j                  dd| j                  d¬«      | _        t        «       t        j                  _        | j                  j                  «        | j                  | j                  j                  «       | j                  | j                  j                  j                  «       dd d«       y)zY
        connectTCP gets called with default port if the service is not defined.
        Úthisbetternotexistr7   éf  )ÚdefaultPortNrQ   )r7   rc   )r   r;   r9   r:   r0   r   r
   r5   r   rV   rW   r-   rX   rY   r@   r.   s    r   Ú)test_SRVNoResultUnknownServiceDefaultPortz;SRVConnectorTests.test_SRVNoResultUnknownServiceDefaultPort�   s“   € ô $×0Ñ0Ø�L‰LØ ØØ�L‰LØô
ˆŒô &=Ó%>Œ×ÑÔ"Ø�‰×ÑÔ à×Ñ˜$Ÿ,™,×-Ñ-Ô.Ø×Ñ˜Ÿ™×0Ñ0×4Ñ4Ó6°r¸Ð:Ð<QÕRr   c                 óD  — t        j                  | j                  dd| j                  «      | _        t        «       t        j                  _        | j                  j                  «        | j                  | j                  j                  j                  t
        «      «       y)zR
        Connect fails on no result, unknown service and no default port.
        rb   r7   N)r   r;   r9   r:   r0   r   r
   r5   r   rV   Ú
assertTruer-   Úcheckr.   s    r   Ú+test_SRVNoResultUnknownServiceNoDefaultPortz=SRVConnectorTests.test_SRVNoResultUnknownServiceNoDefaultPort¡   sm   € ô $×0Ñ0Ø�L‰LÐ.°¸t¿|¹|ó
ˆŒô &=Ó%>Œ×ÑÔ"Ø�‰×ÑÔ à�‰˜Ÿ™×+Ñ+×1Ñ1Ô2IÓJÕKr   c                 ó„  — t        j                  dt         j                  t         j                  dd¬«      gt        j
                  _        | j                  j                  «        | j                  | j                  j                  «       | j                  | j                  j                  j                  «       dd d«       y)zU
        Test connectTCP gets called with fallback parameters on bad result.
        r7   rI   NrN   rQ   r]   )r   rS   ÚCNAMErU   r
   r5   r   r0   rV   rW   r:   r-   rX   r9   rY   r@   r.   s    r   Útest_SRVBadResultz#SRVConnectorTests.test_SRVBadResult®   sŒ   € ô
 �L‰LØ"¬¯©¼¿¹ÀBÐPTôð&
Œ×ÑÔ"ð
 	�‰×ÑÔ à×Ñ˜$Ÿ,™,×-Ñ-Ô.Ø×ÑØ�L‰L×#Ñ#×'Ñ'Ó)¨"¨1Ð-Ð/Mõ	
r   c                 óä  — t        j                  ddd¬«      }t        j                  dt         j                  t         j                  d|¬«      gt
        j                  _        | j                  j                  «        | j                  | j                  j                  «       | j                  j                  j                  t        «       | j                  | j                   j"                  g «       y)zH
        Test that connecting fails when no service is present.
        i•  ó   .rI   rJ   r7   rN   N)r   rR   rS   rT   rU   r
   r5   r   r0   rV   ÚassertIsNotNoner:   r-   Útrapr   rX   r9   rY   rZ   s     r   Útest_SRVNoServicez#SRVConnectorTests.test_SRVNoService¾   s¡   € ô —.‘. d°4¸RÔ@ˆä�L‰LØ"¬¯©´c·f±fÀ"Ègôð&
Œ×ÑÔ"ð
 	�‰×ÑÔ à×Ñ˜TŸ\™\×0Ñ0Ô1Ø�‰×Ñ× Ñ ¤Ô0Ø×Ñ˜Ÿ™×0Ñ0°"Õ5r   c                 óÆ   — g t         j                  _        | j                  j	                  «        t         j                  j
                  d   d   }| j                  d|«       y)zW
        The lookup name is a native string from service, protocol and domain.
        éÿÿÿÿr   s   _xmpp-server._tcp.example.orgN)r
   r5   r   r0   rV   r   rX   )r   r   s     r   Útest_SRVLookupNamez$SRVConnectorTests.test_SRVLookupNameÎ   sN   € ð &(Œ×ÑÔ"Ø�‰×ÑÔ ä×!Ñ!×)Ñ)¨"Ñ-¨aÑ0ˆØ×ÑÐ9¸4Õ@r   c                 ó²   — t        j                  | j                  dd| j                  «      | _        | j                  d| j                  j                  «       y)zq
        L{srvconnect.SRVConnector} automatically encodes unicode domain using
        C{idna} encoding.
        zxmpp-clientu   Ã©chec.example.orgs   xn--chec-9oa.example.orgN)r   r;   r9   r:   r0   rX   Údomainr.   s    r   Útest_unicodeDomainz$SRVConnectorTests.test_unicodeDomainØ   sE   € ô
 $×0Ñ0Ø�L‰L˜-Ð)AÀ4Ç<Á<ó
ˆŒð 	×ÑÐ4°d·n±n×6KÑ6KÕLr   c                 óÚ  — t        j                  dddd«      }t        j                  dddd«      }||g| j                  _        g | j                  _        | j                  t        d| j                  «       ddg| _        | j                  j                  «        | j                  | j                  d   d	«       | j                  j                  «        | j                  | j                  d
   d«       ddg| _        | j                  j                  «        | j                  | j                  d   d	«       | j                  j                  «        | j                  | j                  d   d«       y)a  
        pickServer calculates running sum of weights and calls randint.

        This exercises the server selection algorithm specified in RFC 2782 by
        preparing fake L{random.randint} results and checking the values it was
        called with.
        é
   rc   úhost1.example.orgé   úhost2.example.orgÚrandinté   r   )r   é   é   )r   ry   rQ   é   )r   r{   N)r   rR   r0   ÚorderedServersÚserversr8   ÚrandomrC   r=   Ú
pickServerrX   r<   ©r   Úrecord1Úrecord2s      r   Útest_pickServerWeightsz(SRVConnectorTests.test_pickServerWeightsâ   s'  € ô —.‘.  R¨Ð/BÓCˆÜ—.‘.  R¨Ð/BÓCˆà)0°'Ð(:ˆ�‰Ô%Ø!#ˆ�‰ÔØ�
‰
”6˜9 d§m¡mÔ4ð  " 1˜gˆÔà�‰×!Ñ!Ô#Ø×Ñ˜×)Ñ)¨!Ñ,¨gÔ6à�‰×!Ñ!Ô#Ø×Ñ˜×)Ñ)¨!Ñ,¨gÔ6ð  " 1˜gˆÔà�‰×!Ñ!Ô#Ø×Ñ˜×)Ñ)¨!Ñ,¨gÔ6à�‰×!Ñ!Ô#Ø×Ñ˜×)Ñ)¨!Ñ,¨gÕ6r   c                 ó¨  — t        j                  dddd«      }t        j                  dddd«      }||g| j                  _        g | j                  _        | j                  t        d| j                  «       ddg| _        | j                  d| j                  j                  «       «       | j                  d	| j                  j                  «       «       y
)zR
        Two records with equal priorities compare on weight (ascending).
        ry   rc   rz   r{   r|   r}   r   ©rz   rc   ©r|   rc   N©r   rR   r0   r‚   rƒ   r8   r„   rC   r=   rX   r…   r†   s      r   Útest_pickServerSamePrioritiesz/SRVConnectorTests.test_pickServerSamePriorities  s§   € ô —.‘.  R¨Ð/BÓCˆÜ—.‘.  R¨Ð/BÓCˆà)0°'Ð(:ˆ�‰Ô%Ø!#ˆ�‰ÔØ�
‰
”6˜9 d§m¡mÔ4Ø  !˜fˆÔà×ÑÐ4°d·n±n×6OÑ6OÓ6QÔRà×ÑÐ4°d·n±n×6OÑ6OÓ6QÕRr   c                 ó¨  — t        j                  dddd«      }t        j                  dddd«      }||g| j                  _        g | j                  _        | j                  t        d| j                  «       ddg| _        | j                  d| j                  j                  «       «       | j                  d	| j                  j                  «       «       y
)zX
        Two records with differing priorities compare on priority (ascending).
        ry   r   rc   rz   r{   r|   r}   r‹   rŒ   Nr�   r†   s      r   Útest_srvDifferentPrioritiesz-SRVConnectorTests.test_srvDifferentPriorities  s§   € ô —.‘.  Q¨Ð.AÓBˆÜ—.‘.  Q¨Ð.AÓBˆà)0°'Ð(:ˆ�‰Ô%Ø!#ˆ�‰ÔØ�
‰
”6˜9 d§m¡mÔ4Ø  !˜fˆÔà×ÑÐ4°d·n±n×6OÑ6OÓ6QÔRà×ÑÐ4°d·n±n×6OÑ6OÓ6QÕRr   N)r$   r%   r&   r'   r>   rC   rE   r[   r^   r`   re   ri   rl   rq   rt   rw   r‰   rŽ   r�   r(   r   r   r3   r3   @   sZ   „ ñò!ò*ò&1òXò

ò

òSò$Lò
ò 6ò AòMò7òBSó Sr   r3   )r'   r„   Úzope.interface.verifyr   Útwisted.internetr   r   Útwisted.internet.errorr   r   Útwisted.internet.interfacesr   Útwisted.internet.testingr	   Útwisted.namesr
   r   r   Útwisted.names.commonr   Útwisted.names.errorr   Útwisted.trialr   r   ÚClientFactoryr*   ÚTestCaser3   r(   r   r   ú<module>rœ      sa   ðñó
 å .ç ,ß JÝ 2Ý 2ß 1Ñ 1Ý -Ý ,Ý "ô,�<ô ,ô:	�8×)Ñ)ô 	ôaS˜×)Ñ)õ aSr   