o
    ¼>hÃ&  ã                   @  s’   d Z ddlmZ ddlm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„ deedƒƒZG dd„ deƒZdS )z&
Tests for L{twisted._threads._team}.
é    )Úannotations)ÚCallable)ÚproxyForInterface)ÚcallÚget)ÚFailure)ÚSynchronousTestCaseé   )ÚAlreadyQuitÚIWorkerÚTeamÚcreateMemoryWorkerc                      s,   e Zd ZdZddd	„Zd‡ fdd„Z‡  ZS )ÚContextualWorkerz:
    A worker implementation that supplies a context.
    Ú
realWorkerr   ÚctxÚobjectÚreturnÚNonec                 K  s   || _ || _dS )z:
        Create with a real worker and a context.
        N)Ú_realWorkerÚ_context)Úselfr   r   © r   ú/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/_threads/test/test_team.pyÚ__init__   s   
zContextualWorker.__init__ÚworkúCallable[[], object]c                   s   t ƒ  ‡ ‡fd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                     s   t ˆ jˆƒS ©N)r   r   r   ©r   r   r   r   Ú<lambda>%   s    z%ContextualWorker.do.<locals>.<lambda>N)ÚsuperÚdor   ©Ú	__class__r   r   r       s   zContextualWorker.do)r   r   r   r   r   r   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    Ú__classcell__r   r   r!   r   r      s    
r   r   c                   @  s°   e Zd ZdZd&dd„Zd'dd„Zd&d	d
„Zd&dd„Zd&dd„Zd&dd„Z	d&dd„Z
d&dd„Zd&dd„Zd&dd„Zd&dd„Zd&dd„Zd&dd„Zd&dd „Zd&d!d"„Zd&d#d$„Zd%S )(Ú	TeamTestsz
    Tests for L{Team}
    r   r   c                   sp   t ƒ \}ˆ _t|ddˆ _g ˆ _g ˆ _g ˆ _g ˆ _dd„ ˆ _d‡ fdd„}g ˆ _	d‡ fd
d„}t
|||ƒˆ _dS )zl
        Set up a L{Team} with inspectable, synchronous workers that can be
        single-stepped.
        Úcoordinator©Úworkerc                   S  ó   dS )NFr   r   r   r   r   r   8   ó    z!TeamTests.setUp.<locals>.<lambda>r   úContextualWorker | Nonec                    s|   ˆ  ¡ rd S tƒ \} ‰ˆj ˆ¡ ˆj ˆ¡ t| tˆjƒd‰ ˆj ˆ ¡ ˆj ˆ ¡ ˆ j	‰d‡ ‡‡‡fdd„}|ˆ _	ˆ S )Nr*   r   r   c                     s"   ˆƒ  ˆj  ˆ ¡ ˆj ˆ¡ d S r   )ÚallUnquitWorkersÚremoveÚactivePerformersr   )ÚcwÚ	performerÚrealQuitr   r   r   ÚquitAndRemoveE   s   z<TeamTests.setUp.<locals>.createWorker.<locals>.quitAndRemove©r   r   )
ÚnoMoreWorkersr   ÚworkerPerformersÚappendr1   r   ÚlenÚallWorkersEverr/   Úquit)r+   r5   ©r   )r2   r3   r4   r   ÚcreateWorker:   s   
z%TeamTests.setUp.<locals>.createWorkerr   c                     s   ˆ j  tƒ ¡ d S r   )Úfailuresr9   r   r   r=   r   r   ÚlogExceptionO   s   z%TeamTests.setUp.<locals>.logExceptionN)r   r.   r6   )r   ÚcoordinateOncer   r)   r8   r;   r/   r1   r7   r?   r   Úteam)r   r)   r>   r@   r   r=   r   ÚsetUp-   s   
zTeamTests.setUpÚboolc                 C  s   d}|   ¡ rd}|   ¡ s|S )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)rA   )r   Údidr   r   r   Ú
coordinateT   s
   ÿzTeamTests.coordinatec                 C  sD   d}|r |   ¡ }| jD ]
}|| jv r|ƒ  q|p|   ¡ }|sdS dS )zj
        Perform all work on the coordinator and worker performers that needs to
        be done.
        TN)rF   r8   r1   )r   Ú
continuingr3   r   r   r   ÚperformAllOutstandingWorka   s   

€ûz#TeamTests.performAllOutstandingWorkc                   sf   d‰ d‡ fdd„}| j  |¡ |  ¡  |  | j  ¡ jd¡ |  ¡  |  ˆ d¡ |  | j  ¡ jd¡ dS )	zd
        L{Team.do} does the work in a worker created by the createWorker
        callable.
        Nr   r   c                     s   t dƒ‰ d S )Nr+   )r   r   ©Úwhor   r   Ú	somethingu   ó   z4TeamTests.test_doDoesWorkInWorker.<locals>.somethingé   r   r6   )rB   r    rF   ÚassertEqualÚ
statisticsÚbusyWorkerCountrH   )r   rK   r   rI   r   Útest_doDoesWorkInWorkern   s   z!TeamTests.test_doDoesWorkInWorkerc                 C  s8   | 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   rO   rN   ÚidleWorkerCountrP   ÚbackloggedWorkCount)r   Ústatsr   r   r   Útest_initialStatistics€   s   
z TeamTests.test_initialStatisticsc                 C  s*   | j  d¡ |  ¡  |  t| jƒd¡ dS )zN
        L{Team.grow} increases the number of available idle workers.
        é   N)rB   ÚgrowrH   rN   r:   r8   r=   r   r   r   Útest_growCreatesIdleWorkersŠ   s   z%TeamTests.test_growCreatesIdleWorkersc                   sL   ‡ fd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                     s   t ˆ jƒdkS )Né   )r:   r;   r   r=   r   r   r   —   s    z0TeamTests.test_growCreateLimit.<locals>.<lambda>rV   rY   N)	r7   rB   rW   rH   rN   r:   r;   rO   rR   r=   r   r=   r   Útest_growCreateLimit’   s
   zTeamTests.test_growCreateLimitc                 C  s>   | j  d¡ |  ¡  | j  d¡ |  ¡  |  t| jƒd¡ dS )zG
        L{Team.shrink} will quit the given number of workers.
        rV   rY   r	   N)rB   rW   rH   ÚshrinkrN   r:   r/   r=   r   r   r   Útest_shrinkQuitsWorkers   s
   z!TeamTests.test_shrinkQuitsWorkersc                 C  s`   | 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   rW   rH   rN   r:   r/   r[   r=   r   r   r   Útest_shrinkToZero§   s   
zTeamTests.test_shrinkToZeroc                   sâ   | j  d¡ |  ¡  d‰ d‡ fdd„}|  | j  ¡ jd¡ tdƒD ]}| j  |¡ q!|  ¡  |  | j  ¡ jd¡ dd„ | _| j  |¡ |  ¡  |  | j  ¡ jd¡ |  | j  ¡ j	d	¡ |  
¡  |  | j  ¡ j	d¡ |  ˆ d
¡ dS )z
        When no additional workers are available, the given work is backlogged,
        and then performed later when the work was.
        rY   r   r   r   c                     s   ˆ d7 ‰ d S )NrM   r   r   ©Útimesr   r   rK   ¼   rL   z@TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.somethingc                   S  r,   )NTr   r   r   r   r   r   Ç   r-   z?TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.<lambda>rM   é   Nr6   )rB   rW   rF   rN   rO   rR   Úranger    r7   rS   rH   )r   rK   Úir   r_   r   Ú#test_moreWorkWhenNoWorkersAvailable³   s"   
z-TeamTests.test_moreWorkWhenNoWorkersAvailablec                 C  sB   | j  d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                   S  s   dd S )NrM   r   r   r   r   r   r   r   Ö   s    z0TeamTests.test_exceptionInTask.<locals>.<lambda>rM   r   N)rB   r    rH   rN   r:   r?   ÚtypeÚZeroDivisionErrorr=   r   r   r   Útest_exceptionInTaskÐ   s   zTeamTests.test_exceptionInTaskc                 C  s0   | 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=   r   r   r   Ú	test_quitÛ   s   
zTeamTests.test_quitc                 C  sZ   t dƒD ]}| j t¡ q|  ¡  | 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.
        r]   r   N)rb   rB   r    ri   rH   r<   rN   r:   r/   rh   r
   r)   ©r   Úxr   r   r   Útest_quitQuitsä   s   
zTeamTests.test_quitQuitsc                 C  s€   | j  d¡ tdƒD ]}| j  t¡ q
|  ¡  | 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.
        r]   rV   r   N)rB   rW   rb   r    ri   rF   r<   rN   r:   r/   rH   rh   r
   r)   rk   r   r   r   Útest_quitQuitsLaterWhenBusyñ   s   
z%TeamTests.test_quitQuitsLaterWhenBusyc                   s`   ˆj  t¡ ˆj jj‰ d‡ ‡fd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.
        r   r   c                     s   ˆ ƒ  ˆ  ¡  d S r   )rH   r   ©ÚoriginalSetr   r   r   ÚperformWorkConcurrently	  s   zOTeamTests.test_quitConcurrentWithWorkHappening.<locals>.performWorkConcurrentlyNr6   )rB   r    ri   Ú_quitÚsetr<   rh   r
   )r   rq   r   ro   r   Ú$test_quitConcurrentWithWorkHappening  s   


z.TeamTests.test_quitConcurrentWithWorkHappeningc                 C  s^   t dƒD ]}| j t¡ q|  ¡  |  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.
        r]   é   rY   N)
rb   rB   r    ri   rF   rN   r:   r/   r[   rH   rk   r   r   r   Útest_shrinkWhenBusy  s   zTeamTests.test_shrinkWhenBusyNr6   )r   rD   )r#   r$   r%   r&   rC   rF   rH   rQ   rU   rX   rZ   r\   r^   rd   rg   rj   rm   rn   rt   rv   r   r   r   r   r(   (   s$    

'












	

r(   N)r&   Ú
__future__r   Útypingr   Útwisted.python.componentsr   Útwisted.python.contextr   r   Útwisted.python.failurer   Útwisted.trial.unittestr   Ú r
   r   r   r   r   r(   r   r   r   r   Ú<module>   s   