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¨   ˆ j dksJ dƒ‚‡ fdd„tdƒD ƒ}ˆ jjdd dd„ |D ƒ}ˆ  t|ƒd	¡ d
d„ |D ƒ}|D ],}ˆ j| ¡ d|j›d ˆ  	| 
¡ ¡ qfˆ  t|ƒd¡ d S )Nr\   ztest needs few workersc                    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   )rf   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 )z…shutdown(wait=False) doesn't hang at exit with running futures.

        See https://github.com/python/cpython/issues/83386.
        z9Hangs, 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]   Nr·   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*tdd„ t|tddƒƒD ƒƒsZJ ‚d S )Nr\   rç   r‚   c                 S   s   g | ]\}}|t |ƒk‘qS r   ©rí   ©r–   ÚrÚvr   r   r   r—   ¥  r¥   z<ThreadPoolShutdownTest.test_del_shutdown.<locals>.<listcomp>)	r	   ru   rì   rí   r˜   rá   rã   ÚallÚzip©rF   ri   ÚresÚthreadsr,   r   r   r   Útest_del_shutdownš  s    
z(ThreadPoolShutdownTest.test_del_shutdownc                 C   sh   t jdd}| ttddƒ¡}|j}|jdd |D ]}| ¡  q4tdd„ t	|tddƒƒD ƒƒsdJ ‚d S )Nr\   rç   r‚   Frl   c                 S   s   g | ]\}}|t |ƒk‘qS r   rð   rñ   r   r   r   r—   ³  r¥   z@ThreadPoolShutdownTest.test_shutdown_no_wait.<locals>.<listcomp>)
r	   ru   rì   rí   r˜   rá   rp   rã   rô   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   s’   t jd|  ¡ d}| ttddƒ¡}|j}|j}|j}|j}~t	 
¡  | ¡  | ¡ D ]}| ¡  qV| ¡  tdd„ t|tddƒƒD ƒƒsŽJ ‚d S )Nr\   r^   r‚   c                 S   s   g | ]\}}|t |ƒk‘qS r   rð   rñ   r   r   r   r—     r¥   z=ProcessPoolShutdownTest.test_del_shutdown.<locals>.<listcomp>)r	   r}   rg   rì   rí   r˜   Ú_executor_manager_threadr  Ú_call_queuer   rü   rã   r  Újoin_threadrô   rõ   )rF   ri   r÷   Úexecutor_manager_threadr  Ú
call_queuer	  r   r   r   rù     s    ÿ
z)ProcessPoolShutdownTest.test_del_shutdownc                 C   sŽ   t jd|  ¡ d}| ttddƒ¡}|j}|j}|j}|j	dd | 
¡  | ¡ D ]}| 
¡  qR| ¡  tdd„ t|tddƒƒD ƒƒsŠJ ‚d S )Nr\   r^   r‚   Frl   c                 S   s   g | ]\}}|t |ƒk‘qS r   rð   rñ   r   r   r   r—   ,  r¥   zAProcessPoolShutdownTest.test_shutdown_no_wait.<locals>.<listcomp>)r	   r}   rg   rì   rí   r˜   r  r  r  rp   rã   r  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å   )r1  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   r1  rF   r   Útest_pending_calls_race¤  s    
z+ThreadPoolWaitTests.test_pending_calls_raceN)rH   rI   rJ   r6  r   r   r   r   r0  ¢  s   r0  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	   r8  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	   r8  Ú	itertoolsÚrepeatr™   rÑ   )rF   r  r9  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   r;  Útest)r˜   r¦   r   r   r   rž   r	   r=  r8  Ú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   r;  z2 (of 4) futures unfinished)r  ÚPENDING_FUTUREÚRUNNING_FUTUREr  rž   r	   r=  rë   r8  r™   Ústrr   )rF   rH  r®   r   r   r   Ú"test_correct_timeout_exception_msg  s    ÿ0z3AsCompletedTests.test_correct_timeout_exception_msgN)rH   rI   rJ   r:  r>  rA  rJ  rN  r   r   r   r   r7  º  s
   
r7  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Ž   rB  é   )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Ž   rB  )r$   é   rê   rÞ   )rF   Úfn)rê   )rT  Úarg)rU  )ri   r”   r%   r™   r   r(   rž   Ú	TypeErrorrQ  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\   r;  zexpected TimeoutError)	ri   rì   r)   r*   r¦   r	   r=  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ì   rM  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>r;  z-Stale reference not collected within timeout.)rD   rß   rL   rE  rF  ri   r”   rG   rm   r   ÚSHORT_TIMEOUTr¬   )rF   Z	my_objectZmy_object_callbackZ	collectedr   rc  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 )NrX  )	ri   rì   rS   r˜   rE  rF  r   rü   rÓ   )rF   rb  rI  r   r   r   Útest_free_reference[  s
    
z ExecutorTest.test_free_referenceN)rH   rI   rJ   rR  rW  r[  r^  r`  ra  r   Zcpython_onlyrf  ri  rj  r   r   r   r   rO    s   
	
rO  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 )zTests verifying issue 11777.c                    s   ˆ   | ¡ d S r   )r¦   )Ún©r!  r   r   Úrecord_finishedi  s    zRThreadPoolExecutorTest.test_map_submits_without_iteration.<locals>.record_finishedrX  Trl   N)ri   rì   r˜   rp   ZassertCountEqual)rF   rn  r   rm  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˜   rt  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”   )Úpoolr|  r   r   r”   Ž  s    zEThreadPoolExecutorTest.test_hang_global_shutdown_lock.<locals>.submitrê   rÈ   rw   )r`   )r	   ru   r”   r˜   r}   rr   rg   Útuple)rF   r}  rR   Úworkersr   r|  r   Útest_hang_global_shutdown_lockŠ  s    z5ThreadPoolExecutorTest.test_hang_global_shutdown_lockN)rH   rI   rJ   ro  ru  rw  rz  rÕ   Ú
skipUnlessrd   rr  r€  r   r   r   r   rk  e  s   
rk  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ç   )rh  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Ž   rB  )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é(   rg  rY  )rë   ri   rì   r³   r˜   r   rE   r   r   Úbad_map®  s    z;ProcessPoolExecutorTest.test_map_chunksize.<locals>.bad_mapr‰  r,  rY  rÈ   )rë   rì   r³   r˜   r™   ri   rž   r@   )rF   rŠ  rF  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ê   r;  )rg   ÚManagerrK   ri   r”   Úidr   r¬   rM   rm   r   rü   rp   rã   )rF   rN   rb  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   rv  )ri   rg   rà   rt  r˜   r”   rÚ   r™   rÑ   r  râ   )rF   ri   r`   rä   Z	job_countrR   r   r   r   rw  ê  s    

z'ProcessPoolExecutorTest.test_saturationc                 C   s~   | j }|jdksJ ‚|  ¡ jdddkr2t d¡‚| tdd¡ ¡  | tdd	¡ ¡  | td
d¡ ¡  |  	t
|jƒd¡ d S )Nré   Fr  rw   ú(Incompatible with the fork start method.r  rŽ   r,  r-  rÞ   rx  rê   )ri   rt  rg   r  rÕ   rÖ   r”   r%   r   r™   rÑ   r  ry  r   r   r   Útest_idle_process_reuse_oneõ  s    
z3ProcessPoolExecutorTest.test_idle_process_reuse_onec                 C   s°   | j }|jdksJ ‚|  ¡ jdddkr2t d¡‚| tdd¡ ¡  | tdd	¡ | td	d
¡ ¡  | tdd¡ | tdd¡ ¡  | tdd¡ |  	t
|jƒd¡ | ¡  d S )Nr\   Fr  rw   rŸ  é   r-  é!   é   é   é   é   rê   rŽ   r   é	   rÞ   )ri   rt  rg   r  rÕ   rÖ   r”   r%   r   ZassertLessEqualrÑ   r  rp   ry  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ž  rw  r   r¨  r   r   r   r   r‚  ™  s   



r‚  c                 C   s*   | rt  | ¡ ddl}| ¡  | ¡  dS )zInduces a segfault.r   N)r)   r*   ÚfaulthandlerÚdisableZ_sigsegv)Údelayrª  r   r   r   Ú_crash  s
    
r­  c                   C   s   t  d¡ dS )z#Induces a sys exit with exitcode 1.rê   N)r/   Úexitr   r   r   r   Ú_exit  s    r¯  c                 C   s
   | ƒ ‚dS )z-Function that raises an Exception in process.Nr   )ÚErrr   r   r   Ú_raise_error!  s    r±  c                 C   s   ddl }| ¡ t_| ƒ ‚dS )z@Function that raises an Exception in process and ignores stderr.r   N)ÚioÚStringIOr/   Ústderr)r°  r²  r   r   r   Ú_raise_error_ignore_stderr&  s    
rµ  c                 C   s   | ƒ S )z(Function that returns a instance of cls.r   r  r   r   r   Ú_return_instance-  s    r¶  c                   @   s   e Zd ZdZdd„ ZdS )ÚCrashAtPicklez5Bad object that triggers a segfault at pickling time.c                 C   s
   t ƒ  d S r   ©r­  rE   r   r   r   Ú
__reduce__4  s    zCrashAtPickle.__reduce__N©rH   rI   rJ   Ú__doc__r¹  r   r   r   r   r·  2  s   r·  c                   @   s   e Zd ZdZdd„ ZdS )ÚCrashAtUnpicklez7Bad object that triggers a segfault at unpickling time.c                 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Zdd„ ZdS )ÚExitAtPicklez9Bad object that triggers a process exit at pickling time.c                 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Zdd„ ZdS )ÚExitAtUnpicklez;Bad object that triggers a process exit at unpickling time.c                 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Zdd„ ZdS )ÚErrorAtPicklez3Bad object that triggers an error at pickling time.c                 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Zdd„ ZdS )ÚErrorAtUnpicklez5Bad object that triggers an error at unpickling time.c                 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^   r;  )ri   rp   re   rg   r”   r   r“  r¯   Únullcontextrž   r   ÚTIMEOUTr	   r=  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   re  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   rT  í  s    z6FutureTests.test_done_callback_with_result.<locals>.fnr\   )r   Úadd_done_callbackrG  r™   ©rF   rT  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   rT  ø  s    z9FutureTests.test_done_callback_with_exception.<locals>.fnrC  ©rC  )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   rT    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   rT    s    z1FutureTests.test_done_callback_raises.<locals>.fnr\   zException: doh!)r   r“  r   rè  rG  r¬   rÃ   r–  )rF   r´  rö  rT  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   rT  $  s    z=FutureTests.test_done_callback_already_successful.<locals>.fnr\   )r   rG  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   rT  /  s    z9FutureTests.test_done_callback_already_failed.<locals>.fnrC  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   rT  :  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   rG  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ý   ÚreprrK  rL  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¼   rK  rÍ   rL  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¼   rK  rÒ   rL  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¼   rK  Úrunningr¬   rL  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   r;  r    )rž   r	   r=  rK  r   rL  Ú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*   rG  r   ©r™  r   r   Únotification¤  s    
z:FutureTests.test_result_with_success.<locals>.notificationr   ©Útargetr\   r;  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 ©Nrê   )r)   r*   rñ  r   r  r   r   r	  ²  s    
z9FutureTests.test_result_with_cancel.<locals>.notificationr   r
  r;  )r   r
   rß   r  r  rž   r	   r  r   r   re  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   r;  )rž   r	   r=  rK  r   rL  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
  r;  )r   r
   rß   r  r  r¬   r  r   r   re  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
   rG  rh  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î  rh  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)_rC  r   Úimport_moduleZ*skip_if_broken_multiprocessing_synchronizeZtest.supportr   Ztest.support.script_helperr   r¯   r?  r;   Zlogging.handlersr   rr  r©   r/   rß   r)   rÕ   rE  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   rK  rL  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  r0  r7  rO  rk  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þÿ
	 þÿ  
