B
    v9aBe  ã               @   s’  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 )#é    N)Úmock)Úfutures)Úutils)Úsupportc             C   s   | S )N© )Úfr   r   ú"/usr/lib/python3.7/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   | j d k	r| j ‚| jS )N)r   r   )r   r   r   r   Úresult4   s    
zDuckFuture.resultc             C   s   | j S )N)r   )r   r   r   r   Ú	exception:   s    zDuckFuture.exceptionc             C   s
   || _ d S )N)r   )r   r   r   r   r   Ú
set_result>   s    zDuckFuture.set_resultc             C   s
   || _ d S )N)r   )r   r   r   r   r   Úset_exceptionC   s    zDuckFuture.set_exceptionc             c   s   |   ¡ sd| _| V  |  ¡ S )NT)r   Ú_asyncio_future_blockingr   )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 |¡}d S )N)r   ÚasyncioÚwrap_future)r   r   Úgr   r   r   Útest_wrap_futureW   s    
zDuckTests.test_wrap_futurec             C   s   t ƒ }t |¡}d S )N)r   r%   Zensure_future)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   r0   r   r   r   r   ÚMyFuturem   s   r1   é   )r!   )
ÚassertFalser%   ÚisfutureÚ
assertTruer   ZMockr/   r!   Útyper   )r   r1   r   r   r   r   Útest_isfuturel   s    zBaseFutureTests.test_isfuturec             C   sD   | j | jd}|  | ¡ ¡ |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)r!   )r/   r!   r3   r   r   r   r5   )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%   Zset_event_loopr!   r/   ÚassertIsÚ_loopZ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Ú	TypeErrorr/   )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   r@   °   rA   )r,   Ú__new__r!   r=   r%   ÚInvalidStateErrorr   r   ÚRuntimeErrorÚAttributeErrorr   r   Ú	Exceptionr   Úadd_done_callbackÚremove_done_callbackÚreprÚ	__await__Úiterr3   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!   )r/   r!   r5   r   r   r   r=   r%   ZCancelledErrorr   r   rC   r   r   r3   )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!   r<   )r/   r!   r=   r%   rC   r   r   r3   r   r5   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)rD   r/   r!   r=   r%   rC   r   ÚassertRaisesRegexr>   r   ÚStopIterationr3   r   r5   r   r   rO   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!   )r/   r!   r   rD   Ú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>.fixturerW   r<   )rX   r<   )rY   r<   )r/   r!   rO   Únextr   )r   r\   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   ú:r2   ú>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_utilsZ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_debugr/   Ú_source_tracebackrO   rI   r,   r   r   r   r   rD   r   r9   r   rG   r	   ÚassertRegexr
   r   Úrange)r   Zf_pending_debugÚframeZ	f_pendingÚf_cancelledZf_resultrS   Úf_exceptionrk   Zf_one_callbacksZ	fake_reprZf_two_callbacksZ
first_reprZ	last_reprZf_many_callbacksÚiZ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.futuresrv   r/   r!   r   r5   r   rO   r   r   rD   r=   r   r   )r   rv   r   Znewfrs   Znewf_exceptionrr   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   )rL   r   r   Úcorok  s    z'BaseFutureTests.test_iter.<locals>.coroc                 s   ˆ ƒ \} }d S )Nr   )Zarg1Zarg2)ry   r   r   Útestn  s    z'BaseFutureTests.test_iter.<locals>.testzawait wasn't used)r/   r!   rQ   rD   r   )r   rz   r   )ry   rL   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)r/   r!   rQ   Ú
ValueErrorÚ_log_traceback)r   rL   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!   )r/   r!   r3   ÚerrorÚcalled)r   Úm_logrL   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!   )r/   r!   r   rF   r   r3   r   r€   )r   r   rL   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!   r<   )r/   r!   r   r3   r   r€   )r   r   rL   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!   r<   )r/   r!   r   r   r3   r   r€   )r   r   rL   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)r/   r!   r   rD   rd   Úrun_brieflyr   Ú
gc_collectr5   r   r€   )r   r   rL   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†   )r/   r!   r   rD   r   r3   r   r€   )r   r   rL   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†   )	r/   r!   r   rD   r=   r   r3   r   r€   )r   r   rL   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>.runr2   Úoi)r!   T)Úwait)Ú
concurrentr   ÚThreadPoolExecutorÚsubmitr%   r&   r!   Zrun_until_completer5   r4   rO   ZassertNotEqualrŒ   r   Úshutdown)r   r   ÚexÚf1Úf2ZresZidentr   r   r   r(   °  s    z BaseFutureTests.test_wrap_futurec             C   s(   | j | jd}t |¡}|  ||¡ d S )N)r!   )r/   r!   r%   r&   r9   )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   r@   Ä  rA   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>.runr2   r   T)r‘   )r   ÚpatchZget_event_loopr’   r   r“   r”   r%   r&   r9   r!   r:   r•   )r   Z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   rd   r‡   r5   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!   r<   )r’   r   rœ   r%   r&   r!   r   r   rd   r‡   r3   r   rO   r   r5   )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!   r2   éþÿÿÿé   Útest_future_source_traceback)r!   rm   r/   ÚsysÚ	_getframeÚf_linenorU   rn   ÚlistrO   Ú__file__)r   Úfutureri   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)rS   r   r   r   Úmemory_errorî  s    
zLBaseFutureTests.check_future_exception_never_retrieved.<locals>.memory_error)r!   )r    rc   ú^z exception was never retrieved
)Úexc_infoz,^Future/Task exception was never retrieved\nFr   )r!   rm   r/   r   rd   r‡   r   rˆ   r¢   Úversion_infor,   r   r6   Ú__traceback__r   Zassert_called_once_withr   ÚANYÚ	call_argsro   re   ÚcompileÚDOTALL)	r   Údebugr   rª   rS   r§   Z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!   é   )r/   r!   r   r   Z_set_result_unless_cancelledr5   r   )r   rL   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!   )r2   r¸   r   zStopIteration was expected)	r/   r!   r   r   ÚsendrR   r-   ZfailrO   )r   rL   Ú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é    )r/   r!   rK   r=   r>   ÚthrowrF   r¥   )r   rL   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)ÚgcZ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!   )rp   r/   r!   r   )r   rÂ   rt   rL   r   r   r   Útest_future_del_collect'  s    z'BaseFutureTests.test_future_del_collect)*r   r   r   r/   r   r7   r8   r;   r?   rM   rN   rP   rT   rV   r^   ru   rx   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!   )r/   r!   r=   rE   r   r}   )r   rL   r   r   r   Útest_future_del_segfault9  s
    z%CFutureTests.test_future_del_segfault)r   r   r   r   rÅ   r,   rE   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,   rE   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)rd   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   r/   `  s    z'BaseFutureDoneCallbackTests._new_futurec             C   s¤   g }|   ¡ }|  |d¡}|  |d¡}|  |d¡}| |¡ | |¡ | |¡ | |¡ | |¡ |  |g ¡ | d¡ |  ¡  |  |ddg¡ |  | ¡ d¡ d S )Nr<   é   rÃ   Úfoo)r/   rÑ   rG   rH   rO   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 )Nr<   rÓ   rÃ   rÔ   )r/   rÑ   rG   rH   rO   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 )Nr<   rÓ   rÃ   rÔ   )r/   rÑ   rG   rH   rO   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 )Nr<   rÓ   rÔ   )r/   rG   rÑ   rO   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Ã   )r/   rG   rÑ   rO   rD   r   r‡   r   )r   rÎ   r   rS   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 )Nr2   r¸   r    r   é   é   rÔ   )	r/   rÑ   rG   rO   rH   rp   r   r‡   r   )r   rÎ   r   rÕ   rÖ   r×   rt   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)rH   Úid)r   Úother)rL   r   r   Ú__eq__ð  s    
zYBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation.<locals>.evil.__eq__N)r   r   r   rã   r   )rL   r   r   Úevilï  s   rä   )r/   rG   Ústrrp   rá   rH   )r   Ú_rä   r   )rL   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)rH   rå   )r   r   r   r   Úmutù  s    zPBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1.<locals>.mutr2   )r/   rG   rå   r   rd   r‡   r!   )r   rè   rL   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 )Nr2   F)rG   rá   )r   râ   )Ú	extra_cbsrL   Úmax_extra_cbsr   r   rã     s    
zXBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2.<locals>.evil.__eq__N)r   r   r   rã   r   )rê   rL   rë   r   r   rä     s   rä   )r/   rG   rå   rp   rá   rH   )r   ræ   rä   r   )rê   rL   rë   r   Ú'test_schedule_callbacks_list_mutation_2  s    
zCBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2)r   r   r   r   r‡   rÑ   r/   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   r/     s    z$CFutureDoneCallbackTests._new_futureN)r   r   r   r/   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   r/   (  s    z'CSubFutureDoneCallbackTests._new_futureN)r   r   r   r/   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   r/   1  s    z%PyFutureDoneCallbackTests._new_futureN)r   r   r   r/   r   r   r   r   rï   .  s   rï   Ú__main__)!Úconcurrent.futuresr’   rÀ   re   r¢   rŒ   Zunittestr   r%   r   Ztest.test_asyncior   rd   rz   r   r	   r
   r   r   ZTestCaser   r+   Z
skipUnlessÚhasattrrÆ   rÈ   rÊ   rÌ   rí   rî   rï   r   Úmainr   r   r   r   Ú<module>   sP   3   R
 J


