#include "test.hpp" #include #include using namespace fos; TEST_CASE("Test Delay", "[freeRtos][task]") { TickType_t start = xTaskGetTickCount(); Task::delayMs(5 * portTICK_PERIOD_MS); TickType_t end = xTaskGetTickCount(); TEST_ASSERT_GREATER_OR_EQUAL(5, (end - start)); TEST_ASSERT_LESS_OR_EQUAL(6, (end - start)); } static bool taskWasCalled = false; static void callableTask() { taskWasCalled = true; while (true) { vTaskDelay(100); } } TEST_CASE("Test creation and deletion", "[freeRtos][task]") { static Task task(callableTask, "task1"); Task::delayMs(50); TEST_ASSERT_TRUE(taskWasCalled); task.kill(); } static void callableTask2() { taskWasCalled = true; while (true) { vTaskDelay(100); } } TEST_CASE("Test if task can be killed", "[freeRtos][task]") { static Task task(callableTask2, "task2"); auto handle = task.getHandle(); configASSERT(handle); TEST_ASSERT_TRUE(eTaskState::eReady == task.getState() || eTaskState::eBlocked == task.getState()); Task::delayMs(50); TEST_ASSERT_TRUE(taskWasCalled); task.kill(); TEST_ASSERT_EQUAL(eTaskState::eDeleted, eTaskGetState(handle)); } static std::array values; static void oneOfMultiple(int idx) { static std::array c{1, -1}; for (size_t i = 0; i < 10; i++) { values.at(idx) += c.at(idx); } while (true) { vTaskDelay(100); } } TEST_CASE("Test if tasks do not interfere", "[freeRtos][task]") { // Both tasks are run by starting the same static function body int param1 = 0; TaskT task1(oneOfMultiple, param1, "pTask1"); int param2 = 1; TaskT task2(oneOfMultiple, param2, "pTask2"); Task::delayMs(50); TEST_ASSERT_EQUAL(10, values[0]); TEST_ASSERT_EQUAL(-10, values[1]); } TEST_CASE("Test if tasks can be joined correctly", "[freeRtos][task]") { // Both tasks are run by starting the same static function body int param1 = 0; Task task1(oneOfMultiple, param1, "pTask1"); int param2 = 1; TaskT task2(oneOfMultiple, param2, "pTask2"); Task::delayMs(50); TEST_ASSERT_EQUAL(10, values[0]); TEST_ASSERT_EQUAL(-10, values[1]); }