o
    g                     @   s"  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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$m%Z% d dl&Z$d dl'Z$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  Z6dmd!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 dmdNdO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[da\dhdi Z]djdk Z^e_dlkre`  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_limits)get_contextc                 C   s   t  }| |_||_||_|S N)r   _state
_exception_result)state	exceptionresultf r   R/Users/admin/.pyenv/versions/3.10.0/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   mul5      r(   c                  O   s   | |fS r   r   )argskwargsr   r   r   capture8   r)   r,   c                 C   s   t |  td)Nzthis is an exception)timesleep	Exception)tr   r   r   sleep_and_raise;   s   
r1   c                 C   s    t |  t| tj  d S r   )r-   r.   printsysstdoutflush)r0   msgr   r   r   sleep_and_print?   s   
r7   c                 C   s   | a d S r   INITIALIZER_STATUS)r&   r   r   r   initD      r:   c                   C   s   t S r   r8   r   r   r   r   get_init_statusH      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_failK   s   


rI   c                   @      e Zd Zdd ZdS )MyObjectc                 C      d S r   r   selfr   r   r   	my_methodV   r=   zMyObject.my_methodN)__name__
__module____qualname__rO   r   r   r   r   rK   U   s    rK   c                   @      e Zd Zdd Zdd ZdS )EventfulGCObjc                 C   s   |  | _d S r   )Eventevent)rN   mgrr   r   r   __init__[      zEventfulGCObj.__init__c                 C   s   | j   d S r   )rV   setrM   r   r   r   __del__^   rY   zEventfulGCObj.__del__N)rP   rQ   rR   rX   r[   r   r   r   r   rT   Z       rT   c                 C   s   t  S r   )rK   )_r   r   r   make_dummy_objectb   s   r^   c                   @   rS   )BaseTestCasec                 C   s   t  | _d S r   )r   threading_setup_thread_keyrM   r   r   r   setUpg   rY   zBaseTestCase.setUpc                 C   s   t   tj| j  d S r   )r   reap_childrenr   threading_cleanupra   rM   r   r   r   tearDownj   s   zBaseTestCase.tearDownN)rP   rQ   rR   rb   re   r   r   r   r   r_   f   r\   r_   c                       s@   e Zd ZdZi Z fddZ fddZdd Zdd	 Z  Z	S )
ExecutorMixin   c                    sf   t    t | _t| dr | jd| j|  d| j	| _
n| jdd| ji| j	| _
|   d S )Nctxmax_workers
mp_contextrj   r   )superrb   r-   	monotonict1hasattrexecutor_typeworker_countr   executor_kwargsexecutor_prime_executorrM   	__class__r   r   rb   s   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-   rm   rn   r   verboser2   Z
assertLessrl   re   )rN   Zdtru   r   r   re      s   zExecutorMixin.tearDownc                 C   s
   t | jS r   )r   rh   rM   r   r   r   r         
zExecutorMixin.get_contextc                    s.    fddt  jD }|D ]}|  qd S )Nc                       g | ]
} j tjd qS r@   rs   submitr-   r.   .0r]   rM   r   r   
<listcomp>   s    z1ExecutorMixin._prime_executor.<locals>.<listcomp>)rangerq   r   rN   r   r   r   rM   r   rt      s   

zExecutorMixin._prime_executor)
rP   rQ   rR   rq   rr   rb   re   r   rt   __classcell__r   r   ru   r   rf   o   s    rf   c                   @   s   e Zd ZejZdS )ThreadPoolMixinN)rP   rQ   rR   r   ThreadPoolExecutorrp   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   platformrl   r   rM   ru   r   r   r         



z ProcessPoolForkMixin.get_context	rP   rQ   rR   r   ProcessPoolExecutorrp   rh   r   r   r   r   ru   r   r          r   c                       r   )ProcessPoolSpawnMixinspawnc                    s2   zt   W n ty   | d Y nw t  S )Nr   )r   r   r   rl   r   rM   ru   r   r   r      s   

z!ProcessPoolSpawnMixin.get_contextr   r   r   ru   r   r      r   r   c                       r   )ProcessPoolForkserverMixin
forkserverc                    r   r   r   rM   ru   r   r   r      r   z&ProcessPoolForkserverMixin.get_contextr   r   r   ru   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)rP   typeglobals)Zmixinbasesexecutor_mixinsr   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   rl   rb   rM   ru   r   r   rb      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   r   r<   r   rM   r   r   r      s    z5InitializerMixin.test_initializer.<locals>.<listcomp>r   )r   rq   assertEqualr   r   r   rM   r   test_initializer   s   
z!InitializerMixin.test_initializer)rP   rQ   rR   rq   rb   r   r   r   r   ru   r   r      s    r   c                       s>   e Zd ZdZ fddZ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 )Nrh   r   )r   )
ro   r   rk   QueuerG   r   rI   rr   rl   rb   rM   ru   r   r   rb      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 initializerrg   zexecutor not broken after 5 s.g{Gz?)_assert_loggedrs   r   r<   r   assertRaisesr   r-   rm   _brokenfailr.   )rN   futurern   r   r   r   r      s*   


"z(FailingInitializerMixin.test_initializerc                 C   rL   r   r   rM   r   r   r   rt     r=   z'FailingInitializerMixin._prime_executorc                 #   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)rN   r6   r   cmr   r   r   r     s$   
z&FailingInitializerMixin._assert_logged)rP   rQ   rR   rq   rb   r   rt   
contextlibcontextmanagerr   r   r   r   ru   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   rg   )rs   r{   r   RuntimeErrorr   powrM   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")
            rh    rp   context   apple)r   formatrp   rP   getattrassertFalser   striprN   rcouterrr   r   r   test_interpreter_shutdown1  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()
            rh   r   r   z)RuntimeError: cannot schedule new futuress   runtime-error)	r   r   rp   rP   r   assertIndecoder   r   r   r   r   r   &test_submit_after_interpreter_shutdownG  s   
z;ExecutorShutdownTest.test_submit_after_interpreter_shutdownc                    s6    fddt dD } j  |D ]}|  qd S )Nc                    r~   r   r   r   rM   r   r   r   d  s    z=ExecutorShutdownTest.test_hang_issue12364.<locals>.<listcomp>2   )r   rs   r{   r   )rN   fsr   r   rM   r   test_hang_issue12364c  s
   

z)ExecutorShutdownTest.test_hang_issue12364c                    s   | j dd  fddtdD } jdd dd |D }| jt|d	kd
t|d dd |D }|D ]}| j| d|jd | |  q7| jt|dkdt|d d S )N   rj   c                    s   g | ]	}  tjd qS r   )r   r-   r.   r   rs   r   r   r   k  s    z<ExecutorShutdownTest.test_cancel_futures.<locals>.<listcomp>r   T)cancel_futuresc                 S   s   g | ]}|  r|qS r   	cancelledr   futr   r   r   r   p      #   zlen(cancelled)=r   c                 S   s   g | ]}|  s|qS r   r   r   r   r   r   r   v  r   zfut._state=r   zlen(others)=)	rp   r   r{   r   lendoner   assertIsNoner   )rN   r   r   Zothersr   r   r   r   test_cancel_futuresi  s    $z(ExecutorShutdownTest.test_cancel_futuresc                 C   sR   	 | j tjkrtdtddj| j jd\}}}| | | 	|
 d d S )Nz/Hangs due to https://bugs.python.org/issue39205r   aN  if True:
            from concurrent.futures import {executor_type}
            from test.test_concurrent_futures import sleep_and_print
            if __name__ == "__main__":
                t = {executor_type}(max_workers=3)
                t.submit(sleep_and_print, 1.0, "apple")
                t.shutdown(wait=False)
            rp   r   )rp   r   r   unittestZSkipTestr   r   rP   r   r   r   r   r   r   r   test_hang_issue39205  s   
z)ExecutorShutdownTest.test_hang_issue39205N)	rP   rQ   rR   r   r   r   r   r   r   r   r   r   r   r   *  s    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 )ThreadPoolShutdownTestc                 C   rL   r   r   rM   r   r   r   rt     r=   z&ThreadPoolShutdownTest._prime_executorc                 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     zCThreadPoolShutdownTest.test_threads_terminate.<locals>.acquire_lockr   r   )	threading	Semaphorer   rs   r   r   r   _threadsreleaser{   join)rN   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 Nrg   r   r   )
rg      r   r      r   r  r   r   r  )	r   r   r   listmapabsr   r   r   )rN   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 Nrg   r   r   )r   r   r  r  r   r   r   rN   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 Nrg   r   r   Frw   )r   r   r  r  r   r   r{   r   r	  r   r   r   test_shutdown_no_wait  s   
z,ThreadPoolShutdownTest.test_shutdown_no_waitc                 C   sL   t jddd}|ttdd |j}~|D ]}| |jd |  qd S )Nrg   ZSpecialPool)rj   Zthread_name_prefixr   z^SpecialPool_[0-4]$	r   r   r  r  r   r   assertRegexr   r   rN   rs   r  r0   r   r   r   test_thread_names_assigned  s   
z1ThreadPoolShutdownTest.test_thread_names_assignedc                 C   sJ   t jdd}|ttdd |j}~|D ]}| |jd |  qd S )Nrg   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)
            r   r   )r   r   rp   rP   r   r   r   r   r   r   r   test_cancel_futures_wait_false  s
   

z5ThreadPoolShutdownTest.test_cancel_futures_wait_falseN)rP   rQ   rR   rt   r   r  r  r  r  r  r  r   r   r   r   r     s    	r   c                   @   4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ProcessPoolShutdownTestc                 C   rL   r   r   rM   r   r   r   rt     r=   z'ProcessPoolShutdownTest._prime_executorc                 C   s   dd }t  }|d}tdD ]	}| j|| q| t| jjd tdD ]}|  q(| jj}| j	  |
 D ]}|  q<d S )Nc                 S   r   r   r   r   r   r   r   r     r   zFProcessPoolShutdownTest.test_processes_terminate.<locals>.acquire_lockr   r   )r   r   r   rs   r   r   r   
_processesr   r{   valuesr   )rN   r   rk   r   r]   	processespr   r   r   test_processes_terminate  s   



z0ProcessPoolShutdownTest.test_processes_terminatec              
   C   sn   t jdd}|j}| t|ttddg d W d    n1 s%w   Y  | D ]}|	  q.d S r   )
r   r   r  r   r  r  r  r   r  r   )rN   r  r  r  r   r   r   r  	  s   
z5ProcessPoolShutdownTest.test_context_manager_shutdownc                 C   sb   t jdd}|ttdd}|j}|j}|j}|j}~|  |	 D ]}|  q$|
  d S r  )r   r   r  r  r   _executor_manager_threadr  _call_queuer   r  join_thread)rN   rs   r
  executor_manager_threadr  
call_queuer  r   r   r   r    s   
z)ProcessPoolShutdownTest.test_del_shutdownc                 C   sf   t jdd}|ttdd}|j}|j}|j}|jdd |	  |
 D ]}|	  q&|  d S r  )r   r   r  r  r   r  r  r  r{   r   r  r  )rN   rs   r
  r  r   r  r  r   r   r   r  &  s   
z-ProcessPoolShutdownTest.test_shutdown_no_waitN)rP   rQ   rR   rt   r  r  r  r  r   r   r   r   r    s    	r  )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 )	WaitTestsc                 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         ?return_when)rs   r   r(   r-   r.   r   rx   CANCELLED_FUTUREFIRST_COMPLETEDr   rZ   )rN   future1future2r   not_doner   r   r   test_first_completedD  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 )Nr#  r$  )rs   r   r-   r.   r   rx   CANCELLED_AND_NOTIFIED_FUTURESUCCESSFUL_FUTUREr'  r   rZ   rN   r(  finishedpendingr   r   r   +test_first_completed_some_already_completedO  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$  )rs   r   r(   r1   r-   r.   r   rx   FIRST_EXCEPTIONr   rZ   )rN   r(  r)  Zfuture3r/  r0  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 )Nr"  r   r#  r$  )rs   r   divmodr-   r.   r   rx   r-  r&  r,  r2  r   rZ   rN   r(  r)  r/  r0  r   r   r   *test_first_exception_some_already_completeg  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   rx   EXCEPTION_FUTUREr2  r   rZ   r.  r   r   r   'test_first_exception_one_already_failedw  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$  )rs   r   r4  r(   r   rx   r-  r,  r7  ALL_COMPLETEDr   rZ   r5  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      rg   )timeoutr%  )rs   r   r(   r-   r.   r   rx   r,  r7  r-  r9  r   rZ   r5  r   r   r   test_timeout  s&   
zWaitTests.test_timeoutN)
rP   rQ   rR   r+  r1  r3  r6  r8  r:  r>  r   r   r   r   r!  B  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   rw   r   )rV   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   )r@  rN   r   r   	<setcomp>  r   z>ThreadPoolWaitTests.test_pending_calls_race.<locals>.<setcomp>d   r$  )
r   rU   r3   getswitchintervalsetswitchintervalr   rZ   r   rx   r9  )rN   Zoldswitchintervalr   r   )rV   r@  rN   r   test_pending_calls_race  s   
z+ThreadPoolWaitTests.test_pending_calls_raceN)rP   rQ   rR   rE  r   r   r   r   r?    s    r?  c                   @   r  )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;  )
rs   r   r(   rZ   r   as_completedr,  r7  r-  r   )rN   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y*   Y nw | tttt	g| d S )Nr   r   r=  )rs   r   r-   r.   rZ   r   rG  r,  r7  r-  addTimeoutErrorr   )rN   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  )
rs   r   r-   r.   r   rG  	itertoolsrepeatr   r   )rN   r(  rH  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
|}~| |  q(W d    n1 sFw   Y  |d d	 t|D ]}|	| t
|}~| |  |rs|d d	 qWd 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   rJ  test)r   r   r    r   r   r   r   rL  rG  removeweakrefrefr   
set_result)rN   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   rJ  z2 (of 4) futures unfinished)r,  PENDING_FUTURERUNNING_FUTUREr-  r   r   rL  r  rG  r   strr   )rN   rW  r   r   r   r   "test_correct_timeout_exception_msg  s   z3AsCompletedTests.test_correct_timeout_exception_msgN)rP   rQ   rR   rI  rM  rP  rY  r]  r   r   r   r   rF    s    
rF  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   rQ     )rs   r   r   r   r   rN   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   rQ  )r'      r  r   )rN   fn)r  )rc  arg)rd  )rs   r   r(   r   r   r,   r   	TypeErrorr`  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  rs   r  r   r   rM   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   rg   )r   r  )rs   r  r4  r   __next__r   ZeroDivisionError)rN   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y"   Y nw | d | d d g| d S )N)r   r   r;  rg   rJ  zexpected TimeoutError)	rs   r  r-   r.   r   r   rL  r   r   )rN   resultsr   r   r   r   test_map_timeout2  s   


zExecutorTest.test_map_timeoutc                 C   s(   | j tdg| jd   | j   d S )Nr   r  )rs   r  r\  rq   r{   rM   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   )rZ   )objZmy_object_collectedr   r   <lambda>N  s    z7ExecutorTest.test_no_stale_references.<locals>.<lambda>rJ  z-Stale reference not collected within timeout.)rK   r   rU   rT  rU  rs   r   rO   rx   r   SHORT_TIMEOUTr   )rN   Z	my_objectZmy_object_callbackZ	collectedr   rr  r   test_no_stale_referencesG  s   z%ExecutorTest.test_no_stale_referencesc              	   C   sF   dD ]}|  td | j|d W d    q1 sw   Y  qd S )N)r   z"max_workers must be greater than 0r   )assertRaisesRegexrF   rp   )rN   Znumberr   r   r   test_max_workers_negativeW  s   z&ExecutorTest.test_max_workers_negativec                 C   s4   | j ttdD ]}t|}~| |  q	d S )Nrg  )rs   r  r^   r   rT  rU  r   )rN   rq  rX  r   r   r   test_free_reference^  s
   
z ExecutorTest.test_free_referenceN)rP   rQ   rR   ra  rf  rj  rm  ro  rp  r   Zcpython_onlyru  rx  ry  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 )
ThreadPoolExecutorTestc                    sF   	 g   fdd}| j |td | j jdd |  td d S )Nc                    s     |  d S r   )r   )nr/  r   r   record_finishedk  rY   zRThreadPoolExecutorTest.test_map_submits_without_iteration.<locals>.record_finishedrg  Trw   )rs   r  r   r{   ZassertCountEqual)rN   r}  r   r|  r   "test_map_submits_without_iterationh  s   z9ThreadPoolExecutorTest.test_map_submits_without_iterationc                 C   s0   |   }tdt pdd }| |j| d S )N    r  r  )rp   minos	cpu_countr   _max_workers)rN   rs   Zexpectedr   r   r   test_default_workersr  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   y  r   z<ThreadPoolExecutorTest.test_saturation.<locals>.acquire_lockr      Trw   )rp   r   r   r   r  r   r   r   r   r   r{   )rN   rs   r   r   r   r   r   r   test_saturationw  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  Trw   )rp   r   r(   r   r   r   r   r{   rN   rs   r   r   r   test_idle_thread_reuse  s   z-ThreadPoolExecutorTest.test_idle_thread_reuseN)rP   rQ   rR   r~  r  r  r  r   r   r   r   rz  g  s
    
rz  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   )rw  rF   r   r   rM   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   rQ  )rs   r   r-   r.   nextiterr  r  	terminater   r   r   r   )rN   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(   rv  rh  )r  rs   r  r   r   r   rM   r   r   bad_map  s   $z;ProcessPoolExecutorTest.test_map_chunksize.<locals>.bad_mapr  r;  rh  r   )r  r  r   r   r   rs   r   rF   )rN   r  rU  r   rM   r   test_map_chunksize  s   z*ProcessPoolExecutorTest.test_map_chunksizec                 C      t d)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)rN   r   r   exccausef1r   r   r   test_traceback  s*   

z&ProcessPoolExecutorTest.test_tracebackmd5c                 C   s`   t | j }t|}| jt|}|  | |j	j
dd d }t  |  |  d S )Nr  rJ  )r   rh   ManagerrT   rs   r   idr   r   rV   rx   r   
gc_collectr{   r   )rN   rW   rq  r   r   r   r   test_ressources_gced_in_workers  s   z7ProcessPoolExecutorTest.test_ressources_gced_in_workersc                 C   s   |  d}t }|d}d|j }z)t|D ]}||j q| t|j	|j t|D ]}|
  q.W |  d S |  w )Nr  r   r  )rp   r   r   r  r   r   r   r   r   r  r   r{   )rN   rs   rk   r   Z	job_countr]   r   r   r   r    s   



z'ProcessPoolExecutorTest.test_saturationc                 C   s^   |  d}|tdd  |tdd  |tdd  | t|jd |  d S )	Nr  r"  r   r;  r<  r   r  r  )rp   r   r(   r   r   r   r  r{   r  r   r   r   test_idle_process_reuse_one  s   
z3ProcessPoolExecutorTest.test_idle_process_reuse_onec                 C   sh   |  d}|tdd  |tdd |tdd  |tdd | t|jd	 |  d S )
Nr     r<  !               r   )rp   r   r(   r   ZassertLessEqualr   r  r{   r  r   r   r    test_idle_process_reuse_multiple  s   
z8ProcessPoolExecutorTest.test_idle_process_reuse_multipleN)rP   rQ   rR   r   Z
skipUnlessr3   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 Nr   )r-   r.   faulthandlerdisableZ_sigsegv)delayr  r   r   r   _crash  s   
r  c                   C   s   	 t d d S Nr  )r3   exitr   r   r   r   _exit  s   r  c                 C   s   	 |  r   r   )Errr   r   r   _raise_error     r  c                 C   s   	 dd l }| t_|  r  )ioStringIOr3   stderr)r  r  r   r   r   _raise_error_ignore_stderr  s   
r  c                 C   s   	 |  S r   r   r  r   r   r   _return_instance  r  r  c                   @      e Zd Z	 dd ZdS )CrashAtPicklec                 C   
   t   d S r   r  rM   r   r   r   
__reduce__#  r}   zCrashAtPickle.__reduce__NrP   rQ   rR   r  r   r   r   r   r  !      r  c                   @   r  )CrashAtUnpicklec                 C      t dfS Nr   r  rM   r   r   r   r  )  r)   zCrashAtUnpickle.__reduce__Nr  r   r   r   r   r  '  r  r  c                   @   r  )ExitAtPicklec                 C   r  r   r  rM   r   r   r   r  /  r}   zExitAtPickle.__reduce__Nr  r   r   r   r   r  -  r  r  c                   @   r  )ExitAtUnpicklec                 C   r  r  r  rM   r   r   r   r  5  r)   zExitAtUnpickle.__reduce__Nr  r   r   r   r   r  3  r  r  c                   @   r  )ErrorAtPicklec                 C   s   ddl m} |d)Nr   r	   zError in pickle)pickler
   )rN   r
   r   r   r   r  ;  s   zErrorAtPickle.__reduce__Nr  r   r   r   r   r  9  r  r  c                   @   r  )ErrorAtUnpicklec                 C   s   ddl m} t|ffS )Nr   )UnpicklingError)r  r  r  )rN   r  r   r   r   r  B  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)fileTrw   z
Traceback:
 zExecutor deadlock:

)r  tempfiler  Zdump_tracebackseekreadr  r  r  r{   r2   r3   
__stderr__r   )rN   rs   r  r  r   r  r  r   r   r   _fail_on_deadlockJ  s   


z&ExecutorDeadlockTest._fail_on_deadlockFignore_stderrc             	   G   s   | j jdd | jdt| jd}|j|g|R  }|r!t }nt	 }z0| 
|! | |j| jd W d    n1 s@w   Y  W d    n1 sOw   Y  W n tjyd   | | Y nw |jdd d S )NTrw   r   ri   rJ  )rs   r{   rp   r   rh   r   r   r  r   nullcontextr   r   TIMEOUTr   rL  r  )rN   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  rM   r   r   r   test_error_at_task_picklet  s   z.ExecutorDeadlockTest.test_error_at_task_picklec                 C   r  r   )r  r   r  r  rM   r   r   r   test_exit_at_task_unpickley     z/ExecutorDeadlockTest.test_exit_at_task_unpicklec                 C   r  r   )r  r   r  r  rM   r   r   r   test_error_at_task_unpickle}  r  z0ExecutorDeadlockTest.test_error_at_task_unpicklec                 C   r  r   )r  r   r  r  rM   r   r   r   test_crash_at_task_unpickle  r  z0ExecutorDeadlockTest.test_crash_at_task_unpicklec                 C      |  tt d S r   )r  r   r  rM   r   r   r   %test_crash_during_func_exec_on_worker     z:ExecutorDeadlockTest.test_crash_during_func_exec_on_workerc                 C   r  r   )r  
SystemExitr  rM   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  rM   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  rM   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  rM   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  rM   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  rM   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  rM   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t| jd:}|| _ |jtdd}|jdd | t |	  W d    n1 s6w   Y  W d    d S W d    d S 1 sNw   Y  d S )NTrw   r   ri   r@   )r  )
rs   r{   rp   r   rh   r   r  r   r   r   )rN   rs   r   r   r   r   test_shutdown_deadlock  s   
"z+ExecutorDeadlockTest.test_shutdown_deadlockc              	   C   s   | j jdd | jdt| jd<}|| _ |td  |j}|tt	 }|jdd | 
t |  W d    n1 sAw   Y  W d    n1 sPw   Y  |  d S )NTrw   r   ri   r#   F)rs   r{   rp   r   rh   r   r  r   r  r  r   r
   r   )rN   rs   Zexecutor_managerr   r   r   r   test_shutdown_deadlock_pickle  s    
z2ExecutorDeadlockTest.test_shutdown_deadlock_pickleN)rP   rQ   rR   r   rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  G  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   rc       z6FutureTests.test_done_callback_with_result.<locals>.fnrg   )r   add_done_callbackrV  r   rN   rc  r   r   r  r   test_done_callback_with_result     

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   rc    r  z9FutureTests.test_done_callback_with_exception.<locals>.fnrR  rR  )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   rc    r  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  =}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_fn   s   z9FutureTests.test_done_callback_raises.<locals>.raising_fnc                    s   d d S )NTr   r  )fn_was_calledr   r   rc    r;   z1FutureTests.test_done_callback_raises.<locals>.fnrg   zException: doh!)r   r  r   r  rV  r   r   r  )rN   r  r  rc  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                    r  r   r  r  r  r   r   rc    r  z=FutureTests.test_done_callback_already_successful.<locals>.fnrg   )r   rV  r  r   r  r   r  r   %test_done_callback_already_successful  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   rc    r  z9FutureTests.test_done_callback_already_failed.<locals>.fnrR  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                    r  r   r   r  r  r   r   rc  )  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  4  r)   zKFutureTests.test_done_callback_raises_already_succeeded.<locals>.raising_fnrg   zexception calling callback forr
  )r   r  r   rV  r  r   r  )rN   r  r  r   r   r   r   +test_done_callback_raises_already_succeeded2  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  reprrZ  r[  r&  r,  r7  r-  rM   r   r   r   	test_reprB  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"   rg   r$   )r    r   r   r   r   r   OSErrorr   r  r   r   r   )rN   r  f2Zf3Zf4Zf5Zf6r   r   r   test_cancelS  s$   



zFutureTests.test_cancelc                 C   sX   |  t  |  t  | t  | t  |  t  |  t  d S r   )	r   rZ  r   r[  r   r&  r,  r7  r-  rM   r   r   r   test_cancelledm     zFutureTests.test_cancelledc                 C   sX   |  t  |  t  | t  | t  | t  | t  d S r   )	r   rZ  r   r[  r   r&  r,  r7  r-  rM   r   r   r   	test_doneu  r  zFutureTests.test_donec                 C   sX   |  t  | t  |  t  |  t  |  t  |  t  d S r   )	r   rZ  runningr   r[  r&  r,  r7  r-  rM   r   r   r   test_running}  r  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   rJ  r#   )r   r   rL  rZ  r   r[  CancelledErrorr&  r,  r  r7  r   r-  rM   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.   rV  r   r  r   r   notification  s   
z:FutureTests.test_result_with_success.<locals>.notificationr!   targetrg   rJ  r#   )r    r   r   Threadstartr   r   r   rN   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 r  )r-   r.   r  r   r   r   r   r!    s   
z9FutureTests.test_result_with_cancel.<locals>.notificationr!   r"  rJ  )r    r   r   r$  r%  r   r   r  r   r   rt  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   rJ  )r   r   rL  rZ  r   r[  r  r&  r,  r   
isinstancer7  r  r   r-  rM   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 r  )r-   r.   
_conditionr   r   r  r   
notify_allr   r   r   r   r!    s   
"z=FutureTests.test_exception_with_success.<locals>.notificationr!   r"  rJ  )r    r   r   r$  r%  r   r)  r   r   rt  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 s!w   Y  | |  | |	 d d S )Nr!   r  z=FINISHED: <Future at 0x[0-9a-f]+ state=finished returned int>r   )
r    r   rV  rw  r   InvalidStateErrorr   r   r   r   )rN   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  rw  r   r.  r/   r   r   )rN   r   r  r   r   r   test_multiple_set_exception  s   

z'FutureTests.test_multiple_set_exceptionN)rP   rQ   rR   r   r  r	  r  r  r  r  r  r  r  r  r  r  r  r'  r(  r*  r-  r/  r0  r   r   r   r   r    s*    r  c                   C   s   t  ad S r   )r   r`   _threads_keyr   r   r   r   setUpModule  r  r2  c                   C   s   t jt  tj  d S r   )r   rd   r1  multiprocessingutil_cleanup_testsr   r   r   r   tearDownModule  s   
r6  __main__r   )arR  r   Ztest.supportr   r   import_moduler   Ztest.support.script_helperr   r   rN  rA   Zlogging.handlersr   r  r   r3   r   r-   r   rT  r  r
   Z
concurrentr   concurrent.futures._baser   r   r   r   r   r   r   concurrent.futures.processr   r   r3  r   Zmultiprocessing.processZmultiprocessing.utilr    rZ  r[  r&  r,  r  r7  r-  r9   r(   r,   r1   r7   r:   r<   rI   objectrK   rT   r^   ZTestCaser_   rf   r   r   r   r   r   r   r   r   r   r  r!  r?  rF  r^  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1  r2  r6  rP   mainr   r   r   r   <module>   s    
$





	*
;k_HePU&p
	   
