mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/Tasty.git
synced 2025-06-12 19:35:58 +00:00
Added new test case testing for memory leaks and correct thread starting
This commit is contained in:
parent
529e2f6224
commit
ccfc354c8f
@ -2,6 +2,6 @@
|
|||||||
#ifndef STA_TASTY_CONFIG_HPP
|
#ifndef STA_TASTY_CONFIG_HPP
|
||||||
#define STA_TASTY_CONFIG_HPP
|
#define STA_TASTY_CONFIG_HPP
|
||||||
|
|
||||||
#define TASTY_CASE_7
|
#define TASTY_CASE_9
|
||||||
|
|
||||||
#endif // STA_TASTY_CONFIG_HPP
|
#endif // STA_TASTY_CONFIG_HPP
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
*
|
* Timed state transitions can be overwritten by timed state transitions with later deadline.
|
||||||
|
*
|
||||||
|
* TODO: Implement the correct requirement.
|
||||||
*/
|
*/
|
||||||
#include <sta/tasty/config.hpp>
|
#include <sta/tasty/config.hpp>
|
||||||
#ifdef TASTY_CASE_5
|
#ifdef TASTY_CASE_5
|
||||||
@ -13,8 +15,6 @@ namespace sta
|
|||||||
{
|
{
|
||||||
class DummyThread : public tacos::TacosThread
|
class DummyThread : public tacos::TacosThread
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
/* data */
|
|
||||||
public:
|
public:
|
||||||
DummyThread()
|
DummyThread()
|
||||||
: tacos::TacosThread{"Dummy", osPriorityNormal}
|
: tacos::TacosThread{"Dummy", osPriorityNormal}
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
* Author: Dario
|
* Author: Dario
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A thread gets stuck in an infinite loop and the watchdog restarts it.
|
||||||
|
*/
|
||||||
#include <sta/tasty/config.hpp>
|
#include <sta/tasty/config.hpp>
|
||||||
#ifdef TASTY_CASE_7
|
#ifdef TASTY_CASE_7
|
||||||
|
|
||||||
|
97
src/cases/case8.cpp
Normal file
97
src/cases/case8.cpp
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* case8.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jan 24, 2024
|
||||||
|
* Author: Dario
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A thread gets stuck in an infinite loop and the watchdog restarts it.
|
||||||
|
*/
|
||||||
|
#include <sta/tasty/config.hpp>
|
||||||
|
#ifdef TASTY_CASE_8
|
||||||
|
|
||||||
|
#include <sta/tacos.hpp>
|
||||||
|
#include <sta/tasty/utils.hpp>
|
||||||
|
#include <sta/tacos/watchdog.hpp>
|
||||||
|
#include <sta/rtos/mutex.hpp>
|
||||||
|
|
||||||
|
namespace sta
|
||||||
|
{
|
||||||
|
namespace tasty
|
||||||
|
{
|
||||||
|
static RtosMutex * mutexA;
|
||||||
|
static RtosMutex * mutexB;
|
||||||
|
|
||||||
|
class ThreadA : public tacos::TacosThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ThreadA()
|
||||||
|
: tacos::TacosThread{"A", osPriorityNormal}
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void func() override
|
||||||
|
{
|
||||||
|
mutexA->acquire();
|
||||||
|
|
||||||
|
this->sleep(10);
|
||||||
|
|
||||||
|
mutexB->acquire();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ThreadB : public tacos::TacosThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ThreadB()
|
||||||
|
: tacos::TacosThread{"B", osPriorityNormal}
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void func() override
|
||||||
|
{
|
||||||
|
mutexB->acquire();
|
||||||
|
|
||||||
|
this->sleep(10);
|
||||||
|
|
||||||
|
mutexA->acquire();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Observer : public tacos::TacosThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Observer()
|
||||||
|
: tacos::TacosThread{"Observer", osPriorityNormal}
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void func() override
|
||||||
|
{
|
||||||
|
this->sleep(2000);
|
||||||
|
|
||||||
|
STA_TASTY_ASSERT(tacos::Watchdog::instance()->getNumRestarts() == 2);
|
||||||
|
|
||||||
|
STA_TASTY_TERMINATE();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void onTastyInit()
|
||||||
|
{
|
||||||
|
mutexA = new RtosMutex("MutA");
|
||||||
|
mutexB = new RtosMutex("MutB");
|
||||||
|
|
||||||
|
tacos::addThread<ThreadA>({0});
|
||||||
|
tacos::addThread<ThreadB>({0});
|
||||||
|
tacos::addThread<Observer>({0});
|
||||||
|
}
|
||||||
|
} // namespace tasty
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TASTY_CASE_8
|
||||||
|
|
||||||
|
|
116
src/cases/case9.cpp
Normal file
116
src/cases/case9.cpp
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* case8.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jan 24, 2024
|
||||||
|
* Author: Dario
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if threads are properly terminated and started because of state transitions. The thread status is updated accordingly and no memory leaks occur.
|
||||||
|
*/
|
||||||
|
#include <sta/tasty/config.hpp>
|
||||||
|
#ifdef TASTY_CASE_9
|
||||||
|
|
||||||
|
#include <sta/tacos.hpp>
|
||||||
|
#include <sta/tasty/utils.hpp>
|
||||||
|
#include <sta/tacos/watchdog.hpp>
|
||||||
|
#include <sta/rtos/mutex.hpp>
|
||||||
|
#include <sta/rtos/debug/heap_stats.hpp>
|
||||||
|
|
||||||
|
namespace sta
|
||||||
|
{
|
||||||
|
namespace tasty
|
||||||
|
{
|
||||||
|
class ThreadA : public tacos::TacosThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ThreadA()
|
||||||
|
: tacos::TacosThread{"A", osPriorityNormal}
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void func() override
|
||||||
|
{
|
||||||
|
osThreadYield();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ThreadB : public tacos::TacosThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ThreadB()
|
||||||
|
: tacos::TacosThread{"B", osPriorityNormal}
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void func() override
|
||||||
|
{
|
||||||
|
osThreadYield();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
std::shared_ptr<ThreadA> thread_A;
|
||||||
|
std::shared_ptr<ThreadB> thread_B;
|
||||||
|
|
||||||
|
|
||||||
|
class Observer : public tacos::TacosThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Observer()
|
||||||
|
: tacos::TacosThread{"Observer", osPriorityNormal}
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void func() override
|
||||||
|
{
|
||||||
|
size_t mallocs = sta::rtos::getNumAllocs();
|
||||||
|
|
||||||
|
STA_TASTY_ASSERT(thread_A->isRunning());
|
||||||
|
STA_TASTY_ASSERT(!thread_B->isRunning());
|
||||||
|
STA_TASTY_ASSERT(thread_B->getStatus() == tacos::ThreadStatus::STOPPED);
|
||||||
|
|
||||||
|
this->sleep(20);
|
||||||
|
|
||||||
|
tacos::setState(0, 1);
|
||||||
|
|
||||||
|
this->sleep(5);
|
||||||
|
|
||||||
|
STA_TASTY_ASSERT(!thread_A->isRunning());
|
||||||
|
STA_TASTY_ASSERT(thread_B->isRunning());
|
||||||
|
STA_TASTY_ASSERT(thread_A->getStatus() == tacos::ThreadStatus::STOPPED);
|
||||||
|
STA_TASTY_ASSERT(sta::rtos::getNumAllocs() == mallocs + 2);
|
||||||
|
|
||||||
|
tacos::setState(1, 0);
|
||||||
|
|
||||||
|
this->sleep(5);
|
||||||
|
|
||||||
|
STA_TASTY_ASSERT(thread_A->isRunning());
|
||||||
|
STA_TASTY_ASSERT(!thread_B->isRunning());
|
||||||
|
STA_TASTY_ASSERT(thread_B->getStatus() == tacos::ThreadStatus::STOPPED);
|
||||||
|
STA_TASTY_ASSERT(sta::rtos::getNumAllocs() == mallocs + 2);
|
||||||
|
|
||||||
|
tacos::setState(0, 1);
|
||||||
|
|
||||||
|
STA_TASTY_ASSERT(!thread_A->isRunning());
|
||||||
|
STA_TASTY_ASSERT(thread_B->isRunning());
|
||||||
|
STA_TASTY_ASSERT(thread_A->getStatus() == tacos::ThreadStatus::STOPPED);
|
||||||
|
STA_TASTY_ASSERT(sta::rtos::getNumAllocs() == mallocs + 2);
|
||||||
|
|
||||||
|
STA_TASTY_TERMINATE();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void onTastyInit()
|
||||||
|
{
|
||||||
|
thread_A = tacos::addThread<ThreadA>({0});
|
||||||
|
thread_B = tacos::addThread<ThreadB>({1});
|
||||||
|
tacos::addThread<Observer>({0, 1});
|
||||||
|
}
|
||||||
|
} // namespace tasty
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TASTY_CASE_9
|
@ -16,6 +16,8 @@ namespace sta
|
|||||||
void test_terminate()
|
void test_terminate()
|
||||||
{
|
{
|
||||||
STA_DEBUG_PRINTLN("[T]");
|
STA_DEBUG_PRINTLN("[T]");
|
||||||
|
|
||||||
|
while (true) {}
|
||||||
}
|
}
|
||||||
} // namespace tasty
|
} // namespace tasty
|
||||||
} // namespace sta
|
} // namespace sta
|
||||||
|
Loading…
x
Reference in New Issue
Block a user