diff --git a/score/launch_manager/src/lm_control/src/details/lm_control_impl.hpp b/score/launch_manager/src/lm_control/src/details/lm_control_impl.hpp index bb6b178ed7..c94a84dd4e 100644 --- a/score/launch_manager/src/lm_control/src/details/lm_control_impl.hpp +++ b/score/launch_manager/src/lm_control/src/details/lm_control_impl.hpp @@ -215,8 +215,12 @@ class BasicLmControlImpl final : public ILmControl callback_ = std::move(callback); } - // Check for any pending events from before the handler was installed. - onActivationResult(); + // Check for any pending events from before the handler was installed. Only possible once connected; + // until then the receive handler, installed on connection, takes care of the samples. + if (connectedProxy() != nullptr) + { + onActivationResult(); + } return {}; } diff --git a/score/launch_manager/src/lm_control/src/details/lm_control_impl_UT.cpp b/score/launch_manager/src/lm_control/src/details/lm_control_impl_UT.cpp index ddeb500d98..39539a71f6 100644 --- a/score/launch_manager/src/lm_control/src/details/lm_control_impl_UT.cpp +++ b/score/launch_manager/src/lm_control/src/details/lm_control_impl_UT.cpp @@ -674,6 +674,36 @@ TEST_F(LmControlUT, RegisterEmptyCallbackRejected) EXPECT_EQ(result.error(), ExecErrc::kInvalidArguments); } +TEST_F(LmControlUT, CallbackRegisteredBeforeConnectionIsUsedOnceConnected) +{ + RecordProperty( + "Description", + "Registering an activation callback before the service is discovered succeeds without reading samples, " + "and the callback receives activation results once connected."); + + auto sut = MakeLmControl(); + + std::optional name{}; + EXPECT_CALL(mock_, GetNewSamples(_)).Times(0); + ASSERT_TRUE(sut->register_run_target_activation_callback([&](RunTargetActivationSource, RunTargetName n) { + name = n; + }) + .has_value()); + ::testing::Mock::VerifyAndClearExpectations(&mock_); + + ConnectService(); + + EXPECT_CALL(mock_, GetNewSamples(_)).WillOnce(Invoke([](std::size_t) { + return score::Result>{MakeSamples({"Running"})}; + })); + + ASSERT_TRUE(receive_handler_); + receive_handler_(); + + ASSERT_TRUE(name.has_value()); + EXPECT_EQ(name.value(), "Running"); +} + TEST_F(LmControlUT, ActivationResultInvokesRegisteredCallback) { RecordProperty(