o
    Óó·i2d  ã                   @   s€  d 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mZ ddlmZmZmZmZmZ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& ddl'm(Z( ddl)m*Z*m+Z+ dd„ Z,dd„ Z-G dd„ de+ƒZ.G dd„ de/ƒZ0dd„ Z1G dd„ de+ƒZ2g d¢Z3eeƒG dd„ dƒƒZ4eee4ƒ G dd„ de*ƒZ5G dd „ d ƒZ6e(j7e8d!d"�Z9d#S )$z.
Test cases for Twisted.names' root resolver.
é    )Úimplementer)ÚverifyClass)ÚDeferredÚTimeoutErrorÚgatherResultsÚsucceed)ÚIResolverSimple)ÚclientÚroot)ÚCNAMEÚENAMEÚHSÚINÚNSÚOKÚAÚMessageÚNameÚQueryÚRecord_AÚRecord_CNAMEÚ	Record_NSÚRRHeader)ÚDNSNameErrorÚResolverError)ÚResolver)ÚMemoryReactor)Úmsg)Úutil)ÚSynchronousTestCaseÚTestCasec                 C   s   | \}}}|d j S )z”
    From the result of a L{Deferred} returned by L{IResolver.lookupAddress},
    return the payload of the first record in the answer section.
    r   N©Úpayload©ÚresultsZansÚauthÚadd© r'   úiC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/names/test/test_rootresolve.pyÚgetOnePayload&   s   

r)   c                 C   s   t | ƒ ¡ S )z�
    From the result of a L{Deferred} returned by L{IResolver.lookupAddress},
    return the first IPv4 address from the answer section.
    N)r)   Z
dottedQuad©r$   r'   r'   r(   ÚgetOneAddress/   s   r+   c                   @   s¤   e Zd ZdZdd„ Zdd„ Zdd„ Zg g g efdd	„Zd&dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%S )'ÚRootResolverTestsz3
    Tests for L{twisted.names.root.Resolver}.
    c                 C   sø   t ƒ }tg |d�}| tdttƒdgd|¡}|j ¡ \}}|j\\}}t	ƒ }	|	 
|¡ |  |	jtdttƒg¡ |  |	jg ¡ |  |	jg ¡ |  |	jg ¡ g }
| |
j¡ |  |
g ¡ |	jdd…= d|	_|	j tdtdƒd�¡ |j |	 ¡ d¡ |
d	 S )
aK  
        Invoke L{Resolver._query} and verify that it sends the correct DNS
        query.  Deliver a canned response to the query and return whatever the
        L{Deferred} returned by L{Resolver._query} fires with.

        @param filter: The value to pass for the C{filter} parameter to
            L{Resolver._query}.
        )Úreactoró   foo.example.com)ú1.1.2.3i  )é   Né   ú	5.8.13.21r!   r   )r   r   Ú_queryr   r   r   ZudpPortsÚpopitemZ_sentPacketsr   ZfromStrÚassertEqualÚqueriesÚanswersÚ	authorityÚ
additionalÚaddCallbackÚappendÚanswerr   r   Ú	_protocolZdatagramReceivedZtoStr)ÚselfÚfilterr-   ÚresolverÚdZ
portNumberÚ	transportÚpacketÚaddressÚmessageÚresponser'   r'   r(   Ú
_queryTest<   s.   	ÿ
ÿzRootResolverTests._queryTestc              	   C   sJ   |   d¡\}}}|  |tdtddd�d�g¡ |  |g ¡ |  |g ¡ dS )a)  
        L{Resolver._query} accepts a L{Query} instance and an address, issues
        the query, and returns a L{Deferred} which fires with the response to
        the query.  If a true value is passed for the C{filter} parameter, the
        result is a three-tuple of lists of records.
        Tr.   r2   r   ©Zttlr!   N)rG   r5   r   r   )r>   r<   r8   r9   r'   r'   r(   Útest_filteredQueryg   s   ÿz$RootResolverTests.test_filteredQueryc              	   C   sd   |   d¡}|  |t¡ |  |jg ¡ |  |jtdtddd�d�g¡ |  |jg ¡ |  |j	g ¡ dS )zÃ
        Similar to L{test_filteredQuery}, but for the case where a false value
        is passed for the C{filter} parameter.  In this case, the result is a
        L{Message} instance.
        Fr.   r2   r   rH   r!   N)
rG   ÚassertIsInstancer   r5   r6   r7   r   r   r8   r9   )r>   rE   r'   r'   r(   Útest_unfilteredQueryu   s   
þz&RootResolverTests.test_unfilteredQueryc                 C   sH   t |d�}|j|f|j|f|j|ffD ]\}}| dd„ |D ƒ¡ q|S )a£  
        Create a L{Message} suitable for use as a response to a query.

        @param answers: A C{list} of two-tuples giving data for the answers
            section of the message.  The first element of each tuple is a name
            for the L{RRHeader}.  The second element is the payload.
        @param authority: A C{list} like C{answers}, but for the authority
            section of the response.
        @param additional: A C{list} like C{answers}, but for the
            additional section of the response.
        @param rCode: The response code the message will be created with.

        @return: A new L{Message} initialized with the given values.
        )ÚrCodec              	   S   s*   g | ]\}}t ||jt|d tƒ|d�‘qS )ÚCLASSr!   )r   ZTYPEÚgetattrr   )Ú.0ÚnameÚrecordr'   r'   r(   Ú
<listcomp>›   s    ýÿÿz.RootResolverTests._respond.<locals>.<listcomp>N)r   r7   r8   r9   Úextend)r>   r7   r8   r9   rL   rF   ÚsectionÚdatar'   r'   r(   Ú_respond…   s   
ýüÿzRootResolverTests._respondé
   c                    s(   dg}t ||ƒ}‡ ‡fdd„}||_|S )a   
        Create and return a new L{root.Resolver} modified to resolve queries
        against the record data represented by C{servers}.

        @param serverResponses: A mapping from dns server addresses to
            mappings.  The inner mappings are from query two-tuples (name,
            type) to dictionaries suitable for use as **arguments to
            L{_respond}.  See that method for details.
        r/   c              	      sl   t d| j› d|›�ƒ |D ]&}zˆ| }W n	 ty   Y qw || jj| jf }tˆ jdi |¤Žƒ  S d S )NzQuery for QNAME z at r'   )r   rP   ÚKeyErrorÚtyper   rV   )ÚqueryZserverAddressesÚtimeoutr?   ÚaddrÚserverÚrecords©r>   ÚserverResponsesr'   r(   rZ   ±   s   ÿúz-RootResolverTests._getResolver.<locals>.queryN)r   r3   )r>   r`   ZmaximumQueriesÚrootsr@   rZ   r'   r_   r(   Ú_getResolver¤   s
   


zRootResolverTests._getResolverc                 C   sr   dt fdtdƒfgdtdƒfgdœidt fddtdƒfgiidœ}|  |¡}| d¡}| t¡ | | jd¡ |S )	a  
        L{root.Resolver.lookupAddress} looks up the I{A} records for the
        specified hostname by first querying one of the root servers the
        resolver was created with and then following the authority delegations
        until a result is received.
        r.   ó   ns1.example.comú34.55.89.144©r8   r9   r7   ú10.0.0.1)©r/   é5   )rd   rh   N©r   r   r   rb   ÚlookupAddressr:   r+   r5   ©r>   Úserversr@   rA   r'   r'   r(   Útest_lookupAddress¾   s   	þÿÿÿù


z$RootResolverTests.test_lookupAddressc                 C   sŒ   t dƒ}t|_dtfd|fgdtdƒfgdt dƒfgdœidtfddt dƒfgiidœ}|  |¡}| d¡}| t¡ | | j	t dƒ¡ |S )
zÄ
        If a response includes a record with a class different from the one
        in the query, it is ignored and lookup continues until a record with
        the right class is found.
        rf   r.   rc   ú10.0.0.2)r7   r8   r9   r7   ú10.0.0.3)rg   ©rn   rh   N)
r   r   rM   r   r   rb   rj   r:   r)   r5   )r>   ZbadClassrl   r@   rA   r'   r'   r(   Útest_lookupChecksClassØ   s$   ýÿÿÿø


z(RootResolverTests.test_lookupChecksClassc                 C   s|   dt fddtdƒfgidt fddtdƒfgiidt fddtdƒfgiidœ}|  |¡}| d¡}| t¡ | | jd¡ |S )	z–
        If an intermediate response includes no glue records for the
        authorities, separate queries are made to find those addresses.
        r.   r8   s   ns1.example.orgr7   rf   rn   )rg   )rf   rh   Nri   rk   r'   r'   r(   Útest_missingGlueô   s"   ÿÿû
ÿÿö


z"RootResolverTests.test_missingGluec                 C   s4   ddt fdtiii}|  |¡}| d¡}|  |t¡S )z�
        If a name is missing, L{Resolver.lookupAddress} returns a L{Deferred}
        which fails with L{DNSNameError}.
        rg   r.   rL   N)r   r   rb   rj   ÚassertFailurer   rk   r'   r'   r(   Útest_missingName  s   ÿÿÿ

z"RootResolverTests.test_missingNamec                 C   s0   ddt fi ii}|  |¡}| d¡}|  |t¡S )z¶
        If a query is responded to with no answers or nameserver records, the
        L{Deferred} returned by L{Resolver.lookupAddress} fires with
        L{ResolverError}.
        rg   ó   example.comN)r   rb   rj   rs   r   rk   r'   r'   r(   Útest_answerless  s   ÿÿ

z!RootResolverTests.test_answerlessc                 C   sJ   ddt fddtdƒfgidt fdtiii}|  |¡}| d¡}|  |t¡S )z¶
        If there is an error resolving the nameserver in a delegation response,
        the L{Deferred} returned by L{Resolver.lookupAddress} fires with that
        error.
        rg   ru   r8   rc   rL   N)r   r   r   rb   rj   rs   r   rk   r'   r'   r(   Útest_delegationLookupError.  s   ÿÿüÿ


z,RootResolverTests.test_delegationLookupErrorc                 C   sF   ddt fddtdƒfgidt fi ii}|  |¡}| d¡}|  |t¡S )zÄ
        If there are no records in the response to a lookup of a delegation
        nameserver, the L{Deferred} returned by L{Resolver.lookupAddress} fires
        with L{ResolverError}.
        rg   ru   r8   rc   N)r   r   rb   rj   rs   r   rk   r'   r'   r(   Útest_delegationLookupEmptyB  s   ÿüÿ

z,RootResolverTests.test_delegationLookupEmptyc                 C   sf   ddt fdtidtfddtdƒfgiii}|  |¡}| d¡}dd„ }| |¡ | | jtdƒ¡ |S )	z—
        L{Resolver.lookupNameservers} is like L{Resolver.lookupAddress}, except
        it queries for I{NS} records instead of I{A} records.
        rg   ru   rL   r7   rc   c                 S   s   | \}}}|d j jS ©Nr   )r"   rP   r#   r'   r'   r(   Ú
getOneNamef  s   
z<RootResolverTests.test_lookupNameservers.<locals>.getOneNameN)	r   r   r   r   rb   ZlookupNameserversr:   r5   r   )r>   rl   r@   rA   rz   r'   r'   r(   Útest_lookupNameserversT  s   ÿÿüÿ



z(RootResolverTests.test_lookupNameserversc              	   C   s|   ddt fddtdƒfdtdƒfgiii}|  |¡}| d¡}| dd„ ¡ | | jtdttdƒd�tdt tdƒd�g¡ |S )
z–
        If a I{CNAME} record is encountered as the answer to a query for
        another record type, that record is returned as the answer.
        rg   ru   r7   ó   example.netz10.0.0.7c                 S   ó   | d S ry   r'   r*   r'   r'   r(   Ú<lambda>  ó    z<RootResolverTests.test_returnCanonicalName.<locals>.<lambda>r!   N©	r   r   r   rb   rj   r:   r5   r   r   rk   r'   r'   r(   Útest_returnCanonicalNamen  s&   

þÿÿÿ


þþz*RootResolverTests.test_returnCanonicalNamec              	   C   sˆ   ddt fddtdƒfgidt fddtdƒfgiii}|  |¡}| d¡}| dd„ ¡ | | jtdttdƒd�tdt tdƒd�g¡ |S )
zÌ
        If no record of the requested type is included in a response, but a
        I{CNAME} record for the query name is included, queries are made to
        resolve the value of the I{CNAME}.
        rg   ru   r7   r|   z10.0.0.5c                 S   r}   ry   r'   r*   r'   r'   r(   r~   ›  r   z<RootResolverTests.test_followCanonicalName.<locals>.<lambda>r!   Nr€   rk   r'   r'   r(   Útest_followCanonicalName‰  s&   ÿÿüÿ


þþz*RootResolverTests.test_followCanonicalNamec                 C   sH   ddt fddtdƒfdtdƒfgiii}|  |¡}| d¡}|  |t¡S )z½
        If there is a cycle between I{CNAME} records in a response, this is
        detected and the L{Deferred} returned by the lookup method fails
        with L{ResolverError}.
        rg   ru   r7   r|   N)r   r   rb   rj   rs   r   rk   r'   r'   r(   Útest_detectCanonicalNameLoop¥  s   

þÿÿÿ


z.RootResolverTests.test_detectCanonicalNameLoopc                 C   sÌ   dt fddtdƒfgidt fddtdƒfgiidt fdtdƒfgdtdƒfgdœidt fddtd	ƒfgiid
œ}|  |d¡}|  | d¡t¡}|  |d¡}| d¡}| t¡ | | j	td	ƒ¡ t
||gƒS )zŒ
        L{Resolver.lookupAddress} won't issue more queries following
        delegations than the limit passed to its initializer.
        ru   r8   rc   r7   rn   s   ns2.example.comro   re   z10.0.0.4)rg   rp   )ro   rh   é   é   N)r   r   r   rb   rs   rj   r   r:   r)   r5   r   )r>   rl   ZfailerZfailDZ	succeederZsucceedDr'   r'   r(   Útest_boundedQueries¹  s0   	ÿÿøþüÿþê!

z%RootResolverTests.test_boundedQueriesN)rW   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rG   rI   rK   r   rV   rb   rm   rq   rr   rt   rv   rw   rx   r{   r�   r‚   rƒ   r†   r'   r'   r'   r(   r,   7   s&    +
r,   c                   @   ó   e Zd ZdZdd„ ZdS )ÚResolverFactoryArgumentszf
    Raised by L{raisingResolverFactory} with the *args and **kwargs passed to
    that function.
    c                 C   s   || _ || _dS )z™
        Store the supplied args and kwargs as attributes.

        @param args: Positional arguments.
        @param kwargs: Keyword arguments.
        N©ÚargsÚkwargs)r>   rŽ   r�   r'   r'   r(   Ú__init__ð  ó   
z!ResolverFactoryArguments.__init__N)r‡   rˆ   r‰   rŠ   r�   r'   r'   r'   r(   rŒ   ê  ó    rŒ   c                  O   s
   t | |ƒ‚)a=  
    Raise a L{ResolverFactoryArguments} exception containing the
    positional and keyword arguments passed to resolverFactory.

    @param args: A L{list} of all the positional arguments supplied by
        the caller.

    @param kwargs: A L{list} of all the keyword arguments supplied by
        the caller.
    N)rŒ   r�   r'   r'   r(   ÚraisingResolverFactoryû  s   
r“   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú RootResolverResolverFactoryTestsz6
    Tests for L{root.Resolver._resolverFactory}.
    c                 C   s    t dgtd�}|  |jt¡ dS )z…
        L{root.Resolver.__init__} accepts a C{resolverFactory}
        argument and assigns it to C{self._resolverFactory}.
        N)ÚhintsÚresolverFactory)r   r“   ÚassertIsÚ_resolverFactory©r>   Úrr'   r'   r(   Ú#test_resolverFactoryArgumentPresent  s   zDRootResolverResolverFactoryTests.test_resolverFactoryArgumentPresentc                 C   s    t dgd�}|  |jtj ¡ dS )z 
        L{root.Resolver.__init__} sets L{client.Resolver} as the
        C{_resolverFactory} if a C{resolverFactory} argument is not
        supplied.
        N)r•   )r   r—   r˜   r	   r™   r'   r'   r(   Ú"test_resolverFactoryArgumentAbsent  s   zCRootResolverResolverFactoryTests.test_resolverFactoryArgumentAbsentc                 C   sJ   t ƒ }tdgt|d�}|  t|jd¡}|  d|dgdœf|j|jf¡ dS )zy
        L{root.Resolver._resolverFactory} is supplied with C{reactor} and
        C{servers} keyword arguments.
        ú192.0.2.101)r•   r–   r-   zexample.comr'   )r�   rh   )r-   rl   N)	Úobjectr   r“   ÚassertRaisesrŒ   rj   r5   rŽ   r�   )r>   ZdummyReactorrš   Úer'   r'   r(   Ú)test_resolverFactoryOnlyExpectedArguments  s   ý
þzJRootResolverResolverFactoryTests.test_resolverFactoryOnlyExpectedArgumentsN)r‡   rˆ   r‰   rŠ   r›   rœ   r¡   r'   r'   r'   r(   r”   	  s
    	r”   )za.root-servers.netzb.root-servers.netzc.root-servers.netzd.root-servers.netze.root-servers.netzf.root-servers.netzg.root-servers.netzh.root-servers.netzi.root-servers.netzj.root-servers.netzk.root-servers.netzl.root-servers.netzm.root-servers.netc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚStubResolverz²
    An L{IResolverSimple} implementer which traces all getHostByName
    calls and their deferred results. The deferred results can be
    accessed and fired synchronously.
    c                 C   s   g | _ g | _dS )zâ
        @type calls: L{list} of L{tuple} containing C{args} and
            C{kwargs} supplied to C{getHostByName} calls.
        @type pendingResults: L{list} of L{Deferred} returned by
            C{getHostByName}.
        N)ÚcallsÚpendingResults)r>   r'   r'   r(   r�   L  r‘   zStubResolver.__init__c                 O   s&   | j  ||f¡ tƒ }| j |¡ |S )al  
        A fake implementation of L{IResolverSimple.getHostByName}

        @param args: A L{list} of all the positional arguments supplied by
           the caller.

        @param kwargs: A L{list} of all the keyword arguments supplied by
           the caller.

        @return: A L{Deferred} which may be fired later from the test
            fixture.
        N)r£   r;   r   r¤   )r>   rŽ   r�   rA   r'   r'   r(   ÚgetHostByNameV  s   zStubResolver.getHostByNameN)r‡   rˆ   r‰   rŠ   r�   r¥   r'   r'   r'   r(   r¢   D  s    
r¢   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚBootstrapTestsz%
    Tests for L{root.bootstrap}
    c                 C   s   t  tƒ ¡}|  |t j¡ dS )zl
        L{root.bootstrap} returns an object which is initially a
        L{root.DeferredResolver}.
        N)r
   Ú	bootstrapr¢   rJ   ZDeferredResolver)r>   ÚdeferredResolverr'   r'   r(   Útest_returnsDeferredResolverq  s   z+BootstrapTests.test_returnsDeferredResolverc                 C   s,   t ƒ }t |¡ |  |jdd„ tD ƒ¡ dS )zŽ
        The L{IResolverSimple} supplied to L{root.bootstrap} is used to lookup
        the IP addresses of the 13 root name servers.
        c                 S   s   g | ]}|fi f‘qS r'   r'   )rO   Úsr'   r'   r(   rR   €  s    z=BootstrapTests.test_resolves13RootServers.<locals>.<listcomp>N)r¢   r
   r§   r5   r£   ÚROOT_SERVERS)r>   ÚstubResolverr'   r'   r(   Útest_resolves13RootServersy  s   
z)BootstrapTests.test_resolves13RootServersc                 C   s6   t ƒ }t |¡}|jD ]}| d¡ q|  |t¡ dS )zÇ
        The L{root.DeferredResolver} initially returned by L{root.bootstrap}
        becomes a L{root.Resolver} when the supplied resolver has successfully
        looked up all root hints.
        r�   N)r¢   r
   r§   r¤   ÚcallbackrJ   r   ©r>   r¬   r¨   rA   r'   r'   r(   Útest_becomesResolver‚  s
   

z#BootstrapTests.test_becomesResolverc                 C   s>   t ƒ }t |¡}|jD ]}| d¡ q|  |jdgd ¡ dS )z›
        The L{root.Resolver} which eventually replaces L{root.DeferredResolver}
        is supplied with the IP addresses of the 13 root servers.
        r�   é   N)r¢   r
   r§   r¤   r®   r5   r•   r¯   r'   r'   r(   Útest_resolverReceivesRootHintsŽ  s
   

z-BootstrapTests.test_resolverReceivesRootHintsc                    s^   t ƒ }t |¡‰ t|jƒ}t|ƒ}|D ]}| d¡ q| tƒ ¡ ‡ ‡fdd„}| 	|¡ dS )zÇ
        The L{root.Resolver} is eventually created, even if some of the root
        hint lookups fail. Only the working root hint IP addresses are supplied
        to the L{root.Resolver}.
        r�   c                    s   ˆ  ˆ jdgd ¡ d S )Nr�   é   ©r5   r•   ©Úres©r¨   r>   r'   r(   Ú
checkHints§  s   zFBootstrapTests.test_continuesWhenSomeRootHintsFail.<locals>.checkHintsN)
r¢   r
   r§   Úiterr¤   Únextr®   Úerrbackr   ÚaddBoth©r>   r¬   r$   Zd1rA   r¸   r'   r·   r(   Ú#test_continuesWhenSomeRootHintsFail™  s   

z2BootstrapTests.test_continuesWhenSomeRootHintsFailc                    sn   t ƒ }t |¡‰ t|jƒ}t|ƒ}|D ]}| tƒ ¡ q| tƒ ¡ ‡ ‡fdd„}| |¡ ˆ 	ˆj
t¡ dS )z´
        The L{root.Resolver} is eventually created, even if all of the root hint
        lookups fail. Pending and new lookups will then fail with
        AttributeError.
        c                    s   ˆ  ˆ jg ¡ d S ©Nr´   rµ   r·   r'   r(   r¸   º  s   zEBootstrapTests.test_continuesWhenAllRootHintsFail.<locals>.checkHintsN)r¢   r
   r§   r¹   r¤   rº   r»   r   r¼   Z
addCleanupZflushLoggedErrorsr½   r'   r·   r(   Ú"test_continuesWhenAllRootHintsFail¬  s   


z1BootstrapTests.test_continuesWhenAllRootHintsFailc                 C   s<   t ƒ }tj|td�}|jD ]}| d¡ q|  |jt¡ dS )z»
        L{root.bootstrap} accepts a C{resolverFactory} argument which is passed
        as an argument to L{root.Resolver} when it has successfully looked up
        root hints.
        )r–   r�   N)r¢   r
   r§   r“   r¤   r®   r—   r˜   r¯   r'   r'   r(   Útest_passesResolverFactoryÁ  s   ÿ
z)BootstrapTests.test_passesResolverFactoryN)r‡   rˆ   r‰   rŠ   r©   r­   r°   r²   r¾   rÀ   rÁ   r'   r'   r'   r(   r¦   l  s    	r¦   c                   @   r‹   )ÚStubDNSDatagramProtocolz›
    A do-nothing stand-in for L{DNSDatagramProtocol} which can be used to avoid
    network traffic in tests where that kind of thing doesn't matter.
    c                 O   s   t ƒ S r¿   )r   )r>   ÚaÚkwr'   r'   r(   rZ   Ø  s   zStubDNSDatagramProtocol.queryN)r‡   rˆ   r‰   rŠ   rZ   r'   r'   r'   r(   rÂ   Ò  r’   rÂ   zbtwisted.names.root.retry is deprecated since Twisted 10.0.  Use a Resolver object for retry logic.)ÚcategoryrE   N):rŠ   Zzope.interfacer   Zzope.interface.verifyr   Ztwisted.internet.deferr   r   r   r   Ztwisted.internet.interfacesr   Ztwisted.namesr	   r
   Ztwisted.names.dnsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztwisted.names.errorr   r   Ztwisted.names.rootr   Ztwisted.names.test.test_utilr   Ztwisted.python.logr   Ztwisted.trialr   Ztwisted.trial.unittestr   r    r)   r+   r,   Ú	ExceptionrŒ   r“   r”   r«   r¢   r¦   rÂ   ÚsuppressÚDeprecationWarningZ_retrySuppressionr'   r'   r'   r(   Ú<module>   s@   @	   6*
$f

ý