From e6d3f49c38e600103ebf20b2f78a1904b64db6d4 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Thu, 11 Jul 2024 14:35:32 -0400 Subject: [PATCH] test: Adopt abstract_base_test in netutil_test.py --- tornado/test/netutil_test.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/tornado/test/netutil_test.py b/tornado/test/netutil_test.py index 0f0bb2a9..ef82cba8 100644 --- a/tornado/test/netutil_test.py +++ b/tornado/test/netutil_test.py @@ -15,13 +15,10 @@ from tornado.netutil import ( bind_sockets, ) from tornado.testing import AsyncTestCase, gen_test, bind_unused_port -from tornado.test.util import skipIfNoNetwork +from tornado.test.util import skipIfNoNetwork, abstract_base_test import typing -if typing.TYPE_CHECKING: - from typing import List # noqa: F401 - try: import pycares # type: ignore except ImportError: @@ -30,11 +27,12 @@ else: from tornado.platform.caresresolver import CaresResolver -class _ResolverTestMixin: +@abstract_base_test +class _ResolverTestMixin(AsyncTestCase): resolver = None # type: typing.Any @gen_test - def test_localhost(self: typing.Any): + def test_localhost(self): addrinfo = yield self.resolver.resolve("localhost", 80, socket.AF_UNSPEC) # Most of the time localhost resolves to either the ipv4 loopback # address alone, or ipv4+ipv6. But some versions of pycares will only @@ -48,11 +46,12 @@ class _ResolverTestMixin: # It is impossible to quickly and consistently generate an error in name # resolution, so test this case separately, using mocks as needed. -class _ResolverErrorTestMixin: +@abstract_base_test +class _ResolverErrorTestMixin(AsyncTestCase): resolver = None # type: typing.Any @gen_test - def test_bad_host(self: typing.Any): + def test_bad_host(self): with self.assertRaises(IOError): yield self.resolver.resolve("an invalid domain", 80, socket.AF_UNSPEC) @@ -63,7 +62,7 @@ def _failing_getaddrinfo(*args): @skipIfNoNetwork -class BlockingResolverTest(AsyncTestCase, _ResolverTestMixin): +class BlockingResolverTest(_ResolverTestMixin): def setUp(self): super().setUp() self.resolver = BlockingResolver() @@ -72,7 +71,7 @@ class BlockingResolverTest(AsyncTestCase, _ResolverTestMixin): # getaddrinfo-based tests need mocking to reliably generate errors; # some configurations are slow to produce errors and take longer than # our default timeout. -class BlockingResolverErrorTest(AsyncTestCase, _ResolverErrorTestMixin): +class BlockingResolverErrorTest(_ResolverErrorTestMixin): def setUp(self): super().setUp() self.resolver = BlockingResolver() @@ -84,7 +83,7 @@ class BlockingResolverErrorTest(AsyncTestCase, _ResolverErrorTestMixin): super().tearDown() -class OverrideResolverTest(AsyncTestCase, _ResolverTestMixin): +class OverrideResolverTest(_ResolverTestMixin): def setUp(self): super().setUp() mapping = { @@ -109,7 +108,7 @@ class OverrideResolverTest(AsyncTestCase, _ResolverTestMixin): @skipIfNoNetwork -class ThreadedResolverTest(AsyncTestCase, _ResolverTestMixin): +class ThreadedResolverTest(_ResolverTestMixin): def setUp(self): super().setUp() self.resolver = ThreadedResolver() @@ -119,7 +118,7 @@ class ThreadedResolverTest(AsyncTestCase, _ResolverTestMixin): super().tearDown() -class ThreadedResolverErrorTest(AsyncTestCase, _ResolverErrorTestMixin): +class ThreadedResolverErrorTest(_ResolverErrorTestMixin): def setUp(self): super().setUp() self.resolver = BlockingResolver() @@ -164,7 +163,7 @@ class ThreadedResolverImportTest(unittest.TestCase): @unittest.skipIf(pycares is None, "pycares module not present") @unittest.skipIf(sys.platform == "win32", "pycares doesn't return loopback on windows") @unittest.skipIf(sys.platform == "darwin", "pycares doesn't return 127.0.0.1 on darwin") -class CaresResolverTest(AsyncTestCase, _ResolverTestMixin): +class CaresResolverTest(_ResolverTestMixin): def setUp(self): super().setUp() self.resolver = CaresResolver() @@ -203,12 +202,12 @@ class TestPortAllocation(unittest.TestCase): not hasattr(socket, "SO_REUSEPORT"), "SO_REUSEPORT is not supported" ) def test_reuse_port(self): - sockets = [] # type: List[socket.socket] - socket, port = bind_unused_port(reuse_port=True) + sockets: typing.List[socket.socket] = [] + sock, port = bind_unused_port(reuse_port=True) try: sockets = bind_sockets(port, "127.0.0.1", reuse_port=True) self.assertTrue(all(s.getsockname()[1] == port for s in sockets)) finally: - socket.close() + sock.close() for sock in sockets: sock.close() -- 2.47.2