
    h3                     <   S r SSKrSSKrSSKrSSKJr  SSKJrJrJ	r	J
r
JrJr  SSKJrJrJrJr  SSKJr   SSKr\" \	R,                  " \S5      (       + S5       " S S	\5      5       r " S
 S5      r\" \	R,                  " \S5      (       + S5       " S S\5      5       r " S S\5      rSr " S S\
R8                  5      r\" \	R,                  " \S5      (       + S5      \" \	R<                  " \S5      (       + S5       " S S\5      5       5       rg! \ a     Nf = f)zC
Test methods in twisted.internet.threads and reactor thread APIs.
    N)skipIf)defererror
interfacesprotocolreactorthreads)failurelog
threadable
threadpool)TestCasez(No thread support, nothing to test here.c                   T    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)ReactorThreadsTests   z&
Tests for the reactor threading API.
c                    [         R                  " S5        U R                  [         R                  R                  S5        [         R                  " S5        U R                  [         R                  R                  S5        g)z*
Try to change maximum number of threads.
"      N)r   suggestThreadPoolSizeassertEqualr   maxselfs    `/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/test/test_threads.pytest_suggestThreadPoolSize.ReactorThreadsTests.test_suggestThreadPoolSize"   sX     	%%b)++//4%%a(++//3    c                 L    [         R                  " [        R                  S5      $ )z
The reactor's threadpool is only available when the reactor is running,
so to have a sane behavior during the tests we make a dummy
L{threads.deferToThread} call.
r   )r	   deferToThreadtimesleepr   s    r   _waitForThread"ReactorThreadsTests._waitForThread+   s     $$TZZ33r   c                 N   ^  U 4S jnT R                  5       R                  U5      $ )zh
Test callInThread functionality: set a C{threading.Event}, and check
that it's not in the main thread.
c                   >^^ [         R                  " 5       m/ mUU4S jn[        R                  " U5        TR	                  S5        TR                  5       (       d  TR                  S5        g TR                  TS/5        g )Nc                  n   > T R                  [        R                  " 5       5        TR                  5         g N)appendr   isInIOThreadset)resultwaiters   r   threadedFuncGReactorThreadsTests.test_callInThread.<locals>.cb.<locals>.threadedFunc=   s!    j5578

r   x   zTimed out waiting for event.F)	threadingEventr   callInThreadwaitisSetfailr   )ignr-   r+   r,   r   s     @@r   cb1ReactorThreadsTests.test_callInThread.<locals>.cb9   s_    __&FF   .KK<<>>		89  %1r   r"   addCallbackr   r7   s   ` r   test_callInThread%ReactorThreadsTests.test_callInThread3   s$    	2 ""$0044r   c                 F    S nU R                  5       R                  U5      $ )zS
Test callFromThread functionality: from the main thread, and from
another thread.
c                    ^ [         R                  " 5       n[         R                  " 5       mU4S jn[        R                  " U5        [        R                  " UR
                  S 5        [         R                  " UT/SS9$ )Nc                  H   > [         R                  " T R                  S 5        g r'   )r   callFromThreadcallback)firedByOtherThreads   r   r-   IReactorThreadsTests.test_callFromThread.<locals>.cb.<locals>.threadedFuncT   s    &&'9'B'BDIr   T)fireOnOneErrback)r   Deferredr   r2   rA   rB   DeferredList)r6   firedByReactorThreadr-   rC   s      @r   r7   3ReactorThreadsTests.test_callFromThread.<locals>.cbP   sh    #(>>#3 !&!1J   .""#7#@#@$G%%%'9:T r   r9   r;   s     r   test_callFromThread'ReactorThreadsTests.test_callFromThreadJ   s#    	 ""$0044r   c                 N   ^  U 4S jnT R                  5       R                  U5      $ )zD
Try to make an overflow on the reactor waker using callFromThread.
c                 B  >^ S Tl         [        R                  " 5       mUU4S jn[        R                  " U5        TR                  S5        TR                  5       (       d  TR                  S5        TR                   b   [        R                  " TR                   5      $ g )Nc                     > [        S5       H  n  [        R                  " S 5        M     TR                  5         g ! [         a    [        R
                  " 5       Tl           M9  f = f)Ni c                      g r'    rP   r   r   <lambda>^ReactorThreadsTests.test_wakerOverflow.<locals>.cb.<locals>.threadedFunction.<locals>.<lambda>n   s    tr   )ranger   rA   BaseExceptionr
   Failurer*   )ir   r,   s    r   threadedFunctionLReactorThreadsTests.test_wakerOverflow.<locals>.cb.<locals>.threadedFunctioni   sS     vA..|< ' 

 ) '.'8s   =$A&%A&r/   Timed out waiting for event)	r
   r0   r1   r   r2   r3   r4   r5   r   )r6   rW   r,   r   s     @r   r7   2ReactorThreadsTests.test_wakerOverflow.<locals>.cbe   sr    DL__&F	   !12KK<<>>		78||'zz$,,// (r   r9   r;   s   ` r   test_wakerOverflow&ReactorThreadsTests.test_wakerOverflow`   s$    
	0, ""$0044r   c                    ^ ^^^^ [         R                  " 5       m/ m/ mUUUU U4S jnUUU U4S jnT R                  5       R                  U5      R	                  U5      $ )z;
Utility method to test L{threads.blockingCallFromThread}.
c                    > UUUU4S jn[         R                  " U5        [        R                  " TR                  TR                  5       5      $ )Nc                     >  [         R                  " [        T5      n TR                  U 5        TR                  5         g ! [         a  nTR                  U5         S nAN1S nAff = fr'   )r	   blockingCallFromThreadr   r(   	Exceptionr*   )reerrorsreactorFuncresultsr,   s     r   r-   RReactorThreadsTests._testBlockingCallFromThread.<locals>.cb1.<locals>.threadedFunc   sR    &66wLA NN1%

	 ! %MM!$$%s   A   
A%
A  A%)r   r2   r	   r   r3   
getTimeout)r6   r-   rd   re   rf   r   r,   s     r   cb1<ReactorThreadsTests._testBlockingCallFromThread.<locals>.cb1   s;        .((doo6GHHr   c                 X   > TR                  5       (       d  TR                  S5        TT4$ )NrY   )r4   r5   )r6   rd   rf   r   r,   s    r   cb2<ReactorThreadsTests._testBlockingCallFromThread.<locals>.cb2   s%    <<>>		78F?"r   )r0   r1   r"   r:   addBoth)r   re   ri   rl   rd   rf   r,   s   ``  @@@r   _testBlockingCallFromThread/ReactorThreadsTests._testBlockingCallFromThread}   sX     "	I 	I	# 	#
 ""$005==cBBr   c                 V   ^  S nU 4S jnT R                  U5      R                  U5      $ )z
Test blockingCallFromThread facility: create a thread, call a function
in the reactor using L{threads.blockingCallFromThread}, and verify the
result returned.
c                  .    [         R                  " S5      $ )Nfoo)r   succeedrP   r   r   re   DReactorThreadsTests.test_blockingCallFromThread.<locals>.reactorFunc   s    ==''r   c                 6   > TR                  U S   S   S5        g )Nr   rs   r   resr   s    r   r7   ;ReactorThreadsTests.test_blockingCallFromThread.<locals>.cb       SVAY.r   ro   r:   r   re   r7   s   `  r   test_blockingCallFromThread/ReactorThreadsTests.test_blockingCallFromThread   s+    	(	/ //<HHLLr   c                 V   ^  S nU 4S jnT R                  U5      R                  U5      $ )z`
Test blockingCallFromThread as above, but be sure the resulting
Deferred is not already fired.
c                  t    [         R                  " 5       n [        R                  " SU R                  S5        U $ )N皙?egg)r   rF   r   	callLaterrB   ds    r   re   IReactorThreadsTests.test_asyncBlockingCallFromThread.<locals>.reactorFunc   s)     Ac1::u5Hr   c                 6   > TR                  U S   S   S5        g )Nr   r   rw   rx   s    r   r7   @ReactorThreadsTests.test_asyncBlockingCallFromThread.<locals>.cb   r{   r   r|   r}   s   `  r    test_asyncBlockingCallFromThread4ReactorThreadsTests.test_asyncBlockingCallFromThread   s+    	
	/ //<HHLLr   c                 V   ^  S nU 4S jnT R                  U5      R                  U5      $ )z/
Test error report for blockingCallFromThread.
c                  @    [         R                  " [        S5      5      $ )Nbar)r   r5   RuntimeErrorrP   r   r   re   IReactorThreadsTests.test_errorBlockingCallFromThread.<locals>.reactorFunc   s    ::l5122r   c                    > TR                  U S   S   [        5        TR                  U S   S   R                  S   S5        g )N   r   r   assertIsInstancer   r   argsrx   s    r   r7   @ReactorThreadsTests.test_errorBlockingCallFromThread.<locals>.cb   s<    !!#a&)\:SVAY^^A.6r   r|   r}   s   `  r    test_errorBlockingCallFromThread4ReactorThreadsTests.test_errorBlockingCallFromThread   s+    
	3	7 //<HHLLr   c                 V   ^  S nU 4S jnT R                  U5      R                  U5      $ )zq
Test error report for blockingCallFromThread as above, but be sure the
resulting Deferred is not already fired.
c                      [         R                  " 5       n [        R                  " SU R                  [        S5      5        U $ )Nr   spam)r   rF   r   r   errbackr   r   s    r   re   NReactorThreadsTests.test_asyncErrorBlockingCallFromThread.<locals>.reactorFunc   s.     Ac199l6.BCHr   c                    > TR                  U S   S   [        5        TR                  U S   S   R                  S   S5        g )Nr   r   r   r   rx   s    r   r7   EReactorThreadsTests.test_asyncErrorBlockingCallFromThread.<locals>.cb   s<    !!#a&)\:SVAY^^A.7r   r|   r}   s   `  r   %test_asyncErrorBlockingCallFromThread9ReactorThreadsTests.test_asyncErrorBlockingCallFromThread   s+    	
	8 //<HHLLr   )r
   N)__name__
__module____qualname____firstlineno____doc__r   r"   r<   rJ   r[   ro   r~   r   r   r   __static_attributes__rP   r   r   r   r      s>    
445.5,5:C8MM MMr   r   c                   "    \ rS rSrSrSrS rSrg)Counter   r   c                 l    U R                   S-   nXR                   S-   :w  a  SU l        [        eXl         g)zA non thread-safe method.r   N)indexproblem
ValueError)r   nexts     r   addCounter.add   s1    zzA~::>!DL
 
r   )r   r   N)r   r   r   r   r   r   r   r   rP   r   r   r   r      s    EGr   r   c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg
)DeferredResultTests   z 
Test twisted.internet.threads.
c                 0    [         R                  " S5        g )N   r   r   r   s    r   setUpDeferredResultTests.setUp       %%a(r   c                 0    [         R                  " S5        g )Nr   r   r   s    r   tearDownDeferredResultTests.tearDown   r   r   c                   ^ ^^^ / mSm[         R                  " 5       mUUUU 4S jn[        R                  " [	        T5       Vs/ s H  nTR
                  U40 4PM     sn[        R                  U40 4/-   5        T$ s  snf )zG
L{threads.callMultipleInThread} calls multiple functions in a thread.

   c                  p   > TR                  T [        [        T5      5      5        TR                  S 5        g r'   )r   listrS   rB   )LNr   r   s   r   finished7DeferredResultTests.test_callMultiple.<locals>.finished  s'    QU1X/JJtr   )r   rF   r	   callMultipleInThreadrS   r(   r   rA   )r   r   rV   r   r   r   s   `  @@@r   test_callMultiple%DeferredResultTests.test_callMultiple   s~     NN	 	 	$$+0848aahhb!84&&R89:	
  5s   A=c                 p    [         R                  " SS jSSS9nUR                  U R                  S5        U$ )zz
L{threads.deferToThread} executes the function passed, and correctly
handles the positional and keyword arguments given.
c                 
    X-   $ r'   rP   xys     r   rQ   9DeferredResultTests.test_deferredResult.<locals>.<lambda>  s    r      r   r         )r	   r   r:   r   r   r   s     r   test_deferredResult'DeferredResultTests.test_deferredResult  s2    
 !!"6Q?	d&&*r   c                 ~   ^  " S S[         5      mU4S jn[        R                  " U5      nU R                  UT5      $ )z
Check that L{threads.deferToThread} return a failure object
with an appropriate exception instance when the called
function raises an exception.
c                       \ rS rSrSrg):DeferredResultTests.test_deferredFailure.<locals>.NewErrori  rP   Nr   r   r   r   r   rP   r   r   NewErrorr         r   r   c                     > T " 5       er'   rP   r   s   r   
raiseError<DeferredResultTests.test_deferredFailure.<locals>.raiseError      *r   )ra   r	   r   assertFailurer   r   r   r   s      @r   test_deferredFailure(DeferredResultTests.test_deferredFailure  s9    	y 		 !!*-!!!X..r   c                     [         R                  " S 5      nUR                  S 5        U R                  U[        5      $ )z|
Check that a successful L{threads.deferToThread} followed by a one
that raises an exception correctly result as a failure.
c                      g r'   rP   rP   r   r   rQ   FDeferredResultTests.test_deferredFailureAfterSuccess.<locals>.<lambda>3  s    $r   c                 0    [         R                  " S 5      $ )Nc                      SS-  $ )Nr   r   rP   rP   r   r   rQ   XDeferredResultTests.test_deferredFailureAfterSuccess.<locals>.<lambda>.<locals>.<lambda>4  s    Qr   )r	   r   )r6   s    r   rQ   r   4  s    '"7"7"Gr   )r	   r   r:   r   ZeroDivisionErrorr   s     r    test_deferredFailureAfterSuccess4DeferredResultTests.test_deferredFailureAfterSuccess$  s5     !!,/	GH!!!%677r   rP   N)r   r   r   r   r   r   r   r   r   r   r   r   rP   r   r   r   r      s%    
))$/ 8r   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	DeferToThreadPoolTestsi8  z5
Test L{twisted.internet.threads.deferToThreadPool}.
c                 p    [         R                  " SS5      U l        U R                  R                  5         g )Nr   r   )r   
ThreadPooltpstartr   s    r   r   DeferToThreadPoolTests.setUp=  s#    ''1-r   c                 8    U R                   R                  5         g r'   )r   stopr   s    r   r   DeferToThreadPoolTests.tearDownA  s    r   c                     [         R                  " [        U R                  SS jSSS9nUR	                  U R
                  S5        U$ )z~
L{threads.deferToThreadPool} executes the function passed, and
correctly handles the positional and keyword arguments given.
c                 
    X-   $ r'   rP   r   s     r   rQ   <DeferToThreadPoolTests.test_deferredResult.<locals>.<lambda>I  s    qur   r   r   r   r   r   )r	   deferToThreadPoolr   r   r:   r   r   s     r   r   *DeferToThreadPoolTests.test_deferredResultD  s;    
 %%gtww8LaSTU	d&&*r   c                    ^  " S S[         5      mU4S jn[        R                  " [        U R                  U5      nU R                  UT5      $ )z
Check that L{threads.deferToThreadPool} return a failure object with an
appropriate exception instance when the called function raises an
exception.
c                       \ rS rSrSrg)=DeferToThreadPoolTests.test_deferredFailure.<locals>.NewErroriT  rP   Nr   rP   r   r   r   r   T  r   r   r   c                     > T " 5       er'   rP   r   s   r   r   ?DeferToThreadPoolTests.test_deferredFailure.<locals>.raiseErrorW  r   r   )ra   r	   r   r   r   r   r   s      @r   r   +DeferToThreadPoolTests.test_deferredFailureM  sA    	y 		 %%gtww
C!!!X..r   )r   N)
r   r   r   r   r   r   r   r   r   r   rP   r   r   r   r   8  s    /r   r   a_  
import time
import %(reactor)s
%(reactor)s.install()

from twisted.internet import reactor

def threadedCall():
    print('threaded call')

reactor.callInThread(threadedCall)

# Spin very briefly to try to give the thread a chance to run, if it
# is going to.  Is there a better way to achieve this behavior?
for i in range(100):
    time.sleep(0.0)
c                   ,    \ rS rSrS rS rS rS rSrg)ThreadStartupProcessProtocoliq  c                 ,    Xl         / U l        / U l        g r'   )r   outerr)r   r   s     r   __init__%ThreadStartupProcessProtocol.__init__r  s     r   c                 :    U R                   R                  U5        g r'   )r  r(   )r   r  s     r   outReceived(ThreadStartupProcessProtocol.outReceivedw      r   c                 :    U R                   R                  U5        g r'   )r  r(   )r   r  s     r   errReceived(ThreadStartupProcessProtocol.errReceivedz  r  r   c                 h    U R                   R                  U R                  U R                  U45        g r'   )r   rB   r  r  )r   reasons     r   processEnded)ThreadStartupProcessProtocol.processEnded}  s#    $((F;<r   )r  r   r  N)	r   r   r   r   r	  r  r  r  r   rP   r   r   r  r  q  s    
=r   r  z7No process support, cannot run subprocess thread tests.c                       \ rS rSrSrS rSrg)StartupBehaviorTestsi  a  
Test cases for the behavior of the reactor threadpool near startup
boundary conditions.

In particular, this asserts that no threaded calls are attempted
until the reactor starts up, that calls attempted before it starts
are in fact executed once it has started, and that in both cases,
the reactor properly cleans itself up (which is tested for
somewhat implicitly, by requiring a child process be able to exit,
something it cannot do unless the threadpool has been properly
torn down).
c                 *  ^ ^ T R                  5       n[        US5       nUR                  [        S[        R
                  0-  5        S S S 5        U 4S jnU4S jn[        R                  R                  5       n[        R                  R                  [        R                  5      US'   [        R                  " 5       R                  X45      n[!        U5      m[        R"                  " T[        R$                  SU4U5        U$ ! , (       d  f       N= f)Nwr   c                    > U u  pnUR                  [        R                  5      (       a  TR                  SU SU S35        U(       a  [        R
                  " SU 35        TR                  USU 35        g )Nz#Process did not exit cleanly (out: z err: )z%Unexpected output on standard error: z&Expected no output, instead received:
)checkr   ProcessTerminatedr5   r   msgassertFalse)r+   r  r  r  r   s       r   programFinishedMStartupBehaviorTests.testCallBeforeStartupUnexecuted.<locals>.programFinished  sm    !'Sv||E3344		?uF3%qQR?uEFS$KC5"QRr   c                 h   > U R                  [        R                  5        TR                  S5        U $ )NKILL)trapr   TimeoutErrorsignalProcess)r  protos    r   programTimeoutLStartupBehaviorTests.testCallBeforeStartupUnexecuted.<locals>.programTimeout  s(    HHU''('Jr   
PYTHONPATHpython)mktempopenwrite_callBeforeStartupProgramr   r   osenvironcopypathsepjoinsyspathr   rF   addCallbacksr  spawnProcess
executable)r   prognameprogfiler   r(  envr   r'  s   `      @r   testCallBeforeStartupUnexecuted4StartupBehaviorTests.testCallBeforeStartupUnexecuted  s    ;;=(C HNN4	7CUCU7VVW !	S	
 jjooJJOOCHH5LNN))/J,Q/UCNNXx4H#N- ! s   )D
DrP   N)r   r   r   r   r   r=  r   rP   r   r   r  r    s    r   r  ) r   r0  r5  r    unittestr   twisted.internetr   r   r   r   r   r	   twisted.pythonr
   r   r   r   twisted.trial.unittestr   r0   ImportErrorIReactorThreadsr   r   r   r   r/  ProcessProtocolr  IReactorProcessr  rP   r   r   <module>rG     sG  

 
 
   Q Q ? ? +	
 ""7D11.xM( xM	xMv $ ""7D11.G8( G8	G8T#/X #/L &=8#;#; =  ""7D11. ""7D11=&8 &		&i  		s   D DD