| OLD | NEW |
| (Empty) |
| 1 # Copyright (c) 2007 Twisted Matrix Laboratories. | |
| 2 # See LICENSE for details. | |
| 3 | |
| 4 """ | |
| 5 Test cases for L{twisted.names.srvconnect}. | |
| 6 """ | |
| 7 | |
| 8 from twisted.internet import defer, protocol | |
| 9 from twisted.names import client, dns, srvconnect | |
| 10 from twisted.names.common import ResolverBase | |
| 11 from twisted.names.error import DNSNameError | |
| 12 from twisted.internet.error import DNSLookupError | |
| 13 from twisted.trial import unittest | |
| 14 | |
| 15 class FakeResolver(ResolverBase): | |
| 16 """ | |
| 17 Resolver that only gives out one given result. | |
| 18 | |
| 19 Either L{results} or L{failure} must be set and will be used for | |
| 20 the return value of L{_lookup} | |
| 21 | |
| 22 @ivar results: List of L{dns.RRHeader} for the desired result. | |
| 23 @type results: C{list} | |
| 24 @ivar failure: Failure with an exception from L{twisted.names.error}. | |
| 25 @type failure: L{Failure<twisted.python.failure.Failure>} | |
| 26 """ | |
| 27 | |
| 28 def __init__(self, results=None, failure=None): | |
| 29 self.results = results | |
| 30 self.failure = failure | |
| 31 | |
| 32 def _lookup(self, name, cls, qtype, timeout): | |
| 33 """ | |
| 34 Return the result or failure on lookup. | |
| 35 """ | |
| 36 if self.results is not None: | |
| 37 return defer.succeed((self.results, [], [])) | |
| 38 else: | |
| 39 return defer.fail(self.failure) | |
| 40 | |
| 41 class DummyReactor(object): | |
| 42 """ | |
| 43 Dummy reactor with fake connectTCP that stores the passed parameters. | |
| 44 """ | |
| 45 def __init__(self): | |
| 46 self.host = None | |
| 47 self.port = None | |
| 48 self.factory = None | |
| 49 | |
| 50 def connectTCP(self, host, port, factory, timeout=30, bindaddress=None): | |
| 51 self.host = host | |
| 52 self.port = port | |
| 53 self.factory = factory | |
| 54 | |
| 55 class DummyFactory(protocol.ClientFactory): | |
| 56 """ | |
| 57 Dummy client factory that stores the reason of connection failure. | |
| 58 """ | |
| 59 def __init__(self): | |
| 60 self.reason = None | |
| 61 | |
| 62 def clientConnectionFailed(self, connector, reason): | |
| 63 self.reason = reason | |
| 64 | |
| 65 class SRVConnectorTest(unittest.TestCase): | |
| 66 | |
| 67 def setUp(self): | |
| 68 client.theResolver = FakeResolver() | |
| 69 self.reactor = DummyReactor() | |
| 70 self.factory = DummyFactory() | |
| 71 self.connector = srvconnect.SRVConnector(self.reactor, 'xmpp-server', | |
| 72 'example.org', self.factory) | |
| 73 | |
| 74 def tearDown(self): | |
| 75 client.theResolver = None | |
| 76 | |
| 77 def test_SRVPresent(self): | |
| 78 """ | |
| 79 Test connectTCP gets called with the address from the SRV record. | |
| 80 """ | |
| 81 payload = dns.Record_SRV(port=6269, target='host.example.org', ttl=60) | |
| 82 client.theResolver.results = [dns.RRHeader(name='example.org', | |
| 83 type=dns.SRV, | |
| 84 cls=dns.IN, ttl=60, | |
| 85 payload=payload)] | |
| 86 self.connector.connect() | |
| 87 | |
| 88 self.assertIdentical(None, self.factory.reason) | |
| 89 self.assertEqual('host.example.org', self.reactor.host) | |
| 90 self.assertEqual(6269, self.reactor.port) | |
| 91 | |
| 92 def test_SRVNotPresent(self): | |
| 93 """ | |
| 94 Test connectTCP gets called with fallback parameters on NXDOMAIN. | |
| 95 """ | |
| 96 client.theResolver.failure = DNSNameError('example.org') | |
| 97 self.connector.connect() | |
| 98 | |
| 99 self.assertIdentical(None, self.factory.reason) | |
| 100 self.assertEqual('example.org', self.reactor.host) | |
| 101 self.assertEqual('xmpp-server', self.reactor.port) | |
| 102 | |
| 103 def test_SRVNoResult(self): | |
| 104 """ | |
| 105 Test connectTCP gets called with fallback parameters on empty result. | |
| 106 """ | |
| 107 client.theResolver.results = [] | |
| 108 self.connector.connect() | |
| 109 | |
| 110 self.assertIdentical(None, self.factory.reason) | |
| 111 self.assertEqual('example.org', self.reactor.host) | |
| 112 self.assertEqual('xmpp-server', self.reactor.port) | |
| 113 | |
| 114 def test_SRVBadResult(self): | |
| 115 """ | |
| 116 Test connectTCP gets called with fallback parameters on bad result. | |
| 117 """ | |
| 118 client.theResolver.results = [dns.RRHeader(name='example.org', | |
| 119 type=dns.CNAME, | |
| 120 cls=dns.IN, ttl=60, | |
| 121 payload=None)] | |
| 122 self.connector.connect() | |
| 123 | |
| 124 self.assertIdentical(None, self.factory.reason) | |
| 125 self.assertEqual('example.org', self.reactor.host) | |
| 126 self.assertEqual('xmpp-server', self.reactor.port) | |
| 127 | |
| 128 def test_SRVNoService(self): | |
| 129 """ | |
| 130 Test that connecting fails when no service is present. | |
| 131 """ | |
| 132 payload = dns.Record_SRV(port=5269, target='.', ttl=60) | |
| 133 client.theResolver.results = [dns.RRHeader(name='example.org', | |
| 134 type=dns.SRV, | |
| 135 cls=dns.IN, ttl=60, | |
| 136 payload=payload)] | |
| 137 self.connector.connect() | |
| 138 | |
| 139 self.assertNotIdentical(None, self.factory.reason) | |
| 140 self.factory.reason.trap(DNSLookupError) | |
| OLD | NEW |