U
    P|j2d  ã                   @   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+ƒZ2ddddddd d!d"d#d$d%d&gZ3eeƒG d'd(„ d(ƒƒZ4eee4ƒ G d)d*„ d*e*ƒZ5G d+d,„ d,ƒZ6e(j7e8d-d.�Z9d/S )0z.
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©ÚresultsZansÚauthÚadd© r'   úG/tmp/pip-unpacked-wheel-audpp6lv/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)   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<   s4    	
   ÿ
ÿ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>)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              	      sn   t d| j› d|›�ƒ |D ]N}zˆ| }W n tk
rB   Y qY nX || jj| jf }tˆ jf |Žƒ  S d S )NzQuery for QNAME z at )r   rP   ÚKeyErrorÚtyper   rV   )ÚqueryZserverAddressesÚtimeoutr?   ÚaddrÚserverÚrecords©r>   ÚserverResponsesr'   r(   rZ   ±   s    
z-RootResolverTests._getResolver.<locals>.query)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   ©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   )
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   ri   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   )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.com)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   )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   )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>.getOneName)	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   s   | d S ry   r'   r*   r'   r'   r(   Ú<lambda>  ó    z<RootResolverTests.test_returnCanonicalName.<locals>.<lambda>r!   ©	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   s   | d S ry   r'   r*   r'   r'   r(   r}   ›  r~   z<RootResolverTests.test_followCanonicalName.<locals>.<lambda>r!   r   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|   )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   é   é   )r   r   r   rb   rs   rj   r   r:   r)   r5   r   )r>   rl   ZfailerZfailDZ	succeederZsucceedDr'   r'   r(   Útest_boundedQueries¹  s6    	 ÿ ÿøþü ÿþê!

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                   @   s   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__ð  s    z!ResolverFactoryArguments.__init__N)r†   r‡   rˆ   r‰   rŽ   r'   r'   r'   r(   rŠ   ê  s   rŠ   c                  O   s   t | |ƒ‚dS )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  s    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    )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$   Ú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                   @   s   e Zd ZdZdd„ ZdS )Ú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¿   Ò  s   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>   sX   @	   6+ó$
f
ý