+
    üÐjÃ&  ã                  ó¨   € R 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HtHtHt  ! R R	]! ]R
4      4      t ! R R]4      tR# )z&
Tests for L{twisted._threads._team}.
)Úannotations)ÚCallable)ÚproxyForInterface)ÚcallÚget)ÚFailure)ÚSynchronousTestCase)ÚAlreadyQuitÚIWorkerÚTeamÚcreateMemoryWorkerc                  ó>   a € ] tR t^tRtR R ltR V 3R lltRtV ;t# )ÚContextualWorkerz2
A worker implementation that supplies a context.
c               ó$   € V ^8„  d   QhRRRRRR/# )é   Ú
realWorkerr
   ÚctxÚobjectÚreturnÚNone© )Úformats   "ÚA/usr/lib/python3/dist-packages/twisted/_threads/test/test_team.pyÚ__annotate__ÚContextualWorker.__annotate__   s!   € ÷ ñ  7ð °6ð ¸dñ ó    c                ó   € Wn         W n        R# )z*
Create with a real worker and a context.
N)Ú_realWorkerÚ_context)Úselfr   r   s   &&,r   Ú__init__ÚContextualWorker.__init__   s   € ð &ÔØŽr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚworkzCallable[[], object]r   r   r   )r   s   "r   r   r      s   € ÷ 6ñ 6Ð+ð 6°ñ 6r   c                ó4   <a a€ \         SS `  V V3R l4       R# )zr
Perform the given work with the context given to __init__.

@param work: the work to pass on to the real worker.
c                 ó0   <€ \        S P                  S4      # ©N)r   r   )r   r#   s   €€r   Ú<lambda>Ú%ContextualWorker.do.<locals>.<lambda>%   s   ø€ œ4 §¡¨tÔ4r   N)ÚsuperÚdo)r   r#   Ú	__class__s   ff€r   r*   ÚContextualWorker.do   s   ú€ ô 	‰‰
Õ4Ö5r   )r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r    r*   Ú__static_attributes__Ú__classcell__)r+   s   @r   r   r      s   ø† ñõ÷6ö 6r   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 R ltR R ltR R ltR R ltR  R! ltR"tR## )$Ú	TeamTestsz
Tests for L{Team}
c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   ÚTeamTests.__annotate__-   s   € ÷ %Bñ %B�tñ %Br   c                óì   a € \        4       w  pS n        \        VRR7      S n        . S n        . S n        . S n        . S n        R S n        R V 3R llp. S n	        R V 3R llp\        WV4      S n        R# )	zT
Set up a L{Team} with inspectable, synchronous workers that can be
single-stepped.
Úcoordinator©Úworkerc                 ó   € R # )Fr   r   r   r   r'   Ú!TeamTests.setUp.<locals>.<lambda>8   s   € ¡Ur   c               ó   € V ^8„  d   QhRR/# )r   r   zContextualWorker | Noner   )r   s   "r   r   Ú%TeamTests.setUp.<locals>.__annotate__:   s   € ÷ 	ñ 	Ð5ñ 	r   c                 ó®  <aaa€ SP                  4       '       d   R # \        4       w  p oSP                  P                  S4       SP                  P                  S4       \        V \        SP                  4      R7      oSP                  P                  S4       SP                  P                  S4       SP                  oR VVVV3R llpVSn	        S# )Nr;   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   Ú;TeamTests.setUp.<locals>.createWorker.<locals>.__annotate__E   s   € ÷ 8ñ 8 4ñ 8r   c                 ó‚   <€ S! 4        SP                   P                  S 4       SP                  P                  S4       R # r&   )ÚallUnquitWorkersÚremoveÚactivePerformers)ÚcwÚ	performerÚrealQuitr   s   €€€€r   ÚquitAndRemoveÚ<TeamTests.setUp.<locals>.createWorker.<locals>.quitAndRemoveE   s0   ø€ Ù”
Ø×%Ñ%×,Ñ,¨RÔ0Ø×%Ñ%×,Ñ,¨YÖ7r   )
ÚnoMoreWorkersr   ÚworkerPerformersÚappendrG   r   ÚlenÚallWorkersEverrE   Úquit)r<   rK   rH   rI   rJ   r   s     @@@€r   ÚcreateWorkerÚ%TeamTests.setUp.<locals>.createWorker:   sª   û€ Ø×!Ñ!×#Ò#ÙÜ 2Ó 4ÑˆF�IØ×!Ñ!×(Ñ(¨Ô3Ø×!Ñ!×(Ñ(¨Ô3Ü! &´°T×5JÑ5JÓ1KÔLˆBØ×Ñ×&Ñ& rÔ*Ø×!Ñ!×(Ñ(¨Ô,Ø—w‘wˆH÷8ó 8ð
 $ˆBŒGØˆIr   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r@   O   s   € ÷ 	,ñ 	,˜dñ 	,r   c                 óN   <€ S P                   P                  \        4       4       R # r&   )ÚfailuresrO   r   ©r   s   €r   ÚlogExceptionÚ%TeamTests.setUp.<locals>.logExceptionO   s   ø€ Ø�M‰M× Ñ ¤£Ö+r   N)r   ÚcoordinateOncer   r:   rN   rQ   rE   rG   rM   rW   r   Úteam)r   r:   rS   rY   s   f   r   ÚsetUpÚTeamTests.setUp-   sy   ø€ ô
 ,>Ó+?Ñ(ˆ�TÔ(Ü+¨KÀÔNˆÔØ<>ˆÔØ68ˆÔØ8:ˆÔØ<>ˆÔÙ*ˆÔ÷	ð 	ð& (*ˆŒ÷	,ð 	,ô ˜°LÓAˆŽ	r   c               ó   € V ^8„  d   QhRR/# )r   r   Úboolr   )r   s   "r   r   r8   T   s   € ÷ ñ ˜Dñ r   c                ó>   € RpV P                  4       '       d   RpK  V# )zÐ
Perform all work currently scheduled in the coordinator.

@return: whether any coordination work was performed; if the
    coordinator was idle when this was called, return L{False}
    (otherwise L{True}).
FT)r[   )r   Údids   & r   Ú
coordinateÚTeamTests.coordinateT   s"   € ð ˆØ×!Ñ!×#Ò#ØŠCØˆ
r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   a   s   € ÷ 9ñ 9¨4ñ 9r   c                óÊ   € RpV'       dY   V P                  4       pV P                   F  pW P                  9   g   K  V! 4        K  	  T;'       g    V P                  4       pK`  R# )zR
Perform all work on the coordinator and worker performers that needs to
be done.
TN)rc   rN   rG   )r   Ú
continuingrI   s   &  r   ÚperformAllOutstandingWorkÚ#TeamTests.performAllOutstandingWorka   sT   € ð
 ˆ
ßØŸ™Ó*ˆJØ!×2Ô2�	Ø× 5Ñ 5Ö5Ù–Kñ 3ð $×8Ð8 t§¡Ó'8ŠJñ r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   n   s   € ÷ Dñ D¨ñ Dr   c                óˆ  a€ RoR V3R llpV P                   P                  V4       V P                  4        V P                  V P                   P	                  4       P
                  ^4       V P                  4        V P                  S^4       V P                  V P                   P	                  4       P
                  ^ 4       R# )zL
L{Team.do} does the work in a worker created by the createWorker
callable.
Nc               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   Ú7TeamTests.test_doDoesWorkInWorker.<locals>.__annotate__u   s   € ÷ 	 ñ 	 ˜4ñ 	 r   c                 ó   <€ \        R 4      o R# )r<   N)r   )Úwhos   €r   Ú	somethingÚ4TeamTests.test_doDoesWorkInWorker.<locals>.somethingu   s   ø€ ä�h“-ŠCr   )r\   r*   rc   ÚassertEqualÚ
statisticsÚbusyWorkerCountrh   )r   rp   ro   s   & @r   Útest_doDoesWorkInWorkerÚ!TeamTests.test_doDoesWorkInWorkern   s’   ø€ ð
 ˆ÷	 ð 	 ð 	�	‰	�‰�YÔØ�‰ÔØ×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCØ×&Ñ&Ô(Ø×Ñ˜˜aÔ Ø×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÖCr   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   €   s   € ÷ 7ñ 7¨ñ 7r   c                óâ   € V P                   P                  4       pV P                  VP                  ^ 4       V P                  VP                  ^ 4       V P                  VP
                  ^ 4       R# )zy
L{Team.statistics} returns an object with idleWorkerCount,
busyWorkerCount, and backloggedWorkCount integer attributes.
N)r\   rs   rr   ÚidleWorkerCountrt   ÚbackloggedWorkCount)r   Ústatss   & r   Útest_initialStatisticsÚ TeamTests.test_initialStatistics€   sX   € ð
 —	‘	×$Ñ$Ó&ˆØ×Ñ˜×.Ñ.°Ô2Ø×Ñ˜×.Ñ.°Ô2Ø×Ñ˜×2Ñ2°AÖ6r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   Š   s   € ÷ 8ñ 8¨Tñ 8r   c                ó¦   € V P                   P                  ^4       V P                  4        V P                  \	        V P
                  4      ^4       R# )z>
L{Team.grow} increases the number of available idle workers.
N)r\   Úgrowrh   rr   rP   rN   rX   s   &r   Útest_growCreatesIdleWorkersÚ%TeamTests.test_growCreatesIdleWorkersŠ   s;   € ð 	�	‰	�‰�qÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÖ7r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   ’   s   € ÷ 	Dñ 	D dñ 	Dr   c                ó&  a € V 3R lS n         S P                  P                  ^4       S P                  4        S P	                  \        S P                  4      ^4       S P	                  S P                  P                  4       P                  ^4       R# )zw
L{Team.grow} increases the number of available idle workers until the
C{createWorker} callable starts returning None.
c                 ó4   <€ \        S P                  4      ^8¬  # )é   )rP   rQ   rX   s   €r   r'   Ú0TeamTests.test_growCreateLimit.<locals>.<lambda>—   s   ø€ ¤S¨×)<Ñ)<Ó%=ÀÒ%Br   N)	rM   r\   r€   rh   rr   rP   rQ   rs   ry   rX   s   fr   Útest_growCreateLimitÚTeamTests.test_growCreateLimit’   sh   ø€ ô
 CˆÔØ�	‰	�‰�qÔØ×&Ñ&Ô(Ø×Ñœ˜T×0Ñ0Ó1°1Ô5Ø×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÖCr   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   �   s   € ÷ 8ñ 8¨ñ 8r   c                óü   € V P                   P                  ^4       V P                  4        V P                   P                  ^4       V P                  4        V P	                  \        V P                  4      ^4       R# )z7
L{Team.shrink} will quit the given number of workers.
N)r\   r€   rh   Úshrinkrr   rP   rE   rX   s   &r   Útest_shrinkQuitsWorkersÚ!TeamTests.test_shrinkQuitsWorkers�   sY   € ð 	�	‰	�‰�qÔØ×&Ñ&Ô(Ø�	‰	×Ñ˜ÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÖ7r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   §   s   € ÷ 
8ñ 
8 4ñ 
8r   c                óŽ  € V P                   P                  ^
4       V P                  4        V P                  \	        V P
                  4      ^
4       V P                   P                  4        V P                  \	        V P
                  4      ^
4       V P                  4        V P                  \	        V P
                  4      ^ 4       R# )zE
L{Team.shrink} with no arguments will stop all outstanding workers.
N)r\   r€   rh   rr   rP   rE   rŒ   rX   s   &r   Útest_shrinkToZeroÚTeamTests.test_shrinkToZero§   s�   € ð 	�	‰	�‰�rÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°RÔ8Ø�	‰	×ÑÔØ×Ñœ˜T×2Ñ2Ó3°RÔ8Ø×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÖ7r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   ³   s   € ÷ #ñ #°Tñ #r   c                ó   a€ V P                   P                  ^4       V P                  4        ^ oR V3R llpV P                  V P                   P	                  4       P
                  ^4       \        ^4       F  pV P                   P                  V4       K   	  V P                  4        V P                  V P                   P	                  4       P
                  ^ 4       R V n        V P                   P                  V4       V P                  4        V P                  V P                   P	                  4       P
                  ^ 4       V P                  V P                   P	                  4       P                  ^4       V P                  4        V P                  V P                   P	                  4       P                  ^ 4       V P                  S^4       R# )zu
When no additional workers are available, the given work is backlogged,
and then performed later when the work was.
c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   ÚCTeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.__annotate__¼   s   € ÷ 	ñ 	˜4ñ 	r   c                 ó   <€ S ^,          o R# )é   Nr   )Útimess   €r   rp   Ú@TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.something¼   s   ø€ à�Q�JŠEr   c                 ó   € R # )Tr   r   r   r   r'   Ú?TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.<lambda>Ç   s   € ¡Tr   N)r\   r€   rc   rr   rs   ry   Úranger*   rM   rz   rh   )r   rp   Úir™   s   &  @r   Ú#test_moreWorkWhenNoWorkersAvailableÚ-TeamTests.test_moreWorkWhenNoWorkersAvailable³   sG  ø€ ð
 	�	‰	�‰�qÔØ�‰ÔØˆ÷	ð 	ð 	×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCÜ�q–ˆAØ�I‰I�L‰L˜Ö#ñ ð 	�‰ÔØ×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCÙ)ˆÔØ�	‰	�‰�YÔØ�‰ÔØ×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCØ×Ñ˜Ÿ™×-Ñ-Ó/×CÑCÀQÔGØ×&Ñ&Ô(Ø×Ñ˜Ÿ™×-Ñ-Ó/×CÑCÀQÔGØ×Ñ˜ Ö"r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   Ð   s   € ÷ 	Cñ 	C dñ 	Cr   c                ó
  € V P                   P                  R 4       V P                  4        V P                  \	        V P
                  4      ^4       V P                  V P
                  ^ ,          P                  \        4       R# )z›
When an exception is raised in a task passed to L{Team.do}, the
C{logException} given to the L{Team} at construction is invoked in the
exception context.
c                 ó   € ^^ ,          # )r˜   r   r   r   r   r'   Ú0TeamTests.test_exceptionInTask.<locals>.<lambda>Ö   s   € ˜Q žUr   N)r\   r*   rh   rr   rP   rW   ÚtypeÚZeroDivisionErrorrX   s   &r   Útest_exceptionInTaskÚTeamTests.test_exceptionInTaskÐ   sY   € ð 	�	‰	�‰‘]Ô#Ø×&Ñ&Ô(Ø×Ñœ˜TŸ]™]Ó+¨QÔ/Ø×Ñ˜Ÿ™ qÕ)×.Ñ.Ô0AÖBr   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   Û   s   € ÷ ;ñ ;˜4ñ ;r   c                óì   € V P                   P                  4        V P                  \        V P                   P                  4       V P                  \        V P                   P                  \
        4       R# )z`
L{Team.quit} causes future invocations of L{Team.do} and L{Team.quit}
to raise L{AlreadyQuit}.
N)r\   rR   ÚassertRaisesr	   r*   ÚlistrX   s   &r   Ú	test_quitÚTeamTests.test_quitÛ   sD   € ð
 	�	‰	�‰ÔØ×Ñœ+ t§y¡y§~¡~Ô6Ø×Ñœ+ t§y¡y§|¡|´TÖ:r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   ä   s   € ÷ >ñ > ñ >r   c                óz  € \        ^
4       F"  pV P                  P                  \        4       K$  	  V P	                  4        V P                  P                  4        V P	                  4        V P                  \        V P                  4      ^ 4       V P                  \        V P                  P
                  4       R# )zS
L{Team.quit} causes all idle workers, as well as the coordinator
worker, to quit.
N)r�   r\   r*   r¬   rh   rR   rr   rP   rE   r«   r	   r:   ©r   Úxs   & r   Útest_quitQuitsÚTeamTests.test_quitQuitsä   s   € ô
 �r–ˆAØ�I‰I�L‰LœÖñ à×&Ñ&Ô(Ø�	‰	�‰ÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÔ7Ø×Ñœ+ t×'7Ñ'7×'<Ñ'<Ö=r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8   ñ   s   € ÷ >ñ >¨Tñ >r   c                ó  € V P                   P                  ^
4       \        ^4       F"  pV P                   P                  \        4       K$  	  V P                  4        V P                   P                  4        V P                  4        V P                  \        V P                  4      ^4       V P                  4        V P                  \        V P                  4      ^ 4       V P                  \        V P                  P                  4       R# )zd
L{Team.quit} causes all busy workers to be quit once they've finished
the work they've been given.
N)r\   r€   r�   r*   r¬   rc   rR   rr   rP   rE   rh   r«   r	   r:   r±   s   & r   Útest_quitQuitsLaterWhenBusyÚ%TeamTests.test_quitQuitsLaterWhenBusyñ   s²   € ð
 	�	‰	�‰�rÔÜ�q–ˆAØ�I‰I�L‰LœÖñ à�‰ÔØ�	‰	�‰ÔØ�‰ÔØ×Ñœ˜T×2Ñ2Ó3°QÔ7Ø×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÔ7Ø×Ñœ+ t×'7Ñ'7×'<Ñ'<Ö=r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8     s   € ÷ ;ñ ;°dñ ;r   c                ó¸  a a€ S P                   P                  \        4       S P                   P                  P                  oR VV 3R llpVS P                   P                  n        S P                   P                  4        S P                  \        S P                   P
                  4       S P                  \        S P                   P                  \        4       R# )zŒ
If work happens after L{Team.quit} sets its C{Quit} flag, but before
any other work takes place, the L{Team} should still exit gracefully.
c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   ÚDTeamTests.test_quitConcurrentWithWorkHappening.<locals>.__annotate__	  s   € ÷ 	-ñ 	-¨ñ 	-r   c                 ó6   <€ S ! 4        SP                  4        R # r&   )rh   )ÚoriginalSetr   s   €€r   ÚperformWorkConcurrentlyÚOTeamTests.test_quitConcurrentWithWorkHappening.<locals>.performWorkConcurrently	  s   ø€ ÙŒMØ×*Ñ*Ö,r   N)r\   r*   r¬   Ú_quitÚsetrR   r«   r	   )r   r¿   r¾   s   f @r   Ú$test_quitConcurrentWithWorkHappeningÚ.TeamTests.test_quitConcurrentWithWorkHappening  s„   ù€ ð
 	�	‰	�‰”TÔØ—i‘i—o‘o×)Ñ)ˆ÷	-ñ 	-ð 6ˆ�	‰	�‰ÔØ�	‰	�‰ÔØ×Ñœ+ t§y¡y§~¡~Ô6Ø×Ñœ+ t§y¡y§|¡|´TÖ:r   c               ó   € V ^8„  d   QhRR/# r7   r   )r   s   "r   r   r8     s   € ÷ 8ñ 8 Tñ 8r   c                ór  € \        ^
4       F"  pV P                  P                  \        4       K$  	  V P	                  4        V P                  \        V P                  4      ^
4       V P                  P                  ^4       V P                  4        V P                  \        V P                  4      ^4       R# )zT
L{Team.shrink} will wait for busy workers to finish being busy and then
quit them.
N)
r�   r\   r*   r¬   rc   rr   rP   rE   rŒ   rh   r±   s   & r   Útest_shrinkWhenBusyÚTeamTests.test_shrinkWhenBusy  s€   € ô
 �r–ˆAØ�I‰I�L‰LœÖñ à�‰ÔØ×Ñœ˜T×2Ñ2Ó3°RÔ8à�	‰	×Ñ˜ÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÖ7r   )	rG   rE   rQ   r[   r:   rW   rM   r\   rN   N)r-   r.   r/   r0   r1   r]   rc   rh   ru   r|   r�   rˆ   r�   r‘   rŸ   r§   r­   r³   r·   rÃ   rÇ   r2   r   r   r   r5   r5   (   sa   † ñõ%BõNõ9õDõ$7õ8õ	Dõ8õ
8õ#õ:	Cõ;õ>õ>õ ;÷"8ñ 8r   r5   N)r1   Ú
__future__r   Útypingr   Útwisted.python.componentsr   Útwisted.python.contextr   r   Útwisted.python.failurer   Útwisted.trial.unittestr   Ú r	   r
   r   r   r   r5   r   r   r   Ú<module>rÐ      sG   ðñõ #å å 7ß ,Ý *Ý 6ß =Ó =ô6Ñ(¨°-Ó@ô 6ô*v8Ð#ö v8r   