
    Yf                         d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ  G d d	e          Z G d
 de          ZdS )z*
Tests for C{await} support in Deferreds.
    N)NoReturn)DeferredensureDeferredfailmaybeDeferredsucceed)Clock)Failure)TestCasec                       e Zd ZdZdS )SampleExceptionz2
    A specific sample exception for testing.
    N)__name__
__module____qualname____doc__     X/var/www/html/env/lib/python3.11/site-packages/twisted/internet/test/test_defer_await.pyr   r      s           r   r   c                   b    e 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dZddZdS )
AwaitTestsz@
    Tests for using Deferreds in conjunction with PEP-492.
    returnNc                     t                      }|                                }|                     |t          |                     dS )z<
        C{Deferred.__await__} returns an iterable.
        N)r   	__await__assertEqualiter)selfdawaitedDeferreds      r   test_awaitReturnsIterablez$AwaitTests.test_awaitReturnsIterable$   s>     %JJ++--$*?*?@@@@@r   c                 @   dt           ffd}dt           fd |            }|                     |t          j                   t	          j        |          }|                     |t                     |                     |          }|                     |d           dS )zU
        L{Deferred.fromCoroutine} will turn a coroutine into a L{Deferred}.
        r   c                  Z   K   t          d          } |  d {V                d {V }|S )Nbarr   )r   resrun2s     r   runz2AwaitTests.test_deferredFromCoroutine.<locals>.run1   s?      AGGGGGGG,,,,,,CJr   c                  8   K   t          d          } |  d {V }|S Nfoor#   r   r$   s     r   r%   z3AwaitTests.test_deferredFromCoroutine.<locals>.run27   '      A''''''CJr   r)   N)strassertIsInstancetypesCoroutineTyper   fromCoroutinesuccessResultOfr   )r   r&   rr   r$   r%   s        @r   test_deferredFromCoroutinez%AwaitTests.test_deferredFromCoroutine,   s    
	3 	 	 	 	 	 		C 	 	 	 	 CEEa!4555 "1%%a*** ""1%%e$$$$$r   c                     dt           fd}t          j         |                      }|                     |          }|                     |d           dS )zc
        L{Deferred.fromCoroutine} allows a function to C{await} on a
        L{Deferred}.
        r   c                  8   K   t          d          } |  d {V }|S r(   r#   r*   s     r   r&   z"AwaitTests.test_basic.<locals>.runN   r+   r   r)   N)r,   r   r0   r1   r   r   r&   r   r$   s       r   
test_basiczAwaitTests.test_basicH   sd    	3 	 	 	 	
 "3355))""1%%e$$$$$r   c                     dt           fd}t           |                      }|                     |          }|                     |d           dS )zS
        L{ensureDeferred} allows a function to C{await} on a L{Deferred}.
        r   c                  8   K   t          d          } |  d {V }|S r(   r#   r*   s     r   r&   z0AwaitTests.test_basicEnsureDeferred.<locals>.run\   r+   r   r)   N)r,   r   r1   r   r6   s       r   test_basicEnsureDeferredz#AwaitTests.test_basicEnsureDeferredW   sa    
	3 	 	 	 	
 3355!!""1%%e$$$$$r   c                    dt           fd}t          j         |                      }|                     |          }|                     t          |j                  t                     |                     |j        j        d           dS )z
        An exception in a coroutine scheduled with L{Deferred.fromCoroutine}
        will cause the returned L{Deferred} to fire with a failure.
        r   c                  R   K   t          d          } |  d {V  t          d          )Nr)   Oh no!)r   
ValueError)r   s    r   r&   z&AwaitTests.test_exception.<locals>.runk   s0      AGGGGGGGX&&&r   )r=   N)	r   r   r0   failureResultOfr   typevaluer>   argsr6   s       r   test_exceptionzAwaitTests.test_exceptione   s    	'8 	' 	' 	' 	'
 "3355))""1%%ci*55555555r   c                 8   dd}t          |          dfd}|                     t          j         |                                }|                     d|                                           |                     d|                                           dS )z
        When a Deferred is awaited upon that has already failed with a Failure
        that has a traceback, both the place that the synchronous traceback
        comes from and the awaiting line are shown in the traceback.
        r   Nc                      t                      N)r   r   r   r   raiseszCAwaitTests.test_synchronousDeferredFailureTraceback.<locals>.raises|   s    !###r   c                     K     d {V S rF   r   its   r   doomedzCAwaitTests.test_synchronousDeferredFailureTraceback.<locals>.doomed         888888Or   , in doomed
z, in raises
r   N)r   r?   r   r0   assertIngetTraceback)r   rG   rK   failurerJ   s       @r   (test_synchronousDeferredFailureTracebackz3AwaitTests.test_synchronousDeferredFailureTracebacku   s    	$ 	$ 	$ 	$ 6""	 	 	 	 	 	 &&x'=ffhh'G'GHHow';';'='=>>>ow';';'='=>>>>>r   c                    dt           fd}t                      dfd}t          j         |                      }|                     |                                |                       |                     |          }|                     d|                                           |                     d|                                           dS )z
        When a Deferred is awaited upon that later fails with a Failure that
        has a traceback, both the place that the synchronous traceback comes
        from and the awaiting line are shown in the traceback.
        r   c                  \    	 t                      # t           $ r t                      cY S w xY wrF   )r   r
   r   r   r   returnsFailurezEAwaitTests.test_asyncDeferredFailureTraceback.<locals>.returnsFailure   s>    !%'''" ! ! !yy   !s    ++Nc                     K     d {V S rF   r   rI   s   r   rK   z=AwaitTests.test_asyncDeferredFailureTraceback.<locals>.doomed   rL   r   rM   z, in returnsFailure
rN   )r
   r   r0   assertNoResulterrbackr?   rO   rP   )r   rU   rK   startedrQ   rJ   s        @r   "test_asyncDeferredFailureTracebackz-AwaitTests.test_asyncDeferredFailureTraceback   s    	! 	! 	! 	! 	! &ZZ	 	 	 	 	 	 (22G$$$


>>##$$$&&w//ow';';'='=>>>-w/C/C/E/EFFFFFr   c                 \   t                      g dt          ffddt          ffd}t          j         |                      }                    d           |                     ddg                               d           |                     g d                               d           |                     g d                               d           |                     g d	           |                     |          }|                     |d
           dS )z
        A coroutine scheduled with L{Deferred.fromCoroutine} that awaits a
        L{Deferred} suspends its execution until the inner L{Deferred} fires.
        r   c                     K                        d           t                      }                     d| j        d           |  d {V                       d           dS )N         Yay!appendr   	callLatercallback)r   reactorsectionss    r   runonez'AwaitTests.test_twoDeep.<locals>.runone   sd      OOA'zzAaQ///GGGGGGGOOA6r   c                    K                        d                         d {V }                      d           t                      }                    d|j        d           | d {V                       d           | S )Nr^         ra   )resultr   re   rg   rf   s     r   r&   z$AwaitTests.test_twoDeep.<locals>.run   s      OOA!688^^^^^^FOOA'zzAaQ///GGGGGGGOOAMr   g?r^   r]   皙?)r^   r]   r_   ri   )r^   r]   r_   ri   rj   r`   N)r	   r,   r   r0   advancer   r1   )r   r&   r   r$   re   rg   rf   s       @@@r   test_twoDeepzAwaitTests.test_twoDeep   se   
 ''	c 	 	 	 	 	 	 		3 	 	 	 	 	 	 	 	 "3355))Aq6***<<<000<<<000???333""1%%f%%%%%r   c                      dt           f fd}                     t          j         |                                }                     |d           dS )zO
        Awaiting an already failed Deferred will raise the exception.
        r   c                     K   	 t          t          d                     d {V  n3# t          $ r&}                     | j        d           Y d } ~ dS d } ~ ww xY wdS )NBoom)rq   r^   r   )r   r>   r   rB   )er   s    r   testz%AwaitTests.test_reraise.<locals>.test   s      :f--..........     333qqqqq 1s   "( 
AAAr^   N)intr1   r   r0   r   )r   rs   r$   s   `  r   test_reraisezAwaitTests.test_reraise   sj    
	C 	 	 	 	 	 	 ""8#9$$&&#A#ABBa     r   c                     t                      dfd}t          j         |                      }                    d           |                     |          }|                     |d           dS )zd
        Awaiting a paused & chained Deferred will give the result when it has
        one.
        r   Nc                     K   t                      } t                      |                     fd           |                     d                                dj        d           |  d {V S )Nc                     S rF   r   )ignoredd2s    r   <lambda>z7AwaitTests.test_chained.<locals>.test.<locals>.<lambda>   s    " r   r   bye)r   addCallbackrd   rc   )r   rz   re   s    @r   rs   z%AwaitTests.test_chained.<locals>.test   ss       (

A!)BMM,,,,---JJtae444777777Nr   rl   r|   rN   )r	   r   r0   rm   r1   r   )r   rs   r   r$   re   s       @r   test_chainedzAwaitTests.test_chained   s    
 ''	 	 	 	 	 	 "4466**""1%%e$$$$$r   rN   )r   r   r   r   r   r3   r7   r:   rC   rR   rZ   rn   ru   r~   r   r   r   r   r      s         A A A A% % % %8% % % %% % % %6 6 6 6 ? ? ? ?(G G G G2)& )& )& )&V! ! ! ! % % % % % %r   r   )r   r.   typing_extensionsr   twisted.internet.deferr   r   r   r   r   twisted.internet.taskr	   twisted.python.failurer
   twisted.trial.unittestr   	Exceptionr   r   r   r   r   <module>r      s  
   & & & & & &              ( ' ' ' ' ' * * * * * * + + + + + +    i   R% R% R% R% R% R% R% R% R% R%r   