diff --git a/scripts/port2alias b/scripts/port2alias index 2063f50bef..5a4ff8dd79 100755 --- a/scripts/port2alias +++ b/scripts/port2alias @@ -1,11 +1,25 @@ #!/usr/bin/env python3 import sys +import os from io import StringIO from portconfig import get_port_config from sonic_py_common import device_info +from sonic_py_common import multi_asic +# mock the redis for unit test purposes # +try: + if os.environ["UTILITIES_UNIT_TESTING"] == "2": + 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 + import mock_tables.mock_multi_asic + mock_tables.dbconnector.load_namespace_config() +except KeyError: + pass def translate_line(line, ports): allowed_symbols = ['-', '_'] @@ -35,7 +49,10 @@ def translate_line(line, ports): def main(): (platform, hwsku) = device_info.get_platform_and_hwsku() - (ports, _) = get_port_config(hwsku, platform) + ports = {} + for ns in multi_asic.get_namespace_list(): + (ports_ns, _, _) = get_port_config(hwsku=hwsku, platform=platform, asic_name=ns) + ports.update(ports_ns) for line in sys.stdin: sys.stdout.write(translate_line(line, ports)) diff --git a/tests/port2alias_test.py b/tests/port2alias_test.py index 03b017f968..cb3d8d5cac 100644 --- a/tests/port2alias_test.py +++ b/tests/port2alias_test.py @@ -1,16 +1,20 @@ import os import sys from unittest import TestCase +from unittest import mock +from mock import patch +from io import StringIO +import tests.mock_tables.dbconnector +import importlib from utilities_common.general import load_module_from_source - # Load the file under test port2alias_path = os.path.join(os.path.dirname(__file__), '..', 'scripts', 'port2alias') -port2alias = load_module_from_source('port2alias', port2alias_path) class TestPort2Alias(TestCase): def setUp(self): + self.port2alias = load_module_from_source('port2alias', port2alias_path) self.ports = { "Ethernet1": {"alias" : "fortyG0/1"}, "Ethernet2": {"alias" : "fortyG0/2"}, @@ -18,27 +22,60 @@ def setUp(self): "Ethernet_11": {"alias" : "fortyG0/11"}, } + @mock.patch('sys.stdout.write') + def test_main(self, mock_stdout): + with patch('sys.stdin', StringIO("Ethernet0")): + self.port2alias.main() + mock_stdout.assert_called_with("etp1") + def test_translate_line_single_word(self): - self.assertEqual(port2alias.translate_line("1", self.ports),"1") - self.assertEqual(port2alias.translate_line("1\n", self.ports),"1\n") - self.assertEqual(port2alias.translate_line("Ethernet1", self.ports),"fortyG0/1") - self.assertEqual(port2alias.translate_line("Ethernet1\n", self.ports),"fortyG0/1\n") - self.assertEqual(port2alias.translate_line("Ethernet2\n", self.ports),"fortyG0/2\n") - self.assertEqual(port2alias.translate_line("Ethernet10\n", self.ports),"fortyG0/10\n") - self.assertEqual(port2alias.translate_line("Ethernet20\n", self.ports),"Ethernet20\n") + self.assertEqual(self.port2alias.translate_line("1", self.ports),"1") + self.assertEqual(self.port2alias.translate_line("1\n", self.ports),"1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1", self.ports),"fortyG0/1") + self.assertEqual(self.port2alias.translate_line("Ethernet1\n", self.ports),"fortyG0/1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet2\n", self.ports),"fortyG0/2\n") + self.assertEqual(self.port2alias.translate_line("Ethernet10\n", self.ports),"fortyG0/10\n") + self.assertEqual(self.port2alias.translate_line("Ethernet20\n", self.ports),"Ethernet20\n") def test_translate_line_with_symbol(self): - self.assertEqual(port2alias.translate_line("Ethernet_11\n", self.ports),"fortyG0/11\n") - self.assertEqual(port2alias.translate_line("Ethernet1_1\n", self.ports),"Ethernet1_1\n") - self.assertEqual(port2alias.translate_line("Ethernet1-1\n", self.ports),"Ethernet1-1\n") - self.assertEqual(port2alias.translate_line("Ethernet1/1\n", self.ports),"fortyG0/1/1\n") - self.assertEqual(port2alias.translate_line("Ethernet1:1\n", self.ports),"fortyG0/1:1\n") - self.assertEqual(port2alias.translate_line("Ethernet1 U\n", self.ports),"fortyG0/1 U\n") + self.assertEqual(self.port2alias.translate_line("Ethernet_11\n", self.ports),"fortyG0/11\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1_1\n", self.ports),"Ethernet1_1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1-1\n", self.ports),"Ethernet1-1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1/1\n", self.ports),"fortyG0/1/1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1:1\n", self.ports),"fortyG0/1:1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1 U\n", self.ports),"fortyG0/1 U\n") def test_translate_line_multiple_words(self): - self.assertEqual(port2alias.translate_line(" Ethernet1 Ethernet2 \n", self.ports)," fortyG0/1 fortyG0/2 \n") - self.assertEqual(port2alias.translate_line("Ethernet1,Ethernet1,Ethernet1,Ethernet1\n", self.ports),"fortyG0/1,fortyG0/1,fortyG0/1,fortyG0/1\n") + self.assertEqual(self.port2alias.translate_line(" Ethernet1 Ethernet2 \n", self.ports)," fortyG0/1 fortyG0/2 \n") + self.assertEqual(self.port2alias.translate_line("Ethernet1,Ethernet1,Ethernet1,Ethernet1\n", self.ports),"fortyG0/1,fortyG0/1,fortyG0/1,fortyG0/1\n") def test_translate_line_empty_ports(self): - self.assertEqual(port2alias.translate_line("Ethernet1\n", {}),"Ethernet1\n") + self.assertEqual(self.port2alias.translate_line("Ethernet1\n", {}),"Ethernet1\n") + +class TestPort2AliasNamespace(TestCase): + @classmethod + def setup_class(cls): + os.environ['UTILITIES_UNIT_TESTING'] = "2" + from .mock_tables import dbconnector + from .mock_tables import mock_multi_asic + importlib.reload(mock_multi_asic) + dbconnector.load_namespace_config() + + def setUp(self): + self.port2alias = load_module_from_source('port2alias', port2alias_path) + + @mock.patch('sys.stdout.write') + def test_main(self, mock_stdout): + with patch('sys.stdin', StringIO("Ethernet0")): + self.port2alias.main() + mock_stdout.assert_called_with("Ethernet1/1") + @classmethod + def teardown_class(cls): + print("TEARDOWN") + os.environ['UTILITIES_UNIT_TESTING'] = "0" + # change back to single asic config + from .mock_tables import dbconnector + from .mock_tables import mock_single_asic + importlib.reload(mock_single_asic) + dbconnector.load_namespace_config()