
    VhZ                        d Z ddlZddlZddlZddlmZ 	 ddl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mZ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lm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'  G d d      Z( G d de'      Z) e*ed      r# ejV                         Z, ejZ                         Z.ndxZ,Z. G d de'      Z/ G d de'      Z0 G d de'      Z1 G d de'      Z2 G d de'      Z3 G d d ejh                        Z5 G d! d"      Z6 G d# d$      Z7 G d% d&ejp                        Z9 G d' d(e'      Z: G d) d*e'      Z; G d+ d,ejx                        Z= G d- d.e$e'      Z> G d/ d0e'      Z? G d1 d2e'      Z@y# e$ r dZY jw xY w)3zU
Tests for L{twisted.application} and its interaction with
L{twisted.persisted.sob}.
    N)StringIO)skipIf)appinternetreactorsservice)backoffPolicy)defer
interfacesprotocolreactor)MemoryReactor)sob)twisted_reactors)basicwire)usage)platformType)TwistedModulesMixin)SkipTestTestCasec                       e Zd ZdZy)DummyN)__name__
__module____qualname__processName     M/home/dcms/DCMS/lib/python3.12/site-packages/twisted/test/test_application.pyr   r   #   s    Kr   r   c                   Z    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 Zd Zy)ServiceTestsc                     t        j                         }|j                  d       | j                  |j                  d       y Nhello)r   ServicesetNameassertEqualnameselfss     r    testNamezServiceTests.testName(   s.    OO			')r   c                     t        j                         }t        j                         }|j                  |       | j	                  t        |      |g       | j	                  |j                  |       y N)r   r&   MultiServicesetServiceParentr(   listparentr+   r,   ps      r    
testParentzServiceTests.testParent-   sT    OO  "	1a1#&1%r   c                 4   t        j                         }t        j                  d      }|j                  |       | j	                  t        t        j                  |            |g       | j	                  |j                  t        j                  |             y )N )r   r&   Applicationr1   r(   r2   IServiceCollectionr3   r4   s      r    testApplicationAsParentz$ServiceTests.testApplicationAsParent4   sm    OO#	1g88;<qcB7#=#=a#@Ar   c                 J   t        j                         }t        j                         }|j                  d       |j	                  |       | j                  t        |      |g       | j                  |j                  |       | j                  |j                  d      |       y r$   )	r   r&   r0   r'   r1   r(   r2   r3   getServiceNamedr4   s      r    testNamedChildzServiceTests.testNamedChild;   s{    OO  "			'	1a1#&1%**73Q7r   c                     t        j                         }t        j                         }|j                  d       |j	                  |       | j                  t        |j                  d       y )Nr%   lalar   r&   r0   r'   r1   assertRaisesRuntimeErrorr4   s      r    testDoublyNamedChildz!ServiceTests.testDoublyNamedChildD   sL    OO  "			'	1,		6:r   c                 $   t        j                         }t        j                         }|j                  d       |j	                  |       t        j                         }|j                  d       | j                  t        |j                  |       y r$   rA   r4   s      r    testDuplicateNamedChildz$ServiceTests.testDuplicateNamedChildK   sf    OO  "			'	1OO			',(:(:A>r   c                 r   t        j                         }t        j                         }|j                  |       | j	                  t        |      |g       | j	                  |j                  |       |j                          | j	                  t        |      g        | j                  |j                         y r/   )	r   r&   r0   r1   r(   r2   r3   disownServiceParentassertIsNoner4   s      r    testDisowningzServiceTests.testDisowningT   s    OO  "	1a1#&1%	a"%!((#r   c                    t        j                         }| j                  |j                         |j	                          | j                  |j                         |j                          | j                  |j                         y r/   )r   r&   assertFalserunningstartService
assertTruestopServicer*   s     r    testRunningzServiceTests.testRunning^   sU    OO#			"	#r   c                    t        j                         }t        j                         }|j                  |       | j	                  |j
                         | j	                  |j
                         |j                          | j                  |j
                         | j                  |j
                         |j                          | j	                  |j
                         | j	                  |j
                         y r/   )	r   r&   r0   r1   rL   rM   rN   rO   rP   r4   s      r    testRunningChildren1z!ServiceTests.testRunningChildren1f   s    OO  "	1##			"		"	##r   c                 ,    t        j                          fd}t        j                         }||_        ||_        t        j                         }j                  |       |j                  |       |j                          |j                          y )Nc                  <    j                   j                         y r/   )rO   rM   )r,   r+   s   r    checkRunningz7ServiceTests.testRunningChildren2.<locals>.checkRunningv   s    OOAII&r   )r   r&   rP   rN   r0   r1   )r+   rV   tr5   r,   s   `   @r    testRunningChildren2z!ServiceTests.testRunningChildren2s   sm    OO	' OO$%  "	1	1		r   c                 X   t        j                         }|j                          t        j                         }| j	                  |j
                         |j                  |       | j                  |j
                         |j                          | j	                  |j
                         y r/   )	r   r0   rN   r&   rL   rM   r1   rO   rH   )r+   r5   r,   s      r    testAddingIntoRunningz"ServiceTests.testAddingIntoRunning   st      "	OO#	1		"	#r   c                 0   t        j                         fd}|_        t        j                         }t        j                         }j	                  |       |j	                  |       |j                          | j                  j                         y )Nc                      d _         y N   )privilegedStarted)r,   s   r    pssz(ServiceTests.testPrivileged.<locals>.pss   s    "#Ar   )r   r&   privilegedStartServicer0   r1   rO   r_   )r+   r`   s1r5   r,   s       @r    testPrivilegedzServiceTests.testPrivileged   sr    OO	$ $' __  "	1
A	  "++,r   c                     t        j                         }|j                          t        j                  |      }| j	                  |j
                         | j                  |j
                         y r/   )r   r&   rN   copyrL   rM   rO   )r+   r,   rb   s      r    testCopyingzServiceTests.testCopying   sG    OO	YYq\$		"r   N)r   r   r   r-   r6   r;   r>   rD   rF   rJ   rQ   rS   rX   rZ   rc   rf   r   r   r    r"   r"   '   sD    *
&B8;?$$$$-#r   r"   getuidc                       e Zd Zd Zd Zd Zy)ProcessTestsc                     t        j                  dd      }| j                  |j                  d       | j                  |j                  d       y )N      )r   Processr(   uidgidr+   r5   s     r    testIDzProcessTests.testID   s:    OOAq!""r   c                    t        j                  d      }| j                  |j                  d       | j	                  |j
                         t        j                  d      }| j	                  |j                         | j                  |j
                  d       t        j                         }| j	                  |j                         | j	                  |j
                         y )Nrk   )ro   )r   rm   r(   rn   rI   ro   rp   s     r    testDefaultszProcessTests.testDefaults   s    OOA"!%% OO"!%% "OO!%% !%% r   c                     t        j                         }| j                  |j                         d|_        | j	                  |j                  d       y r$   )r   rm   rI   r   r(   rp   s     r    testProcessNamezProcessTests.testProcessName   s;    OO!--(0r   N)r   r   r   rq   rs   ru   r   r   r    ri   ri      s    #
	!1r   ri   c                       e Zd Zd Zd Zd Zy)InterfacesTestsc                     | j                  t        j                  j                  t        j                                      y r/   )rO   r   IService
providedByr&   r+   s    r    testServicezInterfacesTests.testService   &    ((33GOO4EFGr   c                    | j                  t        j                  j                  t        j                                      | j                  t        j
                  j                  t        j                                      y r/   )rO   r   ry   rz   r0   r:   r{   s    r    testMultiServicez InterfacesTests.testMultiService   sN    ((33G4H4H4JKL22==g>R>R>TUVr   c                     | j                  t        j                  j                  t        j                                      y r/   )rO   r   IProcessrz   rm   r{   s    r    testProcesszInterfacesTests.testProcess   r}   r   N)r   r   r   r|   r   r   r   r   r    rw   rw      s    HWHr   rw   c                   $    e Zd Zd Zd Zd Zd Zy)ApplicationTestsc                     t        j                  d       t        j                  dd       t        j                  ddd       y Nr%   rk   rl   )r   r9   r{   s    r    testConstructorz ApplicationTests.testConstructor   s2    G$GQ'GQ*r   c                    t        j                  d      }| j                  t        j                  |      j                         | j                  t        j                  |      j
                         t        j                  dd      }| j                  t        j                  |      j                  d       | j                  t        j                  |      j
                         t        j                  ddd      }| j                  t        j                  |      j                  d       | j                  t        j                  |      j
                  d       y r   )r   r9   rI   r   rn   ro   r(   r+   as     r    testProcessComponentz%ApplicationTests.testProcessComponent   s    ('**1-112'**1-112+))!,00!4'**1-112A.))!,00!4))!,00!4r   c                 X   t        j                  d      }| j                  t        j                  |      t        j                  |             | j                  t        j                  |      j                  d       | j                  t        j                  |      j                         y r$   )	r   r9   assertIsry   r:   r(   r)   rI   r3   r   s     r    testServiceComponentz%ApplicationTests.testServiceComponent   sv    (g&&q)7+E+Ea+HI))!,117;'**1-445r   c                     t        j                  d      }t        j                  |      }| j	                  |j
                  d       | j	                  |j                  d       | j                  |j                  |       y )Nr%   pickle)	r   r9   r   IPersistabler(   styler)   r   original)r+   r   r5   s      r    testPersistableComponentz)ApplicationTests.testPersistableComponent   s\    (Q(+)ajj!$r   N)r   r   r   r   r   r   r   r   r   r    r   r      s    +
	56%r   r   c                       e Zd Zd Zy)LoadingTestsc                 L   t        j                  d      }t        j                  |      }dj	                         D ]n  }|j                  |       |j                          t        j                  d|d   z   |      }| j                  t        j                  |      j                  d       p t        dd      5 }|j                  ddg       d d d        t        j                  dd	      }| j                  t        j                  |      j                  d       y # 1 sw Y   OxY w)
Nr%   source picklezhello.tar   z	hello.tacw(from twisted.application import service
+application = service.Application('hello')
python)r   r9   r   r   splitsetStylesaveloadApplicationr(   ry   r)   open
writelines)r+   r   r5   r   a1fs         r    test_simpleStoreAndLoadz$LoadingTests.test_simpleStoreAndLoad   s    (Q$**, 	AEJJuFFH((eAh)>FBW--b166@		A
 +s# 	qLL?B	 $$[(;))"-22G<	 	s   8DD#N)r   r   r   r   r   r   r    r   r      s    =r   r   c                   $    e Zd Zd Zd Zd Zd Zy)AppSupportTestsc                 L    | j                  t        j                  d             y )Nr   )rI   r   getPassphraser{   s    r    testPassphrasezAppSupportTests.testPassphrase  s    #++A./r   c                    t        j                  d      }dddd}dj                         D ]  }|j                         }d|ddij	                  ||      <   t        j                  |      j                  |       t        j                  |      j                  d       t        j                  |d      }| j                  t        j                  |      j                  d        |j                         }d|d	<   t        dd
      5 }|j                  ddg       ddd       t        j                  |d      }| j                  t        j                  |      j                  d       y# 1 sw Y   OxY w)zL
        Test loading an application file in different dump format.
        r%   N)filesourcer   r   helloapplicationr   r   filenamer   r   r   r   )r   r9   r   re   getr   r   r   r   r   getApplicationr(   ry   r)   r   r   )r+   r   
baseconfigr   configr   r   s          r    testLoadApplicationz#AppSupportTests.testLoadApplication  sQ    ("ddC
$**, 	AE__&F;MFHf%))%78Q((/Q$$.@$A##FD1BW--b166@	A "-x$c* 	aLL?B	 -))"-22G<	 	s   E))E2c           
         t        j                  d      }dj                         D ]  }dj                         D ]  }t        j                  |      j                  |       t        j                  |      j                  d       t        j                  d|d d|d       t        j                  d|      }| j                  t        j                  |      j                  d         y )Nr@   r   converttestr   zconverttest.outr   )r   r9   r   r   r   r   r   r   convertStyler   r(   ry   r)   )r+   applinstyleoutstyleappl2s        r    test_convertStylez!AppSupportTests.test_convertStyle  s    ""6*&,,. 	GG+113 G  &//8  &++]+C  !7D2CXq  //0A8L  !1!1%!8!=!=vFG	Gr   c                     t        j                  d      }t        j                  |d       | j	                  t        j
                  |      j                         y )Nr@   r   )r   r9   r   startApplicationrO   ry   rM   )r+   r   s     r    test_startApplicationz%AppSupportTests.test_startApplication)  s?    ""6*T1%((.667r   N)r   r   r   r   r   r   r   r   r   r    r   r      s    0=2
G8r   r   c                       e Zd Zd Zd Zd Zy)Fooc                 :    | j                   j                  d       y )Ns   lalala
)	transportwriter{   s    r    connectionMadezFoo.connectionMade0  s    ]+r   c                 Z    || j                   _        | j                  j                          y r/   )factoryliner   loseConnection)r+   r   s     r    lineReceivedzFoo.lineReceived3  s     %%'r   c                 v    | j                   j                  j                  | j                   j                         y r/   )r   dcallbackr   r+   reasons     r    connectionLostzFoo.connectionLost7  s"     1 12r   N)r   r   r   r   r   r   r   r   r    r   r   /  s    ,(3r   r   c                       e Zd ZdZd Zd Zy)DummyAppNc                 6    || j                   |j                  <   y r/   servicesr)   r+   r   s     r    
addServicezDummyApp.addService>  s    &-gll#r   c                 2    | j                   |j                  = y r/   r   r   s     r    removeServicezDummyApp.removeServiceA  s    MM',,'r   )r   r   r   r   r   r   r   r   r    r   r   ;  s    K.(r   r   c                       e Zd Zd Zd Zy)TimerTargetc                     g | _         y r/   )lr{   s    r    __init__zTimerTarget.__init__F  s	    r   c                 :    | j                   j                  |       y r/   )r   append)r+   whats     r    r   zTimerTarget.appendI  s    dr   N)r   r   r   r   r   r   r   r    r   r   E  s    r   r   c                       e Zd Zd Zy)TestEchoc                 :    | j                   j                  d       y NT)r   r   r   s     r    r   zTestEcho.connectionLostN  s    r   N)r   r   r   r   r   r   r    r   r   M  s    r   r   c                       e Zd Zd Zd Zd Zd Z e ej                  e
d       d      d        Zd Z e ej                  e
d       d      d	        Z e ej                  e
d       d      d
        Zd Zd Zd Zd Zd Zd Zd Zd Zy)InternetTestsc                    t        j                         j                          t        j                         }t
        |_        t        j                         t
        _        t        j                  d|      }|j                         |j                  j                         j                  }t        j                         }t        j                         |_        t         |_        d |_        t        j$                  d||      j                         |j                  j'                  | j(                  d       |j                  j'                  fd       |j                  j'                  d        |j                  S )Nr   	127.0.0.1   lalalac                 $    j                         S r/   rP   xr,   s    r    <lambda>z'InternetTests.testTCP.<locals>.<lambda>b       r   c                 "    t         j                  S r/   r   r   r   s    r    r   z'InternetTests.testTCP.<locals>.<lambda>c  
    

 r   )r   r0   rN   r   ServerFactoryr   r
   Deferredr   r   	TCPServerr1   _portgetHostportClientFactoryr   r   	TCPClientaddCallbackr(   )r+   r   rW   numr,   s       @r    testTCPzInternetTests.testTCPS  s     "	((*#^^%
q'*	1ggoo$$((*NN$	;W5FFqI		d..	:		78		23yyr   c                    t        j                  t        d      st        d      t	        j
                         t        j                  d      }|j                          |j                  j                         j                  | j                  d       fd}t        j                  |j                        j!                  |      S )z
        Test L{internet.UDPServer} with a random port: starting the service
        should give it valid port, and stopService should free it so that we
        can start a server on the same port again.
        Nz)This reactor does not support UDP socketsr   c                 p    t        j                        }|j                          |j                         S r/   )r   	UDPServerrN   rP   )ignoredrW   r   r5   s     r    onStopz&InternetTests.test_UDP.<locals>.onStopt  s+    ""3*ANN==?"r   )r   IReactorUDPr   r   r   DatagramProtocolr   r  rN   r   r   r   assertNotEqualr
   maybeDeferredrP   r   )r+   rW   r  r   r5   s      @@r    test_UDPzInternetTests.test_UDPf  s     %%gt4FGG%%'q!$	ggoo$$C#	#
 ""1==1==fEEr   c                     t        j                         }t        |_         t        j                         t        _        t        j                  d|      d_        j                          j                  j                         j                  }t        j                         }t        j                         |_        t        |_         d |_        t        j                   d||      j#                          |j
                  j%                  | j&                  d       |j
                  j%                  fd       |j
                  j%                  fd       |j
                  j%                  d        |j
                  S )Nr   r^   r   r   c                 $    j                         S r/   r   )r   cs    r    r   z.InternetTests.testPrivileged.<locals>.<lambda>  r   r   c                 $    j                         S r/   r   r   rW   s    r    r   z.InternetTests.testPrivileged.<locals>.<lambda>  r   r   c                 "    t         j                  S r/   r   r   s    r    r   z.InternetTests.testPrivileged.<locals>.<lambda>  r   r   )r   r   r   r
   r   r   r   r   
privilegedra   r   r   r   r   r   r   r   rN   r   r(   )r+   r   r   r  rW   s      @@r    rc   zInternetTests.testPrivileged{  s   ((*#^^%
q'*	  "ggoo$$((*NN$	{C9			d..	:		78		78		23yyr   c                    t        j                         }t        j                  |_         t	        j
                  d|      }|j                          |j                  j                         j                  }|j                          t        j                         t        j                         }fd|_        t	        j                  d||      }|j                          S )Nr   c                  &    j                  d       S r/   r   argsr   s    r    r   z<InternetTests.testConnectionGettingRefused.<locals>.<lambda>      qzz$7G r   r   )r   r   r   Echor   r   rN   r   r   r   rP   r
   r   r   clientConnectionFailedr   )r+   r   rW   r   r  r   s        @r    testConnectionGettingRefusedz*InternetTests.testConnectionGettingRefused  s    ((*99q'*	ggoo$$	NN((*)G&{C9	r   Nz1This reactor does not support UNIX domain socketsc                     t        j                         j                          t        j                         }t
        |_        t        j                         t
        _        t        j                  d|      }|j                         t        j                         }t        |_        t        j                         |_        d |_        t        j                  d|      j                         |j                  j!                  | j"                  d       |j                  j!                  fd       |j                  j!                  d        |j                  j!                  | j$                  |       |j                  S )Necho.sktr   c                 $    j                         S r/   r   r   s    r    r   z(InternetTests.testUNIX.<locals>.<lambda>  r   r   c                 "    t         j                  S r/   r   r   s    r    r   z(InternetTests.testUNIX.<locals>.<lambda>  r   r   )r   r0   rN   r   r   r   r
   r   r   r   
UNIXServerr1   r   r   r   
UNIXClientr   r(   _cbTestUnix)r+   r   rW   r,   s      @r    testUNIXzInternetTests.testUNIX  s      "	((*#^^%

G4	1((*NN$	J0AA!D		d..	:		78		23		d..;yyr   c                 v   t        j                         t        _        d |_        t        j                         |_        j                          |j                  j                  | j                  d       |j                  j                  fd       |j                  j                  d        |j                  S )Nr   c                 $    j                         S r/   r   r   s    r    r   z+InternetTests._cbTestUnix.<locals>.<lambda>  r   r   c                 "    t         j                  S r/   r   r   s    r    r   z+InternetTests._cbTestUnix.<locals>.<lambda>  r   r   )r
   r   r   r   r   rN   r   r(   )r+   r  r   r,   s      `r    r!  zInternetTests._cbTestUnix  sz    ^^%
NN$				d..	:		78		23yyr   c                    t        j                         }t        j                  |_         t	        j
                  d|      }|j                          | j                  |j                  d        t        j                  |      }| j                  |j                         |j                          | j                  |j                         | j                  |j                         t        j                         }t        j                  |_         t	        j                  d|      }|j                          | j                  |j                   d        t        j                  |      }| j                  |j                          |j                          | j                  |j                          | j                  |j                         y )Nr  )r   r   r   r  r   r  rN   failIfIdenticalr   re   rI   rP   rL   rM   r   r   _connection)r+   r   rW   t1s       r    testVolatilezInternetTests.testVolatile  s0   
 ((*99
G4	QWWd+YYq\"((#	!''"#((*99
G4	Q]]D1YYq\"..)	!--(#r   c                    t        j                         }t        j                  |_         t	        j
                  d|      }|j                          |j                          | j                  |j                         t        j                         }t        j                         fd|_        t        j                  d|       S )Nr  c                  &    j                  d       S r/   r  r  s    r    r   z2InternetTests.testStoppingServer.<locals>.<lambda>  r  r   )r   r   r   r  r   r  rN   rP   rL   rM   r   r
   r   r  r   connectUNIX)r+   r   rW   r   s      @r    testStoppingServerz InternetTests.testStoppingServer  s    
 ((*99
G4		#((*NN)G&J0r   c                 $   t               }t        j                  d|j                  d      }|j	                          t        j                  |      }|j                          t        j                  |      }| j                  |j                         y )Nr^   r%   )r   r   TimerServicer   rN   r   dumpsrP   loadsrL   rM   )r+   targett0r,   rW   s        r    testPickledTimerzInternetTests.testPickledTimer  sb    ""1fmmW=
LL
LLO#r   c                     t        j                         t        j                  dd       j                  fd}|_        j                          j                  fd       j                   fd       S )Nr^   c                      ddz  S )Nr^   r   r   r   r   r    r   z/InternetTests.testBrokenTimer.<locals>.<lambda>  s
    Q!V r   c                 8     |        j                  d        y r/   r  )whyr   	oldFaileds    r    _failedz.InternetTests.testBrokenTimer.<locals>._failed  s    cNJJtr   c                     j                   S r/   r   r  s    r    r   z/InternetTests.testBrokenTimer.<locals>.<lambda>  s     r   c                     j                  t        gj                  t              D cg c]  }|j                  j                   c}      S c c}w r/   )r(   ZeroDivisionErrorflushLoggedErrorsvalue	__class__)r   or+   s     r    r   z/InternetTests.testBrokenTimer.<locals>.<lambda>  s?    d&&"#,0,B,BCT,UVq""V Vs   A
)r
   r   r   r0  r;  rN   r   )r+   r;  r   r:  rW   s   ` @@@r    testBrokenTimerzInternetTests.testBrokenTimer  sg    NN!!!^4II		 			-.		
 r   c           	      0   g d}|dd D ]2  } t        t        d|z         t        d      r"|j                  |       4 |D ]  }dD ]  }|dk(  r|dk(  r|dk(  r|dk(  r| j	                  t        t        ||z                t        t        ||z         j                  }dd	d|   }| j	                  t        t        ||z         xs |d	k(  xr |dk(          t        t        ||z                }| j                  t        j                  |      |         y)
z
        L{twisted.application.internet} dynamically defines a set of
        L{service.Service} subclasses that in general have corresponding
        reactor.listenXXX or reactor.connectXXX calls.
        )TCPUNIXSSLUDPUNIXDatagram	MulticastNIReactor)ServerClientrJ  rM  rH  listenconnect)getattrr   r   removerO   hasattrr   methodr(   r   ry   )r+   transtransiderS  prefixrB  s          r    test_everythingTherez"InternetTests.test_everythingThere
  s#    K!H 	#D97:zD'89'4HT"	#  	9D, 9;&48+;5=TX%5$+ >? 4$;7>>$,	B4HGVf_5 A)+?% 3GHdTk24  !1!1!!4a89	9r   c                 t    t         j                  D ]%  }| j                  t        t         |      | d       ' y)z
        L{twisted.application.internet} dynamically defines L{service.Service}
        subclasses. This test ensures that the subclasses exposed by C{__all__}
        are valid attributes of the module.
        z1 not importable from twisted.application.internetN)r   __all__rO   rR  )r+   clss     r    test_importAllzInternetTests.test_importAll$  s:     ## 	COO#&%HI	r   c                     t               }t               }t        j                  d||      }|j	                          | j                  |j                  j                         dd d|f       y)z
        L{internet._AbstractServer} supports a C{reactor} keyword argument
        that can be used to parametrize the reactor used to listen for
        connections.
          r   N   )r   objectr   r   rN   r(   
tcpServerspopr+   r   r   rW   s       r    #test_reactorParametrizationInServerz1InternetTests.test_reactorParametrizationInServer0  sZ      /(tWg>	++//1"15gGr   c                     t               }t        j                         }t        j                  dd||      }|j                          | j                  |j                  j                         dd dd|f       y)z
        L{internet._AbstractClient} supports a C{reactor} keyword arguments
        that can be used to parametrize the reactor used to create new client
        connections.
        r   r^  r_  N   )	r   r   r   r   r   rN   r(   
tcpClientsrc  rd  s       r    #test_reactorParametrizationInClientz1InternetTests.test_reactorParametrizationInClient=  sf      /((*{D'7K	++//1"15T77STr   c                    t               }t        j                         }t        j                  d||      }|j                          | j                  |j                  j                         dd d|f       |j                          |j                          | j                  |j                  j                         dd d|f       y)z
        Like L{test_reactorParametrizationInServer}, but stop and restart the
        service and check that the given reactor is still used.
        r^  r_  Nr`  )
r   r   Factoryr   r   rN   r(   rb  rc  rP   rd  s       r    0test_reactorParametrizationInServerMultipleStartz>InternetTests.test_reactorParametrizationInServerMultipleStartJ  s    
  /""$tWg>	++//1"15gG		++//1"15gGr   c                    t               }t        j                         }t        j                  dd||      }|j                          | j                  |j                  j                         dd dd|f       |j                          |j                          | j                  |j                  j                         dd dd|f       y)z
        Like L{test_reactorParametrizationInClient}, but stop and restart the
        service and check that the given reactor is still used.
        r   r^  r_  Nrg  )
r   r   r   r   r   rN   r(   rh  rc  rP   rd  s       r    0test_reactorParametrizationInClientMultipleStartz>InternetTests.test_reactorParametrizationInClientMultipleStartY  s    
  /((*{D'7K	++//1"15T77ST		++//1"15T77STr   )r   r   r   r   r
  rc   r  r   r   IReactorUNIXr   r"  r!  r*  r.  r5  rC  rX  r\  re  ri  rl  rn  r   r   r    r   r   R  s    &F*( #J##GT22;	* #J##GT22;$	$. #J##GT22;	$(94
HUHUr   r   c                   $    e Zd Zd Zd Zd Zd Zy)TimerBasicTestsc                 8    t        j                         }t        j                  d|j                  d       _         j
                  j                          |j                   j                  d       |j                   fd       |j                   fd       |S )Nr^   r%   c                 8    j                   j                         S r/   rW   rP   r   r+   s    r    r   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>o       2 2 4 r   c                 N    j                  j                  j                        S r/   )rL   rW   rM   ru  s    r    r   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>p  s     0 0 @ r   )	r
   r   r   r0  r   rW   rN   r   r(   )r+   r   s   ` r    testTimerRunszTimerBasicTests.testTimerRunsj  sl    NN&&q!**g>	d&&0	45	@Ar   c                 6    | j                   j                         S r/   rt  r{   s    r    tearDownzTimerBasicTests.tearDowns  s    vv!!##r   c                 f    t        j                         }t        j                         df|dfgfd}t        j                  d|       _         j                  j                           fd} fd} fd}|j                  |       |j                  |       |j                  |       |S )Nbarfooc                  N    j                         \  } }| j                  |       y r/   )rc  r   )r   argworks     r    triggerz1TimerBasicTests.testTimerRestart.<locals>.trigger|  s    XXZFAsJJsOr   r^   c                 \    j                  | d       j                  j                         S )Nr}  r(   rW   rP   resultr+   s    r    onFirstResultz7TimerBasicTests.testTimerRestart.<locals>.onFirstResult  s&    VU+66%%''r   c                     j                  j                  j                         j                  j                          S r/   )rL   rW   rM   rN   )r  d2r+   s    r    onFirstStopz5TimerBasicTests.testTimerRestart.<locals>.onFirstStop  s.    TVV^^,FF!Ir   c                 ^    j                  | d       j                  j                          y )Nr|  r  r  s    r    onSecondResultz8TimerBasicTests.testTimerRestart.<locals>.onSecondResult  s#    VU+FF r   )r
   r   r   r0  rW   rN   r   )r+   d1r  r  r  r  r  r  s   `     @@r    testTimerRestartz TimerBasicTests.testTimerRestartv  s    ^^^^Ub%[)	 &&q'2	(	
	! 	}%
{#
~&	r   c                     g fd}t        j                         }t        j                  d|dd|       _         j                  j                          |j                   j                  dgdz         |j                   fd       |S )Nc                 h    j                  |        t              |k(  r|j                         y y r/   )r   lenr   )datanumberr   r   s      r    r  z/TimerBasicTests.testTimerLoops.<locals>.trigger  s*    HHTN1v

1  r   g{Gz?r%   
   c                 8    j                   j                         S r/   rt  ru  s    r    r   z0TimerBasicTests.testTimerLoops.<locals>.<lambda>  rv  r   )r
   r   r   r0  rW   rN   r   r(   )r+   r  r   r   s   `  @r    testTimerLoopszTimerBasicTests.testTimerLoops  sq    	
 NN&&tWgr1E	d&&	B7	45r   N)r   r   r   rx  rz  r  r  r   r   r    rq  rq  i  s    $>r   rq  c                       e Zd ZdZd Zy)FakeReactorz6
    A fake reactor with a hooked install method.
    c                 X    t        j                  j                  | g|i | || _        y)zv
        @param install: any callable that will be used as install method.
        @type install: C{callable}
        N)r   Reactorr   install)r+   r  r  kwargss       r    r   zFakeReactor.__init__  s)    
 	!!$888r   N)r   r   r   __doc__r   r   r   r    r  r    s    r   r  c                   `    e Zd ZdZd Zd ZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zy)PluggableReactorTestsz:
    Tests for the reactor discovery/inspection APIs.
    c                 t    g | _         g | _        t        j                  | _        | j
                  t        _        y)aI  
        Override the L{reactors.getPlugins} function, normally bound to
        L{twisted.plugin.getPlugins}, in order to control which
        L{IReactorInstaller} plugins are seen as available.

        C{self.pluginResults} can be customized and will be used as the
        result of calls to C{reactors.getPlugins}.
        N)pluginCallspluginResultsr   
getPluginsoriginalFunction_getPluginsr{   s    r    setUpzPluggableReactorTests.setUp  s0      ( 3 3"..r   c                 .    | j                   t        _        y)z>
        Restore the original L{reactors.getPlugins}.
        N)r  r   r  r{   s    r    rz  zPluggableReactorTests.tearDown  s     #33r   Nc                 f    | j                   j                  ||f       t        | j                        S )zy
        Stand-in for the real getPlugins method which records its arguments
        and returns a fixed result.
        )r  r   r2   r  )r+   	interfacepackages      r    r  z!PluggableReactorTests._getPlugins  s.    
 	G 45D&&''r   c                 d   d}t         dz   }d}t        j                  |||      g| _        t        j                         }| j                  | j                  t        j                  dfg       |D ]/  }|j                  |k(  s| j                  |j                  |        y | j                  d       y)zP
        Test that reactor plugins are returned from L{getReactorTypes}
        fakereactortestz.fakereactordescriptionNz6Reactor plugin not present in getReactorTypes() result)r   r   r  r  getReactorTypesr(   r  IReactorInstaller	shortNamer  fail)r+   r)   r  r  reactorTypesrs         r    test_getPluginReactorTypesz0PluggableReactorTests.test_getPluginReactorTypes  s     !^+#&..tWkJK//1))X-G-G,N+OP 	PA{{d"  <	P
 IINOr   c                     g fd}t        |dt        d      }d|i}| j                  |       t        j                  ddd      }|j                          | j                  dg       y)zy
        Test that L{reactors.Reactor.install} loads the correct module and
        calls its install attribute.
        c                  (     j                  d       y r   r   	installeds   r    r  z?PluggableReactorTests.test_reactorInstallation.<locals>.install      T"r   r  	describedfakereactorTN)r  r   replaceSysModulesr   r  r  r(   )r+   r  fakeReactormodules	installerr  s        @r    test_reactorInstallationz.PluggableReactorTests.test_reactorInstallation  sm    
 		# "'+<hT$k2w'$$]4E{S	TF+r   c                     g fd}d}t         }d}t        ||||      g| _        t        j                  |       | j                  dg       y)zu
        Test that the L{reactors.installReactor} function correctly installs
        the specified reactor.
        c                  (     j                  d       y r   r  r  s   r    r  z:PluggableReactorTests.test_installReactor.<locals>.install  r  r   r  r  TNr   r  r  r   installReactorr(   )r+   r  r)   r  r  r  s        @r    test_installReactorz)PluggableReactorTests.test_installReactor  sV    
 		# !#)'4+NO%TF+r   c                      t                fd}d}t        }d}t        ||||      g _        t	        j
                  |      } j                  |       y)zt
        Test that the L{reactors.installReactor} function correctly returns
        the installed reactor.
        c                  8    ddl m}  j                  | d       y )Nr   )r   r   )twistedr   patch)r   r   r+   s    r    r  zHPluggableReactorTests.test_installReactorReturnsReactor.<locals>.install  s    (JJxG4r   r  r  N)ra  r   r  r  r   r  r   )r+   r  r)   r  r  r  r   s   `     @r    !test_installReactorReturnsReactorz7PluggableReactorTests.test_installReactorReturnsReactor	  sV    
 (	5
 !#)'4+NO++D1	i)r   c                     g fd}d}t         }d}t        ||||      }t        d d||      }||g| _        t        j                  |       | j                  dg       y)z
        Test that the L{reactors.installReactor} function correctly installs
        the specified reactor when there are multiple reactor plugins.
        c                  (     j                  d       y r   r  r  s   r    r  zIPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.install#  r  r   r  r  c                       y r/   r   r   r   r    r   zJPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.<lambda>*      r   otherreactorTNr  )r+   r  r)   r  r  r  otherReactorr  s          @r    "test_installReactorMultiplePluginsz8PluggableReactorTests.test_installReactorMultiplePlugins  sm    
 		# !#!'4+F"<+V*K8%TF+r   c                 p    g | _         | j                  t        j                  t        j                  d       y)z
        Test that L{reactors.installReactor} raises L{reactors.NoSuchReactor}
        when asked to install a reactor which it cannot find.
        somereactorN)r  rB   r   NoSuchReactorr  r{   s    r    test_installNonExistentReactorz4PluggableReactorTests.test_installNonExistentReactor/  s-    
  ""H$;$;]	
r   c                     d }d}t         }d}t        ||||      g| _        | j                  t        t
        j                  |       y)z
        Test that L{reactors.installReactor} raises an exception when asked to
        install a reactor which doesn't work in this environment.
        c                      t        d      )NMissing foo barImportErrorr   r   r    r  zFPluggableReactorTests.test_installNotAvailableReactor.<locals>.install?  s    /00r   r  r  N)r   r  r  rB   r  r   r  )r+   r  r)   r  r  s        r    test_installNotAvailableReactorz5PluggableReactorTests.test_installNotAvailableReactor9  sF    	1 !#)'4+NO+x'>'>Er   c                 r   g dd G fddt         j                  t        j                        }fd}t	        |dt
        d      g| _         |       }|j                  g d       | j                  d	          | j                  j                        d
       | j                  |d   d       y)zx
        Test that the reactor selected is installed as soon as possible, ie
        when the option is parsed.
        zreactor installedzsubcommands loadedc                   $    e Zd Ze fd       Zy)QPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptionsc                 <     j                         dd  fddfgS )N
subcommandc                       S r/   r   r{   s   r    r   zoPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommands.<locals>.<lambda>U  s    T r   ztest subcommandr  )r+   SUBCOMMAND_EVENTexecuteds   `r    subCommandsz]PluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommandsR  s#     01%t\;LMNNr   N)r   r   r   propertyr  )r  r  s   r    ReactorSelectionOptionsr  Q  s    O Or   r  c                  (    j                          y r/   r  )INSTALL_EVENTr  s   r    r  zAPluggableReactorTests.test_reactorSelectionMixin.<locals>.installW  s    OOM*r   r  r  z	--reactorr  r  r   r^   r   N)
r   Optionsr   ReactorSelectionMixinr  r   r  parseOptionsr(   count)r+   r  r  optionsr  r  r  s       @@@r    test_reactorSelectionMixinz0PluggableReactorTests.test_reactorSelectionMixinH  s    
 +/	OemmS5N5N 	O	+ !2HkJ
 *+KL!m46:+->?r   c                 d    G d dt         j                  t        j                        }g | _         |       }t               |_        | j                  t         j                  |j                  g d      }| j                  d|j                  d          | j                  d|j                  d          y)z
        Test that the usage mixin exits when trying to use a non existent
        reactor (the name not matching to any reactor), giving an error
        message.
        c                       e Zd Zy)\PluggableReactorTests.test_reactorSelectionMixinNonExistent.<locals>.ReactorSelectionOptionsNr   r   r   r   r   r    r  r  k      r   r  r  r  r   help-reactorsN)r   r  r   r  r  r   messageOutputrB   
UsageErrorr  assertInr  )r+   r  r  es       r    %test_reactorSelectionMixinNonExistentz;PluggableReactorTests.test_reactorSelectionMixinNonExistentd  s    	emmS5N5N 	  )+ (
  :

 	'3oqvvay1r   c                     G d dt         j                  t        j                        }dfd}d}t        }d}t        ||||      g| _         |       }t               |_        | j                  t         j                  |j                  g d      }| j                  |j                  d          | j                  d	|j                  d          y
)z
        Test that the usage mixin exits when trying to use a reactor not
        available (the reactor raises an error at installation), giving an
        error message.
        c                       e Zd Zy)]PluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.ReactorSelectionOptionsNr  r   r   r    r  r    r  r   r  r  c                      t               r/   r  )messages   r    r  zMPluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.install  s    g&&r   r  r  r  r   r  N)r   r  r   r  r   r  r  r   r  rB   r  r  r  r  )	r+   r  r  r)   r  r  r  r  r  s	           @r    &test_reactorSelectionMixinNotAvailablez<PluggableReactorTests.test_reactorSelectionMixinNotAvailablez  s    	emmS5N5N 	 $	' !#)'4+NO)+ (
  :

 	gqvvay)oqvvay1r   r/   )r   r   r   r  r  rz  r  r  r  r  r  r  r  r  r  r  r   r   r   r    r  r    sK    /4(P&,","*&,&
F@82,2r   r  c                       e Zd ZdZd Z eed      d        Z ee d      d        Z ee	dk7  d      d	        Z
 ee	dk(  d
      d        Zd Zy)HelpReactorsTestsz6
    --help-reactors lists the available reactors
    c                    t        j                         | _        t               | j                  _        | j                  t        | j                  j                         | j                  j                  j                         | _	        y)z3
        Get the text from --help-reactors
        N)
r   r  r  r   r  rB   
SystemExitopt_help_reactorsgetvaluer  r{   s    r    r  zHelpReactorsTests.setUp  sV     002%-Z"*dll&D&DE||11::<r   z$Not applicable, asyncio is availablec                     | j                  t        j                  j                  | j                         | j                  dt        j                  j
                  z   | j                         y)zX
        --help-reactors should NOT display the asyncio reactor on Python < 3.4
        !N)r  r   asyncior  r  r  r{   s    r    test_lacksAsyncIOz#HelpReactorsTests.test_lacksAsyncIO  sG    
 	&..::DLLIc,44>>>Mr   zasyncio library not availablec                     | j                  t        j                  j                  | j                         | j                  dt        j                  j                  z   | j                         y)zU
        --help-reactors should display the asyncio reactor on Python >= 3.4
        r  N)r  r   r	  r  r  assertNotInr  r{   s    r    test_hasAsyncIOz!HelpReactorsTests.test_hasAsyncIO  sI    
 	&..::DLLI/77AAA4<<Pr   win32zTest only applicable on Windowsc                     | j                  t        j                  j                  | j                         | j                  dt        j                  j                  z   | j                         y)zL
        --help-reactors should display the iocp reactor on Windows
        r  N)r  r   iocpr  r  r  r  r{   s    r    test_iocpWin32z HelpReactorsTests.test_iocpWin32  sI    
 	&++77F/44>>>Mr   zTest not applicable on Windowsc                     | j                  t        j                  j                  | j                         | j                  dt        j                  j
                  z   | j                         y)zP
        --help-reactors should NOT display the iocp reactor on Windows
        r  N)r  r   r  r  r  r  r{   s    r    test_iocpNotWin32z#HelpReactorsTests.test_iocpNotWin32  sG    
 	&++77Fc,11;;;T\\Jr   c                     d }t        j                         }||_        t               |_        | j                  t        |j                         |j                  j                         }| j                  d|       y)z>
        --help-reactors with only supported reactors
        c               3   0   K   t         j                   y wr/   )r   defaultr   r   r    r  zEHelpReactorsTests.test_onlySupportedReactors.<locals>.getReactorTypes  s     "***s   zreactors not availableN)
r   r  _getReactorTypesr   r  rB   r  r  r  r  )r+   r  r  r  s       r    test_onlySupportedReactorsz,HelpReactorsTests.test_onlySupportedReactors  sd    
	+ ++-#2  (
*g&?&?@''00217;r   N)r   r   r   r  r  r   r	  r
  r  r   r  r  r  r   r   r    r  r    s    = G;<N =N K89Q :Q LG#%FGN HN LG#%EFK GK<r   r  c                   "    e Zd ZdZd Zd Zd Zy)BackoffPolicyTestsz@
    Tests of L{twisted.application.internet.backoffPolicy}
    c                    t        dddd       }| j                   |d      d       | j                   |d      d	       | j                   |d
      d       | j                   |d      d       | j                   |d      d       y)zI
        Test that L{backoffPolicy()} calculates expected values
              ?      N@      ?c                       yr]   r   r   r   r    r   zCBackoffPolicyTests.test_calculates_correct_values.<locals>.<lambda>  r  r   jitterr   r`  r^   g      @r  g     UM@   =   d   N)r	   assertAlmostEqualr(   r+   pols     r    test_calculates_correct_valuesz1BackoffPolicyTests.test_calculates_correct_values  sx     Cs9=s1vq)s1vs+s2w6R"%S2&r   c                     t        dddd       }| j                   |d      d       | j                   |d      d       y	)
z
        L{backoffPolicy()} does not fail for large values of the attempt
        parameter. In previous versions, this test failed when attempt was
        larger than 1750.

        See https://twistedmatrix.com/trac/ticket/9476
        r  r  r  c                       yr]   r   r   r   r    r   zLBackoffPolicyTests.test_does_not_overflow_on_high_attempts.<locals>.<lambda>  r  r   r     r#  i@B Nr	   r(   r&  s     r    'test_does_not_overflow_on_high_attemptsz:BackoffPolicyTests.test_does_not_overflow_on_high_attempts  s<     Cs9=TB'Wr*r   c                 T    t        dddd       }| j                   |d      d       y)	z
        Even with unusual parameters, any L{OverflowError} within
        L{backoffPolicy()} will be caught and L{maxDelay} will be returned
        instead
        r  r  g    _Bc                       yr]   r   r   r   r    r   zSBackoffPolicyTests.test_does_not_overflow_with_large_factor_value.<locals>.<lambda>  r  r   r   r+  r#  Nr,  r&  s     r    .test_does_not_overflow_with_large_factor_valuezABackoffPolicyTests.test_does_not_overflow_with_large_factor_value  s(     CtI>TB'r   N)r   r   r   r  r(  r-  r0  r   r   r    r  r    s    	'
+(r   r  )Ar  re   osr   ior   r	  r  unittestr   twisted.applicationr   r   r   r   twisted.application.internetr	   twisted.internetr
   r   r   r   twisted.internet.testingr   twisted.persistedr   twisted.pluginsr   twisted.protocolsr   r   twisted.pythonr   twisted.python.runtimer   #twisted.python.test.modules_helpersr   twisted.trial.unittestr   r   r   r"   rR  rg   curuidgetgidcurgidri   rw   r   r   r   LineReceiverr   r   r   r  r   r   rq  r  r  r  r  r  r   r   r    <module>rC     s|    	    @ @ 6 A A 2 ! , )   / C 5 x#8 x#v 2xRYY[FRYY[FFV18 10	Hh 	H%x %>=8 =(,8h ,8^	3%

 	3( ( tyy 
TUH TUn9h 9x("" c2/ c2L;< ;<|#( #(M  Gs   E: :FF