B
    v9a                 @   s`   d dl Z d dlZd dlmZ ddlmZ G dd de jZG dd dejZ	G d	d
 d
e	Z
dS )    N)mock   )utilsc               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

TestPolicyc             C   s   || _ d | _d S )N)loop_factoryloop)selfr    r	   "/usr/lib/python3.7/test_runners.py__init__
   s    zTestPolicy.__init__c             C   s   t d S )N)RuntimeError)r   r	   r	   r
   get_event_loop   s    zTestPolicy.get_event_loopc             C   s   |   S )N)r   )r   r	   r	   r
   new_event_loop   s    zTestPolicy.new_event_loopc             C   s   |d k	r|| _ d S )N)r   )r   r   r	   r	   r
   set_event_loop   s    zTestPolicy.set_event_loopN)__name__
__module____qualname__r   r   r   r   r	   r	   r	   r
   r      s   r   c                   s0   e Zd Zdd Z fddZ fddZ  ZS )BaseTestc                sB   t   t  _t  _d jj_d _ fdd}| _	 S )Nr	   Fc                  s
   d _ d S )NT)shutdown_ag_runr	   )r   r	   r
   shutdown_asyncgens%   s    z-BaseTest.new_loop.<locals>.shutdown_asyncgens)
asyncioZBaseEventLoopr   MockZ_process_eventsZ	_selectorZselectZreturn_valuer   r   )r   r   r	   )r   r
   new_loop   s    


zBaseTest.new_loopc                s"   t    t| j}t| d S )N)supersetUpr   r   r   set_event_loop_policy)r   policy)	__class__r	   r
   r   +   s    

zBaseTest.setUpc                sH   t  }|jd k	r0| |j  | |jj t d  t   d S )N)	r   Zget_event_loop_policyr   
assertTrueZ	is_closedr   r   r   tearDown)r   r   )r   r	   r
   r   1   s    

zBaseTest.tearDown)r   r   r   r   r   r   __classcell__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 )RunTestsc             C   s    dd }|  t| d d S )Nc                  s   t dI d H  dS )Nr   *   )r   sleepr	   r	   r	   r
   main>   s    z.RunTests.test_asyncio_run_return.<locals>.mainr"   )assertEqualr   run)r   r$   r	   r	   r
   test_asyncio_run_return=   s    z RunTests.test_asyncio_run_returnc          	   C   s0   dd }|  td t|  W d Q R X d S )Nc                  s   t dI d H  tdd S )Nr   spam)r   r#   
ValueErrorr	   r	   r	   r
   r$   E   s    z.RunTests.test_asyncio_run_raises.<locals>.mainr(   )assertRaisesRegexr)   r   r&   )r   r$   r	   r	   r
   test_asyncio_run_raisesD   s    z RunTests.test_asyncio_run_raisesc             C   sT   xNddd hD ]>}| j |d( | td t| W d Q R X W d Q R X qW d S )Nr   c               S   s   d S )Nr	   r	   r	   r	   r
   <lambda>M       z5RunTests.test_asyncio_run_only_coro.<locals>.<lambda>)objza coroutine was expected)ZsubTestr*   r)   r   r&   )r   or	   r	   r
   test_asyncio_run_only_coroL   s
    z#RunTests.test_asyncio_run_only_coroc                s0    fdd}t |d t j|ddd d S )Nc                s   t  } | |  d S )N)r   r   ZassertIsZ	get_debug)Zexpectedr   )r   r	   r
   r$   T   s    z-RunTests.test_asyncio_run_debug.<locals>.mainFT)debug)r   r&   )r   r$   r	   )r   r
   test_asyncio_run_debugS   s    zRunTests.test_asyncio_run_debugc          	      s4    fdd |  td t   W d Q R X d S )Nc                 s$     } zt |  W d |   X d S )N)r   r&   close)coro)r$   r	   r
   r$   \   s    z9RunTests.test_asyncio_run_from_running_loop.<locals>.mainzcannot be called from a running)r*   r   r   r&   )r   r	   )r$   r
   "test_asyncio_run_from_running_loop[   s    z+RunTests.test_asyncio_run_from_running_loopc                s@   d dd   fdd}|  t| d |   d S )Nc                  s   t dI d H  d S )Ng?)r   r#   r	   r	   r	   r
   leftoverj   s    zARunTests.test_asyncio_run_cancels_hanging_tasks.<locals>.leftoverc                  s   t   dS )N{   )r   create_taskr	   )r6   lo_taskr	   r
   r$   m   s    z=RunTests.test_asyncio_run_cancels_hanging_tasks.<locals>.mainr7   )r%   r   r&   r   done)r   r$   r	   )r6   r9   r
   &test_asyncio_run_cancels_hanging_tasksg   s
    z/RunTests.test_asyncio_run_cancels_hanging_tasksc                sh   d t   dd  fdd}| t| d |    t	dt
td d S )Nc                  s8   yt dI d H  W n t jk
r2   dd  Y nX d S )Ng?r   r   )r   r#   CancelledErrorr	   r	   r	   r
   r6   y   s    zHRunTests.test_asyncio_run_reports_hanging_tasks_errors.<locals>.leftoverc                 s   t  }  | _t  dS )Nr7   )r   get_running_loopcall_exception_handlerr8   )r   )call_exc_handler_mockr6   r9   r	   r
   r$      s    zDRunTests.test_asyncio_run_reports_hanging_tasks_errors.<locals>.mainr7   zasyncio.run.*shutdown)messageZtaskZ	exception)r   r   r%   r   r&   r   r:   Zassert_called_with
test_utilsZMockPatternZMockInstanceOfZeroDivisionError)r   r$   r	   )r?   r6   r9   r
   -test_asyncio_run_reports_hanging_tasks_errorsu   s    z6RunTests.test_asyncio_run_reports_hanging_tasks_errorsc          	      s   d d G dd dt  dd fdd fdd}|   t|  W d Q R X |   | j | j	 d S )	Nc               @   s   e Zd ZdS )zSRunTests.test_asyncio_run_closes_gens_after_hanging_tasks_errors.<locals>.FancyExitN)r   r   r   r	   r	   r	   r
   	FancyExit   s   rD   c               S  s    xdV  t dI d H  qW d S )Nr   )r   r#   r	   r	   r	   r
   fidget   s    zPRunTests.test_asyncio_run_closes_gens_after_hanging_tasks_errors.<locals>.fidgetc           	      sZ     y0x*2 y3 d H } W q t k
s(X q   Y  W W n tjk
rT   dd  Y nX d S )Nr   r   )StopAsyncIterationr   r<   )Zthe_meaning_of_life)rE   spinnerr	   r
   spin   s    zNRunTests.test_asyncio_run_closes_gens_after_hanging_tasks_errors.<locals>.spinc                 s&   t  } t | _t   d S )N)r   r=   r   r   r>   r8   )r   )rD   lazyboyrH   r	   r
   r$      s    
zNRunTests.test_asyncio_run_closes_gens_after_hanging_tasks_errors.<locals>.main)
	ExceptionZassertRaisesr   r&   r   r:   ZassertIsNoneag_frameZassertFalse
ag_running)r   r$   r	   )rD   rE   rI   rH   rG   r
   7test_asyncio_run_closes_gens_after_hanging_tasks_errors   s    	z@RunTests.test_asyncio_run_closes_gens_after_hanging_tasks_errorsN)r   r   r   r'   r+   r0   r2   r5   r;   rC   rM   r	   r	   r	   r
   r!   ;   s   r!   )r   Zunittestr    r   rA   ZAbstractEventLoopPolicyr   ZTestCaser   r!   r	   r	   r	   r
   <module>   s   