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 |