79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
import json
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from librenet_scanner.online_vendor import (
|
|
PROVIDER_MACLOOKUP,
|
|
PROVIDER_MACVENDORS,
|
|
is_locally_administered,
|
|
lookup_online_vendor,
|
|
normalize_mac,
|
|
)
|
|
from librenet_scanner.storage import HistoryStore
|
|
from librenet_scanner.parsers import parse_arp_scan
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
class OnlineVendor047Tests(unittest.TestCase):
|
|
def test_arp_scan_locally_administered_is_not_mistaken_for_vendor(self):
|
|
hosts = parse_arp_scan("192.168.10.250\ta6:2b:b0:a5:49:a7\t(Unknown: locally administered) (DUP: 2)")
|
|
self.assertEqual(len(hosts), 1)
|
|
self.assertEqual(hosts[0].vendor, "")
|
|
|
|
def test_mac_normalization_and_laa_detection(self):
|
|
self.assertEqual(normalize_mac("a6:2b:b0:a5:49:a7"), "A6:2B:B0:A5:49:A7")
|
|
self.assertTrue(is_locally_administered("a6:2b:b0:a5:49:a7"))
|
|
self.assertFalse(is_locally_administered("00:11:22:33:44:55"))
|
|
|
|
def test_maclookup_response_supports_modern_assignment_metadata(self):
|
|
payload = {
|
|
"success": True,
|
|
"found": True,
|
|
"company": "TP-Link Corporation Limited",
|
|
"blockType": "MA-M",
|
|
"isRand": False,
|
|
"isPrivate": False,
|
|
}
|
|
with patch("librenet_scanner.online_vendor._request", return_value=json.dumps(payload).encode()):
|
|
result = lookup_online_vendor("00:11:22:33:44:55", PROVIDER_MACLOOKUP)
|
|
self.assertTrue(result.found)
|
|
self.assertEqual(result.vendor, "TP-Link Corporation Limited")
|
|
self.assertEqual(result.block_type, "MA-M")
|
|
|
|
def test_macvendors_plain_text_response(self):
|
|
with patch("librenet_scanner.online_vendor._request", return_value=b"TP-Link Technologies Co., Ltd.\n"):
|
|
result = lookup_online_vendor("00:11:22:33:44:55", PROVIDER_MACVENDORS)
|
|
self.assertEqual(result.vendor, "TP-Link Technologies Co., Ltd.")
|
|
self.assertTrue(result.found)
|
|
|
|
def test_online_cache_roundtrip(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
store = HistoryStore(Path(tmp) / "history.sqlite3")
|
|
store.save_online_vendor_cache(
|
|
"00:11:22:33:44:55",
|
|
PROVIDER_MACLOOKUP,
|
|
vendor="Example Vendor",
|
|
found=True,
|
|
block_type="MA-L",
|
|
)
|
|
cached = store.online_vendor_cache("00-11-22-33-44-55", PROVIDER_MACLOOKUP)
|
|
self.assertIsNotNone(cached)
|
|
self.assertEqual(cached["vendor"], "Example Vendor")
|
|
self.assertTrue(cached["from_cache"])
|
|
|
|
def test_ui_exposes_opt_in_privacy_setting_and_manual_lookup(self):
|
|
ui = (ROOT / "src/librenet_scanner/ui.py").read_text()
|
|
self.assertIn('privacy/onlineMacLookupEnabled', ui)
|
|
self.assertIn('Interroger automatiquement une base en ligne', ui)
|
|
self.assertIn('L\'option est désactivée par défaut', ui)
|
|
self.assertIn('Rechercher en ligne', ui)
|
|
self.assertIn('_start_automatic_online_vendor_lookup()', ui)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|