Ë
    ojÃ9  ã                   óÊ  — d Z ddl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
 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mZmZ ddlmZ ddlmZ ddlmZmZ 	 ddl Z!e!Z  e
d«      Z# e	ee«       G d„ d«      «       Z$ G d„ de«      Z%d„ Z& G d„ d«      Z' G d„ de'e«      Z( G d„ de'e«      Z) G d„ de«      Z* ee  d«       G d„ d e«      «       Z+y# e"$ r dZ Y Œ{w xY w)!z%
Tests for L{twisted.internet.base}.
é    N)ÚQueue)ÚCallable)ÚskipIf)Úimplementer)Ú	ParamSpec)ÚFirstOneWins)ÚDelayedCallÚReactorBaseÚThreadedResolver)ÚDeferred)ÚDNSLookupError)ÚIReactorThreadsÚIReactorTimeÚIResolverSimple)ÚClock)Ú
ThreadPool)ÚSkipTestÚTestCaseÚ_Pc                   óÎ   — e Zd ZdZd„ Zdeeef   dej                  dej                  ddfd„Z
d	„ Zd
„ Zd„ Zdefd„Zdeeef   dej                  dej                  ddfd„Zd„ Zy)ÚFakeReactorzl
    A fake reactor implementation which just supports enough reactor APIs for
    L{ThreadedResolver}.
    c                 óÞ   ‡ — t        «       ‰ _        ‰ j                  j                  ‰ _        t        «       ‰ _        ‰ j                  j                  «        ˆ fd„‰ _        t        «       ‰ _        y )Nc                  ó   •— ‰ j                   S ©N)Ú_threadpool©Úselfs   €úA/usr/lib/python3/dist-packages/twisted/internet/test/test_base.pyú<lambda>z&FakeReactor.__init__.<locals>.<lambda>1   s   ø€  T×%5Ñ%5€ ó    )	r   Ú_clockÚ	callLaterr   r   ÚstartÚgetThreadPoolr   Ú_threadCallsr   s   `r   Ú__init__zFakeReactor.__init__+   sK   ø€ Ü“gˆŒØŸ™×.Ñ.ˆŒä%›<ˆÔØ×Ñ×ÑÔ Û5ˆÔä!›GˆÕr    ÚcallableÚargsÚkwargsÚreturnNc                 ó@   — | j                   j                  |||f«       y r   )r%   Úput©r   r'   r(   r)   s       r   ÚcallFromThreadzFakeReactor.callFromThread5   s   € ð 	×Ñ×Ñ˜x¨¨vÐ6Õ7r    c                 óP   — | j                   j                  «       \  }}} ||i |¤Ž y r   )r%   Úget)r   Úfr(   r)   s       r   Ú_runThreadCallszFakeReactor._runThreadCalls:   s)   € Ø×+Ñ+×/Ñ/Ó1‰ˆˆ4�Ù	ˆ4Ð�6Ór    c                 ó8   — | j                   j                  «        y r   )r   Ústopr   s    r   Ú_stopzFakeReactor._stop>   s   € Ø×Ñ×ÑÕr    c                  ó   — y r   © r   s    r   ÚgetDelayedCallszFakeReactor.getDelayedCallsA   ó   € àr    c                  ó   — y r   r7   r   s    r   ÚsecondszFakeReactor.secondsE   r9   r    c                  ó   — y r   r7   r-   s       r   ÚcallInThreadzFakeReactor.callInThreadI   s   € ð 	r    c                  ó   — y r   r7   )r   Úsizes     r   ÚsuggestThreadPoolSizez!FakeReactor.suggestThreadPoolSizeO   r9   r    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r   r   Úobjectr(   r)   r.   r2   r5   r8   Úfloatr;   r=   r@   r7   r    r   r   r   $   s˜   „ ñò
$ð8Ø   V Ñ,ð8Ø57·W±Wð8ØHJÏ	É	ð8à	ó8ò
ò òð˜ó ðØ   V Ñ,ðØ57·W±WðØHJÏ	É	ðà	óór    r   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚThreadedResolverTestsz(
    Tests for L{ThreadedResolver}.
    c                 ó  ‡‡	— dŠd}d}t        «       }| j                  |j                  «       g Š	g }ˆˆ	fd„}| j                  t        d|«       t        |«      }|j                  ||f«      }|j                  |j                  «       |j                  «        | j                  ‰	|g«       | j                  |‰g«       |j                  j                  |dz   «       | j                  |j                  j                  g «       y)zí
        L{ThreadedResolver.getHostByName} returns a L{Deferred} which fires
        with the value returned by the call to L{socket.gethostbyname} in the
        threadpool of the reactor passed to L{ThreadedResolver.__init__}.
        z	10.0.0.17zfoo.bar.example.comé   c                 ó*   •— ‰j                  | «       ‰S r   )Úappend)ÚnameÚipÚlookedUps    €€r   ÚfakeGetHostByNamez=ThreadedResolverTests.test_success.<locals>.fakeGetHostByNamei   s   ø€ Ø�O‰O˜DÔ!ØˆIr    Úgethostbynameé   N)r   Ú
addCleanupr5   ÚpatchÚsocketr   ÚgetHostByNameÚaddCallbackrL   r2   ÚassertEqualr!   ÚadvanceÚcalls)
r   rM   ÚtimeoutÚreactorÚ
resolvedTorP   ÚresolverÚdrN   rO   s
           @@r   Útest_successz"ThreadedResolverTests.test_successY   sß   ù€ ð ˆØ$ˆØˆä“-ˆØ�‰˜Ÿ™Ô&àˆØˆ
õ	ð 	�
‰
”6˜?Ð,=Ô>ä# GÓ,ˆØ×"Ñ" 4¨'¨Ó4ˆØ	�‰�j×'Ñ'Ô(à×ÑÔ!à×Ñ˜ D 6Ô*Ø×Ñ˜ b TÔ*ð 	�‰×Ñ˜w¨™{Ô+Ø×Ñ˜Ÿ™×-Ñ-¨rÕ2r    c                 ó  — d}t        «       }| j                  |j                  «       d„ }| j                  t        d|«       g }t        |«      }|j                  d|f«      }| j                  |t        «       |j                  |j                  «       |j                  «        | j                  t        |«      d«       |j                  j                  |dz   «       | j                  |j                  j                   g «       y)z¦
        L{ThreadedResolver.getHostByName} returns a L{Deferred} which fires a
        L{Failure} if the call to L{socket.gethostbyname} raises an exception.
        rJ   c                 ó   — t        d«      ‚)NzENOBUFS (this is a funny joke))ÚOSError)rM   s    r   rP   z=ThreadedResolverTests.test_failure.<locals>.fakeGetHostByName†   s   € ÜÐ:Ó;Ð;r    rQ   ú	some.namerR   N)r   rS   r5   rT   rU   r   rV   ÚassertFailurer   rW   rL   r2   rX   Úlenr!   rY   rZ   )r   r[   r\   rP   Ú
failedWithr^   r_   s          r   Útest_failurez"ThreadedResolverTests.test_failure|   sÏ   € ð
 ˆä“-ˆØ�‰˜Ÿ™Ô&ò	<ð 	�
‰
”6˜?Ð,=Ô>àˆ
Ü# GÓ,ˆØ×"Ñ" ;°°
Ó;ˆØ×Ñ˜1œnÔ-Ø	�‰�j×'Ñ'Ô(à×ÑÔ!à×Ñœ˜Z›¨!Ô,ð 	�‰×Ñ˜w¨™{Ô+Ø×Ñ˜Ÿ™×-Ñ-¨rÕ2r    c                 óB  ‡— d}t        «       }| j                  |j                  «       t        «       Šˆfd„}| j	                  t
        d|«       g }t        |«      }|j                  d|f«      }| j                  |t        «       |j                  |j                  «       |j                  j                  |dz
  «       | j                  |g «       |j                  j                  d«       | j                  t        |«      d«       ‰j!                  t#        d«      «       y)zÐ
        If L{socket.gethostbyname} does not complete before the specified
        timeout elapsed, the L{Deferred} returned by
        L{ThreadedResolver.getHostByName} fails with L{DNSLookupError}.
        é
   c                 ó$   •— ‰j                  «       ‚r   )r0   )rM   Úresults    €r   rP   z=ThreadedResolverTests.test_timeout.<locals>.fakeGetHostByName¦   s   ø€ Ø—*‘*“,Ðr    rQ   rd   rR   zThe I/O was errorfulN)r   rS   r5   r   rT   rU   r   rV   re   r   rW   rL   r!   rY   rX   rf   r,   ÚIOError)r   r[   r\   rP   rg   r^   r_   rl   s          @r   Útest_timeoutz"ThreadedResolverTests.test_timeout™   så   ø€ ð ˆä“-ˆØ�‰˜Ÿ™Ô&ä“ˆô	ð 	�
‰
”6˜?Ð,=Ô>àˆ
Ü# GÓ,ˆØ×"Ñ" ;°°
Ó;ˆØ×Ñ˜1œnÔ-Ø	�‰�j×'Ñ'Ô(à�‰×Ñ˜w¨™{Ô+Ø×Ñ˜ RÔ(Ø�‰×Ñ˜qÔ!Ø×Ñœ˜Z›¨!Ô,ð 	�
‰
”7Ð1Ó2Õ3r    c                 óJ  ‡— g Št        t        «       G ˆfd„d«      «       } G d„ dt        «      } |«       } |«       }|j                  |«       t	        t        «       «      }|j                  j                  |d«       |j                  j                  |d«       |j                  j                  |d«       |j                  j                  |d«       |j                  j                  |d«       | j                  t        ‰«      d	«       | j                  t        t        t        ‰«      «      t        gd	z  «       | j                  d‰d
   «       | j                  d‰d   «       | j                  d‰d   «       | j                  d‰d   «       | j                  d‰d   «       y)zm
        L{ThreadedResolver.getHostByName} is passed L{str}, encoded using IDNA
        if required.
        c                   ó   •— e Zd Zdˆ fd„	Zy)úAThreadedResolverTests.test_resolverGivenStr.<locals>.FakeResolverc                 ó:   •— ‰j                  |«       t        «       S r   )rL   r   )r   rM   ÚtimeoutsrZ   s      €r   rV   zOThreadedResolverTests.test_resolverGivenStr.<locals>.FakeResolver.getHostByNameÃ   s   ø€ Ø—‘˜TÔ"Ü“zÐ!r    N)r7   )rA   rB   rC   rV   )rZ   s   €r   ÚFakeResolverrq   Á   s   ø„ ö"r    rt   c                   ó   — e Zd Zd„ Zy)úFThreadedResolverTests.test_resolverGivenStr.<locals>.JustEnoughReactorc                  ó   — y r   r7   r   s    r   ÚinstallWakerzSThreadedResolverTests.test_resolverGivenStr.<locals>.JustEnoughReactor.installWakerÈ   s   € Ør    N)rA   rB   rC   rx   r7   r    r   ÚJustEnoughReactorrv   Ç   s   „ ór    ry   zexample.exampleu   vÃ¤Ã¤ntynyt.exampleu   Ñ€Ñ„.examplezxn----7sbb4ac0ad0be6cf.xn--p1aié   r   rR   zxn--vntynyt-5waa.exampleé   zxn--p1ai.exampleé   é   N)r   r   r
   ÚinstallResolverr   r   ÚnameResolverÚresolveHostNamerX   rf   ÚlistÚmapÚtypeÚstr)r   rt   ry   Úfaker\   ÚrecrZ   s         @r   Útest_resolverGivenStrz+ThreadedResolverTests.test_resolverGivenStrº   so  ø€ ð
 ˆä	”_Ó	%÷	"ò 	"ó 
&ð	"ô
	¤ô 	ñ ‹~ˆÙ#Ó%ˆØ×Ñ Ô%Üœ8›:Ó&ˆØ×Ñ×,Ñ,¨SÐ2CÔDØ×Ñ×,Ñ,¨SÐ2CÔDØ×Ñ×,Ñ,¨SÐ2KÔLØ×Ñ×,Ñ,¨SÐ2HÔIØ×Ñ×,Ñ,¨SÐ2SÔTà×Ñœ˜U› QÔ'Ø×Ñœœc¤$¨Ó.Ó/´#°¸±Ô;Ø×ÑÐ*¨E°!©HÔ5Ø×ÑÐ*¨E°!©HÔ5Ø×ÑÐ3°U¸1±XÔ>Ø×ÑÐ+¨U°1©XÔ6Ø×ÑÐ:¸EÀ!¹HÕEr    N)rA   rB   rC   rD   r`   rh   rn   r‡   r7   r    r   rH   rH   T   s   „ ñò!3òF3ò:4óB!Fr    rH   c                   ó   — y)z8
    Function used by L{DelayedCallTests.test_str}.
    Nr7   r7   r    r   Únothingr‰   Þ   ó   � r    c                   óL   — 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y)ÚDelayedCallMixinú
    L{DelayedCall}
    c           	      ó,   — d„ }t        |d„ di ||d«      S )z¯
        Get a L{DelayedCall} instance at a given C{time}.

        @param time: The absolute time at which the returned L{DelayedCall}
            will be scheduled.
        c                  ó   — y r   r7   )Úcalls    r   Únoopz0DelayedCallMixin._getDelayedCallAt.<locals>.noopñ   s   € Ør    c                   ó   — y r   r7   r7   r    r   r   z4DelayedCallMixin._getDelayedCallAt.<locals>.<lambda>ô   rŠ   r    r7   N)r	   )r   Útimer‘   s      r   Ú_getDelayedCallAtz"DelayedCallMixin._getDelayedCallAté   s    € ò	ô ˜4¡¨r°2°t¸TÀ4ÓHÐHr    c                 ó\   — | j                  d«      | _        | j                  d«      | _        y)zb
        Create two L{DelayedCall} instanced scheduled to run at different
        times.
        r   rR   N)r”   ÚzeroÚoner   s    r   ÚsetUpzDelayedCallMixin.setUpö   s(   € ð
 ×*Ñ*¨1Ó-ˆŒ	Ø×)Ñ)¨!Ó,ˆ�r    c           	      ó„   — t        dt        dddiddd„ «      }| j                  t        |«      dt	        |«      fz  «       y)úç
        The string representation of a L{DelayedCall} instance, as returned by
        L{str}, includes the unsigned id of the instance, as well as its state,
        the function to be called, and the function arguments.
        é   ©r|   ÚArz   Nc                   ó   — y©Ng      ø?r7   r7   r    r   r   z+DelayedCallMixin.test_str.<locals>.<lambda>  rŠ   r    z?<DelayedCall 0x%x [10.5s] called=0 cancelled=0 nothing(3, A=5)>)r	   r‰   rX   r„   Úid©r   Údcs     r   Útest_strzDelayedCallMixin.test_strþ   sD   € ô ˜œW d¨S°!¨H°d¸DÁ+ÓNˆØ×ÑÜ�‹GØMÜ�"‹vˆiñõ	
r    c           	      ó|   — t        dt        dddiddd„ «      }| j                  t        |«      t	        |«      «       y)z‘
        The string representation of a L{DelayedCall} instance, as returned by
        {repr}, is identical to that returned by L{str}.
        é   )é   r�   é	   Nc                   ó   — y)Ngš™™™™™ù?r7   r7   r    r   r   z,DelayedCallMixin.test_repr.<locals>.<lambda>  rŠ   r    )r	   r‰   rX   r„   Úreprr¡   s     r   Ú	test_reprzDelayedCallMixin.test_repr  s6   € ô
 ˜œW d¨S°!¨H°d¸DÁ+ÓNˆØ×Ñœ˜R›¤$ r£(Õ+r    c                 óÔ   — | j                   | j                  }}| j                  ||k  «       | j                  ||k  «       | j                  ||k  «       | j                  ||k  «       y)z’
        For two instances of L{DelayedCall} C{a} and C{b}, C{a < b} is true
        if and only if C{a} is scheduled to run before C{b}.
        N©r–   r—   Ú
assertTrueÚassertFalse©r   r–   r—   s      r   Útest_ltzDelayedCallMixin.test_lt  s[   € ð
 —I‘I˜tŸx™xˆcˆØ�‰˜˜s™
Ô#Ø×Ñ˜˜t™Ô$Ø×Ñ˜ ™Ô%Ø×Ñ˜˜s™Õ#r    c                 óÔ   — | j                   | j                  }}| j                  ||k  «       | j                  ||k  «       | j                  ||k  «       | j                  ||k  «       y)z·
        For two instances of L{DelayedCall} C{a} and C{b}, C{a <= b} is true
        if and only if C{a} is scheduled to run before C{b} or at the same
        time as C{b}.
        Nr¬   r¯   s      r   Útest_lezDelayedCallMixin.test_le  sW   € ð —I‘I˜tŸx™xˆcˆØ�‰˜ ™Ô$Ø×Ñ˜ ™Ô%Ø�‰˜ ™Ô%Ø�‰˜˜s™
Õ#r    c                 óÔ   — | j                   | j                  }}| j                  ||kD  «       | j                  ||kD  «       | j                  ||kD  «       | j                  ||kD  «       y)z‘
        For two instances of L{DelayedCall} C{a} and C{b}, C{a > b} is true
        if and only if C{a} is scheduled to run after C{b}.
        Nr¬   r¯   s      r   Útest_gtzDelayedCallMixin.test_gt*  s[   € ð
 —I‘I˜tŸx™xˆcˆØ�‰˜˜d™
Ô#Ø×Ñ˜ ™Ô$Ø×Ñ˜ ™Ô%Ø×Ñ˜˜s™Õ#r    c                 óÔ   — | j                   | j                  }}| j                  ||k\  «       | j                  ||k\  «       | j                  ||k\  «       | j                  ||k\  «       y)zµ
        For two instances of L{DelayedCall} C{a} and C{b}, C{a > b} is true
        if and only if C{a} is scheduled to run after C{b} or at the same
        time as C{b}.
        Nr¬   r¯   s      r   Útest_gezDelayedCallMixin.test_ge5  sW   € ð —I‘I˜tŸx™xˆcˆØ�‰˜˜t™Ô$Ø×Ñ˜ ™Ô%Ø�‰˜ ™Ô%Ø�‰˜˜s™
Õ#r    c                 óô   — | j                  | j                  | j                  k(  «       | j                  | j                  | j                  k(  «       | j                  | j                  | j                  k(  «       y)zD
        A L{DelayedCall} instance is only equal to itself.
        N)r®   r–   r—   r­   r   s    r   Útest_eqzDelayedCallMixin.test_eqA  sQ   € ð 	×Ñ˜Ÿ™ d§h¡hÑ.Ô/Ø�‰˜Ÿ	™	 T§Y¡YÑ.Ô/Ø�‰˜Ÿ™ D§H¡HÑ,Õ-r    c                 óô   — | j                  | j                  | j                  k7  «       | j                  | j                  | j                  k7  «       | j                  | j                  | j                  k7  «       y)zM
        A L{DelayedCall} instance is not equal to any other object.
        N)r­   r–   r—   r®   r   s    r   Útest_nezDelayedCallMixin.test_neK  sS   € ð 	�‰˜Ÿ	™	 T§X¡XÑ-Ô.Ø×Ñ˜Ÿ™ d§i¡iÑ/Ô0Ø×Ñ˜Ÿ™ T§X¡XÑ-Õ.r    N)rA   rB   rC   rD   r”   r˜   r£   rª   r°   r²   r´   r¶   r¸   rº   r7   r    r   rŒ   rŒ   ä   s:   „ ñòIò-ò
ò,ò	$ò
$ò	$ò
$ò.ó/r    rŒ   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚDelayedCallNoDebugTestsr�   c                 ó\   — | j                  t        dd«       t        j                  | «       y)z!
        Turn debug off.
        ÚdebugFN©rT   r	   rŒ   r˜   r   s    r   r˜   zDelayedCallNoDebugTests.setUp[  s"   € ð 	�
‰
”; ¨Ô/Ü×Ñ˜tÕ$r    c           	      óž   — t        dt        dddiddd„ «      }dj                  t        |«      «      }| j	                  t        |«      |«       y)rš   r›   rœ   r�   rz   Nc                   ó   — yrŸ   r7   r7   r    r   r   z2DelayedCallNoDebugTests.test_str.<locals>.<lambda>h  rŠ   r    zA<DelayedCall 0x{:x} [10.5s] called=0 cancelled=0 nothing(3, A=5)>)r	   r‰   Úformatr    rX   r„   )r   r¢   Úexpecteds      r   r£   z DelayedCallNoDebugTests.test_strb  sK   € ô ˜œW d¨S°!¨H°d¸DÁ+ÓNˆðß%™v¤b¨£f›~ð 	ð 	×Ñœ˜R› (Õ+r    c           	      ó~   — t        dd„ di t        t        d„ «      }d|_        | j                  dt	        |«      «       y)zí
        If L{DelayedCall.debug} changes from C{0} to C{1} between
        L{DelayeCall.__init__} and L{DelayedCall.__repr__} then
        L{DelayedCall.__repr__} returns a string that does not include the
        creator stack.
        r|   c                   ó   — y r   r7   r7   r    r   r   z<DelayedCallNoDebugTests.test_switchToDebug.<locals>.<lambda>v  rŠ   r    r7   c                   ó   — y©Nr{   r7   r7   r    r   r   z<DelayedCallNoDebugTests.test_switchToDebug.<locals>.<lambda>v  rŠ   r    rR   útraceback at creationN)r	   r‰   r¾   ÚassertNotInr©   r¡   s     r   Útest_switchToDebugz*DelayedCallNoDebugTests.test_switchToDebugo  s6   € ô ˜™L¨"¨b´'¼7ÁIÓNˆØˆŒØ×ÑÐ0´$°r³(Õ;r    N)rA   rB   rC   rD   r˜   r£   rÊ   r7   r    r   r¼   r¼   V  s   „ ñò%ò,ó	<r    r¼   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚDelayedCallDebugTestsr�   c                 ó\   — | j                  t        dd«       t        j                  | «       y)z 
        Turn debug on.
        r¾   TNr¿   r   s    r   r˜   zDelayedCallDebugTests.setUp€  s"   € ð 	�
‰
”; ¨Ô.Ü×Ñ˜tÕ$r    c           	      óž   — t        dt        dddiddd„ «      }dj                  t        |«      «      }| j	                  t        |«      |«       y)rš   r›   rœ   r�   rz   Nc                   ó   — yrŸ   r7   r7   r    r   r   z0DelayedCallDebugTests.test_str.<locals>.<lambda>�  rŠ   r    z\<DelayedCall 0x{:x} \[10.5s\] called=0 cancelled=0 nothing\(3, A=5\)

traceback at creation:)r	   r‰   rÂ   r    ÚassertRegexr„   )r   r¢   ÚexpectedRegexps      r   r£   zDelayedCallDebugTests.test_str‡  sK   € ô ˜œW d¨S°!¨H°d¸DÁ+ÓNˆð%ç%+¡V¬B¨r«F£^ð 	ð
 	×Ñœ˜R› .Õ1r    c           	      ó~   — t        dd„ di t        t        d„ «      }d|_        | j                  dt	        |«      «       y)a  
        If L{DelayedCall.debug} changes from C{1} to C{0} between
        L{DelayeCall.__init__} and L{DelayedCall.__repr__} then
        L{DelayedCall.__repr__} returns a string that includes the creator
        stack (we captured it, we might as well display it).
        r|   c                   ó   — y r   r7   r7   r    r   r   z<DelayedCallDebugTests.test_switchFromDebug.<locals>.<lambda>œ  rŠ   r    r7   c                   ó   — yrÇ   r7   r7   r    r   r   z<DelayedCallDebugTests.test_switchFromDebug.<locals>.<lambda>œ  rŠ   r    r   rÈ   N)r	   r‰   r¾   ÚassertInr©   r¡   s     r   Útest_switchFromDebugz*DelayedCallDebugTests.test_switchFromDebug•  s4   € ô ˜™L¨"¨b´'¼7ÁIÓNˆØˆŒØ�‰Ð-¬t°B«xÕ8r    N)rA   rB   rC   rD   r˜   r£   rÖ   r7   r    r   rÌ   rÌ   {  s   „ ñò%ò2ó	9r    rÌ   c                   ó   — e Zd ZdZd„ Zy)ÚTestSpySignalCapturingReactorza
    Subclass of ReactorBase to capture signals delivered to the
    reactor for inspection.
    c                  ó   — y)z*
        Required method, unused.
        Nr7   r   s    r   rx   z*TestSpySignalCapturingReactor.installWaker¨  rŠ   r    N)rA   rB   rC   rD   rx   r7   r    r   rØ   rØ   ¡  s   „ ñó
r    rØ   zsignal module not availablec                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚReactorBaseSignalTestszE
    Tests to exercise ReactorBase's signal exit reporting path.
    c                 óP   — t        «       }| j                  d|j                  «       y)zI
        The default value of the _exitSignal attribute is None.
        N)rØ   ÚassertIsÚ_exitSignal©r   r\   s     r   Útest_exitSignalDefaultsToNonez4ReactorBaseSignalTests.test_exitSignalDefaultsToNoneµ  s    € ô 0Ó1ˆØ�‰�d˜G×/Ñ/Õ0r    c                 ó¬   — t        «       }|j                  t        j                  d«       | j	                  t        j                  |j
                  «       y)zn
        ReactorBase's SIGINT handler saves the value of SIGINT to the
        _exitSignal attribute.
        N)rØ   ÚsigIntÚsignalÚSIGINTÚassertEqualsrÞ   rß   s     r   Útest_captureSIGINTz)ReactorBaseSignalTests.test_captureSIGINT¼  s8   € ô
 0Ó1ˆØ�‰”v—}‘} dÔ+Ø×Ñœ&Ÿ-™-¨×)<Ñ)<Õ=r    c                 ó¬   — t        «       }|j                  t        j                  d«       | j	                  t        j                  |j
                  «       y)zp
        ReactorBase's SIGTERM handler saves the value of SIGTERM to the
        _exitSignal attribute.
        N)rØ   ÚsigTermrã   ÚSIGTERMrå   rÞ   rß   s     r   Útest_captureSIGTERMz*ReactorBaseSignalTests.test_captureSIGTERMÅ  s8   € ô
 0Ó1ˆØ�‰œŸ™¨Ô-Ø×Ñœ&Ÿ.™.¨'×*=Ñ*=Õ>r    c                 óâ   — t        t        d«      st        d«      ‚t        «       }|j	                  t        j
                  d«       | j                  t        j
                  |j                  «       y)zr
        ReactorBase's SIGBREAK handler saves the value of SIGBREAK to the
        _exitSignal attribute.
        ÚSIGBREAKz$signal module does not have SIGBREAKN)Úhasattrrã   r   rØ   ÚsigBreakrì   rå   rÞ   rß   s     r   Útest_captureSIGBREAKz+ReactorBaseSignalTests.test_captureSIGBREAKÎ  sP   € ô
 ”v˜zÔ*ÜÐAÓBÐBä/Ó1ˆØ×ÑœŸ™¨$Ô/Ø×Ñœ&Ÿ/™/¨7×+>Ñ+>Õ?r    N)rA   rB   rC   rD   rà   ræ   rê   rï   r7   r    r   rÛ   rÛ   ®  s   „ ñò1ò>ò?ó
@r    rÛ   ),rD   rU   Úqueuer   Útypingr   Úunittestr   Úzope.interfacer   r   Útwisted.internet._resolverr   Útwisted.internet.baser	   r
   r   Útwisted.internet.deferr   Útwisted.internet.errorr   Útwisted.internet.interfacesr   r   r   Útwisted.internet.taskr   Útwisted.python.threadpoolr   Útwisted.trial.unittestr   r   rã   Ú_signalÚImportErrorr   r   rH   r‰   rŒ   r¼   rÌ   rØ   rÛ   r7   r    r   ú<module>rþ      s  ðñó Ý Ý Ý å &å å 3ß LÑ LÝ +Ý 1ß VÑ VÝ 'Ý 0ß 5ðÛð €Fáˆtƒ_€ñ ˆ\˜?Ó+÷,ð ,ó ,ð,ô^GF˜Hô GFòT÷o/ñ o/ôd"<Ð.°ô "<ôJ#9Ð,¨hô #9ôL
 Kô 
ñ ˆFˆ
Ð1Ó2ô)@˜Xó )@ó 3ñ)@øðg ò Ø‚Fðús   Á C ÃC"Ã!C"