Adding Catch2 for unittests, reworked CI #165
@ -11,6 +11,9 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/objects/translateObjects.cpp")
|
|||||||
target_sources(${OBSW_NAME} PRIVATE
|
target_sources(${OBSW_NAME} PRIVATE
|
||||||
objects/translateObjects.cpp
|
objects/translateObjects.cpp
|
||||||
)
|
)
|
||||||
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
|
objects/translateObjects.cpp
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# If a special translation file for events exists, compile it.
|
# If a special translation file for events exists, compile it.
|
||||||
@ -18,4 +21,7 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/objects/translateObjects.cpp")
|
|||||||
target_sources(${OBSW_NAME} PRIVATE
|
target_sources(${OBSW_NAME} PRIVATE
|
||||||
events/translateEvents.cpp
|
events/translateEvents.cpp
|
||||||
)
|
)
|
||||||
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
|
events/translateEvents.cpp
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
@ -12,6 +12,9 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/objects/translateObjects.cpp")
|
|||||||
target_sources(${OBSW_NAME} PRIVATE
|
target_sources(${OBSW_NAME} PRIVATE
|
||||||
objects/translateObjects.cpp
|
objects/translateObjects.cpp
|
||||||
)
|
)
|
||||||
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
|
objects/translateObjects.cpp
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# If a special translation file for events exists, compile it.
|
# If a special translation file for events exists, compile it.
|
||||||
@ -19,4 +22,7 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/objects/translateObjects.cpp")
|
|||||||
target_sources(${OBSW_NAME} PRIVATE
|
target_sources(${OBSW_NAME} PRIVATE
|
||||||
events/translateEvents.cpp
|
events/translateEvents.cpp
|
||||||
)
|
)
|
||||||
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
|
events/translateEvents.cpp
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
add_subdirectory(controller)
|
add_subdirectory(controller)
|
||||||
|
add_subdirectory(mocks)
|
||||||
|
|
||||||
target_sources(${UNITTEST_NAME} PRIVATE
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
main.cpp
|
main.cpp
|
||||||
|
@ -3,45 +3,17 @@
|
|||||||
#include <fsfw/housekeeping/AcceptsHkPacketsIF.h>
|
#include <fsfw/housekeeping/AcceptsHkPacketsIF.h>
|
||||||
#include <fsfw/internalerror/InternalErrorReporter.h>
|
#include <fsfw/internalerror/InternalErrorReporter.h>
|
||||||
#include <fsfw/ipc/QueueFactory.h>
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
#include <fsfw/objectmanager.h>
|
|
||||||
#include <fsfw/storagemanager/PoolManager.h>
|
|
||||||
#include <fsfw/timemanager/TimeStamper.h>
|
|
||||||
#include <mission/controller/ThermalController.h>
|
#include <mission/controller/ThermalController.h>
|
||||||
|
|
||||||
#include <catch2/catch_test_macros.hpp>
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
|
||||||
class HkDummy : public SystemObject, public AcceptsHkPacketsIF {
|
|
||||||
public:
|
|
||||||
HkDummy() : SystemObject(objects::PUS_SERVICE_3_HOUSEKEEPING) {}
|
|
||||||
|
|
||||||
virtual MessageQueueId_t getHkQueue() const { return MessageQueueIF::NO_QUEUE; }
|
|
||||||
};
|
|
||||||
|
|
||||||
void factory(void* args) {
|
|
||||||
new HkDummy();
|
|
||||||
|
|
||||||
new HealthTable(objects::HEALTH_TABLE);
|
|
||||||
new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
|
|
||||||
new TimeStamper(objects::TIME_STAMPER);
|
|
||||||
|
|
||||||
{
|
|
||||||
PoolManager::LocalPoolConfig poolCfg = {{300, 16}, {200, 32}, {150, 64}, {150, 128},
|
|
||||||
{100, 256}, {50, 512}, {50, 1024}, {10, 2048}};
|
|
||||||
new PoolManager(objects::IPC_STORE, poolCfg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Thermal Controller", "[ThermalController]") {
|
TEST_CASE("Thermal Controller", "[ThermalController]") {
|
||||||
|
|
||||||
const object_id_t THERMAL_CONTROLLER_ID = 0x123;
|
const object_id_t THERMAL_CONTROLLER_ID = 0x123;
|
||||||
|
|
||||||
|
|
||||||
ThermalController controller(THERMAL_CONTROLLER_ID, objects::NO_OBJECT);
|
ThermalController controller(THERMAL_CONTROLLER_ID, objects::NO_OBJECT);
|
||||||
|
|
||||||
ObjectManager::instance()->setObjectFactoryFunction(factory, nullptr);
|
|
||||||
ObjectManager::instance()->initialize();
|
|
||||||
ObjectManager::instance()->printList();
|
|
||||||
|
|
||||||
controller.initializeAfterTaskCreation();
|
controller.initializeAfterTaskCreation();
|
||||||
|
|
||||||
MessageQueueId_t controllerQueue = controller.getCommandQueue();
|
MessageQueueId_t controllerQueue = controller.getCommandQueue();
|
||||||
@ -65,5 +37,9 @@ TEST_CASE("Thermal Controller", "[ThermalController]") {
|
|||||||
|
|
||||||
componentTemperatures.commit();
|
componentTemperatures.commit();
|
||||||
|
|
||||||
|
ExecutableObjectIF *eventmanager = ObjectManager::instance()->get<ExecutableObjectIF>(objects::EVENT_MANAGER);
|
||||||
|
eventmanager->performOperation();
|
||||||
|
|
||||||
|
|
||||||
QueueFactory::instance()->deleteMessageQueue(commandQueue);
|
QueueFactory::instance()->deleteMessageQueue(commandQueue);
|
||||||
}
|
}
|
@ -1,11 +1,37 @@
|
|||||||
|
#include <fsfw/events/EventManager.h>
|
||||||
|
#include <fsfw/health/HealthTable.h>
|
||||||
|
#include <fsfw/housekeeping/AcceptsHkPacketsIF.h>
|
||||||
|
#include <fsfw/internalerror/InternalErrorReporter.h>
|
||||||
|
#include <fsfw/objectmanager/ObjectManager.h>
|
||||||
|
#include <fsfw/storagemanager/PoolManager.h>
|
||||||
|
#include <fsfw/timemanager/TimeStamper.h>
|
||||||
|
|
||||||
#include <catch2/catch_session.hpp>
|
#include <catch2/catch_session.hpp>
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
#include "mocks/EventManagerMock.h"
|
||||||
|
#include "mocks/HouseKeepingMock.h"
|
||||||
|
|
||||||
// Catch internal function call
|
void factory(void* args) {
|
||||||
int result = Catch::Session().run(argc, argv);
|
new HouseKeepingMock();
|
||||||
|
new EventManagerMock();
|
||||||
|
new HealthTable(objects::HEALTH_TABLE);
|
||||||
|
new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
|
||||||
|
new TimeStamper(objects::TIME_STAMPER);
|
||||||
|
|
||||||
// global clean-up
|
{
|
||||||
return result;
|
PoolManager::LocalPoolConfig poolCfg = {{300, 16}, {200, 32}, {150, 64}, {150, 128},
|
||||||
|
{100, 256}, {50, 512}, {50, 1024}, {10, 2048}};
|
||||||
|
new PoolManager(objects::IPC_STORE, poolCfg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
ObjectManager::instance()->setObjectFactoryFunction(factory, nullptr);
|
||||||
|
ObjectManager::instance()->initialize();
|
||||||
|
|
||||||
|
// Catch internal function call
|
||||||
|
int result = Catch::Session().run(argc, argv);
|
||||||
|
|
||||||
|
// global clean-up
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
4
unittest/mocks/CMakeLists.txt
Normal file
4
unittest/mocks/CMakeLists.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
|
EventManagerMock.cpp
|
||||||
|
HouseKeepingMock.cpp
|
||||||
|
)
|
18
unittest/mocks/EventManagerMock.cpp
Normal file
18
unittest/mocks/EventManagerMock.cpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include "EventManagerMock.h"
|
||||||
|
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
|
|
||||||
|
EventManagerMock::EventManagerMock() : EventManager(objects::EVENT_MANAGER) {}
|
||||||
|
|
||||||
|
|
||||||
|
ReturnValue_t EventManagerMock::performOperation(uint8_t opCode) {
|
||||||
|
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
|
||||||
|
while (result == HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
EventMessage message;
|
||||||
|
result = eventReportQueue->receiveMessage(&message);
|
||||||
|
if (result == HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
notifyListeners(&message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
}
|
@ -1,27 +1,13 @@
|
|||||||
#ifndef EVENTMANAGERMOCK_H_
|
#ifndef EVENTMANAGERMOCK_H_
|
||||||
#define EVENTMANAGERMOCK_H_
|
#define EVENTMANAGERMOCK_H_
|
||||||
|
|
||||||
#include <fsfw/events/EventManagerIF.h>
|
#include <fsfw/events/EventManager.h>
|
||||||
|
|
||||||
class EventManagerMock {
|
class EventManagerMock : public EventManager {
|
||||||
public:
|
public:
|
||||||
virtual MessageQueueId_t getEventReportQueue() override;
|
EventManagerMock();
|
||||||
|
|
||||||
virtual ReturnValue_t registerListener(MessageQueueId_t listener,
|
virtual ReturnValue_t performOperation(uint8_t opCode) override;
|
||||||
bool forwardAllButSelected = false) override;
|
|
||||||
virtual ReturnValue_t subscribeToEvent(MessageQueueId_t listener, EventId_t event) override;
|
|
||||||
virtual ReturnValue_t subscribeToAllEventsFrom(MessageQueueId_t listener,
|
|
||||||
object_id_t object) override;
|
|
||||||
virtual ReturnValue_t subscribeToEventRange(MessageQueueId_t listener, EventId_t idFrom = 0,
|
|
||||||
EventId_t idTo = 0, bool idInverted = false,
|
|
||||||
object_id_t reporterFrom = 0,
|
|
||||||
object_id_t reporterTo = 0,
|
|
||||||
bool reporterInverted = false) override;
|
|
||||||
virtual ReturnValue_t unsubscribeFromEventRange(MessageQueueId_t listener, EventId_t idFrom = 0,
|
|
||||||
EventId_t idTo = 0, bool idInverted = false,
|
|
||||||
object_id_t reporterFrom = 0,
|
|
||||||
object_id_t reporterTo = 0,
|
|
||||||
bool reporterInverted = false) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* EVENTMANAGERMOCK_H_ */
|
#endif /* EVENTMANAGERMOCK_H_ */
|
8
unittest/mocks/HouseKeepingMock.cpp
Normal file
8
unittest/mocks/HouseKeepingMock.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "HouseKeepingMock.h"
|
||||||
|
|
||||||
|
#include <fsfw/objectmanager/frameworkObjects.h>
|
||||||
|
|
||||||
|
|
||||||
|
HouseKeepingMock::HouseKeepingMock() : SystemObject(objects::PUS_SERVICE_3_HOUSEKEEPING) {}
|
||||||
|
|
||||||
|
MessageQueueId_t HouseKeepingMock::getHkQueue() const { return MessageQueueIF::NO_QUEUE; }
|
16
unittest/mocks/HouseKeepingMock.h
Normal file
16
unittest/mocks/HouseKeepingMock.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef HOUSEKEEPINGMOCK_H_
|
||||||
|
#define HOUSEKEEPINGMOCK_H_
|
||||||
|
|
||||||
|
#include <fsfw/housekeeping/AcceptsHkPacketsIF.h>
|
||||||
|
#include <fsfw/objectmanager/SystemObject.h>
|
||||||
|
#include <fsfw/ipc/MessageQueueIF.h>
|
||||||
|
|
||||||
|
class HouseKeepingMock : public SystemObject, public AcceptsHkPacketsIF {
|
||||||
|
public:
|
||||||
|
HouseKeepingMock();
|
||||||
|
|
||||||
|
virtual MessageQueueId_t getHkQueue() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*HOUSEKEEPINGMOCK_H_*/
|
Loading…
Reference in New Issue
Block a user