test_common.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. """
  4. Tests for L{twisted.names.common}.
  5. """
  6. from __future__ import division, absolute_import
  7. from zope.interface.verify import verifyClass
  8. from twisted.internet.interfaces import IResolver
  9. from twisted.trial.unittest import SynchronousTestCase
  10. from twisted.python.failure import Failure
  11. from twisted.names.common import ResolverBase
  12. from twisted.names.dns import EFORMAT, ESERVER, ENAME, ENOTIMP, EREFUSED, Query
  13. from twisted.names.error import DNSFormatError, DNSServerError, DNSNameError
  14. from twisted.names.error import DNSNotImplementedError, DNSQueryRefusedError
  15. from twisted.names.error import DNSUnknownError
  16. class ExceptionForCodeTests(SynchronousTestCase):
  17. """
  18. Tests for L{ResolverBase.exceptionForCode}.
  19. """
  20. def setUp(self):
  21. self.exceptionForCode = ResolverBase().exceptionForCode
  22. def test_eformat(self):
  23. """
  24. L{ResolverBase.exceptionForCode} converts L{EFORMAT} to
  25. L{DNSFormatError}.
  26. """
  27. self.assertIs(self.exceptionForCode(EFORMAT), DNSFormatError)
  28. def test_eserver(self):
  29. """
  30. L{ResolverBase.exceptionForCode} converts L{ESERVER} to
  31. L{DNSServerError}.
  32. """
  33. self.assertIs(self.exceptionForCode(ESERVER), DNSServerError)
  34. def test_ename(self):
  35. """
  36. L{ResolverBase.exceptionForCode} converts L{ENAME} to L{DNSNameError}.
  37. """
  38. self.assertIs(self.exceptionForCode(ENAME), DNSNameError)
  39. def test_enotimp(self):
  40. """
  41. L{ResolverBase.exceptionForCode} converts L{ENOTIMP} to
  42. L{DNSNotImplementedError}.
  43. """
  44. self.assertIs(self.exceptionForCode(ENOTIMP), DNSNotImplementedError)
  45. def test_erefused(self):
  46. """
  47. L{ResolverBase.exceptionForCode} converts L{EREFUSED} to
  48. L{DNSQueryRefusedError}.
  49. """
  50. self.assertIs(self.exceptionForCode(EREFUSED), DNSQueryRefusedError)
  51. def test_other(self):
  52. """
  53. L{ResolverBase.exceptionForCode} converts any other response code to
  54. L{DNSUnknownError}.
  55. """
  56. self.assertIs(self.exceptionForCode(object()), DNSUnknownError)
  57. class QueryTests(SynchronousTestCase):
  58. """
  59. Tests for L{ResolverBase.query}.
  60. """
  61. def test_resolverBaseProvidesIResolver(self):
  62. """
  63. L{ResolverBase} provides the L{IResolver} interface.
  64. """
  65. verifyClass(IResolver, ResolverBase)
  66. def test_typeToMethodDispatch(self):
  67. """
  68. L{ResolverBase.query} looks up a method to invoke using the type of the
  69. query passed to it and the C{typeToMethod} mapping on itself.
  70. """
  71. results = []
  72. resolver = ResolverBase()
  73. resolver.typeToMethod = {
  74. 12345: lambda query, timeout: results.append((query, timeout))}
  75. query = Query(name=b"example.com", type=12345)
  76. resolver.query(query, 123)
  77. self.assertEqual([(b"example.com", 123)], results)
  78. def test_typeToMethodResult(self):
  79. """
  80. L{ResolverBase.query} returns a L{Deferred} which fires with the result
  81. of the method found in the C{typeToMethod} mapping for the type of the
  82. query passed to it.
  83. """
  84. expected = object()
  85. resolver = ResolverBase()
  86. resolver.typeToMethod = {54321: lambda query, timeout: expected}
  87. query = Query(name=b"example.com", type=54321)
  88. queryDeferred = resolver.query(query, 123)
  89. result = []
  90. queryDeferred.addBoth(result.append)
  91. self.assertEqual(expected, result[0])
  92. def test_unknownQueryType(self):
  93. """
  94. L{ResolverBase.query} returns a L{Deferred} which fails with
  95. L{NotImplementedError} when called with a query of a type not present in
  96. its C{typeToMethod} dictionary.
  97. """
  98. resolver = ResolverBase()
  99. resolver.typeToMethod = {}
  100. query = Query(name=b"example.com", type=12345)
  101. queryDeferred = resolver.query(query, 123)
  102. result = []
  103. queryDeferred.addBoth(result.append)
  104. self.assertIsInstance(result[0], Failure)
  105. result[0].trap(NotImplementedError)