@@ -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 );
@@ -168,6 +188,41 @@ TEST(WarmRestart, getWarmStartTimer)
168188 EXPECT_EQ (timer, 5000u );
169189}
170190
191+ TEST (WarmRestart, returnWarmStartState)
192+ {
193+ DBConnector stateDb (" STATE_DB" , 0 , true );
194+ Table stateWarmRestartTable (&stateDb, STATE_WARM_RESTART_TABLE_NAME);
195+ //
196+ // Initialize WarmStart class for TestApp
197+ WarmStart::initialize (testAppName, testDockerName, 0 , true );
198+
199+ WarmStart::WarmStartState warmStartStates[] =
200+ {
201+ WarmStart::INITIALIZED,
202+ WarmStart::RESTORED,
203+ WarmStart::REPLAYED,
204+ WarmStart::RECONCILED,
205+ WarmStart::WSDISABLED,
206+ WarmStart::WSUNKNOWN,
207+ WarmStart::FROZEN,
208+ WarmStart::QUIESCENT,
209+ WarmStart::CHECKPOINTED,
210+ WarmStart::FAILED,
211+ };
212+
213+ for (const auto &currState : warmStartStates) {
214+ WarmStart::setWarmStartState (testAppName, currState);
215+
216+ string state;
217+ stateWarmRestartTable.hget (testAppName, " state" , state);
218+ EXPECT_EQ (state, WarmStart::warmStartStateNameMap ()->at (currState).c_str ());
219+
220+ WarmStart::WarmStartState ret_state;
221+ ret_state = WarmStart::returnWarmStartState (testAppName);
222+ EXPECT_EQ (ret_state, currState);
223+ }
224+ }
225+
171226TEST (WarmRestart, set_get_DataCheckState)
172227{
173228 DBConnector stateDb (" STATE_DB" , 0 , true );
@@ -319,3 +374,57 @@ TEST(WarmRestart, testRegisterWarmBootInfo)
319374 EXPECT_TRUE (ret);
320375 EXPECT_EQ (value, " true" );
321376}
377+
378+ TEST (WarmRestart, testOptionalStateVerification)
379+ {
380+ DBConnector stateDb (" STATE_DB" , 0 , true );
381+ Table stateWarmRestartTable (&stateDb, STATE_WARM_RESTART_TABLE_NAME);
382+ Table stateWarmRestartEnableTable (&stateDb,
383+ STATE_WARM_RESTART_ENABLE_TABLE_NAME);
384+
385+ DBConnector configDb (" CONFIG_DB" , 0 , true );
386+ Table cfgWarmRestartTable (&configDb, CFG_WARM_RESTART_TABLE_NAME);
387+
388+ // Clean up warm restart state for testAppName and warm restart config for
389+ // testDockerName
390+ stateWarmRestartTable.del (testAppName);
391+ cfgWarmRestartTable.del (testDockerName);
392+ stateWarmRestartEnableTable.del (" system" );
393+ stateWarmRestartEnableTable.del (testDockerName);
394+
395+ // Initialize WarmStart class for TestApp
396+ WarmStart::initialize (testAppName, testDockerName, 0 , true );
397+
398+ // perform checkWarmStart for TestApp running in TestDocker. This updates
399+ // warmboot state in the DB.
400+ EXPECT_FALSE (WarmStart::checkWarmStart (testAppName, testDockerName));
401+
402+ // State verification is disabled by default.
403+ EXPECT_FALSE (WarmStart::isStateVerificationEnabled ());
404+ EXPECT_FALSE (WarmStart::waitForUnfreeze ());
405+ // Since state verification is disabled by default, warmboot state should be
406+ // RECONCILED.
407+ verifyWarmbootState (testAppName, WarmStart::RECONCILED);
408+
409+ // Disable system level warm restart. Verify that checkWarmStart() still
410+ // updates warmboot state to RECONCILED since state verification is disabled
411+ // by default.
412+ stateWarmRestartEnableTable.hset (" system" , " enable" , " false" );
413+ EXPECT_FALSE (WarmStart::isStateVerificationEnabled ());
414+ EXPECT_FALSE (WarmStart::waitForUnfreeze ());
415+ EXPECT_FALSE (WarmStart::checkWarmStart (testAppName, testDockerName));
416+ verifyWarmbootState (testAppName, WarmStart::RECONCILED);
417+
418+ // Set warmboot state and enable system level warm restart. Verify that
419+ // warmboot state reflects the configured state and doesn't get updated by
420+ // checkWarmStart().
421+ WarmStart::setWarmStartState (testAppName, WarmStart::INITIALIZED);
422+ stateWarmRestartEnableTable.hset (" system" , " enable" , " true" );
423+ EXPECT_TRUE (WarmStart::checkWarmStart (testAppName, testDockerName));
424+ verifyWarmbootState (testAppName, WarmStart::INITIALIZED);
425+
426+ // Disable state verification.
427+ configureStateVerification (" false" );
428+ EXPECT_FALSE (WarmStart::isStateVerificationEnabled ());
429+ EXPECT_FALSE (WarmStart::waitForUnfreeze ());
430+ }
0 commit comments