Skip to content

Commit

Permalink
Update tests/posix_gcc_simulater and change unit-tests accordingly
Browse files Browse the repository at this point in the history
  • Loading branch information
TheSomeMan committed Apr 12, 2023
1 parent b6b0e71 commit ea0a006
Show file tree
Hide file tree
Showing 5 changed files with 242 additions and 50 deletions.
64 changes: 56 additions & 8 deletions tests/test_os_signal_freertos/test_os_signal_freertos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,17 @@ class TestOsSignalFreertos : public ::testing::Test
{
private:
protected:
pthread_t pid;

void
SetUp() override
{
esp_log_wrapper_init();
sem_init(&semaFreeRTOS, 0, 0);
const int err = pthread_create(&pid, nullptr, &freertosStartup, this);
pid_test = pthread_self();
const int err = pthread_create(&pid_freertos, nullptr, &freertosStartup, this);
assert(0 == err);
while (0 != sem_wait(&semaFreeRTOS))
{
}
g_pTestClass = this;
}

void
Expand All @@ -68,13 +66,15 @@ class TestOsSignalFreertos : public ::testing::Test
cmdQueue.push_and_wait(MainTaskCmd_Exit);
vTaskEndScheduler();
void* ret_code = nullptr;
pthread_join(pid, &ret_code);
pthread_join(pid_freertos, &ret_code);
sem_destroy(&semaFreeRTOS);
esp_log_wrapper_deinit();
g_pTestClass = nullptr;
}

public:
pthread_t pid_test;
pthread_t pid_freertos;
sem_t semaFreeRTOS;
TQueue<MainTaskCmd_e> cmdQueue;
std::vector<TestEvent*> testEvents;
Expand All @@ -98,13 +98,20 @@ class TestOsSignalFreertos : public ::testing::Test

TestOsSignalFreertos::TestOsSignalFreertos()
: Test()
, pid_test(0)
, pid_freertos(0)
, semaFreeRTOS({})
, p_signal(nullptr)
, p_signal2(nullptr)
, result_run_signal_handler_task(false)
{
g_pTestClass = this;
}

TestOsSignalFreertos::~TestOsSignalFreertos() = default;
TestOsSignalFreertos::~TestOsSignalFreertos()
{
g_pTestClass = nullptr;
}

extern "C" {

Expand Down Expand Up @@ -138,6 +145,46 @@ timespec_diff_ms(const struct timespec* p_t2, const struct timespec* p_t1)
return diff.tv_sec * 1000 + diff.tv_nsec / 1000000;
}

void
tdd_assert_trap(void)
{
assert(0);
}

static volatile int32_t g_flagDisableCheckIsThreadFreeRTOS;

void
disableCheckingIfCurThreadIsFreeRTOS(void)
{
++g_flagDisableCheckIsThreadFreeRTOS;
}

void
enableCheckingIfCurThreadIsFreeRTOS(void)
{
--g_flagDisableCheckIsThreadFreeRTOS;
assert(g_flagDisableCheckIsThreadFreeRTOS >= 0);
}

int
checkIfCurThreadIsFreeRTOS(void)
{
if (nullptr == g_pTestClass)
{
return false;
}
if (g_flagDisableCheckIsThreadFreeRTOS)
{
return true;
}
const pthread_t cur_thread_pid = pthread_self();
if (cur_thread_pid == g_pTestClass->pid_test)
{
return false;
}
return true;
}

} // extern "C"

bool
Expand Down Expand Up @@ -373,7 +420,8 @@ cmdHandlerTask(void* p_param)
static void*
freertosStartup(void* arg)
{
auto* pObj = static_cast<TestOsSignalFreertos*>(arg);
auto* pObj = static_cast<TestOsSignalFreertos*>(arg);
disableCheckingIfCurThreadIsFreeRTOS();
const bool res
= xTaskCreate(&cmdHandlerTask, "cmdHandlerTask", configMINIMAL_STACK_SIZE, pObj, tskIDLE_PRIORITY + 1, nullptr);
assert(res);
Expand Down Expand Up @@ -471,4 +519,4 @@ TEST_F(TestOsSignalFreertos, test1) // NOLINT
auto* pEv = reinterpret_cast<TestEventThreadExit*>(pBaseEv);
ASSERT_EQ(2, pEv->thread_num);
}
}
}
40 changes: 26 additions & 14 deletions tests/test_os_task_freertos/test_os_task_freertos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,30 @@ class TestOsTaskFreertos : public ::testing::Test
extern "C" {

static void
sleep_ms(uint32_t msec)
sleep_ms_unchecked(uint32_t msec)
{
struct timespec ts = {
.tv_sec = msec / 1000,
.tv_nsec = (msec % 1000) * 1000000,
struct timespec time_spec = {
.tv_sec = msec / 1000U,
.tv_nsec = (msec % 1000U) * 1000000U,
};

int res = 0;
do
(void)nanosleep(&time_spec, &time_spec);
}

static void
sleep_ms(uint32_t msec)
{
const TickType_t tick_start = xTaskGetTickCount();
while (true)
{
res = nanosleep(&ts, &ts);
} while ((0 != res) && (EINTR == errno));
const TickType_t delta_ticks = xTaskGetTickCount() - tick_start;
if (delta_ticks >= pdMS_TO_TICKS(msec))
{
break;
}
const uint32_t remain_msec = (pdMS_TO_TICKS(msec) - delta_ticks) * 1000 / configTICK_RATE_HZ;
sleep_ms_unchecked(remain_msec);
}
}

} // extern "C"
Expand Down Expand Up @@ -205,7 +217,7 @@ TEST_F(TestOsTaskFreertos, test1) // NOLINT
{
const os_task_priority_t priority = 3;
{
const uint32_t stack_depth = 1024U;
const uint32_t stack_depth = 4096U;
os_task_handle_t h_task = nullptr;
this->m_counter = 0;
ASSERT_TRUE(os_task_create(
Expand All @@ -229,7 +241,7 @@ TEST_F(TestOsTaskFreertos, test1) // NOLINT
ASSERT_EQ(saved_counter2, this->m_counter);
}
{
const uint32_t stack_depth = 1024U;
const uint32_t stack_depth = 4096U;
os_task_handle_t h_task = nullptr;
this->m_counter = 0;
const PtrToCounter_t ptrToCounter = {
Expand All @@ -256,7 +268,7 @@ TEST_F(TestOsTaskFreertos, test1) // NOLINT
ASSERT_EQ(saved_counter2, this->m_counter);
}
{
const uint32_t stack_depth = 1024U;
const uint32_t stack_depth = 4096U;
os_task_handle_t h_task = nullptr;
ASSERT_TRUE(os_task_create_without_param(
&task_func_infinite_without_param,
Expand All @@ -278,7 +290,7 @@ TEST_F(TestOsTaskFreertos, test1) // NOLINT
ASSERT_EQ(saved_counter2, this->m_counter);
}
{
const uint32_t stack_depth = 1024U;
const uint32_t stack_depth = 4096U;
this->m_counter = 0;
ASSERT_TRUE(os_task_create_finite(
&task_func_finite_with_param,
Expand All @@ -293,7 +305,7 @@ TEST_F(TestOsTaskFreertos, test1) // NOLINT
ASSERT_EQ(saved_counter, this->m_counter);
}
{
const uint32_t stack_depth = 1024U;
const uint32_t stack_depth = 4096U;
this->m_counter = 0;
const PtrToCounter_t ptrToCounter = {
.p_counter = &this->m_counter,
Expand All @@ -311,7 +323,7 @@ TEST_F(TestOsTaskFreertos, test1) // NOLINT
ASSERT_EQ(saved_counter, this->m_counter);
}
{
const uint32_t stack_depth = 1024U;
const uint32_t stack_depth = 4096U;
ASSERT_TRUE(os_task_create_finite_without_param(
&task_func_finite_without_param,
"dyn_fin_with_param",
Expand Down
88 changes: 77 additions & 11 deletions tests/test_os_timer_freertos/test_os_timer_freertos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,17 @@ class TestOsTimerFreertos : public ::testing::Test
{
private:
protected:
pthread_t pid;

void
SetUp() override
{
esp_log_wrapper_init();
sem_init(&semaFreeRTOS, 0, 0);
const int err = pthread_create(&pid, nullptr, &freertosStartup, this);
pid_test = pthread_self();
const int err = pthread_create(&pid_freertos, nullptr, &freertosStartup, this);
assert(0 == err);
while (0 != sem_wait(&semaFreeRTOS))
{
}
g_pTestClass = this;
}

void
Expand All @@ -67,13 +65,15 @@ class TestOsTimerFreertos : public ::testing::Test
cmdQueue.push_and_wait(MainTaskCmd_Exit);
vTaskEndScheduler();
void* ret_code = nullptr;
pthread_join(pid, &ret_code);
pthread_join(pid_freertos, &ret_code);
sem_destroy(&semaFreeRTOS);
esp_log_wrapper_deinit();
g_pTestClass = nullptr;
}

public:
pthread_t pid_test;
pthread_t pid_freertos;
sem_t semaFreeRTOS;
TQueue<MainTaskCmd_e> cmdQueue;
os_timer_periodic_static_t timer_periodic_static;
Expand All @@ -92,17 +92,22 @@ class TestOsTimerFreertos : public ::testing::Test

TestOsTimerFreertos::TestOsTimerFreertos()
: Test()
, pid(0)
, pid_test(0)
, pid_freertos(0)
, semaFreeRTOS({})
, timer_periodic_static({})
, timer_one_shot_static({})
, p_timer_periodic(nullptr)
, p_timer_one_shot(nullptr)
, counter(0)
{
g_pTestClass = this;
}

TestOsTimerFreertos::~TestOsTimerFreertos() = default;
TestOsTimerFreertos::~TestOsTimerFreertos()
{
g_pTestClass = nullptr;
}

extern "C" {

Expand Down Expand Up @@ -150,7 +155,7 @@ timespec_diff_ms(const struct timespec* p_t2, const struct timespec* p_t1)
}

static void
sleep_ms(uint32_t msec)
sleep_ms_unchecked(uint32_t msec)
{
struct timespec ts = {
.tv_sec = msec / 1000,
Expand All @@ -164,10 +169,70 @@ sleep_ms(uint32_t msec)
} while ((0 != res) && (EINTR == errno));
}

static void
sleep_ms(uint32_t msec)
{
disableCheckingIfCurThreadIsFreeRTOS();
const TickType_t tick_start = xTaskGetTickCount();
enableCheckingIfCurThreadIsFreeRTOS();
while (true)
{
disableCheckingIfCurThreadIsFreeRTOS();
const TickType_t delta_ticks = xTaskGetTickCount() - tick_start;
enableCheckingIfCurThreadIsFreeRTOS();
if (delta_ticks >= pdMS_TO_TICKS(msec))
{
break;
}
const uint32_t remain_msec = (pdMS_TO_TICKS(msec) - delta_ticks) * 1000 / configTICK_RATE_HZ;
sleep_ms_unchecked(remain_msec);
}
}

void
os_task_delay(const os_delta_ticks_t delay_ticks)
{
sleep_ms(delay_ticks);
vTaskDelay(delay_ticks);
}

void
tdd_assert_trap(void)
{
assert(0);
}

static volatile int32_t g_flagDisableCheckIsThreadFreeRTOS;

void
disableCheckingIfCurThreadIsFreeRTOS(void)
{
++g_flagDisableCheckIsThreadFreeRTOS;
}

void
enableCheckingIfCurThreadIsFreeRTOS(void)
{
--g_flagDisableCheckIsThreadFreeRTOS;
assert(g_flagDisableCheckIsThreadFreeRTOS >= 0);
}

int
checkIfCurThreadIsFreeRTOS(void)
{
if (nullptr == g_pTestClass)
{
return false;
}
if (g_flagDisableCheckIsThreadFreeRTOS)
{
return true;
}
const pthread_t cur_thread_pid = pthread_self();
if (cur_thread_pid == g_pTestClass->pid_test)
{
return false;
}
return true;
}

} // extern "C"
Expand Down Expand Up @@ -274,7 +339,8 @@ cmdHandlerTask(void* p_param)
static void*
freertosStartup(void* arg)
{
auto* pObj = static_cast<TestOsTimerFreertos*>(arg);
auto* pObj = static_cast<TestOsTimerFreertos*>(arg);
disableCheckingIfCurThreadIsFreeRTOS();
const bool res
= xTaskCreate(&cmdHandlerTask, "cmdHandlerTask", configMINIMAL_STACK_SIZE, pObj, tskIDLE_PRIORITY + 1, nullptr);
assert(res);
Expand Down Expand Up @@ -410,4 +476,4 @@ TEST_F(TestOsTimerFreertos, test1) // NOLINT

cmdQueue.push_and_wait(MainTaskCmd_TimerPeriodicDelete);
ASSERT_EQ(nullptr, this->p_timer_periodic);
}
}
Loading

0 comments on commit ea0a006

Please sign in to comment.