mempool_tc.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. * Copyright (c) 2006-2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-09-03 Rbb666 the first version for mempool utest
  9. */
  10. #include <rtthread.h>
  11. #include <stdlib.h>
  12. #include "utest.h"
  13. #define MEMPOOL_BLOCK_SIZE 80
  14. #define MEMPOOL_BLOCK_COUNT 32
  15. #define MEMPOOL_SIZE (MEMPOOL_BLOCK_SIZE + sizeof(rt_uint8_t *)) * MEMPOOL_BLOCK_COUNT
  16. static rt_uint8_t mempool_static[MEMPOOL_SIZE];
  17. static struct rt_mempool mp_static;
  18. static rt_mp_t mp_dynamic;
  19. /* Static memory pool test */
  20. static void test_mp_static_init(void)
  21. {
  22. rt_err_t err;
  23. err = rt_mp_init(&mp_static, "mp_static", &mempool_static[0], sizeof(mempool_static), MEMPOOL_BLOCK_SIZE);
  24. uassert_true(err == RT_EOK);
  25. uassert_str_equal(mp_static.parent.name, "mp_static");
  26. uassert_true(mp_static.block_total_count == MEMPOOL_BLOCK_COUNT);
  27. uassert_true(mp_static.block_free_count == MEMPOOL_BLOCK_COUNT);
  28. }
  29. /* Dynamic memory pool test */
  30. static void test_mp_dynamic_create(void)
  31. {
  32. mp_dynamic = rt_mp_create("mp_dynamic", MEMPOOL_BLOCK_COUNT, MEMPOOL_BLOCK_SIZE);
  33. uassert_not_null(mp_dynamic);
  34. uassert_str_equal(mp_dynamic->parent.name, "mp_dynamic");
  35. uassert_true(mp_dynamic->block_total_count == MEMPOOL_BLOCK_COUNT);
  36. uassert_true(mp_dynamic->block_free_count == MEMPOOL_BLOCK_COUNT);
  37. }
  38. /* Allocation and free test for static */
  39. static void test_mp_static_alloc_free(void)
  40. {
  41. void *block1, *block2, *block3;
  42. /* Allocate blocks */
  43. block1 = rt_mp_alloc(&mp_static, 0);
  44. uassert_not_null(block1);
  45. block2 = rt_mp_alloc(&mp_static, 0);
  46. uassert_not_null(block2);
  47. block3 = rt_mp_alloc(&mp_static, 0);
  48. uassert_not_null(block3);
  49. /* Check free count */
  50. uassert_true(mp_static.block_free_count == MEMPOOL_BLOCK_COUNT - 3);
  51. /* Free blocks */
  52. rt_mp_free(block1);
  53. rt_mp_free(block2);
  54. rt_mp_free(block3);
  55. /* Check free count */
  56. uassert_true(mp_static.block_free_count == MEMPOOL_BLOCK_COUNT);
  57. }
  58. /* Allocation and free test for dynamic */
  59. static void test_mp_dynamic_alloc_free(void)
  60. {
  61. void *block1, *block2, *block3;
  62. /* Allocate blocks */
  63. block1 = rt_mp_alloc(mp_dynamic, 0);
  64. uassert_not_null(block1);
  65. block2 = rt_mp_alloc(mp_dynamic, 0);
  66. uassert_not_null(block2);
  67. block3 = rt_mp_alloc(mp_dynamic, 0);
  68. uassert_not_null(block3);
  69. /* Check free count */
  70. uassert_true(mp_dynamic->block_free_count == MEMPOOL_BLOCK_COUNT - 3);
  71. /* Free blocks */
  72. rt_mp_free(block1);
  73. rt_mp_free(block2);
  74. rt_mp_free(block3);
  75. /* Check free count */
  76. uassert_true(mp_dynamic->block_free_count == MEMPOOL_BLOCK_COUNT);
  77. }
  78. /* Boundary test: allocate all blocks and try to allocate more */
  79. static void test_mp_boundary_alloc_exceed(void)
  80. {
  81. void *blocks[MEMPOOL_BLOCK_COUNT];
  82. void *extra_block;
  83. int i;
  84. /* Allocate all blocks */
  85. for (i = 0; i < MEMPOOL_BLOCK_COUNT; i++)
  86. {
  87. blocks[i] = rt_mp_alloc(&mp_static, 0);
  88. uassert_not_null(blocks[i]);
  89. }
  90. /* Check free count */
  91. uassert_true(mp_static.block_free_count == 0);
  92. /* Try to allocate one more (should fail) */
  93. extra_block = rt_mp_alloc(&mp_static, 0);
  94. uassert_null(extra_block);
  95. /* Free all blocks */
  96. for (i = 0; i < MEMPOOL_BLOCK_COUNT; i++)
  97. {
  98. rt_mp_free(blocks[i]);
  99. }
  100. /* Check free count */
  101. uassert_true(mp_static.block_free_count == MEMPOOL_BLOCK_COUNT);
  102. }
  103. /* Boundary test: free invalid block */
  104. static void test_mp_boundary_free_invalid(void)
  105. {
  106. /* Test freeing NULL - should not crash and do nothing */
  107. rt_mp_free(RT_NULL);
  108. /* Check free count remains the same */
  109. uassert_true(mp_static.block_free_count == MEMPOOL_BLOCK_COUNT);
  110. }
  111. /* Stress test: allocate and free repeatedly */
  112. static void test_mp_stress_alloc_free(void)
  113. {
  114. void *blocks[MEMPOOL_BLOCK_COUNT];
  115. int i, j;
  116. for (j = 0; j < 100; j++) /* Repeat 100 times */
  117. {
  118. /* Allocate all blocks */
  119. for (i = 0; i < MEMPOOL_BLOCK_COUNT; i++)
  120. {
  121. blocks[i] = rt_mp_alloc(&mp_static, 0);
  122. uassert_not_null(blocks[i]);
  123. }
  124. /* Check free count */
  125. uassert_true(mp_static.block_free_count == 0);
  126. /* Free all blocks */
  127. for (i = 0; i < MEMPOOL_BLOCK_COUNT; i++)
  128. {
  129. rt_mp_free(blocks[i]);
  130. }
  131. /* Check free count */
  132. uassert_true(mp_static.block_free_count == MEMPOOL_BLOCK_COUNT);
  133. }
  134. }
  135. static rt_err_t utest_tc_init(void)
  136. {
  137. return RT_EOK;
  138. }
  139. static rt_err_t utest_tc_cleanup(void)
  140. {
  141. /* Detach static mempool */
  142. rt_mp_detach(&mp_static);
  143. /* Delete dynamic mempool */
  144. if (mp_dynamic != RT_NULL)
  145. {
  146. rt_mp_delete(mp_dynamic);
  147. }
  148. return RT_EOK;
  149. }
  150. static void testcase(void)
  151. {
  152. UTEST_UNIT_RUN(test_mp_static_init);
  153. UTEST_UNIT_RUN(test_mp_dynamic_create);
  154. UTEST_UNIT_RUN(test_mp_static_alloc_free);
  155. UTEST_UNIT_RUN(test_mp_dynamic_alloc_free);
  156. UTEST_UNIT_RUN(test_mp_boundary_alloc_exceed);
  157. UTEST_UNIT_RUN(test_mp_boundary_free_invalid);
  158. UTEST_UNIT_RUN(test_mp_stress_alloc_free);
  159. }
  160. UTEST_TC_EXPORT(testcase, "testcases.kernel.mempool", utest_tc_init, utest_tc_cleanup, 10);