import tempfile import unittest from pathlib import Path from librenet_scanner.diagnostics import arp_scan_succeeded, parse_getcap_output from librenet_scanner.network import parse_neighbor_json from librenet_scanner.vendors import load_vendor_table, lookup_mac_vendor, parse_vendor_text class NeighborTests(unittest.TestCase): def test_neighbor_json_filters_unusable_entries(self): payload = r'''[ {"dst":"192.168.10.2","lladdr":"aa:bb:cc:dd:ee:ff","state":["REACHABLE"]}, {"dst":"192.168.10.3","lladdr":"11:22:33:44:55:66","state":["STALE"]}, {"dst":"192.168.10.4","state":["INCOMPLETE"]}, {"dst":"192.168.10.5","lladdr":"bad-mac","state":["REACHABLE"]} ]''' entries = parse_neighbor_json(payload) self.assertEqual(len(entries), 2) self.assertEqual(entries[0].ip, "192.168.10.2") self.assertEqual(entries[0].mac, "AA:BB:CC:DD:EE:FF") self.assertEqual(entries[1].state, "STALE") def test_invalid_neighbor_json_is_empty(self): self.assertEqual(parse_neighbor_json("not-json"), []) class VendorTests(unittest.TestCase): def test_parse_common_oui_formats(self): text = ''' # comment 00-11-22 (hex) Example Networks 001122 (base 16) Example Networks Base AA:BB:CC Another Vendor AABBCCDDEE Precise Vendor ''' table = parse_vendor_text(text) self.assertEqual(table["001122"], "Example Networks Base") self.assertEqual(table["AABBCC"], "Another Vendor") self.assertEqual(table["AABBCCDDEE"], "Precise Vendor") def test_load_vendor_table(self): with tempfile.TemporaryDirectory() as tmp: p1 = Path(tmp) / "oui.txt" p2 = Path(tmp) / "mac-vendor.txt" p1.write_text("AABBCC Vendor Generic\n") p2.write_text("AABBCCDDEE Vendor Precise\n") table = load_vendor_table((p1, p2)) self.assertEqual(table["AABBCC"], "Vendor Generic") self.assertEqual(table["AABBCCDDEE"], "Vendor Precise") class DiagnosticTests(unittest.TestCase): def test_getcap_parser(self): self.assertTrue(parse_getcap_output("/usr/sbin/arp-scan cap_net_raw=p\n")) self.assertFalse(parse_getcap_output("")) def test_arp_scan_exit_code(self): self.assertTrue(arp_scan_succeeded(0)) self.assertFalse(arp_scan_succeeded(1)) self.assertFalse(arp_scan_succeeded(2)) if __name__ == "__main__": unittest.main()