142 lines
6.5 KiB
C++
142 lines
6.5 KiB
C++
#include <fsfw/datapool/PoolReadGuard.h>
|
|
#include <fsfw/datapoollocal/PeriodicHkGenerationHelper.h>
|
|
#include <fsfw/datapoollocal/StaticSharedDataset.h>
|
|
#include <fsfw/globalfunctions/timevalOperations.h>
|
|
#include <fsfw/ipc/CommandMessageCleaner.h>
|
|
#include <fsfw/objectmanager/ObjectManager.h>
|
|
#include <fsfw/timemanager/CCSDSTime.h>
|
|
|
|
#include <catch2/catch_approx.hpp>
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include <catch2/matchers/catch_matchers_floating_point.hpp>
|
|
#include <iostream>
|
|
|
|
#include "CatchDefinitions.h"
|
|
#include "mocks/HkReceiverMock.h"
|
|
#include "mocks/LocalPoolOwnerBase.h"
|
|
|
|
TEST_CASE("Local Pool Manager Tests", "[LocManTest]") {
|
|
const MessageQueueId_t defaultDestId = 1;
|
|
const MessageQueueId_t hkDest = defaultDestId;
|
|
const MessageQueueId_t subscriberId = 2;
|
|
auto hkReceiver = HkReceiverMock(hkDest);
|
|
auto queue = MessageQueueMock(3);
|
|
LocalPoolOwnerBase poolOwner(queue, hkDest, objects::TEST_LOCAL_POOL_OWNER_BASE);
|
|
|
|
REQUIRE(poolOwner.initialize() == returnvalue::OK);
|
|
|
|
MessageQueueMock& poolOwnerMock = poolOwner.getMockQueueHandle();
|
|
CommandMessage messageSent;
|
|
|
|
// TODO: Fix
|
|
SECTION("Basic Test") {
|
|
{
|
|
// For code coverage, should not crash
|
|
PeriodicHkGenerationHelper manager(nullptr, nullptr);
|
|
}
|
|
auto owner = poolOwner.hkHelper.getOwner();
|
|
REQUIRE(owner != nullptr);
|
|
CHECK(owner->getObjectId() == objects::TEST_LOCAL_POOL_OWNER_BASE);
|
|
|
|
// Clear message to avoid memory leak, our mock won't do it for us (yet)
|
|
CommandMessageCleaner::clearCommandMessage(&messageSent);
|
|
}
|
|
|
|
SECTION("PeriodicHKAndMessaging") {
|
|
// Now we subcribe for a HK periodic generation. Even when it's difficult to simulate
|
|
// the temporal behaviour correctly the HK manager should generate a HK packet
|
|
// immediately and the periodic helper depends on HK op function calls anyway instead of
|
|
// using the clock, so we could also just call performHkOperation multiple times
|
|
REQUIRE(poolOwner.subscribePeriodicHk(true) == returnvalue::OK);
|
|
REQUIRE(poolOwner.hkHelper.performHkOperation() == returnvalue::OK);
|
|
// Now HK packet should be sent as message immediately.
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
CHECK(poolOwnerMock.numberOfSentMessages() == 1);
|
|
CHECK(poolOwnerMock.clearLastSentMessage() == returnvalue::OK);
|
|
|
|
CHECK(poolOwner.hkHelper.generateHousekeepingPacket(lpool::testSid0) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
CHECK(poolOwnerMock.numberOfSentMessages() == 1);
|
|
CHECK(poolOwnerMock.clearLastSentMessage() == returnvalue::OK);
|
|
|
|
// CHECK(setHandle->getReportingEnabled() == true);
|
|
CommandMessage hkCmd;
|
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid0, false);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
// CHECK(setHandle->getReportingEnabled() == false);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
CHECK(poolOwnerMock.numberOfSentMessages() == 1);
|
|
CHECK(poolOwnerMock.clearLastSentMessage() == returnvalue::OK);
|
|
|
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid0, true);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
// CHECK(setHandle->getReportingEnabled() == true);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
CHECK(poolOwnerMock.clearLastSentMessage() == returnvalue::OK);
|
|
|
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid0, false);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
// CHECK(setHandle->getReportingEnabled() == false);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
CHECK(poolOwnerMock.clearLastSentMessage() == returnvalue::OK);
|
|
|
|
HousekeepingMessage::setCollectionIntervalModificationCommand(&hkCmd, lpool::testSid0, 0.4);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
// CHECK_THAT(poolOwner.dataset.getCollectionInterval(), Catch::Matchers::WithinAbs(0.4, 0.01));
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
CHECK(poolOwnerMock.clearLastSentMessage() == returnvalue::OK);
|
|
|
|
HousekeepingMessage::setStructureReportingCommand(&hkCmd, lpool::testSid0);
|
|
REQUIRE(poolOwner.hkHelper.performHkOperation() == returnvalue::OK);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
// Now HK packet should be sent as message.
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
HousekeepingMessage::setOneShotReportCommand(&hkCmd, lpool::testSid0);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
HousekeepingMessage::setStructureReportingCommand(&hkCmd, lpool::testSid0);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
HousekeepingMessage::setCollectionIntervalModificationCommand(&hkCmd, lpool::testSid0, 0.4);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid0, true);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
HousekeepingMessage::setToggleReportingCommand(&hkCmd, lpool::testSid0, false);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
HousekeepingMessage::setOneShotReportCommand(&hkCmd, lpool::testSid0);
|
|
CHECK(poolOwner.hkHelper.handleHousekeepingMessage(&hkCmd) == returnvalue::OK);
|
|
REQUIRE(poolOwnerMock.wasMessageSent());
|
|
REQUIRE(poolOwnerMock.numberOfSentMessages() == 1);
|
|
poolOwnerMock.clearMessages();
|
|
|
|
// poolOwner.hkHelper.printPoolEntry(lpool::uint8VarId);
|
|
}
|
|
|
|
// we need to reset the subscription list because the pool owner
|
|
// is a global object.
|
|
CHECK(poolOwner.reset() == returnvalue::OK);
|
|
poolOwnerMock.clearMessages(true);
|
|
}
|