Skip to content

Commit 44666a0

Browse files
authored
Handle restore_count and system_enable ”NoneType“ value scenario. (#679)
* Handle system_enable NoneType value scenario. * Handle NoneType error. * Added UT * Move UT into TestXcvrdScript * Fix UT * Fix UT * Fix UT * Using log utilities function * Fix UT * Pass self * Use helpper_logger instead of self. * Remove empty lines * add log_exception_traceback to print stack. * Modify log errors.
1 parent 9204d7e commit 44666a0

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

sonic-xcvrd/tests/test_xcvrd.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,38 @@ def test_post_port_sfp_firmware_info_to_db_lport_list_None(self, mock_get_presen
528528
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
529529
assert firmware_info_tbl.set.call_count == 0
530530

531+
@pytest.mark.parametrize(
532+
"restore_count, system_enabled, expected",
533+
[
534+
(1, None, True),
535+
(0, None, False),
536+
("2", None, True),
537+
("0", None, False),
538+
(None, "true", True),
539+
(None, "false", False),
540+
(None, None, False),
541+
]
542+
)
543+
def test_is_syncd_warm_restore_complete_valid_cases(self, restore_count, system_enabled, expected):
544+
mock_db = MagicMock()
545+
mock_db.hget.side_effect = lambda table, key: (
546+
restore_count if "WARM_RESTART_TABLE|syncd" in table else system_enabled
547+
)
548+
549+
with patch("xcvrd.xcvrd.daemon_base.db_connect", return_value=mock_db):
550+
assert is_syncd_warm_restore_complete() == expected
551+
552+
def test_is_syncd_warm_restore_complete_invalid_restore_count(self):
553+
# restore_count = "abc" triggers ValueError in int("abc")
554+
mock_db = MagicMock()
555+
mock_db.hget.side_effect = lambda table, key: (
556+
"abc" if "WARM_RESTART_TABLE|syncd" in table else None
557+
)
558+
559+
with patch("xcvrd.xcvrd.daemon_base.db_connect", return_value=mock_db):
560+
result = is_syncd_warm_restore_complete()
561+
assert result is False
562+
531563
def test_post_port_dom_sensor_info_to_db(self):
532564
def mock_get_transceiver_dom_sensor_real_value(physical_port):
533565
return {

sonic-xcvrd/xcvrd/xcvrd.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,10 +470,27 @@ def is_syncd_warm_restore_complete():
470470
to avoid premature config push by xcvrd that caused port flaps.
471471
"""
472472
state_db = daemon_base.db_connect("STATE_DB")
473-
restore_count = state_db.hget("WARM_RESTART_TABLE|syncd", "restore_count") or "0"
473+
restore_count = state_db.hget("WARM_RESTART_TABLE|syncd", "restore_count")
474474
system_enabled = state_db.hget("WARM_RESTART_ENABLE_TABLE|system", "enable")
475-
return int(restore_count.strip()) > 0 or "true" in system_enabled
475+
try:
476+
# --- Handle restore_count (could be int, str, or None) ---
477+
if restore_count is not None:
478+
if isinstance(restore_count, int):
479+
if restore_count > 0:
480+
return True
481+
elif isinstance(restore_count, str):
482+
if restore_count.strip().isdigit() and int(restore_count.strip()) > 0:
483+
return True
484+
485+
# --- Handle system_enabled (only care about "true"/"false"/None) ---
486+
if isinstance(system_enabled, str):
487+
if system_enabled.strip().lower() == "true":
488+
return True
476489

490+
except Exception as e:
491+
helper_logger.log_warning(f"Unexpected value: restore_count={restore_count}, system_enabled={system_enabled}, error={e}")
492+
log_exception_traceback()
493+
return False
477494
#
478495
# Helper classes ===============================================================
479496
#

0 commit comments

Comments
 (0)