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:
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
# 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)
@skipIfNoNetwork
-class BlockingResolverTest(AsyncTestCase, _ResolverTestMixin):
+class BlockingResolverTest(_ResolverTestMixin):
def setUp(self):
super().setUp()
self.resolver = BlockingResolver()
# 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()
super().tearDown()
-class OverrideResolverTest(AsyncTestCase, _ResolverTestMixin):
+class OverrideResolverTest(_ResolverTestMixin):
def setUp(self):
super().setUp()
mapping = {
@skipIfNoNetwork
-class ThreadedResolverTest(AsyncTestCase, _ResolverTestMixin):
+class ThreadedResolverTest(_ResolverTestMixin):
def setUp(self):
super().setUp()
self.resolver = ThreadedResolver()
super().tearDown()
-class ThreadedResolverErrorTest(AsyncTestCase, _ResolverErrorTestMixin):
+class ThreadedResolverErrorTest(_ResolverErrorTestMixin):
def setUp(self):
super().setUp()
self.resolver = BlockingResolver()
@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()
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()