Skip to content

Commit acea4d7

Browse files
authored
Add missing types to tests.util. (#14597)
Removes files under tests.util from the ignored by list, then fully types all tests/util/*.py files.
1 parent fac8a38 commit acea4d7

21 files changed

+361
-276
lines changed

changelog.d/14597.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add missing type hints.

mypy.ini

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,6 @@ exclude = (?x)
5959
|tests/server_notices/test_resource_limits_server_notices.py
6060
|tests/test_state.py
6161
|tests/test_terms_auth.py
62-
|tests/util/test_async_helpers.py
63-
|tests/util/test_batching_queue.py
64-
|tests/util/test_dict_cache.py
65-
|tests/util/test_expiring_cache.py
66-
|tests/util/test_file_consumer.py
67-
|tests/util/test_linearizer.py
68-
|tests/util/test_logcontext.py
69-
|tests/util/test_lrucache.py
70-
|tests/util/test_rwlock.py
71-
|tests/util/test_wheel_timer.py
7262
)$
7363

7464
[mypy-synapse.federation.transport.client]
@@ -137,6 +127,9 @@ disallow_untyped_defs = True
137127
[mypy-tests.util.caches.test_descriptors]
138128
disallow_untyped_defs = False
139129

130+
[mypy-tests.util.*]
131+
disallow_untyped_defs = True
132+
140133
[mypy-tests.utils]
141134
disallow_untyped_defs = True
142135

tests/util/test_async_helpers.py

Lines changed: 63 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
import traceback
15+
from typing import Generator, List, NoReturn, Optional
1516

1617
from parameterized import parameterized_class
1718

@@ -41,8 +42,8 @@
4142

4243

4344
class 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

138143
class 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

222230
class 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):
361369
class 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):
384392
class 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():
503511
class 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

Comments
 (0)