
    Vh9                        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   O/home/dcms/DCMS/lib/python3.12/site-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,857WW8HJ		8	8
   V,57WW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    OOD!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''(!D6*bT* 	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,"";
;1n-	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,"";
;1n-	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:&,,S2CD,,S2CD,,S2KL,,S2HI,,S2STUQ'c$./#;*E!H5*E!H53U1X>+U1X6:E!HEr    N)rA   rB   rC   rD   r`   rh   rn   r   r7   r    r   rH   rH   T   s    !3F3:4B!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r2tT4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     WdS!HdD+NGM"vi	
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    
 WdS!HdD+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[    
 IItxxc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     IItxxc$%%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[    
 IItxxc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     IItxxc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     	dhh./		TYY./DHH,-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     			TXX-.dii/0TXX-.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     WdS!HdD+N%vb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'7I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     WdS!HdD+N%%+VBrF^ 	
 	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'7IN-tBx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dG//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    
 vz*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   typing_extensionsr   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 #9L
K 
 F
12)@X )@ 3)@g  Fs    C C"!C"