123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- /*
- * Copyright (c) 2006-2019, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-08-12 luckyzjq the first version
- */
- #include <rtthread.h>
- #include <stdlib.h>
- #include "utest.h"
- static struct rt_semaphore static_semaphore;
- #ifdef RT_USING_HEAP
- static rt_sem_t dynamic_semaphore;
- #endif /* RT_USING_HEAP */
- static void test_static_semaphore_init(void)
- {
- rt_err_t result;
- int rand_num = rand() % 0x10000;
- for (int i = 0; i < rand_num; i++)
- {
- result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_PRIO);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- break;
- }
- rt_sem_detach(&static_semaphore);
- result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_FIFO);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- break;
- }
- rt_sem_detach(&static_semaphore);
- }
- uassert_true(RT_TRUE);
- }
- static void test_static_semaphore_detach(void)
- {
- rt_err_t result;
- int rand_num = rand() % 0x10000;
- for (int i = 0; i < rand_num; i++)
- {
- result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_PRIO);
- if (RT_EOK != result)
- {
- break;
- }
- result = rt_sem_detach(&static_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- break;
- }
- result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_FIFO);
- if (RT_EOK != result)
- {
- break;
- }
- result = rt_sem_detach(&static_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- break;
- }
- }
- uassert_true(RT_TRUE);
- }
- static void test_static_semaphore_take(void)
- {
- rt_err_t result;
- result = rt_sem_init(&static_semaphore, "static_sem", 1, RT_IPC_FLAG_PRIO);
- if (RT_EOK == result)
- {
- /* first take */
- result = rt_sem_take(&static_semaphore, RT_WAITING_FOREVER);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- /* second take */
- result = rt_sem_take(&static_semaphore, 100);
- if (-RT_ETIMEOUT != result)
- uassert_true(RT_FALSE);
- }
- else
- {
- return;
- }
- rt_sem_detach(&static_semaphore);
- uassert_true(RT_TRUE);
- return;
- }
- static void test_static_semaphore_trytake(void)
- {
- rt_err_t result;
- result = rt_sem_init(&static_semaphore, "static_sem", 1, RT_IPC_FLAG_PRIO);
- if (RT_EOK == result)
- {
- /* first take */
- result = rt_sem_trytake(&static_semaphore);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- /* second take */
- result = rt_sem_trytake(&static_semaphore);
- if (-RT_ETIMEOUT != result)
- uassert_true(RT_FALSE);
- }
- else
- {
- return;
- }
- rt_sem_detach(&static_semaphore);
- uassert_true(RT_TRUE);
- return;
- }
- static void test_static_semaphore_release(void)
- {
- rt_err_t result;
- result = rt_sem_init(&static_semaphore, "static_sem", 0, RT_IPC_FLAG_PRIO);
- if (RT_EOK == result)
- {
- /* first take */
- result = rt_sem_take(&static_semaphore, 100);
- if (-RT_ETIMEOUT != result)
- uassert_true(RT_FALSE);
- /* release */
- result = rt_sem_release(&static_semaphore);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- /* second take */
- result = rt_sem_take(&static_semaphore, RT_WAITING_FOREVER);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- }
- else
- {
- return;
- }
- rt_sem_detach(&static_semaphore);
- uassert_true(RT_TRUE);
- return;
- }
- static void test_static_semaphore_control(void)
- {
- rt_err_t result;
- int value = 0;
- value = rand() % 100;
- result = rt_sem_init(&static_semaphore, "static_sem", 1, RT_IPC_FLAG_PRIO);
- if (RT_EOK == result)
- {
- result = rt_sem_control(&static_semaphore, RT_IPC_CMD_RESET, &value);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- else
- {
- return;
- }
- for (int i = 0; i < value; i++)
- {
- result = rt_sem_take(&static_semaphore, 10);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- rt_sem_detach(&static_semaphore);
- uassert_true(RT_TRUE);
- }
- static void static_release_isr_hardware_callback(void *param)
- {
- rt_err_t result;
- result = rt_sem_release(&static_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- static void static_release_isr_software_callback(void *param)
- {
- rt_err_t result;
- result = rt_sem_release(&static_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- static void test_static_semaphore_release_isr(void)
- {
- rt_err_t result;
- rt_timer_t hardware_timer;
- rt_timer_t software_timer;
- /* create timer */
- hardware_timer = rt_timer_create("release_isr",
- static_release_isr_hardware_callback,
- RT_NULL,
- 100,
- RT_TIMER_FLAG_HARD_TIMER | RT_TIMER_FLAG_ONE_SHOT);
- software_timer = rt_timer_create("release_isr",
- static_release_isr_software_callback,
- RT_NULL,
- 100,
- RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
- /* start tiemr */
- if (hardware_timer)
- rt_timer_start(hardware_timer);
- if (software_timer)
- rt_timer_start(software_timer);
- result = rt_sem_init(&static_semaphore, "static_sem", 0, RT_IPC_FLAG_PRIO);
- if (RT_EOK == result)
- {
- for (int i = 0; i < 2; i++)
- {
- result = rt_sem_take(&static_semaphore, 1000);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- }
- else
- {
- return;
- }
- rt_sem_detach(&static_semaphore);
- rt_timer_delete(hardware_timer);
- rt_timer_delete(software_timer);
- uassert_true(RT_TRUE);
- }
- #ifdef RT_USING_HEAP
- static void test_dynamic_semaphore_create(void)
- {
- rt_err_t result;
- int rand_num = rand() % 0x10000;
- for (int i = 0; i < rand_num; i++)
- {
- dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_PRIO);
- if (RT_NULL == dynamic_semaphore)
- {
- uassert_true(RT_FALSE);
- break;
- }
- rt_sem_delete(dynamic_semaphore);
- dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_FIFO);
- if (RT_NULL == dynamic_semaphore)
- {
- uassert_true(RT_FALSE);
- break;
- }
- rt_sem_delete(dynamic_semaphore);
- }
- uassert_true(RT_TRUE);
- }
- static void test_dynamic_semaphore_delete(void)
- {
- rt_err_t result;
- int rand_num = rand() % 0x10000;
- for (int i = 0; i < rand_num; i++)
- {
- dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_PRIO);
- if (RT_NULL == dynamic_semaphore)
- {
- break;
- }
- result = rt_sem_delete(dynamic_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- break;
- }
- dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_FIFO);
- if (RT_NULL == dynamic_semaphore)
- {
- break;
- }
- result = rt_sem_delete(dynamic_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- break;
- }
- }
- uassert_true(RT_TRUE);
- }
- static void test_dynamic_semaphore_take(void)
- {
- rt_err_t result;
- dynamic_semaphore = rt_sem_create("static_sem", 1, RT_IPC_FLAG_PRIO);
- if (RT_NULL != dynamic_semaphore)
- {
- /* first take */
- result = rt_sem_take(dynamic_semaphore, RT_WAITING_FOREVER);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- /* second take */
- result = rt_sem_take(dynamic_semaphore, 100);
- if (-RT_ETIMEOUT != result)
- uassert_true(RT_FALSE);
- }
- else
- {
- return;
- }
- rt_sem_delete(dynamic_semaphore);
- uassert_true(RT_TRUE);
- return;
- }
- static void test_dynamic_semaphore_trytake(void)
- {
- rt_err_t result;
- dynamic_semaphore = rt_sem_create("static_sem", 1, RT_IPC_FLAG_PRIO);
- if (RT_NULL != dynamic_semaphore)
- {
- /* first take */
- result = rt_sem_trytake(dynamic_semaphore);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- /* second take */
- result = rt_sem_trytake(dynamic_semaphore);
- if (-RT_ETIMEOUT != result)
- uassert_true(RT_FALSE);
- }
- else
- {
- return;
- }
- rt_sem_delete(dynamic_semaphore);
- uassert_true(RT_TRUE);
- return;
- }
- static void test_dynamic_semaphore_release(void)
- {
- rt_err_t result;
- dynamic_semaphore = rt_sem_create("static_sem", 0, RT_IPC_FLAG_PRIO);
- if (RT_NULL != dynamic_semaphore)
- {
- /* first take */
- result = rt_sem_take(dynamic_semaphore, 100);
- if (-RT_ETIMEOUT != result)
- uassert_true(RT_FALSE);
- /* release */
- result = rt_sem_release(dynamic_semaphore);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- /* second take */
- result = rt_sem_take(dynamic_semaphore, RT_WAITING_FOREVER);
- if (RT_EOK != result)
- uassert_true(RT_FALSE);
- }
- else
- {
- return;
- }
- rt_sem_delete(dynamic_semaphore);
- uassert_true(RT_TRUE);
- return;
- }
- static void test_dynamic_semaphore_control(void)
- {
- rt_err_t result;
- int value = 0;
- value = rand() % 100;
- dynamic_semaphore = rt_sem_create("static_sem", 1, RT_IPC_FLAG_PRIO);
- if (RT_NULL != dynamic_semaphore)
- {
- result = rt_sem_control(dynamic_semaphore, RT_IPC_CMD_RESET, &value);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- else
- {
- return;
- }
- for (int i = 0; i < value; i++)
- {
- result = rt_sem_take(dynamic_semaphore, 10);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- rt_sem_delete(dynamic_semaphore);
- uassert_true(RT_TRUE);
- }
- static void dynamic_release_isr_hardware_callback(void *param)
- {
- rt_err_t result;
- result = rt_sem_release(dynamic_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- static void dynamic_release_isr_software_callback(void *param)
- {
- rt_err_t result;
- result = rt_sem_release(dynamic_semaphore);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- static void test_dynamic_semaphore_release_isr(void)
- {
- rt_err_t result;
- rt_timer_t hardware_timer;
- rt_timer_t software_timer;
- /* create timer */
- hardware_timer = rt_timer_create("release_isr",
- dynamic_release_isr_hardware_callback,
- RT_NULL,
- 100,
- RT_TIMER_FLAG_HARD_TIMER | RT_TIMER_FLAG_ONE_SHOT);
- software_timer = rt_timer_create("release_isr",
- dynamic_release_isr_software_callback,
- RT_NULL,
- 100,
- RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
- /* start tiemr */
- if (hardware_timer)
- rt_timer_start(hardware_timer);
- if (software_timer)
- rt_timer_start(software_timer);
- dynamic_semaphore = rt_sem_create("static_sem", 0, RT_IPC_FLAG_PRIO);
- if (RT_NULL != dynamic_semaphore)
- {
- for (int i = 0; i < 2; i++)
- {
- result = rt_sem_take(dynamic_semaphore, 1000);
- if (RT_EOK != result)
- {
- uassert_true(RT_FALSE);
- }
- }
- }
- else
- {
- return;
- }
- rt_sem_delete(dynamic_semaphore);
- rt_timer_delete(hardware_timer);
- rt_timer_delete(software_timer);
- uassert_true(RT_TRUE);
- }
- #endif /* RT_USING_HEAP */
- static rt_err_t utest_tc_init(void)
- {
- #ifdef RT_USING_HEAP
- dynamic_semaphore = RT_NULL;
- #endif /* RT_USING_HEAP */
- return RT_EOK;
- }
- static rt_err_t utest_tc_cleanup(void)
- {
- #ifdef RT_USING_HEAP
- dynamic_semaphore = RT_NULL;
- #endif /* RT_USING_HEAP */
- return RT_EOK;
- }
- static void testcase(void)
- {
- UTEST_UNIT_RUN(test_static_semaphore_init);
- UTEST_UNIT_RUN(test_static_semaphore_take);
- UTEST_UNIT_RUN(test_static_semaphore_release);
- UTEST_UNIT_RUN(test_static_semaphore_detach);
- UTEST_UNIT_RUN(test_static_semaphore_trytake);
- UTEST_UNIT_RUN(test_static_semaphore_control);
- UTEST_UNIT_RUN(test_static_semaphore_release_isr);
- #ifdef RT_USING_HEAP
- UTEST_UNIT_RUN(test_dynamic_semaphore_create);
- UTEST_UNIT_RUN(test_dynamic_semaphore_take);
- UTEST_UNIT_RUN(test_dynamic_semaphore_release);
- UTEST_UNIT_RUN(test_dynamic_semaphore_delete);
- UTEST_UNIT_RUN(test_dynamic_semaphore_trytake);
- UTEST_UNIT_RUN(test_dynamic_semaphore_control);
- UTEST_UNIT_RUN(test_dynamic_semaphore_release_isr);
- #endif /* RT_USING_HEAP */
- }
- UTEST_TC_EXPORT(testcase, "testcases.kernel.semaphore_tc", utest_tc_init, utest_tc_cleanup, 1000);
|