B
    18™\Be  ã               @   s–  d 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	Z	ddl	m
Z
 ddlmZ ddlmZ dd„ Zd	d
„ Zdd„ ZG dd„ dƒZG dd„ dejƒZG dd„ dƒZe ee
dƒd¡G dd„ deejƒƒZe ee
dƒd¡G dd„ deejƒƒZG dd„ deejƒZG dd„ dƒZe ee
dƒd¡G dd„ deejƒƒZe ee
dƒd¡G dd „ d eejƒƒZG d!d"„ d"eejƒZe d#kr’e !¡  dS )$zTests for futures.py.é    N)Úmock)Úfutures)Úutils)Úsupportc             C   s   | S )N© )Úfr   r   úb/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_asyncio/test_futures.pyÚ	_fakefunc   s    r	   c               C   s   d S )Nr   r   r   r   r   Úfirst_cb   s    r
   c               C   s   d S )Nr   r   r   r   r   Úlast_cb   s    r   c               @   s\   e Zd ZdZdZd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 )Ú
DuckFutureFNc             C   s   |   ¡ rdS d| _dS )NFT)ÚdoneÚ_DuckFuture__cancelled)Úselfr   r   r   Úcancel&   s    zDuckFuture.cancelc             C   s   | j S )N)r   )r   r   r   r   Ú	cancelled,   s    zDuckFuture.cancelledc             C   s   | j p| jd k	p| jd k	S )N)r   Ú_DuckFuture__resultÚ_DuckFuture__exception)r   r   r   r   r   /   s    
zDuckFuture.donec             C   s"   |   ¡ rt‚| jd k	r| j‚| jS )N)r   ÚAssertionErrorr   r   )r   r   r   r   Úresult4   s    
zDuckFuture.resultc             C   s   |   ¡ rt‚| jS )N)r   r   r   )r   r   r   r   Ú	exception:   s    zDuckFuture.exceptionc             C   s"   |   ¡ rt‚|d k	st‚|| _d S )N)r   r   r   )r   r   r   r   r   Ú
set_result>   s    zDuckFuture.set_resultc             C   s"   |   ¡ rt‚|d k	st‚|| _d S )N)r   r   r   )r   r   r   r   r   Úset_exceptionC   s    zDuckFuture.set_exceptionc             c   s(   |   ¡ sd| _| V  |   ¡ s t‚|  ¡ S )NT)r   Ú_asyncio_future_blockingr   r   )r   r   r   r   Ú__iter__H   s
    zDuckFuture.__iter__)Ú__name__Ú
__module__Ú__qualname__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‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú	DuckTestsc                s&   t ƒ  ¡  |  ¡ | _|  | jj¡ d S )N)ÚsuperÚsetUpÚnew_test_loopÚloopÚ
addCleanupÚclose)r   )Ú	__class__r   r   r    R   s    

zDuckTests.setUpc             C   s    t ƒ }t |¡}||kst‚d S )N)r   ÚasyncioÚwrap_futurer   )r   r   Úgr   r   r   Útest_wrap_futureW   s    
zDuckTests.test_wrap_futurec             C   s    t ƒ }t |¡}||kst‚d S )N)r   r&   Úensure_futurer   )r   r   r(   r   r   r   Útest_ensure_future\   s    
zDuckTests.test_ensure_future)r   r   r   r    r)   r+   Ú__classcell__r   r   )r%   r   r   P   s   r   c                   s„  e Zd Zdd„ Z‡ f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e d!¡d"d#„ ƒZe d!¡d$d%„ ƒZe d!¡d&d'„ ƒZe d!¡d(d)„ ƒZe d!¡d*d+„ ƒZe d!¡d,d-„ ƒZe d!¡d.d/„ ƒZd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z d:d;„ Z!e d!¡d<d=„ ƒZ"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(‡  Z)S )JÚBaseFutureTestsc             O   s   | j ||ŽS )N)Úcls)r   ÚargsÚkwargsr   r   r   Ú_new_futured   s    zBaseFutureTests._new_futurec                s&   t ƒ  ¡  |  ¡ | _|  | jj¡ d S )N)r   r    r!   r"   r#   r$   )r   )r%   r   r   r    g   s    

zBaseFutureTests.setUpc             C   s¬   G dd„ dƒ}|   t |¡¡ |  t |ƒ ¡¡ |   t d¡¡ |   t t ¡ ¡¡ | j| jd}|  t |¡¡ |   t t|ƒ¡¡ |  t t t|ƒ¡¡¡ | 	¡  d S )Nc               @   s   e Zd ZdZdd„ ZdS )z/BaseFutureTests.test_isfuture.<locals>.MyFutureNc             S   s
   d| _ d S )NF)r   )r   r   r   r   Ú__init__p   s    z8BaseFutureTests.test_isfuture.<locals>.MyFuture.__init__)r   r   r   r   r2   r   r   r   r   ÚMyFuturem   s   r3   é   )r"   )
ÚassertFalser&   ÚisfutureÚ
assertTruer   ÚMockr1   r"   Útyper   )r   r3   r   r   r   r   Útest_isfuturel   s    zBaseFutureTests.test_isfuturec             C   sD   | j | jd}|  | ¡ ¡ |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)r"   )r1   r"   r5   r   r   r   r7   )r   r   r   r   r   Útest_initial_stateƒ   s
    z"BaseFutureTests.test_initial_statec             C   s:   t  | j¡ |  ¡ }|  |j| j¡ |  | ¡ | j¡ d S )N)r&   Úset_event_loopr"   r1   ÚassertIsÚ_loopÚget_loop)r   r   r   r   r   Ú"test_init_constructor_default_loopŠ   s    z2BaseFutureTests.test_init_constructor_default_loopc             C   s   |   t| jd¡ d S )Né*   )ÚassertRaisesÚ	TypeErrorr1   )r   r   r   r   Útest_constructor_positional   s    z+BaseFutureTests.test_constructor_positionalc          	   C   sF  | j j| j | jd}|  tj|j¡ | j j| j | jd}|  tj|j¡ | j j| j | jd}|  tt	f¡ | 
d ¡ W d Q R X | j j| j | jd}|  tt	f¡ | t¡ W d Q R X | j j| j | jd}|  tt	f¡ | ¡  W d Q R X | j j| j | jd}|  tt	f¡ | dd„ ¡ W d Q R X | j j| j | jd}|  tt	f¡ | dd„ ¡ W d Q R X | j j| j | jd}yt|ƒ W n tt	fk
r    Y nX | j j| j | jd}y| ¡  W n tk
rØ   Y nX | j j| j | jd}yt|ƒ W n tk
r   Y nX | j j| j | jd}|  | ¡ ¡ |  | ¡ ¡ d S )N)r"   c             S   s   d S )Nr   )r   r   r   r   Ú<lambda>¬   ó    z4BaseFutureTests.test_uninitialized.<locals>.<lambda>c             S   s   d S )Nr   )r   r   r   r   rE   °   rF   )r.   Ú__new__r"   rB   r&   ÚInvalidStateErrorr   r   ÚRuntimeErrorÚAttributeErrorr   r   Ú	Exceptionr   Úadd_done_callbackÚremove_done_callbackÚreprÚ	__await__Úiterr5   r   r   )r   Úfutr   r   r   Útest_uninitialized”   sJ    z"BaseFutureTests.test_uninitializedc             C   sŽ   | j | jd}|  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  tj|j	¡ |  tj|j
¡ |  tj|jd ¡ |  tj|jd ¡ |  | ¡ ¡ d S )N)r"   )r1   r"   r7   r   r   r   rB   r&   ÚCancelledErrorr   r   rH   r   r   r5   )r   r   r   r   r   Útest_cancelÈ   s    zBaseFutureTests.test_cancelc             C   sš   | j | jd}|  tj|j¡ | d¡ |  | ¡ ¡ |  	| 
¡ ¡ |  | ¡ d¡ |  | ¡ d ¡ |  tj|jd ¡ |  tj|jd ¡ |  | ¡ ¡ d S )N)r"   rA   )r1   r"   rB   r&   rH   r   r   r5   r   r7   r   ÚassertEqualr   r   r   )r   r   r   r   r   Útest_resultÓ   s    
zBaseFutureTests.test_resultc             C   s°   t ƒ }| j| jd}|  tj|j¡ |  td|j	t
¡ | 	|¡ |  | ¡ ¡ |  | ¡ ¡ |  t |j¡ |  | ¡ |¡ |  tj|jd ¡ |  tj|j	d ¡ |  | ¡ ¡ d S )N)r"   z!StopIteration .* cannot be raised)rI   r1   r"   rB   r&   rH   r   ÚassertRaisesRegexrC   r   ÚStopIterationr5   r   r7   r   r   rU   r   r   )r   Úexcr   r   r   r   Útest_exceptionà   s    

zBaseFutureTests.test_exceptionc             C   s,   | j | jd}| t¡ |  | ¡ t¡ d S )N)r"   )r1   r"   r   rI   ÚassertIsInstancer   )r   r   r   r   r   Útest_exception_classò   s    
z$BaseFutureTests.test_exception_classc                sn   | j | jd‰ ‡ fdd„}|ƒ }|  t|ƒd¡ |  t|ƒˆ ¡ ˆ  d¡ |  t|ƒd¡ |  t|ƒd¡ d S )N)r"   c              3   s2   dV  ˆ E d H } d| fV  ˆ E d H }d|fV  d S )NÚAÚBÚCr   )ÚxÚy)r   r   r   Úfixtureú   s
    


z6BaseFutureTests.test_yield_from_twice.<locals>.fixturer]   rA   )r^   rA   )r_   rA   )r1   r"   rU   Únextr   )r   rb   r(   r   )r   r   Útest_yield_from_twice÷   s    
z%BaseFutureTests.test_yield_from_twicec          
   C   s°  | j  d¡ | j| j d}|jd }|  t|ƒd| jj› d|d › d|d › d	¡ | ¡  | j  d
¡ | j| j d}|  t|ƒd| jj› d¡ | ¡  | j| j d}| ¡  |  t|ƒd| jj› d¡ | j| j d}| 	d¡ |  t|ƒd| jj› d¡ |  | 
¡ d¡ tƒ }| j| j d}| |¡ |  t|ƒd| jj› d¡ |  | ¡ |¡ dd„ }| j| j d}	|	 t¡ |tƒ}
|  t|	ƒd| jj d|
  ¡ |	 ¡  |  t|	ƒd| jj› d¡ | j| j d}| t¡ | t¡ |tƒ}|tƒ}|  t|ƒd| jj d||f  ¡ | j| j d}| t¡ xtdƒD ]}| t¡ q>W | t¡ d||f }|  t|ƒd| jj d|  ¡ | ¡  |  t|ƒd| jj› d¡ d S )NT)r"   éÿÿÿÿú<z pending created at r   ú:r4   ú>Fz	 pending>z cancelled>é   z finished result=4>z# finished exception=RuntimeError()>c             S   s(   t  | ¡\}}d| j||f }t |¡S )Nz%s() at %s:%s)Ú
test_utilsÚget_function_sourcer   ÚreÚescape)ÚfuncÚfilenameÚlinenoÚtextr   r   r   Ú	func_repr)  s    z3BaseFutureTests.test_future_repr.<locals>.func_reprz pending cb=\[%s\]>z pending cb=\[%s, %s\]>é   z%s, <8 more>, %s)r"   Ú	set_debugr1   Ú_source_tracebackrU   rN   r.   r   r   r   r   rI   r   r=   r   rL   r	   ÚassertRegexr
   r   Úrange)r   Zf_pending_debugÚframeZ	f_pendingÚf_cancelledZf_resultrY   Úf_exceptionrr   Zf_one_callbacksZ	fake_reprZf_two_callbacksZ
first_reprZ	last_reprZf_many_callbacksÚiÚcb_regexr   r   r   Útest_future_repr	  sp    
&









z BaseFutureTests.test_future_reprc             C   sè   ddl m} | j| jd}| d¡ | j| jd}|||ƒ |  | ¡ ¡ |  | ¡ d¡ | j| jd}| 	t
ƒ ¡ | j| jd}|||ƒ |  | ¡ ¡ |  t
|j¡ | j| jd}| ¡  | j| jd}|||ƒ |  | ¡ ¡ d S )Nr   )Ú_copy_future_state)r"   é
   )Zasyncio.futuresr~   r1   r"   r   r7   r   rU   r   r   rI   rB   r   r   )r   r~   r   Znewfrz   Znewf_exceptionry   Znewf_cancelledr   r   r   Útest_copy_stateN  s$    



zBaseFutureTests.test_copy_statec          	      sP   | j | jd‰‡fdd„‰ ‡ fdd„}|  td¡ |ƒ  W d Q R X ˆ ¡  d S )N)r"   c               3   s   ˆ E d H  d S )Nr   r   )rQ   r   r   Úcorok  s    z'BaseFutureTests.test_iter.<locals>.coroc                 s   ˆ ƒ \} }d S )Nr   )Úarg1Úarg2)r   r   r   Útestn  s    z'BaseFutureTests.test_iter.<locals>.testzawait wasn't used)r1   r"   rW   rI   r   )r   r„   r   )r   rQ   r   Ú	test_iterh  s    zBaseFutureTests.test_iterc          	   C   s0   | j | jd}|  td¡ d|_W d Q R X d S )N)r"   zcan only be set to FalseT)r1   r"   rW   Ú
ValueErrorÚ_log_traceback)r   rQ   r   r   r   Útest_log_tracebacku  s    z"BaseFutureTests.test_log_tracebackzasyncio.base_events.loggerc             C   s"   | j | jd}~|  |jj¡ d S )N)r"   )r1   r"   r5   ÚerrorÚcalled)r   Úm_logrQ   r   r   r   Útest_tb_logger_abandonedz  s    z(BaseFutureTests.test_tb_logger_abandonedc             C   s6   | j | jd}| tƒ ¡ | ¡  ~|  |jj¡ d S )N)r"   )r1   r"   r   rK   r   r5   r‰   rŠ   )r   r‹   rQ   r   r   r   Ú&test_tb_logger_not_called_after_cancel€  s
    z6BaseFutureTests.test_tb_logger_not_called_after_cancelc             C   s,   | j | jd}| d¡ ~|  |jj¡ d S )N)r"   rA   )r1   r"   r   r5   r‰   rŠ   )r   r‹   rQ   r   r   r   Ú!test_tb_logger_result_unretrievedˆ  s    
z1BaseFutureTests.test_tb_logger_result_unretrievedc             C   s4   | j | jd}| d¡ | ¡  ~|  |jj¡ d S )N)r"   rA   )r1   r"   r   r   r5   r‰   rŠ   )r   r‹   rQ   r   r   r   Útest_tb_logger_result_retrieved  s
    
z/BaseFutureTests.test_tb_logger_result_retrievedc             C   sD   | j | jd}| tdƒ¡ ~t | j¡ t ¡  |  |j	j
¡ d S )N)r"   Úboom)r1   r"   r   rI   rj   Úrun_brieflyr   Ú
gc_collectr7   r‰   rŠ   )r   r‹   rQ   r   r   r   Ú$test_tb_logger_exception_unretrieved—  s    z4BaseFutureTests.test_tb_logger_exception_unretrievedc             C   s8   | j | jd}| tdƒ¡ | ¡  ~|  |jj¡ d S )N)r"   r   )r1   r"   r   rI   r   r5   r‰   rŠ   )r   r‹   rQ   r   r   r   Ú"test_tb_logger_exception_retrieved   s
    z2BaseFutureTests.test_tb_logger_exception_retrievedc             C   s>   | j | jd}| tdƒ¡ |  t|j¡ ~|  |jj¡ d S )N)r"   r   )	r1   r"   r   rI   rB   r   r5   r‰   rŠ   )r   r‹   rQ   r   r   r   Ú)test_tb_logger_exception_result_retrieved¨  s
    z9BaseFutureTests.test_tb_logger_exception_result_retrievedc             C   s|   dd„ }t j d¡}| |d¡}tj|| jd}| j |¡\}}|  t 	|¡¡ |  
|d¡ |  |t ¡ ¡ |jdd d S )Nc             S   s   | t  ¡ fS )N)Ú	threadingÚ	get_ident)Úargr   r   r   Úrun²  s    z-BaseFutureTests.test_wrap_future.<locals>.runr4   Úoi)r"   T)Úwait)Ú
concurrentr   ÚThreadPoolExecutorÚsubmitr&   r'   r"   Úrun_until_completer7   r6   rU   ÚassertNotEqualr–   r—   Úshutdown)r   r™   ÚexÚf1Úf2ÚresÚidentr   r   r   r)   °  s    z BaseFutureTests.test_wrap_futurec             C   s(   | j | jd}t |¡}|  ||¡ d S )N)r"   )r1   r"   r&   r'   r=   )r   r£   r¤   r   r   r   Útest_wrap_future_future½  s    
z'BaseFutureTests.test_wrap_future_futurec          	      sn   t  d¡Z}‡ fdd„|_dd„ }tj d¡}| |d¡}t |¡}ˆ  	ˆ j
|j¡ |jdd	 W d Q R X d S )
Nzasyncio.futures.eventsc                  s   ˆ j S )N)r"   r   )r   r   r   rE   Ä  rF   zBBaseFutureTests.test_wrap_future_use_global_loop.<locals>.<lambda>c             S   s   | t  ¡ fS )N)r–   r—   )r˜   r   r   r   r™   Å  s    z=BaseFutureTests.test_wrap_future_use_global_loop.<locals>.runr4   rš   T)r›   )r   ÚpatchÚget_event_looprœ   r   r   rž   r&   r'   r=   r"   r>   r¡   )r   Úeventsr™   r¢   r£   r¤   r   )r   r   Ú test_wrap_future_use_global_loopÂ  s    
z0BaseFutureTests.test_wrap_future_use_global_loopc             C   sN   t j ¡ }tj|| jd}| ¡  t | j¡ |  	| 
¡ ¡ |  	| 
¡ ¡ d S )N)r"   )rœ   r   ÚFuturer&   r'   r"   r   rj   r‘   r7   r   )r   r£   r¤   r   r   r   Útest_wrap_future_cancelÍ  s    
z'BaseFutureTests.test_wrap_future_cancelc             C   sh   t j ¡ }tj|| jd}| d¡ | ¡  t 	| j¡ |  
| ¡ ¡ |  | ¡ d¡ |  | ¡ ¡ d S )N)r"   rA   )rœ   r   r¬   r&   r'   r"   r   r   rj   r‘   r5   r   rU   r   r7   )r   r£   r¤   r   r   r   Útest_wrap_future_cancel2Õ  s    

z(BaseFutureTests.test_wrap_future_cancel2c             C   sZ   | j  d¡ | j| j d}t ¡ jd }|  |jt¡ |  	|jd d d… t
|df¡ d S )NT)r"   r4   éþÿÿÿé   Útest_future_source_traceback)r"   rt   r1   ÚsysÚ	_getframeÚf_linenor[   ru   ÚlistrU   Ú__file__)r   Úfuturerp   r   r   r   r±   ß  s    z,BaseFutureTests.test_future_source_tracebackc       	      C   sÈ   | j  |¡ dd„ }|ƒ }| j| j d}| |¡ d }t | j ¡ t ¡  tj	dkrˆd| j
j› d}t|ƒ||jf}|jjtj|d nd}|jjtjd	d |jjd
 d
 }|  |t |tj¡¡ d S )Nc           
   S   s2   y
t ƒ ‚W n" tk
r, }  z| S d } ~ X Y nX d S )N)ÚMemoryErrorÚBaseException)rY   r   r   r   Úmemory_errorî  s    
zLBaseFutureTests.check_future_exception_never_retrieved.<locals>.memory_error)r"   )r°   ri   ú^z exception was never retrieved
)Úexc_infoz,^Future/Task exception was never retrieved\nFr   )r"   rt   r1   r   rj   r‘   r   r’   r²   Úversion_infor.   r   r9   Ú__traceback__r‰   Úassert_called_once_withr   ÚANYÚ	call_argsrv   rl   ÚcompileÚDOTALL)	r   Údebugr‹   rº   rY   r·   Úregexr¼   Úmessager   r   r   Ú&check_future_exception_never_retrievedê  s     

z6BaseFutureTests.check_future_exception_never_retrievedc             C   s   |   d¡ d S )NF)rÇ   )r   r   r   r   Ú%test_future_exception_never_retrieved  s    z5BaseFutureTests.test_future_exception_never_retrievedc             C   s   |   d¡ d S )NT)rÇ   )r   r   r   r   Ú+test_future_exception_never_retrieved_debug  s    z;BaseFutureTests.test_future_exception_never_retrieved_debugc             C   s4   | j | jd}| ¡  t |d¡ |  | ¡ ¡ d S )N)r"   é   )r1   r"   r   r   Ú_set_result_unless_cancelledr7   r   )r   rQ   r   r   r   Ú test_set_result_unless_cancelled  s    z0BaseFutureTests.test_set_result_unless_cancelledc          
   C   sz   | j | jd}| d¡ | ¡ }d }y| d ¡ W n, tk
r^ } z|jd }W d d }~X Y nX |  d¡ |  |d¡ d S )N)r"   )r4   rÊ   r   zStopIteration was expected)	r1   r"   r   r   ÚsendrX   r/   ÚfailrU   )r   rQ   Úfir   r¢   r   r   r   Útest_future_stop_iteration_args  s    

z/BaseFutureTests.test_future_stop_iteration_argsc             C   s\   | j | jd}t|ƒ}|  t|jttdƒd¡ |  t|jtdƒtdƒ¡ |  t|jt¡ d S )N)r"   Zelephanté    )r1   r"   rP   rB   rC   ÚthrowrK   rµ   )r   rQ   rÏ   r   r   r   Útest_future_iter_throw  s    

z&BaseFutureTests.test_future_iter_throwc             C   s>   G dd„ dƒ}x*t dƒD ]}| j| jd}| |ƒ ¡ qW d S )Nc               @   s   e Zd Zdd„ ZdS )z5BaseFutureTests.test_future_del_collect.<locals>.Evilc             S   s   t  ¡  d S )N)ÚgcÚcollect)r   r   r   r   Ú__del__)  s    z=BaseFutureTests.test_future_del_collect.<locals>.Evil.__del__N)r   r   r   rÖ   r   r   r   r   ÚEvil(  s   r×   éd   )r"   )rw   r1   r"   r   )r   r×   r{   rQ   r   r   r   Útest_future_del_collect'  s    z'BaseFutureTests.test_future_del_collect)*r   r   r   r1   r    r:   r;   r@   rD   rR   rT   rV   rZ   r\   rd   r}   r€   r…   rˆ   r   r¨   rŒ   r   rŽ   r   r“   r”   r•   r)   r§   r«   r­   r®   r±   rÇ   rÈ   rÉ   rÌ   rÐ   rÓ   rÙ   r,   r   r   )r%   r   r-   b   sH   4E	
	r-   Ú_CFuturezrequires the C _asyncio modulec               @   s8   e Zd Zy
ejZW n ek
r*   dZY nX dd„ ZdS )ÚCFutureTestsNc          	   C   sF   | j | jd}|  t¡
 |`W d Q R X |  t¡
 |`W d Q R X d S )N)r"   )r1   r"   rB   rJ   r   r‡   )r   rQ   r   r   r   Útest_future_del_segfault9  s
    z%CFutureTests.test_future_del_segfault)r   r   r   r   rÚ   r.   rJ   rÜ   r   r   r   r   rÛ   1  s
   

rÛ   c               @   s@   e Zd ZyG dd„ dejƒZeZW n ek
r:   dZY nX dS )ÚCSubFutureTestsc               @   s   e Zd ZdS )zCSubFutureTests.CSubFutureN)r   r   r   r   r   r   r   Ú
CSubFutureE  s   rÞ   N)r   r   r   r   rÚ   rÞ   r.   rJ   r   r   r   r   rÝ   A  s
   rÝ   c               @   s   e Zd ZejZdS )ÚPyFutureTestsN)r   r   r   r   Ú	_PyFuturer.   r   r   r   r   rß   M  s   rß   c                   s|   e Zd Z‡ f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‡  ZS )ÚBaseFutureDoneCallbackTestsc                s   t ƒ  ¡  |  ¡ | _d S )N)r   r    r!   r"   )r   )r%   r   r   r    S  s    
z!BaseFutureDoneCallbackTests.setUpc             C   s   t  | j¡ d S )N)rj   r‘   r"   )r   r   r   r   r‘   W  s    z'BaseFutureDoneCallbackTests.run_brieflyc                s   ‡ ‡fdd„}|S )Nc                s   ˆ   ˆ¡ d S )N)Úappend)r·   )ÚbagÚthingr   r   Úbag_appender\  s    z@BaseFutureDoneCallbackTests._make_callback.<locals>.bag_appenderr   )r   rã   rä   rå   r   )rã   rä   r   Ú_make_callbackZ  s    z*BaseFutureDoneCallbackTests._make_callbackc             C   s   t ‚d S )N)ÚNotImplementedError)r   r   r   r   r1   `  s    z'BaseFutureDoneCallbackTests._new_futurec             C   s¤   g }|   ¡ }|  |d¡}|  |d¡}|  |d¡}| |¡ | |¡ | |¡ | |¡ | |¡ |  |g ¡ | d¡ |  ¡  |  |ddg¡ |  | ¡ d¡ d S )NrA   é   rØ   Úfoo)r1   ræ   rL   rM   rU   r   r‘   r   )r   rã   r   Úcb1Úcb2Úcb3r   r   r   Ú$test_callbacks_remove_first_callbackc  s    





z@BaseFutureDoneCallbackTests.test_callbacks_remove_first_callbackc             C   s¬   g }|   ¡ }|  |d¡}|  |d¡}|  |d¡}| |¡ | |¡ | |¡ | |¡ | |¡ | |¡ |  |g ¡ | d¡ |  ¡  |  |dg¡ |  | ¡ d¡ d S )NrA   rè   rØ   ré   )r1   ræ   rL   rM   rU   r   r‘   r   )r   rã   r   rê   rë   rì   r   r   r   Ú/test_callbacks_remove_first_and_second_callbackz  s     






zKBaseFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callbackc             C   s¤   g }|   ¡ }|  |d¡}|  |d¡}|  |d¡}| |¡ | |¡ | |¡ | |¡ | |¡ |  |g ¡ | d¡ |  ¡  |  |ddg¡ |  | ¡ d¡ d S )NrA   rè   rØ   ré   )r1   ræ   rL   rM   rU   r   r‘   r   )r   rã   r   rê   rë   rì   r   r   r   Ú$test_callbacks_remove_third_callback’  s    





z@BaseFutureDoneCallbackTests.test_callbacks_remove_third_callbackc             C   sr   g }|   ¡ }| |  |d¡¡ | |  |d¡¡ |  |g ¡ | d¡ |  ¡  |  |ddg¡ |  | ¡ d¡ d S )NrA   rè   ré   )r1   rL   ræ   rU   r   r‘   r   )r   rã   r   r   r   r   Ú$test_callbacks_invoked_on_set_result©  s    
z@BaseFutureDoneCallbackTests.test_callbacks_invoked_on_set_resultc             C   sd   g }|   ¡ }| |  |d¡¡ |  |g ¡ tƒ }| |¡ |  ¡  |  |dg¡ |  | ¡ |¡ d S )NrØ   )r1   rL   ræ   rU   rI   r   r‘   r   )r   rã   r   rY   r   r   r   Ú'test_callbacks_invoked_on_set_exception·  s    
zCBaseFutureDoneCallbackTests.test_callbacks_invoked_on_set_exceptionc             C   sà   g }|   ¡ }|  |d¡}|  |d¡}|  |d¡}| |¡ | |¡ |  | |¡d¡ |  | |¡d¡ | |¡ xtdƒD ]}| |¡ q|W |  | |¡d¡ |  |g ¡ | d¡ |  ¡  |  |dg¡ |  | ¡ d¡ d S )Nr4   rÊ   r°   r   é   é   ré   )	r1   ræ   rL   rU   rM   rw   r   r‘   r   )r   rã   r   rê   rë   rì   r{   r   r   r   Útest_remove_done_callbackÅ  s$    



z5BaseFutureDoneCallbackTests.test_remove_done_callbackc                sP   |   ¡ ‰ ˆ  t¡ xtdƒD ]}ˆ  t¡ qW G ‡ fdd„dƒ}ˆ  |ƒ ¡ d S )Né?   c                   s   e Zd Z‡ fdd„ZdS )zRBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation.<locals>.evilc                s   ˆ   t¡ dS )NF)rM   Úid)r   Úother)rQ   r   r   Ú__eq__ð  s    
zYBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation.<locals>.evil.__eq__N)r   r   r   rø   r   )rQ   r   r   Úevilï  s   rù   )r1   rL   Ústrrw   rö   rM   )r   Ú_rù   r   )rQ   r   Ú(test_remove_done_callbacks_list_mutationæ  s    
zDBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutationc             C   sH   dd„ }|   ¡ }| |¡ | t¡ | t¡ | d¡ t | j¡ d S )Nc             S   s   |   t¡ d S )N)rM   rú   )r   r   r   r   Úmutù  s    zPBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1.<locals>.mutr4   )r1   rL   rú   r   rj   r‘   r"   )r   rý   rQ   r   r   r   Ú'test_schedule_callbacks_list_mutation_1ö  s    



zCBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1c                s\   |   ¡ ‰ˆ t¡ xtdƒD ]}ˆ t¡ qW d‰d‰ G ‡ ‡‡fdd„dƒ}ˆ |ƒ ¡ d S )Nrõ   rØ   r   c                   s   e Zd Z‡ ‡‡fdd„ZdS )zQBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2.<locals>.evilc                s   ˆ d7 ‰ ˆ ˆk rˆ  t¡ dS )Nr4   F)rL   rö   )r   r÷   )Ú	extra_cbsrQ   Úmax_extra_cbsr   r   rø     s    
zXBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2.<locals>.evil.__eq__N)r   r   r   rø   r   )rÿ   rQ   r   r   r   rù     s   rù   )r1   rL   rú   rw   rö   rM   )r   rû   rù   r   )rÿ   rQ   r   r   Ú'test_schedule_callbacks_list_mutation_2  s    
zCBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2)r   r   r   r    r‘   ræ   r1   rí   rî   rï   rð   rñ   rô   rü   rþ   r  r,   r   r   )r%   r   rá   Q  s   !rá   c               @   s   e Zd Zdd„ ZdS )ÚCFutureDoneCallbackTestsc             C   s   t j| jdS )N)r"   )r   rÚ   r"   )r   r   r   r   r1     s    z$CFutureDoneCallbackTests._new_futureN)r   r   r   r1   r   r   r   r   r    s   r  c               @   s   e Zd Zdd„ ZdS )ÚCSubFutureDoneCallbackTestsc             C   s   G dd„ dt jƒ}|| jdS )Nc               @   s   e Zd ZdS )z;CSubFutureDoneCallbackTests._new_future.<locals>.CSubFutureN)r   r   r   r   r   r   r   rÞ   )  s   rÞ   )r"   )r   rÚ   r"   )r   rÞ   r   r   r   r1   (  s    z'CSubFutureDoneCallbackTests._new_futureN)r   r   r   r1   r   r   r   r   r  #  s   r  c               @   s   e Zd Zdd„ ZdS )ÚPyFutureDoneCallbackTestsc             C   s   t j| jdS )N)r"   )r   rà   r"   )r   r   r   r   r1   1  s    z%PyFutureDoneCallbackTests._new_futureN)r   r   r   r1   r   r   r   r   r  .  s   r  Ú__main__)"Ú__doc__Zconcurrent.futuresrœ   rÔ   rl   r²   r–   Úunittestr   r&   r   Ztest.test_asyncior   rj   r„   r   r	   r
   r   r   ÚTestCaser   r-   Ú
skipUnlessÚhasattrrÛ   rÝ   rß   rá   r  r  r  r   Úmainr   r   r   r   Ú<module>   sR   3   R
 J


