Files
os-ken/os_ken/tests/unit/packet/test_cfm.py
Rodolfo Alonso Hernandez abb436deb3 Remove "six" library
This patch also removes some unneeded imported libraries.

Story: #2010182
Task: #45863
Change-Id: Ife9d349eb9c92f2a39719e76e82fe20c010fe230
2022-07-26 14:53:03 +00:00

1760 lines
62 KiB
Python

# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import logging
import inspect
import struct
from os_ken.lib import addrconv
from os_ken.lib.packet import cfm
LOG = logging.getLogger(__name__)
class Test_cfm(unittest.TestCase):
def setUp(self):
self.message = cfm.cc_message()
self.ins = cfm.cfm(self.message)
data = bytearray()
prev = None
self.buf = self.ins.serialize(data, prev)
def setUp_cc_message(self):
self.cc_message_md_lv = 1
self.cc_message_version = 1
self.cc_message_rdi = 1
self.cc_message_interval = 1
self.cc_message_seq_num = 123
self.cc_message_mep_id = 4
self.cc_message_md_name_format = 4
self.cc_message_md_name_length = 0
self.cc_message_md_name = b"hoge"
self.cc_message_short_ma_name_format = 2
self.cc_message_short_ma_name_length = 0
self.cc_message_short_ma_name = b"pakeratta"
self.cc_message_md_name_txfcf = 11
self.cc_message_md_name_rxfcb = 22
self.cc_message_md_name_txfcb = 33
self.cc_message_tlvs = [
cfm.sender_id_tlv(),
cfm.port_status_tlv(),
cfm.data_tlv(),
cfm.interface_status_tlv(),
cfm.reply_ingress_tlv(),
cfm.reply_egress_tlv(),
cfm.ltm_egress_identifier_tlv(),
cfm.ltr_egress_identifier_tlv(),
cfm.organization_specific_tlv(),
]
self.message = cfm.cc_message(
self.cc_message_md_lv,
self.cc_message_version,
self.cc_message_rdi,
self.cc_message_interval,
self.cc_message_seq_num,
self.cc_message_mep_id,
self.cc_message_md_name_format,
self.cc_message_md_name_length,
self.cc_message_md_name,
self.cc_message_short_ma_name_format,
self.cc_message_short_ma_name_length,
self.cc_message_short_ma_name,
self.cc_message_tlvs
)
self.ins = cfm.cfm(self.message)
data = bytearray()
prev = None
self.buf = self.ins.serialize(data, prev)
def setUp_loopback_message(self):
self.loopback_message_md_lv = 1
self.loopback_message_version = 1
self.loopback_message_transaction_id = 12345
self.loopback_message_tlvs = [
cfm.sender_id_tlv(),
cfm.port_status_tlv(),
cfm.data_tlv(),
cfm.interface_status_tlv(),
cfm.reply_ingress_tlv(),
cfm.reply_egress_tlv(),
cfm.ltm_egress_identifier_tlv(),
cfm.ltr_egress_identifier_tlv(),
cfm.organization_specific_tlv(),
]
self.message = cfm.loopback_message(
self.loopback_message_md_lv,
self.loopback_message_version,
self.loopback_message_transaction_id,
self.loopback_message_tlvs)
self.ins = cfm.cfm(self.message)
data = bytearray()
prev = None
self.buf = self.ins.serialize(data, prev)
def setUp_loopback_reply(self):
self.loopback_reply_md_lv = 1
self.loopback_reply_version = 1
self.loopback_reply_transaction_id = 12345
self.loopback_reply_tlvs = [
cfm.sender_id_tlv(),
cfm.port_status_tlv(),
cfm.data_tlv(),
cfm.interface_status_tlv(),
cfm.reply_ingress_tlv(),
cfm.reply_egress_tlv(),
cfm.ltm_egress_identifier_tlv(),
cfm.ltr_egress_identifier_tlv(),
cfm.organization_specific_tlv(),
]
self.message = cfm.loopback_reply(
self.loopback_reply_md_lv,
self.loopback_reply_version,
self.loopback_reply_transaction_id,
self.loopback_reply_tlvs)
self.ins = cfm.cfm(self.message)
data = bytearray()
prev = None
self.buf = self.ins.serialize(data, prev)
def setUp_link_trace_message(self):
self.link_trace_message_md_lv = 1
self.link_trace_message_version = 1
self.link_trace_message_use_fdb_only = 1
self.link_trace_message_transaction_id = 12345
self.link_trace_message_ttl = 123
self.link_trace_message_ltm_orig_addr = '11:22:33:44:55:66'
self.link_trace_message_ltm_targ_addr = '77:88:99:aa:cc:dd'
self.link_trace_message_tlvs = [
cfm.sender_id_tlv(),
cfm.port_status_tlv(),
cfm.data_tlv(),
cfm.interface_status_tlv(),
cfm.reply_ingress_tlv(),
cfm.reply_egress_tlv(),
cfm.ltm_egress_identifier_tlv(),
cfm.ltr_egress_identifier_tlv(),
cfm.organization_specific_tlv(),
]
self.message = cfm.link_trace_message(
self.link_trace_message_md_lv,
self.link_trace_message_version,
self.link_trace_message_use_fdb_only,
self.link_trace_message_transaction_id,
self.link_trace_message_ttl,
self.link_trace_message_ltm_orig_addr,
self.link_trace_message_ltm_targ_addr,
self.link_trace_message_tlvs)
self.ins = cfm.cfm(self.message)
data = bytearray()
prev = None
self.buf = self.ins.serialize(data, prev)
def setUp_link_trace_reply(self):
self.link_trace_reply_md_lv = 1
self.link_trace_reply_version = 1
self.link_trace_reply_use_fdb_only = 1
self.link_trace_reply_fwd_yes = 0
self.link_trace_reply_terminal_mep = 1
self.link_trace_reply_transaction_id = 5432
self.link_trace_reply_ttl = 123
self.link_trace_reply_relay_action = 3
self.link_trace_reply_tlvs = [
cfm.sender_id_tlv(),
cfm.port_status_tlv(),
cfm.data_tlv(),
cfm.interface_status_tlv(),
cfm.reply_ingress_tlv(),
cfm.reply_egress_tlv(),
cfm.ltm_egress_identifier_tlv(),
cfm.ltr_egress_identifier_tlv(),
cfm.organization_specific_tlv(),
]
self.message = cfm.link_trace_reply(
self.link_trace_reply_md_lv,
self.link_trace_reply_version,
self.link_trace_reply_use_fdb_only,
self.link_trace_reply_fwd_yes,
self.link_trace_reply_terminal_mep,
self.link_trace_reply_transaction_id,
self.link_trace_reply_ttl,
self.link_trace_reply_relay_action,
self.link_trace_reply_tlvs)
self.ins = cfm.cfm(self.message)
data = bytearray()
prev = None
self.buf = self.ins.serialize(data, prev)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(str(self.message), str(self.ins.op))
def test_init_cc_message(self):
self.setUp_cc_message()
self.test_init()
def test_init_loopback_message(self):
self.setUp_loopback_message()
self.test_init()
def test_init_loopback_reply(self):
self.setUp_loopback_reply()
self.test_init()
def test_init_link_trace_message(self):
self.setUp_link_trace_message()
self.test_init()
def test_init_link_trace_reply(self):
self.setUp_link_trace_reply()
self.test_init()
def test_parser(self):
_res = self.ins.parser(bytes(self.buf))
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(str(self.message), str(res.op))
def test_parser_with_cc_message(self):
self.setUp_cc_message()
self.test_parser()
def test_parser_with_loopback_message(self):
self.setUp_loopback_message()
self.test_parser()
def test_parser_with_loopback_reply(self):
self.setUp_loopback_reply()
self.test_parser()
def test_parser_with_link_trace_message(self):
self.setUp_link_trace_message()
self.test_parser()
def test_parser_with_link_trace_reply(self):
self.setUp_link_trace_reply()
self.test_parser()
def test_serialize(self):
pass
def test_serialize_with_cc_message(self):
self.setUp_cc_message()
self.test_serialize()
data = bytearray()
prev = None
buf = self.ins.serialize(data, prev)
cc_message = cfm.cc_message.parser(bytes(buf))
self.assertEqual(repr(self.message), repr(cc_message))
def test_serialize_with_loopback_message(self):
self.setUp_loopback_message()
self.test_serialize()
data = bytearray()
prev = None
buf = self.ins.serialize(data, prev)
loopback_message = cfm.loopback_message.parser(bytes(buf))
self.assertEqual(repr(self.message), repr(loopback_message))
def test_serialize_with_loopback_reply(self):
self.setUp_loopback_reply()
self.test_serialize()
data = bytearray()
prev = None
buf = self.ins.serialize(data, prev)
loopback_reply = cfm.loopback_reply.parser(bytes(buf))
self.assertEqual(repr(self.message), repr(loopback_reply))
def test_serialize_with_link_trace_message(self):
self.setUp_link_trace_message()
self.test_serialize()
data = bytearray()
prev = None
buf = self.ins.serialize(data, prev)
link_trace_message = cfm.link_trace_message.parser(bytes(buf))
self.assertEqual(repr(self.message), repr(link_trace_message))
def test_serialize_with_link_trace_reply(self):
self.setUp_link_trace_reply()
self.test_serialize()
data = bytearray()
prev = None
buf = self.ins.serialize(data, prev)
link_trace_reply = cfm.link_trace_reply.parser(bytes(buf))
self.assertEqual(repr(self.message), repr(link_trace_reply))
def test_to_string(self):
cfm_values = {'op': self.message}
_cfm_str = ','.join(['%s=%s' % (k, cfm_values[k])
for k, v in inspect.getmembers(self.ins)
if k in cfm_values])
cfm_str = '%s(%s)' % (cfm.cfm.__name__, _cfm_str)
self.assertEqual(str(self.ins), cfm_str)
self.assertEqual(repr(self.ins), cfm_str)
def test_to_string_cc_message(self):
self.setUp_cc_message()
self.test_to_string()
def test_to_string_loopback_message(self):
self.setUp_loopback_message()
self.test_to_string()
def test_to_string_loopback_reply(self):
self.setUp_loopback_reply()
self.test_to_string()
def test_to_string_link_trace_message(self):
self.setUp_link_trace_message()
self.test_to_string()
def test_to_string_link_trace_reply(self):
self.setUp_link_trace_reply()
self.test_to_string()
def test_len(self):
pass
def test_len_cc_message(self):
self.setUp_cc_message()
self.assertEqual(len(self.ins), 0 + len(self.message))
def test_len_loopback_message(self):
self.setUp_loopback_message()
self.assertEqual(len(self.ins), 0 + len(self.message))
def test_len_loopback_reply(self):
self.setUp_loopback_reply()
self.assertEqual(len(self.ins), 0 + len(self.message))
def test_len_link_trace_message(self):
self.setUp_link_trace_message()
self.assertEqual(len(self.ins), 0 + len(self.message))
def test_len_link_trace_reply(self):
self.setUp_link_trace_reply()
self.assertEqual(len(self.ins), 0 + len(self.message))
def test_default_args(self):
pass
def test_json(self):
jsondict = self.ins.to_jsondict()
ins = cfm.cfm.from_jsondict(jsondict['cfm'])
self.assertEqual(str(self.ins), str(ins))
def test_json_with_cc_message(self):
self.setUp_cc_message()
self.test_json()
def test_json_with_loopback_message(self):
self.setUp_loopback_message()
self.test_json()
def test_json_with_loopback_reply(self):
self.setUp_loopback_reply()
self.test_json()
def test_json_with_link_trace_message(self):
self.setUp_link_trace_message()
self.test_json()
def test_json_with_link_trace_reply(self):
self.setUp_link_trace_reply()
self.test_json()
class Test_cc_message(unittest.TestCase):
def setUp(self):
self.md_lv = 1
self.version = 1
self.opcode = cfm.CFM_CC_MESSAGE
self.rdi = 1
self.interval = 5
self.first_tlv_offset = cfm.cc_message._TLV_OFFSET
self.seq_num = 2
self.mep_id = 2
self.md_name_format = cfm.cc_message._MD_FMT_CHARACTER_STRING
self.md_name_length = 3
self.md_name = b"foo"
self.short_ma_name_format = 2
self.short_ma_name_length = 8
self.short_ma_name = b"hogehoge"
self.tlvs = [
]
self.end_tlv = 0
self.ins = cfm.cc_message(
self.md_lv,
self.version,
self.rdi,
self.interval,
self.seq_num,
self.mep_id,
self.md_name_format,
self.md_name_length,
self.md_name,
self.short_ma_name_format,
self.short_ma_name_length,
self.short_ma_name,
self.tlvs
)
self.form = '!4BIH2B3s2B8s33x12x4xB'
self.buf = struct.pack(
self.form,
(self.md_lv << 5) | self.version,
self.opcode,
(self.rdi << 7) | self.interval,
self.first_tlv_offset,
self.seq_num,
self.mep_id,
self.md_name_format,
self.md_name_length,
self.md_name,
self.short_ma_name_format,
self.short_ma_name_length,
self.short_ma_name,
self.end_tlv
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.md_lv, self.ins.md_lv)
self.assertEqual(self.version, self.ins.version)
self.assertEqual(self.rdi, self.ins.rdi)
self.assertEqual(self.interval, self.ins.interval)
self.assertEqual(self.seq_num, self.ins.seq_num)
self.assertEqual(self.mep_id, self.ins.mep_id)
self.assertEqual(self.md_name_format, self.ins.md_name_format)
self.assertEqual(self.md_name_length, self.ins.md_name_length)
self.assertEqual(self.md_name, self.ins.md_name)
self.assertEqual(self.short_ma_name_format, self.ins.short_ma_name_format)
self.assertEqual(self.short_ma_name_length, self.ins.short_ma_name_length)
self.assertEqual(self.short_ma_name, self.ins.short_ma_name)
self.assertEqual(self.tlvs, self.ins.tlvs)
def test_parser(self):
_res = cfm.cc_message.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.md_lv, res.md_lv)
self.assertEqual(self.version, res.version)
self.assertEqual(self.rdi, res.rdi)
self.assertEqual(self.interval, res.interval)
self.assertEqual(self.seq_num, res.seq_num)
self.assertEqual(self.mep_id, res.mep_id)
self.assertEqual(self.md_name_format, res.md_name_format)
self.assertEqual(self.md_name_length, res.md_name_length)
self.assertEqual(self.md_name, res.md_name)
self.assertEqual(self.short_ma_name_format, res.short_ma_name_format)
self.assertEqual(self.short_ma_name_length, res.short_ma_name_length)
self.assertEqual(self.short_ma_name, res.short_ma_name)
self.assertEqual(self.tlvs, res.tlvs)
def test_parser_with_no_maintenance_domain_name_present(self):
form = '!4BIH3B8s37x12x4xB'
buf = struct.pack(
form,
(self.md_lv << 5) | self.version,
self.opcode,
(self.rdi << 7) | self.interval,
self.first_tlv_offset,
self.seq_num,
self.mep_id,
cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT,
self.short_ma_name_format,
self.short_ma_name_length,
self.short_ma_name,
self.end_tlv
)
_res = cfm.cc_message.parser(buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.md_lv, res.md_lv)
self.assertEqual(self.version, res.version)
self.assertEqual(self.rdi, res.rdi)
self.assertEqual(self.interval, res.interval)
self.assertEqual(self.seq_num, res.seq_num)
self.assertEqual(self.mep_id, res.mep_id)
self.assertEqual(cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, res.md_name_format)
self.assertEqual(self.short_ma_name_format, res.short_ma_name_format)
self.assertEqual(self.short_ma_name_length, res.short_ma_name_length)
self.assertEqual(self.short_ma_name, res.short_ma_name)
self.assertEqual(self.tlvs, res.tlvs)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.rdi, res[2] >> 7)
self.assertEqual(self.interval, res[2] & 0x07)
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.seq_num, res[4])
self.assertEqual(self.mep_id, res[5])
self.assertEqual(self.md_name_format, res[6])
self.assertEqual(self.md_name_length, res[7])
self.assertEqual(self.md_name, res[8])
self.assertEqual(self.short_ma_name_format, res[9])
self.assertEqual(self.short_ma_name_length, res[10])
self.assertEqual(self.short_ma_name, res[11])
self.assertEqual(self.end_tlv, res[12])
def test_serialize_with_md_name_length_zero(self):
ins = cfm.cc_message(
self.md_lv,
self.version,
self.rdi,
self.interval,
self.seq_num,
self.mep_id,
self.md_name_format,
0,
self.md_name,
self.short_ma_name_format,
0,
self.short_ma_name,
self.tlvs
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.rdi, res[2] >> 7)
self.assertEqual(self.interval, res[2] & 0x07)
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.seq_num, res[4])
self.assertEqual(self.mep_id, res[5])
self.assertEqual(self.md_name_format, res[6])
self.assertEqual(self.md_name_length, res[7])
self.assertEqual(self.md_name, res[8])
self.assertEqual(self.short_ma_name_format, res[9])
self.assertEqual(self.short_ma_name_length, res[10])
self.assertEqual(self.short_ma_name, res[11])
self.assertEqual(self.end_tlv, res[12])
def test_serialize_with_no_maintenance_domain_name_present(self):
form = '!4BIH3B8s37x12x4xB'
ins = cfm.cc_message(
self.md_lv,
self.version,
self.rdi,
self.interval,
self.seq_num,
self.mep_id,
cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT,
0,
self.md_name,
self.short_ma_name_format,
0,
self.short_ma_name,
self.tlvs
)
buf = ins.serialize()
res = struct.unpack_from(form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.rdi, res[2] >> 7)
self.assertEqual(self.interval, res[2] & 0x07)
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.seq_num, res[4])
self.assertEqual(self.mep_id, res[5])
self.assertEqual(cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, res[6])
self.assertEqual(self.short_ma_name_format, res[7])
self.assertEqual(self.short_ma_name_length, res[8])
self.assertEqual(self.short_ma_name, res[9])
self.assertEqual(self.end_tlv, res[10])
def test_len(self):
# 75 octet (If tlv does not exist)
self.assertEqual(75, len(self.ins))
def test_default_args(self):
ins = cfm.cc_message()
buf = ins.serialize()
res = struct.unpack_from(cfm.cc_message._PACK_STR, bytes(buf))
self.assertEqual(res[0] >> 5, 0)
self.assertEqual(res[0] & 0x1f, 0)
self.assertEqual(res[1], 1)
self.assertEqual(res[2] >> 7, 0)
self.assertEqual(res[2] & 0x07, 4)
self.assertEqual(res[3], 70)
self.assertEqual(res[4], 0)
self.assertEqual(res[5], 1)
self.assertEqual(res[6], 4)
class Test_loopback_message(unittest.TestCase):
def setUp(self):
self.md_lv = 1
self.version = 1
self.opcode = cfm.CFM_LOOPBACK_MESSAGE
self.flags = 0
self.first_tlv_offset = cfm.loopback_message._TLV_OFFSET
self.transaction_id = 12345
self.tlvs = [
]
self.end_tlv = 0
self.ins = cfm.loopback_message(
self.md_lv,
self.version,
self.transaction_id,
self.tlvs,
)
self.form = '!4BIB'
self.buf = struct.pack(
self.form,
(self.md_lv << 5) | self.version,
self.opcode,
self.flags,
self.first_tlv_offset,
self.transaction_id,
self.end_tlv
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.md_lv, self.ins.md_lv)
self.assertEqual(self.version, self.ins.version)
self.assertEqual(self.transaction_id, self.ins.transaction_id)
self.assertEqual(self.tlvs, self.ins.tlvs)
def test_parser(self):
_res = cfm.loopback_message.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.md_lv, res.md_lv)
self.assertEqual(self.version, res.version)
self.assertEqual(self.transaction_id, res.transaction_id)
self.assertEqual(self.tlvs, res.tlvs)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.flags, res[2])
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.transaction_id, res[4])
self.assertEqual(self.end_tlv, res[5])
def test_len(self):
# 9 octet (If tlv does not exist)
self.assertEqual(9, len(self.ins))
def test_default_args(self):
ins = cfm.loopback_message()
buf = ins.serialize()
res = struct.unpack_from(cfm.loopback_message._PACK_STR,
bytes(buf))
self.assertEqual(res[0] >> 5, 0)
self.assertEqual(res[0] & 0x1f, 0)
self.assertEqual(res[1], 3)
self.assertEqual(res[2], 0)
self.assertEqual(res[3], 4)
self.assertEqual(res[4], 0)
class Test_loopback_reply(unittest.TestCase):
def setUp(self):
self.md_lv = 1
self.version = 1
self.opcode = cfm.CFM_LOOPBACK_REPLY
self.flags = 0
self.first_tlv_offset = cfm.loopback_reply._TLV_OFFSET
self.transaction_id = 12345
self.tlvs = [
]
self.end_tlv = 0
self.ins = cfm.loopback_reply(
self.md_lv,
self.version,
self.transaction_id,
self.tlvs,
)
self.form = '!4BIB'
self.buf = struct.pack(
self.form,
(self.md_lv << 5) | self.version,
self.opcode,
self.flags,
self.first_tlv_offset,
self.transaction_id,
self.end_tlv
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.md_lv, self.ins.md_lv)
self.assertEqual(self.version, self.ins.version)
self.assertEqual(self.transaction_id, self.ins.transaction_id)
self.assertEqual(self.tlvs, self.ins.tlvs)
def test_parser(self):
_res = cfm.loopback_reply.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.md_lv, res.md_lv)
self.assertEqual(self.version, res.version)
self.assertEqual(self.transaction_id, res.transaction_id)
self.assertEqual(self.tlvs, res.tlvs)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.flags, res[2])
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.transaction_id, res[4])
self.assertEqual(self.end_tlv, res[5])
def test_len(self):
# 9 octet (If tlv does not exist)
self.assertEqual(9, len(self.ins))
def test_default_args(self):
ins = cfm.loopback_reply()
buf = ins.serialize()
res = struct.unpack_from(cfm.loopback_reply._PACK_STR, bytes(buf))
self.assertEqual(res[0] >> 5, 0)
self.assertEqual(res[0] & 0x1f, 0)
self.assertEqual(res[1], 2)
self.assertEqual(res[2], 0)
self.assertEqual(res[3], 4)
self.assertEqual(res[4], 0)
class Test_link_trace_message(unittest.TestCase):
def setUp(self):
self.md_lv = 1
self.version = 1
self.opcode = cfm.CFM_LINK_TRACE_MESSAGE
self.use_fdb_only = 1
self.first_tlv_offset = cfm.link_trace_message._TLV_OFFSET
self.transaction_id = 12345
self.ttl = 55
self.ltm_orig_addr = "00:11:22:44:55:66"
self.ltm_targ_addr = "ab:cd:ef:23:12:65"
self.tlvs = [
]
self.end_tlv = 0
self.ins = cfm.link_trace_message(
self.md_lv,
self.version,
self.use_fdb_only,
self.transaction_id,
self.ttl,
self.ltm_orig_addr,
self.ltm_targ_addr,
self.tlvs
)
self.form = '!4BIB6s6sB'
self.buf = struct.pack(
self.form,
(self.md_lv << 5) | self.version,
self.opcode,
self.use_fdb_only << 7,
self.first_tlv_offset,
self.transaction_id,
self.ttl,
addrconv.mac.text_to_bin(self.ltm_orig_addr),
addrconv.mac.text_to_bin(self.ltm_targ_addr),
self.end_tlv
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.md_lv, self.ins.md_lv)
self.assertEqual(self.version, self.ins.version)
self.assertEqual(self.use_fdb_only, self.ins.use_fdb_only)
self.assertEqual(self.transaction_id, self.ins.transaction_id)
self.assertEqual(self.ttl, self.ins.ttl)
self.assertEqual(self.ltm_orig_addr, self.ins.ltm_orig_addr)
self.assertEqual(self.ltm_targ_addr, self.ins.ltm_targ_addr)
self.assertEqual(self.tlvs, self.ins.tlvs)
def test_parser(self):
_res = cfm.link_trace_message.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.md_lv, res.md_lv)
self.assertEqual(self.version, res.version)
self.assertEqual(self.use_fdb_only, res.use_fdb_only)
self.assertEqual(self.transaction_id, res.transaction_id)
self.assertEqual(self.ttl, res.ttl)
self.assertEqual(self.ltm_orig_addr, res.ltm_orig_addr)
self.assertEqual(self.ltm_targ_addr, res.ltm_targ_addr)
self.assertEqual(self.tlvs, res.tlvs)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.use_fdb_only, res[2] >> 7)
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.transaction_id, res[4])
self.assertEqual(self.ttl, res[5])
self.assertEqual(addrconv.mac.text_to_bin(self.ltm_orig_addr), res[6])
self.assertEqual(addrconv.mac.text_to_bin(self.ltm_targ_addr), res[7])
self.assertEqual(self.end_tlv, res[8])
def test_len(self):
# 22 octet (If tlv does not exist)
self.assertEqual(22, len(self.ins))
def test_default_args(self):
ins = cfm.link_trace_message()
buf = ins.serialize()
res = struct.unpack_from(cfm.link_trace_message._PACK_STR, bytes(buf))
self.assertEqual(res[0] >> 5, 0)
self.assertEqual(res[0] & 0x1f, 0)
self.assertEqual(res[1], 5)
self.assertEqual(res[2] >> 7, 1)
self.assertEqual(res[3], 17)
self.assertEqual(res[4], 0)
self.assertEqual(res[5], 64)
self.assertEqual(res[6], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
self.assertEqual(res[7], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
class Test_link_trace_reply(unittest.TestCase):
def setUp(self):
self.md_lv = 1
self.version = 1
self.opcode = cfm.CFM_LINK_TRACE_REPLY
self.use_fdb_only = 1
self.fwd_yes = 0
self.terminal_mep = 1
self.first_tlv_offset = cfm.link_trace_reply._TLV_OFFSET
self.transaction_id = 12345
self.ttl = 55
self.relay_action = 2
self.ltm_orig_addr = "00:11:22:aa:bb:cc"
self.ltm_targ_addr = "53:45:24:64:ac:ff"
self.tlvs = [
]
self.end_tlv = 0
self.ins = cfm.link_trace_reply(
self.md_lv,
self.version,
self.use_fdb_only,
self.fwd_yes,
self.terminal_mep,
self.transaction_id,
self.ttl,
self.relay_action,
self.tlvs,
)
self.form = '!4BIBBB'
self.buf = struct.pack(
self.form,
(self.md_lv << 5) | self.version,
self.opcode,
(self.use_fdb_only << 7) | (self.fwd_yes << 6) |
(self.terminal_mep << 5),
self.first_tlv_offset,
self.transaction_id,
self.ttl,
self.relay_action,
self.end_tlv
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.md_lv, self.ins.md_lv)
self.assertEqual(self.version, self.ins.version)
self.assertEqual(self.use_fdb_only, self.ins.use_fdb_only)
self.assertEqual(self.fwd_yes, self.ins.fwd_yes)
self.assertEqual(self.terminal_mep, self.ins.terminal_mep)
self.assertEqual(self.transaction_id, self.ins.transaction_id)
self.assertEqual(self.ttl, self.ins.ttl)
self.assertEqual(self.relay_action, self.ins.relay_action)
self.assertEqual(self.tlvs, self.ins.tlvs)
def test_parser(self):
_res = cfm.link_trace_reply.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.md_lv, res.md_lv)
self.assertEqual(self.version, res.version)
self.assertEqual(self.use_fdb_only, self.ins.use_fdb_only)
self.assertEqual(self.fwd_yes, self.ins.fwd_yes)
self.assertEqual(self.terminal_mep, self.ins.terminal_mep)
self.assertEqual(self.transaction_id, res.transaction_id)
self.assertEqual(self.ttl, res.ttl)
self.assertEqual(self.relay_action, res.relay_action)
self.assertEqual(self.tlvs, res.tlvs)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self.md_lv, res[0] >> 5)
self.assertEqual(self.version, res[0] & 0x1f)
self.assertEqual(self.opcode, res[1])
self.assertEqual(self.use_fdb_only, res[2] >> 7 & 0x01)
self.assertEqual(self.fwd_yes, res[2] >> 6 & 0x01)
self.assertEqual(self.terminal_mep, res[2] >> 5 & 0x01)
self.assertEqual(self.first_tlv_offset, res[3])
self.assertEqual(self.transaction_id, res[4])
self.assertEqual(self.ttl, res[5])
self.assertEqual(self.relay_action, res[6])
self.assertEqual(self.end_tlv, res[7])
def test_len(self):
# 11 octet (If tlv does not exist)
self.assertEqual(11, len(self.ins))
def test_default_args(self):
ins = cfm.link_trace_reply()
buf = ins.serialize()
res = struct.unpack_from(cfm.link_trace_reply._PACK_STR, bytes(buf))
self.assertEqual(res[0] >> 5, 0)
self.assertEqual(res[0] & 0x1f, 0)
self.assertEqual(res[1], 4)
self.assertEqual(res[2] >> 7, 1)
self.assertEqual(res[2] >> 6 & 0x01, 0)
self.assertEqual(res[2] >> 5 & 0x01, 1)
self.assertEqual(res[3], 6)
self.assertEqual(res[4], 0)
self.assertEqual(res[5], 64)
self.assertEqual(res[6], 1)
class Test_sender_id_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_SENDER_ID_TLV
self.length = 10
self.chassis_id_length = 1
self.chassis_id_subtype = 3
self.chassis_id = b"\x0a"
self.ma_domain_length = 2
self.ma_domain = b"\x04\x05"
self.ma_length = 3
self.ma = b"\x01\x02\x03"
self.ins = cfm.sender_id_tlv(
self.length,
self.chassis_id_length,
self.chassis_id_subtype,
self.chassis_id,
self.ma_domain_length,
self.ma_domain,
self.ma_length,
self.ma,
)
self.form = '!BHBB1sB2sB3s'
self.buf = struct.pack(
self.form,
self._type,
self.length,
self.chassis_id_length,
self.chassis_id_subtype,
self.chassis_id,
self.ma_domain_length,
self.ma_domain,
self.ma_length,
self.ma
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.chassis_id_length, self.ins.chassis_id_length)
self.assertEqual(self.chassis_id_subtype, self.ins.chassis_id_subtype)
self.assertEqual(self.chassis_id, self.ins.chassis_id)
self.assertEqual(self.ma_domain_length, self.ins.ma_domain_length)
self.assertEqual(self.ma_domain, self.ins.ma_domain)
self.assertEqual(self.ma_length, self.ins.ma_length)
self.assertEqual(self.ma, self.ins.ma)
def test_parser(self):
_res = cfm.sender_id_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.chassis_id_length, res.chassis_id_length)
self.assertEqual(self.chassis_id_subtype, res.chassis_id_subtype)
self.assertEqual(self.chassis_id, res.chassis_id)
self.assertEqual(self.ma_domain_length, res.ma_domain_length)
self.assertEqual(self.ma_domain, res.ma_domain)
self.assertEqual(self.ma_length, res.ma_length)
self.assertEqual(self.ma, res.ma)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.chassis_id_length, res[2])
self.assertEqual(self.chassis_id_subtype, res[3])
self.assertEqual(self.chassis_id, res[4])
self.assertEqual(self.ma_domain_length, res[5])
self.assertEqual(self.ma_domain, res[6])
self.assertEqual(self.ma_length, res[7])
self.assertEqual(self.ma, res[8])
def test_serialize_semi_normal_ptn1(self):
ins = cfm.sender_id_tlv(
chassis_id_subtype=self.chassis_id_subtype,
chassis_id=self.chassis_id,
ma_domain=self.ma_domain,
)
buf = ins.serialize()
form = '!BHBB1sB2sB'
res = struct.unpack_from(form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(7, res[1])
self.assertEqual(self.chassis_id_length, res[2])
self.assertEqual(self.chassis_id_subtype, res[3])
self.assertEqual(self.chassis_id, res[4])
self.assertEqual(self.ma_domain_length, res[5])
self.assertEqual(self.ma_domain, res[6])
self.assertEqual(0, res[7])
def test_serialize_semi_normal_ptn2(self):
ins = cfm.sender_id_tlv(
ma_domain=self.ma_domain,
ma=self.ma,
)
buf = ins.serialize()
form = '!BHBB2sB3s'
res = struct.unpack_from(form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(8, res[1])
self.assertEqual(0, res[2])
self.assertEqual(self.ma_domain_length, res[3])
self.assertEqual(self.ma_domain, res[4])
self.assertEqual(self.ma_length, res[5])
self.assertEqual(self.ma, res[6])
def test_serialize_semi_normal_ptn3(self):
ins = cfm.sender_id_tlv(
chassis_id_subtype=self.chassis_id_subtype,
chassis_id=self.chassis_id,
)
buf = ins.serialize()
form = '!BHBB1sB'
res = struct.unpack_from(form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(4, res[1])
self.assertEqual(self.chassis_id_length, res[2])
self.assertEqual(self.chassis_id_subtype, res[3])
self.assertEqual(self.chassis_id, res[4])
self.assertEqual(0, res[5])
def test_serialize_semi_normal_ptn4(self):
ins = cfm.sender_id_tlv(
ma_domain=self.ma_domain,
)
buf = ins.serialize()
form = '!BHBB2sB'
res = struct.unpack_from(form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(5, res[1])
self.assertEqual(0, res[2])
self.assertEqual(self.ma_domain_length, res[3])
self.assertEqual(self.ma_domain, res[4])
self.assertEqual(0, res[5])
def test_serialize_with_length_zero(self):
ins = cfm.sender_id_tlv(
0,
0,
self.chassis_id_subtype,
self.chassis_id,
0,
self.ma_domain,
0,
self.ma,
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.chassis_id_length, res[2])
self.assertEqual(self.chassis_id_subtype, res[3])
self.assertEqual(self.chassis_id, res[4])
self.assertEqual(self.ma_domain_length, res[5])
self.assertEqual(self.ma_domain, res[6])
self.assertEqual(self.ma_length, res[7])
self.assertEqual(self.ma, res[8])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 10, len(self.ins))
def test_default_args(self):
ins = cfm.sender_id_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.sender_id_tlv._PACK_STR, bytes(buf))
self.assertEqual(res[0], cfm.CFM_SENDER_ID_TLV)
self.assertEqual(res[1], 1)
self.assertEqual(res[2], 0)
class Test_port_status_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_PORT_STATUS_TLV
self.length = 1
self.port_status = 1
self.ins = cfm.port_status_tlv(
self.length,
self.port_status
)
self.form = '!BHB'
self.buf = struct.pack(
self.form,
self._type,
self.length,
self.port_status
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.port_status, self.ins.port_status)
def test_parser(self):
_res = cfm.port_status_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.port_status, res.port_status)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.port_status, res[2])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 1, len(self.ins))
def test_default_args(self):
ins = cfm.port_status_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.port_status_tlv._PACK_STR, bytes(buf))
self.assertEqual(res[0], cfm.CFM_PORT_STATUS_TLV)
self.assertEqual(res[1], 1)
self.assertEqual(res[2], 2)
class Test_data_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_DATA_TLV
self.length = 3
self.data_value = b"\x01\x02\x03"
self.ins = cfm.data_tlv(
self.length,
self.data_value
)
self.form = '!BH3s'
self.buf = struct.pack(
self.form,
self._type,
self.length,
self.data_value,
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.data_value, self.ins.data_value)
def test_parser(self):
_res = cfm.data_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.data_value, res.data_value)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.data_value, res[2])
def test_serialize_with_length_zero(self):
ins = cfm.data_tlv(
0,
self.data_value
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.data_value, res[2])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 3, len(self.ins))
def test_default_args(self):
ins = cfm.data_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.data_tlv._PACK_STR, bytes(buf))
self.assertEqual(res[0], cfm.CFM_DATA_TLV)
self.assertEqual(res[1], 0)
class Test_interface_status_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_INTERFACE_STATUS_TLV
self.length = 1
self.interface_status = 4
self.ins = cfm.interface_status_tlv(
self.length,
self.interface_status
)
self.form = '!BHB'
self.buf = struct.pack(
self.form,
self._type,
self.length,
self.interface_status
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.interface_status, self.ins.interface_status)
def test_parser(self):
_res = cfm.interface_status_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.interface_status, res.interface_status)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.interface_status, res[2])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 1, len(self.ins))
def test_default_args(self):
ins = cfm.interface_status_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.interface_status_tlv._PACK_STR, bytes(buf))
self.assertEqual(res[0], cfm.CFM_INTERFACE_STATUS_TLV)
self.assertEqual(res[1], 1)
self.assertEqual(res[2], 1)
class Test_ltm_egress_identifier_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_LTM_EGRESS_IDENTIFIER_TLV
self.length = 8
self.egress_id_ui = 7
self.egress_id_mac = "11:22:33:44:55:66"
self.ins = cfm.ltm_egress_identifier_tlv(
self.length,
self.egress_id_ui,
self.egress_id_mac
)
self.form = '!BHH6s'
self.buf = struct.pack(
self.form,
self._type,
self.length,
self.egress_id_ui,
addrconv.mac.text_to_bin(self.egress_id_mac)
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.egress_id_ui, self.ins.egress_id_ui)
self.assertEqual(self.egress_id_mac, self.ins.egress_id_mac)
def test_parser(self):
_res = cfm.ltm_egress_identifier_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.egress_id_ui, res.egress_id_ui)
self.assertEqual(self.egress_id_mac, res.egress_id_mac)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.egress_id_ui, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.egress_id_mac), res[3])
def test_serialize_with_length_zero(self):
ins = cfm.ltm_egress_identifier_tlv(
0,
self.egress_id_ui,
self.egress_id_mac
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.egress_id_ui, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.egress_id_mac), res[3])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 8, len(self.ins))
def test_default_args(self):
ins = cfm.ltm_egress_identifier_tlv()
buf = ins.serialize()
res = struct.unpack_from(
cfm.ltm_egress_identifier_tlv._PACK_STR, bytes(buf))
self.assertEqual(res[0], cfm.CFM_LTM_EGRESS_IDENTIFIER_TLV)
self.assertEqual(res[1], 8)
self.assertEqual(res[2], 0)
self.assertEqual(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
class Test_ltr_egress_identifier_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_LTR_EGRESS_IDENTIFIER_TLV
self.length = 16
self.last_egress_id_ui = 7
self.last_egress_id_mac = "11:22:33:44:55:66"
self.next_egress_id_ui = 5
self.next_egress_id_mac = "33:11:33:aa:bb:cc"
self.ins = cfm.ltr_egress_identifier_tlv(self.length,
self.last_egress_id_ui,
self.last_egress_id_mac,
self.next_egress_id_ui,
self.next_egress_id_mac
)
self.form = '!BHH6sH6s'
self.buf = struct.pack(
self.form,
self._type,
self.length,
self.last_egress_id_ui,
addrconv.mac.text_to_bin(self.last_egress_id_mac),
self.next_egress_id_ui,
addrconv.mac.text_to_bin(self.next_egress_id_mac))
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.last_egress_id_ui, self.ins.last_egress_id_ui)
self.assertEqual(self.last_egress_id_mac, self.ins.last_egress_id_mac)
self.assertEqual(self.next_egress_id_ui, self.ins.next_egress_id_ui)
self.assertEqual(self.next_egress_id_mac, self.ins.next_egress_id_mac)
def test_parser(self):
_res = cfm.ltr_egress_identifier_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.last_egress_id_ui, res.last_egress_id_ui)
self.assertEqual(self.last_egress_id_mac, res.last_egress_id_mac)
self.assertEqual(self.next_egress_id_ui, res.next_egress_id_ui)
self.assertEqual(self.next_egress_id_mac, res.next_egress_id_mac)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.last_egress_id_ui, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.last_egress_id_mac), res[3])
self.assertEqual(self.next_egress_id_ui, res[4])
self.assertEqual(addrconv.mac.text_to_bin(self.next_egress_id_mac), res[5])
def test_serialize_with_length_zero(self):
ins = cfm.ltr_egress_identifier_tlv(0,
self.last_egress_id_ui,
self.last_egress_id_mac,
self.next_egress_id_ui,
self.next_egress_id_mac
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.last_egress_id_ui, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.last_egress_id_mac), res[3])
self.assertEqual(self.next_egress_id_ui, res[4])
self.assertEqual(addrconv.mac.text_to_bin(self.next_egress_id_mac), res[5])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 16, len(self.ins))
def test_default_args(self):
ins = cfm.ltr_egress_identifier_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.ltr_egress_identifier_tlv._PACK_STR,
bytes(buf))
self.assertEqual(res[0], cfm.CFM_LTR_EGRESS_IDENTIFIER_TLV)
self.assertEqual(res[1], 16)
self.assertEqual(res[2], 0)
self.assertEqual(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
self.assertEqual(res[4], 0)
self.assertEqual(res[5], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
class Test_organization_specific_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_ORGANIZATION_SPECIFIC_TLV
self.length = 10
self.oui = b"\xff\x12\x34"
self.subtype = 3
self.value = b"\x01\x02\x0f\x0e\x0d\x0c"
self.ins = cfm.organization_specific_tlv(self.length,
self.oui,
self.subtype,
self.value
)
self.form = '!BH3sB6s'
self.buf = struct.pack(self.form,
self._type,
self.length,
self.oui,
self.subtype,
self.value
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.oui, self.ins.oui)
self.assertEqual(self.subtype, self.ins.subtype)
self.assertEqual(self.value, self.ins.value)
def test_parser(self):
_res = cfm.organization_specific_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.oui, res.oui)
self.assertEqual(self.subtype, res.subtype)
self.assertEqual(self.value, res.value)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.oui, res[2])
self.assertEqual(self.subtype, res[3])
self.assertEqual(self.value, res[4])
def test_serialize_with_zero(self):
ins = cfm.organization_specific_tlv(0,
self.oui,
self.subtype,
self.value
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.oui, res[2])
self.assertEqual(self.subtype, res[3])
self.assertEqual(self.value, res[4])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 10, len(self.ins))
def test_default_args(self):
ins = cfm.organization_specific_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.organization_specific_tlv._PACK_STR,
bytes(buf))
self.assertEqual(res[0], cfm.CFM_ORGANIZATION_SPECIFIC_TLV)
self.assertEqual(res[1], 4)
self.assertEqual(res[2], b"\x00\x00\x00")
self.assertEqual(res[3], 0)
class Test_reply_ingress_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_REPLY_INGRESS_TLV
self.length = 12
self.action = 2
self.mac_address = 'aa:bb:cc:56:34:12'
self.port_id_length = 3
self.port_id_subtype = 2
self.port_id = b"\x01\x04\x09"
self.ins = cfm.reply_ingress_tlv(self.length, self.action,
self.mac_address,
self.port_id_length,
self.port_id_subtype,
self.port_id
)
self.form = '!BHB6sBB3s'
self.buf = struct.pack(self.form,
self._type,
self.length,
self.action,
addrconv.mac.text_to_bin(self.mac_address),
self.port_id_length,
self.port_id_subtype,
self.port_id
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.action, self.ins.action)
self.assertEqual(self.mac_address, self.ins.mac_address)
self.assertEqual(self.port_id_length, self.ins.port_id_length)
self.assertEqual(self.port_id_subtype, self.ins.port_id_subtype)
self.assertEqual(self.port_id, self.ins.port_id)
def test_parser(self):
_res = cfm.reply_ingress_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.action, res.action)
self.assertEqual(self.mac_address, res.mac_address)
self.assertEqual(self.port_id_length, res.port_id_length)
self.assertEqual(self.port_id_subtype, res.port_id_subtype)
self.assertEqual(self.port_id, res.port_id)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.action, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.mac_address), res[3])
self.assertEqual(self.port_id_length, res[4])
self.assertEqual(self.port_id_subtype, res[5])
self.assertEqual(self.port_id, res[6])
def test_serialize_with_zero(self):
ins = cfm.reply_ingress_tlv(0,
self.action,
self.mac_address,
0,
self.port_id_subtype,
self.port_id
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.action, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.mac_address), res[3])
self.assertEqual(self.port_id_length, res[4])
self.assertEqual(self.port_id_subtype, res[5])
self.assertEqual(self.port_id, res[6])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 12, len(self.ins))
def test_default_args(self):
ins = cfm.reply_ingress_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.reply_ingress_tlv._PACK_STR, bytes(buf))
self.assertEqual(res[0], cfm.CFM_REPLY_INGRESS_TLV)
self.assertEqual(res[1], 7)
self.assertEqual(res[2], 1)
self.assertEqual(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
class Test_reply_egress_tlv(unittest.TestCase):
def setUp(self):
self._type = cfm.CFM_REPLY_EGRESS_TLV
self.length = 12
self.action = 2
self.mac_address = 'aa:bb:cc:56:34:12'
self.port_id_length = 3
self.port_id_subtype = 2
self.port_id = b"\x01\x04\x09"
self.ins = cfm.reply_egress_tlv(self.length,
self.action,
self.mac_address,
self.port_id_length,
self.port_id_subtype,
self.port_id
)
self.form = '!BHB6sBB3s'
self.buf = struct.pack(self.form,
self._type,
self.length,
self.action,
addrconv.mac.text_to_bin(self.mac_address),
self.port_id_length,
self.port_id_subtype,
self.port_id
)
def tearDown(self):
pass
def test_init(self):
self.assertEqual(self.length, self.ins.length)
self.assertEqual(self.action, self.ins.action)
self.assertEqual(self.mac_address, self.ins.mac_address)
self.assertEqual(self.port_id_length, self.ins.port_id_length)
self.assertEqual(self.port_id_subtype, self.ins.port_id_subtype)
self.assertEqual(self.port_id, self.ins.port_id)
def test_parser(self):
_res = cfm.reply_ingress_tlv.parser(self.buf)
if type(_res) is tuple:
res = _res[0]
else:
res = _res
self.assertEqual(self.length, res.length)
self.assertEqual(self.action, res.action)
self.assertEqual(self.mac_address, res.mac_address)
self.assertEqual(self.port_id_length, res.port_id_length)
self.assertEqual(self.port_id_subtype, res.port_id_subtype)
self.assertEqual(self.port_id, res.port_id)
def test_serialize(self):
buf = self.ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.action, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.mac_address), res[3])
self.assertEqual(self.port_id_length, res[4])
self.assertEqual(self.port_id_subtype, res[5])
self.assertEqual(self.port_id, res[6])
def test_serialize_with_zero(self):
ins = cfm.reply_egress_tlv(0,
self.action,
self.mac_address,
0,
self.port_id_subtype,
self.port_id
)
buf = ins.serialize()
res = struct.unpack_from(self.form, bytes(buf))
self.assertEqual(self._type, res[0])
self.assertEqual(self.length, res[1])
self.assertEqual(self.action, res[2])
self.assertEqual(addrconv.mac.text_to_bin(self.mac_address), res[3])
self.assertEqual(self.port_id_length, res[4])
self.assertEqual(self.port_id_subtype, res[5])
self.assertEqual(self.port_id, res[6])
def test_len(self):
# tlv_length = type_len + length_len + value_len
self.assertEqual(1 + 2 + 12, len(self.ins))
def test_default_args(self):
ins = cfm.reply_egress_tlv()
buf = ins.serialize()
res = struct.unpack_from(cfm.reply_egress_tlv._PACK_STR,
bytes(buf))
self.assertEqual(res[0], cfm.CFM_REPLY_EGRESS_TLV)
self.assertEqual(res[1], 7)
self.assertEqual(res[2], 1)
self.assertEqual(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))