66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
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()
|