added way to automatically clear unhandled messages
This commit is contained in:
parent
3bacc8ec53
commit
8b83de6ca9
@ -72,12 +72,15 @@ public:
|
|||||||
* notification is received.
|
* notification is received.
|
||||||
* @details HasLocalDataPoolIF
|
* @details HasLocalDataPoolIF
|
||||||
* Can be overriden by the child class to handle changed datasets.
|
* Can be overriden by the child class to handle changed datasets.
|
||||||
* @param sid
|
* @param sid SID of the updated set
|
||||||
* @param storeId If a snapshot was requested, data will be located inside
|
* @param storeId If a snapshot was requested, data will be located inside
|
||||||
* the IPC store with this store ID.
|
* the IPC store with this store ID.
|
||||||
|
* @param clearMessage If this is set to true, the pool manager will take care of
|
||||||
|
* clearing the store automatically
|
||||||
*/
|
*/
|
||||||
virtual void handleChangedDataset(sid_t sid,
|
virtual void handleChangedDataset(sid_t sid,
|
||||||
store_address_t storeId = storeId::INVALID_STORE_ADDRESS) {
|
store_address_t storeId = storeId::INVALID_STORE_ADDRESS,
|
||||||
|
bool* clearMessage = nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,13 +88,17 @@ public:
|
|||||||
* @brief This function will be called by the manager if an update
|
* @brief This function will be called by the manager if an update
|
||||||
* notification is received.
|
* notification is received.
|
||||||
* @details
|
* @details
|
||||||
* Can be overriden by the child class to handle changed pool IDs.
|
* Can be overriden by the child class to handle changed pool variables.
|
||||||
* @param sid
|
* @param gpid GPID of the updated variable.
|
||||||
* @param storeId If a snapshot was requested, data will be located inside
|
* @param storeId If a snapshot was requested, data will be located inside
|
||||||
* the IPC store with this store ID.
|
* the IPC store with this store ID.
|
||||||
|
* @param clearMessage Relevant for snapshots. If the boolean this points to is set to true,
|
||||||
|
* the pool manager will take care of clearing the store automatically
|
||||||
|
* after the callback.
|
||||||
*/
|
*/
|
||||||
virtual void handleChangedPoolVariable(gp_id_t globPoolId,
|
virtual void handleChangedPoolVariable(gp_id_t gpid,
|
||||||
store_address_t storeId = storeId::INVALID_STORE_ADDRESS) {
|
store_address_t storeId = storeId::INVALID_STORE_ADDRESS,
|
||||||
|
bool* clearMessage = nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,14 +554,15 @@ ReturnValue_t LocalDataPoolManager::handleHousekeepingMessage(
|
|||||||
case(HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT):
|
case(HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT):
|
||||||
case(HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT): {
|
case(HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT): {
|
||||||
LocalPoolDataSetBase* dataSet =HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
|
LocalPoolDataSetBase* dataSet =HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
|
||||||
//LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
|
|
||||||
if(command == HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT
|
if(command == HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT
|
||||||
and LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
|
and LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
|
||||||
return WRONG_HK_PACKET_TYPE;
|
result = WRONG_HK_PACKET_TYPE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(command == HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT
|
else if(command == HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT
|
||||||
and not LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
|
and not LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
|
||||||
return WRONG_HK_PACKET_TYPE;
|
result = WRONG_HK_PACKET_TYPE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return generateHousekeepingPacket(HousekeepingMessage::getSid(message),
|
return generateHousekeepingPacket(HousekeepingMessage::getSid(message),
|
||||||
dataSet, true);
|
dataSet, true);
|
||||||
@ -580,14 +581,22 @@ ReturnValue_t LocalDataPoolManager::handleHousekeepingMessage(
|
|||||||
case(HousekeepingMessage::UPDATE_SNAPSHOT_SET): {
|
case(HousekeepingMessage::UPDATE_SNAPSHOT_SET): {
|
||||||
store_address_t storeId;
|
store_address_t storeId;
|
||||||
HousekeepingMessage::getUpdateSnapshotSetCommand(message, &storeId);
|
HousekeepingMessage::getUpdateSnapshotSetCommand(message, &storeId);
|
||||||
owner->handleChangedDataset(sid, storeId);
|
bool clearMessage = true;
|
||||||
|
owner->handleChangedDataset(sid, storeId, &clearMessage);
|
||||||
|
if(clearMessage) {
|
||||||
|
message->clear();
|
||||||
|
}
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
case(HousekeepingMessage::UPDATE_SNAPSHOT_VARIABLE): {
|
case(HousekeepingMessage::UPDATE_SNAPSHOT_VARIABLE): {
|
||||||
store_address_t storeId;
|
store_address_t storeId;
|
||||||
gp_id_t globPoolId = HousekeepingMessage::getUpdateSnapshotVariableCommand(message,
|
gp_id_t globPoolId = HousekeepingMessage::getUpdateSnapshotVariableCommand(message,
|
||||||
&storeId);
|
&storeId);
|
||||||
owner->handleChangedPoolVariable(globPoolId, storeId);
|
bool clearMessage = true;
|
||||||
|
owner->handleChangedPoolVariable(globPoolId, storeId, &clearMessage);
|
||||||
|
if(clearMessage) {
|
||||||
|
message->clear();
|
||||||
|
}
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +157,8 @@ void HousekeepingMessage::clear(CommandMessage* message) {
|
|||||||
case(DIAGNOSTICS_REPORT):
|
case(DIAGNOSTICS_REPORT):
|
||||||
case(HK_DEFINITIONS_REPORT):
|
case(HK_DEFINITIONS_REPORT):
|
||||||
case(DIAGNOSTICS_DEFINITION_REPORT):
|
case(DIAGNOSTICS_DEFINITION_REPORT):
|
||||||
case(UPDATE_SNAPSHOT_SET): {
|
case(UPDATE_SNAPSHOT_SET):
|
||||||
|
case(UPDATE_SNAPSHOT_VARIABLE): {
|
||||||
store_address_t storeId;
|
store_address_t storeId;
|
||||||
getHkDataReply(message, &storeId);
|
getHkDataReply(message, &storeId);
|
||||||
StorageManagerIF *ipcStore = objectManager->get<StorageManagerIF>(
|
StorageManagerIF *ipcStore = objectManager->get<StorageManagerIF>(
|
||||||
|
@ -26,8 +26,11 @@ TEST_CASE("LocalPoolManagerTest" , "[LocManTest]") {
|
|||||||
CommandMessage messageSent;
|
CommandMessage messageSent;
|
||||||
uint8_t messagesSent = 0;
|
uint8_t messagesSent = 0;
|
||||||
|
|
||||||
|
|
||||||
SECTION("BasicTest") {
|
SECTION("BasicTest") {
|
||||||
|
{
|
||||||
|
/* For code coverage, should not crash */
|
||||||
|
LocalDataPoolManager manager(nullptr, nullptr);
|
||||||
|
}
|
||||||
auto owner = poolOwner->poolManager.getOwner();
|
auto owner = poolOwner->poolManager.getOwner();
|
||||||
REQUIRE(owner != nullptr);
|
REQUIRE(owner != nullptr);
|
||||||
CHECK(owner->getObjectId() == objects::TEST_LOCAL_POOL_OWNER_BASE);
|
CHECK(owner->getObjectId() == objects::TEST_LOCAL_POOL_OWNER_BASE);
|
||||||
@ -330,6 +333,37 @@ TEST_CASE("LocalPoolManagerTest" , "[LocManTest]") {
|
|||||||
CHECK(messagesSent == 1);
|
CHECK(messagesSent == 1);
|
||||||
CHECK(mqMock->popMessage() == retval::CATCH_OK);
|
CHECK(mqMock->popMessage() == retval::CATCH_OK);
|
||||||
|
|
||||||
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid, true, true);
|
||||||
|
CHECK(poolOwner->poolManager.handleHousekeepingMessage(&hkCmd) == retval::CATCH_OK);
|
||||||
|
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
|
||||||
|
CHECK(messagesSent == 1);
|
||||||
|
CHECK(mqMock->popMessage() == retval::CATCH_OK);
|
||||||
|
|
||||||
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid, false, true);
|
||||||
|
CHECK(poolOwner->poolManager.handleHousekeepingMessage(&hkCmd) == retval::CATCH_OK);
|
||||||
|
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
|
||||||
|
CHECK(messagesSent == 1);
|
||||||
|
CHECK(mqMock->popMessage() == retval::CATCH_OK);
|
||||||
|
|
||||||
|
HousekeepingMessage::setOneShotReportCommand(&hkCmd, lpool::testSid, false);
|
||||||
|
CHECK(poolOwner->poolManager.handleHousekeepingMessage(&hkCmd) ==
|
||||||
|
static_cast<int>(LocalDataPoolManager::WRONG_HK_PACKET_TYPE));
|
||||||
|
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
|
||||||
|
CHECK(messagesSent == 1);
|
||||||
|
CHECK(mqMock->popMessage() == retval::CATCH_OK);
|
||||||
|
|
||||||
|
HousekeepingMessage::setOneShotReportCommand(&hkCmd, lpool::testSid, true);
|
||||||
|
CHECK(poolOwner->poolManager.handleHousekeepingMessage(&hkCmd) == retval::CATCH_OK);
|
||||||
|
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
|
||||||
|
CHECK(messagesSent == 1);
|
||||||
|
CHECK(mqMock->popMessage() == retval::CATCH_OK);
|
||||||
|
|
||||||
|
HousekeepingMessage::setUpdateNotificationVariableCommand(&hkCmd, lpool::uint8VarGpid);
|
||||||
|
gp_id_t gpidToCheck;
|
||||||
|
CHECK(poolOwner->poolManager.handleHousekeepingMessage(&hkCmd) == retval::CATCH_OK);
|
||||||
|
CHECK(poolOwner->changedVariableCallbackWasCalled(gpidToCheck, storeId) == true);
|
||||||
|
CHECK(gpidToCheck == lpool::testSid);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we need to reset the subscription list because the pool owner
|
/* we need to reset the subscription list because the pool owner
|
||||||
|
@ -106,7 +106,8 @@ bool LocalPoolOwnerBase::changedDataSetCallbackWasCalled(sid_t &sid, store_addre
|
|||||||
return condition;
|
return condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalPoolOwnerBase::handleChangedDataset(sid_t sid, store_address_t storeId) {
|
void LocalPoolOwnerBase::handleChangedDataset(sid_t sid, store_address_t storeId,
|
||||||
|
bool* clearMessage) {
|
||||||
this->changedDatasetSid = sid;
|
this->changedDatasetSid = sid;
|
||||||
this->storeIdForChangedSet = storeId;
|
this->storeIdForChangedSet = storeId;
|
||||||
}
|
}
|
||||||
@ -132,7 +133,8 @@ ReturnValue_t LocalPoolOwnerBase::initializeHkManagerAfterTaskCreation() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalPoolOwnerBase::handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId) {
|
void LocalPoolOwnerBase::handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId,
|
||||||
|
bool* clearMessage) {
|
||||||
this->changedPoolVariableGpid = globPoolId;
|
this->changedPoolVariableGpid = globPoolId;
|
||||||
this->storeIdForChangedVariable = storeId;
|
this->storeIdForChangedVariable = storeId;
|
||||||
}
|
}
|
||||||
|
@ -160,11 +160,12 @@ public:
|
|||||||
LocalPoolTestDataSet dataset;
|
LocalPoolTestDataSet dataset;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void handleChangedDataset(sid_t sid, store_address_t storeId) override;
|
void handleChangedDataset(sid_t sid, store_address_t storeId, bool* clearMessage) override;
|
||||||
sid_t changedDatasetSid;
|
sid_t changedDatasetSid;
|
||||||
store_address_t storeIdForChangedSet;
|
store_address_t storeIdForChangedSet;
|
||||||
|
|
||||||
void handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId) override;
|
void handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId,
|
||||||
|
bool* clearMessage) override;
|
||||||
gp_id_t changedPoolVariableGpid;
|
gp_id_t changedPoolVariableGpid;
|
||||||
store_address_t storeIdForChangedVariable;
|
store_address_t storeIdForChangedVariable;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user