1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414import traceback
15+ from typing import Generator , List , NoReturn , Optional
1516
1617from parameterized import parameterized_class
1718
4142
4243
4344class ObservableDeferredTest (TestCase ):
44- def test_succeed (self ):
45- origin_d = Deferred ()
45+ def test_succeed (self ) -> None :
46+ origin_d : "Deferred[int]" = Deferred ()
4647 observable = ObservableDeferred (origin_d )
4748
4849 observer1 = observable .observe ()
@@ -52,16 +53,18 @@ def test_succeed(self):
5253 self .assertFalse (observer2 .called )
5354
5455 # check the first observer is called first
55- def check_called_first (res ) :
56+ def check_called_first (res : int ) -> int :
5657 self .assertFalse (observer2 .called )
5758 return res
5859
5960 observer1 .addBoth (check_called_first )
6061
6162 # store the results
62- results = [None , None ]
63+ results : List [ Optional [ ObservableDeferred [ int ]]] = [None , None ]
6364
64- def check_val (res , idx ):
65+ def check_val (
66+ res : ObservableDeferred [int ], idx : int
67+ ) -> ObservableDeferred [int ]:
6568 results [idx ] = res
6669 return res
6770
@@ -72,8 +75,8 @@ def check_val(res, idx):
7275 self .assertEqual (results [0 ], 123 , "observer 1 callback result" )
7376 self .assertEqual (results [1 ], 123 , "observer 2 callback result" )
7477
75- def test_failure (self ):
76- origin_d = Deferred ()
78+ def test_failure (self ) -> None :
79+ origin_d : Deferred = Deferred ()
7780 observable = ObservableDeferred (origin_d , consumeErrors = True )
7881
7982 observer1 = observable .observe ()
@@ -83,16 +86,16 @@ def test_failure(self):
8386 self .assertFalse (observer2 .called )
8487
8588 # check the first observer is called first
86- def check_called_first (res ) :
89+ def check_called_first (res : int ) -> int :
8790 self .assertFalse (observer2 .called )
8891 return res
8992
9093 observer1 .addBoth (check_called_first )
9194
9295 # store the results
93- results = [None , None ]
96+ results : List [ Optional [ ObservableDeferred [ str ]]] = [None , None ]
9497
95- def check_val (res , idx ) :
98+ def check_val (res : ObservableDeferred [ str ] , idx : int ) -> None :
9699 results [idx ] = res
97100 return None
98101
@@ -103,10 +106,12 @@ def check_val(res, idx):
103106 raise Exception ("gah!" )
104107 except Exception as e :
105108 origin_d .errback (e )
109+ assert results [0 ] is not None
106110 self .assertEqual (str (results [0 ].value ), "gah!" , "observer 1 errback result" )
111+ assert results [1 ] is not None
107112 self .assertEqual (str (results [1 ].value ), "gah!" , "observer 2 errback result" )
108113
109- def test_cancellation (self ):
114+ def test_cancellation (self ) -> None :
110115 """Test that cancelling an observer does not affect other observers."""
111116 origin_d : "Deferred[int]" = Deferred ()
112117 observable = ObservableDeferred (origin_d , consumeErrors = True )
@@ -136,37 +141,38 @@ def test_cancellation(self):
136141
137142
138143class TimeoutDeferredTest (TestCase ):
139- def setUp (self ):
144+ def setUp (self ) -> None :
140145 self .clock = Clock ()
141146
142- def test_times_out (self ):
147+ def test_times_out (self ) -> None :
143148 """Basic test case that checks that the original deferred is cancelled and that
144149 the timing-out deferred is errbacked
145150 """
146- cancelled = [ False ]
151+ cancelled = False
147152
148- def canceller (_d ):
149- cancelled [0 ] = True
153+ def canceller (_d : Deferred ) -> None :
154+ nonlocal cancelled
155+ cancelled = True
150156
151- non_completing_d = Deferred (canceller )
157+ non_completing_d : Deferred = Deferred (canceller )
152158 timing_out_d = timeout_deferred (non_completing_d , 1.0 , self .clock )
153159
154160 self .assertNoResult (timing_out_d )
155- self .assertFalse (cancelled [ 0 ] , "deferred was cancelled prematurely" )
161+ self .assertFalse (cancelled , "deferred was cancelled prematurely" )
156162
157163 self .clock .pump ((1.0 ,))
158164
159- self .assertTrue (cancelled [ 0 ] , "deferred was not cancelled by timeout" )
165+ self .assertTrue (cancelled , "deferred was not cancelled by timeout" )
160166 self .failureResultOf (timing_out_d , defer .TimeoutError )
161167
162- def test_times_out_when_canceller_throws (self ):
168+ def test_times_out_when_canceller_throws (self ) -> None :
163169 """Test that we have successfully worked around
164170 https://twistedmatrix.com/trac/ticket/9534"""
165171
166- def canceller (_d ) :
172+ def canceller (_d : Deferred ) -> None :
167173 raise Exception ("can't cancel this deferred" )
168174
169- non_completing_d = Deferred (canceller )
175+ non_completing_d : Deferred = Deferred (canceller )
170176 timing_out_d = timeout_deferred (non_completing_d , 1.0 , self .clock )
171177
172178 self .assertNoResult (timing_out_d )
@@ -175,22 +181,24 @@ def canceller(_d):
175181
176182 self .failureResultOf (timing_out_d , defer .TimeoutError )
177183
178- def test_logcontext_is_preserved_on_cancellation (self ):
179- blocking_was_cancelled = [ False ]
184+ def test_logcontext_is_preserved_on_cancellation (self ) -> None :
185+ blocking_was_cancelled = False
180186
181187 @defer .inlineCallbacks
182- def blocking ():
183- non_completing_d = Deferred ()
188+ def blocking () -> Generator ["Deferred[object]" , object , None ]:
189+ nonlocal blocking_was_cancelled
190+
191+ non_completing_d : Deferred = Deferred ()
184192 with PreserveLoggingContext ():
185193 try :
186194 yield non_completing_d
187195 except CancelledError :
188- blocking_was_cancelled [ 0 ] = True
196+ blocking_was_cancelled = True
189197 raise
190198
191199 with LoggingContext ("one" ) as context_one :
192200 # the errbacks should be run in the test logcontext
193- def errback (res , deferred_name ) :
201+ def errback (res : Failure , deferred_name : str ) -> Failure :
194202 self .assertIs (
195203 current_context (),
196204 context_one ,
@@ -209,7 +217,7 @@ def errback(res, deferred_name):
209217 self .clock .pump ((1.0 ,))
210218
211219 self .assertTrue (
212- blocking_was_cancelled [ 0 ] , "non-completing deferred was not cancelled"
220+ blocking_was_cancelled , "non-completing deferred was not cancelled"
213221 )
214222 self .failureResultOf (timing_out_d , defer .TimeoutError )
215223 self .assertIs (current_context (), context_one )
@@ -220,13 +228,13 @@ class _TestException(Exception):
220228
221229
222230class ConcurrentlyExecuteTest (TestCase ):
223- def test_limits_runners (self ):
231+ def test_limits_runners (self ) -> None :
224232 """If we have more tasks than runners, we should get the limit of runners"""
225233 started = 0
226234 waiters = []
227235 processed = []
228236
229- async def callback (v ) :
237+ async def callback (v : int ) -> None :
230238 # when we first enter, bump the start count
231239 nonlocal started
232240 started += 1
@@ -235,7 +243,7 @@ async def callback(v):
235243 processed .append (v )
236244
237245 # wait for the goahead before returning
238- d2 = Deferred ()
246+ d2 : "Deferred[int]" = Deferred ()
239247 waiters .append (d2 )
240248 await d2
241249
@@ -265,16 +273,16 @@ async def callback(v):
265273 self .assertCountEqual (processed , [1 , 2 , 3 , 4 , 5 ])
266274 self .successResultOf (d2 )
267275
268- def test_preserves_stacktraces (self ):
276+ def test_preserves_stacktraces (self ) -> None :
269277 """Test that the stacktrace from an exception thrown in the callback is preserved"""
270- d1 = Deferred ()
278+ d1 : "Deferred[int]" = Deferred ()
271279
272- async def callback (v ) :
280+ async def callback (v : int ) -> None :
273281 # alas, this doesn't work at all without an await here
274282 await d1
275283 raise _TestException ("bah" )
276284
277- async def caller ():
285+ async def caller () -> None :
278286 try :
279287 await concurrently_execute (callback , [1 ], 2 )
280288 except _TestException as e :
@@ -290,17 +298,17 @@ async def caller():
290298 d1 .callback (0 )
291299 self .successResultOf (d2 )
292300
293- def test_preserves_stacktraces_on_preformed_failure (self ):
301+ def test_preserves_stacktraces_on_preformed_failure (self ) -> None :
294302 """Test that the stacktrace on a Failure returned by the callback is preserved"""
295- d1 = Deferred ()
303+ d1 : "Deferred[int]" = Deferred ()
296304 f = Failure (_TestException ("bah" ))
297305
298- async def callback (v ) :
306+ async def callback (v : int ) -> None :
299307 # alas, this doesn't work at all without an await here
300308 await d1
301309 await defer .fail (f )
302310
303- async def caller ():
311+ async def caller () -> None :
304312 try :
305313 await concurrently_execute (callback , [1 ], 2 )
306314 except _TestException as e :
@@ -336,7 +344,7 @@ def wrap_deferred(self, deferred: "Deferred[str]") -> "Deferred[str]":
336344 else :
337345 raise ValueError (f"Unsupported wrapper type: { self .wrapper } " )
338346
339- def test_succeed (self ):
347+ def test_succeed (self ) -> None :
340348 """Test that the new `Deferred` receives the result."""
341349 deferred : "Deferred[str]" = Deferred ()
342350 wrapper_deferred = self .wrap_deferred (deferred )
@@ -346,7 +354,7 @@ def test_succeed(self):
346354 self .assertTrue (wrapper_deferred .called )
347355 self .assertEqual ("success" , self .successResultOf (wrapper_deferred ))
348356
349- def test_failure (self ):
357+ def test_failure (self ) -> None :
350358 """Test that the new `Deferred` receives the `Failure`."""
351359 deferred : "Deferred[str]" = Deferred ()
352360 wrapper_deferred = self .wrap_deferred (deferred )
@@ -361,7 +369,7 @@ def test_failure(self):
361369class StopCancellationTests (TestCase ):
362370 """Tests for the `stop_cancellation` function."""
363371
364- def test_cancellation (self ):
372+ def test_cancellation (self ) -> None :
365373 """Test that cancellation of the new `Deferred` leaves the original running."""
366374 deferred : "Deferred[str]" = Deferred ()
367375 wrapper_deferred = stop_cancellation (deferred )
@@ -384,7 +392,7 @@ def test_cancellation(self):
384392class DelayCancellationTests (TestCase ):
385393 """Tests for the `delay_cancellation` function."""
386394
387- def test_deferred_cancellation (self ):
395+ def test_deferred_cancellation (self ) -> None :
388396 """Test that cancellation of the new `Deferred` waits for the original."""
389397 deferred : "Deferred[str]" = Deferred ()
390398 wrapper_deferred = delay_cancellation (deferred )
@@ -405,12 +413,12 @@ def test_deferred_cancellation(self):
405413 # Now that the original `Deferred` has failed, we should get a `CancelledError`.
406414 self .failureResultOf (wrapper_deferred , CancelledError )
407415
408- def test_coroutine_cancellation (self ):
416+ def test_coroutine_cancellation (self ) -> None :
409417 """Test that cancellation of the new `Deferred` waits for the original."""
410418 blocking_deferred : "Deferred[None]" = Deferred ()
411419 completion_deferred : "Deferred[None]" = Deferred ()
412420
413- async def task ():
421+ async def task () -> NoReturn :
414422 await blocking_deferred
415423 completion_deferred .callback (None )
416424 # Raise an exception. Twisted should consume it, otherwise unwanted
@@ -434,7 +442,7 @@ async def task():
434442 # Now that the original coroutine has failed, we should get a `CancelledError`.
435443 self .failureResultOf (wrapper_deferred , CancelledError )
436444
437- def test_suppresses_second_cancellation (self ):
445+ def test_suppresses_second_cancellation (self ) -> None :
438446 """Test that a second cancellation is suppressed.
439447
440448 Identical to `test_cancellation` except the new `Deferred` is cancelled twice.
@@ -459,7 +467,7 @@ def test_suppresses_second_cancellation(self):
459467 # Now that the original `Deferred` has failed, we should get a `CancelledError`.
460468 self .failureResultOf (wrapper_deferred , CancelledError )
461469
462- def test_propagates_cancelled_error (self ):
470+ def test_propagates_cancelled_error (self ) -> None :
463471 """Test that a `CancelledError` from the original `Deferred` gets propagated."""
464472 deferred : "Deferred[str]" = Deferred ()
465473 wrapper_deferred = delay_cancellation (deferred )
@@ -472,14 +480,14 @@ def test_propagates_cancelled_error(self):
472480 self .assertTrue (wrapper_deferred .called )
473481 self .assertIs (cancelled_error , self .failureResultOf (wrapper_deferred ).value )
474482
475- def test_preserves_logcontext (self ):
483+ def test_preserves_logcontext (self ) -> None :
476484 """Test that logging contexts are preserved."""
477485 blocking_d : "Deferred[None]" = Deferred ()
478486
479- async def inner ():
487+ async def inner () -> None :
480488 await make_deferred_yieldable (blocking_d )
481489
482- async def outer ():
490+ async def outer () -> None :
483491 with LoggingContext ("c" ) as c :
484492 try :
485493 await delay_cancellation (inner ())
@@ -503,7 +511,7 @@ async def outer():
503511class AwakenableSleeperTests (TestCase ):
504512 "Tests AwakenableSleeper"
505513
506- def test_sleep (self ):
514+ def test_sleep (self ) -> None :
507515 reactor , _ = get_clock ()
508516 sleeper = AwakenableSleeper (reactor )
509517
@@ -518,7 +526,7 @@ def test_sleep(self):
518526 reactor .advance (0.6 )
519527 self .assertTrue (d .called )
520528
521- def test_explicit_wake (self ):
529+ def test_explicit_wake (self ) -> None :
522530 reactor , _ = get_clock ()
523531 sleeper = AwakenableSleeper (reactor )
524532
@@ -535,7 +543,7 @@ def test_explicit_wake(self):
535543
536544 reactor .advance (0.6 )
537545
538- def test_multiple_sleepers_timeout (self ):
546+ def test_multiple_sleepers_timeout (self ) -> None :
539547 reactor , _ = get_clock ()
540548 sleeper = AwakenableSleeper (reactor )
541549
@@ -555,7 +563,7 @@ def test_multiple_sleepers_timeout(self):
555563 reactor .advance (0.6 )
556564 self .assertTrue (d2 .called )
557565
558- def test_multiple_sleepers_wake (self ):
566+ def test_multiple_sleepers_wake (self ) -> None :
559567 reactor , _ = get_clock ()
560568 sleeper = AwakenableSleeper (reactor )
561569
0 commit comments