def test_no_extra_netifaces_calls(self, mock_interfaces, mock_ifaddresses): """ Make sure filtered out interfaces aren't used in netiface calls due to their impact on sysinfo/login time with a large amount of interfaces. """ mock_interfaces.return_value = ["eth0:foo"] get_active_device_info() assert not mock_ifaddresses.called
def test_ipv6_skip_link_local(self, mock_interfaces, mock_ifaddresses, mock_get_flags, mock_get_network_interface_speed): mock_get_network_interface_speed.return_value = (100, True) mock_get_flags.return_value = 4163 mock_interfaces.return_value = ["test_iface"] mock_ifaddresses.return_value = { AF_LINK: [{ "addr": "aa:bb:cc:dd:ee:f1" }], AF_INET6: [{ "addr": "fe80::1" }, { "addr": "2001::1" }] } device_info = get_active_device_info(extended=True) self.assertEqual(device_info, [{ 'interface': 'test_iface', 'flags': 4163, 'speed': 100, 'duplex': True, 'ip_addresses': { AF_INET6: [{ "addr": "2001::1" }] } }])
def test_skip_alias(self, mock_get_active_interfaces): """Interface aliases are not reported by L{get_active_device_info}.""" mock_get_active_interfaces.side_effect = lambda: (list( get_active_interfaces()) + [("eth0:foo", {})]) device_info = get_active_device_info() interfaces = [i["interface"] for i in device_info] self.assertNotIn("eth0:foo", interfaces)
def test_skip_iface_with_no_addr(self, mock_interfaces, mock_ifaddresses): mock_interfaces.return_value = _interfaces() + ["test_iface"] mock_ifaddresses.side_effect = lambda iface: (_ifaddresses(iface) if iface in _interfaces( ) else {}) device_info = get_active_device_info() interfaces = [i["interface"] for i in device_info] self.assertNotIn("test_iface", interfaces)
def test_skip_vlan(self, mock_get_active_interfaces): """VLAN interfaces are not reported by L{get_active_device_info}.""" mock_get_active_interfaces.side_effect = lambda: (list( get_active_interfaces()) + [("eth0.1", {})]) device_info = get_active_device_info() self.assertTrue(mock_get_active_interfaces.called) interfaces = [i["interface"] for i in device_info] self.assertNotIn("eth0.1", interfaces)
def test_skip_vlan(self, mock_get_active_interfaces): """VLAN interfaces are not reported by L{get_active_device_info}.""" mock_get_active_interfaces.side_effect = lambda sock: (list( get_active_interfaces(sock)) + [b"eth0.1"]) device_info = get_active_device_info() mock_get_active_interfaces.assert_called_with(ANY) interfaces = [i["interface"] for i in device_info] self.assertNotIn("eth0.1", interfaces)
def test_extended_info(self, mock_interfaces, mock_ifaddresses, mock_get_flags, mock_get_network_interface_speed): mock_get_network_interface_speed.return_value = (100, True) mock_get_flags.return_value = 4163 mock_interfaces.return_value = ["test_iface"] mock_ifaddresses.return_value = { AF_LINK: [{ "addr": "aa:bb:cc:dd:ee:f0" }, { "addr": "aa:bb:cc:dd:ee:f1" }], AF_INET: [{ "addr": "192.168.0.50", "netmask": "255.255.255.0" }, { "addr": "192.168.1.50", "netmask": "255.255.255.0" }], AF_INET6: [{ "addr": "2001::1" }, { "addr": "2002::2" }] } device_info = get_active_device_info(extended=True) self.assertEqual(device_info, [{ 'interface': 'test_iface', 'ip_address': '192.168.0.50', 'mac_address': 'aa:bb:cc:dd:ee:f0', 'broadcast_address': '0.0.0.0', 'netmask': '255.255.255.0', 'ip_addresses': { AF_INET: [{ 'addr': '192.168.0.50', 'netmask': '255.255.255.0' }, { 'addr': '192.168.1.50', 'netmask': '255.255.255.0' }], AF_INET6: [{ "addr": "2001::1" }, { "addr": "2002::2" }] }, 'flags': 4163, 'speed': 100, 'duplex': True }])
def test_default_only_interface(self, mock_interfaces, mock_ifaddresses, mock_get_flags, mock_get_network_interface_speed, mock_get_default_interfaces): default_iface = "test_iface" mock_get_default_interfaces.return_value = [default_iface] mock_get_network_interface_speed.return_value = (100, True) mock_get_flags.return_value = 4163 mock_interfaces.return_value = [default_iface] mock_ifaddresses.return_value = {AF_INET: [{"addr": "192.168.0.50"}]} device_info = get_active_device_info(extended=False, default_only=True) interfaces = [i["interface"] for i in device_info] self.assertIn(default_iface, interfaces) self.assertEqual(len(interfaces), 1)
def test_skip_iface_down(self, mock_interfaces, mock_ifaddresses, mock_get_flags, mock_get_network_interface_speed): mock_get_network_interface_speed.return_value = (100, True) mock_get_flags.return_value = 0 mock_interfaces.return_value = ["test_iface"] mock_ifaddresses.return_value = { AF_LINK: [{ "addr": "aa:bb:cc:dd:ee:f0" }], AF_INET: [{ "addr": "192.168.1.50", "netmask": "255.255.255.0" }] } device_info = get_active_device_info() interfaces = [i["interface"] for i in device_info] self.assertNotIn("test_iface", interfaces)
def test_no_macaddr_no_netmask_no_broadcast( self, mock_interfaces, mock_ifaddresses, mock_get_flags, mock_get_network_interface_speed): mock_get_network_interface_speed.return_value = (100, True) mock_get_flags.return_value = 4163 mock_interfaces.return_value = ["test_iface"] mock_ifaddresses.return_value = {AF_INET: [{"addr": "192.168.0.50"}]} device_info = get_active_device_info(extended=False) self.assertEqual(device_info, [{ 'interface': 'test_iface', 'ip_address': '192.168.0.50', 'broadcast_address': '0.0.0.0', 'mac_address': '', 'netmask': '', 'flags': 4163, 'speed': 100, 'duplex': True }])
def test_skip_ipv6_only_in_non_extended_mode( self, mock_interfaces, mock_ifaddresses, mock_get_flags, mock_get_network_interface_speed): mock_get_network_interface_speed.return_value = (100, True) mock_get_flags.return_value = 4163 mock_interfaces.return_value = ["test_iface"] mock_ifaddresses.return_value = { AF_LINK: [{ "addr": "aa:bb:cc:dd:ee:f0" }], AF_INET6: [{ "addr": "2001::1" }] } device_info = get_active_device_info(extended=False) self.assertEqual(device_info, [])
def test_get_active_device_info(self, mock_get_network_interface_speed): """ Device info returns a sequence of information about active network devices, compare and verify the output against that returned by ifconfig. """ mock_get_network_interface_speed.return_value = (100, True) device_info = get_active_device_info(extended=False) process = Popen(["/sbin/ifconfig"], stdout=PIPE, env={"LC_ALL": "C"}) result = process.communicate()[0].decode("ascii") interface_blocks = dict([ (block.split()[0].strip(":"), block.upper()) for block in filter(None, result.split("\n\n")) ]) for device in device_info: if device["mac_address"] == "00:00:00:00:00:00": continue self.assertIn(device["interface"], result) block = interface_blocks[device["interface"]] self.assertIn(device["netmask"], block) self.assertIn(device["ip_address"], block) self.assertIn(device["mac_address"].upper(), block) self.assertIn(device["broadcast_address"], block) flags = device["flags"] if flags & 1: self.assertIn("UP", block) if flags & 2: self.assertIn("BROADCAST", block) if flags & 64: self.assertIn("RUNNING", block) if flags & 4096: self.assertIn("MULTICAST", block) self.assertEqual(100, device["speed"]) self.assertEqual(True, device["duplex"]) self.assertTrue(mock_get_network_interface_speed.call_count >= 1) mock_get_network_interface_speed.assert_called_with(ANY, ANY)
def test_skip_vlan(self, mock_interfaces): """VLAN interfaces are not reported by L{get_active_device_info}.""" mock_interfaces.side_effect = lambda: (_interfaces() + ["eth0.1"]) device_info = get_active_device_info() interfaces = [i["interface"] for i in device_info] self.assertNotIn("eth0.1", interfaces)
def test_skip_loopback(self): """The C{lo} interface is not reported by L{get_active_device_info}.""" device_info = get_active_device_info() interfaces = [i["interface"] for i in device_info] self.assertNotIn("lo", interfaces)
def _get_local_ips(self): """Return a list of IP addresses for local devices.""" return [device["ip_address"] for device in get_active_device_info()]