summaryrefslogtreecommitdiffstats
path: root/netaddr/tests/eui
diff options
context:
space:
mode:
Diffstat (limited to 'netaddr/tests/eui')
-rw-r--r--netaddr/tests/eui/__init__.py0
-rw-r--r--netaddr/tests/eui/sample_iab.txt6
-rw-r--r--netaddr/tests/eui/sample_oui.txt6
-rw-r--r--netaddr/tests/eui/test_eui.py342
-rw-r--r--netaddr/tests/eui/test_ieee_parsers.py51
5 files changed, 405 insertions, 0 deletions
diff --git a/netaddr/tests/eui/__init__.py b/netaddr/tests/eui/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/netaddr/tests/eui/__init__.py
diff --git a/netaddr/tests/eui/sample_iab.txt b/netaddr/tests/eui/sample_iab.txt
new file mode 100644
index 0000000..4742477
--- /dev/null
+++ b/netaddr/tests/eui/sample_iab.txt
@@ -0,0 +1,6 @@
+
+00-50-C2 (hex) ACME CORPORATION
+ABC000-ABCFFF (base 16) ACME CORPORATION
+ 1 MAIN STREET
+ SPRINGFIELD
+ UNITED STATES
diff --git a/netaddr/tests/eui/sample_oui.txt b/netaddr/tests/eui/sample_oui.txt
new file mode 100644
index 0000000..fd33050
--- /dev/null
+++ b/netaddr/tests/eui/sample_oui.txt
@@ -0,0 +1,6 @@
+
+00-CA-FE (hex) ACME CORPORATION
+00CAFE (base 16) ACME CORPORATION
+ 1 MAIN STREET
+ SPRINGFIELD
+ UNITED STATES
diff --git a/netaddr/tests/eui/test_eui.py b/netaddr/tests/eui/test_eui.py
new file mode 100644
index 0000000..c17d0ce
--- /dev/null
+++ b/netaddr/tests/eui/test_eui.py
@@ -0,0 +1,342 @@
+import sys
+import pickle
+import random
+
+import pytest
+
+from netaddr import (EUI, mac_unix, mac_unix_expanded, mac_cisco,
+ mac_bare, mac_pgsql, eui64_unix, eui64_unix_expanded,
+ eui64_cisco, eui64_bare, OUI, IAB, IPAddress)
+
+
+def test_mac_address_properties():
+ mac = EUI('00-1B-77-49-54-FD')
+ assert repr(mac) == "EUI('00-1B-77-49-54-FD')"
+ assert str(mac)
+ assert str(mac.oui) == '00-1B-77'
+ assert mac.ei == '49-54-FD'
+ assert mac.version == 48
+
+
+def test_mac_address_numerical_operations():
+ mac = EUI('00-1B-77-49-54-FD')
+ assert int(mac) == 117965411581
+ assert hex(mac) == '0x1b774954fd'
+ assert mac.bits() == '00000000-00011011-01110111-01001001-01010100-11111101'
+ assert mac.bin == '0b1101101110111010010010101010011111101'
+
+
+@pytest.mark.skipif(sys.version_info > (3,), reason="requires python 2.x")
+def test_eui_oct_format_py2():
+ assert oct(EUI('00-1B-77-49-54-FD')) == '01556722252375'
+
+
+@pytest.mark.skipif(sys.version_info < (3,), reason="requires python 3.x")
+def test_eui_oct_format_py3():
+ assert oct(EUI('00-1B-77-49-54-FD')) == '0o1556722252375'
+
+
+def test_eui_constructor():
+ assert str(EUI('00-1B-77-49-54-FD')) == '00-1B-77-49-54-FD'
+ assert str(EUI('00-1b-77-49-54-fd')) == '00-1B-77-49-54-FD'
+ assert str(EUI('0:1b:77:49:54:fd')) == '00-1B-77-49-54-FD'
+ assert str(EUI('001b:7749:54fd')) == '00-1B-77-49-54-FD'
+ assert str(EUI('1b:7749:54fd')) == '00-1B-77-49-54-FD'
+ assert str(EUI('1B:7749:54FD')) == '00-1B-77-49-54-FD'
+ assert str(EUI('001b774954fd')) == '00-1B-77-49-54-FD'
+ assert str(EUI('01B774954FD')) == '00-1B-77-49-54-FD'
+ assert str(EUI('001B77:4954FD')) == '00-1B-77-49-54-FD'
+
+ eui = EUI('00-90-96-AF-CC-39')
+
+ assert eui == EUI('0-90-96-AF-CC-39')
+ assert eui == EUI('00-90-96-af-cc-39')
+ assert eui == EUI('00:90:96:AF:CC:39')
+ assert eui == EUI('00:90:96:af:cc:39')
+ assert eui == EUI('0090-96AF-CC39')
+ assert eui == EUI('0090:96af:cc39')
+ assert eui == EUI('009096-AFCC39')
+ assert eui == EUI('009096:AFCC39')
+ assert eui == EUI('009096AFCC39')
+ assert eui == EUI('009096afcc39')
+ assert EUI('01-00-00-00-00-00') == EUI('010000000000')
+ assert EUI('01-00-00-00-00-00') == EUI('10000000000')
+ assert EUI('01-00-00-01-00-00') == EUI('010000:010000')
+ assert EUI('01-00-00-01-00-00') == EUI('10000:10000')
+
+
+def test_eui_dialects():
+ mac = EUI('00-1B-77-49-54-FD')
+ assert str(mac) == '00-1B-77-49-54-FD'
+
+ mac = EUI('00-1B-77-49-54-FD', dialect=mac_unix)
+ assert str(mac) == '0:1b:77:49:54:fd'
+
+ mac = EUI('00-1B-77-49-54-FD', dialect=mac_unix_expanded)
+ assert str(mac) == '00:1b:77:49:54:fd'
+
+ mac = EUI('00-1B-77-49-54-FD', dialect=mac_cisco)
+ assert str(mac) == '001b.7749.54fd'
+
+ mac = EUI('00-1B-77-49-54-FD', dialect=mac_bare)
+ assert str(mac) == '001B774954FD'
+
+ mac = EUI('00-1B-77-49-54-FD', dialect=mac_pgsql)
+ assert str(mac) == '001b77:4954fd'
+
+
+def test_eui_dialect_property_assignment():
+ mac = EUI('00-1B-77-49-54-FD')
+ assert str(mac) == '00-1B-77-49-54-FD'
+
+ mac.dialect = mac_pgsql
+ assert str(mac) == '001b77:4954fd'
+
+
+def test_eui_format():
+ mac = EUI('00-1B-77-49-54-FD')
+ assert mac.format() == '00-1B-77-49-54-FD'
+ assert mac.format(mac_pgsql) == '001b77:4954fd'
+ assert mac.format(mac_unix_expanded) == '00:1b:77:49:54:fd'
+
+
+def test_eui_custom_dialect():
+ class mac_custom(mac_unix):
+ word_fmt = '%.2X'
+
+ mac = EUI('00-1B-77-49-54-FD', dialect=mac_custom)
+ assert str(mac) == '00:1B:77:49:54:FD'
+
+
+def test_eui64_dialects():
+ mac = EUI('00-1B-77-49-54-FD-12-34')
+ assert str(mac) == '00-1B-77-49-54-FD-12-34'
+
+ mac = EUI('00-1B-77-49-54-FD-12-34', dialect=eui64_unix)
+ assert str(mac) == '0:1b:77:49:54:fd:12:34'
+
+ mac = EUI('00-1B-77-49-54-FD-12-34', dialect=eui64_unix_expanded)
+ assert str(mac) == '00:1b:77:49:54:fd:12:34'
+
+ mac = EUI('00-1B-77-49-54-FD-12-34', dialect=eui64_cisco)
+ assert str(mac) == '001b.7749.54fd.1234'
+
+ mac = EUI('00-1B-77-49-54-FD-12-34', dialect=eui64_bare)
+ assert str(mac) == '001B774954FD1234'
+
+
+def test_eui64_dialect_property_assignment():
+ mac = EUI('00-1B-77-49-54-FD-12-34')
+ assert str(mac) == '00-1B-77-49-54-FD-12-34'
+
+ mac.dialect = eui64_cisco
+ assert str(mac) == '001b.7749.54fd.1234'
+
+
+def test_eui64_custom_dialect():
+ class eui64_custom(eui64_unix):
+ word_fmt = '%.2X'
+
+ mac = EUI('00-1B-77-49-54-FD-12-34', dialect=eui64_custom)
+ assert str(mac) == '00:1B:77:49:54:FD:12:34'
+
+
+def test_eui_oui_information():
+ mac = EUI('00-1B-77-49-54-FD')
+ oui = mac.oui
+ assert str(oui) == '00-1B-77'
+
+ assert oui.registration().address == [
+ 'Lot 8, Jalan Hi-Tech 2/3',
+ 'Kulim Kedah 09000',
+ 'MY'
+ ]
+
+ assert oui.registration().org == 'Intel Corporate'
+
+
+def test_oui_constructor():
+ oui = OUI(524336)
+ assert str(oui) == '08-00-30'
+ assert oui == OUI('08-00-30')
+
+ assert oui.registration(0).address == [
+ '2380 N. ROSE AVENUE',
+ 'OXNARD CA 93010',
+ 'US'
+ ]
+ assert oui.registration(0).org == 'NETWORK RESEARCH CORPORATION'
+ assert oui.registration(0).oui == '08-00-30'
+
+ assert oui.registration(1).address == [
+ 'GPO BOX 2476V',
+ 'MELBOURNE VIC 3001',
+ 'AU',
+ ]
+ assert oui.registration(1).org == 'ROYAL MELBOURNE INST OF TECH'
+ assert oui.registration(1).oui == '08-00-30'
+
+ assert oui.registration(2).address == [
+ 'CH-1211',
+ 'GENEVE SUISSE/SWITZ 023',
+ 'CH'
+ ]
+ assert oui.registration(2).org == 'CERN'
+ assert oui.registration(2).oui == '08-00-30'
+ assert oui.reg_count == 3
+
+
+def test_oui_hash():
+ oui0 = OUI(0)
+ oui1 = OUI(1)
+ oui_dict = {oui0: None, oui1: None}
+
+ assert list(oui_dict.keys()) == [OUI(0), OUI(1)]
+
+
+def test_eui_iab():
+ mac = EUI('00-50-C2-00-0F-01')
+ assert mac.is_iab()
+
+ iab = mac.iab
+ assert str(iab) == '00-50-C2-00-00-00'
+ assert iab == IAB('00-50-C2-00-00-00')
+
+ reg_info = iab.registration()
+
+ assert reg_info.address == [
+ '1241 Superieor Ave E',
+ 'Cleveland OH 44114',
+ 'US',
+ ]
+
+ assert reg_info.iab == '00-50-C2-00-00-00'
+ assert reg_info.org == 'T.L.S. Corp.'
+
+
+def test_eui64():
+ eui = EUI('00-1B-77-FF-FE-49-54-FD')
+ assert eui == EUI('00-1B-77-FF-FE-49-54-FD')
+ assert eui.oui == OUI('00-1B-77')
+ assert eui.ei == 'FF-FE-49-54-FD'
+ assert eui.eui64() == EUI('00-1B-77-FF-FE-49-54-FD')
+
+
+
+def test_mac_to_ipv6_link_local():
+ mac = EUI('00-0F-1F-12-E7-33')
+ ip = mac.ipv6_link_local()
+ assert ip == IPAddress('fe80::20f:1fff:fe12:e733')
+ assert ip.is_link_local()
+ assert mac.eui64() == EUI('00-0F-1F-FF-FE-12-E7-33')
+
+
+def test_iab():
+ eui = EUI('00-50-C2-05-C0-00')
+
+ assert eui.is_iab()
+ assert str(eui.oui) == '00-50-C2'
+ assert str(eui.iab) == '00-50-C2-05-C0-00'
+ assert eui.ei == '05-C0-00'
+ assert int(eui.oui) == 0x0050c2
+ assert int(eui.iab) == 0x0050c205c
+
+ assert IAB(eui.value) == eui.iab
+
+
+def test_new_iab():
+ eui = EUI('40-D8-55-13-10-00')
+
+ assert eui.is_iab()
+ assert str(eui.oui) == '40-D8-55'
+ assert str(eui.iab) == '40-D8-55-13-10-00'
+ assert eui.ei == '13-10-00'
+ assert int(eui.oui) == 0x40d855
+ assert int(eui.iab) == 0x40d855131
+
+ assert IAB(eui.value) == eui.iab
+
+
+def test_eui48_vs_eui64():
+ eui48 = EUI('01-00-00-01-00-00')
+ assert int(eui48) == 1099511693312
+
+ eui64 = EUI('00-00-01-00-00-01-00-00')
+ assert int(eui64) == 1099511693312
+ assert eui48 != eui64
+
+
+def test_eui_sort_order():
+ eui_list = [
+ EUI(0, 64),
+ EUI(0),
+ EUI(0xffffffffffff, dialect=mac_unix),
+ EUI(0x1000000000000),
+ ]
+
+ random.shuffle(eui_list)
+ eui_list.sort()
+
+ assert [(str(eui), eui.version) for eui in eui_list] == [
+ ('00-00-00-00-00-00', 48),
+ ('ff:ff:ff:ff:ff:ff', 48),
+ ('00-00-00-00-00-00-00-00', 64),
+ ('00-01-00-00-00-00-00-00', 64),
+ ]
+
+
+def test_eui_pickle_support():
+ eui1 = EUI('00-00-00-01-02-03')
+ eui2 = pickle.loads(pickle.dumps(eui1))
+ assert eui1 == eui2
+
+ eui1 = EUI('00-00-00-01-02-03', dialect=mac_cisco)
+ eui2 = pickle.loads(pickle.dumps(eui1))
+ assert eui1 == eui2
+ assert eui1.dialect == eui2.dialect
+
+ oui1 = EUI('00-00-00-01-02-03').oui
+ oui2 = pickle.loads(pickle.dumps(oui1))
+ assert oui1 == oui2
+ assert oui1.records == oui2.records
+
+ iab1 = EUI('00-50-C2-00-1F-FF').iab
+ iab2 = pickle.loads(pickle.dumps(iab1))
+ assert iab1 == iab2
+ assert iab1.record == iab2.record
+
+
+def test_mac_to_eui64_conversion():
+ mac = EUI('00-1B-77-49-54-FD')
+ assert mac == EUI('00-1B-77-49-54-FD')
+
+ eui = mac.eui64()
+ assert eui == EUI('00-1B-77-FF-FE-49-54-FD')
+ eui.eui64() == EUI('00-1B-77-FF-FE-49-54-FD')
+
+ assert int(eui) == 7731765737772285
+ assert eui.packed == b'\x00\x1bw\xff\xfeIT\xfd'
+ assert eui.bin == '0b11011011101111111111111111110010010010101010011111101'
+ assert eui.bits() == '00000000-00011011-01110111-11111111-11111110-01001001-01010100-11111101'
+
+
+def test_mac_to_ipv6():
+ mac = EUI('00-1B-77-49-54-FD')
+ eui = mac.eui64()
+ assert mac == EUI('00-1B-77-49-54-FD')
+ assert eui == EUI('00-1B-77-FF-FE-49-54-FD')
+
+ assert mac.modified_eui64() == EUI('02-1B-77-FF-FE-49-54-FD')
+ assert mac.ipv6_link_local() == IPAddress('fe80::21b:77ff:fe49:54fd')
+ assert eui.ipv6_link_local() == IPAddress('fe80::21b:77ff:fe49:54fd')
+
+ assert mac.ipv6(0x12340000000000000000000000000000) == IPAddress('1234::21b:77ff:fe49:54fd')
+ assert eui.ipv6(0x12340000000000000000000000000000) == IPAddress('1234::21b:77ff:fe49:54fd')
+
+
+def test_eui64_constructor():
+ addr_colons = EUI('00:1B:77:49:54:FD:BB:34')
+ assert addr_colons == EUI('00-1B-77-49-54-FD-BB-34')
+
+ addr_no_delimiter = EUI('001B774954FDBB34')
+ assert addr_no_delimiter == EUI('00-1B-77-49-54-FD-BB-34')
diff --git a/netaddr/tests/eui/test_ieee_parsers.py b/netaddr/tests/eui/test_ieee_parsers.py
new file mode 100644
index 0000000..69dc014
--- /dev/null
+++ b/netaddr/tests/eui/test_ieee_parsers.py
@@ -0,0 +1,51 @@
+import contextlib
+import sys
+
+import pytest
+
+from netaddr.compat import _open_binary
+from netaddr.eui.ieee import OUIIndexParser, IABIndexParser, FileIndexer
+
+
+@pytest.mark.skipif(sys.version_info > (3,), reason="requires python 2.x")
+def test_oui_parser_py2():
+ from cStringIO import StringIO
+ outfile = StringIO()
+ with contextlib.closing(_open_binary(__package__, 'sample_oui.txt')) as infile:
+ iab_parser = OUIIndexParser(infile)
+ iab_parser.attach(FileIndexer(outfile))
+ iab_parser.parse()
+ assert outfile.getvalue() == '51966,1,138\n'
+
+
+@pytest.mark.skipif(sys.version_info > (3,), reason="requires python 2.x")
+def test_iab_parser_py2():
+ from cStringIO import StringIO
+ outfile = StringIO()
+ with contextlib.closing(_open_binary(__package__, 'sample_iab.txt')) as infile:
+ iab_parser = IABIndexParser(infile)
+ iab_parser.attach(FileIndexer(outfile))
+ iab_parser.parse()
+ assert outfile.getvalue() == '84683452,1,181\n'
+
+
+@pytest.mark.skipif(sys.version_info < (3,), reason="requires python 3.x")
+def test_oui_parser_py3():
+ from io import StringIO
+ outfile = StringIO()
+ with contextlib.closing(_open_binary(__package__, 'sample_oui.txt')) as infile:
+ iab_parser = OUIIndexParser(infile)
+ iab_parser.attach(FileIndexer(outfile))
+ iab_parser.parse()
+ assert outfile.getvalue() == '51966,1,138\n'
+
+
+@pytest.mark.skipif(sys.version_info < (3,), reason="requires python 3.x")
+def test_iab_parser_py3():
+ from io import StringIO
+ outfile = StringIO()
+ with contextlib.closing(_open_binary(__package__, 'sample_iab.txt')) as infile:
+ iab_parser = IABIndexParser(infile)
+ iab_parser.attach(FileIndexer(outfile))
+ iab_parser.parse()
+ assert outfile.getvalue() == '84683452,1,181\n'