diff --git a/docs/openrpc/the-spec/firebolt-open-rpc.json b/docs/openrpc/the-spec/firebolt-open-rpc.json index 8ded70c..0614ce9 100644 --- a/docs/openrpc/the-spec/firebolt-open-rpc.json +++ b/docs/openrpc/the-spec/firebolt-open-rpc.json @@ -4966,7 +4966,8 @@ "paused", "suspended", "hibernated", - "terminating" + "terminating", + "unloaded" ] }, "StateChange": { diff --git a/include/firebolt/lifecycle.h b/include/firebolt/lifecycle.h index 3581cda..5b06a82 100644 --- a/include/firebolt/lifecycle.h +++ b/include/firebolt/lifecycle.h @@ -36,6 +36,7 @@ enum class LifecycleState SUSPENDED, HIBERNATED, TERMINATING, + UNLOADED, }; /** diff --git a/src/json_types/lifecycle.h b/src/json_types/lifecycle.h index 0b130be..7afa4e2 100644 --- a/src/json_types/lifecycle.h +++ b/src/json_types/lifecycle.h @@ -38,6 +38,7 @@ inline const Firebolt::JSON::EnumType<::Firebolt::Lifecycle::LifecycleState> Lif {"suspended", ::Firebolt::Lifecycle::LifecycleState::SUSPENDED}, {"hibernated", ::Firebolt::Lifecycle::LifecycleState::HIBERNATED}, {"terminating", ::Firebolt::Lifecycle::LifecycleState::TERMINATING}, + {"unloaded", ::Firebolt::Lifecycle::LifecycleState::UNLOADED}, }); class LifecycleState : public Firebolt::JSON::NL_Json_Basic<::Firebolt::Lifecycle::LifecycleState> diff --git a/test/component/lifecycleTest.cpp b/test/component/lifecycleTest.cpp index 4047461..acfd56d 100644 --- a/test/component/lifecycleTest.cpp +++ b/test/component/lifecycleTest.cpp @@ -132,3 +132,28 @@ TEST_F(LifecycleCTest, subscribeOnState_noValue) auto result = Firebolt::IFireboltAccessor::Instance().LifecycleInterface().unsubscribe(id.value()); verifyUnsubscribeResult(result); } + +TEST_F(LifecycleCTest, subscribeOnState_unloaded) +{ + auto id = Firebolt::IFireboltAccessor::Instance().LifecycleInterface().subscribeOnStateChanged( + [&](const std::vector& changes) + { + EXPECT_TRUE(!changes.empty()); + EXPECT_EQ(changes[0].newState, Firebolt::Lifecycle::LifecycleState::UNLOADED); + EXPECT_EQ(changes[0].oldState, Firebolt::Lifecycle::LifecycleState::TERMINATING); + + { + std::lock_guard lock(mtx); + eventReceived = true; + } + cv.notify_one(); + }); + verifyEventSubscription(id); + + triggerEvent("Lifecycle2.onStateChanged", R"({"value":[{"newState":"unloaded","oldState":"terminating"}]})"); + + verifyEventReceived(mtx, cv, eventReceived); + + auto result = Firebolt::IFireboltAccessor::Instance().LifecycleInterface().unsubscribe(id.value()); + verifyUnsubscribeResult(result); +} \ No newline at end of file diff --git a/test/unit/lifecycleTest.cpp b/test/unit/lifecycleTest.cpp index 51f8570..4bca242 100644 --- a/test/unit/lifecycleTest.cpp +++ b/test/unit/lifecycleTest.cpp @@ -71,6 +71,14 @@ TEST_F(LifecycleUTest, stateBadResponse) ASSERT_FALSE(result) << "LifecycleImpl::state() did not return an error"; } +TEST_F(LifecycleUTest, stateUnloaded) +{ + mock_with_response("Lifecycle2.state", "unloaded"); + Firebolt::Result result = lifecycleImpl_.state(); + ASSERT_TRUE(result) << "Failed to retrieve current state from Lifecycle.state() method"; + EXPECT_EQ(*result, Firebolt::Lifecycle::LifecycleState::UNLOADED); +} + TEST_F(LifecycleUTest, subscribeOnStateChanged) { EXPECT_CALL(mockHelper, subscribe(_, "Lifecycle2.onStateChanged", _, _))