
    Yf9                        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!n# e#$ r dZ!Y nw xY w 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,dS )!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dS )FakeReactorzl
    A fake reactor implementation which just supports enough reactor APIs for
    L{ThreadedResolver}.
    c                      t                       _         j        j         _        t                       _         j                                          fd _        t                       _        d S )Nc                       j         S N)_threadpoolselfs   Q/var/www/html/env/lib/python3.11/site-packages/twisted/internet/test/test_base.py<lambda>z&FakeReactor.__init__.<locals>.<lambda>1   s
    T%5     )	r   _clock	callLaterr   r   startgetThreadPoolr   _threadCallsr   s   `r   __init__zFakeReactor.__init__+   s^    gg.%<<   5555!GGr    callableargskwargsreturnNc                 @    | j                             |||f           d S r   )r%   putr   r'   r(   r)   s       r   callFromThreadzFakeReactor.callFromThread5   s(     	xv677777r    c                 P    | j                                         \  }}} ||i | d S r   )r%   get)r   fr(   r)   s       r   _runThreadCallszFakeReactor._runThreadCalls:   s7    +//114	46r    c                 8    | j                                          d S r   )r   stopr   s    r   _stopzFakeReactor._stop>   s    r    c                     d S r    r   s    r   getDelayedCallszFakeReactor.getDelayedCallsA       r    c                     d S r   r7   r   s    r   secondszFakeReactor.secondsE   r9   r    c                     d S r   r7   r-   s       r   callInThreadzFakeReactor.callInThreadI   s	     	r    c                     d S 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,857W8HJ	8	8 8 8 8
              V,57WHJ		       r    r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )ThreadedResolverTestsz(
    Tests for L{ThreadedResolver}.
    c                 0  	 dd}d}t                      }|                     |j                   g 	g }	fd}|                     t          d|           t          |          }|                    ||f          }|                    |j                   |	                                 | 
                    	|g           | 
                    |g           |j                            |dz              | 
                    |j        j        g            dS )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                 2                         |            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4	j'(((!!!D6***bT*** 	w{+++-r22222r    c                 :   d}t                      }|                     |j                   d }|                     t          d|           g }t          |          }|                    d|f          }|                     |t                     |	                    |j
                   |                                 |                     t          |          d           |j                            |dz              |                     |j        j        g            dS )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22222r    c                    d}t                      }|                     |j                   t                      fd}|                     t
          d|           g }t          |          }|                    d|f          }|                     |t                     |
                    |j                   |j                            |dz
             |                     |g            |j                            d           |                     t          |          d                               t#          d                     dS )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                 ,                                     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233333r    c                    g t          t                     G fdd                      } G d dt                    } |            } |            }|                    |           t	          t                                }|j                            |d           |j                            |d           |j                            |d           |j                            |d           |j                            |d           |                     t                    d	           |                     t          t          t                              t          gd	z             |                     dd
                    |                     dd                    |                     dd                    |                     dd                    |                     dd                    dS )zm
        L{ThreadedResolver.getHostByName} is passed L{str}, encoded using IDNA
        if required.
        c                       e Zd Zd fd	ZdS )AThreadedResolverTests.test_resolverGivenStr.<locals>.FakeResolverr7   c                 J                         |           t                      S r   )rL   r   )r   rM   timeoutsrZ   s      r   rV   zOThreadedResolverTests.test_resolverGivenStr.<locals>.FakeResolver.getHostByName   s    T"""zz!r    N)r7   )rA   rB   rC   rV   )rZ   s   r   FakeResolverrq      s3        " " " " " " " "r    rt   c                       e Zd Zd ZdS )FThreadedResolverTests.test_resolverGivenStr.<locals>.JustEnoughReactorc                     d S 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   s   
 	_	%	%	" 	" 	" 	" 	" 	" 	" 	" 	" 
&	%	"
	 	 	 	 	 	 	 	 |~~##%%%%%8::&&,,S2CDDD,,S2CDDD,,S2KLLL,,S2HIII,,S2STTTUQ'''c$..//#;;;*E!H555*E!H5553U1X>>>+U1X666:E!HEEEEEr    N)rA   rB   rC   rD   r`   rh   rn   r   r7   r    r   rH   rH   T   sa         !3 !3 !3F3 3 3:4 4 4B!F !F !F !F !Fr    rH   c                      dS )z8
    Function used by L{DelayedCallTests.test_str}.
    Nr7   r7   r    r   nothingr            r    c                   N    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dS )DelayedCallMixin
    L{DelayedCall}
    c           	      4    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                     d S r   r7   )calls    r   noopz0DelayedCallMixin._getDelayedCallAt.<locals>.noop   s    Dr    c                      d S r   r7   r7   r    r   r   z4DelayedCallMixin._getDelayedCallAt.<locals>.<lambda>   s     r    r7   N)r	   )r   timer   s      r   _getDelayedCallAtz"DelayedCallMixin._getDelayedCallAt   s/    	 	 	 4r2tT4HHHr    c                 n    |                      d          | _        |                      d          | _        dS )zb
        Create two L{DelayedCall} instanced scheduled to run at different
        times.
        r   rR   N)r   zerooner   s    r   setUpzDelayedCallMixin.setUp   s2    
 **1--	))!,,r    c           	          t          dt          dddiddd           }|                     t          |          dt	          |          fz             dS )
        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                      dS Ng      ?r7   r7   r    r   r   z+DelayedCallMixin.test_str.<locals>.<lambda>      # 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   sa     WdS!HdD++NNGGM"vvi	
 	
 	
 	
 	
r    c           	          t          dt          dddiddd           }|                     t          |          t	          |                     dS )z
        The string representation of a L{DelayedCall} instance, as returned by
        {repr}, is identical to that returned by L{str}.
           )   r   	   Nc                      dS )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  sK    
 WdS!HdD++NNR$r((+++++r    c                     | j         | j        }}|                     ||k                |                     ||k                |                     ||k                |                     ||k                dS )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  su    
 Itxcs
###t$$$%%%s#####r    c                     | j         | j        }}|                     ||k               |                     ||k               |                     ||k               |                     ||k               dS )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  sq     Itxc$$$%%%%%%s
#####r    c                     | j         | j        }}|                     ||k               |                     ||k               |                     ||k               |                     ||k               dS )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*  su    
 Itxcd
###$$$%%%s#####r    c                     | j         | j        }}|                     ||k               |                     ||k               |                     ||k               |                     ||k               dS )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  sq     Itxct$$$%%%%%%s
#####r    c                     |                      | j        | j        k               |                     | j        | j        k               |                     | j        | j        k               dS )zD
        A L{DelayedCall} instance is only equal to itself.
        N)r   r   r   r   r   s    r   test_eqzDelayedCallMixin.test_eqA  s]     	dh.///	TY.///DH,-----r    c                     |                      | j        | j        k               |                     | j        | j        k               |                     | j        | j        k               dS )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  s_     		TX-...di/000TX-.....r    N)rA   rB   rC   rD   r   r   r   r   r   r   r   r   r   r   r7   r    r   r   r      s         I I I- - -
 
 
, , ,	$ 	$ 	$
$ 
$ 
$	$ 	$ 	$
$ 
$ 
$. . ./ / / / /r    r   c                   $    e Zd ZdZd Zd Zd ZdS )DelayedCallNoDebugTestsr   c                 r    |                      t          dd           t                              |            dS )z!
        Turn debug off.
        debugFNrT   r	   r   r   r   s    r   r   zDelayedCallNoDebugTests.setUp[  s4     	

;///t$$$$$r    c           	          t          dt          dddiddd           }d                    t          |                    }|                     t          |          |           dS )r   r   r   r   rz   Nc                      dS 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  sb     WdS!HdD++NN%vbff~~ 	 	R(+++++r    c           	          t          dd di t          t          d           }d|_        |                     dt	          |                     dS )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                      d S r   r7   r7   r    r   r   z<DelayedCallNoDebugTests.test_switchToDebug.<locals>.<lambda>v      D r    r7   c                      dS Nr{   r7   r7   r    r   r   z<DelayedCallNoDebugTests.test_switchToDebug.<locals>.<lambda>v      A r    rR   traceback at creationN)r	   r   r   assertNotInr   r   s     r   test_switchToDebugz*DelayedCallNoDebugTests.test_switchToDebugo  sK     LL"b'7IINN0$r((;;;;;r    N)rA   rB   rC   rD   r   r   r   r7   r    r   r   r   V  sK         % % %, , ,	< 	< 	< 	< 	<r    r   c                   $    e Zd ZdZd Zd Zd ZdS )DelayedCallDebugTestsr   c                 r    |                      t          dd           t                              |            dS )z 
        Turn debug on.
        r   TNr   r   s    r   r   zDelayedCallDebugTests.setUp  s4     	

;...t$$$$$r    c           	          t          dt          dddiddd           }d                    t          |                    }|                     t          |          |           dS )r   r   r   r   rz   Nc                      dS 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  sb     WdS!HdD++NN%%+VBrFF^^ 	
 	R.11111r    c           	          t          dd di t          t          d           }d|_        |                     dt	          |                     dS )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                      d S r   r7   r7   r    r   r   z<DelayedCallDebugTests.test_switchFromDebug.<locals>.<lambda>  r   r    r7   c                      dS 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  sI     LL"b'7IINN-tBxx88888r    N)rA   rB   rC   rD   r   r   r   r7   r    r   r   r   {  sK         % % %2 2 2	9 	9 	9 	9 	9r    r   c                       e Zd ZdZd ZdS )TestSpySignalCapturingReactorza
    Subclass of ReactorBase to capture signals delivered to the
    reactor for inspection.
    c                     dS )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dS )ReactorBaseSignalTestszE
    Tests to exercise ReactorBase's signal exit reporting path.
    c                 X    t                      }|                     d|j                   dS )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1dG/00000r    c                     t                      }|                    t          j        d           |                     t          j        |j                   dS )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  sF    
 011v}d+++&-)<=====r    c                     t                      }|                    t          j        d           |                     t          j        |j                   dS )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  sF    
 011---&.'*=>>>>>r    c                     t          t          d          st          d          t                      }|                    t          j        d           |                     t          j        |j                   dS )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  sj    
 vz** 	CABBB/11$///&/7+>?????r    N)rA   rB   rC   rD   r   r   r   r   r7   r    r   r   r     s_         1 1 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 3 3 3 3 3 L L L L L L L L L L + + + + + + 1 1 1 1 1 1 V V V V V V V V V V ' ' ' ' ' ' 0 0 0 0 0 0 5 5 5 5 5 5 5 5 FF    FFF
 Yt__ \?++, , , , , , , ,+,^GF GF GF GF GFH GF GF GFT  o/ o/ o/ o/ o/ o/ o/ o/d"< "< "< "< "<. "< "< "<J#9 #9 #9 #9 #9,h #9 #9 #9L
 
 
 
 
K 
 
 
 F
122)@ )@ )@ )@ )@X )@ )@ 32)@ )@ )@s    A' 'A10A1