test-kfifo.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "ktest.h"
  2. #include "ktest_utils.h"
  3. #include <common/kfifo.h>
  4. #include <common/kprint.h>
  5. #include <mm/slab.h>
  6. static long ktest_kfifo_case0_1(uint64_t arg0, uint64_t arg1)
  7. {
  8. const int fifo_size = 256;
  9. // 创建kfifo(由kfifo申请内存)
  10. struct kfifo_t fifo;
  11. if (arg0 == 0)
  12. assert(kfifo_alloc(&fifo, fifo_size, 0) == 0);
  13. else
  14. {
  15. void *buf = kmalloc(fifo_size, 0);
  16. kfifo_init(&fifo, buf, fifo_size);
  17. }
  18. assert(fifo.buffer != NULL);
  19. assert(fifo.total_size == fifo_size);
  20. assert(kfifo_total_size(&fifo) == fifo_size);
  21. assert(fifo.size == 0);
  22. assert(kfifo_size(&fifo) == 0);
  23. assert(fifo.in_offset == 0);
  24. assert(fifo.out_offset == 0);
  25. assert(kfifo_empty(&fifo) == 1);
  26. assert(kfifo_full(&fifo) == 0);
  27. // 循环增加10个uint64_t
  28. for (int i = 1; i <= 10; ++i)
  29. {
  30. uint64_t tmp = i;
  31. assert(kfifo_in(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  32. }
  33. assert(fifo.in_offset == 10 * sizeof(uint64_t));
  34. assert(fifo.out_offset == 0);
  35. assert(fifo.size == 10 * sizeof(uint64_t));
  36. assert(fifo.total_size == fifo_size);
  37. // 循环删除这10个uint64_t
  38. for (int i = 1; i <= 10; ++i)
  39. {
  40. uint64_t tmp = 0;
  41. assert(kfifo_out(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  42. assert(tmp == i);
  43. assert(fifo.size == (10 - i) * sizeof(uint64_t));
  44. assert(fifo.in_offset == 10 * sizeof(uint64_t));
  45. assert(fifo.out_offset == i * sizeof(uint64_t));
  46. }
  47. assert(fifo.in_offset == 10 * sizeof(uint64_t));
  48. assert(fifo.out_offset == 10 * sizeof(uint64_t));
  49. assert(fifo.in_offset == fifo.out_offset);
  50. assert(kfifo_empty(&fifo) == 1);
  51. // reset
  52. kfifo_reset(&fifo);
  53. assert(fifo.in_offset == 0);
  54. assert(fifo.out_offset == 0);
  55. assert(fifo.size == 0);
  56. // 测试插入31个元素
  57. for (int i = 1; i <= 31; ++i)
  58. {
  59. uint64_t tmp = i;
  60. assert(kfifo_in(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  61. }
  62. assert(fifo.size == 31 * sizeof(uint64_t));
  63. assert(fifo.in_offset == 31 * sizeof(uint64_t));
  64. assert(fifo.out_offset == 0);
  65. // 然后再尝试插入一个大小为2*sizeof(uint64_t)的元素
  66. {
  67. __int128_t tmp = 100;
  68. assert(kfifo_in(&fifo, &tmp, sizeof(__int128_t)) == 0);
  69. assert(fifo.size == 31 * sizeof(uint64_t));
  70. assert(fifo.in_offset == 31 * sizeof(uint64_t));
  71. assert(fifo.out_offset == 0);
  72. }
  73. // 插入一个uint64, 队列满
  74. {
  75. uint64_t tmp = 32;
  76. assert(kfifo_in(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  77. assert(kfifo_full(&fifo));
  78. assert(kfifo_empty(&fifo) == 0);
  79. assert(fifo.size == fifo.total_size);
  80. assert(fifo.in_offset == fifo_size);
  81. assert(fifo.out_offset == 0);
  82. }
  83. // 取出之前的20个元素
  84. for (int i = 1; i <= 20; ++i)
  85. {
  86. uint64_t tmp = 0;
  87. assert(kfifo_out(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  88. }
  89. assert(fifo.size == (fifo.total_size - 20 * sizeof(uint64_t)));
  90. assert(fifo.in_offset == fifo_size);
  91. assert(fifo.out_offset == 20 * sizeof(uint64_t));
  92. // 插入10个元素,剩余10个空位
  93. {
  94. uint64_t tmp = 99;
  95. assert(kfifo_in(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  96. assert(fifo.in_offset == 1 * sizeof(uint64_t));
  97. for (int i = 1; i <= 9; ++i)
  98. {
  99. assert(kfifo_in(&fifo, &tmp, sizeof(uint64_t)) == sizeof(uint64_t));
  100. }
  101. assert(fifo.in_offset == 10 * sizeof(uint64_t));
  102. assert(fifo.size == 22 * sizeof(uint64_t));
  103. }
  104. {
  105. // 取出20个
  106. char tmp[20 * sizeof(uint64_t)];
  107. assert(kfifo_out(&fifo, &tmp, 20 * sizeof(uint64_t)) == 20 * sizeof(uint64_t));
  108. assert(fifo.out_offset == 8 * sizeof(uint64_t));
  109. assert(fifo.size == 2 * (sizeof(uint64_t)));
  110. }
  111. {
  112. // 插入25个
  113. char tmp[25 * sizeof(uint64_t)];
  114. assert(kfifo_in(&fifo, &tmp, 25 * sizeof(uint64_t)) == 25 * sizeof(uint64_t));
  115. assert(fifo.out_offset == 8 * sizeof(uint64_t));
  116. assert(fifo.size == 27 * sizeof(uint64_t));
  117. assert(fifo.in_offset == 3 * sizeof(uint64_t));
  118. }
  119. // 测试reset out
  120. uint32_t prev_in_offset = fifo.in_offset;
  121. kfifo_reset_out(&fifo);
  122. assert(fifo.size == 0);
  123. assert(fifo.total_size == fifo_size);
  124. assert(fifo.in_offset == prev_in_offset);
  125. assert(fifo.out_offset == prev_in_offset);
  126. // 测试释放
  127. if (arg0 == 0)
  128. {
  129. kfifo_free_alloc(&fifo);
  130. assert(fifo.buffer == NULL);
  131. }
  132. return 0;
  133. }
  134. static ktest_case_table kt_kfifo_func_table[] = {
  135. ktest_kfifo_case0_1,
  136. };
  137. int ktest_test_kfifo(void* arg)
  138. {
  139. kTEST("Testing kfifo...");
  140. for (int i = 0; i < sizeof(kt_kfifo_func_table) / sizeof(ktest_case_table); ++i)
  141. {
  142. kTEST("Testing case %d", i);
  143. kt_kfifo_func_table[i](i, 0);
  144. }
  145. kTEST("kfifo Test done.");
  146. return 0;
  147. }