messagequeue_tc.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-08-28 Sherman the first version
  9. */
  10. #include <rtthread.h>
  11. #include "utest.h"
  12. #define MSG_SIZE 4
  13. #define MAX_MSGS 5
  14. static struct rt_messagequeue static_mq;
  15. static rt_uint8_t mq_buf[(MSG_SIZE + 4) * MAX_MSGS];
  16. static struct rt_thread mq_send_thread;
  17. static struct rt_thread mq_recv_thread;
  18. static rt_uint8_t mq_send_stack[512];
  19. static rt_uint8_t mq_recv_stack[512];
  20. static struct rt_event finish_e;
  21. #define MQSEND_FINISH 0x01
  22. #define MQRECV_FINIHS 0x02
  23. #ifdef RT_USING_HEAP
  24. static rt_mq_t dynamic_mq;
  25. #endif /* RT_USING_HEAP */
  26. static void test_mq_init(void)
  27. {
  28. rt_err_t ret;
  29. ret = rt_mq_init(&static_mq,"testmq1", mq_buf, MSG_SIZE, sizeof(mq_buf), RT_IPC_FLAG_FIFO);
  30. uassert_true(ret == RT_EOK);
  31. }
  32. static void test_mq_create(void)
  33. {
  34. #ifdef RT_USING_HEAP
  35. dynamic_mq = rt_mq_create("testmq2", MSG_SIZE, MAX_MSGS, RT_IPC_FLAG_FIFO);
  36. uassert_true(dynamic_mq != RT_NULL);
  37. #endif /* RT_USING_HEAP */
  38. }
  39. static void mq_send_case(rt_mq_t testmq)
  40. {
  41. rt_uint32_t send_buf[MAX_MSGS+1] = {0};
  42. rt_err_t ret = RT_EOK;
  43. for (int var = 0; var < MAX_MSGS; ++var)
  44. {
  45. send_buf[var] = var + 1;
  46. ret = rt_mq_send_wait(testmq, &send_buf[var], sizeof(send_buf[0]), RT_WAITING_FOREVER);
  47. uassert_true(ret == RT_EOK);
  48. }
  49. send_buf[MAX_MSGS] = MAX_MSGS + 1;
  50. ret = rt_mq_send(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]));
  51. uassert_true(ret == -RT_EFULL);
  52. ret = rt_mq_send_wait(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]), RT_WAITING_FOREVER);
  53. uassert_true(ret == RT_EOK);
  54. while (testmq->entry != 0)
  55. {
  56. rt_thread_delay(100);
  57. }
  58. ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
  59. uassert_true(ret == RT_EOK);
  60. ret = rt_mq_send(testmq, &send_buf[2], sizeof(send_buf[0]));
  61. uassert_true(ret == RT_EOK);
  62. ret = rt_mq_urgent(testmq, &send_buf[0], sizeof(send_buf[0]));
  63. uassert_true(ret == RT_EOK);
  64. while (testmq->entry != 0)
  65. {
  66. rt_thread_delay(100);
  67. }
  68. ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
  69. uassert_true(ret == RT_EOK);
  70. ret = rt_mq_control(testmq, RT_IPC_CMD_RESET, RT_NULL);
  71. uassert_true(ret == RT_EOK);
  72. uassert_true(testmq->entry == 0);
  73. }
  74. static void mq_send_entry(void *param)
  75. {
  76. mq_send_case(&static_mq);
  77. #ifdef RT_USING_HEAP
  78. if(dynamic_mq != RT_NULL)
  79. {
  80. mq_send_case(dynamic_mq);
  81. }
  82. #endif /* RT_USING_HEAP */
  83. rt_event_send(&finish_e, MQSEND_FINISH);
  84. }
  85. static void mq_recv_case(rt_mq_t testmq)
  86. {
  87. rt_uint32_t recv_buf[MAX_MSGS+1] = {0};
  88. rt_err_t ret = RT_EOK;
  89. for (int var = 0; var < MAX_MSGS + 1; ++var)
  90. {
  91. ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
  92. uassert_true(ret == RT_EOK);
  93. uassert_true(recv_buf[var] == (var + 1));
  94. }
  95. for (int var = 0; var < 3; ++var)
  96. {
  97. ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
  98. uassert_true(ret == RT_EOK);
  99. uassert_true(recv_buf[var] == (var + 1));
  100. }
  101. }
  102. static void mq_recv_entry(void *param)
  103. {
  104. mq_recv_case(&static_mq);
  105. #ifdef RT_USING_HEAP
  106. if(dynamic_mq != RT_NULL)
  107. {
  108. mq_recv_case(dynamic_mq);
  109. }
  110. #endif /* RT_USING_HEAP */
  111. rt_event_send(&finish_e, MQRECV_FINIHS);
  112. }
  113. static void test_mq_testcase(void)
  114. {
  115. rt_thread_startup(&mq_send_thread);
  116. rt_thread_startup(&mq_recv_thread);
  117. rt_event_recv(&finish_e, MQSEND_FINISH | MQRECV_FINIHS, RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, RT_NULL);
  118. }
  119. static void test_mq_detach(void)
  120. {
  121. rt_err_t ret = rt_mq_detach(&static_mq);
  122. uassert_true(ret == RT_EOK);
  123. }
  124. static void test_mq_delete(void)
  125. {
  126. #ifdef RT_USING_HEAP
  127. rt_err_t ret = rt_mq_delete(dynamic_mq);
  128. uassert_true(ret == RT_EOK);
  129. #endif /* RT_USING_HEAP */
  130. }
  131. static rt_err_t utest_tc_init(void)
  132. {
  133. rt_err_t ret ;
  134. ret = rt_thread_init(&mq_send_thread, "mq_send", mq_send_entry, RT_NULL, mq_send_stack, sizeof(mq_send_stack), 22, 20);
  135. if(ret != RT_EOK)
  136. return -RT_ERROR;
  137. ret = rt_thread_init(&mq_recv_thread, "mq_recv", mq_recv_entry, RT_NULL, mq_recv_stack, sizeof(mq_recv_stack), 23, 20);
  138. if(ret != RT_EOK)
  139. return -RT_ERROR;
  140. ret = rt_event_init(&finish_e, "finish", RT_IPC_FLAG_FIFO);
  141. if(ret != RT_EOK)
  142. return -RT_ERROR;
  143. return RT_EOK;
  144. }
  145. static rt_err_t utest_tc_cleanup(void)
  146. {
  147. return RT_EOK;
  148. }
  149. static void testcase(void)
  150. {
  151. UTEST_UNIT_RUN(test_mq_init);
  152. UTEST_UNIT_RUN(test_mq_create);
  153. UTEST_UNIT_RUN(test_mq_testcase);
  154. UTEST_UNIT_RUN(test_mq_detach);
  155. UTEST_UNIT_RUN(test_mq_delete);
  156. }
  157. UTEST_TC_EXPORT(testcase, "testcases.kernel.messagequeue_tc", utest_tc_init, utest_tc_cleanup, 1000);