Merge remote-tracking branch 'origin/mueller/test-update' into mueller/bundled-update

This commit is contained in:
Robin Müller 2020-12-28 17:58:50 +01:00
commit c5212226b8
63 changed files with 323 additions and 123 deletions

2
unittest/CMakeLists.txt Normal file
View File

@ -0,0 +1,2 @@
add_subdirectory(internal)
add_subdirectory(tests)

View File

@ -1,59 +1,19 @@
## FSFW Testing ## FSFW Testing
This repository contains testing and unit testing components.
[Catch2](https://github.com/catchorg/Catch2) has been used as a framework, This folder contains testing and unit testing components.
and these unit tests can only be run on a linux host machine.
The makefile with default settings creates the unit test binary which can be
run in the terminal or in eclipse.
### Instructions ### Instructions
To run the fsfw unittests in the project, perform following steps: The easiest way to run the unittest contained in this folder is to follow
the steps in the [test repository](https://egit.irs.uni-stuttgart.de/fsfw/fsfw_tests).
This is recommended even if the goal is to set up a custom test repository to have
a starting point.
1. Copy the testcfg folder the project root (folder containing the FSFW). To set up a custom test repository or project, following steps can be performed:
2. There is a makefile inside the testcfg folder which can be used to have
a starting point to compile the unit tests. Copy that Makefile to the project
root
3. Create a folder named catch2 (can have other name which requires Makefile
adaption) and copy the Catch2 header files there (NOTE: CMake support
not enabled yet!)
### Eclipse CDT settings 1. Copy the user folder content into the project root.
2. Clone [Catch2](https://github.com/catchorg/Catch2) in the project root.
3. Use the `CMakeLists.txt` as a starting point to add tests and build the test
executable.
The default eclipse terminal has issues displaying the colors used
when running the unit test binary by catch2. To fix this issue,
install the ANSI Escape In Console package from the eclipse marketplace.
### GCOV integration
GCOV has been integrated as a code coverage tool.
It can be enabled by adding `GCOV=1` to the build process as an additional argument.
Coverage data will be provided in form of .gcno and .gcda files.
These can be displayed in eclipse by looking
for a .gcno or .gcda file in the \_obj folder, double-clicking it
and picking the right source-binary. This will generate
information about which lines of a file have run, provided it is open in
eclipse.
### LCOV integration
The files generated by GCOV can also be processed by the tool LCOV.
On ubuntu, the tool can be installed with the following command:
```sh
sudo apt-get install lcov
````
After that, the tool can be run by building the unit tests with `GCOV=1`,
running them at least one time and then executing the `lcov.sh` script.
### Adding unit tests
The catch unit tests are located in unittest/testfw. To add new unit tests,
add them to the UnitTestCatch.cpp file or add a new source file which
includes catch.hpp.
For writing basics tests, the [assertion documentation](https://github.com/catchorg/Catch2/blob/master/docs/assertions.md#top)
or the existing examples are a good guideliens.
For more advanced tests, refer to the [catch2 documentation](https://github.com/catchorg/Catch2/blob/master/docs/Readme.md#top).

View File

@ -0,0 +1,7 @@
target_sources(${TARGET_NAME} PRIVATE
InternalUnitTester.cpp
UnittDefinitions.cpp
)
add_subdirectory(osal)
add_subdirectory(serialize)

View File

@ -0,0 +1,5 @@
target_sources(${TARGET_NAME} PRIVATE
IntTestMq.cpp
IntTestMutex.cpp
IntTestSemaphore.cpp
)

View File

@ -1,8 +1,8 @@
#include "IntTestMq.h" #include "IntTestMq.h"
#include "../UnittDefinitions.h" #include <fsfw/unittest/internal/UnittDefinitions.h>
#include "../../../ipc/MessageQueueIF.h" #include <fsfw/ipc/MessageQueueIF.h>
#include "../../../ipc/QueueFactory.h" #include <fsfw/ipc/QueueFactory.h>
#include <array> #include <array>

View File

@ -1,10 +1,10 @@
#include "IntTestMutex.h" #include "IntTestMutex.h"
#include "../../../ipc/MutexFactory.h" #include <fsfw/ipc/MutexFactory.h>
#include "../UnittDefinitions.h" #include <fsfw/unittest/internal/UnittDefinitions.h>
#if defined(hosted) #if defined(hosted)
#include "../../osal/hosted/Mutex.h" #include <fsfw/osal/hosted/Mutex.h>
#include <thread> #include <thread>
#include <future> #include <future>
#endif #endif

View File

@ -1,10 +1,11 @@
#include "IntTestSemaphore.h" #include "IntTestSemaphore.h"
#include "../UnittDefinitions.h" #include <fsfw/unittest/internal/UnittDefinitions.h>
#include "../../../tasks/SemaphoreFactory.h" #include <fsfw/tasks/SemaphoreFactory.h>
#include "../../../serviceinterface/ServiceInterfaceStream.h" #include <fsfw/serviceinterface/ServiceInterfaceStream.h>
#include "../../../timemanager/Stopwatch.h" #include <fsfw/timemanager/Stopwatch.h>
#include <cstdlib>
void testsemaph::testBinSemaph() { void testsemaph::testBinSemaph() {
std::string id = "[BinSemaphore]"; std::string id = "[BinSemaphore]";
@ -138,7 +139,7 @@ void testsemaph::testCountingSemaphImplementation(SemaphoreIF* countingSemaph,
// attempt to take when count is 0, measure time // attempt to take when count is 0, measure time
result = countingSemaph->acquire(SemaphoreIF::TimeoutType::WAITING, 10); result = countingSemaph->acquire(SemaphoreIF::TimeoutType::WAITING, 10);
dur_millis_t time = stopwatch.stop(); dur_millis_t time = stopwatch.stop();
if(abs(time - 10) > 1) { if(std::abs(static_cast<int32_t>(time - 10)) > 1) {
unitt::put_error(id); unitt::put_error(id);
} }
} }

View File

@ -0,0 +1,3 @@
target_sources(${TARGET_NAME} PRIVATE
IntTestSerialization.cpp
)

View File

@ -1,9 +1,9 @@
#include "IntTestSerialization.h" #include "IntTestSerialization.h"
#include "../UnittDefinitions.h" #include <fsfw/unittest/internal/UnittDefinitions.h>
#include "../../../serialize/SerializeElement.h" #include <fsfw/serialize/SerializeElement.h>
#include "../../../serialize/SerialBufferAdapter.h" #include <fsfw/serialize/SerialBufferAdapter.h>
#include "../../../serialize/SerializeIF.h" #include <fsfw/serialize/SerializeIF.h>
#include <array> #include <array>

View File

@ -0,0 +1,6 @@
add_subdirectory(action)
add_subdirectory(container)
add_subdirectory(osal)
add_subdirectory(serialize)
add_subdirectory(storagemanager)

View File

@ -0,0 +1,3 @@
target_sources(${TARGET_NAME} PRIVATE
TestActionHelper.cpp
)

View File

@ -1,8 +1,11 @@
#include "TestActionHelper.h" #include "TestActionHelper.h"
#include <unittest/core/CatchDefinitions.h>
#include <fsfw/action/ActionHelper.h> #include <fsfw/action/ActionHelper.h>
#include <fsfw/ipc/CommandMessage.h> #include <fsfw/ipc/CommandMessage.h>
#include <catch2/catch.hpp>
#include "../../core/CatchDefinitions.h" #include <catch2/catch_test_macros.hpp>
TEST_CASE( "Action Helper" , "[ActionHelper]") { TEST_CASE( "Action Helper" , "[ActionHelper]") {

View File

@ -3,7 +3,7 @@
#include <fsfw/action/HasActionsIF.h> #include <fsfw/action/HasActionsIF.h>
#include <fsfw/ipc/MessageQueueIF.h> #include <fsfw/ipc/MessageQueueIF.h>
#include <fsfw/unittest/core/CatchDefinitions.h> #include <unittest/core/CatchDefinitions.h>
#include <cstring> #include <cstring>

View File

@ -0,0 +1,10 @@
target_sources(${TARGET_NAME} PRIVATE
RingBufferTest.cpp
TestArrayList.cpp
TestDynamicFifo.cpp
TestFifo.cpp
TestFixedArrayList.cpp
TestFixedMap.cpp
TestFixedOrderedMultimap.cpp
TestPlacementFactory.cpp
)

View File

@ -1,7 +1,7 @@
#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
#include "../../container/SimpleRingBuffer.h" #include <fsfw/container/SimpleRingBuffer.h>
#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
#include <cstring> #include <cstring>
TEST_CASE("Ring Buffer Test" , "[RingBufferTest]") { TEST_CASE("Ring Buffer Test" , "[RingBufferTest]") {

View File

@ -1,8 +1,8 @@
#include "../../container/ArrayList.h" #include <fsfw/container/ArrayList.h>
#include "../../returnvalues/HasReturnvaluesIF.h" #include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
/** /**
* @brief Array List test * @brief Array List test

View File

@ -1,10 +1,9 @@
#include <fsfw/container/DynamicFIFO.h>
#include <fsfw/container/FIFO.h>
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include "../../container/DynamicFIFO.h" #include <catch2/catch_test_macros.hpp>
#include "../../container/FIFO.h" #include <unittest/core/CatchDefinitions.h>
#include "../../returnvalues/HasReturnvaluesIF.h"
#include <catch.hpp>
#include <CatchDefinitions.h>
TEST_CASE( "Dynamic Fifo Tests", "[TestDynamicFifo]") { TEST_CASE( "Dynamic Fifo Tests", "[TestDynamicFifo]") {
INFO("Dynamic Fifo Tests"); INFO("Dynamic Fifo Tests");

View File

@ -1,10 +1,9 @@
#include <fsfw/container/DynamicFIFO.h>
#include <fsfw/container/FIFO.h>
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include "../../container/DynamicFIFO.h" #include <catch2/catch_test_macros.hpp>
#include "../../container/FIFO.h" #include <unittest/core/CatchDefinitions.h>
#include "../../returnvalues/HasReturnvaluesIF.h"
#include <catch2/catch.hpp>
#include "../../core/CatchDefinitions.h"
TEST_CASE( "Static Fifo Tests", "[TestFifo]") { TEST_CASE( "Static Fifo Tests", "[TestFifo]") {
INFO("Fifo Tests"); INFO("Fifo Tests");

View File

@ -1,9 +1,8 @@
#include "../../core/CatchDefinitions.h" #include <fsfw/container/FixedArrayList.h>
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include "../../container/FixedArrayList.h" #include <catch2/catch_test_macros.hpp>
#include "../../returnvalues/HasReturnvaluesIF.h" #include <unittest/core/CatchDefinitions.h>
#include <catch2/catch.hpp>
TEST_CASE( "FixedArrayList Tests", "[TestFixedArrayList]") { TEST_CASE( "FixedArrayList Tests", "[TestFixedArrayList]") {

View File

@ -1,8 +1,8 @@
#include "../../container/FixedMap.h" #include <fsfw/container/FixedMap.h>
#include "../../returnvalues/HasReturnvaluesIF.h" #include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
template class FixedMap<unsigned int, unsigned short>; template class FixedMap<unsigned int, unsigned short>;

View File

@ -1,8 +1,8 @@
#include "../../container/FixedOrderedMultimap.h" #include <fsfw/container/FixedOrderedMultimap.h>
#include "../../returnvalues/HasReturnvaluesIF.h" #include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
TEST_CASE( "FixedOrderedMultimap Tests", "[TestFixedOrderedMultimap]") { TEST_CASE( "FixedOrderedMultimap Tests", "[TestFixedOrderedMultimap]") {
INFO("FixedOrderedMultimap Tests"); INFO("FixedOrderedMultimap Tests");

View File

@ -0,0 +1,4 @@
target_sources(${TARGET_NAME} PRIVATE
TestMessageQueue.cpp
TestSemaphore.cpp
)

View File

@ -1,8 +1,10 @@
#include "../../ipc/MessageQueueIF.h" #include <fsfw/ipc/MessageQueueIF.h>
#include "../../ipc/QueueFactory.h" #include <fsfw/ipc/QueueFactory.h>
#include <catch.hpp>
#include <catch2/catch_test_macros.hpp>
#include <unittest/core/CatchDefinitions.h>
#include <array> #include <array>
#include "../../core/CatchDefinitions.h"
TEST_CASE("MessageQueue Basic Test","[TestMq]") { TEST_CASE("MessageQueue Basic Test","[TestMq]") {
MessageQueueIF* testSenderMq = MessageQueueIF* testSenderMq =

View File

@ -0,0 +1,5 @@
target_sources(${TARGET_NAME} PRIVATE
TestSerialBufferAdapter.cpp
TestSerialization.cpp
TestSerialLinkedPacket.cpp
)

View File

@ -1,7 +1,9 @@
#include "../../serialize/SerialBufferAdapter.h" #include <fsfw/serialize/SerialBufferAdapter.h>
#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
#include <array>
static bool test_value_bool = true; static bool test_value_bool = true;

View File

@ -1,9 +1,12 @@
#include "TestSerialLinkedPacket.h" #include "TestSerialLinkedPacket.h"
#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
#include "../../globalfunctions/arrayprinter.h" #include <fsfw/globalfunctions/arrayprinter.h>
#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
#include <unittest/core/CatchDefinitions.h>
#include <array>
TEST_CASE("Serial Linked Packet" , "[SerLinkPacket]") { TEST_CASE("Serial Linked Packet" , "[SerLinkPacket]") {

View File

@ -37,7 +37,7 @@ public:
return buffer.entry.getConstBuffer(); return buffer.entry.getConstBuffer();
} }
const size_t getBufferLength() { size_t getBufferLength() {
return buffer.getSerializedSize(); return buffer.getSerializedSize();
} }

View File

@ -1,8 +1,10 @@
#include "../../serialize/SerializeAdapter.h" #include <fsfw/serialize/SerializeAdapter.h>
#include <catch2/catch_test_macros.hpp>
#include <catch2/catch_approx.hpp>
#include <unittest/core/CatchDefinitions.h>
#include "catch.hpp"
#include <array> #include <array>
#include "../../core/CatchDefinitions.h"
static bool test_value_bool = true; static bool test_value_bool = true;
static uint8_t tv_uint8 {5}; static uint8_t tv_uint8 {5};
@ -119,10 +121,10 @@ TEST_CASE("Auto Serialize Adapter testing", "[single-file]") {
REQUIRE(tv_int16 == -829); REQUIRE(tv_int16 == -829);
REQUIRE(tv_int32 == -2312); REQUIRE(tv_int32 == -2312);
REQUIRE(tv_float == Approx(8.214921)); REQUIRE(tv_float == Catch::Approx(8.214921));
REQUIRE(tv_double == Approx(9.2132142141e8)); REQUIRE(tv_double == Catch::Approx(9.2132142141e8));
REQUIRE(tv_sfloat == Approx(-922.2321321)); REQUIRE(tv_sfloat == Catch::Approx(-922.2321321));
REQUIRE(tv_sdouble == Approx(-2.2421e19)); REQUIRE(tv_sdouble == Catch::Approx(-2.2421e19));
} }
} }

View File

@ -0,0 +1,4 @@
target_sources(${TARGET_NAME} PRIVATE
TestNewAccessor.cpp
TestPool.cpp
)

View File

@ -1,10 +1,8 @@
#include "CatchDefinitions.h"
#include <fsfw/objectmanager/ObjectManager.h> #include <fsfw/objectmanager/ObjectManager.h>
#include <fsfw/storagemanager/LocalPool.h> #include <fsfw/storagemanager/LocalPool.h>
#include <catch.hpp> #include <catch2/catch_test_macros.hpp>
#include <CatchDefinitions.h> #include <unittest/core/CatchDefinitions.h>
#include <cstring> #include <cstring>

View File

@ -0,0 +1,165 @@
################################################################################
# CMake support for the Flight Software Framework Tests
#
# Developed in an effort to replace Make with a modern build system.
#
# Author: R. Mueller
################################################################################
################################################################################
# Pre-Project preparation
################################################################################
cmake_minimum_required(VERSION 3.13)
# set(CMAKE_VERBOSE TRUE)
set(CMAKE_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/buildsystem/cmake")
# Tests can be built with the Host OSAL or with the Linux OSAL.
if(NOT OS_FSFW)
set(OS_FSFW host CACHE STRING "OS for the FSFW.")
endif()
option(CUSTOM_UNITTEST_RUNNER
"Specify whether custom main or Catch2 main is used" TRUE
)
# Perform steps like loading toolchain files where applicable.
#include(${CMAKE_SCRIPT_PATH}/PreProjectConfig.cmake)
#pre_project_config()
# Project Name
project(fsfw_tests C CXX)
################################################################################
# Pre-Sources preparation
################################################################################
# Specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Set names and variables
set(TARGET_NAME ${CMAKE_PROJECT_NAME})
if(CUSTOM_UNITTEST_RUNNER)
set(CATCH2_TARGET Catch2)
else()
set(CATCH2_TARGET Catch2WithMain)
endif()
set(LIB_FSFW_NAME fsfw)
# Set path names
set(FSFW_PATH fsfw)
set(CATCH2_PATH Catch2)
set(FSFW_TESTS_PATH fsfw/unittest)
set(TEST_SETUP_PATH unittest)
# Analyse different OS and architecture/target options and
# determine BSP_PATH
# FreeRTOS
if(${OS_FSFW} STREQUAL linux)
add_definitions(-DUNIX -DLINUX)
find_package(Threads REQUIRED)
# Hosted
else()
if(WIN32)
add_definitions(-DWIN32)
elseif(UNIX)
find_package(Threads REQUIRED)
add_definitions(-DUNIX -DLINUX)
endif()
endif()
set(FSFW_CONFIG_PATH testcfg)
################################################################################
# Executable and Sources
################################################################################
# Add executable
add_executable(${TARGET_NAME})
# Add subdirectories
add_subdirectory(${FSFW_PATH})
add_subdirectory(${CATCH2_PATH})
add_subdirectory(${FSFW_CONFIG_PATH})
add_subdirectory(${FSFW_TESTS_PATH})
add_subdirectory(${TEST_SETUP_PATH})
################################################################################
# Post-Sources preparation
################################################################################
# Add libraries for all sources.
target_link_libraries(${TARGET_NAME} PRIVATE
${LIB_FSFW_NAME}
${CATCH2_TARGET}
)
# Add include paths for all sources.
target_include_directories(${TARGET_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${FSFW_CONFIG_PATH}
)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(WARNING_FLAGS
-Wall
-Wextra
-Wshadow=local
-Wimplicit-fallthrough=1
-Wno-unused-parameter
-Wno-psabi
)
# Remove unused sections.
target_compile_options(${TARGET_NAME} PRIVATE
"-ffunction-sections"
"-fdata-sections"
)
# Removed unused sections.
target_link_options(${TARGET_NAME} PRIVATE
"-Wl,--gc-sections"
)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(COMPILER_FLAGS "/permissive-")
endif()
if(CMAKE_VERBOSE)
message(STATUS "Warning flags: ${WARNING_FLAGS}")
endif()
# Compile options for all sources.
target_compile_options(${TARGET_NAME} PRIVATE
$<$<COMPILE_LANGUAGE:C>:${WARNING_FLAGS} ${COMPILER_FLAGS}>
$<$<COMPILE_LANGUAGE:CXX>:${WARNING_FLAGS} ${COMPILER_FLAGS}>
${ABI_FLAGS}
)
if(NOT CMAKE_SIZE)
set(CMAKE_SIZE size)
if(WIN32)
set(FILE_SUFFIX ".exe")
endif()
endif()
add_custom_command(
TARGET ${TARGET_NAME}
POST_BUILD
COMMAND echo "Build directory: ${CMAKE_BINARY_DIR}"
COMMAND echo "Target OSAL: ${OS_FSFW}"
COMMAND echo "Target Build Type: ${CMAKE_BUILD_TYPE}"
COMMAND ${CMAKE_SIZE} ${TARGET_NAME}${FILE_SUFFIX}
)
include (${CMAKE_CURRENT_SOURCE_DIR}/buildsystem/cmake/BuildType.cmake)
set_build_type()

View File

@ -0,0 +1,11 @@
target_sources(${TARGET_NAME}
PRIVATE
ipc/MissionMessageTypes.cpp
pollingsequence/PollingSequenceFactory.cpp
)
# Add include paths for the executable
target_include_directories(${TARGET_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)

View File

@ -0,0 +1,7 @@
target_sources(${TARGET_NAME} PRIVATE
CatchDefinitions.cpp
CatchFactory.cpp
CatchRunner.cpp
CatchSetup.cpp
printChar.cpp
)