From 3a482ac38f1440fa0cbc00f621dc94ebb551757b Mon Sep 17 00:00:00 2001 From: maksymbelei95 <75987222+maksymbelei95@users.noreply.github.com> Date: Thu, 18 Mar 2021 19:42:54 +0200 Subject: [PATCH] [test] Update unit test coverage for command 'show mac' (#1504) * Adding unit tests for CLI command 'show mac'. Testing both CLI command and 'fdbshow' script. Signed-off-by: Maksym Belei --- scripts/fdbshow | 41 +++- tests/fdbshow_input/asic_db.json | 73 +++++++ tests/fdbshow_input/asic_db_def_vlan.json | 42 ++++ tests/fdbshow_input/asic_db_fetch_except.json | 50 +++++ tests/fdbshow_input/asic_db_no_bridge.json | 15 ++ tests/fdbshow_input/asic_db_no_fdb.json | 27 +++ tests/fdbshow_input/counters_db.json | 9 + tests/fdbshow_test.py | 198 ++++++++++++++++++ 8 files changed, 446 insertions(+), 9 deletions(-) create mode 100644 tests/fdbshow_input/asic_db.json create mode 100644 tests/fdbshow_input/asic_db_def_vlan.json create mode 100644 tests/fdbshow_input/asic_db_fetch_except.json create mode 100644 tests/fdbshow_input/asic_db_no_bridge.json create mode 100644 tests/fdbshow_input/asic_db_no_fdb.json create mode 100644 tests/fdbshow_input/counters_db.json create mode 100755 tests/fdbshow_test.py diff --git a/scripts/fdbshow b/scripts/fdbshow index 53badedc6943..2ae95cab79f2 100755 --- a/scripts/fdbshow +++ b/scripts/fdbshow @@ -29,6 +29,29 @@ import argparse import json import sys +import os + +# mock the redis for unit test purposes # +try: # pragma: no cover + if os.environ["UTILITIES_UNIT_TESTING"] == "1": + modules_path = os.path.join(os.path.dirname(__file__), "..") + test_path = os.path.join(modules_path, "tests") + sys.path.insert(0, modules_path) + sys.path.insert(0, test_path) + import mock_tables.dbconnector + mock_variants = { "1": 'asic_db', + "2": 'asic_db_def_vlan', + "3": 'asic_db_no_fdb', + "4": 'asic_db_no_bridge', + "5": 'asic_db_fetch_except'} + mock_db_path = os.path.join(test_path, "fdbshow_input") + file_name = mock_variants[os.environ["FDBSHOW_MOCK"]] + jsonfile_asic = os.path.join(mock_db_path, file_name) + mock_tables.dbconnector.dedicated_dbs['ASIC_DB'] = jsonfile_asic + jsonfile_counters = os.path.join(mock_db_path, 'counters_db') + mock_tables.dbconnector.dedicated_dbs['COUNTERS_DB'] = jsonfile_counters +except KeyError: # pragma: no cover + pass from natsort import natsorted from swsssdk import port_util @@ -56,14 +79,14 @@ class FdbShow(object): """ self.db.connect(self.db.ASIC_DB) self.bridge_mac_list = [] + + if not self.if_br_oid_map: + return fdb_str = self.db.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:*") if not fdb_str: return - if self.if_br_oid_map is None: - return - oid_pfx = len("oid:0x") for s in fdb_str: fdb_entry = s @@ -84,7 +107,10 @@ class FdbShow(object): if_name = port_id if 'vlan' in fdb: vlan_id = fdb["vlan"] - elif 'bvid' in fdb: + else: + if 'bvid' not in fdb: + # no possibility to find the Vlan id. skip the FDB entry + continue try: vlan_id = port_util.get_vlan_id_from_bvid(self.db, fdb["bvid"]) if vlan_id is None: @@ -100,16 +126,13 @@ class FdbShow(object): return - def get_iter_index(self, key_value=0, pos=0): + def get_iter_index(self, key_value, pos=0): """ Get the starting index of matched entry """ if pos != 0: self.bridge_mac_list = natsorted(self.bridge_mac_list, key = lambda x: x[pos]) - if key_value == 0: - return 0 - keys = [r[pos] for r in self.bridge_mac_list] return keys.index(key_value) @@ -154,5 +177,5 @@ def main(): print(str(e)) sys.exit(1) -if __name__ == "__main__": +if __name__ == "__main__": # pragma: no cover main() diff --git a/tests/fdbshow_input/asic_db.json b/tests/fdbshow_input/asic_db.json new file mode 100644 index 000000000000..4cc8d6820147 --- /dev/null +++ b/tests/fdbshow_input/asic_db.json @@ -0,0 +1,73 @@ +{ + "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000": { + "SAI_SWITCH_ATTR_INIT_SWITCH": "true", + "SAI_SWITCH_ATTR_SRC_MAC_ADDRESS": "DE:AD:BE:EF:CA:FE" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000005cb": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000528", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000006cd": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000549", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000007ef": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000fff", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000005c5\",\"mac\":\"11:22:33:44:55:66\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005cb", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000006c6\",\"mac\":\"11:22:33:66:55:44\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000006cd", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_STATIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000007c7\",\"mac\":\"66:55:44:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005cb", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005ff", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000007c7\",\"mac\":\"77:55:44:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000fff", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000007c7\",\"mac\":\"77:66:44:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000007ef", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"vlan\":\"5\",\"mac\":\"77:66:55:44:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000006cd", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"mac\":\"77:66:55:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000007ef", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000005c5": { + "SAI_VLAN_ATTR_VLAN_ID": "2" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000006c6": { + "SAI_VLAN_ATTR_VLAN_ID": "3" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000007c7": { + "SAI_VLAN_ATTR_VLAN_ID": "4" + } +} diff --git a/tests/fdbshow_input/asic_db_def_vlan.json b/tests/fdbshow_input/asic_db_def_vlan.json new file mode 100644 index 000000000000..b0c7e2100dd1 --- /dev/null +++ b/tests/fdbshow_input/asic_db_def_vlan.json @@ -0,0 +1,42 @@ +{ + "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000": { + "SAI_SWITCH_ATTR_INIT_SWITCH": "true", + "SAI_SWITCH_ATTR_SRC_MAC_ADDRESS": "DE:AD:BE:EF:CA:FE" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000005cb": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000528", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000006cd": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000549", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000005c5\",\"mac\":\"11:22:33:44:55:66\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005cb", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000006c6\",\"mac\":\"11:22:33:66:55:44\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000006cd", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_STATIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000013\",\"mac\":\"66:55:44:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005cb", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000005c5": { + "SAI_VLAN_ATTR_VLAN_ID": "2" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000006c6": { + "SAI_VLAN_ATTR_VLAN_ID": "3" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000013": { + "NULL": "NULL" + } +} diff --git a/tests/fdbshow_input/asic_db_fetch_except.json b/tests/fdbshow_input/asic_db_fetch_except.json new file mode 100644 index 000000000000..6913118bd73b --- /dev/null +++ b/tests/fdbshow_input/asic_db_fetch_except.json @@ -0,0 +1,50 @@ +{ + "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000": { + "SAI_SWITCH_ATTR_INIT_SWITCH": "true", + "SAI_SWITCH_ATTR_SRC_MAC_ADDRESS": "DE:AD:BE:EF:CA:FE" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000005cb": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000528", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000006cd": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000549", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000005c5\",\"mac\":\"11:22:33:44:55:66\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005cb", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000006c6\",\"mac\":\"11:22:33:66:55:44\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000006cd", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_STATIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000007c7\",\"mac\":\"66:55:44:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005cb", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000005ff", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x260000000007c7\",\"mac\":\"77:55:44:33:22:11\",\"switch_id\":\"oid:0x21000000000000\"}": { + "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000fff", + "SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC", + "SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000005c5": { + "SAI_VLAN_ATTR_VLAN_ID": "2" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000006c6": { + "SAI_VLAN_ATTR_VLAN_ID": "3" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000007c7": {} +} diff --git a/tests/fdbshow_input/asic_db_no_bridge.json b/tests/fdbshow_input/asic_db_no_bridge.json new file mode 100644 index 000000000000..bfa72b1595f8 --- /dev/null +++ b/tests/fdbshow_input/asic_db_no_bridge.json @@ -0,0 +1,15 @@ +{ + "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000": { + "SAI_SWITCH_ATTR_INIT_SWITCH": "true", + "SAI_SWITCH_ATTR_SRC_MAC_ADDRESS": "DE:AD:BE:EF:CA:FE" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000005c5": { + "SAI_VLAN_ATTR_VLAN_ID": "2" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000006c6": { + "SAI_VLAN_ATTR_VLAN_ID": "3" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000007c7": { + "SAI_VLAN_ATTR_VLAN_ID": "4" + } +} diff --git a/tests/fdbshow_input/asic_db_no_fdb.json b/tests/fdbshow_input/asic_db_no_fdb.json new file mode 100644 index 000000000000..029054c91730 --- /dev/null +++ b/tests/fdbshow_input/asic_db_no_fdb.json @@ -0,0 +1,27 @@ +{ + "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000": { + "SAI_SWITCH_ATTR_INIT_SWITCH": "true", + "SAI_SWITCH_ATTR_SRC_MAC_ADDRESS": "DE:AD:BE:EF:CA:FE" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000005cb": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000528", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a0000000006cd": { + "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", + "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000549", + "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true", + "SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE": "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000005c5": { + "SAI_VLAN_ATTR_VLAN_ID": "2" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000006c6": { + "SAI_VLAN_ATTR_VLAN_ID": "3" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x260000000007c7": { + "SAI_VLAN_ATTR_VLAN_ID": "4" + } +} diff --git a/tests/fdbshow_input/counters_db.json b/tests/fdbshow_input/counters_db.json new file mode 100644 index 000000000000..acf46e0395b9 --- /dev/null +++ b/tests/fdbshow_input/counters_db.json @@ -0,0 +1,9 @@ +{ + "COUNTERS_PORT_NAME_MAP": { + "Ethernet0": "oid:0x1000000000528", + "Ethernet4": "oid:0x1000000000549" + }, + "COUNTERS_LAG_NAME_MAP": { + "": "" + } +} diff --git a/tests/fdbshow_test.py b/tests/fdbshow_test.py new file mode 100755 index 000000000000..3da84879f5ef --- /dev/null +++ b/tests/fdbshow_test.py @@ -0,0 +1,198 @@ +import os +from click.testing import CliRunner +import pytest + +import show.main as show +from .utils import get_result_and_return_code +import subprocess + +root_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(root_path) +scripts_path = os.path.join(modules_path, "scripts") + +show_mac_output_with_def_vlan = """\ + No. Vlan MacAddress Port Type +----- ------ ----------------- --------- ------- + 1 2 11:22:33:44:55:66 Ethernet0 Dynamic + 2 3 11:22:33:66:55:44 Ethernet4 Static +Total number of entries 2 +""" + +show_mac_output = """\ + No. Vlan MacAddress Port Type +----- ------ ----------------- ------------- ------- + 1 2 11:22:33:44:55:66 Ethernet0 Dynamic + 2 3 11:22:33:66:55:44 Ethernet4 Static + 3 4 66:55:44:33:22:11 Ethernet0 Dynamic + 4 4 77:66:44:33:22:11 1000000000fff Dynamic + 5 5 77:66:55:44:22:11 Ethernet4 Dynamic +Total number of entries 5 +""" + +show_mac__port_vlan_output = """\ + No. Vlan MacAddress Port Type +----- ------ ----------------- --------- ------- + 1 2 11:22:33:44:55:66 Ethernet0 Dynamic +Total number of entries 1 +""" + +show_mac_no_results_output = """\ +No. Vlan MacAddress Port Type +----- ------ ------------ ------ ------ +Total number of entries 0 +""" + +show_mac_no_port_output = """\ +'Ethernet20' is not in list +""" + +show_mac_no_vlan_output = """\ +123 is not in list +""" + + +class TestFdbshow(): + @pytest.fixture(scope="class", autouse=True) + def setup_class(cls): + print("SETUP") + os.environ["PATH"] += os.pathsep + scripts_path + os.environ["UTILITIES_UNIT_TESTING"] = "1" + yield + print("TEARDOWN") + os.environ["PATH"] = os.pathsep.join(os.environ["PATH"].split(os.pathsep)[:-1]) + os.environ["UTILITIES_UNIT_TESTING"] = "0" + + @pytest.fixture(scope="function", autouse=True) + def setUp(self): + self.runner = CliRunner() + yield + del os.environ["FDBSHOW_MOCK"] + + def set_mock_variant(self, variant: str): + os.environ["FDBSHOW_MOCK"] = variant + + def test_show_mac_def_vlan(self): + self.set_mock_variant("2") + + result = self.runner.invoke(show.cli.commands["mac"], []) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_mac_output_with_def_vlan + + return_code, result = get_result_and_return_code('fdbshow') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == show_mac_output_with_def_vlan + + def test_show_mac(self): + self.set_mock_variant("1") + + result = self.runner.invoke(show.cli.commands["mac"], []) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_mac_output + + return_code, result = get_result_and_return_code('fdbshow') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == show_mac_output + + def test_show_mac_port_vlan(self): + self.set_mock_variant("1") + + result = self.runner.invoke(show.cli.commands["mac"], "-p Ethernet0 -v 2") + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_mac__port_vlan_output + + return_code, result = get_result_and_return_code('fdbshow -p Ethernet0 -v 2') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == show_mac__port_vlan_output + + def test_show_mac_no_port(self): + self.set_mock_variant("1") + + result = self.runner.invoke(show.cli.commands["mac"], "-p Ethernet20") + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert result.output == show_mac_no_port_output + + return_code, result = get_result_and_return_code('fdbshow -p Ethernet20') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 1 + assert result == show_mac_no_port_output.strip("\n") + + def test_show_mac_no_vlan(self): + self.set_mock_variant("1") + + result = self.runner.invoke(show.cli.commands["mac"], "-v 123") + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert result.output == show_mac_no_vlan_output + + return_code, result = get_result_and_return_code('fdbshow -v 123') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 1 + assert result == show_mac_no_vlan_output.strip("\n") + + def test_show_mac_no_fdb(self): + self.set_mock_variant("3") + + result = self.runner.invoke(show.cli.commands["mac"], []) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_mac_no_results_output + + return_code, result = get_result_and_return_code('fdbshow') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == show_mac_no_results_output + + def test_show_mac_no_bridge(self): + self.set_mock_variant("4") + + result = self.runner.invoke(show.cli.commands["mac"], []) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_mac_no_results_output + + return_code, result = get_result_and_return_code('fdbshow') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == show_mac_no_results_output + + def test_show_fetch_except(self): + self.set_mock_variant("5") + + result = self.runner.invoke(show.cli.commands["mac"], []) + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert "Failed to get Vlan id for bvid oid:0x260000000007c7" in result.output + + try: + output = subprocess.check_output( + 'fdbshow', stderr=subprocess.STDOUT, shell=True, text=True) + except subprocess.CalledProcessError as e: + return_code = e.returncode + output = e.output + + print("return_code: {}".format(return_code)) + print("result = {}".format(output)) + assert return_code == 1 + assert "Failed to get Vlan id for bvid oid:0x260000000007c7" in output