+
    üÐj–V  ã                  óž  € R t ^ RIHt ^ RI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 ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ^ RIHt ^ RIHtHtHtHtH t   ! R R]4      t! ! R R]4      t" ! R R4      t# ! R R4      t$ ! R R]4      t% ! R R]4      t& ! R R]4      t' ! R R]4      t( ! R R]4      t) ! R  R!]4      t*R# )"z!
Tests for L{twisted.trial.util}
)ÚannotationsN)ÚStringIO)Ú	Generator)Úimplementer)Úassert_thatÚequal_to)ÚDelayedCall)ÚIProcessTransport)Úfilepath)ÚFailure)Úutil)ÚSynchronousTestCase)ÚDirtyReactorAggregateErrorÚ_JanitorÚacquireAttributeÚexcInfoOrFailureToExcInfoÚopenTestLogc                  óJ   € ] tR t^#tRtR R ltR R ltR R ltR R	 ltR
t	R# )ÚMktempTestsza
Tests for L{TestCase.mktemp}, a helper function for creating temporary file
or directory names.
c               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNone© )Úformats   "Ú>/usr/lib/python3/dist-packages/twisted/trial/test/test_util.pyÚ__annotate__ÚMktempTests.__annotate__)   s   € ÷ 	
ñ 	
˜4ñ 	
ó    c                óÌ   € V P                  4       p\        P                  P                  V4      P	                  \        P
                  4      RR pV P                  V. RO4       R# )z~
The path name returned by C{mktemp} is directly beneath a directory
which identifies the test method which created the name.
Néÿÿÿÿ)ztwisted.trial.test.test_utilr   Ú	test_name)ÚmktempÚosÚpathÚdirnameÚsplitÚsepÚassertEqual)ÚselfÚnameÚdirss   &  r   r"   ÚMktempTests.test_name)   sK   € ð
 �{‰{‹}ˆÜ�w‰w�‰˜tÓ$×*Ñ*¬2¯6©6Ó2°3°BÐ7ˆØ×ÑØÒNö	
r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   4   s   € ÷ 1ñ 1˜Tñ 1r   c                ód   € V P                  4       pV P                  WP                  4       4       R# )z6
Repeated calls to C{mktemp} return different values.
N)r#   ÚassertNotEqual)r*   r+   s   & r   Útest_uniqueÚMktempTests.test_unique4   s#   € ð �{‰{‹}ˆØ×Ñ˜D§+¡+£-Ö0r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ;   s   € ÷ /ñ /˜dñ /r   c                ó  € V P                  4       p\        P                  P                  V4      pV P	                  \        P                  P                  V4      4       V P                  \        P                  P                  V4      4       R# )zC
The directory part of the path name returned by C{mktemp} exists.
N)r#   r$   r%   r&   Ú
assertTrueÚexistsÚassertFalse)r*   r+   r&   s   &  r   Útest_createdÚMktempTests.test_created;   sU   € ð �{‰{‹}ˆÜ—'‘'—/‘/ $Ó'ˆØ�‰œŸ™Ÿ™ wÓ/Ô0Ø×ÑœŸ™Ÿ™¨Ó-Ö.r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   D   s   € ÷ 6ñ 6˜tñ 6r   c                óÆ   € \         P                  P                  V P                  4       4      pV P	                  VP                  \         P                  ! 4       4      4       R# )zJ
The path returned by C{mktemp} is beneath the current working directory.
N)r$   r%   Úabspathr#   r5   Ú
startswithÚgetcwd)r*   r%   s   & r   Útest_locationÚMktempTests.test_locationD   s7   € ô �w‰w�‰˜tŸ{™{›}Ó-ˆØ�‰˜Ÿ™¬¯	ª	«Ó4Ö5r   r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r"   r1   r8   r?   Ú__static_attributes__r   r   r   r   r   #   s    † ñõ
	
õ1õ/÷6ñ 6r   r   c                  ó>   € ] tR t^LtRtR R ltR R ltR R ltRtR	# )
ÚDirtyReactorAggregateErrorTestsz.
Tests for the L{DirtyReactorAggregateError}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   Ú,DirtyReactorAggregateErrorTests.__annotate__Q   ó   € ÷ 
ñ 
¨ñ 
r   c                óV   € \        RR.4      pV P                  \        V4      R4       R# )z%
Delayed calls are formatted nicely.
ÚFooÚbarzhReactor was unclean.
DelayedCalls: (set twisted.internet.base.DelayedCall.debug = True to debug)
Foo
barN©r   r)   Ústr©r*   Úerrors   & r   Útest_formatDelayedCallÚ6DirtyReactorAggregateErrorTests.test_formatDelayedCallQ   s,   € ô +¨E°5¨>Ó:ˆØ×ÑÜ�‹Jðö	
r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rJ   _   rK   r   c                óX   € \        . RR.4      pV P                  \        V4      R4       R# )z#
Selectables are formatted nicely.
zselectable 1zselectable 2z;Reactor was unclean.
Selectables:
selectable 1
selectable 2NrO   rQ   s   & r   Útest_formatSelectablesÚ6DirtyReactorAggregateErrorTests.test_formatSelectables_   s/   € ô +¨2°ÀÐ/OÓPˆØ×ÑÜ�‹Jðö	
r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rJ   m   s   € ÷ 
ñ 
°tñ 
r   c                ó\   € \        RR.RR.4      pV P                  \        V4      R4       R# )zB
Both delayed calls and selectables can appear in the same error.
ÚbleckÚBoozoÚSel1ÚSel2zƒReactor was unclean.
DelayedCalls: (set twisted.internet.base.DelayedCall.debug = True to debug)
bleck
Boozo
Selectables:
Sel1
Sel2NrO   rQ   s   & r   Ú%test_formatDelayedCallsAndSelectablesÚEDirtyReactorAggregateErrorTests.test_formatDelayedCallsAndSelectablesm   s4   € ô +¨G°WÐ+=ÀÈÐ?OÓPˆØ×ÑÜ�‹Jðö
	
r   r   N)	rA   rB   rC   rD   rE   rS   rW   r_   rF   r   r   r   rH   rH   L   s   † ñõ
õ
÷
ñ 
r   rH   c                  óR   € ] tR t^tRtRR R lltRR R lltR R ltR	 R
 ltRt	R# )ÚStubReactorab  
A reactor stub which contains enough functionality to be used with the
L{_Janitor}.

@ivar iterations: A list of the arguments passed to L{iterate}.
@ivar removeAllCalled: Number of times that L{removeAll} was called.
@ivar selectables: The value that will be returned from L{removeAll}.
@ivar delayedCalls: The value to return from L{getDelayedCalls}.
Nc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚdelayedCallsúlist[DelayedCall]Úselectableszlist[object] | Noner   r   r   )r   s   "r   r   ÚStubReactor.__annotate__Š   s$   € ÷ 'ñ 'Ø-ð'Ø<Oð'à	ñ'r   c                óN   € Wn         . V n        ^ V n        V'       g   . pW n        R# )zk
@param delayedCalls: See L{StubReactor.delayedCalls}.
@param selectables: See L{StubReactor.selectables}.
N©rd   Ú
iterationsÚremoveAllCalledrf   )r*   rd   rf   s   &&&r   Ú__init__ÚStubReactor.__init__Š   s'   € ð )ÔØ.0ˆŒØ ˆÔßØˆKØ&Ör   c               ó    € V ^8„  d   QhRRRR/# )r   Útimeoutzfloat | Noner   r   r   )r   s   "r   r   rg   ˜   s   € ÷ (ñ (˜|ð (°tñ (r   c                ó<   € V P                   P                  V4       R# )z
Increment C{self.iterations}.
N)rj   Úappend)r*   ro   s   &&r   ÚiterateÚStubReactor.iterate˜   s   € ð 	�‰×Ñ˜wÖ'r   c               ó   € V ^8„  d   QhRR/# )r   r   re   r   )r   s   "r   r   rg   ž   s   € ÷ !ñ !Ð!2ñ !r   c                ó   € V P                   # )z
Return C{self.delayedCalls}.
)rd   ©r*   s   &r   ÚgetDelayedCallsÚStubReactor.getDelayedCallsž   s   € ð × Ñ Ð r   c               ó   € V ^8„  d   QhRR/# )r   r   zlist[object]r   )r   s   "r   r   rg   ¤   s   € ÷  ñ  ˜<ñ  r   c                óL   € V ;P                   ^,          un         V P                  # )zC
Increment C{self.removeAllCalled} and return C{self.selectables}.
)rk   rf   rv   s   &r   Ú	removeAllÚStubReactor.removeAll¤   s!   € ð 	×Ò Õ!ÕØ×ÑÐr   ri   ©N)
rA   rB   rC   rD   rE   rl   rr   rw   r{   rF   r   r   r   rb   rb      s    † ñ÷'÷(õ!÷ ñ  r   rb   c                  ó2   € ] tR t^¬tRtR R ltR R ltRtR# )ÚStubErrorReporterz©
A subset of L{twisted.trial.itrial.IReporter} which records L{addError}
calls.

@ivar errors: List of two-tuples of (test, error) which were passed to
    L{addError}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚStubErrorReporter.__annotate__µ   s   € ÷ 7ñ 7˜$ñ 7r   c                	ó   € . V n         R # r}   ©Úerrorsrv   s   &r   rl   ÚStubErrorReporter.__init__µ   s	   € Ø46ˆŽr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚtestÚobjectrR   r   r   r   r   )r   s   "r   r   r�   ¸   s!   € ÷ *ñ *˜Vð *¨Gð *¸ñ *r   c                ó>   € V P                   P                  W34       R# )z&
Record parameters in C{self.errors}.
N)r„   rq   )r*   r‡   rR   s   &&&r   ÚaddErrorÚStubErrorReporter.addError¸   s   € ð 	�‰×Ñ˜D˜=Ö)r   rƒ   N)rA   rB   rC   rD   rE   rl   rŠ   rF   r   r   r   r   r   ¬   s   † ñõ7÷*ñ *r   r   c                  óž   € ] tR t^¿tRtR R ltR R ltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltR R ltR R ltR R ltRtR# )ÚJanitorTestsz
Tests for L{_Janitor}!
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚJanitorTests.__annotate__Ä   s   € ÷ 
5ñ 
5¨tñ 
5r   c                ó”   € \        . 4      p\        RRVR7      pVP                  4        V P                  VP                  ^ ^ .4       R# )zÜ
During pending-call cleanup, the reactor will be spun twice with an
instant timeout. This is not a requirement, it is only a test for
current behavior. Hopefully Trial will eventually not do this kind of
reactor stuff.
N©Úreactor)rb   r   Ú_cleanPendingr)   rj   ©r*   r’   Újans   &  r   Útest_cleanPendingSpinsReactorÚ*JanitorTests.test_cleanPendingSpinsReactorÄ   sA   € ô ˜b“/ˆÜ�t˜T¨7Ô3ˆØ×ÑÔØ×Ñ˜×+Ñ+¨a°¨VÖ4r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   Ð   s   € ÷ 3ñ 3¨tñ 3r   c                óÄ   € R R lp. p\        RVR/ VP                  R 4      p\        V.4      p\        RRVR7      pVP	                  4        V P                  W#.4       R# )zG
During pending-call cleanup, the janitor cancels pending timed calls.
c               ó   € V ^8„  d   QhRR/# ©r   r   rP   r   )r   s   "r   r   Ú@JanitorTests.test_cleanPendingCancelsCalls.<locals>.__annotate__Õ   s   € ÷ 	ñ 	�cñ 	r   c                 ó   € R # )ÚLulzr   r   r   r   ÚfuncÚ8JanitorTests.test_cleanPendingCancelsCalls.<locals>.funcÕ   s   € Ùr   é,  c                ó   € R # r}   r   ©Úxs   &r   Ú<lambda>Ú<JanitorTests.test_cleanPendingCancelsCalls.<locals>.<lambda>Ù   s   € ÑQUr   Nr‘   r   )r   rq   rb   r   r“   r)   )r*   rŸ   Ú	cancelledÚdelayedCallr’   r•   s   &     r   Útest_cleanPendingCancelsCallsÚ*JanitorTests.test_cleanPendingCancelsCallsÐ   s^   € õ
	ð (*ˆ	Ü! # t¨R°°Y×5EÑ5EÁ~ÓVˆÜ˜{˜mÓ,ˆÜ�t˜T¨7Ô3ˆØ×ÑÔØ×Ñ˜ MÖ2r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   ß   s   € ÷ 7ñ 7¸Dñ 7r   c           
     óÀ   € \        RR R	/ R R R R7      p\        V4      p\        V.4      p\        RRVR7      pVP	                  4       pV P                  WR.4       R# )
a  
The Janitor produces string representations of delayed calls from the
delayed call cleanup method. It gets the string representations
*before* cancelling the calls; this is important because cancelling the
call removes critical debugging information from the string
representation.
r¡   c                 ó   € R # r}   r   r   r   r   r¥   ÚIJanitorTests.test_cleanPendingReturnsDelayedCallStrings.<locals>.<lambda>è   ó   € ™r   c                ó   € R # r}   r   r£   s   &r   r¥   r®   è   ó   € ±r   c                ó   € R # r}   r   r£   s   &r   r¥   r®   è   ó   € Ár   c                 ó   € ^ # ©é    r   r   r   r   r¥   r®   è   ó   € ÑWXr   ©ÚsecondsNr‘   r   )r   rP   rb   r   r“   r)   )r*   r¨   ÚdelayedCallStringr’   r•   Ústringss   &     r   Ú*test_cleanPendingReturnsDelayedCallStringsÚ7JanitorTests.test_cleanPendingReturnsDelayedCallStringsß   sc   € ô "Ø‘˜r 2¡~±~Éyô
ˆô   Ó,ÐÜ˜{˜mÓ,ˆÜ�t˜T¨7Ô3ˆØ×#Ñ#Ó%ˆØ×Ñ˜Ð"5Ö6r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   ð   s   € ÷ 5ñ 5°Tñ 5r   c                ó�   € \        . 4      p\        RRVR7      pVP                  4        V P                  VP                  ^4       R# )z=
The Janitor will remove selectables during reactor cleanup.
Nr‘   )rb   r   Ú_cleanReactorr)   rk   r”   s   &  r   Ú#test_cleanReactorRemovesSelectablesÚ0JanitorTests.test_cleanReactorRemovesSelectablesð   s=   € ô ˜b“/ˆÜ�t˜T¨7Ô3ˆØ×ÑÔØ×Ñ˜×0Ñ0°!Ö4r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   ù   s   € ÷ /ñ /°ñ /r   c                óÜ   € \        \        4       ! R R4      4       pV! 4       p\        . V.4      p\        RRVR7      pVP	                  4        V P                  VP                  R.4       R# )z9
The Janitor will kill processes during reactor cleanup.
c                  ó2   € ] tR t^þtRtR R ltR R ltRtR# )ÚJJanitorTests.test_cleanReactorKillsProcesses.<locals>.StubProcessTransportzt
A stub L{IProcessTransport} provider which records signals.
@ivar signals: The signals passed to L{signalProcess}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚWJanitorTests.test_cleanReactorKillsProcesses.<locals>.StubProcessTransport.__annotate__  s   € ÷ 3ñ 3 $ñ 3r   c                	ó   € . V n         R # r}   ©Úsignalsrv   s   &r   rl   ÚSJanitorTests.test_cleanReactorKillsProcesses.<locals>.StubProcessTransport.__init__  s	   € Ø02�–r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsignalz	str | intr   r   r   )r   s   "r   r   rÈ     s   € ÷ ,ñ ,¨Ið ,¸$ñ ,r   c                ó<   € V P                   P                  V4       R# )z&
Append C{signal} to C{self.signals}.
N)rË   rq   )r*   rÎ   s   &&r   ÚsignalProcessÚXJanitorTests.test_cleanReactorKillsProcesses.<locals>.StubProcessTransport.signalProcess  s   € ð —‘×#Ñ# FÖ+r   rÊ   N)rA   rB   rC   rD   rE   rl   rÐ   rF   r   r   r   ÚStubProcessTransportrÆ   þ   s   † ñõ
3÷,ñ ,r   rÒ   Nr‘   ÚKILL)r   r	   rb   r   rÀ   r)   rË   )r*   rÒ   Úptr’   r•   s   &    r   Útest_cleanReactorKillsProcessesÚ,JanitorTests.test_cleanReactorKillsProcessesù   si   € ô
 
Ô&Ó	'÷	,ð 	,ó 
(ð	,ñ "Ó#ˆÜ˜b 2 $Ó'ˆÜ�t˜T¨7Ô3ˆØ×ÑÔØ×Ñ˜Ÿ™ f XÖ.r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�     s   € ÷ Añ A¸4ñ Ar   c                óœ   €  ! R R4      p\        . V! 4       .4      p\        RRVR7      pV P                  VP                  4       R.4       R# )zs
The Janitor returns string representations of the selectables that it
cleaned up from the reactor cleanup method.
c                  ó&   € ] tR tRtRtR R ltRtR# )ÚJJanitorTests.test_cleanReactorReturnsSelectableStrings.<locals>.Selectablei  zH
A stub Selectable which only has an interesting string
representation.
c               ó   € V ^8„  d   QhRR/# r›   r   )r   s   "r   r   ÚWJanitorTests.test_cleanReactorReturnsSelectableStrings.<locals>.Selectable.__annotate__   s   € ÷ 'ñ ' #ñ 'r   c                	ó   € R # )ú(SELECTABLE!)r   rv   s   &r   Ú__repr__ÚSJanitorTests.test_cleanReactorReturnsSelectableStrings.<locals>.Selectable.__repr__   s   € Ù&r   r   N)rA   rB   rC   rD   rE   rß   rF   r   r   r   Ú
SelectablerÚ     s   † ñ÷
'ñ 'r   rá   Nr‘   rÞ   )rb   r   r)   rÀ   )r*   rá   r’   r•   s   &   r   Ú)test_cleanReactorReturnsSelectableStringsÚ6JanitorTests.test_cleanReactorReturnsSelectableStrings  sH   € ÷	'ñ 	'ô ˜b¡:£< .Ó1ˆÜ�t˜T¨7Ô3ˆØ×Ñ˜×*Ñ*Ó,¨Ð.?Ö@r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   '  s   € ÷ 
.ñ 
.¨dñ 
.r   c                óÔ   € \        . 4      p\        4       p\        4       p\        W#VR7      pV P	                  VP                  4       4       V P                  VP                  . 4       R# )zu
The post-case cleanup method will return True and not call C{addError}
on the result if there are no pending calls.
r‘   N)rb   rˆ   r   r   r5   ÚpostCaseCleanupr)   r„   ©r*   r’   r‡   Úreporterr•   s   &    r   Útest_postCaseCleanupNoErrorsÚ)JanitorTests.test_postCaseCleanupNoErrors'  sQ   € ô
 ˜b“/ˆÜ‹xˆÜ$Ó&ˆÜ�t¨wÔ7ˆØ�‰˜×+Ñ+Ó-Ô.Ø×Ñ˜Ÿ™¨"Ö-r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   3  s   € ÷ Xñ X°ñ Xr   c           
     óª  € \        RR R	/ R R R R7      p\        V4      p\        V.. 4      p\        4       p\	        4       p\        WEVR7      pV P                  VP                  4       4       V P                  \        VP                  4      ^4       V P                  VP                  ^ ,          ^,          P                  P                  V.4       R# )
zœ
The post-case cleanup method will return False and call C{addError} on
the result with a L{DirtyReactorAggregateError} Failure if there are
pending calls.
r¡   c                 ó   € R # r}   r   r   r   r   r¥   Ú=JanitorTests.test_postCaseCleanupWithErrors.<locals>.<lambda>:  r¯   r   c                ó   € R # r}   r   r£   s   &r   r¥   rî   :  r±   r   c                ó   € R # r}   r   r£   s   &r   r¥   rî   :  r³   r   c                 ó   € ^ # rµ   r   r   r   r   r¥   rî   :  r·   r   r¸   r‘   Nr   )r   rP   rb   rˆ   r   r   r7   ræ   r)   Úlenr„   Úvaluerd   ©r*   r¨   rº   r’   r‡   rè   r•   s   &      r   Útest_postCaseCleanupWithErrorsÚ+JanitorTests.test_postCaseCleanupWithErrors3  s±   € ô "Ø‘˜r 2¡~±~Éyô
ˆô   Ó,ÐÜ˜{˜m¨RÓ0ˆÜ‹xˆÜ$Ó&ˆÜ�t¨wÔ7ˆØ×Ñ˜×,Ñ,Ó.Ô/Ø×Ñœ˜XŸ_™_Ó-¨qÔ1Ø×Ñ˜Ÿ™¨Õ+¨AÕ.×4Ñ4×AÑAÐDUÐCVÖWr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   E  s   € ÷ 
.ñ 
.¨tñ 
.r   c                ó¶   € \        . 4      p\        4       p\        4       p\        W#VR7      pVP	                  4        V P                  VP                  . 4       R# )zu
The post-class cleanup method will not call C{addError} on the result
if there are no pending calls or selectables.
r‘   N)rb   rˆ   r   r   ÚpostClassCleanupr)   r„   rç   s   &    r   Útest_postClassCleanupNoErrorsÚ*JanitorTests.test_postClassCleanupNoErrorsE  sH   € ô
 ˜b“/ˆÜ‹xˆÜ$Ó&ˆÜ�t¨wÔ7ˆØ×ÑÔØ×Ñ˜Ÿ™¨"Ö-r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   Q  s   € ÷ Xñ X¸Dñ Xr   c           
     óŒ  € \        RR R	/ R R R R7      p\        V4      p\        V.. 4      p\        4       p\	        4       p\        WEVR7      pVP                  4        V P                  \        VP                  4      ^4       V P                  VP                  ^ ,          ^,          P                  P                  V.4       R# )
z‡
The post-class cleanup method call C{addError} on the result with a
L{DirtyReactorAggregateError} Failure if there are pending calls.
r¡   c                 ó   € R # r}   r   r   r   r   r¥   ÚIJanitorTests.test_postClassCleanupWithPendingCallErrors.<locals>.<lambda>W  r¯   r   c                ó   € R # r}   r   r£   s   &r   r¥   rÿ   W  r±   r   c                ó   € R # r}   r   r£   s   &r   r¥   rÿ   W  r³   r   c                 ó   € ^ # rµ   r   r   r   r   r¥   rÿ   W  r·   r   r¸   r‘   Nr   )r   rP   rb   rˆ   r   r   rù   r)   rò   r„   ró   rd   rô   s   &      r   Ú*test_postClassCleanupWithPendingCallErrorsÚ7JanitorTests.test_postClassCleanupWithPendingCallErrorsQ  s¦   € ô
 "Ø‘˜r 2¡~±~Éyô
ˆô   Ó,ÐÜ˜{˜m¨RÓ0ˆÜ‹xˆÜ$Ó&ˆÜ�t¨wÔ7ˆØ×ÑÔØ×Ñœ˜XŸ_™_Ó-¨qÔ1Ø×Ñ˜Ÿ™¨Õ+¨AÕ.×4Ñ4×AÑAÐDUÐCVÖWr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r�   b  s   € ÷ Vñ V¸4ñ Vr   c                ó`  € Rp\        . V.4      p\        4       p\        4       p\        W4VR7      pVP	                  4        V P                  \        VP                  4      ^4       V P                  VP                  ^ ,          ^,          P                  P                  \        V4      .4       R# )z…
The post-class cleanup method call C{addError} on the result with a
L{DirtyReactorAggregateError} Failure if there are selectables.
zSELECTABLE HEREr‘   N)rb   rˆ   r   r   rù   r)   rò   r„   ró   rf   Úrepr)r*   Ú
selectabler’   r‡   rè   r•   s   &     r   Ú)test_postClassCleanupWithSelectableErrorsÚ6JanitorTests.test_postClassCleanupWithSelectableErrorsb  s‰   € ð
 'ˆ
Ü˜b : ,Ó/ˆÜ‹xˆÜ$Ó&ˆÜ�t¨wÔ7ˆØ×ÑÔØ×Ñœ˜XŸ_™_Ó-¨qÔ1Ø×Ñ˜Ÿ™¨Õ+¨AÕ.×4Ñ4×@Ñ@Ä4È
ÓCSÐBTÖUr   r   N)rA   rB   rC   rD   rE   r–   r©   r¼   rÁ   rÕ   râ   ré   rõ   rú   r  r	  rF   r   r   r   r�   r�   ¿   sH   † ñõ
5õ3õ7õ"5õ/õ6Aõ&
.õXõ$
.õX÷"Vñ Vr   r�   c                  ó>   € ] tR tRtRtR R ltR R ltR R ltR	tR
# )ÚRemoveSafelyTestsiq  z"
Tests for L{util._removeSafely}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚRemoveSafelyTests.__annotate__v  s   € ÷ 	Lñ 	L°ñ 	Lr   c                óú   € V P                  4       P                  R4      p\        P                  ! V4       \        P
                  ! V4      pV P                  \        P                  \        P                  V4       R# )z¨
If a path doesn't contain a node named C{"_trial_marker"}, that path is
not removed by L{util._removeSafely} and a L{util._NoTrialMarker}
exception is raised instead.
úutf-8N)
r#   Úencoder$   Úmkdirr
   ÚFilePathÚassertRaisesr   Ú_NoTrialMarkerÚ_removeSafely)r*   Ú	directoryÚdirPaths   &  r   Útest_removeSafelyNoTrialMarkerÚ0RemoveSafelyTests.test_removeSafelyNoTrialMarkerv  sT   € ð —K‘K“M×(Ñ(¨Ó1ˆ	Ü
�Š�ÔÜ×#Ò# IÓ.ˆØ×Ñœ$×-Ñ-¬t×/AÑ/AÀ7ÖKr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r  �  s   € ÷ Cñ C¸$ñ Cr   c                ó   € R R lp\        4       pV P                  \        RV4       V P                  4       P	                  R4      p\
        P                  ! V4       \        P                  ! V4      pVP                  R4      P                  4        Wn        \        P                  ! V4       V P                  RVP                  4       4       R# )z
If an L{OSError} is raised while removing a path in
L{util._removeSafely}, an attempt is made to move the path to a new
name.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚPRemoveSafelyTests.test_removeSafelyRemoveFailsMoveSucceeds.<locals>.__annotate__ˆ  s   € ÷ 	ñ 	˜Tñ 	r   c                 ó   € \        4       h)úa
Raise an C{OSError} to emulate the branch of L{util._removeSafely}
in which path removal fails.
©ÚOSErrorr   r   r   ÚdummyRemoveÚORemoveSafelyTests.test_removeSafelyRemoveFailsMoveSucceeds.<locals>.dummyRemoveˆ  s   € ô
 “)ˆOr   Ústdoutr  ó   _trial_markerúcould not remove FilePathN)r   ÚpatchÚsysr#   r  r$   r  r
   r  ÚchildÚtouchÚremover   r  ÚassertInÚgetvalue)r*   r#  Úoutr  r  s   &    r   Ú(test_removeSafelyRemoveFailsMoveSucceedsÚ:RemoveSafelyTests.test_removeSafelyRemoveFailsMoveSucceeds�  s’   € õ	ô ‹jˆØ�
‰
”3˜ #Ô&ð —K‘K“M×(Ñ(¨Ó1ˆ	Ü
�Š�ÔÜ×#Ò# IÓ.ˆØ�‰Ð&Ó'×-Ñ-Ô/à$Œä×Ò˜7Ô#Ø�‰Ð1°3·<±<³>ÖBr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r  ž  s   € ÷ %Cñ %C°tñ %Cr   c                ó  € R R lpRR R llp\        4       pV P                  \        RV4       V P                  4       P	                  R4      p\
        P                  ! V4       \        P                  ! V4      pVP                  R4      P                  4        Wn        W%n        V P                  \        \        P                   V4      pV P#                  \%        V4      R4       V P'                  R	VP)                  4       4       R
# )z³
If an L{OSError} is raised while removing a path in
L{util._removeSafely}, an attempt is made to move the path to a new
name. If that attempt fails, the L{OSError} is re-raised.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚMRemoveSafelyTests.test_removeSafelyRemoveFailsMoveFails.<locals>.__annotate__¥  s   € ÷ 	1ñ 	1˜Tñ 	1r   c                 ó   € \        R4      h)r   zpath removal failedr!  r   r   r   r#  ÚLRemoveSafelyTests.test_removeSafelyRemoveFailsMoveFails.<locals>.dummyRemove¥  s   € ô
 Ð/Ó0Ð0r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Údestinationrˆ   ÚfollowLinksÚboolr   r   r   )r   s   "r   r   r5  ¬  s!   € ÷ 	2ñ 	2 Vð 	2¸$ð 	2È$ñ 	2r   c                ó   € \        R4      h)zb
Raise an C{OSError} to emulate the branch of L{util._removeSafely}
in which path movement fails.
úpath movement failedr!  )r9  r:  s   &&r   ÚdummyMoveToÚLRemoveSafelyTests.test_removeSafelyRemoveFailsMoveFails.<locals>.dummyMoveTo¬  s   € ô
 Ð0Ó1Ð1r   r%  r  r&  r=  r'  N)T)r   r(  r)  r#   r  r$   r  r
   r  r*  r+  r,  ÚmoveTor  r"  r   r  r)   rP   r-  r.  )r*   r#  r>  r/  r  r  rR   s   &      r   Ú%test_removeSafelyRemoveFailsMoveFailsÚ7RemoveSafelyTests.test_removeSafelyRemoveFailsMoveFailsž  s¿   € õ	1÷	2ô ‹jˆØ�
‰
”3˜ #Ô&ð —K‘K“M×(Ñ(¨Ó1ˆ	Ü
�Š�ÔÜ×#Ò# IÓ.ˆØ�‰Ð&Ó'×-Ñ-Ô/ð %ŒØ$Œà×!Ñ!¤'¬4×+=Ñ+=¸wÓGˆØ×Ñœ˜U›Ð%;Ô<Ø�‰Ð1°3·<±<³>ÖBr   r   N)	rA   rB   rC   rD   rE   r  r0  rA  rF   r   r   r   r  r  q  s   † ñõ	LõC÷:%Cñ %Cr   r  c                  ó2   € ] tR tRtRtR R ltR R ltRtR# )	ÚExcInfoTestsiÆ  z)
Tests for L{excInfoOrFailureToExcInfo}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚExcInfoTests.__annotate__Ë  s   € ÷ Añ A˜dñ Ar   c                ób   € \         \        R4      R3pV P                  V\        V4      J 4       R# )zƒ
L{excInfoOrFailureToExcInfo} returns exactly what it is passed, if it is
passed a tuple like the one returned by L{sys.exc_info}.
ÚfooN)Ú
ValueErrorr5   r   )r*   Úinfos   & r   Útest_excInfoÚExcInfoTests.test_excInfoË  s,   € ô
 œJ uÓ-¨tÐ4ˆØ�‰˜Ô 9¸$Ó ?Ð?Ö@r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rF  Ó  s   € ÷ 
Pñ 
P˜dñ 
Pr   c                óÈ   €  ^^ ,           V P                  XP                  VP                  VP
                  3\        V4      4       R#   \          d    \        4       p LUi ; i)zÌ
When called with a L{Failure} instance, L{excInfoOrFailureToExcInfo}
returns a tuple like the one returned by L{sys.exc_info}, with the
elements taken from the type, value, and traceback of the failure.
N)ÚBaseExceptionr   r)   Útyperó   Útbr   )r*   Úfs   & r   Útest_failureÚExcInfoTests.test_failureÓ  sQ   € ð	Ø�ŽEð 	×Ñ˜!Ÿ&™& !§'¡'¨1¯4©4Ð0Ô2KÈAÓ2NÖOøô ô 	Ü“	ŠAð	ús   ‚	A	 Á	A!Á A!r   N)rA   rB   rC   rD   rE   rK  rS  rF   r   r   r   rD  rD  Æ  s   † ñõA÷
Pñ 
Pr   rD  c                  óJ   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltRt	R# )ÚAcquireAttributeTestsià  z 
Tests for L{acquireAttribute}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   Ú"AcquireAttributeTests.__annotate__å  s   € ÷ Nñ N¨4ñ Nr   c                óv   € \        4       ;V n        pV P                  V\        V \        4       .R4      J 4       R# )z—
The value returned by L{acquireAttribute} is the value of the requested
attribute on the first object in the list passed in which has that
attribute.
ró   N©rˆ   ró   r5   r   ©r*   ró   s   & r   Útest_foundOnEarlierObjectÚ/AcquireAttributeTests.test_foundOnEarlierObjectå  s2   € ô $›XÐ%ˆŒ
�UØ�‰˜Ô!1°4¼»Ð2BÀGÓ!LÐLÖMr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rX  î  s   € ÷ Nñ N¨ñ Nr   c                óv   € \        4       ;V n        pV P                  V\        \        4       V .R4      J 4       R# )z�
The same as L{test_foundOnEarlierObject}, but for the case where the 2nd
element in the object list has the attribute and the first does not.
ró   NrZ  r[  s   & r   Útest_foundOnLaterObjectÚ-AcquireAttributeTests.test_foundOnLaterObjectî  s2   € ô
 $›XÐ%ˆŒ
�UØ�‰˜Ô!1´6³8¸TÐ2BÀGÓ!LÐLÖMr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rX  ö  s   € ÷ Oñ O¨ñ Or   c                óP   € V P                  \        \        \        4       .R4       R# )z}
If none of the objects passed in the list to L{acquireAttribute} have
the requested attribute, L{AttributeError} is raised.
rH  N)r  ÚAttributeErrorr   rˆ   rv   s   &r   Útest_notFoundExceptionÚ,AcquireAttributeTests.test_notFoundExceptionö  s   € ð
 	×Ñœ.Ô*:¼V»X¸JÈÖNr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rX  ý  s   € ÷ Qñ Q dñ Qr   c                óh   € \        4       pV P                  V\        \        4       .RV4      J 4       R# )zœ
If none of the objects passed in the list to L{acquireAttribute} have
the requested attribute and a default value is given, the default value
is returned.
rH  N)rˆ   r5   r   )r*   Údefaults   & r   Útest_notFoundDefaultÚ*AcquireAttributeTests.test_notFoundDefaultý  s*   € ô “(ˆØ�‰˜Ô#3´V³X°JÀÀwÓ#OÐOÖPr   )ró   N)
rA   rB   rC   rD   rE   r\  r`  re  rj  rF   r   r   r   rV  rV  à  s%   † ñõNõNõO÷Qñ Qr   rV  c                  ó†   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR R ltRtR# )ÚListToPhraseTestsi  z¶
Input is transformed into a string representation of the list,
with each item separated by delimiter (defaulting to a comma) and the final
two being separated by a final delimiter.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚListToPhraseTests.__annotate__  s   € ÷ +ñ +˜Dñ +r   c                ó^   € . pRp\         P                  ! VR4      pV P                  W#4       R# )z2
If things is empty, an empty string is returned.
Ú ÚandN©r   Ú_listToPhraser)   ©r*   ÚsampleÚexpectedÚresults   &   r   Ú
test_emptyÚListToPhraseTests.test_empty  s.   € ð  ˆØˆÜ×#Ò# F¨EÓ2ˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro    s   € ÷ +ñ +˜dñ +r   c                ó`   € R.pRp\         P                  ! VR4      pV P                  W#4       R# )z+
With a single item, the item is returned.
ÚOnerr  Nrs  ru  s   &   r   Útest_oneWordÚListToPhraseTests.test_oneWord  s0   € ð �ˆØˆÜ×#Ò# F¨EÓ2ˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro     s   € ÷ +ñ +˜tñ +r   c                ób   € RR.pRp\         P                  ! VR4      pV P                  W#4       R# )z1
Two words are separated by the final delimiter.
r}  ÚTwozOne and Tworr  Nrs  ru  s   &   r   Útest_twoWordsÚListToPhraseTests.test_twoWords   s2   € ð ˜�ˆØ ˆÜ×#Ò# F¨EÓ2ˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro  )  s   € ÷ +ñ + ñ +r   c                ób   € . ROpRp\         P                  ! VR4      pV P                  W#4       R# )zI
With more than two words, the first two are separated by the delimiter.
zOne, Two, and Threerr  N)r}  r‚  ÚThreers  ru  s   &   r   Útest_threeWordsÚ!ListToPhraseTests.test_threeWords)  s.   € ò )ˆØ(ˆÜ×#Ò# F¨EÓ2ˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro  2  ó   € ÷ +ñ + ñ +r   c                óf   € . ROpRp\         P                  ! VRRR7      pV P                  W#4       R# )zG
If a delimiter is specified, it is used instead of the default comma.
zOne; Two; Three; or FourÚorz; )Ú	delimiterN)r}  r‚  r‡  ÚFourrs  ru  s   &   r   Útest_fourWordsÚ ListToPhraseTests.test_fourWords2  s0   € ò 1ˆØ-ˆÜ×#Ò# F¨D¸DÔAˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro  ;  r‹  r   c                ób   € . ROpRp\         P                  ! VR4      pV P                  W#4       R# )zC
If something in things is not a string, it is converted into one.
z1, 2, and threerr  N)é   r   Úthreers  ru  s   &   r   Útest_notStringÚ ListToPhraseTests.test_notString;  s.   € ò !ˆØ$ˆÜ×#Ò# F¨EÓ2ˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro  D  s   € ÷ Iñ I dñ Ir   c                óŒ   € RpV P                  \        \        P                  VR4      pV P	                  \        V4      R4       R# )z/
If things is a string, a TypeError is raised.
zOne, two, threerr  ú Things must be a list or a tupleN©r  Ú	TypeErrorr   rt  r)   rP   ©r*   rv  rR   s   &  r   Útest_stringTypeErrorÚ&ListToPhraseTests.test_stringTypeErrorD  s:   € ð #ˆØ×!Ñ!¤)¬T×-?Ñ-?ÀÈÓOˆØ×Ñœ˜U›Ð%GÖHr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro  L  s   € ÷ Iñ I¨ñ Ir   c                ó¢   € \        . RO4      pV P                  \        \        P                  VR4      pV P                  \        V4      R4       R# )z2
If things is an iterator, a TypeError is raised.
rr  rš  N)r”  r   é   )Úiterr  rœ  r   rt  r)   rP   r�  s   &  r   Útest_iteratorTypeErrorÚ(ListToPhraseTests.test_iteratorTypeErrorL  s>   € ô ’i“ˆØ×!Ñ!¤)¬T×-?Ñ-?ÀÈÓOˆØ×Ñœ˜U›Ð%GÖHr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ro  T  s   € ÷ 	Iñ 	I¨ñ 	Ir   c                ó”   € R R lpV P                  \        \        P                  VR4      pV P	                  \        V4      R4       R# )z2
If things is a generator, a TypeError is raised.
c               ó   € V ^8„  d   QhRR/# )r   r   zGenerator[int, None, None]r   )r   s   "r   r   Ú?ListToPhraseTests.test_generatorTypeError.<locals>.__annotate__Y  s   € ÷ 	 ñ 	 Ð2ñ 	 r   c               3  ó8   "  € \        ^4       Rj  x€L
  R#  L5i)r   N)Úranger   r   r   rv  Ú9ListToPhraseTests.test_generatorTypeError.<locals>.sampleY  s   é € Ü˜Q“x×Ôùs   ‚‘’rr  rš  Nr›  r�  s   &  r   Útest_generatorTypeErrorÚ)ListToPhraseTests.test_generatorTypeErrorT  s:   € õ
	 ð ×!Ñ!¤)¬T×-?Ñ-?ÀÈÓOˆØ×Ñœ˜U›Ð%GÖHr   r   N)rA   rB   rC   rD   rE   ry  r~  rƒ  rˆ  r�  r–  rž  r¤  r­  rF   r   r   r   rm  rm    s=   † ñõ+õ+õ+õ+õ+õ+õIõI÷	Iñ 	Ir   rm  c                  ó2   € ] tR tRtRtR R ltR R ltRtR# )	ÚOpenTestLogTestsi`  z
Tests for C{openTestLog}.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚOpenTestLogTests.__annotate__e  s   € ÷ =ñ =˜4ñ =r   c                ó€  € \         P                  ! 4       pV P                  \         P                  \         P                  V4       \         P                  ! \         P                  R4       Rp\
        P                  ! V P                  4       4      p\        V4      ;_uu_ 4       pVP                  V4       RRR4       \        VP                  R4      ;_uu_ 4       pVP                  4       pRRR4       \        VP                  R4      \        X4      4       R#   + '       g   i     Lm; i  + '       g   i     LI; i)zB
The log file is opened in text mode and uses UTF-8 for encoding.
u   Here comes the â˜‰NÚrbr  )ÚCÚascii)ÚlocaleÚ	getlocaleÚ
addCleanupÚ	setlocaleÚLC_ALLr
   r  r#   r   ÚwriteÚopenr%   Úreadr   r  r   )r*   ÚcurrentLocaleÚtextÚprR  Úwrittens   &     r   Ú	test_utf8ÚOpenTestLogTests.test_utf8e  sÆ   € ô ×(Ò(Ó*ˆØ�‰œ×(Ñ(¬&¯-©-¸ÔGÜ×ÒœŸ™¨Ô7à'ˆÜ×Ò˜dŸk™k›mÓ,ˆÜ˜�^Œ^˜qØ�G‰G�DŒM÷ ô �!—&‘&˜$×Ô 1Ø—f‘f“hˆG÷  ô 	�D—K‘K Ó(¬(°7Ó*;Ö<÷ �^ú÷  ×ús   Â#DÃD-ÄD*	Ä-D=	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r²  {  s   € ÷ 
ñ 
˜Tñ 
r   c                ó  € RpRpR\         P                   R\         P                   2p\        P                  ! V P	                  4       4      p\        V4      ;_uu_ 4       pVP                  V4       RRR4       \        V4      ;_uu_ 4       pVP                  V4       RRR4       \        VP                  4       P                  R4      \        V4      4       R#   + '       g   i     Lq; i  + '       g   i     LW; i)z�
The log file is opened in append mode so if runner configuration specifies
an existing log file its contents are not wiped out.
zHello, world.
 zGoodbye, world.
zHello, world.z Goodbye, world.Nr  )r$   Úlinesepr
   r  r#   r   r¼  r   Ú
getContentÚdecoder   )r*   ÚexistingTextÚnewTextrw  rÁ  rR  s   &     r   Útest_appendÚOpenTestLogTests.test_append{  s«   € ð
 *ˆØ%ˆØ"¤2§:¡: ,Ð.>¼r¿z¹z¸lÐKˆÜ×Ò˜dŸk™k›mÓ,ˆÜ˜�^Œ^˜qØ�G‰G�LÔ!÷ ä˜�^Œ^˜qØ�G‰G�GÔ÷ ô 	Ø�L‰L‹N×!Ñ! 'Ó*Ü�XÓö	
÷ �^úç�^ús   Á CÂC.ÃC+	Ã.C>	r   N)rA   rB   rC   rD   rE   rÃ  rÌ  rF   r   r   r   r°  r°  `  s   † ñõ=÷,
ñ 
r   r°  )+rE   Ú
__future__r   r·  r$   r)  Úior   Útypingr   Úzope.interfacer   Úhamcrestr   r   Útwisted.internet.baser   Útwisted.internet.interfacesr	   Útwisted.pythonr
   Útwisted.python.failurer   Útwisted.trialr   Útwisted.trial.unittestr   Útwisted.trial.utilr   r   r   r   r   r   rH   rb   r   r�   r  rD  rV  rm  r°  r   r   r   Ú<module>rÚ     sÓ   ðñ
õ #ã Û 	Û 
Ý Ý å &ç *å -Ý 9Ý #Ý *Ý Ý 6÷õ ô&6Ð%ô &6ôR0
Ð&9ô 0
÷f* ñ * ÷Z*ñ *ô&oVÐ&ô oVôdRCÐ+ô RCôjPÐ&ô Pô4$QÐ/ô $QôNVIÐ+ô VIôr,
Ð*ö ,
r   