U
    -WjÃ&  ã                   @  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dœdd„Zddd	œ‡ fd
d„Z‡  ZS )ÚContextualWorkerz:
    A worker implementation that supplies a context.
    r   ÚobjectÚNone)Ú
realWorkerÚctxÚreturnc                 K  s   || _ || _dS )z:
        Create with a real worker and a context.
        N)Ú_realWorkerÚ_context)Úselfr   r   © r   újc:\users\psant\downloads\hotstarbackend\school\venv38\Lib\site-packages\twisted/_threads/test/test_team.pyÚ__init__   s    zContextualWorker.__init__zCallable[[], object])Úworkr   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>%   ó    z%ContextualWorker.do.<locals>.<lambda>N)ÚsuperÚdor   ©Ú	__class__r   r   r       s    zContextualWorker.do)Ú__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d„Zddœdd„Zddœd	d
„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd „Zddœd!d"„Zddœd#d$„Zd%S )&Ú	TeamTestsz
    Tests for L{Team}
    r   ©r   c                   sx   t ƒ \}ˆ _t|dd�ˆ _g ˆ _g ˆ _g ˆ _g ˆ _dd„ ˆ _ddœ‡ fdd„}g ˆ _	d	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  s   dS )NFr   r   r   r   r   r   8   r   z!TeamTests.setUp.<locals>.<lambda>zContextualWorker | Noner)   c                    s€   ˆ  ¡ rd S tƒ \} ‰ˆj ˆ¡ ˆj ˆ¡ t| tˆjƒd�‰ ˆj ˆ ¡ ˆj ˆ ¡ ˆ j	‰d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)
ÚnoMoreWorkersr   ÚworkerPerformersÚappendr/   r   ÚlenÚallWorkersEverr-   Úquit)r,   r3   ©r   )r0   r1   r2   r   ÚcreateWorker:   s    
z%TeamTests.setUp.<locals>.createWorkerr   c                     s   ˆ j  tƒ ¡ d S r   )Úfailuresr6   r   r   r:   r   r   ÚlogExceptionO   s    z%TeamTests.setUp.<locals>.logExceptionN)r   ÚcoordinateOncer   r*   r5   r8   r-   r/   r4   r<   r   Úteam)r   r*   r;   r=   r   r:   r   ÚsetUp-   s    
zTeamTests.setUpÚboolc                 C  s   d}|   ¡ rd}q|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)r>   )r   Zdidr   r   r   Ú
coordinateT   s    zTeamTests.coordinatec                 C  s>   d}|r:|   ¡ }| jD ]}|| jkr|ƒ  q|p6|   ¡ }qdS )zj
        Perform all work on the coordinator and worker performers that needs to
        be done.
        TN)rB   r5   r/   )r   Z
continuingr1   r   r   r   ÚperformAllOutstandingWorka   s    

z#TeamTests.performAllOutstandingWorkc                   sj   d‰ 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   ©Zwhor   r   Ú	somethingu   s    z4TeamTests.test_doDoesWorkInWorker.<locals>.somethingé   r   )r?   r    rB   ÚassertEqualÚ
statisticsÚbusyWorkerCountrC   )r   rE   r   rD   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)r?   rH   rG   ÚidleWorkerCountrI   Ú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)r?   ÚgrowrC   rG   r7   r5   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é   )r7   r8   r   r:   r   r   r   —   r   z0TeamTests.test_growCreateLimit.<locals>.<lambda>rO   rR   N)	r4   r?   rP   rC   rG   r7   r8   rH   rK   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.
        rO   rR   r	   N)r?   rP   rC   ÚshrinkrG   r7   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)r?   rP   rC   rG   r7   r-   rT   r:   r   r   r   Útest_shrinkToZero§   s    
zTeamTests.test_shrinkToZeroc                   sæ   | j  d¡ |  ¡  d‰ ddœ‡ fdd„}|  | j  ¡ jd¡ tdƒD ]}| j  |¡ qF|  ¡  |  | 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.
        rR   r   r   r)   c                     s   ˆ d7 ‰ d S )NrF   r   r   ©Útimesr   r   rE   ¼   s    z@TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.somethingc                   S  s   dS )NTr   r   r   r   r   r   Ç   r   z?TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.<lambda>rF   é   N)r?   rP   rB   rG   rH   rK   Úranger    r4   rL   rC   )r   rE   Úir   rX   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 )NrF   r   r   r   r   r   r   r   Ö   r   z0TeamTests.test_exceptionInTask.<locals>.<lambda>rF   r   N)r?   r    rC   rG   r7   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)r?   r9   Ú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.
        rV   r   N)r[   r?   r    rb   rC   r9   rG   r7   r-   ra   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.
        rV   rO   r   N)r?   rP   r[   r    rb   rB   r9   rG   r7   r-   rC   ra   r
   r*   rd   r   r   r   Útest_quitQuitsLaterWhenBusyñ   s    
z%TeamTests.test_quitQuitsLaterWhenBusyc                   sd   ˆj  t¡ ˆj jj‰ d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   )rC   r   ©ZoriginalSetr   r   r   ÚperformWorkConcurrently	  s    zOTeamTests.test_quitConcurrentWithWorkHappening.<locals>.performWorkConcurrentlyN)r?   r    rb   Z_quitÚsetr9   ra   r
   )r   ri   r   rh   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.
        rV   é   rR   N)
r[   r?   r    rb   rB   rG   r7   r-   rT   rC   rd   r   r   r   Útest_shrinkWhenBusy  s    zTeamTests.test_shrinkWhenBusyN)r#   r$   r%   r&   r@   rB   rC   rJ   rN   rQ   rS   rU   rW   r]   r`   rc   rf   rg   rk   rm   r   r   r   r   r(   (   s"   '

	r(   N)r&   Ú
__future__r   Útypingr   Ztwisted.python.componentsr   Ztwisted.python.contextr   r   Ztwisted.python.failurer   Ztwisted.trial.unittestr   Ú r
   r   r   r   r   r(   r   r   r   r   Ú<module>   s   