a
    äzepØ  ã                   @   s  d dl mZ e d¡ e ¡  d dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d d	lmZmZmZmZmZmZmZ d d
l m!Z! d dl"Z#d dl$Z#d dl#Z%ej&dddre 'd¡‚eddfdd„Z(e(edZ)e(edZ*e(edZ+e(edZ,e(ee-ƒ dZ.e(eddZ/da0dd„ Z1dd„ Z2dd„ Z3dd„ Z4dd„ Z5dd „ Z6dkd!d"„Z7G d#d$„ d$e8ƒZ9G d%d&„ d&ƒZ:d'd(„ Z;G d)d*„ d*ej<ƒZ=G d+d,„ d,ƒZ>G d-d.„ d.e>ƒZ?G d/d0„ d0e>ƒZ@G d1d2„ d2e>ƒZAG d3d4„ d4e>ƒZBe=fe?e@eBeAffd5d6„ZCG d7d8„ d8e>ƒZDG d9d:„ d:e>ƒZEeCeDƒ eCeEƒ G d;d<„ d<ƒZFG d=d>„ d>e?eFe=ƒZGG d?d@„ d@eFƒZHeCeHe@eBeAfdA G dBdC„ dCƒZIG dDdE„ dEe?eIe=ƒZJeCeIe@eBeAfdA G dFdG„ dGƒZKeCeKƒ G dHdI„ dIƒZLG dJdK„ dKe?eLe=ƒZMG dLdM„ dMeLƒZNeCeNe@eBeAfdA dldNdO„ZOdPdQ„ ZPdRdS„ ZQdTdU„ ZRdVdW„ ZSG dXdY„ dYe8ƒZTG dZd[„ d[e8ƒZUG d\d]„ d]e8ƒZVG d^d_„ d_e8ƒZWG d`da„ dae8ƒZXG dbdc„ dce8ƒZYG ddde„ deƒZZeCeZe@eBeAfdA G dfdg„ dge=ƒZ[dhdi„ Z\e]djkre ^¡  dS )mé    )ÚsupportÚ_multiprocessing)Úhashlib_helper)Úassert_python_okN)ÚQueueHandler©ÚPicklingError)Úfutures)ÚPENDINGÚRUNNINGÚ	CANCELLEDÚCANCELLED_AND_NOTIFIEDÚFINISHEDÚFutureÚBrokenExecutor)ÚBrokenProcessPoolT)ÚaddressZmemoryz test too slow on ASAN/MSAN buildc                 C   s   t ƒ }| |_||_||_|S ©N)r   Ú_stateÚ
_exceptionÚ_result)ÚstateÚ	exceptionÚresultÚf© r   ú2/usr/lib/python3.9/test/test_concurrent_futures.pyÚcreate_future)   s
    r   ©r   ©r   r   é*   ©r   r   Úuninitializedc                 C   s   | | S r   r   )ÚxÚyr   r   r   Úmul;   s    r%   c                  O   s   | |fS r   r   )ÚargsÚkwargsr   r   r   Úcapture>   s    r(   c                 C   s   t  | ¡ tdƒ‚d S )Nzthis is an exception)ÚtimeÚsleepÚ	Exception)Útr   r   r   Úsleep_and_raiseA   s    
r-   c                 C   s    t  | ¡ t|ƒ tj ¡  d S r   )r)   r*   ÚprintÚsysÚstdoutÚflush)r,   Úmsgr   r   r   Úsleep_and_printE   s    
r3   c                 C   s   | a d S r   ©ÚINITIALIZER_STATUS)r#   r   r   r   ÚinitJ   s    r6   c                   C   s   t S r   r4   r   r   r   r   Úget_init_statusN   s    r7   c                 C   sF   | d ur0t  d¡}| t| ƒ¡ | d¡ d|_t d¡ tdƒ‚d S )Núconcurrent.futuresÚCRITICALFçš™™™™™¹?zerror in initializer)	ÚloggingÚ	getLoggerÚ
addHandlerr   ÚsetLevelÚ	propagater)   r*   Ú
ValueError)Ú	log_queueÚloggerr   r   r   Ú	init_failQ   s    


rC   c                   @   s   e Zd Zdd„ ZdS )ÚMyObjectc                 C   s   d S r   r   ©Úselfr   r   r   Ú	my_method\   s    zMyObject.my_methodN)Ú__name__Ú
__module__Ú__qualname__rG   r   r   r   r   rD   [   s   rD   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚEventfulGCObjc                 C   s   |  ¡ | _d S r   )ÚEventÚevent)rF   Úmgrr   r   r   Ú__init__a   s    zEventfulGCObj.__init__c                 C   s   | j  ¡  d S r   )rM   ÚsetrE   r   r   r   Ú__del__d   s    zEventfulGCObj.__del__N)rH   rI   rJ   rO   rQ   r   r   r   r   rK   `   s   rK   c                 C   s   t ƒ S r   )rD   )Ú_r   r   r   Úmake_dummy_objecth   s    rS   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚBaseTestCasec                 C   s   t  ¡ | _d S r   )r   Úthreading_setupÚ_thread_keyrE   r   r   r   ÚsetUpm   s    zBaseTestCase.setUpc                 C   s   t  ¡  t j| jŽ  d S r   )r   Úreap_childrenÚthreading_cleanuprV   rE   r   r   r   ÚtearDownp   s    zBaseTestCase.tearDownN)rH   rI   rJ   rW   rZ   r   r   r   r   rT   l   s   rT   c                       s8   e Zd ZdZi Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚExecutorMixiné   c                    s^   t ƒ  ¡  t ¡ | _t| dƒr@| jf | j|  ¡ dœ| j	¤Ž| _
n| jf d| ji| j	¤Ž| _
d S )NÚctx©Úmax_workersÚ
mp_contextr_   )ÚsuperrW   r)   Ú	monotonicÚt1ÚhasattrÚexecutor_typeÚworker_countÚget_contextÚexecutor_kwargsÚexecutorrE   ©Ú	__class__r   r   rW   y   s    


þý
ÿþzExecutorMixin.setUpc                    sT   | j jdd d | _ t ¡ | j }tjr8td| dd |  |dd¡ t	ƒ  
¡  d S )NT©Úwaitz%.2fsú )Úendi,  z+synchronization issue: test lasted too long)ri   Úshutdownr)   rb   rc   r   Úverboser.   Z
assertLessra   rZ   )rF   Zdtrj   r   r   rZ   ‡   s    zExecutorMixin.tearDownc                 C   s   t  | j¡S r   )Úmprg   r]   rE   r   r   r   rg   ’   s    zExecutorMixin.get_context)	rH   rI   rJ   rf   rh   rW   rZ   rg   Ú__classcell__r   r   rj   r   r[   u   s
   r[   c                   @   s   e Zd ZejZdS )ÚThreadPoolMixinN)rH   rI   rJ   r	   ÚThreadPoolExecutorre   r   r   r   r   rt   –   s   rt   c                       s&   e Zd ZejZdZ‡ fdd„Z‡  ZS )ÚProcessPoolForkMixinÚforkc                    s   t jdkr|  d¡ tƒ  ¡ S ©NÚwin32zrequire unix system©r/   ÚplatformZskipTestra   rg   rE   rj   r   r   rg   ž   s    

z ProcessPoolForkMixin.get_context©	rH   rI   rJ   r	   ÚProcessPoolExecutorre   r]   rg   rs   r   r   rj   r   rv   š   s   rv   c                   @   s   e Zd ZejZdZdS )ÚProcessPoolSpawnMixinÚspawnN)rH   rI   rJ   r	   r}   re   r]   r   r   r   r   r~   ¤   s   r~   c                       s&   e Zd ZejZdZ‡ fdd„Z‡  ZS )ÚProcessPoolForkserverMixinÚ
forkserverc                    s   t jdkr|  d¡ tƒ  ¡ S rx   rz   rE   rj   r   r   rg   ­   s    

z&ProcessPoolForkserverMixin.get_contextr|   r   r   rj   r   r€   ©   s   r€   c                 C   sP   dd„ }|D ]>}d||j ƒ|| j ƒf }t|| f|f | i ƒ}|tƒ |< qd S )Nc                 S   s4   |   d¡r| d d… S |   d¡r,| d d… S | S d S )N)ZMixinZTestséûÿÿÿZTestéüÿÿÿ)Úendswith)Únamer   r   r   Ústrip_mixin¸   s
    

z*create_executor_tests.<locals>.strip_mixinz%s%sTest)rH   ÚtypeÚglobals)ZmixinÚbasesÚexecutor_mixinsr†   Zexer…   Úclsr   r   r   Úcreate_executor_tests³   s    ÿrŒ   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚInitializerMixiné   c                    s    da ttdd| _tƒ  ¡  d S )Nr"   )Úinitialized©ÚinitializerÚinitargs)r5   Údictr6   rh   ra   rW   rE   rj   r   r   rW   Ê   s
    ÿzInitializerMixin.setUpc                    s6   ‡ fdd„t ˆ jƒD ƒ}|D ]}ˆ  | ¡ d¡ qd S )Nc                    s   g | ]}ˆ j  t¡‘qS r   )ri   Úsubmitr7   ©Ú.0rR   rE   r   r   Ú
<listcomp>Ò   s   ÿz5InitializerMixin.test_initializer.<locals>.<listcomp>r   )Úrangerf   ÚassertEqualr   )rF   r	   r   r   rE   r   Útest_initializerÑ   s
    
ÿz!InitializerMixin.test_initializer)rH   rI   rJ   rf   rW   rš   rs   r   r   rj   r   r   Ç   s   r   c                       s6   e Zd ZdZ‡ fdd„Zdd„ Zejdd„ ƒZ‡  Z	S )ÚFailingInitializerMixinrŽ   c                    sZ   t | dƒr4|  ¡ | _| j ¡ | _tt| jfd| _nd | _d | _ttd| _tƒ  	¡  d S )Nr]   r   )r‘   )
rd   rg   r`   ÚQueuerA   r“   rC   rh   ra   rW   rE   rj   r   r   rW   Ü   s    

ÿ
zFailingInitializerMixin.setUpc              	   C   sð   |   d¡Ò z| j t¡}W n ty.   Y n40 |  t¡ | ¡  W d   ƒ n1 sX0    Y  t ¡ }| jj	s˜t ¡ | dkrŒ|  
d¡ t d¡ qj|  t¡ | j t¡ W d   ƒ n1 sÄ0    Y  W d   ƒ n1 sâ0    Y  d S )Nz ValueError: error in initializerr\   zexecutor not broken after 5 s.g{®Gáz„?)Ú_assert_loggedri   r”   r7   r   ÚassertRaisesr   r)   rb   Ú_brokenÚfailr*   )rF   Úfuturerc   r   r   r   rš   ë   s    &
z(FailingInitializerMixin.test_initializerc                 #   s    | j d urFd V  g }z| | j  ¡  ¡ ¡ qW q~ tjyB   Y q~0 n8|  dd¡}d V  W d   ƒ n1 sn0    Y  |j}|  t	‡ fdd„|D ƒƒ|¡ d S )Nr8   r9   c                 3   s   | ]}ˆ |v V  qd S r   r   )r–   Úline©r2   r   r   Ú	<genexpr>  ó    z9FailingInitializerMixin._assert_logged.<locals>.<genexpr>)
rA   ÚappendÚ
get_nowaitÚ
getMessageÚqueueÚEmptyZ
assertLogsÚoutputÚ
assertTrueÚany)rF   r2   r«   Úcmr   r£   r   r   ÿ   s    
$ÿz&FailingInitializerMixin._assert_logged)
rH   rI   rJ   rf   rW   rš   Ú
contextlibÚcontextmanagerr   rs   r   r   rj   r   r›   Ù   s
   r›   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚExecutorShutdownTestc                 C   s$   | j  ¡  |  t| j jtdd¡ d S )NrŽ   r\   )ri   rp   rž   ÚRuntimeErrorr”   ÚpowrE   r   r   r   Útest_run_after_shutdown  s
    
þz,ExecutorShutdownTest.test_run_after_shutdownc                 C   sD   t ddj| jjt| ddƒdƒ\}}}|  |¡ |  | ¡ d¡ d S )Nú-caK  if 1:
            from concurrent.futures import {executor_type}
            from time import sleep
            from test.test_concurrent_futures import sleep_and_print
            if __name__ == "__main__":
                context = '{context}'
                if context == "":
                    t = {executor_type}(5)
                else:
                    from multiprocessing import get_context
                    context = get_context(context)
                    t = {executor_type}(5, mp_context=context)
                t.submit(sleep_and_print, 1.0, "apple")
            r]   Ú ©re   Úcontextó   apple)r   Úformatre   rH   ÚgetattrÚassertFalser™   Ústrip©rF   ÚrcÚoutÚerrr   r   r   Útest_interpreter_shutdown  s    
ò
z.ExecutorShutdownTest.test_interpreter_shutdownc                 C   sJ   t ddj| jjt| ddƒdƒ\}}}|  d| ¡ ¡ |  | ¡ d¡ d S )Nrµ   aÐ  if 1:
            import atexit
            @atexit.register
            def run_last():
                try:
                    t.submit(id, None)
                except RuntimeError:
                    print("runtime-error")
                    raise
            from concurrent.futures import {executor_type}
            if __name__ == "__main__":
                context = '{context}'
                if not context:
                    t = {executor_type}(5)
                else:
                    from multiprocessing import get_context
                    context = get_context(context)
                    t = {executor_type}(5, mp_context=context)
                    t.submit(id, 42).result()
            r]   r¶   r·   z)RuntimeError: cannot schedule new futuress   runtime-error)	r   rº   re   rH   r»   ÚassertInÚdecoder™   r½   r¾   r   r   r   Ú&test_submit_after_interpreter_shutdown2  s    
ìz;ExecutorShutdownTest.test_submit_after_interpreter_shutdownc                    s6   ‡ fdd„t dƒD ƒ}ˆ j ¡  |D ]}| ¡  q$d S )Nc                    s   g | ]}ˆ j  tjd ¡‘qS ©r:   ©ri   r”   r)   r*   r•   rE   r   r   r—   O  r¥   z=ExecutorShutdownTest.test_hang_issue12364.<locals>.<listcomp>é2   )r˜   ri   rp   r   )rF   Úfsr   r   rE   r   Útest_hang_issue12364N  s    
z)ExecutorShutdownTest.test_hang_issue12364c                    s–   ‡ fdd„t dƒD ƒ}ˆ jjdd dd„ |D ƒ}ˆ  t|ƒd¡ dd„ |D ƒ}|D ],}ˆ j| ¡ d	|j›d
 ˆ  | 	¡ ¡ qTˆ  t|ƒd¡ d S )Nc                    s   g | ]}ˆ j  tjd ¡‘qS rÆ   rÇ   r•   rE   r   r   r—   V  r¥   z<ExecutorShutdownTest.test_cancel_futures.<locals>.<listcomp>rÈ   T)Úcancel_futuresc                 S   s   g | ]}|  ¡ r|‘qS r   ©Ú	cancelled©r–   Úfutr   r   r   r—   [  r¥   é   c                 S   s   g | ]}|  ¡ s|‘qS r   rÌ   rÎ   r   r   r   r—   a  r¥   zfut._state=r£   r   )
r˜   ri   rp   ZassertGreaterÚlenr¬   Údoner   ÚassertIsNoner   )rF   rÉ   rÍ   ZothersrÏ   r   rE   r   Útest_cancel_futuresT  s    z(ExecutorShutdownTest.test_cancel_futuresc                 C   sZ   | j tjkrt d¡‚tddj| j jt| dd ƒdƒ\}}}|  	|¡ |  
| ¡ d¡ d S )Nz9Hangs, see https://github.com/python/cpython/issues/83386rµ   aœ  if True:
            from concurrent.futures import {executor_type}
            from test.test_concurrent_futures import sleep_and_print
            if __name__ == "__main__":
                if {context!r}: multiprocessing.set_start_method({context!r})
                t = {executor_type}(max_workers=3)
                t.submit(sleep_and_print, 1.0, "apple")
                t.shutdown(wait=False)
            r]   r·   r¹   )re   r	   r}   ÚunittestÚSkipTestr   rº   rH   r»   r¼   r™   r½   r¾   r   r   r   Útest_hang_gh83386k  s    ÿ
÷

z&ExecutorShutdownTest.test_hang_gh83386N)	rH   rI   rJ   r´   rÂ   rÅ   rÊ   rÔ   r×   r   r   r   r   r±     s   r±   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚThreadPoolShutdownTestc                 C   s|   dd„ }t  d¡}tdƒD ]}| j ||¡ q|  t| jjƒd¡ tdƒD ]}| ¡  qJ| j 	¡  | jjD ]}| 
¡  qjd S )Nc                 S   s   |   ¡  d S r   ©Úacquire©Úlockr   r   r   Úacquire_lock„  s    zCThreadPoolShutdownTest.test_threads_terminate.<locals>.acquire_lockr   é   )Ú	threadingÚ	Semaphorer˜   ri   r”   r™   rÑ   Ú_threadsÚreleaserp   Újoin)rF   rÝ   ÚsemÚir,   r   r   r   Útest_threads_terminateƒ  s    


z-ThreadPoolShutdownTest.test_threads_terminatec              
   C   sj   t jdd6}|}|  t| ttddƒ¡ƒg d¢¡ W d   ƒ n1 sH0    Y  |jD ]}| ¡  qXd S )Nr\   ©r_   r‚   ©
r\   é   rÞ   rŽ   é   r   rê   rŽ   rÞ   ré   )	r	   ru   r™   ÚlistÚmapÚabsr˜   rá   rã   )rF   Úeri   r,   r   r   r   Útest_context_manager_shutdown‘  s    ÿ"
z4ThreadPoolShutdownTest.test_context_manager_shutdownc                 C   s<   t jdd}| ttddƒ¡}|j}~|D ]}| ¡  q*d S )Nr\   rç   r‚   )r	   ru   rì   rí   r˜   rá   rã   ©rF   ri   ÚresÚthreadsr,   r   r   r   Útest_del_shutdownš  s    
z(ThreadPoolShutdownTest.test_del_shutdownc                 C   sF   t jdd}| ttddƒ¡}|j}|jdd |D ]}| ¡  q4d S )Nr\   rç   r‚   Frl   )r	   ru   rì   rí   r˜   rá   rp   rã   rð   r   r   r   Útest_shutdown_no_wait§  s    
z,ThreadPoolShutdownTest.test_shutdown_no_waitc                 C   sT   t jddd}| ttddƒ¡ |j}~t ¡  |D ]}|  |j	d¡ | 
¡  q4d S )Nr\   ZSpecialPool)r_   Zthread_name_prefixr‚   z^SpecialPool_[0-4]$©r	   ru   rì   rí   r˜   rá   r   Ú
gc_collectÚassertRegexr…   rã   ©rF   ri   rò   r,   r   r   r   Útest_thread_names_assigned¶  s    ÿz1ThreadPoolShutdownTest.test_thread_names_assignedc                 C   sR   t jdd}| ttddƒ¡ |j}~t ¡  |D ]}|  |j	d¡ | 
¡  q2d S )Nr\   rç   r‚   zThreadPoolExecutor-\d+_[0-4]$rõ   rø   r   r   r   Útest_thread_names_defaultÂ  s    z0ThreadPoolShutdownTest.test_thread_names_defaultc                 C   s:   t ddj| jjdƒ\}}}|  |¡ |  | ¡ d¡ d S )Nrµ   a[  if True:
            from concurrent.futures import ThreadPoolExecutor
            from test.test_concurrent_futures import sleep_and_print
            if __name__ == "__main__":
                t = ThreadPoolExecutor()
                t.submit(sleep_and_print, .1, "apple")
                t.shutdown(wait=False, cancel_futures=True)
            )re   r¹   )r   rº   re   rH   r¼   r™   r½   r¾   r   r   r   Útest_cancel_futures_wait_falseÏ  s
    ù

z5ThreadPoolShutdownTest.test_cancel_futures_wait_falseN)
rH   rI   rJ   ræ   rï   ró   rô   rù   rú   rû   r   r   r   r   rØ   ‚  s   	rØ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚProcessPoolShutdownTestc                 C   s¨   dd„ }|   ¡ }|jdddkr(| j}nd}| d¡}tdƒD ]}| j ||¡ q>|  t| jj	ƒ|¡ tdƒD ]}| 
¡  qn| jj	}| j ¡  | ¡ D ]}| ¡  q–d S )Nc                 S   s   |   ¡  d S r   rÙ   rÛ   r   r   r   rÝ   â  s    zFProcessPoolShutdownTest.test_processes_terminate.<locals>.acquire_lockF©Ú
allow_nonerw   rÞ   r   )rg   Úget_start_methodrf   rà   r˜   ri   r”   r™   rÑ   Ú
_processesrâ   rp   Úvaluesrã   )rF   rÝ   r`   Zexpected_num_processesrä   rR   Ú	processesÚpr   r   r   Útest_processes_terminateá  s    


z0ProcessPoolShutdownTest.test_processes_terminatec              
   C   st   t jd|  ¡ d8}|j}|  t| ttddƒ¡ƒg d¢¡ W d   ƒ n1 sP0    Y  | 	¡ D ]}| 
¡  qbd S )Nr\   r^   r‚   rè   )r	   r}   rg   r   r™   rë   rì   rí   r˜   r  rã   )rF   rî   r  r  r   r   r   rï   ø  s    ÿÿ"z5ProcessPoolShutdownTest.test_context_manager_shutdownc                 C   sp   t jd|  ¡ d}| ttddƒ¡}|j}|j}|j}|j}~t	 
¡  | ¡  | ¡ D ]}| ¡  qV| ¡  d S )Nr\   r^   r‚   )r	   r}   rg   rì   rí   r˜   Ú_executor_manager_threadr   Ú_call_queuer   rö   rã   r  Újoin_thread)rF   ri   rñ   Úexecutor_manager_threadr  Ú
call_queuer  r   r   r   ró     s    ÿ
z)ProcessPoolShutdownTest.test_del_shutdownc                 C   sl   t jd|  ¡ d}| ttddƒ¡}|j}|j}|j}|j	dd | 
¡  | ¡ D ]}| 
¡  qR| ¡  d S )Nr\   r^   r‚   Frl   )r	   r}   rg   rì   rí   r˜   r   r  r  rp   rã   r  r  )rF   ri   rñ   r  r	  r  r  r   r   r   rô     s    ÿ
z-ProcessPoolShutdownTest.test_shutdown_no_waitN)rH   rI   rJ   r  rï   ró   rô   r   r   r   r   rü   à  s   
rü   )rŠ   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )Ú	WaitTestsc                 C   sH   | j  tjd¡}tj||gtjd\}}|  |h|¡ |  tƒ |¡ d S ©Nç      ø?©Úreturn_when)	ri   r”   r)   r*   r	   rm   ÚALL_COMPLETEDr™   rP   )rF   r¡   rÒ   Únot_doner   r   r   Ú
test_203696  s    
ÿ
zWaitTests.test_20369c                 C   sd   | j  tdd¡}| j  tjd¡}tjt||gtjd\}}|  	t
|gƒ|¡ |  	t
t|gƒ|¡ d S )Né   rŽ   r  r  )ri   r”   r%   r)   r*   r	   rm   ÚCANCELLED_FUTUREÚFIRST_COMPLETEDr™   rP   )rF   Úfuture1Úfuture2rÒ   r  r   r   r   Útest_first_completed?  s    þ
zWaitTests.test_first_completedc                 C   sT   | j  tjd¡}tjtt|gtjd\}}|  	t
ttgƒ|¡ |  	t
|gƒ|¡ d S r  )ri   r”   r)   r*   r	   rm   ÚCANCELLED_AND_NOTIFIED_FUTUREÚSUCCESSFUL_FUTUREr  r™   rP   ©rF   r  ÚfinishedÚpendingr   r   r   Ú+test_first_completed_some_already_completedJ  s    þ

þz5WaitTests.test_first_completed_some_already_completedc                 C   sr   | j  tdd¡}| j  td¡}| j  tjd¡}tj|||gtjd\}}|  	t
||gƒ|¡ |  	t
|gƒ|¡ d S )NrŽ   r  r  rÞ   r  )ri   r”   r%   r-   r)   r*   r	   rm   ÚFIRST_EXCEPTIONr™   rP   )rF   r  r  Zfuture3r  r  r   r   r   Útest_first_exceptionV  s    þ
zWaitTests.test_first_exceptionc                 C   sl   | j  tdd¡}| j  tjd¡}tjttt	||gtj
d\}}|  ttt	|gƒ|¡ |  tt|gƒ|¡ d S )Nr  r   r  r  )ri   r”   Údivmodr)   r*   r	   rm   r  r  r  r  r™   rP   ©rF   r  r  r  r  r   r   r   Ú*test_first_exception_some_already_completeb  s"    ýû
þþz4WaitTests.test_first_exception_some_already_completec                 C   sP   | j  tjd¡}tjt|gtjd\}}|  t	tgƒ|¡ |  t	|gƒ|¡ d S )NrŽ   r  )
ri   r”   r)   r*   r	   rm   ÚEXCEPTION_FUTUREr  r™   rP   r  r   r   r   Ú'test_first_exception_one_already_failedr  s    þ
z1WaitTests.test_first_exception_one_already_failedc                 C   sj   | j  tdd¡}| j  tdd¡}tjttt||gtj	d\}}|  
tttt||gƒ|¡ |  
tƒ |¡ d S )NrŽ   r   r  r  )ri   r”   r   r%   r	   rm   r  r  r#  r  r™   rP   r!  r   r   r   Útest_all_completed|  s(    üú
üüzWaitTests.test_all_completedc                 C   sn   | j  tdd¡}| j  tjd¡}tjttt	||gdtj
d\}}|  tttt	|gƒ|¡ |  t|gƒ|¡ d S )Né   é   r\   )Útimeoutr  )ri   r”   r%   r)   r*   r	   rm   r  r#  r  r  r™   rP   r!  r   r   r   Útest_timeout  s&    ýú
ýýzWaitTests.test_timeoutN)rH   rI   rJ   r  r  r  r  r"  r$  r%  r)  r   r   r   r   r
  5  s   	
r
  c                   @   s   e Zd Zdd„ ZdS )ÚThreadPoolWaitTestsc              	      sv   t  ¡ ‰ ‡ fdd„‰t ¡ }t d¡ z>‡‡fdd„tdƒD ƒ}ˆ  ¡  tj|tj	d W t |¡ nt |¡ 0 d S )Nc                      s   ˆ   ¡  d S r   rl   r   )rM   r   r   Úfuture_func¨  s    z@ThreadPoolWaitTests.test_pending_calls_race.<locals>.future_funcgíµ ÷Æ°>c                    s   h | ]}ˆj  ˆ ¡’qS r   )ri   r”   )r–   rå   )r+  rF   r   r   Ú	<setcomp>­  r¥   z>ThreadPoolWaitTests.test_pending_calls_race.<locals>.<setcomp>éd   r  )
rß   rL   r/   ÚgetswitchintervalÚsetswitchintervalr˜   rP   r	   rm   r  )rF   ZoldswitchintervalrÉ   r   )rM   r+  rF   r   Útest_pending_calls_race¤  s    
z+ThreadPoolWaitTests.test_pending_calls_raceN)rH   rI   rJ   r0  r   r   r   r   r*  ¢  s   r*  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚAsCompletedTestsc                 C   sV   | j  tdd¡}| j  tdd¡}tt ttt||g¡ƒ}|  	tttt||gƒ|¡ d S )NrŽ   r  r'  r&  )
ri   r”   r%   rP   r	   Úas_completedr  r#  r  r™   )rF   r  r  Ú	completedr   r   r   Útest_no_timeout¼  s$    ýÿýÿûz AsCompletedTests.test_no_timeoutc                 C   sp   | j  tjd¡}tƒ }z*tjttt	|gddD ]}| 
|¡ q.W n tjyT   Y n0 |  tttt	gƒ|¡ d S )NrŽ   r   ©r(  )ri   r”   r)   r*   rP   r	   r2  r  r#  r  ÚaddÚTimeoutErrorr™   )rF   r  Zcompleted_futuresr¡   r   r   r   Útest_zero_timeoutÌ  s(    ýû
þýz"AsCompletedTests.test_zero_timeoutc                 C   s@   | j  tjd¡}dd„ t t |d¡¡D ƒ}|  t	|ƒd¡ d S )NrŽ   c                 S   s   g | ]}|‘qS r   r   )r–   r   r   r   r   r—   ä  s   z;AsCompletedTests.test_duplicate_futures.<locals>.<listcomp>rÞ   rê   )
ri   r”   r)   r*   r	   r2  Ú	itertoolsÚrepeatr™   rÑ   )rF   r  r3  r   r   r   Útest_duplicate_futuresß  s
    ÿz'AsCompletedTests.test_duplicate_futuresc                 C   sü   dd„ t dƒD ƒ}| ttd¡ | ttdd¡ |  tj¡N tj|ddD ].}| 	|¡ t
 |¡}~t ¡  |  |ƒ ¡ qPW d   ƒ n1 s”0    Y  |d  d	¡ t |¡D ]@}| 	|¡ t
 |¡}~t ¡  |  |ƒ ¡ |r¶|d  d	¡ q¶d S )
Nc                 S   s   g | ]
}t ƒ ‘qS r   )r   r•   r   r   r   r—   ì  r¥   zGAsCompletedTests.test_free_reference_yielded_future.<locals>.<listcomp>é   r   r    r!   r   r5  Útest)r˜   r¦   r   r   r   rž   r	   r7  r2  ÚremoveÚweakrefÚrefr   rö   rÓ   Ú
set_result)rF   Úfutures_listr¡   Úwrr   r   r   Ú"test_free_reference_yielded_futureé  s&    

,

z3AsCompletedTests.test_free_reference_yielded_futurec                 C   s`   t tttg}|  tj¡"}ttj|ddƒ W d   ƒ n1 s@0    Y  |  	t
|jƒd¡ d S )Nr   r5  z2 (of 4) futures unfinished)r  ÚPENDING_FUTUREÚRUNNING_FUTUREr  rž   r	   r7  rë   r2  r™   Ústrr   )rF   rB  r®   r   r   r   Ú"test_correct_timeout_exception_msg  s    ÿ0z3AsCompletedTests.test_correct_timeout_exception_msgN)rH   rI   rJ   r4  r8  r;  rD  rH  r   r   r   r   r1  º  s
   
r1  c                   @   sZ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	j
dd„ ƒZdd„ Zdd„ ZdS )ÚExecutorTestc                 C   s$   | j  tdd¡}|  d| ¡ ¡ d S )NrŽ   r<  é   )ri   r”   r³   r™   r   ©rF   r¡   r   r   r   Útest_submit  s    zExecutorTest.test_submitc                 C   sÆ   | j jtddd}|  d| ¡ ¡ | j jtdddd}|  | ¡ ddddœf¡ |  t¡  | j jtdd	 W d   ƒ n1 s€0    Y  |  t¡ | j jdd
 W d   ƒ n1 s¸0    Y  d S )NrŽ   r<  )r$   é   rê   rÞ   )rF   Úfn)rê   )rN  Úarg)rO  )ri   r”   r%   r™   r   r(   rž   Ú	TypeErrorrK  r   r   r   Útest_submit_keyword  s    .z ExecutorTest.test_submit_keywordc              	   C   sx   |   t| j ttdƒtdƒ¡ƒttttdƒtdƒƒƒ¡ |   t| jjttdƒtdƒddƒttttdƒtdƒƒƒ¡ d S )Né
   rÞ   ©Ú	chunksize)r™   rë   ri   rì   r³   r˜   rE   r   r   r   Útest_map   s    þþzExecutorTest.test_mapc                 C   sJ   | j  tg d¢g d¢¡}|  | ¡ d¡ |  | ¡ d¡ |  t|j¡ d S )N)rê   rê   rê   rê   )rŽ   rÞ   r   r\   )r   rê   )ri   rì   r   r™   Ú__next__rž   ÚZeroDivisionError)rF   rå   r   r   r   Útest_map_exception)  s    zExecutorTest.test_map_exceptionc                 C   sd   g }z,| j jtjg d¢ddD ]}| |¡ qW n tjyD   Y n0 |  d¡ |  d d g|¡ d S )N)r   r   r&  r\   r5  zexpected TimeoutError)	ri   rì   r)   r*   r¦   r	   r7  r    r™   )rF   Úresultsrå   r   r   r   Útest_map_timeout/  s    
þ

zExecutorTest.test_map_timeoutc                 C   s(   | j  tdg| jd  ¡ | j  ¡  d S )NrŽ   rê   )ri   rì   rG  rf   rp   rE   r   r   r   Útest_shutdown_race_issue12456=  s    z*ExecutorTest.test_shutdown_race_issue12456c                    sP   t ƒ }t ¡ ‰ t |‡ fdd„¡}| j |j¡ ~ˆ jt	j
d}|  |d¡ d S )Nc                    s   ˆ   ¡ S r   )rP   )Úobj©Zmy_object_collectedr   r   Ú<lambda>K  r¥   z7ExecutorTest.test_no_stale_references.<locals>.<lambda>r5  z-Stale reference not collected within timeout.)rD   rß   rL   r?  r@  ri   r”   rG   rm   r   ÚSHORT_TIMEOUTr¬   )rF   Z	my_objectZmy_object_callbackZ	collectedr   r]  r   Útest_no_stale_referencesD  s    ÿÿz%ExecutorTest.test_no_stale_referencesc              	   C   sF   dD ]<}|   td¡ | j|d W d   ƒ q1 s60    Y  qd S )N)r   éÿÿÿÿz"max_workers must be greater than 0rç   )ÚassertRaisesRegexr@   re   )rF   Znumberr   r   r   Útest_max_workers_negativeT  s
    ÿz&ExecutorTest.test_max_workers_negativec                 C   s<   | j  ttdƒ¡D ]$}t |¡}~t ¡  |  |ƒ ¡ qd S )NrR  )	ri   rì   rS   r˜   r?  r@  r   rö   rÓ   )rF   r\  rC  r   r   r   Útest_free_reference[  s
    
z ExecutorTest.test_free_referenceN)rH   rI   rJ   rL  rQ  rU  rX  rZ  r[  r   Zcpython_onlyr`  rc  rd  r   r   r   r   rI    s   
	
rI  c                   @   sF   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	e
d	ƒd
¡dd„ ƒZdS )ÚThreadPoolExecutorTestc                    sD   g ‰ ‡ fdd„}| j  |tdƒ¡ | j jdd |  ˆ tdƒ¡ d S )Nc                    s   ˆ   | ¡ d S r   )r¦   )Ún©r  r   r   Úrecord_finishedi  s    zRThreadPoolExecutorTest.test_map_submits_without_iteration.<locals>.record_finishedrR  Trl   )ri   rì   r˜   rp   ZassertCountEqual)rF   rh  r   rg  r   Ú"test_map_submits_without_iterationf  s
    z9ThreadPoolExecutorTest.test_map_submits_without_iterationc                 C   s0   |   ¡ }tdt ¡ pdd ƒ}|  |j|¡ d S )Né    rê   ré   )re   ÚminÚosÚ	cpu_countr™   Ú_max_workers)rF   ri   Zexpectedr   r   r   Útest_default_workersp  s    z+ThreadPoolExecutorTest.test_default_workersc                 C   s|   |   d¡}dd„ }t d¡}td|j ƒD ]}| ||¡ q*|  t|jƒ|j¡ td|j ƒD ]}| 	¡  q^|j
dd d S )Nré   c                 S   s   |   ¡  d S r   rÙ   rÛ   r   r   r   rÝ   w  s    z<ThreadPoolExecutorTest.test_saturation.<locals>.acquire_lockr   é   Trl   )re   rß   rà   r˜   rn  r”   r™   rÑ   rá   râ   rp   )rF   ri   rÝ   rä   rå   r   r   r   Útest_saturationu  s    


z&ThreadPoolExecutorTest.test_saturationc                 C   s`   |   ¡ }| tdd¡ ¡  | tdd¡ ¡  | tdd¡ ¡  |  t|jƒd¡ |jdd	 d S )
Nr  rŽ   r&  r'  rÞ   é   rê   Trl   )re   r”   r%   r   r™   rÑ   rá   rp   ©rF   ri   r   r   r   Útest_idle_thread_reuse‚  s    z-ThreadPoolExecutorTest.test_idle_thread_reuseÚregister_at_forkzneed os.register_at_forkc              
      s’   ‡ fdd„‰ t  d¡h}| ˆ |¡ tdƒD ]B}t jdt d¡d}| t¡ W d   ƒ q,1 sd0    Y  q,W d   ƒ n1 s„0    Y  d S )Nc                    s   |   ˆ | ¡ d S r   ©r”   )Úpoolrv  r   r   r”   Ž  s    zEThreadPoolExecutorTest.test_hang_global_shutdown_lock.<locals>.submitrê   rÈ   rw   )r`   )r	   ru   r”   r˜   r}   rr   rg   Útuple)rF   rw  rR   Úworkersr   rv  r   Útest_hang_global_shutdown_lockŠ  s    z5ThreadPoolExecutorTest.test_hang_global_shutdown_lockN)rH   rI   rJ   ri  ro  rq  rt  rÕ   Ú
skipUnlessrd   rl  rz  r   r   r   r   re  e  s   
re  c                   @   st   e Zd Ze ejdkd¡dd„ ƒZdd„ Zdd„ Z	e
d	d
„ ƒZdd„ Ze d¡dd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚProcessPoolExecutorTestry   zWindows-only process limitc                 C   s<   |   td¡ tjdd W d   ƒ n1 s.0    Y  d S )Nzmax_workers must be <= 61é>   rç   )rb  r@   r	   r}   rE   r   r   r   Útest_max_workers_too_large›  s    ÿz2ProcessPoolExecutorTest.test_max_workers_too_largec                 C   s`   | j  tjd¡g}tt| j j ¡ ƒƒ}| ¡  |D ]}|  	t
|j¡ q2|  	t
| j jtdd¡ d S )NrÞ   rŽ   r<  )ri   r”   r)   r*   ÚnextÚiterr   r  Ú	terminaterž   r   r   r³   )rF   r	   r  rÏ   r   r   r   Útest_killed_child¡  s    z)ProcessPoolExecutorTest.test_killed_childc              	      s¬   ‡ fdd„}t tttdƒtdƒƒƒ}ˆ  t ˆ jjttdƒtdƒddƒ|¡ ˆ  t ˆ jjttdƒtdƒddƒ|¡ ˆ  t ˆ jjttdƒtdƒddƒ|¡ ˆ  t|¡ d S )Nc                      s$   t ˆ jjttdƒtdƒddƒ d S )Né(   ra  rS  )rë   ri   rì   r³   r˜   r   rE   r   r   Úbad_map®  s    z;ProcessPoolExecutorTest.test_map_chunksize.<locals>.bad_maprƒ  r&  rS  rÈ   )rë   rì   r³   r˜   r™   ri   rž   r@   )rF   r„  r@  r   rE   r   Útest_map_chunksize­  s    þþþz*ProcessPoolExecutorTest.test_map_chunksizec                 C   s   t dƒ‚d S )Né{   )r²   ©r‹   r   r   r   Ú_test_traceback½  s    z'ProcessPoolExecutorTest._test_tracebackc              	   C   sò   | j  | j¡}|  t¡}| ¡  W d   ƒ n1 s60    Y  |j}|  t|ƒt	¡ |  
|jd¡ |j}|  t|ƒtjj¡ |  d|j¡ t ¡ :}z|‚W n  t	y¾   tjt ¡ Ž  Y n0 W d   ƒ n1 sÔ0    Y  |  d| ¡ ¡ d S )N)r†  z&raise RuntimeError(123) # some comment)ri   r”   rˆ  rž   r+   r   r   ZassertIsr‡   r²   r™   r&   Ú	__cause__r	   ÚprocessÚ_RemoteTracebackrÃ   Útbr   Úcaptured_stderrr/   Ú
excepthookÚexc_infoÚgetvalue)rF   r¡   r®   ÚexcÚcauseÚf1r   r   r   Útest_tracebackÁ  s"    &
2ÿz&ProcessPoolExecutorTest.test_tracebackÚmd5c                 C   s^   |   ¡  ¡ }t|ƒ}| j t|¡}| ¡  |  |jj	dd¡ d }t
 ¡  | ¡  | ¡  d S )Nrê   r5  )rg   ÚManagerrK   ri   r”   Úidr   r¬   rM   rm   r   rö   rp   rã   )rF   rN   r\  r¡   r   r   r   Útest_ressources_gced_in_workers×  s    z7ProcessPoolExecutorTest.test_ressources_gced_in_workersc                 C   sj   | j }|  ¡ }| d¡}d|j }t|ƒD ]}| |j¡ q*|  t|j	ƒ|j¡ t|ƒD ]}| 
¡  qXd S )Nr   rp  )ri   rg   rà   rn  r˜   r”   rÚ   r™   rÑ   r   râ   )rF   ri   r`   rä   Z	job_countrR   r   r   r   rq  ê  s    

z'ProcessPoolExecutorTest.test_saturationc                 C   sp   | j }|  ¡ jdddkr$t d¡‚| tdd¡ ¡  | tdd¡ ¡  | td	d
¡ ¡  |  t	|j
ƒd¡ d S )NFrý   rw   ú(Incompatible with the fork start method.r  rŽ   r&  r'  rÞ   rr  rê   )ri   rg   rÿ   rÕ   rÖ   r”   r%   r   r™   rÑ   r   rs  r   r   r   Útest_idle_process_reuse_oneõ  s    
z3ProcessPoolExecutorTest.test_idle_process_reuse_onec                 C   s¢   | j }|  ¡ jdddkr$t d¡‚| tdd¡ ¡  | tdd¡ | tdd	¡ ¡  | td
d¡ | tdd¡ ¡  | tdd¡ |  t	|j
ƒd¡ | ¡  d S )NFrý   rw   r™  é   r'  é!   é   é   é   é   rê   rŽ   r   é	   rÞ   )ri   rg   rÿ   rÕ   rÖ   r”   r%   r   ZassertLessEqualrÑ   r   rp   rs  r   r   r   Ú test_idle_process_reuse_multipleÿ  s    
z8ProcessPoolExecutorTest.test_idle_process_reuse_multipleN)rH   rI   rJ   rÕ   r{  r/   r{   r~  r‚  r…  Úclassmethodrˆ  r”  r   Zrequires_hashdigestr˜  rq  rš  r¢  r   r   r   r   r|  ™  s   



r|  c                 C   s*   | rt  | ¡ dd l}| ¡  | ¡  d S ©Nr   )r)   r*   ÚfaulthandlerÚdisableZ_sigsegv)Údelayr¥  r   r   r   Ú_crash  s
    
r¨  c                   C   s   t  d¡ d S ©Nrê   )r/   Úexitr   r   r   r   Ú_exit  s    r«  c                 C   s
   | ƒ ‚d S r   r   )ÚErrr   r   r   Ú_raise_error!  s    r­  c                 C   s   dd l }| ¡ t_| ƒ ‚d S r¤  )ÚioÚStringIOr/   Ústderr)r¬  r®  r   r   r   Ú_raise_error_ignore_stderr&  s    
r±  c                 C   s   | ƒ S r   r   r‡  r   r   r   Ú_return_instance-  s    r²  c                   @   s   e Zd Zdd„ ZdS )ÚCrashAtPicklec                 C   s
   t ƒ  d S r   ©r¨  rE   r   r   r   Ú
__reduce__4  s    zCrashAtPickle.__reduce__N©rH   rI   rJ   rµ  r   r   r   r   r³  2  s   r³  c                   @   s   e Zd Zdd„ ZdS )ÚCrashAtUnpicklec                 C   s   t dfS ©Nr   r´  rE   r   r   r   rµ  :  s    zCrashAtUnpickle.__reduce__Nr¶  r   r   r   r   r·  8  s   r·  c                   @   s   e Zd Zdd„ ZdS )ÚExitAtPicklec                 C   s
   t ƒ  d S r   ©r«  rE   r   r   r   rµ  @  s    zExitAtPickle.__reduce__Nr¶  r   r   r   r   r¹  >  s   r¹  c                   @   s   e Zd Zdd„ ZdS )ÚExitAtUnpicklec                 C   s   t dfS r¸  rº  rE   r   r   r   rµ  F  s    zExitAtUnpickle.__reduce__Nr¶  r   r   r   r   r»  D  s   r»  c                   @   s   e Zd Zdd„ ZdS )ÚErrorAtPicklec                 C   s   ddl m} |dƒ‚d S )Nr   r   zError in pickle)Úpickler   )rF   r   r   r   r   rµ  L  s    zErrorAtPickle.__reduce__Nr¶  r   r   r   r   r¼  J  s   r¼  c                   @   s   e Zd Zdd„ ZdS )ÚErrorAtUnpicklec                 C   s   ddl m} t|ffS )Nr   )ÚUnpicklingError)r½  r¿  r±  )rF   r¿  r   r   r   rµ  S  s    zErrorAtUnpickle.__reduce__Nr¶  r   r   r   r   r¾  Q  s   r¾  c                   @   s˜   e Zd ZejZdd„ Zddœdd„Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚExecutorDeadlockTestc                 C   s¨   dd l }ddlm} |dd.}|j|d | d¡ | ¡ }W d   ƒ n1 sR0    Y  |j ¡ D ]}| ¡  qf|j	dd t
d|› tjd |  d	|› ¡ d S )
Nr   )ÚTemporaryFilezw+)Úmode)ÚfileTrl   z
Traceback:
 zExecutor deadlock:

)r¥  ÚtempfilerÁ  Zdump_tracebackÚseekÚreadr   r  r  rp   r.   r/   Ú
__stderr__r    )rF   ri   r¥  rÁ  r   rŒ  r  r   r   r   Ú_fail_on_deadlock[  s    
&
z&ExecutorDeadlockTest._fail_on_deadlockF©Úignore_stderrc             	   G   sØ   | j jdd | jd|  ¡ d}|j|g|¢R Ž }|r@t ¡ }nt ¡ }z`|  	|¡B | |j
| jd W d   ƒ n1 s~0    Y  W d   ƒ n1 sœ0    Y  W n tjyÆ   |  |¡ Y n0 |jdd d S )NTrl   rŽ   r^   r5  )ri   rp   re   rg   r”   r   r  r¯   Únullcontextrž   r   ÚTIMEOUTr	   r7  rÈ  )rF   ÚerrorÚfuncrÊ  r&   ri   rñ   r®   r   r   r   Ú_check_crashn  s    ÿ
Nz!ExecutorDeadlockTest._check_crashc                 C   s   |   tttƒ ¡ d S r   )rÏ  r   r—  r¼  rE   r   r   r   Útest_error_at_task_pickle…  s    z.ExecutorDeadlockTest.test_error_at_task_picklec                 C   s   |   tttƒ ¡ d S r   )rÏ  r   r—  r»  rE   r   r   r   Útest_exit_at_task_unpickleŠ  s    z/ExecutorDeadlockTest.test_exit_at_task_unpicklec                 C   s   |   tttƒ ¡ d S r   )rÏ  r   r—  r¾  rE   r   r   r   Útest_error_at_task_unpickleŽ  s    z0ExecutorDeadlockTest.test_error_at_task_unpicklec                 C   s   |   tttƒ ¡ d S r   )rÏ  r   r—  r·  rE   r   r   r   Útest_crash_at_task_unpickle’  s    z0ExecutorDeadlockTest.test_crash_at_task_unpicklec                 C   s   |   tt¡ d S r   )rÏ  r   r¨  rE   r   r   r   Ú%test_crash_during_func_exec_on_worker–  s    z:ExecutorDeadlockTest.test_crash_during_func_exec_on_workerc                 C   s   |   tt¡ d S r   )rÏ  Ú
SystemExitr«  rE   r   r   r   Ú$test_exit_during_func_exec_on_workerš  s    z9ExecutorDeadlockTest.test_exit_during_func_exec_on_workerc                 C   s   |   ttt¡ d S r   )rÏ  r²   r­  rE   r   r   r   Ú%test_error_during_func_exec_on_workerž  s    z:ExecutorDeadlockTest.test_error_during_func_exec_on_workerc                 C   s   |   ttt¡ d S r   )rÏ  r   r²  r³  rE   r   r   r   Ú)test_crash_during_result_pickle_on_worker¢  s    z>ExecutorDeadlockTest.test_crash_during_result_pickle_on_workerc                 C   s   |   ttt¡ d S r   )rÏ  rÕ  r²  r¹  rE   r   r   r   Ú(test_exit_during_result_pickle_on_worker§  s    z=ExecutorDeadlockTest.test_exit_during_result_pickle_on_workerc                 C   s   |   ttt¡ d S r   )rÏ  r   r²  r¼  rE   r   r   r   Ú)test_error_during_result_pickle_on_worker¬  s    z>ExecutorDeadlockTest.test_error_during_result_pickle_on_workerc                 C   s   | j tttdd d S )NTrÉ  )rÏ  r   r²  r¾  rE   r   r   r   Ú3test_error_during_result_unpickle_in_result_handler±  s    þzHExecutorDeadlockTest.test_error_during_result_unpickle_in_result_handlerc                 C   s   |   ttt¡ d S r   )rÏ  r   r²  r»  rE   r   r   r   Ú2test_exit_during_result_unpickle_in_result_handler¸  s    zGExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handlerc              	   C   s–   | j jdd | jd|  ¡ db}|| _ |jtdd}|jdd |  t¡ | ¡  W d   ƒ n1 sj0    Y  W d   ƒ n1 sˆ0    Y  d S )NTrl   rŽ   r^   r:   )r§  )	ri   rp   re   rg   r”   r¨  rž   r   r   )rF   ri   r   r   r   r   Útest_shutdown_deadlock½  s    ÿz+ExecutorDeadlockTest.test_shutdown_deadlockc              	   C   s´   | j jdd | jd|  ¡ dx}|| _ | td¡ ¡  |j}| ttƒ ¡}|jdd |  	t
¡ | ¡  W d   ƒ n1 s€0    Y  W d   ƒ n1 sž0    Y  | ¡  d S )NTrl   rŽ   r^   r    F)ri   rp   re   rg   r”   r—  r   r  r¼  rž   r   rã   )rF   ri   Zexecutor_managerr   r   r   r   Útest_shutdown_deadlock_pickleÉ  s    ÿDz2ExecutorDeadlockTest.test_shutdown_deadlock_pickleN)rH   rI   rJ   r   r_  rÌ  rÈ  rÏ  rÐ  rÑ  rÒ  rÓ  rÔ  rÖ  r×  rØ  rÙ  rÚ  rÛ  rÜ  rÝ  rÞ  r   r   r   r   rÀ  X  s"   rÀ  c                   @   s¬   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)S )*ÚFutureTestsc                    s:   d ‰ ‡ fdd„}t ƒ }| |¡ | d¡ |  dˆ ¡ d S )Nc                    s   |   ¡ ‰ d S r   ©r   ©Zcallback_future©Zcallback_resultr   r   rN  í  s    z6FutureTests.test_done_callback_with_result.<locals>.fnr\   )r   Úadd_done_callbackrA  r™   ©rF   rN  r   r   râ  r   Útest_done_callback_with_resultë  s    

z*FutureTests.test_done_callback_with_resultc                    s@   d ‰ ‡ fdd„}t ƒ }| |¡ | tdƒ¡ |  dˆ j¡ d S )Nc                    s   |   ¡ ‰ d S r   ©r   rá  ©Zcallback_exceptionr   r   rN  ø  s    z9FutureTests.test_done_callback_with_exception.<locals>.fnr=  ©r=  )r   rã  Úset_exceptionr+   r™   r&   rä  r   rç  r   Ú!test_done_callback_with_exceptionö  s    
z-FutureTests.test_done_callback_with_exceptionc                    s<   d ‰ ‡ fdd„}t ƒ }| |¡ |  | ¡ ¡ |  ˆ ¡ d S )Nc                    s   |   ¡ ‰ d S r   rÌ   rá  ©Zwas_cancelledr   r   rN    s    z6FutureTests.test_done_callback_with_cancel.<locals>.fn)r   rã  r¬   Úcancelrä  r   rë  r   Útest_done_callback_with_cancel  s    
z*FutureTests.test_done_callback_with_cancelc                    s”   t  ¡ x}d‰d‰ ‡fdd„}‡ fdd„}tƒ }| |¡ | |¡ | d¡ |  ˆ¡ |  ˆ ¡ |  d| ¡ ¡ W d   ƒ n1 s†0    Y  d S )NFc                    s   d‰ t dƒ‚d S )NTúdoh!©r+   rá  )Úraising_was_calledr   r   Ú
raising_fn  s    z9FutureTests.test_done_callback_raises.<locals>.raising_fnc                    s   d‰ d S )NTr   rá  )Úfn_was_calledr   r   rN    s    z1FutureTests.test_done_callback_raises.<locals>.fnr\   zException: doh!)r   r  r   rã  rA  r¬   rÃ   r  )rF   r°  rñ  rN  r   r   )rò  rð  r   Útest_done_callback_raises  s    





z%FutureTests.test_done_callback_raisesc                    s:   d ‰ ‡ fdd„}t ƒ }| d¡ | |¡ |  dˆ ¡ d S )Nc                    s   |   ¡ ‰ d S r   rà  rá  râ  r   r   rN  $  s    z=FutureTests.test_done_callback_already_successful.<locals>.fnr\   )r   rA  rã  r™   rä  r   râ  r   Ú%test_done_callback_already_successful"  s    

z1FutureTests.test_done_callback_already_successfulc                    s@   d ‰ ‡ fdd„}t ƒ }| tdƒ¡ | |¡ |  dˆ j¡ d S )Nc                    s   |   ¡ ‰ d S r   ræ  rá  rç  r   r   rN  /  s    z9FutureTests.test_done_callback_already_failed.<locals>.fnr=  rè  )r   ré  r+   rã  r™   r&   rä  r   rç  r   Ú!test_done_callback_already_failed-  s    
z-FutureTests.test_done_callback_already_failedc                    s<   d ‰ ‡ fdd„}t ƒ }|  | ¡ ¡ | |¡ |  ˆ ¡ d S )Nc                    s   |   ¡ ‰ d S r   rÌ   rá  rë  r   r   rN  :  s    z<FutureTests.test_done_callback_already_cancelled.<locals>.fn)r   r¬   rì  rã  rä  r   rë  r   Ú$test_done_callback_already_cancelled8  s    
z0FutureTests.test_done_callback_already_cancelledc                 C   sn   t  ¡ R}dd„ }tƒ }| d¡ | |¡ |  d| ¡ ¡ |  d| ¡ ¡ W d   ƒ n1 s`0    Y  d S )Nc                 S   s   t dƒ‚d S )Nrî  rï  rá  r   r   r   rñ  E  s    zKFutureTests.test_done_callback_raises_already_succeeded.<locals>.raising_fnr\   zexception calling callback forrî  )r   r  r   rA  rã  rÃ   r  )rF   r°  rñ  r   r   r   r   Ú+test_done_callback_raises_already_succeededC  s    


z7FutureTests.test_done_callback_raises_already_succeededc                 C   sd   |   ttƒd¡ |   ttƒd¡ |   ttƒd¡ |   ttƒd¡ |   ttƒd¡ |   ttƒd¡ d S )Nz%<Future at 0x[0-9a-f]+ state=pending>z%<Future at 0x[0-9a-f]+ state=running>z'<Future at 0x[0-9a-f]+ state=cancelled>z5<Future at 0x[0-9a-f]+ state=finished raised OSError>z3<Future at 0x[0-9a-f]+ state=finished returned int>)r÷   ÚreprrE  rF  r  r  r#  r  rE   r   r   r   Ú	test_reprS  s(    
ÿ
ÿ
ÿ
ÿþþzFutureTests.test_reprc                 C   sî   t td}t td}t td}t td}t ttƒ d}t tdd}|  | ¡ ¡ |  	|j
t¡ |  | ¡ ¡ |  	|j
t¡ |  | ¡ ¡ |  	|j
t¡ |  | ¡ ¡ |  	|j
t¡ |  | ¡ ¡ |  	|j
t¡ |  | ¡ ¡ |  	|j
t¡ d S )Nr   r   r\   r!   )r   r
   r   r   r   r   ÚOSErrorr¬   rì  r™   r   r¼   )rF   r“  Úf2Zf3Zf4Zf5Zf6r   r   r   Útest_canceld  s$    



zFutureTests.test_cancelc                 C   sX   |   t ¡ ¡ |   t ¡ ¡ |  t ¡ ¡ |  t ¡ ¡ |   t ¡ ¡ |   t ¡ ¡ d S r   )	r¼   rE  rÍ   rF  r¬   r  r  r#  r  rE   r   r   r   Útest_cancelled~  s    zFutureTests.test_cancelledc                 C   sX   |   t ¡ ¡ |   t ¡ ¡ |  t ¡ ¡ |  t ¡ ¡ |  t ¡ ¡ |  t ¡ ¡ d S r   )	r¼   rE  rÒ   rF  r¬   r  r  r#  r  rE   r   r   r   Ú	test_done†  s    zFutureTests.test_donec                 C   sX   |   t ¡ ¡ |  t ¡ ¡ |   t ¡ ¡ |   t ¡ ¡ |   t ¡ ¡ |   t ¡ ¡ d S r   )	r¼   rE  Úrunningr¬   rF  r  r  r#  r  rE   r   r   r   Útest_runningŽ  s    zFutureTests.test_runningc                 C   sz   | j tjtjdd | j tjtjdd | j tjtjdd | j tjtjdd | j t	t
jdd |  tjddd¡ d S )Nr   r5  r    )rž   r	   r7  rE  r   rF  ÚCancelledErrorr  r  rú  r#  r™   r  rE   r   r   r   Útest_result_with_timeout–  s    ÿÿÿÿz$FutureTests.test_result_with_timeoutc                    sJ   ‡ fdd„}t td‰ tj|d}| ¡  |  ˆ jddd¡ | ¡  d S )Nc                      s   t  d¡ ˆ  d¡ d S )Nrê   r    )r)   r*   rA  r   ©r“  r   r   Únotification¤  s    
z:FutureTests.test_result_with_success.<locals>.notificationr   ©Útargetr\   r5  r    )r   r
   rß   ÚThreadÚstartr™   r   rã   ©rF   r  r,   r   r  r   Útest_result_with_success¢  s    
z$FutureTests.test_result_with_successc                    sL   ‡ fdd„}t td‰ tj|d}| ¡  | jtjˆ jt	j
d | ¡  d S )Nc                      s   t  d¡ ˆ  ¡  d S r©  )r)   r*   rì  r   r  r   r   r  ²  s    
z9FutureTests.test_result_with_cancel.<locals>.notificationr   r  r5  )r   r
   rß   r  r  rž   r	   r  r   r   r_  rã   r	  r   r  r   Útest_result_with_cancel°  s    
ÿz#FutureTests.test_result_with_cancelc                 C   s€   | j tjtjdd | j tjtjdd | j tjtjdd | j tjtjdd |  	t
tjddtƒ¡ |  tjddd ¡ d S )Nr   r5  )rž   r	   r7  rE  r   rF  r  r  r  r¬   Ú
isinstancer#  rú  r™   r  rE   r   r   r   Útest_exception_with_timeout¿  s     ÿÿÿÿÿz'FutureTests.test_exception_with_timeoutc                    sP   ‡ fdd„}t td‰ tj|d}| ¡  |  tˆ jtj	dt
ƒ¡ | ¡  d S )Nc                      sL   t  d¡ ˆ j( tˆ _tƒ ˆ _ˆ j ¡  W d   ƒ n1 s>0    Y  d S r©  )r)   r*   Ú
_conditionr   r   rú  r   Ú
notify_allr   r  r   r   r  Í  s
    
z=FutureTests.test_exception_with_success.<locals>.notificationr   r  r5  )r   r
   rß   r  r  r¬   r  r   r   r_  rú  rã   r	  r   r  r   Útest_exception_with_successÌ  s    
z'FutureTests.test_exception_with_successc                 C   sn   t td}| d¡ |  tjd¡ | d¡ W d   ƒ n1 sB0    Y  |  | ¡ ¡ |  | 	¡ d¡ d S )Nr   rê   z=FINISHED: <Future at 0x[0-9a-f]+ state=finished returned int>rŽ   )
r   r
   rA  rb  r	   ÚInvalidStateErrorr¬   rÒ   r™   r   )rF   r   r   r   r   Útest_multiple_set_resultÜ  s    

þ(z$FutureTests.test_multiple_set_resultc                 C   sh   t td}tƒ }| |¡ |  tjd¡ | tƒ ¡ W d   ƒ n1 sJ0    Y  |  | 	¡ |¡ d S )Nr   zBFINISHED: <Future at 0x[0-9a-f]+ state=finished raised ValueError>)
r   r
   r@   ré  rb  r	   r  r+   r™   r   )rF   r   rî   r   r   r   Útest_multiple_set_exceptionê  s    

þ*z'FutureTests.test_multiple_set_exceptionN)rH   rI   rJ   rå  rê  rí  ró  rô  rõ  rö  r÷  rù  rü  rý  rþ  r   r  r
  r  r  r  r  r  r   r   r   r   rß  ê  s(   rß  c                  C   s.   t  tjj¡ t ¡ } t jtjg| ¢R Ž  d S r   )rÕ   ZaddModuleCleanupÚmultiprocessingÚutilÚ_cleanup_testsr   rU   rY   )Úthread_infor   r   r   ÚsetUpModuleù  s    r  Ú__main__)N)N)_r=  r   Úimport_moduleZ*skip_if_broken_multiprocessing_synchronizeZtest.supportr   Ztest.support.script_helperr   r¯   r9  r;   Zlogging.handlersr   rl  r©   r/   rß   r)   rÕ   r?  r½  r   Ú
concurrentr	   Úconcurrent.futures._baser
   r   r   r   r   r   r   Zconcurrent.futures.processr   Zmultiprocessing.processr  Zmultiprocessing.utilrr   Zcheck_sanitizerrÖ   r   rE  rF  r  r  rú  r#  r  r5   r%   r(   r-   r3   r6   r7   rC   ÚobjectrD   rK   rS   ZTestCaserT   r[   rt   rv   r~   r€   rŒ   r   r›   r±   rØ   rü   r
  r*  r1  rI  re  r|  r¨  r«  r­  r±  r²  r³  r·  r¹  r»  r¼  r¾  rÀ  rß  r  rH   Úmainr   r   r   r   Ú<module>   sà   
$






	!

ýÿ
8m^OþÿmþÿRV4uþÿ
	 þÿ  
