@@ -1631,43 +1631,92 @@ def test_load_port_config(self, mock_is_multi_asic):
1631
1631
1632
1632
@patch ('sfputil.main.is_port_type_rj45' , MagicMock (return_value = False ))
1633
1633
@patch ('sfputil.main.platform_chassis' )
1634
+ @patch ('sfputil.main.ConfigDBConnector' )
1635
+ @patch ('sfputil.main.SonicV2Connector' )
1634
1636
@patch ('sfputil.main.platform_sfputil' , MagicMock (is_logical_port = MagicMock (return_value = 1 )))
1635
1637
@patch ('sfputil.main.logical_port_to_physical_port_index' , MagicMock (return_value = 1 ))
1636
- def test_debug_loopback (self , mock_chassis ):
1638
+ @patch ('sonic_py_common.multi_asic.get_front_end_namespaces' , MagicMock (return_value = ['' ]))
1639
+ def test_debug_loopback (self , mock_sonic_v2_connector , mock_config_db_connector , mock_chassis ):
1637
1640
mock_sfp = MagicMock ()
1638
1641
mock_api = MagicMock ()
1642
+ mock_config_db_connector .return_value = MagicMock ()
1643
+ mock_sonic_v2_connector .return_value = MagicMock ()
1639
1644
mock_chassis .get_sfp = MagicMock (return_value = mock_sfp )
1640
1645
mock_sfp .get_presence .return_value = True
1641
1646
mock_sfp .get_xcvr_api = MagicMock (return_value = mock_api )
1642
1647
1643
1648
runner = CliRunner ()
1644
1649
mock_sfp .get_presence .return_value = False
1645
1650
result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1646
- ["Ethernet0" , "host-side-input" ])
1651
+ ["Ethernet0" , "host-side-input" , "enable" ])
1647
1652
assert result .output == 'Ethernet0: SFP EEPROM not detected\n '
1648
1653
mock_sfp .get_presence .return_value = True
1649
1654
1650
1655
mock_sfp .get_xcvr_api = MagicMock (side_effect = NotImplementedError )
1651
1656
result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1652
- ["Ethernet0" , "host-side-input" ])
1657
+ ["Ethernet0" , "host-side-input" , "enable" ])
1653
1658
assert result .output == 'Ethernet0: This functionality is not implemented\n '
1654
1659
assert result .exit_code == ERROR_NOT_IMPLEMENTED
1655
1660
1656
1661
mock_sfp .get_xcvr_api = MagicMock (return_value = mock_api )
1657
1662
result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1658
- ["Ethernet0" , "host-side-input" ])
1659
- assert result .output == 'Ethernet0: Set host-side-input loopback\n '
1663
+ ["Ethernet0" , "host-side-input" , "enable" ])
1664
+ assert result .output == 'Ethernet0: enable host-side-input loopback\n '
1665
+ assert result .exit_code != ERROR_NOT_IMPLEMENTED
1666
+
1667
+ mock_sfp .get_xcvr_api = MagicMock (return_value = mock_api )
1668
+ result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1669
+ ["Ethernet0" , "media-side-input" , "enable" ])
1670
+ assert result .output == 'Ethernet0: enable media-side-input loopback\n '
1660
1671
assert result .exit_code != ERROR_NOT_IMPLEMENTED
1661
1672
1662
1673
mock_api .set_loopback_mode .return_value = False
1663
1674
result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1664
- ["Ethernet0" , "none " ])
1665
- assert result .output == 'Ethernet0: Set none loopback failed\n '
1675
+ ["Ethernet0" , "media-side-output" , "enable " ])
1676
+ assert result .output == 'Ethernet0: enable media-side-output loopback failed\n '
1666
1677
assert result .exit_code == EXIT_FAIL
1667
1678
1668
1679
mock_api .set_loopback_mode .return_value = True
1669
1680
mock_api .set_loopback_mode .side_effect = AttributeError
1670
1681
result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1671
- ["Ethernet0" , "none " ])
1682
+ ["Ethernet0" , "host-side-input" , "enable " ])
1672
1683
assert result .output == 'Ethernet0: Set loopback mode is not applicable for this module\n '
1673
1684
assert result .exit_code == ERROR_NOT_IMPLEMENTED
1685
+
1686
+ mock_api .set_loopback_mode .side_effect = [TypeError , True ]
1687
+ result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1688
+ ["Ethernet0" , "host-side-input" , "enable" ])
1689
+ assert result .output == 'Ethernet0: Set loopback mode failed. Parameter is not supported\n '
1690
+ assert result .exit_code == EXIT_FAIL
1691
+
1692
+ mock_config_db = MagicMock ()
1693
+ mock_config_db .get .side_effect = TypeError
1694
+ mock_config_db_connector .return_value = mock_config_db
1695
+ result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1696
+ ["Ethernet0" , "media-side-input" , "enable" ])
1697
+ assert result .output == 'Ethernet0: subport is not present in CONFIG_DB\n '
1698
+ assert result .exit_code == EXIT_FAIL
1699
+
1700
+ mock_config_db_connector .return_value = None
1701
+ result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1702
+ ["Ethernet0" , "media-side-input" , "enable" ])
1703
+ assert result .output == 'Ethernet0: Failed to connect to CONFIG_DB\n '
1704
+ assert result .exit_code == EXIT_FAIL
1705
+
1706
+ mock_config_db_connector .return_value = MagicMock ()
1707
+ mock_sonic_v2_connector .return_value = None
1708
+ result = runner .invoke (sfputil .cli .commands ['debug' ].commands ['loopback' ],
1709
+ ["Ethernet0" , "media-side-input" , "enable" ])
1710
+ assert result .output == 'Ethernet0: Failed to connect to STATE_DB\n '
1711
+ assert result .exit_code == EXIT_FAIL
1712
+
1713
+ @pytest .mark .parametrize ("subport, lane_count, expected_mask" , [
1714
+ (1 , 1 , 0x1 ),
1715
+ (1 , 4 , 0xf ),
1716
+ (2 , 1 , 0x2 ),
1717
+ (2 , 4 , 0xf0 ),
1718
+ (3 , 2 , 0x30 ),
1719
+ (4 , 1 , 0x8 ),
1720
+ ])
1721
+ def test_get_subport_lane_mask (self , subport , lane_count , expected_mask ):
1722
+ assert sfputil .get_subport_lane_mask (subport , lane_count ) == expected_mask
0 commit comments