105
124
def make_output_line(self, ip=None, mac=None, dev=None):
106
125
"""Compose an `ip neigh` output line for given `ip` and `mac`."""
108
ip = factory.getRandomIPAddress()
127
ip = factory.make_ipv4_address()
110
mac = factory.getRandomMACAddress()
129
mac = factory.make_mac_address()
112
131
dev = factory.make_name('eth', sep='')
113
132
return "%(ip)s dev %(dev)s lladdr %(mac)s\n" % {
119
138
def test__calls_ip_neigh(self):
120
139
call_and_check = self.patch_call('')
121
find_mac_via_arp(factory.getRandomIPAddress())
140
find_mac_via_arp(factory.make_ipv4_address())
124
143
MockCalledOnceWith(['ip', 'neigh'], env={'LC_ALL': 'C'}))
126
145
def test__works_with_real_call(self):
127
find_mac_via_arp(factory.getRandomIPAddress())
146
find_mac_via_arp(factory.make_ipv4_address())
131
150
def test__fails_on_nonsensical_output(self):
132
151
self.patch_call("Weird output...")
133
152
self.assertRaises(
134
Exception, find_mac_via_arp, factory.getRandomIPAddress())
153
Exception, find_mac_via_arp, factory.make_ipv4_address())
136
155
def test__returns_None_if_not_found(self):
137
156
self.patch_call(self.make_output_line())
138
self.assertIsNone(find_mac_via_arp(factory.getRandomIPAddress()))
157
self.assertIsNone(find_mac_via_arp(factory.make_ipv4_address()))
140
159
def test__resolves_IPv4_address_to_MAC(self):
141
160
sample = "10.55.60.9 dev eth0 lladdr 3c:41:92:68:2e:00 REACHABLE\n"
162
181
self.assertIsNone(find_mac_via_arp('10.1.1.100'))
164
183
def test__is_not_fooled_by_different_notations(self):
165
mac = factory.getRandomMACAddress()
184
mac = factory.make_mac_address()
166
185
self.patch_call(self.make_output_line('9::0:05', mac=mac))
167
186
self.assertEqual(mac, find_mac_via_arp('09:0::5'))
169
188
def test__returns_consistent_output(self):
170
ip = factory.getRandomIPAddress()
189
ip = factory.make_ipv4_address()
172
191
'52:54:00:02:86:4b',
173
192
'90:f6:52:f6:17:92',
345
364
self.assertEqual(
347
366
clean_up_netifaces_address('%s%%%s' % (ip, interface), interface))
369
class TestResolveHostname(MAASTestCase):
370
"""Tests for `resolve_hostname`."""
372
def patch_getaddrinfo(self, *addrs):
373
fake = self.patch(network_module, 'getaddrinfo')
374
fake.return_value = [
375
(None, None, None, None, (unicode(address), None))
380
def patch_getaddrinfo_fail(self, exception):
381
fake = self.patch(network_module, 'getaddrinfo')
382
fake.side_effect = exception
385
def test__rejects_weird_IP_version(self):
388
resolve_hostname, factory.make_hostname(), ip_version=5)
390
def test__integrates_with_getaddrinfo(self):
391
result = resolve_hostname('localhost', 4)
392
self.assertIsInstance(result, set)
394
self.assertIsInstance(localhost, IPAddress)
395
self.assertIn(localhost, IPNetwork('127.0.0.0/8'))
397
def test__resolves_IPv4_address(self):
398
ip = factory.make_ipv4_address()
399
fake = self.patch_getaddrinfo(ip)
400
hostname = factory.make_hostname()
401
result = resolve_hostname(hostname, 4)
402
self.assertIsInstance(result, set)
403
self.assertEqual({IPAddress(ip)}, result)
404
self.assertThat(fake, MockCalledOnceWith(hostname, mock.ANY, AF_INET))
406
def test__resolves_IPv6_address(self):
407
ip = factory.make_ipv6_address()
408
fake = self.patch_getaddrinfo(ip)
409
hostname = factory.make_hostname()
410
result = resolve_hostname(hostname, 6)
411
self.assertIsInstance(result, set)
412
self.assertEqual({IPAddress(ip)}, result)
413
self.assertThat(fake, MockCalledOnceWith(hostname, mock.ANY, AF_INET6))
415
def test__returns_empty_if_address_does_not_resolve(self):
416
self.patch_getaddrinfo_fail(
417
gaierror(EAI_NONAME, "Name or service not known"))
418
self.assertEqual(set(), resolve_hostname(factory.make_hostname(), 4))
420
def test__returns_empty_if_address_resolves_to_no_data(self):
421
self.patch_getaddrinfo_fail(
422
gaierror(EAI_NODATA, "No data returned"))
423
self.assertEqual(set(), resolve_hostname(factory.make_hostname(), 4))
425
def test__propagates_other_gaierrors(self):
426
self.patch_getaddrinfo_fail(gaierror(EAI_BADFLAGS, "Bad parameters"))
429
resolve_hostname, factory.make_hostname(), 4)
431
def test__propagates_unexpected_errors(self):
432
self.patch_getaddrinfo_fail(KeyError("Huh what?"))
435
resolve_hostname, factory.make_hostname(), 4)