+
    üÐj&k  ã                   ó‚  € R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
HtHt ^ RIHt ^ RIHtHt ^ RIHtHtHtHt ^ R	IHtHtHtHtHtHtHt ^ R
I H!t! ^ RI"H#t# ^ RI$H%t%H&t& ^ RI'H(t( ^ RI)H*t* ^ RI+H,t,H-t-H.t. ^ RI/H0t0 ^ RI1H2t2H3t3 ^ RI4H5t5 ^ RI6H7t7 ^ RI8H9t9 ^ RI:H;t; ^ RI<H=t= ^ RI>H?t? ^ RI@HAtA ^ RIBHCtCHDtDHEtE ^ RIFHGtGHHtHHItIHJtJHKtK ^ RILHMtMHNtNHOtOHPtP ^ RIQHRtRHStSHTtTHUtU ^ RIVHWtWHXtX ^ RIYHZtZHt ^RI[H\t\H]t] ^R I^H_t_ ] ! R! R"4      4       t`]! ](PÂ                  4       ! R# R$]74      4       tb ! R% R&]Z4      tc ! R' R(]4      td ! R) R*]4      te ! R+ R,]4      tf ! R- R.]g4      th ! R/ R04      ti] ! R1 R24      4       tj ! R3 R44      tk ! R5 R6]g4      tl ! R7 R84      tm] ! R9 R:4      4       tn] ! R; R<4      4       toR# )=z-
Tests for L{twisted.trial._dist.disttrial}.
N)Úpartial)ÚStringIO)Úsep)ÚCallableÚListÚSet)ÚTestCase)ÚimplementerÚverify)ÚFactoryÚassocÚdefineÚfield)Úassert_thatÚcontainsÚ	ends_withÚequal_toÚ
has_lengthÚnoneÚstarts_with)ÚAllOf)Úgiven)ÚbooleansÚsampled_from)Ú
interfaces)ÚReactorBase)ÚCancelledErrorÚDeferredÚsucceed)ÚProcessDone)ÚProcessProtocolÚProtocol)ÚAlternateReactor)ÚMemoryReactorClock)ÚFailure)ÚFilePath)ÚFilesystemLock)Ú_WORKER_AMP_STDIN)ÚDistReporter)ÚDistTrialRunnerÚ
WorkerPoolÚWorkerPoolConfig)ÚcountingCallsÚdiscardResultÚfromOptionalÚiterateWhileÚsequence)ÚLocalWorkerÚ	RunResultÚWorkerÚWorkerAction)ÚReporterÚ
TestResultÚTreeReporterÚUncleanWarningsReporterWrapper)ÚErrorHolderÚ
TrialSuite)ÚSynchronousTestCaser   )Ú	erroneousÚsample)Úmatches_resultc                   óZ   a € ] tR t^At o Rt]! ]! ]4      R7      tR t	R t
V 3R ltRtV tR# )ÚFakeTransportz"
A simple fake process transport.
©Údefaultc                ó   € R# )z
Ignore write calls.
N© )ÚselfÚfdÚdatas   &&&ÚI/usr/lib/python3/dist-packages/twisted/trial/_dist/test/test_disttrial.pyÚwriteToChildÚFakeTransport.writeToChildI   s   ‚ ó    c                ó<   € V P                   P                  V4       R# )z.
Mark one of the child descriptors as closed.
N)Ú_closedÚadd)rE   rF   s   &&rH   ÚcloseChildFDÚFakeTransport.closeChildFDN   s   € ð 	�‰×Ñ˜ÖrK   c                ó6   <€ V ^8„  d   Qh/ S[ S[,          ;R&   # )é   rM   )r   Úint)ÚformatÚ__classdict__s   "€rH   Ú__annotate__ÚFakeTransport.__annotate__A   s   ø‡ ‚ ñ ‘�XÑ3ò rK   rD   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   ÚsetrM   rI   rO   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©rU   s   @rH   r@   r@   A   s+   ø‡ € ññ ¡g¨c£lÔ3€Gòò
÷ ƒ rK   r@   c                   óZ   a € ] tR t^Ut o Rt^ t^ t^ tR tR/ RRR^ R3R lt	R t
R tRtV tR# )	ÚCountingReactorzy
A fake reactor that counts the calls to L{IReactorCore.run},
L{IReactorCore.stop}, and L{IReactorProcess.spawnProcess}.
c                ó>   € \         P                  ! V 4       Wn        R # ©N)r#   Ú__init__Ú_workers)rE   Úworkerss   &&rH   rf   ÚCountingReactor.__init__`   s   € Ü×#Ò# DÔ)ØŽrK   Nc
                ó    € V P                   P                  V4       VP                  \        4       4       V ;P                  ^,          un        R# )zÆ
See L{IReactorProcess.spawnProcess}.

@param workerProto: See L{IReactorProcess.spawnProcess}.
@param args: See L{IReactorProcess.spawnProcess}.
@param kwargs: See L{IReactorProcess.spawnProcess}.
N)rg   ÚappendÚmakeConnectionr@   Ú
spawnCount)
rE   ÚworkerProtoÚ
executableÚargsÚenvÚpathÚuidÚgidÚusePTYÚchildFDss
   &&&&&&&&&&rH   ÚspawnProcessÚCountingReactor.spawnProcessd   s4   € ð& 	�‰×Ñ˜[Ô)Ø×"Ñ"¤=£?Ô3Ø�Š˜1Õ�rK   c                óà   € \         P                  ! V 4       RV P                  9   d.   V P                  R,          R,          ^ ,          ^ ,          ! 4        V ;P                  ^,          un        R# )z
See L{IReactorCore.stop}.
ÚbeforeÚshutdownN)r#   ÚstopÚtriggersÚ	stopCount©rE   s   &rH   r|   ÚCountingReactor.stop{   sL   € ô 	×Ò Ô%ð �t—}‘}Ô$Ø�M‰M˜(Õ# JÕ/°Õ2°1Ö5Ô7Ø�Š˜!Õ�rK   c                óâ   € V ;P                   ^,          un         RV n        RV n        V P                   F  w  rpV! V/ VB  K  	  V P	                  4        V ;P
                  ^,          un        R# )z
See L{IReactorCore.run}.
TN)ÚrunCountÚrunningÚhasRunÚwhenRunningHooksr|   r~   )rE   Úfrp   Úkwargss   &   rH   ÚrunÚCountingReactor.run‡   sZ   € ð 	�Š˜Õ�ð ˆŒØˆŒà#×4Ô4‰OˆA�VÙˆtÐ�vÔñ  5à�	‰	Œà�Š˜!Õ�rK   )rg   r„   rƒ   rD   )rX   rY   rZ   r[   r\   rm   r~   r‚   rf   rw   r|   rˆ   r_   r`   ra   s   @rH   rc   rc   U   sK   ø‡ € ñð
 €JØ€IØ€Hò ð ØØØØØØôò.
÷ð rK   rc   c                   óB   a € ] tR t^˜t o RtR tR tR tR tR t	Rt
V tR# )	ÚCountingReactorTestsz
Tests for L{CountingReactor}.
c                óH   € . V n         \        V P                   4      V n        R # re   )rh   rc   Úreactorr   s   &rH   ÚsetUpÚCountingReactorTests.setUp�   s   € ØˆŒÜ& t§|¡|Ó4ˆŽrK   c                ód   € \         P                  ! \        P                  V P                  4       R# )z:
L{CountingReactor} instances provide L{IReactorProcess}.
N)r
   ÚverifyObjectr   ÚIReactorProcessr�   r   s   &rH   Útest_providesIReactorProcessÚ1CountingReactorTests.test_providesIReactorProcess¡   s   € ô 	×ÒœJ×6Ñ6¸¿¹ÖErK   c                ó¶  € V P                  V P                  P                  4       \        4       pR F£  pV P                  P	                  V\
        P                  \
        P                  .R7       V P                  VP                  4       V P                  V P                  V.V,          4       V P                  V P                  P                  V4       K¥  	  R# )z£
The process protocol for a spawned process is connected to a
transport and appended onto the provided C{workers} list, and
the reactor's C{spawnCount} increased.
)rp   N©é   rR   )ÚassertFalser�   rm   r!   rw   Úsysro   Ú
assertTrueÚ	transportÚassertEqualrh   )rE   ÚprotoÚcounts   &  rH   Útest_spawnProcessÚ&CountingReactorTests.test_spawnProcess§   s•   € ð 	×Ñ˜Ÿ™×0Ñ0Ô1ä“
ˆÛˆEØ�L‰L×%Ñ% e¬S¯^©^Ä3Ç>Á>ÐBRÐ%ÔSØ�O‰O˜EŸO™OÔ,Ø×Ñ˜TŸ\™\¨E¨7°U­?Ô;Ø×Ñ˜TŸ\™\×4Ñ4°eÖ<ó	 rK   c                óâ   € V P                  V P                  P                  4       R FC  pV P                  P                  4        V P	                  V P                  P                  V4       KE  	  R# )z2
Stopping the reactor increments its C{stopCount}
Nr–   )r˜   r�   r~   r|   rœ   )rE   rž   s   & rH   Ú	test_stopÚCountingReactorTests.test_stop¶   sP   € ð 	×Ñ˜Ÿ™×/Ñ/Ô0ÛˆEØ�L‰L×ÑÔØ×Ñ˜TŸ\™\×3Ñ3°UÖ;ó rK   c                ó´  € V P                  V P                  P                  4       . pV P                  P                  VP                  R4       R F„  pV P                  P                  4        V P                  V P                  P                  V4       V P                  V P                  P                  ^ 4       V P                  \        V4      V4       K†  	  R# )zz
Running the reactor increments its C{runCount}, does not imply
C{stop}, and calls L{IReactorCore.callWhenRunning} hooks.
Nr–   )	r˜   r�   r‚   ÚcallWhenRunningrk   rˆ   rœ   r~   Úlen)rE   ÚwhenRunningCallsrž   s   &  rH   Útest_runÚCountingReactorTests.test_run¿   s¡   € ð
 	×Ñ˜Ÿ™×.Ñ.Ô/àÐØ�‰×$Ñ$Ð%5×%<Ñ%<¸dÔCãˆEØ�L‰L×ÑÔØ×Ñ˜TŸ\™\×2Ñ2°EÔ:Ø×Ñ˜TŸ\™\×3Ñ3°QÔ7Ø×ÑœSÐ!1Ó2°EÖ:ó	 rK   )r�   rh   N)rX   rY   rZ   r[   r\   rŽ   r“   rŸ   r¢   r¨   r_   r`   ra   s   @rH   r‹   r‹   ˜   s)   ø‡ € ñò5òFò=ò<÷;ð ;rK   r‹   c            	       ó”   a € ] tR t^Ðt o RtR tR tR tR tR t	R t
]! ]! 4       ]! RR	] R2.4      4      V 3R
 lR l4       tRtV tR# )ÚWorkerPoolTestsz
Tests for L{WorkerPool}.
c                óò   € \        V P                  4       4      V n        V P                  P                  R 4      V n        \        ^V P                  . RR7      V n        \        V P                  4      V n        R# )Ú_trial_tempúout.log)Ú
numWorkersÚworkingDirectoryÚworkerArgumentsÚlogFileN)	r%   ÚmktempÚparentÚchildr°   r+   Úconfigr*   Úpoolr   s   &rH   rŽ   ÚWorkerPoolTests.setUpÕ   s[   € Ü˜tŸ{™{›}Ó-ˆŒØ $§¡× 1Ñ 1°-Ó @ˆÔÜ&ØØ!×2Ñ2ØØô	
ˆŒô ˜tŸ{™{Ó+ˆŽ	rK   c                ó$  € \        ^4       Uu. uF  p\        4       NK  	  ppV P                  P                  V\	        R4      \        4       4      pV F  pV P                  V\        4       K  	  V P                  ^\        V4      4       R# u upi )z_
C{_createLocalWorkers} iterates the list of protocols and create one
L{LocalWorker} for each.
rr   N)
ÚrangeÚobjectr·   Ú_createLocalWorkersr%   r   ÚassertIsInstancer1   rœ   r¦   )rE   ÚxÚ	protocolsrh   Úss   &    rH   Útest_createLocalWorkersÚ'WorkerPoolTests.test_createLocalWorkersà   sp   € ô
 (-¨Q¤xÓ0¡x !”V–X¡xˆ	Ð0Ø—)‘)×/Ñ/°	¼8ÀFÓ;KÌXËZÓXˆÛˆAØ×!Ñ! !¤[Ö1ñ à×Ñ˜œC ›LÖ)ùò	 1s   ŽBc                ó  aa€ \        ^4       Uu. uF  p\        4       NK  	  pp. o/ oR/ RRR^ R3VV3R llpV P                  P                  W2R.4       V P	                  S^ ,          S^,          4       V P                  \        P                  P                  S^,          4      4       V P	                  RS^,          4       V P	                  \        P                  P                  \        P                  4      SR,          4       R# u upi )z|
Given a C{spawnProcess} function, C{_launchWorkerProcess} launches a
python process with an existing path as its argument.
Nc	                 ón   <€ S	P                  V4       S	P                  V4       S
P                  V4       R # re   )rk   ÚextendÚupdate)ÚprocessProtocolro   rp   rq   rr   rs   rt   ru   rv   Ú	argumentsÚenvironments   &&&&&&&&&€€rH   ÚfakeSpawnProcessÚDWorkerPoolTests.test_launchWorkerProcesses.<locals>.fakeSpawnProcessô   s/   ø€ ð ×Ñ˜ZÔ(Ø×Ñ˜TÔ"Ø×Ñ˜sÖ#rK   ÚfooÚ
PYTHONPATHrD   )rº   r    r·   Ú_launchWorkerProcessesrœ   rš   Úosrr   ÚexistsÚpathsepÚjoinr™   )rE   Úir¿   rÊ   rÈ   rÉ   s   &   @@rH   Útest_launchWorkerProcessesÚ*WorkerPoolTests.test_launchWorkerProcessesë   sÚ   ù€ ô
 16°a´Ó9±¨1”_Ö&±ˆ	Ð9Øˆ	Øˆð
 ØØØØØØ÷	$ð 	$ð 	�	‰	×(Ñ(Ð)9ÀuÀgÔNØ×Ñ˜ 1� y°¥|Ô4Ø�‰œŸ™Ÿ™ y°¥|Ó4Ô5Ø×Ñ˜ 	¨!¥Ô-ð 	×ÑœŸ™Ÿ™¬¯©Ó2°KÀÕ4MÖNùò5 :s   �D
c                óH  a€ V P                   P                  4        . oV P                  P                  \	        . 4      4      pV P                  V4      pVP                  V3R l4      pV P                  V4       \        S\        V P                  P                  4      4       R# )zI
C{run} dispatches the given action to each of its workers exactly once.
c                 ó8   <€ \        SP                  V 4      4      # re   )r   rk   )Úwrh   s   &€rH   Ú<lambda>Ú*WorkerPoolTests.test_run.<locals>.<lambda>  s   ø€ ¬°·±¸qÓ0AÔ(BrK   N)r´   Úmakedirsr·   Ústartrc   ÚsuccessResultOfrˆ   r   r   r¶   r¯   )rE   ÚstartingÚstartedrƒ   rh   s   &   @rH   r¨   ÚWorkerPoolTests.test_run  sw   ø€ ð 	�‰×ÑÔàˆØ—9‘9—?‘?¤?°2Ó#6Ó7ˆØ×&Ñ& xÓ0ˆØ—+‘+ÔBÓCˆØ×Ñ˜WÔ%Ü�GœZ¨¯©×(>Ñ(>Ó?Ö@rK   c                óÎ  € V P                   P                  4        \        V P                  P                  R,           4      pV P                  VP                  4       4       V P                  VP                  4       \        . 4      pV P                  V P                  P                  V4      4      pV P                  VP                  V P                  P                  R4      4       R# )zp
L{WorkerPool.start} checks if the test directory is already locked, and if
it is generates a name based on it.
z.lockz_trial_temp-1N)r´   rÛ   r&   r°   rr   rš   ÚlockÚ
addCleanupÚunlockrc   rÝ   r·   rÜ   rœ   Úsibling)rE   râ   ÚfakeReactorrß   s   &   rH   Útest_runUsedDirectoryÚ%WorkerPoolTests.test_runUsedDirectory  s©   € ð 	�‰×ÑÔô ˜d×3Ñ3×8Ñ8¸7ÕBÓCˆØ�‰˜Ÿ	™	›Ô$Ø�‰˜Ÿ™Ô$ô & bÓ)ˆØ×&Ñ& t§y¡y§¡°{Ó'CÓDˆð 	×ÑØ×$Ñ$Ø×!Ñ!×)Ñ)¨/Ó:ö	
rK   c           	     óF  € V P                   P                  4        \        . 4      pV P                  V P                  P                  V4      4      p\        P                  ! VP                  4       4      pV P                  V4       VP                   F—  p\        VP                  P                  \        \        4      4       VP                  P                   F  pVP!                  V4       K  	  VP"                  VP$                  3 F  pV! \'        \)        ^ 4      4      4       K  	  K™  	  \        V P                  V4      \+        4       4       \        VP,                  P.                  \1        R4      4       \        VP2                  P4                  \1        R4      4       R# )zs
L{StartedWorkerPool.join} causes all of the workers to exit, closes the
log file, and unlocks the test directory.
TFN)r´   rÛ   rc   rÝ   r·   rÜ   r   ÚfromCoroutinerÒ   ÚassertNoResultrg   r   r›   rM   r   r'   ÚchildConnectionLostÚprocessExitedÚprocessEndedr$   r   r   ÚtestLogÚclosedr   ÚtestDirLockÚlocked)rE   r�   rß   ÚjoiningrØ   rF   r†   s   &      rH   Ú	test_joinÚWorkerPoolTests.test_join3  s  € ð
 	�‰×ÑÔä! "Ó%ˆØ×&Ñ& t§y¡y§¡°wÓ'?Ó@ˆÜ×(Ò(¨¯©«Ó8ˆØ×Ñ˜GÔ$Ø×!Ô!ˆAÜ˜Ÿ™×+Ñ+¬XÔ6GÓ-HÔIØ—k‘k×)Ô)�Ø×%Ñ% bÖ)ñ *à—o‘o q§~¡~Ó6�Ù”'œ+ a›.Ó)Ö*ó 7ñ	 "ô 	�D×(Ñ(¨Ó1´4³6Ô:Ü�G—O‘O×*Ñ*¬H°T«NÔ;Ü�G×'Ñ'×.Ñ.´¸³Ö@rK   r®   Úsubdirc                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )rR   Úabsoluter²   ÚreturnN)ÚboolÚstr)rT   rU   s   "€rH   rV   ÚWorkerPoolTests.__annotate__Q  s"   ø€ ÷ 3ñ 3¡Tð 3±Cð 3¸Dñ 3rK   c                óÞ  € V'       d)   V P                   P                  \        ,           V,           p\        V P                  VR7      pV'       d   \        V4      pM=\        \        VP                  P                  4      \        \        V,           4      4      p\        V4      pV P                  VP                  \        . 4      4      4      p\        VP                  P                   V4       R# )zy
L{WorkerPool.start} creates a L{StartedWorkerPool} configured with a
log file based on the L{WorkerPoolConfig.logFile}.
)r²   N)r´   rr   r   r   r¶   r   r   r   r°   r   r*   rÝ   rÜ   rc   r   rï   Úname)rE   rø   r²   r¶   Úmatchesr·   rß   s   &&&    rH   Útest_logFileÚWorkerPoolTests.test_logFileH  s§   € ÷ Ø—k‘k×&Ñ&¬Õ,¨wÕ6ˆGä�t—{‘{¨GÔ4ˆçÜ˜wÓ'‰Gäô ˜F×3Ñ3×8Ñ8Ó9äœ# �-Ó(óˆGô ˜&Ó!ˆØ×&Ñ& t§z¡z´/À"Ó2EÓ'FÓGˆÜ�G—O‘O×(Ñ(¨'Ö2rK   )r¶   r´   r·   r°   N)rX   rY   rZ   r[   r\   rŽ   rÁ   rÔ   r¨   rç   rô   r   r   r   r   r   r_   r`   ra   s   @rH   r«   r«   Ð   sf   ø‡ € ñò	,ò	*òOòBAò
ò0Añ* Ù‹
ÙàØ˜˜˜WÐ%ðó	
ó÷3óö3rK   r«   c                   ó  a € ] tR tRt o Rt]! ]P                  ! R4      .4      tR t	R t
R tV 3R lR ltR	 tR
 tV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltR tR tV 3R lR ltV 3R lR ltV 3R lR ltR tRtV tR# )ÚDistTrialRunnerTestsik  z
Tests for L{DistTrialRunner}.
Útest_fooc                óÂ   € \        \        V P                  4       \        4       ^. \	        \
        RR7      \        . 4      R7      pVP                  V4       \        R/ VB # )z
Create a runner for testing.
T)Úautostop)ÚreporterFactoryr°   ÚstreamÚ
maxWorkersr±   ÚworkerPoolFactoryr�   rD   )	Údictr7   r³   r   r   ÚLocalWorkerPoolrc   rÆ   r)   )rE   Ú	overridesrp   s   &, rH   Ú	getRunnerÚDistTrialRunnerTests.getRunnerr  sS   € ô Ü(Ø!Ÿ[™[›]Ü“:ØØÜ%¤oÀÔEÜ# BÓ'ô
ˆð 	�‰�IÔÜÑ& Ñ&Ð&rK   c                óÈ   € \        4       p\        \        V4      4      pV P                  4       pVP	                  V4       V P                  VP                  4       ^ 8„  4       R# )zM
L{DistTrialRunner.writeResults} writes to the stream specified in the
init.
N)r   r(   r5   r  ÚwriteResultsrš   Útell)rE   ÚstringIOÚresultÚrunners   &   rH   Útest_writeResultsÚ&DistTrialRunnerTests.test_writeResults‚  sK   € ô
 “:ˆÜœh xÓ0Ó1ˆØ—‘Ó!ˆØ×Ñ˜FÔ#Ø�‰˜Ÿ™›¨!Ñ+Ö,rK   c                óF  a€ RoV3R lp^p^pV P                  W!R7      p\        \        V4       Uu. uF  p\        4       NK  	  up4      pV P	                  VP                  V4      4       \        SP                  ^ ,          P                  \        V4      4       R# u upi )zY
L{DistTrialRunner.runAsync} doesn't try to start more workers than the
number of tests.
Nc                  ó"   <€ \        V R R/VB oS# )r  T©r  ©ÚaÚkwr·   s   *,€rH   ÚrecordingFactoryÚADistTrialRunnerTests.test_minimalWorker.<locals>.recordingFactory”  s   ø€ ä" AÐ;°Ð;¸Ñ;ˆDØˆKrK   )r	  r
  )
r  r:   rº   r   rÝ   ÚrunAsyncr   Ú_startedrh   r   )rE   r  r	  ÚnumTestsr  ÚnÚsuiter·   s   &      @rH   Útest_minimalWorkerÚ'DistTrialRunnerTests.test_minimalWorker�  s�   ø€ ð
 ˆõ	ð
 ˆ
Øˆà—‘Ø!ð  ó 
ˆô ´°h´Ó@±¨1œHžJ±Ñ@ÓAˆØ×Ñ˜VŸ_™_¨UÓ3Ô4Ü�D—M‘M !Õ$×,Ñ,¬j¸Ó.BÖCùò As   ²Bc                ó   <€ V ^8„  d   QhRR/# ©rR   rù   NrD   )rT   rU   s   "€rH   rV   Ú!DistTrialRunnerTests.__annotate__£  s   ø€ ÷ 	Oñ 	O¨ñ 	OrK   c                óî   € V P                  RR7      pVP                  V P                  4      pV P                  V4      pV P	                  V\
        4       V P	                  VP                  \        4       R# )zr
Running with the C{unclean-warnings} option makes L{DistTrialRunner} uses
the L{UncleanWarningsReporterWrapper}.
T)ÚuncleanWarningsN)r  r   r$  rÝ   r½   r(   Úoriginalr8   )rE   r  Údr  s   &   rH   Útest_runUncleanWarningsÚ,DistTrialRunnerTests.test_runUncleanWarnings£  s[   € ð
 —‘°�Ó5ˆØ�O‰O˜DŸJ™JÓ'ˆØ×%Ñ% aÓ(ˆØ×Ñ˜f¤lÔ3Ø×Ñ˜fŸo™oÔ/MÖNrK   c                ó"  € \        4       pV P                  VR7      pV P                  VP                  \	        4       4      4      pV P                  V\        4       VP                  4       pV P                  RV4       V P                  RV4       R# )z1
L{DistTrialRunner} can run an empty test suite.
©r  úRunning 0 testÚPASSEDN)	r   r  rÝ   r   r:   r½   r(   ÚgetvalueÚassertIn)rE   r  r  r  Úoutputs   &    rH   Útest_runWithoutTestÚ(DistTrialRunnerTests.test_runWithoutTest®  so   € ô “ˆØ—‘ v�Ó.ˆØ×%Ñ% f§o¡o´j³lÓ&CÓDˆØ×Ñ˜f¤lÔ3Ø—‘Ó"ˆØ�‰Ð&¨Ô/Ø�‰�h Ö'rK   c                óº  € \        R\        \        R4      4      4      p\        4       pV P	                  VR7      pV P                  VP                  V4      4      pV P                  V\        4       VP                  4       pV P                  RV4       V P                  RV4       V P                  RV4       V P                  RV4       V P                  RV4       R# )zš
Even if there is no test, the suite can contain an error (most likely,
an import error): this should make the run fail, and the error should
be printed.
zan errorzfoo barr1  r2  zerrors=1ÚFAILEDN)r9   r$   ÚRuntimeErrorr   r  rÝ   r   r½   r(   r4  r5  )rE   Úerrr  r  r  r6  s   &     rH   Ú!test_runWithoutTestButWithAnErrorÚ6DistTrialRunnerTests.test_runWithoutTestButWithAnErrorº  s­   € ô ˜*¤g¬l¸9Ó.EÓ&FÓGˆÜ“ˆØ—‘ v�Ó.ˆà×%Ñ% f§o¡o°cÓ&:Ó;ˆØ×Ñ˜f¤lÔ3Ø—‘Ó"ˆØ�‰Ð&¨Ô/Ø�‰�i Ô(Ø�‰�j &Ô)Ø�‰�j &Ô)Ø�‰�h Ö'rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  Í  s   ø€ ÷ 	Cñ 	C¨ñ 	CrK   c                ó>  € V P                  \        R7      pV P                  VP                  V P                  4      4      pVP
                  P                  p\        V\        ^4      4       \        V^ ,          ^,          P                  \        \        4      4       R# )zi
If for some reasons we can't connect to the worker process, the error is
recorded in the result object.
©r
  N)r  ÚBrokenWorkerPoolrÝ   r   r$  r,  Úerrorsr   r   Útyper   ÚWorkerPoolBroken©rE   r  r  rC  s   &   rH   Útest_runUnexpectedErrorÚ,DistTrialRunnerTests.test_runUnexpectedErrorÍ  sm   € ð
 —‘Ô2B�ÓCˆØ×%Ñ% f§o¡o°d·j±jÓ&AÓBˆØ—‘×'Ñ'ˆÜ�FœJ q›MÔ*Ü�F˜1•I˜a•L×%Ñ%¤xÔ0@Ó'AÖBrK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  Ø  s   ø€ ÷ #ñ #¨dñ #rK   c                óÜ   € V P                  \        R7      pV P                  \        4      ;_uu_ 4        VP	                  V P
                  4       RRR4       R#   + '       g   i     R# ; i)z�
If the reactor is stopped by C-c (i.e. `run` returns before the test
case's Deferred has been fired) we should cancel the pending test run.
rA  N)r  r  ÚassertRaisesr   rˆ   r$  )rE   r  s   & rH   Útest_runUnexpectedErrorCtrlCÚ1DistTrialRunnerTests.test_runUnexpectedErrorCtrlCØ  sD   € ð
 —‘´/�ÓBˆØ×Ñœ~×.Õ.Ø�J‰J�t—z‘zÔ"÷ /×.×.Ò.ús   ´AÁA+	c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  á  s   ø€ ÷ ?ñ ?¨tñ ?rK   c                ó^  € V P                  \        \        \        RR7      R7      pV P	                  VP                  V P                  4      4      pVP                  P                  p\        V\        ^4      4       \        V^ ,          ^,          P                  \        \        4      4       R# )zf
If for some reason the worker process cannot run a test, the error is
recorded in the result object.
T)ÚworkerFactoryr  rA  N)r  r   r  Ú_BrokenLocalWorkerrÝ   r   r$  r,  rC  r   r   rD  r   ÚWorkerBrokenrF  s   &   rH   Útest_runUnexpectedWorkerErrorÚ2DistTrialRunnerTests.test_runUnexpectedWorkerErrorá  s€   € ð
 —‘Ü%ÜÔ/AÈDôð  ó 
ˆð
 ×%Ñ% f§o¡o°d·j±jÓ&AÓBˆØ—‘×'Ñ'ˆÜ�FœJ q›MÔ*Ü�F˜1•I˜a•L×%Ñ%¤x´Ó'=Ö>rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  ð  s   ø€ ÷ 4ñ 4°4ñ 4rK   c                óœ  a€ RoV3R lpV P                  VR7      p\        P                  ! VP                  V P                  4      4      pSf   V P                  R4       Sf   Q hSP                  ^ ,          P                  pV P                  V4       VP                  R4       V P                  V4      pV P                  V\        4       R# )z7
L{DistTrialRunner} waits for the worker pool to stop.
Nc                  ó"   <€ \        V R R/VB oS# )r  Fr  r  s   *,€rH   r  ÚPDistTrialRunnerTests.test_runWaitForProcessesDeferreds.<locals>.recordingFactoryö  s   ø€ ä" AÐ<°Ð<¸Ñ<ˆDØˆKrK   rA  zworker pool was never created)r  r   rê   r   r$  Úfailr!  Ú_stoppedrë   ÚcallbackrÝ   r½   r(   )rE   r  r  r-  Ústoppedr  r·   s   &     @rH   Ú!test_runWaitForProcessesDeferredsÚ6DistTrialRunnerTests.test_runWaitForProcessesDeferredsð  s´   ø€ ð ˆõ	ð
 —‘Ø.ð  ó 
ˆô ×"Ò" 6§?¡?°4·:±:Ó#>Ó?ˆØŠ<Ø�I‰IÐ5Ô6àÒÐÐØ—-‘- Õ"×+Ñ+ˆØ×Ñ˜AÔØ×Ñ˜ÔØ×%Ñ% aÓ(ˆØ×Ñ˜f¤lÖ3rK   c           	     ón  € \        4       p\        \        P                  ! R4      \        P
                  ! R4      \        P                  ! R4      .4      pV P                  VR^R7      pVP                  V4      pV P                  V4      p\        VP                  \        ^\        ^4      R7      4       R# )z~
L{DistTrialRunner} can run in C{exitFirst} mode where it will run until a
test fails and then abandon the rest of the suite.
r  Ú	test_failÚtest_barT)r  Ú	exitFirstr	  )Ú	successesÚfailuresN)r   r:   r=   ÚFooTestr<   ÚTestRegularFailr  r   rÝ   r   r,  r>   r   )rE   r  r$  r  r-  r  s   &     rH   Útest_exitFirstÚ#DistTrialRunnerTests.test_exitFirst	  s•   € ô
 “ˆää—’˜zÓ*Ü×)Ò)¨+Ó6Ü—’˜zÓ*ðó
ˆð —‘ v¸È!�ÓLˆØ�O‰O˜EÓ"ˆØ×%Ñ% aÓ(ˆÜØ�O‰OÜØÜ# A›ôö	
rK   c                óz  € \        4       p\        P                  ! R4      pV P                  VR7      pVP	                  VRR7      pV P                  V4      pV P                  ^VP                  4       V P                  VP                  4       4       VP                  4       pV P                  VP                  R4      VP                  ^,
          R4       V P                  RV4       \        ^^4       F  pV P                  RV 2V4       K  	  V P                  VP                  R	4      VP                  R
4       R# )zg
L{DistTrialRunner} can run in C{untilFailure} mode where it will run
the given tests until they fail.
Útest_itr1  T)ÚuntilFailurer3  z expected to see PASSED in outputÚFAILz
Test Pass zRan 1 tests inz2expected to see per-iteration test count in outputN)r   r<   ÚEventuallyFailingTestCaser  r   rÝ   rœ   r#  r˜   ÚwasSuccessfulr4  rž   r5  rº   )rE   r  Úcaser  r-  r  r6  rÓ   s   &       rH   Útest_runUntilFailureÚ)DistTrialRunnerTests.test_runUntilFailure"  s  € ô
 “ˆÜ×2Ò2°9Ó=ˆØ—‘ v�Ó.ˆØ�O‰O˜D¨tˆOÓ4ˆØ×%Ñ% aÓ(ˆà×Ñ˜˜DŸF™FÔ#Ø×Ñ˜×-Ñ-Ó/Ô0Ø—‘Ó"ˆð 	×ÑØ�L‰L˜Ó"Ø�F‰F�Q�JØ.ô	
ð 	�‰�f˜fÔ%ô �q˜!–ˆAØ�M‰M˜J q cÐ*¨FÖ3ñ ð 	×ÑØ�L‰LÐ)Ó*Ø�F‰FØ@ö	
rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  E  s   ø€ ÷ 3ñ 3˜$ñ 3rK   c                óà   € V P                  4       pVP                  V P                  4      p\        VP	                  4       \        R4      4       \        VP                  \        ^4      4       R# )z_
L{DistTrialRunner.run} returns a L{DistReporter} containing the result of
the test suite run.
TN)r  rˆ   r$  r   rn  r   rc  )rE   r  r  s   &  rH   r¨   ÚDistTrialRunnerTests.test_runE  sM   € ð
 —‘Ó!ˆØ—‘˜DŸJ™JÓ'ˆÜ�F×(Ñ(Ó*¬H°T«NÔ;Ü�F×$Ñ$¤h¨q£kÖ2rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  O  s   ø€ ÷ 4ñ 4 tñ 4rK   c                óP  € \        . 4      p\        V4      ;_uu_ 4        V P                  RR7      pRRR4       XP                  V P                  4      p\        VP                  \        . 4      4       \        VP                  \        . 4      4       \        VP                  4       \        R4      4       \        VP                  \        ^4      4       \        VP                  \        ^4      4       \        VP                  \        ^4      4       R#   + '       g   i     Lë; i)zi
L{DistTrialRunner.run} uses the installed reactor L{DistTrialRunner} was
constructed without a reactor.
N©r�   T)rc   r"   r  rˆ   r$  r   rC  r   rd  rn  rc  r‚   r~   )rE   r�   r  r  s   &   rH   Útest_installedReactorÚ*DistTrialRunnerTests.test_installedReactorO  sÀ   € ô
 " "Ó%ˆÜ˜g×&Õ&Ø—^‘^¨D�^Ó1ˆF÷ 'à—‘˜DŸJ™JÓ'ˆÜ�F—M‘M¤8¨B£<Ô0Ü�F—O‘O¤X¨b£\Ô2Ü�F×(Ñ(Ó*¬H°T«NÔ;Ü�F×$Ñ$¤h¨q£kÔ2Ü�G×$Ñ$¤h¨q£kÔ2Ü�G×%Ñ%¤x°£{Ö3÷ '×&ús   ŸDÄD%	c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   r)  _  s   ø€ ÷ +-ñ +-¨Dñ +-rK   c           	     ó€  €  ! R R\         4      p\        \        P                  4       ! R R4      4       p ! R R4      p\	        V! 4       4      ;_uu_ 4        V P                  \        4      ;_uu_ 4        V P                  RR7       RRR4       RRR4       \	        V! 4       4      ;_uu_ 4        V P                  \        4      ;_uu_ 4        V P                  RR7       RRR4       RRR4       \	        V! 4       4      ;_uu_ 4        V P                  \        4      ;_uu_ 4        V P                  RR7       RRR4       RRR4       R#   + '       g   i     LÌ; i  + '       g   i     L×; i  + '       g   i     L™; i  + '       g   i     L¤; i  + '       g   i     Lf; i  + '       g   i     R# ; i)	z˜
L{DistTrialRunner} raises L{TypeError} if the installed reactor provides
neither L{IReactorCore} nor L{IReactorProcess} and no other reactor is
given.
c                   ó&   a € ] tR tRt o R tRtV tR# )Ú=DistTrialRunnerTests.test_wrongInstalledReactor.<locals>.Coreif  c                ó   € R # re   rD   r   s   &rH   ÚinstallWakerÚJDistTrialRunnerTests.test_wrongInstalledReactor.<locals>.Core.installWakerg  s   € ÙrK   rD   N)rX   rY   rZ   r[   r  r_   r`   ra   s   @rH   ÚCorer}  f  s   ø‡ € ÷ð rK   r�  c                   ó*   a € ] tR tRt o RR ltRtV tR# )Ú@DistTrialRunnerTests.test_wrongInstalledReactor.<locals>.Processij  Nc
                ó   € R # re   rD   )
rE   rÇ   ro   rp   rq   rr   rs   rt   ru   rv   s
   &&&&&&&&&&rH   rw   ÚMDistTrialRunnerTests.test_wrongInstalledReactor.<locals>.Process.spawnProcessl  s   € ñ rK   rD   )NNNNFN)rX   rY   rZ   r[   rw   r_   r`   ra   s   @rH   ÚProcessrƒ  j  s   ø‡ € ÷ò rK   r†  c                   ó   € ] tR tRtRtR# )Ú@DistTrialRunnerTests.test_wrongInstalledReactor.<locals>.Neitheriz  rD   N©rX   rY   rZ   r[   r_   rD   rK   rH   ÚNeitherrˆ  z  ó   † ÛrK   rŠ  Nrw  )r   r	   r   r’   r"   rK  Ú	TypeErrorr  )rE   r�  r†  rŠ  s   &   rH   Útest_wrongInstalledReactorÚ/DistTrialRunnerTests.test_wrongInstalledReactor_  s   € ô	”;ô 	ô 
”Z×/Ñ/Ó	0÷	ð 	ó 
1ð	÷	ñ 	ô ™g›i×(Õ(Ø×"Ñ"¤9×-Õ-Ø—‘ t�Ô,÷ .÷ )ô
 ™d›f×%Õ%Ø×"Ñ"¤9×-Õ-Ø—‘ t�Ô,÷ .÷ &ô
 ™g›i×(Õ(Ø×"Ñ"¤9×-Õ-Ø—‘ t�Ô,÷ .÷ )Ñ(÷ .×-ú÷ )×(ú÷ .×-ú÷ &×%ú÷ .×-ú÷ )×(Ð(úsl   ÁE Á6E	Â	E Â1FÃE3	Ã"FÄ
F,Ä(F	Ä;F,ÅEÅE Å E0	Å3FÅ>FÆF	ÆF)Æ$F,Æ,F=	c                óø   a€  ! R R\         4      oV3R lpV P                  VR7      pV P                  S4      ;_uu_ 4        VP                  V P                  4       RRR4       R#   + '       g   i     R# ; i)zl
If there is an unexpected exception running the test suite then it is
re-raised by L{DistTrialRunner.run}.
c                   ó   € ] tR tRtRtR# )Ú;DistTrialRunnerTests.test_runFailure.<locals>.BrokenFactoryi”  rD   Nr‰  rD   rK   rH   ÚBrokenFactoryr‘  ”  r‹  rK   r’  c                  ó   <€ S! 4       hre   rD   )rp   r‡   r’  s   *,€rH   ÚbrokenFactoryÚ;DistTrialRunnerTests.test_runFailure.<locals>.brokenFactory—  s   ø€ Ù“/Ð!rK   rA  N)Ú	Exceptionr  rK  rˆ   r$  )rE   r”  r  r’  s   &  @rH   Útest_runFailureÚ$DistTrialRunnerTests.test_runFailureŒ  sV   ø€ ô	œIô 	õ	"ð —‘°-�Ó@ˆØ×Ñ˜}×-Õ-Ø�J‰J�t—z‘zÔ"÷ .×-×-Ò-ús   ÁA(Á(A9	rD   N)rX   rY   rZ   r[   r\   r:   r=   re  r$  r  r  r%  r.  r7  r=  rG  rL  rS  r]  rg  rp  r¨   rx  r�  r—  r_   r`   ra   s   @rH   r  r  k  s¦   ø‡ € ññ ˜Ÿš zÓ2Ð3Ó4€Eò'ò 	-òD÷,	Oð 	Oò
(ò(÷&	Cð 	C÷#ð #÷?ð ?÷4ð 4ò2
ò2!
÷F3ð 3÷4ð 4÷ +-ð +-÷Z#ð #rK   r  c                   ó~   a € ] tR tRt o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R	 lR
 ltV 3R lR lt	Rt
V tR# )ÚFunctionalTestsiŸ  z0
Tests for the functional helpers that need it.
c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   ÚFunctionalTests.__annotate__¤  s   ø€ ÷ 5ñ 5 4ñ 5rK   c                ó‚   € \        \        ^R4      \        ^4      4       \        \        ^^4      \        ^4      4       R# )z¶
``fromOptional`` accepts a default value and an ``Optional`` value of the
same type and returns the default value if the optional value is
``None`` or the optional value otherwise.
N)r   r.   r   r   s   &rH   Útest_fromOptionalÚ!FunctionalTests.test_fromOptional¤  s.   € ô 	”L  DÓ)¬8°A«;Ô7Ü”L  AÓ&¬°«Ö4rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   rœ  ­  s   ø€ ÷ 	5ñ 	5 Dñ 	5rK   c                óº   € \        4       p\        V4      pV P                  V4       VP                  R4       \	        V P                  V4      \        4       4       R# )z{
``discardResult`` accepts an awaitable and returns a ``Deferred`` that
fires with ``None`` after the awaitable completes.
r  N)r   r-   rë   r[  r   rÝ   r   )rE   r  r-  s   &  rH   Útest_discardResultÚ"FunctionalTests.test_discardResult­  sF   € ô
 $›:ˆÜ˜!ÓˆØ×Ñ˜AÔØ	�
‰
�8ÔÜ�D×(Ñ(¨Ó+¬T«VÖ4rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   rœ  ¸  s   ø€ ÷ ;ñ ;˜tñ ;rK   c                ó  € \        4       p\        4       p\         P                  ! \        W4      4      pVP                  ^*4       V P	                  V4       VP                  R4       \        V P                  V4      \        ^*4      4       R# )z�
``sequence`` accepts two awaitables and returns an awaitable that waits
for the first one to complete and then completes with the result of
the second one.
ÚhelloN)r   rê   r0   r[  rë   r   rÝ   r   )rE   r  ÚbÚcs   &   rH   Útest_sequenceÚFunctionalTests.test_sequence¸  sd   € ô $›:ˆÜ#›:ˆÜ×"Ò"¤8¨A£>Ó2ˆØ	�
‰
�2ŒØ×Ñ˜AÔØ	�
‰
�7ÔÜ�D×(Ñ(¨Ó+¬X°b«\Ö:rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   rœ  Æ  s   ø€ ÷ ;ñ ; 4ñ ;rK   c                ó’  € \        4       \        4       \        4       .pR p\         P                  ! \        V\        V4      P                  4      4      pVP	                  4       P                  ^4       V P                  V4       VP	                  4       P                  ^*4       \        V P                  V4      \        ^*4      4       R# )zm
``iterateWhile`` executes the actions from its factory until the predicate
does not match an action result.
c                 ó   € V ^*8g  # )é*   rD   )Úvalues   &rH   Ú	predicateÚ4FunctionalTests.test_iterateWhile.<locals>.predicateÍ  s   € Ø˜B‘;ÐrK   N)
r   rê   r/   ÚlistÚpopr[  rë   r   rÝ   r   )rE   Úactionsr°  r-  s   &   rH   Útest_iterateWhileÚ!FunctionalTests.test_iterateWhileÆ  s–   € ô
 )1«
´H³JÄÃ
Ð'Kˆò	ô $×1Ò1Ü˜¤D¨£M×$5Ñ$5Ó6ó
ˆð 	�‰‹×Ñ˜qÔ!ð 	×Ñ˜AÔð 	�‰‹×Ñ˜rÔ"ä�D×(Ñ(¨Ó+¬X°b«\Ö:rK   c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   rœ  ß  s   ø€ ÷ 6ñ 6 Dñ 6rK   c                ó~   € \         R R l4       p\        ^^
4       F  p\        V! 4       \        V4      4       K  	  R# )z}
``countingCalls`` decorates a function so that it is called with an
increasing counter and passes the return value through.
c                ó0   € V ^8„  d   QhR\         R\         /# )rR   r#  rù   )rS   )rT   s   "rH   rV   Ú8FunctionalTests.test_countingCalls.<locals>.__annotate__æ  s   € ÷ 	ñ 	”cð 	œcñ 	rK   c                 ó   € V ^,           # )r—   rD   )r#  s   &rH   ÚtargetÚ2FunctionalTests.test_countingCalls.<locals>.targetå  s   € à�q•5ˆLrK   N)r,   rº   r   r   )rE   r¼  Úexpecteds   &  rH   Útest_countingCallsÚ"FunctionalTests.test_countingCallsß  s9   € ô 
ô	ó 
ð	ô ˜a žˆHÜ™›¤(¨8Ó"4Ö5ó %rK   rD   N)rX   rY   rZ   r[   r\   rž  r¢  r©  rµ  r¿  r_   r`   ra   s   @rH   rš  rš  Ÿ  s<   ø‡ € ñ÷5ð 5÷	5ð 	5÷;ð ;÷;ð ;÷26ö 6rK   rš  c                   ó   € ] tR tRtRtRtR# )rE  ií  zl
An exception for ``StartedWorkerPoolBroken`` to fail with to allow tests
to exercise exception code paths.
rD   N©rX   rY   rZ   r[   r\   r_   rD   rK   rH   rE  rE  í  s   † õrK   rE  c                   óH   a € ] tR tRt o RtV 3R lR ltV 3R lR ltRtV tR# )	ÚStartedWorkerPoolBrokeniô  zb
A broken, started worker pool.  Its workers cannot run actions.  They
always raise an exception.
c                ó2   <€ V ^8„  d   QhRS[ R,          RR/# ©rR   ÚworkerActionNrù   ©r4   )rT   rU   s   "€rH   rV   Ú$StartedWorkerPoolBroken.__annotate__ú  s    ø€ ÷ !ñ !¡l°4Õ&8ð !¸Tñ !rK   c              ƒ  ó   "  € \        4       h5ire   )rE  )rE   rÇ  s   &&rH   rˆ   ÚStartedWorkerPoolBroken.runú  s   é € ÜÓ Ð ùó   ‚c                ó   <€ V ^8„  d   QhRR/# r(  rD   )rT   rU   s   "€rH   rV   rÉ  ý  s   ø€ ÷ ñ ˜Dñ rK   c              ƒ  ó   "  € R # 5ire   rD   r   s   &rH   rÒ   ÚStartedWorkerPoolBroken.joiný  s   é € Ùùs   ‚rD   N)	rX   rY   rZ   r[   r\   rˆ   rÒ   r_   r`   ra   s   @rH   rÄ  rÄ  ô  s   ø‡ € ñ÷
!ð !÷ö rK   rÄ  c                   óB   a € ] tR tRt o RtV 3R lR ltV 3R ltRtV tR# )rB  i  z>
A worker pool that has workers with a broken ``run`` method.
c                ó:   <€ V ^8„  d   QhRS[ P                  RS[/# ©rR   r�   rù   )r   r’   rÄ  )rT   rU   s   "€rH   rV   ÚBrokenWorkerPool.__annotate__	  s#   ø€ ÷ )ñ )Ù!×1Ñ1ð)á	 ñ)rK   c              ƒ  ó   "  € \        4       # 5ire   )rÄ  )rE   r�   s   &&rH   rÜ   ÚBrokenWorkerPool.start	  s   é € ô 'Ó(Ð(ùrÌ  c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )rR   Ú_config)r+   )rT   rU   s   "€rH   rV   rÓ    s   ø‡ ‚ ñ Ñò rK   rD   N)	rX   rY   rZ   r[   r\   rÜ   r^   r_   r`   ra   s   @rH   rB  rB    s   ø‡ € ñ÷)ð )÷ ƒ rK   rB  c                   ó6   a € ] tR tRt o RtV 3R lR ltRtV tR# )Ú_LocalWorkeri  zÛ
A L{Worker} that runs tests in this process in the usual way.

This is a test double for L{LocalWorkerAMP} which allows testing worker
pool logic without sending tests over an AMP connection to be run
somewhere else..
c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )rR   ro  r  rù   )ÚPyUnitTestCaser6   r2   )rT   rU   s   "€rH   rV   Ú_LocalWorker.__annotate__  s"   ø€ ÷ !ñ !™nð !±jð !ÁYñ !rK   c              ƒ  óH   "  € \        V.4      P                  V4       RR/# 5i)z(
Directly run C{case} in the usual way.
ÚsuccessT)r:   rˆ   ©rE   ro  r  s   &&&rH   rˆ   Ú_LocalWorker.run  s'   é € ô 	�D�6Ó×Ñ˜vÔ&Ø˜4Ð Ð ùs   ‚ "rD   N©rX   rY   rZ   r[   r\   rˆ   r_   r`   ra   s   @rH   rÙ  rÙ    s   ø‡ € ñ÷!ö !rK   rÙ  c                   ó   € ] tR tRtRtRtR# )rR  i   z=
A worker tried to run a test case but the worker is broken.
rD   NrÂ  rD   rK   rH   rR  rR     s   † õrK   rR  c                   ó6   a € ] tR tRt o RtV 3R lR ltRtV tR# )rQ  i&  z2
A L{Worker} that always fails to run test cases.
c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )rR   ro  r  rù   N)rÛ  r6   )rT   rU   s   "€rH   rV   Ú_BrokenLocalWorker.__annotate__+  s"   ø€ ÷ ñ ™nð ±jð ÀTñ rK   c              ƒ  ó   "  € \        4       h5i)z0
Raise an exception instead of running C{case}.
)rR  rß  s   &&&rH   rˆ   Ú_BrokenLocalWorker.run+  s   é € ô ‹nÐùrÌ  rD   Nrá  ra   s   @rH   rQ  rQ  &  s   ø‡ € ñ÷ö rK   rQ  c                   óH   a € ] tR tRt o RtV 3R lR ltR tV 3R ltRtV t	R# )	ÚStartedLocalWorkerPooli2  z
A started L{LocalWorkerPool}.
c                ó2   <€ V ^8„  d   QhRS[ R,          RR/# rÆ  rÈ  )rT   rU   s   "€rH   rV   Ú#StartedLocalWorkerPool.__annotate__<  s    ø€ ÷ 'ñ '¡l°4Õ&8ð '¸Tñ 'rK   c              ƒ  óX   "  € V P                    F  pV! V4      G Rj  x€L
  K  	  R#  L
5i)z(
Run the action with each local worker.
N)rh   )rE   rÇ  Úworkers   && rH   rˆ   ÚStartedLocalWorkerPool.run<  s&   é € ð —l”lˆFÙ˜vÓ&×&Ò&ó #Ù&ùs   ‚*�(ž*c              ƒ  ó:   "  € V P                   G R j  x€L
  R #  L5ire   )rZ  r   s   &rH   rÒ   ÚStartedLocalWorkerPool.joinC  s   é € Ø�m‰m×Ôùs   ‚’“c                ól   <€ V ^8„  d   Qh/ S[ S[,          ;R&   S[S[,          ;R&   S[R,          ;R&   # )rR   r°   rh   NrZ  )r%   rû   r   r3   r   )rT   rU   s   "€rH   rV   rë  2  s8   ø‡ ‚ ñ ™s•mÑ#ñ ñ ‘&�\Ññ ñ �t�nÑò rK   rD   N)
rX   rY   rZ   r[   r\   rˆ   rÒ   r^   r_   r`   ra   s   @rH   ré  ré  2  s    ø‡ € ñ÷'ð 'ò÷# ƒ rK   ré  c                   óh   a € ] tR tRt o Rt]! ]! ]4      R7      tRt	]
tV 3R lR ltV 3R ltRtV tR	# )
r  iG  zS
Implement a worker pool that runs tests in-process instead of in child
processes.
rA   Fc                ó:   <€ V ^8„  d   QhRS[ P                  RS[/# rÒ  )r   r’   ré  )rT   rU   s   "€rH   rV   ÚLocalWorkerPool.__annotate__S  s#   ø€ ÷ 
ñ 
Ù!×1Ñ1ð
á	ñ
rK   c              ƒ  óP  "  € \        V P                  P                  4       Uu. uF  q P                  4       NK  	  pp\	        V P                  P
                  TV P                  '       d   \        R 4      M	\        4       4      pV P                  P                  V4       V# u upi 5ire   )rº   r×  r¯   Ú_workerFactoryré  r°   Ú	_autostopr   r   r!  rk   )rE   r�   rÓ   rh   rß   s   &&   rH   rÜ   ÚLocalWorkerPool.startS  s   é € ô 38¸¿¹×8OÑ8OÔ2PÓQÑ2P¨Q×&Ñ&Ö(Ñ2PˆÐQÜ(Ø�L‰L×)Ñ)ØØ"ŸnŸn˜nŒW�TŒ]´(³*ó
ˆð
 	�‰×Ñ˜WÔ%Øˆùò Rùs   ‚"B&¤B!¼A*B&c                ón   <€ V ^8„  d   Qh/ S[ ;R&   S[S[,          ;R&   S[;R&   S[. S[3,          ;R&   # )rR   r×  r!  r÷  rö  )r+   r   ré  rú   r   r3   )rT   rU   s   "€rH   rV   rô  G  sH   ø‡ ‚ ñ Ññ ñ Ñ)Õ*ÑIñ ñ Ññ ñ ˜R¡˜ZÕ(Ñ7ò rK   rD   N)rX   rY   rZ   r[   r\   r   r   r²  r!  r÷  rÙ  rö  rÜ   r^   r_   r`   ra   s   @rH   r  r  G  s5   ø‡ € ññ .3¹7À4»=Ô-I€HØ€IØ+7€N÷
ð 
÷ ƒ rK   r  )pr\   rÏ   r™   Ú	functoolsr   Úior   Úos.pathr   Útypingr   r   r   Úunittestr   rÛ  Úzope.interfacer	   r
   Úattrsr   r   r   r   Úhamcrestr   r   r   r   r   r   r   Úhamcrest.core.core.allofr   Ú
hypothesisr   Úhypothesis.strategiesr   r   Útwisted.internetr   Útwisted.internet.baser   Útwisted.internet.deferr   r   r   Útwisted.internet.errorr   Útwisted.internet.protocolr    r!   Ú#twisted.internet.test.modulehelpersr"   Útwisted.internet.testingr#   Útwisted.python.failurer$   Útwisted.python.filepathr%   Útwisted.python.lockfiler&   Útwisted.trial._distr'   Ú twisted.trial._dist.distreporterr(   Útwisted.trial._dist.disttrialr)   r*   r+   Útwisted.trial._dist.functionalr,   r-   r.   r/   r0   Útwisted.trial._dist.workerr1   r2   r3   r4   Útwisted.trial.reporterr5   r6   r7   r8   Útwisted.trial.runnerr9   r:   Útwisted.trial.unittestr;   Útestr<   r=   Úmatchersr>   r@   r’   rc   r‹   r«   r  rš  r–  rE  rÄ  rB  rÙ  rR  rQ  ré  r  rD   rK   rH   Ú<module>r     sœ  ðñó 
Û 
Ý Ý Ý ß &Ñ &Ý /ç .ç /Ó /÷÷ ñ õ +Ý ß 8å 'Ý -ß DÑ DÝ .ß ?Ý @Ý 7Ý *Ý ,Ý 2Ý 1Ý 9ß WÑ W÷õ ÷ TÓ S÷ó ÷ 9ß @ß %Ý $ð ÷ð ó ðñ& ˆZ×'Ñ'Ó(ô?Ð(ó ?ó )ð?ôD5;Ð.ô 5;ôpX3�hô X3ôvq#˜8ô q#ôh	K6�hô K6ô\�yô ÷
ñ 
ð ÷
)ð 
)ó ð
)÷!ñ !ô"�9ô ÷	ñ 	ð ÷ð ó ðð( ÷ð ó òrK   