B
    v9aBe  ã               @   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   ú"/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"   |   ¡ 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&   Z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   r1   r   r   r   r   ÚMyFuturem   s   r2   é   )r"   )
ÚassertFalser&   ÚisfutureÚ
assertTruer   ZMockr0   r"   Útyper   )r   r2   r   r   r   r   Útest_isfuturel   s    zBaseFutureTests.test_isfuturec             C   sD   | j | jd}|  | ¡ ¡ |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)r"   )r0   r"   r4   r   r   r   r6   )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"   r0   Ú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Ú	TypeErrorr0   )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   rA   °   rB   )r-   Ú__new__r"   r>   r&   ÚInvalidStateErrorr   r   ÚRuntimeErrorÚAttributeErrorr   r   Ú	Exceptionr   Úadd_done_callbackÚremove_done_callbackÚreprÚ	__await__Úiterr4   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"   )r0   r"   r6   r   r   r   r>   r&   ZCancelledErrorr   r   rD   r   r   r4   )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=   )r0   r"   r>   r&   rD   r   r   r4   r   r6   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)rE   r0   r"   r>   r&   rD   r   ÚassertRaisesRegexr?   r   ÚStopIterationr4   r   r6   r   r   rP   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"   )r0   r"   r   rE   Ú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>.fixturerX   r=   )rY   r=   )rZ   r=   )r0   r"   rP   Ú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   ú:r3   ú>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_debugr0   Ú_source_tracebackrP   rJ   r-   r   r   r   r   rE   r   r:   r   rH   r	   ÚassertRegexr
   r   Úrange)r   Zf_pending_debugÚframeZ	f_pendingÚf_cancelledZf_resultrT   Úf_exceptionrl   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.futuresrw   r0   r"   r   r6   r   rP   r   r   rE   r>   r   r   )r   rw   r   Znewfrt   Znewf_exceptionrs   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   )rM   r   r   Úcorok  s    z'BaseFutureTests.test_iter.<locals>.coroc                 s   ˆ ƒ \} }d S )Nr   )Zarg1Zarg2)rz   r   r   Útestn  s    z'BaseFutureTests.test_iter.<locals>.testzawait wasn't used)r0   r"   rR   rE   r   )r   r{   r   )rz   rM   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)r0   r"   rR   Ú
ValueErrorÚ_log_traceback)r   rM   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"   )r0   r"   r4   ÚerrorÚcalled)r   Úm_logrM   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"   )r0   r"   r   rG   r   r4   r€   r   )r   r‚   rM   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=   )r0   r"   r   r4   r€   r   )r   r‚   rM   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=   )r0   r"   r   r   r4   r€   r   )r   r‚   rM   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)r0   r"   r   rE   re   Úrun_brieflyr   Ú
gc_collectr6   r€   r   )r   r‚   rM   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‡   )r0   r"   r   rE   r   r4   r€   r   )r   r‚   rM   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‡   )	r0   r"   r   rE   r>   r   r4   r€   r   )r   r‚   rM   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>.runr3   Úoi)r"   T)Úwait)Ú
concurrentr   ÚThreadPoolExecutorÚsubmitr&   r'   r"   Zrun_until_completer6   r5   rP   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"   )r0   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   rA   Ä  rB   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>.runr3   r‘   T)r’   )r   ÚpatchZget_event_loopr“   r   r”   r•   r&   r'   r:   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   re   rˆ   r6   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   re   rˆ   r4   r   rP   r   r6   )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"   r3   éþÿÿÿé   Útest_future_source_traceback)r"   rn   r0   ÚsysÚ	_getframeÚf_linenorV   ro   ÚlistrP   Ú__file__)r   Úfuturerj   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)rT   r   r   r   Úmemory_errorî  s    
zLBaseFutureTests.check_future_exception_never_retrieved.<locals>.memory_error)r"   )r¡   rd   ú^z exception was never retrieved
)Úexc_infoz,^Future/Task exception was never retrieved\nFr   )r"   rn   r0   r   re   rˆ   r   r‰   r£   Úversion_infor-   r   r7   Ú__traceback__r€   Zassert_called_once_withr   ÚANYÚ	call_argsrp   rf   ÚcompileÚDOTALL)	r   Údebugr‚   r«   rT   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"   é   )r0   r"   r   r   Z_set_result_unless_cancelledr6   r   )r   rM   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"   )r3   r¹   r   zStopIteration was expected)	r0   r"   r   r   ÚsendrS   r.   ZfailrP   )r   rM   Ú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é    )r0   r"   rL   r>   r?   ÚthrowrG   r¦   )r   rM   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"   )rq   r0   r"   r   )r   rÃ   ru   rM   r   r   r   Útest_future_del_collect'  s    z'BaseFutureTests.test_future_del_collect)*r   r   r   r0   r    r8   r9   r<   r@   rN   rO   rQ   rU   rW   r_   rv   ry   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"   )r0   r"   r>   rF   r   r~   )r   rM   r   r   r   Útest_future_del_segfault9  s
    z%CFutureTests.test_future_del_segfault)r   r   r   r   rÆ   r-   rF   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-   rF   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)re   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   r0   `  s    z'BaseFutureDoneCallbackTests._new_futurec             C   s¤   g }|   ¡ }|  |d¡}|  |d¡}|  |d¡}| |¡ | |¡ | |¡ | |¡ | |¡ |  |g ¡ | d¡ |  ¡  |  |ddg¡ |  | ¡ d¡ d S )Nr=   é   rÄ   Úfoo)r0   rÒ   rH   rI   rP   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Õ   )r0   rÒ   rH   rI   rP   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Õ   )r0   rÒ   rH   rI   rP   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Õ   )r0   rH   rÒ   rP   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Ä   )r0   rH   rÒ   rP   rE   r   rˆ   r   )r   rÏ   r   rT   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 )Nr3   r¹   r¡   r   é   é   rÕ   )	r0   rÒ   rH   rP   rI   rq   r   rˆ   r   )r   rÏ   r   rÖ   r×   rØ   ru   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)rI   Úid)r   Úother)rM   r   r   Ú__eq__ð  s    
zYBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation.<locals>.evil.__eq__N)r   r   r   rä   r   )rM   r   r   Úevilï  s   rå   )r0   rH   Ústrrq   râ   rI   )r   Ú_rå   r   )rM   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)rI   ræ   )r   r   r   r   Úmutù  s    zPBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1.<locals>.mutr3   )r0   rH   ræ   r   re   rˆ   r"   )r   ré   rM   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 )Nr3   F)rH   râ   )r   rã   )Ú	extra_cbsrM   Úmax_extra_cbsr   r   rä     s    
zXBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2.<locals>.evil.__eq__N)r   r   r   rä   r   )rë   rM   rì   r   r   rå     s   rå   )r0   rH   ræ   rq   râ   rI   )r   rç   rå   r   )rë   rM   rì   r   Ú'test_schedule_callbacks_list_mutation_2  s    
zCBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2)r   r   r   r    rˆ   rÒ   r0   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   r0     s    z$CFutureDoneCallbackTests._new_futureN)r   r   r   r0   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   r0   (  s    z'CSubFutureDoneCallbackTests._new_futureN)r   r   r   r0   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   r0   1  s    z%PyFutureDoneCallbackTests._new_futureN)r   r   r   r0   r   r   r   r   rð   .  s   rð   Ú__main__)"Ú__doc__Úconcurrent.futuresr“   rÁ   rf   r£   r   Zunittestr   r&   r   Ztest.test_asyncior   re   r{   r   r	   r
   r   r   ZTestCaser   r,   Z
skipUnlessÚhasattrrÇ   rÉ   rË   rÍ   rî   rï   rð   r   Úmainr   r   r   r   Ú<module>   sR   3   R
 J


