o
    GXh                     @   s2  d dl mZ d dlmZ d dlmZ ed 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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#m$Z$ d dl%Z&d dl'Z&d dl&Z(ej)dddre*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e0 dZ1e+eddZ2da3dd Z4dd Z5dd Z6dd Z7dd  Z8d!d" Z9dmd#d$Z:G d%d& d&e;Z<G d'd( d(Z=d)d* Z>G d+d, d,ej?Z@G d-d. d.ZAG d/d0 d0eAZBG d1d2 d2eAZCG d3d4 d4eAZDG d5d6 d6eAZEe@feBeCeEeDffd7d8ZFG d9d: d:eAZGG d;d< d<eAZHeFeG eFeH G d=d> d>ZIG d?d@ d@eBeIe@ZJG dAdB dBeIZKeFeKeCeEeDfdC G dDdE dEZLG dFdG dGeBeLe@ZMeFeLeCeEeDfdC G dHdI dIZNeFeN G dJdK dKZOG dLdM dMeBeOe@ZPG dNdO dOeOZQeFeQeCeEeDfdC dmdPdQZRdRdS ZSdTdU ZTdVdW ZUdXdY ZVG dZd[ d[e;ZWG d\d] d]e;ZXG d^d_ d_e;ZYG d`da dae;ZZG dbdc dce;Z[G ddde dee;Z\G dfdg dgZ]eFe]eCeEeDfdC G dhdi die@Z^djdk Z_e`dlkrea  dS dS )n    )support)import_helper)threading_helper_multiprocessing)hashlib_helper)assert_python_okN)QueueHandlerPicklingError)futures)PENDINGRUNNING	CANCELLEDCANCELLED_AND_NOTIFIEDFINISHEDFutureBrokenExecutor)BrokenProcessPool_check_system_limitsT)addressZmemoryz test too slow on ASAN/MSAN buildc                 C   s   t  }| |_||_||_|S N)r   _state
_exception_result)state	exceptionresultf r   F/opt/python-3.10.19/usr/lib/python3.10/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<      r(   c                  O   s   | |fS r   r   )argskwargsr   r   r   capture?   r)   r,   c                 C   s   t |  td)Nzthis is an exception)timesleep	Exception)tr   r   r   sleep_and_raiseB   s   
r1   c                 C   s    t |  t| tj  d S r   )r-   r.   printsysstdoutflush)r0   msgr   r   r   sleep_and_printF   s   
r7   c                 C   s   | a d S r   INITIALIZER_STATUS)r&   r   r   r   initK      r:   c                   C   s   t S r   r8   r   r   r   r   get_init_statusO      r<   c                 C   sB   | d urt d}|t|  |d d|_td td)Nconcurrent.futuresCRITICALF皙?zerror in initializer)	logging	getLogger
addHandlerr   setLevel	propagater-   r.   
ValueError)	log_queueloggerr   r   r   	init_failR   s   


rI   c                   @      e Zd Zdd ZdS )MyObjectc                 C   s   d S r   r   selfr   r   r   	my_method]   r=   zMyObject.my_methodN)__name__
__module____qualname__rN   r   r   r   r   rK   \   s    rK   c                   @      e Zd Zdd Zdd ZdS )EventfulGCObjc                 C   s   |  | _d S r   )Eventevent)rM   mgrr   r   r   __init__b      zEventfulGCObj.__init__c                 C   s   | j   d S r   )rU   setrL   r   r   r   __del__e   rX   zEventfulGCObj.__del__N)rO   rP   rQ   rW   rZ   r   r   r   r   rS   a       rS   c                 C   s   t  S r   )rK   )_r   r   r   make_dummy_objecti   s   r]   c                   @   rR   )BaseTestCasec                 C   s   t  | _d S r   )r   threading_setup_thread_keyrL   r   r   r   setUpn   rX   zBaseTestCase.setUpc                 C   s   t   tj| j  d S r   )r   reap_childrenr   threading_cleanupr`   rL   r   r   r   tearDownq   s   zBaseTestCase.tearDownN)rO   rP   rQ   ra   rd   r   r   r   r   r^   m   r[   r^   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d| j|  d| j	| _
d S | jdd| ji| j	| _
d S )Nctxmax_workers
mp_contextri   r   )superra   r-   	monotonict1hasattrexecutor_typeworker_countget_contextexecutor_kwargsexecutorrL   	__class__r   r   ra   z   s   


zExecutorMixin.setUpc                    sT   | j jdd d | _ t | j }tjrtd| dd | |dd t	 
  d S )NTwaitz%.2fs )endi,  z+synchronization issue: test lasted too long)rs   shutdownr-   rl   rm   r   verboser2   Z
assertLessrk   rd   )rM   Zdtrt   r   r   rd      s   zExecutorMixin.tearDownc                 C   s   t | jS r   )mprq   rg   rL   r   r   r   rq         zExecutorMixin.get_context)	rO   rP   rQ   rp   rr   ra   rd   rq   __classcell__r   r   rt   r   re   v   s    re   c                   @   s   e Zd ZejZdS )ThreadPoolMixinN)rO   rP   rQ   r   ThreadPoolExecutorro   r   r   r   r   r      s    
r   c                       &   e Zd ZejZdZ fddZ  ZS )ProcessPoolForkMixinforkc                    F   zt   W n ty   | d Y nw tjdkr| d t  S N.ProcessPoolExecutor unavailable on this systemwin32zrequire unix systemr   NotImplementedErrorskipTestr3   platformrk   rq   rL   rt   r   r   rq         



z ProcessPoolForkMixin.get_context	rO   rP   rQ   r   ProcessPoolExecutorro   rg   rq   r~   r   r   rt   r   r          r   c                       r   )ProcessPoolSpawnMixinspawnc                    s2   zt   W n ty   | d Y nw t  S )Nr   )r   r   r   rk   rq   rL   rt   r   r   rq      s   

z!ProcessPoolSpawnMixin.get_contextr   r   r   rt   r   r      r   r   c                       r   )ProcessPoolForkserverMixin
forkserverc                    r   r   r   rL   rt   r   r   rq      r   z&ProcessPoolForkserverMixin.get_contextr   r   r   rt   r   r      r   r   c                 C   sP   dd }|D ]}d||j || j f }t|| f|f | i }|t |< qd S )Nc                 S   s0   |  dr| d d S |  dr| d d S | S )N)ZMixinZTestsZTest)endswith)namer   r   r   strip_mixin   s
   

z*create_executor_tests.<locals>.strip_mixinz%s%sTest)rO   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)r9   dictr:   rr   rk   ra   rL   rt   r   r   ra      s
   zInitializerMixin.setUpc                    s6    fddt  jD }|D ]
} | d qd S )Nc                    s   g | ]} j tqS r   )rs   submitr<   .0r\   rL   r   r   
<listcomp>   s    z5InitializerMixin.test_initializer.<locals>.<listcomp>r   )rangerp   assertEqualr   )rM   r   r   r   rL   r   test_initializer   s   
z!InitializerMixin.test_initializer)rO   rP   rQ   rp   ra   r   r~   r   r   rt   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r|  | _| j | _tt| jfd| _nd | _d | _ttd| _t 	  d S )Nrg   r   )r   )
rn   rq   rj   QueuerG   r   rI   rr   rk   ra   rL   rt   r   r   ra      s   


zFailingInitializerMixin.setUpc              	   C   s  |  du z| jt}W n	 ty   Y nw | t |  W d    n1 s,w   Y  t }| jj	sOt | dkrF| 
d td | jj	r9| t | jt W d    n1 sew   Y  W d    d S W d    d S 1 s}w   Y  d S )Nz ValueError: error in initializerrf   zexecutor not broken after 5 s.g{Gz?)_assert_loggedrs   r   r<   r   assertRaisesr   r-   rl   _brokenfailr.   )rM   futurerm   r   r   r   r      s*   


"z(FailingInitializerMixin.test_initializerc                 #   s    | j d ur"d V  g }z	 || j    q tjy!   Y nw | dd}d V  W d    n1 s6w   Y  |j}| t	 fdd|D | d S )NTr>   r?   c                 3   s    | ]} |v V  qd S r   r   )r   liner6   r   r   	<genexpr>  s    z9FailingInitializerMixin._assert_logged.<locals>.<genexpr>)
rG   append
get_nowait
getMessagequeueEmptyZ
assertLogsoutput
assertTrueany)rM   r6   r   cmr   r   r   r     s$   
z&FailingInitializerMixin._assert_logged)
rO   rP   rQ   rp   ra   r   
contextlibcontextmanagerr   r~   r   r   rt   r   r      s    r   c                   @   D   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 )ExecutorShutdownTestc                 C   s$   | j   | t| j jtdd d S )Nr   rf   )rs   rz   r   RuntimeErrorr   powrL   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")
            rg    ro   context   apple)r   formatro   rO   getattrassertFalser   striprM   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()
            rg   r   r   z)RuntimeError: cannot schedule new futuress   runtime-error)	r   r   ro   rO   r   assertIndecoder   r   r   r   r   r   &test_submit_after_interpreter_shutdownB  s   
z;ExecutorShutdownTest.test_submit_after_interpreter_shutdownc                    s6    fddt dD } j  |D ]}|  qd S )Nc                       g | ]
} j tjd qS r@   rs   r   r-   r.   r   rL   r   r   r   _      z=ExecutorShutdownTest.test_hang_issue12364.<locals>.<listcomp>2   )r   rs   rz   r   )rM   fsr   r   rL   r   test_hang_issue12364^  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
  |	  q* t|d d S )Nc                    r   r   r   r   rL   r   r   r   f  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   k         c                 S   s   g | ]}|  s|qS r   r   r   r   r   r   r   q  r   zfut._state=r   r   )
r   rs   rz   ZassertGreaterlenr   doner   assertIsNoner   )rM   r   r   Zothersr   r   rL   r   test_cancel_futuresd  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 )zshutdown(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)
            rg   Nr   r   )ro   r   r   unittestSkipTestr   r   rO   r   r   r   r   r   r   r   r   test_hang_gh83386{  s   


z&ExecutorShutdownTest.test_hang_gh83386c              
   C   s   t tds
tddd }i }t| ddr|  |d< | jddd	i|}|t	  ttj
|}z!td
 |t  |jdd W td ttj
| dS td ttj
| w )zshutdown(wait=True) doesn't hang when a future was submitted and
        quickly canceled right before shutdown.

        See https://github.com/python/cpython/issues/94440.
        alarmz1Tested platform does not support the alarm signalc                 S      t d)Nztimed out waiting for shutdownr   )Z_signumZ_framer   r   r   timeout  r)   z7ExecutorShutdownTest.test_hang_gh94440.<locals>.timeoutrg   Nrj   ri      rf   Trv   r   r   )rn   signalr   r   r   rq   ro   r   intr   SIGALRMr   cancelrz   )rM   r   r+   rs   Zold_handlerr   r   r   test_hang_gh94440  s&   



z&ExecutorShutdownTest.test_hang_gh94440N)
rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   r   r   %  s    r   c                   @   r   )ThreadPoolShutdownTestc                 C   s|   dd }t d}tdD ]	}| j|| q| t| jjd tdD ]}|  q%| j	  | jjD ]}|
  q5d S )Nc                 S      |    d S r   acquirelockr   r   r   acquire_lock  r}   zCThreadPoolShutdownTest.test_threads_terminate.<locals>.acquire_lockr      )	threading	Semaphorer   rs   r   r   r   _threadsreleaserz   join)rM   r   semir0   r   r   r   test_threads_terminate  s   



z-ThreadPoolShutdownTest.test_threads_terminatec              
   C   sj   t jdd}|}| t|ttddg d W d    n1 s$w   Y  |jD ]}|  q,d S )Nrf   ri   r   
rf      r   r   r   r   r   r   r   r	  )	r   r   r   listmapabsr   r  r  )rM   ers   r0   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 )Nrf   r  r   )r   r   r  r  r   r  r  rM   rs   resthreadsr0   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 ]}|  qd S )Nrf   r  r   Frv   )r   r   r  r  r   r  rz   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 |
  qd S )Nrf   ZSpecialPool)ri   Zthread_name_prefixr   z^SpecialPool_[0-4]$r   r   r  r  r   r  r   
gc_collectassertRegexr   r  rM   rs   r  r0   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 |
  qd S )Nrf   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\}}}| | | | 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)
            r   )r   r   r   r   r   r   r   r   test_cancel_futures_wait_false  s   

z5ThreadPoolShutdownTest.test_cancel_futures_wait_falseN)
rO   rP   rQ   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 ]}|
  q7| jj	}| j  | D ]}|  qKd S )Nc                 S   r   r   r   r   r   r   r   r     r}   zFProcessPoolShutdownTest.test_processes_terminate.<locals>.acquire_lockF
allow_noner   r   r   )rq   get_start_methodrp   r   r   rs   r   r   r   
_processesr  rz   valuesr  )rM   r   rj   Zexpected_num_processesr  r\   	processespr   r   r   test_processes_terminate  s    



z0ProcessPoolShutdownTest.test_processes_terminatec              
   C   st   t jd|  d}|j}| t|ttddg d W d    n1 s(w   Y  |	 D ]}|
  q1d S )Nrf   rh   r   r  )r   r   rq   r  r   r
  r  r  r   r   r  )rM   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 ]}|  q+|  d S )Nrf   rh   r   )r   r   rq   r  r  r   _executor_manager_threadr  _call_queuer   r  r  r   join_thread)rM   rs   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 ]}|
  q)|  d S )Nrf   rh   r   Frv   )r   r   rq   r  r  r   r  r%  r$  rz   r  r   r&  )rM   rs   r  r!  r(  r'  r"  r   r   r   r  C  s   
z-ProcessPoolShutdownTest.test_shutdown_no_waitN)rO   rP   rQ   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)	rs   r   r-   r.   r   rw   ALL_COMPLETEDr   rY   )rM   r   r   not_doner   r   r   
test_20369a  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,  )rs   r   r(   r-   r.   r   rw   CANCELLED_FUTUREFIRST_COMPLETEDr   rY   )rM   future1future2r   r/  r   r   r   test_first_completedj  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*  )rs   r   r-   r.   r   rw   CANCELLED_AND_NOTIFIED_FUTURESUCCESSFUL_FUTUREr3  r   rY   rM   r4  finishedpendingr   r   r   +test_first_completed_some_already_completedu  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   r1  r+  r   r,  )rs   r   r(   r1   r-   r.   r   rw   FIRST_EXCEPTIONr   rY   )rM   r4  r5  Zfuture3r:  r;  r   r   r   test_first_exception  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 )Nr1  r   r+  r,  )rs   r   divmodr-   r.   r   rw   r8  r2  r7  r=  r   rY   rM   r4  r5  r:  r;  r   r   r   *test_first_exception_some_already_complete  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,  )
rs   r   r-   r.   r   rw   EXCEPTION_FUTUREr=  r   rY   r9  r   r   r   'test_first_exception_one_already_failed  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   r1  r,  )rs   r   r?  r(   r   rw   r8  r7  rB  r.  r   rY   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      rf   )r   r-  )rs   r   r(   r-   r.   r   rw   r7  rB  r8  r.  r   rY   r@  r   r   r   test_timeout  s&   
zWaitTests.test_timeoutN)rO   rP   rQ   r0  r6  r<  r>  rA  rC  rD  rG  r   r   r   r   r)  `  s    	
r)  c                   @   rJ   )ThreadPoolWaitTestsc              	      st   t    fddt }td z fddtdD }   tj|tj	d W t| d S t| w )Nc                      s       d S r   rv   r   )rU   r   r   future_func  r}   z@ThreadPoolWaitTests.test_pending_calls_race.<locals>.future_funcgư>c                    s   h | ]}j  qS r   )rs   r   )r   r  )rI  rM   r   r   	<setcomp>  r   z>ThreadPoolWaitTests.test_pending_calls_race.<locals>.<setcomp>d   r,  )
r   rT   r3   getswitchintervalsetswitchintervalr   rY   r   rw   r.  )rM   Zoldswitchintervalr   r   )rU   rI  rM   r   test_pending_calls_race  s   
z+ThreadPoolWaitTests.test_pending_calls_raceN)rO   rP   rQ   rN  r   r   r   r   rH    s    rH  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   r1  rF  rE  )
rs   r   r(   rY   r   as_completedr7  rB  r8  r   )rM   r4  r5  	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y*   Y nw | tttt	g| d S )Nr   r   r   )rs   r   r-   r.   rY   r   rP  r7  rB  r8  addTimeoutErrorr   )rM   r4  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   )
rs   r   r-   r.   r   rP  	itertoolsrepeatr   r   )rM   r4  rQ  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' tj|ddD ]}|	| t
|}~t  | |  q(W d    n1 sJw   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     s    zGAsCompletedTests.test_free_reference_yielded_future.<locals>.<listcomp>   r!   r#   r$   r   rS  test)r   r   r    r   r   r   r   rU  rP  removeweakrefrefr   r  r   
set_result)rM   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 w   Y  | 	t
|jd d S )Nr   rS  z2 (of 4) futures unfinished)r7  PENDING_FUTURERUNNING_FUTUREr8  r   r   rU  r
  rP  r   strr   )rM   r`  r   r   r   r   "test_correct_timeout_exception_msg-  s   z3AsCompletedTests.test_correct_timeout_exception_msgN)rO   rP   rQ   rR  rV  rY  rb  rf  r   r   r   r   rO    s    
rO  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   rZ     )rs   r   r   r   r   rM   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@w   Y  | t | j jdd
 W d    d S 1 s]w   Y  d S )Nr   rZ  )r'      r   r   )rM   fn)r   )rl  arg)rm  )rs   r   r(   r   r   r,   r   	TypeErrorri  r   r   r   test_submit_keywordA  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
  rs   r  r   r   rL   r   r   r   test_mapK  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   rf   )r   r   )rs   r  r?  r   __next__r   ZeroDivisionError)rM   r  r   r   r   test_map_exceptionT  s   zExecutorTest.test_map_exceptionc                 C   sd   g }z| j jtjg dddD ]}|| qW n
 tjy"   Y nw | d | d d g| d S )N)r   r   rE  rf   rS  zexpected TimeoutError)	rs   r  r-   r.   r   r   rU  r   r   )rM   resultsr  r   r   r   test_map_timeoutZ  s   


zExecutorTest.test_map_timeoutc                 C   s(   | j tdg| jd   | j   d S )Nr   r   )rs   r  re  rp   rz   rL   r   r   r   test_shutdown_race_issue12456h  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   )rY   )objZmy_object_collectedr   r   <lambda>v  s    z7ExecutorTest.test_no_stale_references.<locals>.<lambda>rS  z-Stale reference not collected within timeout.)rK   r   rT   r]  r^  rs   r   rN   rw   r   SHORT_TIMEOUTr   )rM   Z	my_objectZmy_object_callbackZ	collectedr   r{  r   test_no_stale_referenceso  s   z%ExecutorTest.test_no_stale_referencesc              	   C   sF   dD ]}|  td | j|d W d    n1 sw   Y  qd S )N)r   z"max_workers must be greater than 0r  )assertRaisesRegexrF   ro   )rM   numberr   r   r   test_max_workers_negative  s   z&ExecutorTest.test_max_workers_negativec                 C   s<   | j ttdD ]}t|}~t  | |  q	d S )Nrp  )	rs   r  r]   r   r]  r^  r   r  r   )rM   rz  ra  r   r   r   test_free_reference  s   
z ExecutorTest.test_free_referenceN)rO   rP   rQ   rj  ro  rs  rv  rx  ry  r   Zcpython_onlyr~  r  r  r   r   r   r   rg  :  s    
	
rg  c                   @   sN   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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_finished  rX   zRThreadPoolExecutorTest.test_map_submits_without_iteration.<locals>.record_finishedrp  Trv   N)rs   r  r   rz   ZassertCountEqual)rM   r  r   r  r   "test_map_submits_without_iteration  s
   z9ThreadPoolExecutorTest.test_map_submits_without_iterationc                 C   s0   |   }tdt pdd }| |j| d S )N    r   r	  )ro   minos	cpu_countr   _max_workers)rM   rs   Zexpectedr   r   r   test_default_workers  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   r   r   r   r   r   r   r   r     r}   z<ThreadPoolExecutorTest.test_saturation.<locals>.acquire_lockr      Trv   )ro   r   r   r   r  r   r   r   r  r  rz   )rM   rs   r   r  r  r   r   r   test_saturation  s   


z&ThreadPoolExecutorTest.test_saturationc                 C   s`   |   }|tdd  |tdd  |tdd  | t|jd |jdd	 d S )
Nr1  r   rE  rF  r      r   Trv   )ro   r   r(   r   r   r   r  rz   rM   rs   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5}| | tdD ]!}t jdtdd}|t W d    n1 s2w   Y  qW d    d S 1 sCw   Y  d S )Nc                    s   |   |  d S r   r   )poolr  r   r   r     s   zEThreadPoolExecutorTest.test_hang_global_shutdown_lock.<locals>.submitr   r   r   )rj   )r   r   r   r   r   r|   rq   tuple)rM   r  r\   workersr   r  r   test_hang_global_shutdown_lock  s   "z5ThreadPoolExecutorTest.test_hang_global_shutdown_lockc              
      s   t  g   fdd}| jddV}|j|dd}z=t|j|ddgd	d
"}| tj	 t
| W d    n1 s?w   Y  W d    n1 sNw   Y  W   n  w |  W d    n1 slw   Y  |  ddg d S )Nc                    sH     d| d z  W   d| d d S   d| d w )Nzident=z startedz stopped)r   rw   identlogZ
stop_eventr   r   
log_n_wait  s   
*zRThreadPoolExecutorTest.test_executor_map_current_future_cancel.<locals>.log_n_waitr   r  firstr  secondthirdr   rS  zident='first' startedzident='first' stopped)r   rT   ro   r   r   closingr  r   r   rU  nextrY   r   ZassertListEqual)rM   r  r  r   genr   r  r   'test_executor_map_current_future_cancel  s(   

z>ThreadPoolExecutorTest.test_executor_map_current_future_cancelN)rO   rP   rQ   r  r  r  r  r   
skipUnlessrn   r  r  r  r   r   r   r   r    s    

r  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 )ProcessPoolExecutorTestr   zWindows-only process limitc                 C   s>   |  td tjdd W d    d S 1 sw   Y  d S )Nzmax_workers must be <= 61>   r  )r  rF   r   r   rL   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 q| 	t
| j jtdd d S )Nr   r   rZ  )rs   r   r-   r.   r  iterr  r   	terminater   r   r   r   )rM   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(   r  rq  )r
  rs   r  r   r   r   rL   r   r   bad_map  s   $z;ProcessPoolExecutorTest.test_map_chunksize.<locals>.bad_mapr  rE  rq  r   )r
  r  r   r   r   rs   r   rF   )rM   r  r^  r   rL   r   test_map_chunksize  s   z*ProcessPoolExecutorTest.test_map_chunksizec                 C   r   )N{   r   r   r   r   r   _test_traceback  r;   z'ProcessPoolExecutorTest._test_tracebackc              	   C   s   | j | j}| t}|  W d    n1 sw   Y  |j}| t|t	 | 
|jd |j}| t|tjj | d|j t }z| t	y]   tjt   Y nw W d    n1 shw   Y  | d|  d S )N)r  z&raise RuntimeError(123) # some comment)rs   r   r  r   r/   r   r   ZassertIsr   r   r   r*   	__cause__r   process_RemoteTracebackr   tbr   captured_stderrr3   
excepthookexc_infogetvalue)rM   r   r   exccausef1r   r   r   test_traceback  s*   

z&ProcessPoolExecutorTest.test_tracebackmd5c                 C   s^   |    }t|}| jt|}|  | |jj	dd d }t
  |  |  d S )Nr   rS  )rq   ManagerrS   rs   r   idr   r   rU   rw   r   r  rz   r  )rM   rV   rz  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 ]}|
  q,d S )Nr   r  )rs   rq   r   r  r   r   r   r   r   r  r  )rM   rs   rj   r  Z	job_countr\   r   r   r   r  0  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  r   (Incompatible with the fork start method.r1  r   rE  rF  r   r  r   )rs   rq   r  r   r   r   r(   r   r   r   r  r  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  r   r     rF  !               r   r   r   	   r   )rs   rq   r  r   r   r   r(   r   ZassertLessEqualr   r  rz   r  r   r   r    test_idle_process_reuse_multipleE  s   
z8ProcessPoolExecutorTest.test_idle_process_reuse_multipleN)rO   rP   rQ   r   r  r3   r   r  r  r  classmethodr  r  r   Zrequires_hashdigestr  r  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   _crashY  s
   
r  c                   C   s   t d dS )z#Induces a sys exit with exitcode 1.r   N)r3   exitr   r   r   r   _exitb  s   r  c                 C   s   |  )z-Function that raises an Exception in process.r   )Errr   r   r   _raise_errorg     r  c                 C   s   ddl }| t_|  )z@Function that raises an Exception in process and ignores stderr.r   N)ioStringIOr3   stderr)r  r  r   r   r   _raise_error_ignore_stderrl  s   
r  c                 C   s   |  S )z(Function that returns a instance of cls.r   r  r   r   r   _return_instances  r  r  c                   @      e Zd ZdZdd ZdS )CrashAtPicklez5Bad object that triggers a segfault at pickling time.c                 C   
   t   d S r   r  rL   r   r   r   
__reduce__z     
zCrashAtPickle.__reduce__NrO   rP   rQ   __doc__r  r   r   r   r   r  x      r  c                   @   r  )CrashAtUnpicklez7Bad object that triggers a segfault at unpickling time.c                 C      t dfS Nr   r  rL   r   r   r   r    r)   zCrashAtUnpickle.__reduce__Nr  r   r   r   r   r  ~  r  r  c                   @   r  )ExitAtPicklez9Bad object that triggers a process exit at pickling time.c                 C   r  r   r  rL   r   r   r   r    r  zExitAtPickle.__reduce__Nr  r   r   r   r   r    r  r  c                   @   r  )ExitAtUnpicklez;Bad object that triggers a process exit at unpickling time.c                 C   r  r  r  rL   r   r   r   r    r)   zExitAtUnpickle.__reduce__Nr  r   r   r   r   r    r  r  c                   @   r  )ErrorAtPicklez3Bad object that triggers an error at pickling time.c                 C   s   ddl m} |d)Nr   r	   zError in pickle)pickler
   )rM   r
   r   r   r   r    s   zErrorAtPickle.__reduce__Nr  r   r   r   r   r    r  r  c                   @   r  )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  )rM   r  r   r   r   r    s   
zErrorAtUnpickle.__reduce__Nr  r   r   r   r   r    r  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 s)w   Y  |j D ]}|  q3|j	dd t
d| tjd | d	|  d S )
Nr   )TemporaryFilezw+)mode)fileTrv   z
Traceback:
 zExecutor deadlock:

)r  tempfiler  Zdump_tracebackseekreadr  r   r  rz   r2   r3   
__stderr__r   )rM   rs   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 }z0| 	|! | |j
| jd W d    n1 s?w   Y  W d    n1 sNw   Y  W n tjyc   | | Y nw |jdd d S )NTrv   r   rh   rS  )rs   rz   ro   rq   r   r   r  r   nullcontextr   r   TIMEOUTr   rU  r  )rM   errorfuncr  r*   rs   r  r   r   r   r   _check_crash  s(   
z!ExecutorDeadlockTest._check_crashc                 C      |  ttt  d S r   )r  r
   r  r  rL   r   r   r   test_error_at_task_pickle  s   z.ExecutorDeadlockTest.test_error_at_task_picklec                 C   r  r   )r  r   r  r  rL   r   r   r   test_exit_at_task_unpickle     z/ExecutorDeadlockTest.test_exit_at_task_unpicklec                 C   r  r   )r  r   r  r  rL   r   r   r   test_error_at_task_unpickle  r  z0ExecutorDeadlockTest.test_error_at_task_unpicklec                 C   r  r   )r  r   r  r  rL   r   r   r   test_crash_at_task_unpickle  r  z0ExecutorDeadlockTest.test_crash_at_task_unpicklec                 C      |  tt d S r   )r  r   r  rL   r   r   r   %test_crash_during_func_exec_on_worker     z:ExecutorDeadlockTest.test_crash_during_func_exec_on_workerc                 C   r  r   )r  
SystemExitr  rL   r   r   r   $test_exit_during_func_exec_on_worker  r  z9ExecutorDeadlockTest.test_exit_during_func_exec_on_workerc                 C   s   |  ttt d S r   )r  r   r  rL   r   r   r   %test_error_during_func_exec_on_worker  s   z:ExecutorDeadlockTest.test_error_during_func_exec_on_workerc                 C      |  ttt d S r   )r  r   r  r  rL   r   r   r   )test_crash_during_result_pickle_on_worker     z>ExecutorDeadlockTest.test_crash_during_result_pickle_on_workerc                 C   r  r   )r  r  r  r  rL   r   r   r   (test_exit_during_result_pickle_on_worker  r  z=ExecutorDeadlockTest.test_exit_during_result_pickle_on_workerc                 C   r  r   )r  r
   r  r  rL   r   r   r   )test_error_during_result_pickle_on_worker  r  z>ExecutorDeadlockTest.test_error_during_result_pickle_on_workerc                 C   s   | j tttdd d S )NTr  )r  r   r  r  rL   r   r   r   3test_error_during_result_unpickle_in_result_handler  s   
zHExecutorDeadlockTest.test_error_during_result_unpickle_in_result_handlerc                 C   r  r   )r  r   r  r  rL   r   r   r   2test_exit_during_result_unpickle_in_result_handler  r  zGExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handlerc              	   C   s   | j jdd | jd|  d:}|| _ |jtdd}|jdd | t |  W d    n1 s5w   Y  W d    d S W d    d S 1 sMw   Y  d S )NTrv   r   rh   r@   )r  )	rs   rz   ro   rq   r   r  r   r   r   )rM   rs   r   r   r   r   test_shutdown_deadlock  s   
"z+ExecutorDeadlockTest.test_shutdown_deadlockc              	   C   s   | j jdd | jd|  d<}|| _ |td  |j}|tt }|jdd | 	t
 |  W d    n1 s@w   Y  W d    n1 sOw   Y  |  d S )NTrv   r   rh   r#   F)rs   rz   ro   rq   r   r  r   r$  r  r   r
   r  )rM   rs   Zexecutor_managerr   r   r   r   test_shutdown_deadlock_pickle  s    
z2ExecutorDeadlockTest.test_shutdown_deadlock_pickleN)rO   rP   rQ   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                   @   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                       |    d S r   r   Zcallback_futureZcallback_resultr   r   rl  3     z6FutureTests.test_done_callback_with_result.<locals>.fnrf   )r   add_done_callbackr_  r   rM   rl  r   r   r  r   test_done_callback_with_result1     

z*FutureTests.test_done_callback_with_resultc                    s@   d   fdd}t  }|| |td | d j d S )Nc                    r  r   r   r  Zcallback_exceptionr   r   rl  >  r  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                    r  r   r   r  Zwas_cancelledr   r   rl  I  r  z6FutureTests.test_done_callback_with_cancel.<locals>.fn)r   r  r   r   r  r   r#  r   test_done_callback_with_cancelG  s   
z*FutureTests.test_done_callback_with_cancelc                    s   t  =}dd fdd} fdd}t }|| || |d |  |   | d|  W d    d S 1 sDw   Y  d S )NFc                    s   d t d)NTdoh!r/   r  )raising_was_calledr   r   
raising_fnW  s   z9FutureTests.test_done_callback_raises.<locals>.raising_fnc                    s   d d S )NTr   r  )fn_was_calledr   r   rl  \  r;   z1FutureTests.test_done_callback_raises.<locals>.fnrf   zException: doh!)r   r  r   r  r_  r   r   r  )rM   r  r(  rl  r   r   )r)  r'  r   test_done_callback_raisesR  s   





"z%FutureTests.test_done_callback_raisesc                    s:   d   fdd}t  }|d || | d  d S )Nc                    r  r   r  r  r  r   r   rl  j  r  z=FutureTests.test_done_callback_already_successful.<locals>.fnrf   )r   r_  r  r   r  r   r  r   %test_done_callback_already_successfulh  r  z1FutureTests.test_done_callback_already_successfulc                    s@   d   fdd}t  }|td || | d j d S )Nc                    r  r   r  r  r  r   r   rl  u  r  z9FutureTests.test_done_callback_already_failed.<locals>.fnr[  r   )r   r!  r/   r  r   r*   r  r   r  r   !test_done_callback_already_faileds  s   
z-FutureTests.test_done_callback_already_failedc                    s<   d   fdd}t  }| |  || |   d S )Nc                    r  r   r   r  r#  r   r   rl    r  z<FutureTests.test_done_callback_already_cancelled.<locals>.fn)r   r   r   r  r  r   r#  r   $test_done_callback_already_cancelled~  s   
z0FutureTests.test_done_callback_already_cancelledc                 C   sp   t  *}dd }t }|d || | d|  | d|  W d    d S 1 s1w   Y  d S )Nc                 S   r   )Nr%  r&  r  r   r   r   r(    r)   zKFutureTests.test_done_callback_raises_already_succeeded.<locals>.raising_fnrf   zexception calling callback forr%  )r   r  r   r_  r  r   r  )rM   r  r(  r   r   r   r   +test_done_callback_raises_already_succeeded  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  reprrc  rd  r2  r7  rB  r8  rL   r   r   r   	test_repr  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"   rf   r$   )r    r   r   r   r   r   OSErrorr   r   r   r   r   )rM   r  f2Zf3Zf4Zf5Zf6r   r   r   test_cancel  s$   



zFutureTests.test_cancelc                 C   sX   |  t  |  t  | t  | t  |  t  |  t  d S r   )	r   rc  r   rd  r   r2  r7  rB  r8  rL   r   r   r   test_cancelled     zFutureTests.test_cancelledc                 C   sX   |  t  |  t  | t  | t  | t  | t  d S r   )	r   rc  r   rd  r   r2  r7  rB  r8  rL   r   r   r   	test_done  r5  zFutureTests.test_donec                 C   sX   |  t  | t  |  t  |  t  |  t  |  t  d S r   )	r   rc  runningr   rd  r2  r7  rB  r8  rL   r   r   r   test_running  r5  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   rS  r#   )r   r   rU  rc  r   rd  CancelledErrorr2  r7  r1  rB  r   r8  rL   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.   r_  r   r  r   r   notification  s   
z:FutureTests.test_result_with_success.<locals>.notificationr!   targetrf   rS  r#   )r    r   r   Threadstartr   r   r  rM   r<  r0   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=  rS  )r    r   r   r?  r@  r   r   r9  r   r   r}  r  rA  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   rS  )r   r   rU  rc  r   rd  r9  r2  r7  r   
isinstancerB  r1  r   r8  rL   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                      sN   t d  j t _t  _ j  W d    d S 1 s w   Y  d S rC  )r-   r.   
_conditionr   r   r1  r   
notify_allr   r;  r   r   r<    s   
"z=FutureTests.test_exception_with_success.<locals>.notificationr!   r=  rS  )r    r   r   r?  r@  r   rE  r   r   r}  r1  r  rA  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 s!w   Y  | |  | |	 d d S )Nr!   r   z=FINISHED: <Future at 0x[0-9a-f]+ state=finished returned int>r   )
r    r   r_  r  r   InvalidStateErrorr   r   r   r   )rM   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 s%w   Y  | |	 | d S )Nr!   zBFINISHED: <Future at 0x[0-9a-f]+ state=finished raised ValueError>)
r    r   rF   r!  r  r   rJ  r/   r   r   )rM   r   r  r   r   r   test_multiple_set_exception0  s   

z'FutureTests.test_multiple_set_exceptionN)rO   rP   rQ   r  r"  r$  r*  r+  r,  r-  r.  r0  r3  r4  r6  r8  r:  rB  rD  rF  rI  rK  rL  r   r   r   r   r  0  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   r_   rc   )thread_infor   r   r   setUpModule?  s   rQ  __main__r   )br[  r   Ztest.supportr   r   import_moduler   Ztest.support.script_helperr   r   rW  rA   Zlogging.handlersr   r  r   r   r3   r   r-   r   r]  r  r
   
concurrentr   concurrent.futures._baser   r   r   r   r   r   r   concurrent.futures.processr   r   Zmultiprocessing.processrM  Zmultiprocessing.utilr|   Zcheck_sanitizerr   r    rc  rd  r2  r7  r1  rB  r8  r9   r(   r,   r1   r7   r:   r<   rI   objectrK   rS   r]   ZTestCaser^   re   r   r   r   r   r   r   r   r   r   r  r)  rH  rO  rg  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ  rO   mainr   r   r   r   <module>   s    
$






	!
8 	^OmRVOu
	   
