@@ -11,6 +11,28 @@ using namespace swss;
1111static const string testAppName = " TestApp" ;
1212static const string testDockerName = " TestDocker" ;
1313
14+ void verifyWarmbootState (std::string app,
15+ WarmStart::WarmStartState expected_state)
16+ {
17+ WarmStart::WarmStartState state;
18+ WarmStart::getWarmStartState (app, state);
19+ EXPECT_EQ (state, expected_state);
20+
21+ DBConnector stateDb (" STATE_DB" , 0 , true );
22+ Table stateWarmRestartTable (&stateDb, STATE_WARM_RESTART_TABLE_NAME);
23+ std::string state_str;
24+ stateWarmRestartTable.hget (app, " state" , state_str);
25+ EXPECT_EQ (state_str, WarmStart::warmStartStateNameMap ()->at (state).c_str ());
26+ }
27+
28+ void configureStateVerification (std::string value)
29+ {
30+ DBConnector stateDb (" STATE_DB" , 0 , true );
31+ Table stateWarmRestartEnableTable (&stateDb,
32+ STATE_WARM_RESTART_ENABLE_TABLE_NAME);
33+ stateWarmRestartEnableTable.hset (" system" , " state_verification" , value);
34+ }
35+
1436// This test must be executed before first successful call to initialize()
1537// The static elements of this class can only be initialized once.
1638TEST (WarmRestart, testRegisterWarmBootInfoNotInitialized)
@@ -144,8 +166,6 @@ TEST(WarmRestart, checkWarmStart_and_State)
144166 EXPECT_FALSE (system_enabled);
145167}
146168
147-
148-
149169TEST (WarmRestart, getWarmStartTimer)
150170{
151171 DBConnector configDb (" CONFIG_DB" , 0 , true );
@@ -362,3 +382,57 @@ TEST(WarmRestart, testRegisterWarmBootInfo)
362382 EXPECT_TRUE (ret);
363383 EXPECT_EQ (value, " true" );
364384}
385+
386+ TEST (WarmRestart, testOptionalStateVerification)
387+ {
388+ DBConnector stateDb (" STATE_DB" , 0 , true );
389+ Table stateWarmRestartTable (&stateDb, STATE_WARM_RESTART_TABLE_NAME);
390+ Table stateWarmRestartEnableTable (&stateDb,
391+ STATE_WARM_RESTART_ENABLE_TABLE_NAME);
392+
393+ DBConnector configDb (" CONFIG_DB" , 0 , true );
394+ Table cfgWarmRestartTable (&configDb, CFG_WARM_RESTART_TABLE_NAME);
395+
396+ // Clean up warm restart state for testAppName and warm restart config for
397+ // testDockerName
398+ stateWarmRestartTable.del (testAppName);
399+ cfgWarmRestartTable.del (testDockerName);
400+ stateWarmRestartEnableTable.del (" system" );
401+ stateWarmRestartEnableTable.del (testDockerName);
402+
403+ // Initialize WarmStart class for TestApp
404+ WarmStart::initialize (testAppName, testDockerName, 0 , true );
405+
406+ // perform checkWarmStart for TestApp running in TestDocker. This updates
407+ // warmboot state in the DB.
408+ EXPECT_FALSE (WarmStart::checkWarmStart (testAppName, testDockerName));
409+
410+ // State verification is disabled by default.
411+ EXPECT_FALSE (WarmStart::isStateVerificationEnabled ());
412+ EXPECT_FALSE (WarmStart::waitForUnfreeze ());
413+ // Since state verification is disabled by default, warmboot state should be
414+ // RECONCILED.
415+ verifyWarmbootState (testAppName, WarmStart::RECONCILED);
416+
417+ // Disable system level warm restart. Verify that checkWarmStart() still
418+ // updates warmboot state to RECONCILED since state verification is disabled
419+ // by default.
420+ stateWarmRestartEnableTable.hset (" system" , " enable" , " false" );
421+ EXPECT_FALSE (WarmStart::isStateVerificationEnabled ());
422+ EXPECT_FALSE (WarmStart::waitForUnfreeze ());
423+ EXPECT_FALSE (WarmStart::checkWarmStart (testAppName, testDockerName));
424+ verifyWarmbootState (testAppName, WarmStart::RECONCILED);
425+
426+ // Set warmboot state and enable system level warm restart. Verify that
427+ // warmboot state reflects the configured state and doesn't get updated by
428+ // checkWarmStart().
429+ WarmStart::setWarmStartState (testAppName, WarmStart::INITIALIZED);
430+ stateWarmRestartEnableTable.hset (" system" , " enable" , " true" );
431+ EXPECT_TRUE (WarmStart::checkWarmStart (testAppName, testDockerName));
432+ verifyWarmbootState (testAppName, WarmStart::INITIALIZED);
433+
434+ // Disable state verification.
435+ configureStateVerification (" false" );
436+ EXPECT_FALSE (WarmStart::isStateVerificationEnabled ());
437+ EXPECT_FALSE (WarmStart::waitForUnfreeze ());
438+ }
0 commit comments