§
    Ètºf÷$  ã                   ó¢   — d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZ  G d„ d	 eed
¦  «        ¦  «        Z G d„ de	¦  «        ZdS )z&
Tests for L{twisted._threads._team}.
é    )ÚproxyForInterface)ÚcallÚget)ÚFailure)ÚSynchronousTestCaseé   )ÚAlreadyQuitÚIWorkerÚTeamÚcreateMemoryWorkerc                   ó(   ‡ — e Zd ZdZd„ Zˆ fd„Zˆ xZS )ÚContextualWorkerz:
    A worker implementation that supplies a context.
    c                 ó"   — || _         || _        dS )z:
        Create with a real worker and a context.
        N)Ú_realWorkerÚ_context)ÚselfÚ
realWorkerÚctxs      ú^/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/_threads/test/test_team.pyÚ__init__zContextualWorker.__init__   s   € ð &ˆÔØˆŒˆˆó    c                 óV   •‡ ‡— t          ¦   «                              ˆ ˆfd„¦  «         dS )zŠ
        Perform the given work with the context given to __init__.

        @param work: the work to pass on to the real worker.
        c                  ó.   •— t          ‰ j        ‰¦  «        S ©N)r   r   )r   Úworks   €€r   ú<lambda>z%ContextualWorker.do.<locals>.<lambda>"   s   ø€ �4 ¤¨tÑ4Ô4€ r   N)ÚsuperÚdo)r   r   Ú	__class__s   ``€r   r   zContextualWorker.do   s0   øøø€ õ 	‰Œ�
Š
Ð4Ð4Ð4Ð4Ð4Ñ5Ô5Ð5Ð5Ð5r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__)r   s   @r   r   r      sQ   ø€ € € € € ðð ðð ð ð6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6r   r   r   c                   ór   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú	TeamTestsz
    Tests for L{Team}
    c                 óö   ‡ — t          ¦   «         \  }‰ _        t          |d¬¦  «        ‰ _        g ‰ _        g ‰ _        g ‰ _        g ‰ _        d„ ‰ _        ˆ fd„}g ‰ _	        ˆ fd„}t          |||¦  «        ‰ _        dS )zl
        Set up a L{Team} with inspectable, synchronous workers that can be
        single-stepped.
        Úcoordinator©Úworkerc                  ó   — dS )NF© r,   r   r   r   z!TeamTests.setUp.<locals>.<lambda>5   s   €  U€ r   c                  óž  •‡‡‡— ‰                      ¦   «         rd S t          ¦   «         \  } Š‰j                             ‰¦  «         ‰j                             ‰¦  «         t          | t          ‰j        ¦  «        ¬¦  «        Š‰j                             ‰¦  «         ‰j                             ‰¦  «         ‰j	        Šˆˆˆˆfd„}|‰_	        ‰S )Nr)   c                  ó„   •—  ‰¦   «          ‰j                              ‰ ¦  «         ‰j                             ‰¦  «         d S r   )ÚallUnquitWorkersÚremoveÚactivePerformers)ÚcwÚ	performerÚrealQuitr   s   €€€€r   ÚquitAndRemovez<TeamTests.setUp.<locals>.createWorker.<locals>.quitAndRemoveB   sB   ø€ Ø�‘
”
�
ØÔ%×,Ò,¨RÑ0Ô0Ð0ØÔ%×,Ò,¨YÑ7Ô7Ð7Ð7Ð7r   )
ÚnoMoreWorkersr   ÚworkerPerformersÚappendr1   r   ÚlenÚallWorkersEverr/   Úquit)r*   r5   r2   r3   r4   r   s     @@@€r   ÚcreateWorkerz%TeamTests.setUp.<locals>.createWorker7   så   øøøø€ Ø×!Ò!Ñ#Ô#ð Ø�tÝ 2Ñ 4Ô 4ÑˆF�IØÔ!×(Ò(¨Ñ3Ô3Ð3ØÔ!×(Ò(¨Ñ3Ô3Ð3Ý! &µ°TÔ5JÑ1KÔ1KÐLÑLÔLˆBØÔ×&Ò& rÑ*Ô*Ð*ØÔ!×(Ò(¨Ñ,Ô,Ð,Ø”wˆHð8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð
 $ˆBŒGØˆIr   c                  óT   •— ‰ j                              t          ¦   «         ¦  «         d S r   )Úfailuresr8   r   ©r   s   €r   ÚlogExceptionz%TeamTests.setUp.<locals>.logExceptionL   s#   ø€ ØŒM× Ò ¥¡¤Ñ+Ô+Ð+Ð+Ð+r   N)r   ÚcoordinateOncer   r(   r7   r:   r/   r1   r6   r>   r   Úteam)r   r(   r<   r@   s   `   r   ÚsetUpzTeamTests.setUp*   s«   ø€ õ
 ,>Ñ+?Ô+?Ñ(ˆ�TÔ(Ý+¨KÀÐNÑNÔNˆÔØ "ˆÔØ ˆÔØ "ˆÔØ "ˆÔØ*˜]ˆÔð	ð 	ð 	ð 	ð 	ð& ˆŒð	,ð 	,ð 	,ð 	,ð 	,õ ˜ l°LÑAÔAˆŒ	ˆ	ˆ	r   c                 ó^   — d}|                       ¦   «         rd}|                       ¦   «         °|S )a  
        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}).
        @rtype: L{bool}
        FT)rA   )r   Údids     r   Ú
coordinatezTeamTests.coordinateQ   s=   € ð ˆØ×!Ò!Ñ#Ô#ð 	ØˆCð ×!Ò!Ñ#Ô#ð 	àˆ
r   c                 ó¤   — d}|rK|                       ¦   «         }| j        D ]}|| j        v r
 |¦   «          Œ|p|                       ¦   «         }|°IdS dS )zj
        Perform all work on the coordinator and worker performers that needs to
        be done.
        TN)rF   r7   r1   )r   Ú
continuingr3   s      r   ÚperformAllOutstandingWorkz#TeamTests.performAllOutstandingWork_   s~   € ð
 ˆ
Øð 	9ØŸšÑ*Ô*ˆJØ!Ô2ð  ð  �	Ø Ô 5Ð5Ð5Ø�I‘K”K�KøØ#Ð8 t§¢Ñ'8Ô'8ˆJð ð 	9ð 	9ð 	9ð 	9ð 	9r   c                 ó”  ‡— ˆfd„Š| j                              ‰¦  «         |                      ¦   «          |                      | j                              ¦   «         j        d¦  «         |                      ¦   «          |                      ‰j        d¦  «         |                      | j                              ¦   «         j        d¦  «         dS )zd
        L{Team.do} does the work in a worker created by the createWorker
        callable.
        c                  ó0   •— t          d¦  «        ‰ _        d S )Nr*   )r   Úwho©Ú	somethings   €r   rN   z4TeamTests.test_doDoesWorkInWorker.<locals>.somethingr   s   ø€ Ý ™MœMˆIŒMˆMˆMr   é   r   N)rB   r   rF   ÚassertEqualÚ
statisticsÚbusyWorkerCountrI   rL   )r   rN   s    @r   Útest_doDoesWorkInWorkerz!TeamTests.test_doDoesWorkInWorkerl   sÀ   ø€ ð	*ð 	*ð 	*ð 	*ð 	*ð 	Œ	�Š�YÑÔÐØ�ŠÑÔÐØ×Ò˜œ×-Ò-Ñ/Ô/Ô?ÀÑCÔCÐCØ×&Ò&Ñ(Ô(Ð(Ø×Ò˜œ¨Ñ*Ô*Ð*Ø×Ò˜œ×-Ò-Ñ/Ô/Ô?ÀÑCÔCÐCÐCÐCr   c                 óÚ   — | j                              ¦   «         }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         dS )z‘
        L{Team.statistics} returns an object with idleWorkerCount,
        busyWorkerCount, and backloggedWorkCount integer attributes.
        r   N)rB   rQ   rP   ÚidleWorkerCountrR   ÚbackloggedWorkCount)r   Ústatss     r   Útest_initialStatisticsz TeamTests.test_initialStatistics|   sh   € ð
 ”	×$Ò$Ñ&Ô&ˆØ×Ò˜Ô.°Ñ2Ô2Ð2Ø×Ò˜Ô.°Ñ2Ô2Ð2Ø×Ò˜Ô2°AÑ6Ô6Ð6Ð6Ð6r   c                 ó²   — | j                              d¦  «         |                      ¦   «          |                      t	          | j        ¦  «        d¦  «         dS )zN
        L{Team.grow} increases the number of available idle workers.
        é   N)rB   ÚgrowrI   rP   r9   r7   r?   s    r   Útest_growCreatesIdleWorkersz%TeamTests.test_growCreatesIdleWorkers†   sQ   € ð 	Œ	�Š�qÑÔÐØ×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ð7Ð7r   c                 ó,  ‡ — ˆ fd„‰ _         ‰ j                             d¦  «         ‰                      ¦   «          ‰                      t          ‰ j        ¦  «        d¦  «         ‰                      ‰ j                             ¦   «         j        d¦  «         dS )z�
        L{Team.grow} increases the number of available idle workers until the
        C{createWorker} callable starts returning None.
        c                  ó4   •— t          ‰ j        ¦  «        dk    S )Né   )r9   r:   r?   s   €r   r   z0TeamTests.test_growCreateLimit.<locals>.<lambda>“   s   ø€ ¥S¨Ô)<Ñ%=Ô%=ÀÒ%B€ r   rZ   r_   N)	r6   rB   r[   rI   rP   r9   r:   rQ   rU   r?   s   `r   Útest_growCreateLimitzTeamTests.test_growCreateLimitŽ   s‹   ø€ ð
 CÐBÐBÐBˆÔØŒ	�Š�qÑÔÐØ×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ0Ñ1Ô1°1Ñ5Ô5Ð5Ø×Ò˜œ×-Ò-Ñ/Ô/Ô?ÀÑCÔCÐCÐCÐCr   c                 ó  — | j                              d¦  «         |                      ¦   «          | j                              d¦  «         |                      ¦   «          |                      t          | j        ¦  «        d¦  «         dS )zG
        L{Team.shrink} will quit the given number of workers.
        rZ   r_   r   N)rB   r[   rI   ÚshrinkrP   r9   r/   r?   s    r   Útest_shrinkQuitsWorkersz!TeamTests.test_shrinkQuitsWorkers™   sy   € ð 	Œ	�Š�qÑÔÐØ×&Ò&Ñ(Ô(Ð(ØŒ	×Ò˜ÑÔÐØ×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ð7Ð7r   c                 ó¬  — | j                              d¦  «         |                      ¦   «          |                      t	          | j        ¦  «        d¦  «         | j                              ¦   «          |                      t	          | j        ¦  «        d¦  «         |                      ¦   «          |                      t	          | j        ¦  «        d¦  «         dS )zU
        L{Team.shrink} with no arguments will stop all outstanding workers.
        é
   r   N)rB   r[   rI   rP   r9   r/   rb   r?   s    r   Útest_shrinkToZerozTeamTests.test_shrinkToZero£   s¹   € ð 	Œ	�Š�rÑÔÐØ×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°RÑ8Ô8Ð8ØŒ	×ÒÑÔÐØ×Ò�˜TÔ2Ñ3Ô3°RÑ8Ô8Ð8Ø×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ð7Ð7r   c                 óº  ‡— | j                              d¦  «         |                      ¦   «          ˆfd„Šd‰_        |                      | j                              ¦   «         j        d¦  «         t          d¦  «        D ]}| j                              ‰¦  «         Œ|                      ¦   «          |                      | j                              ¦   «         j        d¦  «         d„ | _	        | j                              ‰¦  «         |                      ¦   «          |                      | j                              ¦   «         j        d¦  «         |                      | j                              ¦   «         j
        d¦  «         |                      ¦   «          |                      | j                              ¦   «         j
        d¦  «         |                      ‰j        d¦  «         dS )z�
        When no additional workers are available, the given work is backlogged,
        and then performed later when the work was.
        r_   c                  ó(   •— ‰ xj         dz  c_         d S )NrO   )ÚtimesrM   s   €r   rN   z@TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.something·   s   ø€ ØˆOŒO˜qÑ ˆOŒOˆOˆOr   r   c                  ó   — dS )NTr,   r,   r   r   r   z?TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.<lambda>Â   s   €  T€ r   rO   é   N)rB   r[   rF   ri   rP   rQ   rU   Úranger   r6   rV   rI   )r   ÚirN   s     @r   Ú#test_moreWorkWhenNoWorkersAvailablez-TeamTests.test_moreWorkWhenNoWorkersAvailable¯   sª  ø€ ð
 	Œ	�Š�qÑÔÐØ�ŠÑÔÐð	!ð 	!ð 	!ð 	!ð 	!ð ˆ	ŒØ×Ò˜œ×-Ò-Ñ/Ô/Ô?ÀÑCÔCÐCÝ�q‘”ð 	$ð 	$ˆAØŒI�LŠL˜Ñ#Ô#Ð#Ð#ð 	�ŠÑÔÐØ×Ò˜œ×-Ò-Ñ/Ô/Ô?ÀÑCÔCÐCØ)˜\ˆÔØŒ	�Š�YÑÔÐØ�ŠÑÔÐØ×Ò˜œ×-Ò-Ñ/Ô/Ô?ÀÑCÔCÐCØ×Ò˜œ×-Ò-Ñ/Ô/ÔCÀQÑGÔGÐGØ×&Ò&Ñ(Ô(Ð(Ø×Ò˜œ×-Ò-Ñ/Ô/ÔCÀQÑGÔGÐGØ×Ò˜œ¨!Ñ,Ô,Ð,Ð,Ð,r   c                 ó
  — | j                              d„ ¦  «         |                      ¦   «          |                      t	          | j        ¦  «        d¦  «         |                      | j        d         j        t          ¦  «         dS )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                  ó   — ddz  S )NrO   r   r,   r,   r   r   r   z0TeamTests.test_exceptionInTask.<locals>.<lambda>Ñ   s
   € ˜Q ™U€ r   rO   r   N)rB   r   rI   rP   r9   r>   ÚtypeÚZeroDivisionErrorr?   s    r   Útest_exceptionInTaskzTeamTests.test_exceptionInTaskË   ss   € ð 	Œ	�Š�]�]Ñ#Ô#Ð#Ø×&Ò&Ñ(Ô(Ð(Ø×Ò�˜Tœ]Ñ+Ô+¨QÑ/Ô/Ð/Ø×Ò˜œ qÔ)Ô.Õ0AÑBÔBÐBÐBÐBr   c                 óØ   — | j                              ¦   «          |                      t          | j         j        ¦  «         |                      t          | j         j        t
          ¦  «         dS )zx
        L{Team.quit} causes future invocations of L{Team.do} and L{Team.quit}
        to raise L{AlreadyQuit}.
        N)rB   r;   ÚassertRaisesr	   r   Úlistr?   s    r   Ú	test_quitzTeamTests.test_quitÖ   sR   € ð
 	Œ	�ŠÑÔÐØ×Ò�+ t¤y¤~Ñ6Ô6Ð6Ø×Ò�+ t¤y¤|µTÑ:Ô:Ð:Ð:Ð:r   c                 ó„  — t          d¦  «        D ]!}| j                             t          ¦  «         Œ"|                      ¦   «          | j                             ¦   «          |                      ¦   «          |                      t          | j        ¦  «        d¦  «         |  	                    t          | j        j        ¦  «         dS )zk
        L{Team.quit} causes all idle workers, as well as the coordinator
        worker, to quit.
        re   r   N)rl   rB   r   rv   rI   r;   rP   r9   r/   ru   r	   r(   ©r   Úxs     r   Útest_quitQuitszTeamTests.test_quitQuitsß   s©   € õ
 �r‘”ð 	ð 	ˆAØŒI�LŠL�ÑÔÐÐØ×&Ò&Ñ(Ô(Ð(ØŒ	�ŠÑÔÐØ×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ø×Ò�+ tÔ'7Ô'<Ñ=Ô=Ð=Ð=Ð=r   c                 ó0  — | j                              d¦  «         t          d¦  «        D ]!}| j                              t          ¦  «         Œ"|                      ¦   «          | j                              ¦   «          |                      ¦   «          |                      t          | j	        ¦  «        d¦  «         |  
                    ¦   «          |                      t          | j	        ¦  «        d¦  «         |                      t          | j        j        ¦  «         dS )z|
        L{Team.quit} causes all busy workers to be quit once they've finished
        the work they've been given.
        re   rZ   r   N)rB   r[   rl   r   rv   rF   r;   rP   r9   r/   rI   ru   r	   r(   ry   s     r   Útest_quitQuitsLaterWhenBusyz%TeamTests.test_quitQuitsLaterWhenBusyì   sì   € ð
 	Œ	�Š�rÑÔÐÝ�q‘”ð 	ð 	ˆAØŒI�LŠL�ÑÔÐÐØ�ŠÑÔÐØŒ	�ŠÑÔÐØ�ŠÑÔÐØ×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ø×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ø×Ò�+ tÔ'7Ô'<Ñ=Ô=Ð=Ð=Ð=r   c                 ój  ‡ ‡— ‰ j                              t          ¦  «         ‰ j         j        j        Šˆˆ fd„}|‰ j         j        _        ‰ j                              ¦   «          ‰                      t          ‰ j         j        ¦  «         ‰                      t          ‰ j         j        t          ¦  «         dS )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                  óD   •—  ‰ ¦   «          ‰                      ¦   «          d S r   )rI   )ÚoriginalSetr   s   €€r   ÚperformWorkConcurrentlyzOTeamTests.test_quitConcurrentWithWorkHappening.<locals>.performWorkConcurrently  s&   ø€ ØˆK‰MŒMˆMØ×*Ò*Ñ,Ô,Ð,Ð,Ð,r   N)rB   r   rv   Ú_quitÚsetr;   ru   r	   )r   r�   r€   s   ` @r   Ú$test_quitConcurrentWithWorkHappeningz.TeamTests.test_quitConcurrentWithWorkHappeningü   s    øø€ ð
 	Œ	�Š•TÑÔÐØ”i”oÔ)ˆð	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 6ˆŒ	ŒÔØŒ	�ŠÑÔÐØ×Ò�+ t¤y¤~Ñ6Ô6Ð6Ø×Ò�+ t¤y¤|µTÑ:Ô:Ð:Ð:Ð:r   c                 óŒ  — t          d¦  «        D ]!}| j                             t          ¦  «         Œ"|                      ¦   «          |                      t          | j        ¦  «        d¦  «         | j                             d¦  «         |  	                    ¦   «          |                      t          | j        ¦  «        d¦  «         dS )zl
        L{Team.shrink} will wait for busy workers to finish being busy and then
        quit them.
        re   é   r_   N)
rl   rB   r   rv   rF   rP   r9   r/   rb   rI   ry   s     r   Útest_shrinkWhenBusyzTeamTests.test_shrinkWhenBusy  s°   € õ
 �r‘”ð 	ð 	ˆAØŒI�LŠL�ÑÔÐÐØ�ŠÑÔÐØ×Ò�˜TÔ2Ñ3Ô3°RÑ8Ô8Ð8àŒ	×Ò˜ÑÔÐØ×&Ò&Ñ(Ô(Ð(Ø×Ò�˜TÔ2Ñ3Ô3°QÑ7Ô7Ð7Ð7Ð7r   N)r    r!   r"   r#   rC   rF   rI   rS   rX   r\   r`   rc   rf   rn   rs   rw   r{   r}   r„   r‡   r,   r   r   r&   r&   %   s  € € € € € ðð ð%Bð %Bð %BðNð ð ð9ð 9ð 9ðDð Dð Dð 7ð 7ð 7ð8ð 8ð 8ð	Dð 	Dð 	Dð8ð 8ð 8ð
8ð 
8ð 
8ð-ð -ð -ð8	Cð 	Cð 	Cð;ð ;ð ;ð>ð >ð >ð>ð >ð >ð ;ð ;ð ;ð"8ð 8ð 8ð 8ð 8r   r&   N)r#   Útwisted.python.componentsr   Útwisted.python.contextr   r   Útwisted.python.failurer   Útwisted.trial.unittestr   Ú r	   r
   r   r   r   r&   r,   r   r   ú<module>r�      sú   ððð ð
 8Ð 7Ð 7Ð 7Ð 7Ð 7Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð6ð 6ð 6ð 6ð 6Ð(Ð(¨°-Ñ@Ô@ñ 6ô 6ð 6ð*t8ð t8ð t8ð t8ð t8Ð#ñ t8ô t8ð t8ð t8ð t8r   