o
    ¯b4d  ã                   @   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   ©Úpayload©ÚresultsÚansÚauthÚadd© r(   úE/usr/lib/python3/dist-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.
    )r*   Ú
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   ÚudpPortsÚpopitemÚ_sentPacketsr   ÚfromStrÚassertEqualÚqueriesÚanswersÚ	authorityÚ
additionalÚaddCallbackÚappendÚanswerr   r   Ú	_protocolÚdatagramReceivedÚtoStr)ÚselfÚfilterr/   ÚresolverÚdÚ
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.
        Tr0   r4   r   ©Úttlr!   N)rO   r:   r   r   )rE   rA   r=   r>   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.
        Fr0   r4   r   rP   r!   N)
rO   ÚassertIsInstancer   r:   r;   r<   r   r   r=   r>   )rE   rM   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   ÚTYPEÚgetattrr   )Ú.0ÚnameÚrecordr(   r(   r)   Ú
<listcomp>›   s    ýÿÿz.RootResolverTests._respond.<locals>.<listcomp>)r   r<   r=   r>   Úextend)rE   r<   r=   r>   rU   rN   Ú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.
        r1   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   rZ   ÚKeyErrorÚtyper   r`   )ÚqueryÚserverAddressesÚtimeoutrF   ÚaddrÚserverÚrecords©rE   ÚserverResponsesr(   r)   rd   ±   s   ÿúz-RootResolverTests._getResolver.<locals>.query)r   r5   )rE   rk   ÚmaximumQueriesÚrootsrG   rd   r(   rj   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.
        r0   ó   ns1.example.comú34.55.89.144©r=   r>   r<   ú10.0.0.1)©r1   é5   )rp   rt   ©r   r   r   rn   ÚlookupAddressr?   r-   r:   ©rE   ÚserversrG   rH   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.
        rr   r0   ro   ú10.0.0.2)r<   r=   r>   r<   ú10.0.0.3)rs   ©rz   rt   )
r   r   rV   r   r   rn   rv   r?   r*   r:   )rE   ÚbadClassrx   rG   rH   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.
        r0   r=   s   ns1.example.orgr<   rr   rz   )rs   )rr   rt   ru   rw   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}.
        rs   r0   rU   )r   r   rn   rv   ÚassertFailurer   rw   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}.
        rs   ó   example.com)r   rn   rv   r€   r   rw   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.
        rs   r‚   r=   ro   rU   )r   r   r   rn   rv   r€   r   rw   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}.
        rs   r‚   r=   ro   )r   r   rn   rv   r€   r   rw   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.
        rs   r‚   rU   r<   ro   c                 S   s   | \}}}|d j jS ©Nr   )r"   rZ   r#   r(   r(   r)   Ú
getOneNamef  s   
z<RootResolverTests.test_lookupNameservers.<locals>.getOneName)	r   r   r   r   rn   ÚlookupNameserversr?   r:   r   )rE   rx   rG   rH   r‡   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.
        rs   r‚   r<   ó   example.netz10.0.0.7c                 S   ó   | d S r†   r(   r,   r(   r(   r)   Ú<lambda>  ó    z<RootResolverTests.test_returnCanonicalName.<locals>.<lambda>r!   ©	r   r   r   rn   rv   r?   r:   r   r   rw   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}.
        rs   r‚   r<   rŠ   z10.0.0.5c                 S   r‹   r†   r(   r,   r(   r(   r)   rŒ   ›  r�   z<RootResolverTests.test_followCanonicalName.<locals>.<lambda>r!   rŽ   rw   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}.
        rs   r‚   r<   rŠ   )r   r   rn   rv   r€   r   rw   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.
        r‚   r=   ro   r<   rz   s   ns2.example.comr{   rq   z10.0.0.4)rs   r|   )r{   rt   é   é   )r   r   r   rn   r€   rv   r   r?   r*   r:   r   )rE   rx   ÚfailerÚfailDÚ	succeederÚsucceedDr(   r(   r)   Útest_boundedQueries¹  s0   	ÿÿøþüÿþê!

z%RootResolverTests.test_boundedQueriesN)ra   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   rR   rT   r   r`   rn   ry   r~   r   r�   rƒ   r„   r…   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)rE   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.
    )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©rE   Ú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¯   rt   )r/   rx   N)	Úobjectr   r¥   ÚassertRaisesrž   rv   r:   r    r¡   )rE   Ú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)rE   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.
        )r¶   r@   r   r·   )rE   r    r¡   rH   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µ   rS   ÚDeferredResolver)rE   Ú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(   )rY   Úsr(   r(   r)   r\   €  s    z=BootstrapTests.test_resolves13RootServers.<locals>.<listcomp>N)rµ   r
   rº   r:   r¶   ÚROOT_SERVERS)rE   Ú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·   ÚcallbackrS   r   ©rE   rÀ   r¼   rH   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Â   r:   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¯   é   ©r:   r§   ©Úres©r¼   rE   r(   r)   Ú
checkHints§  s   zFBootstrapTests.test_continuesWhenSomeRootHintsFail.<locals>.checkHintsN)
rµ   r
   rº   Úiterr·   ÚnextrÂ   Úerrbackr   ÚaddBoth©rE   rÀ   r$   Úd1rH   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Ð   Ú
addCleanupÚ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   )rE   ÚaÚkwr(   r(   r)   rd   Ø  s   zStubDNSDatagramProtocol.queryN)r™   rš   r›   rœ   rd   r(   r(   r(   r)   rÙ   Ò  r¤   rÙ   zbtwisted.names.root.retry is deprecated since Twisted 10.0.  Use a Resolver object for retry logic.)ÚcategoryrM   N):rœ   Úzope.interfacer   Úzope.interface.verifyr   Útwisted.internet.deferr   r   r   r   Útwisted.internet.interfacesr   Útwisted.namesr	   r
   Útwisted.names.dnsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Útwisted.names.errorr   r   Útwisted.names.rootr   Útwisted.names.test.test_utilr   Útwisted.python.logr   Útwisted.trialr   Útwisted.trial.unittestr   r    r*   r-   r.   Ú	Exceptionrž   r¥   r¦   r¿   rµ   r¹   rÙ   ÚsuppressÚDeprecationWarningÚ_retrySuppressionr(   r(   r(   r)   Ú<module>   s@   @	   6*
$f

ý