From f5e8e052821a827dfe659a33b5ea3fedd209b20d Mon Sep 17 00:00:00 2001 From: Anurag Kar Date: Fri, 28 Dec 2018 14:41:24 +0530 Subject: [PATCH] pthread tests : test case added for detach functionality --- components/pthread/test/test_pthread.c | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/components/pthread/test/test_pthread.c b/components/pthread/test/test_pthread.c index 543fbf585..7453f7a75 100644 --- a/components/pthread/test/test_pthread.c +++ b/components/pthread/test/test_pthread.c @@ -60,6 +60,75 @@ TEST_CASE("pthread create join", "[pthread]") } } +static void *waiting_thread(void *arg) +{ + TaskHandle_t *task_handle = (TaskHandle_t *)arg; + TaskHandle_t parent_task = *task_handle; + + *task_handle = xTaskGetCurrentTaskHandle(); + + xTaskNotify(parent_task, 0, eNoAction); + xTaskNotifyWait(0, 0, NULL, portMAX_DELAY); + return NULL; +} + +TEST_CASE("pthread detach", "[pthread]") +{ + int res = 0; + pthread_t new_thread = (pthread_t)NULL; + TaskHandle_t task_handle = NULL; + const int task_count = uxTaskGetNumberOfTasks(); + bool detach_works = false; + + if (TEST_PROTECT()) { + task_handle = xTaskGetCurrentTaskHandle(); + res = pthread_create(&new_thread, NULL, waiting_thread, (void *)&task_handle); + TEST_ASSERT_EQUAL_INT(0, res); + + res = xTaskNotifyWait(0, 0, NULL, 100 / portTICK_PERIOD_MS); + TEST_ASSERT_EQUAL_INT(pdTRUE, res); + + xTaskNotify(task_handle, 0, eNoAction); + vTaskDelay(100 / portTICK_PERIOD_MS); + + res = pthread_detach(new_thread); + TEST_ASSERT_EQUAL_INT(0, res); + + res = uxTaskGetNumberOfTasks(); + TEST_ASSERT_EQUAL_INT(task_count, res); + detach_works = true; + } + + if (!detach_works) { + vTaskDelete(task_handle); + } else { + detach_works = false; + } + + if (TEST_PROTECT()) { + task_handle = xTaskGetCurrentTaskHandle(); + res = pthread_create(&new_thread, NULL, waiting_thread, (void *)&task_handle); + TEST_ASSERT_EQUAL_INT(0, res); + + res = xTaskNotifyWait(0, 0, NULL, 100 / portTICK_PERIOD_MS); + TEST_ASSERT_EQUAL_INT(pdTRUE, res); + + res = pthread_detach(new_thread); + TEST_ASSERT_EQUAL_INT(0, res); + + xTaskNotify(task_handle, 0, eNoAction); + vTaskDelay(100 / portTICK_PERIOD_MS); + + res = uxTaskGetNumberOfTasks(); + TEST_ASSERT_EQUAL_INT(task_count, res); + detach_works = true; + } + + if (!detach_works) { + vTaskDelete(task_handle); + } +} + TEST_CASE("pthread attr init destroy", "[pthread]") { int res = 0;