ringbuffer_test.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. // Copyright: SPDX-License-Identifier: GPL-3.0-only
  2. #include "ringbuffer.h"
  3. // to be able to access internals
  4. // never do this from app
  5. #include "../src/ringbuffer_internal.h"
  6. #include <stdio.h>
  7. #include <string.h>
  8. #define KNRM "\x1B[0m"
  9. #define KRED "\x1B[31m"
  10. #define KGRN "\x1B[32m"
  11. #define KYEL "\x1B[33m"
  12. #define KBLU "\x1B[34m"
  13. #define KMAG "\x1B[35m"
  14. #define KCYN "\x1B[36m"
  15. #define KWHT "\x1B[37m"
  16. #define UNUSED(x) (void)(x)
  17. int total_fails = 0;
  18. int total_tests = 0;
  19. int total_checks = 0;
  20. #define CHECK_EQ_RESULT(x, y) \
  21. while (s_len--) \
  22. putchar('.'); \
  23. printf("%s%s " KNRM "\n", (((x) == (y)) ? KGRN : KRED), (((x) == (y)) ? " PASS " : " FAIL ")); \
  24. if ((x) != (y)) \
  25. total_fails++; \
  26. total_checks++;
  27. #define CHECK_EQ_PREFIX(x, y, prefix, subtest_name, ...) \
  28. { \
  29. int s_len = \
  30. 100 - \
  31. printf(("Checking: " KWHT "%s %s%2d " subtest_name " " KNRM), __func__, prefix, subtest_no, ##__VA_ARGS__); \
  32. CHECK_EQ_RESULT(x, y) \
  33. }
  34. #define CHECK_EQ(x, y, subtest_name, ...) \
  35. { \
  36. int s_len = \
  37. 100 - printf(("Checking: " KWHT "%s %2d " subtest_name " " KNRM), __func__, subtest_no, ##__VA_ARGS__); \
  38. CHECK_EQ_RESULT(x, y) \
  39. }
  40. #define TEST_DECL() \
  41. int subtest_no = 0; \
  42. printf(KYEL "TEST SUITE: %s\n" KNRM, __func__); \
  43. total_tests++;
  44. static void test_rbuf_get_linear_insert_range()
  45. {
  46. TEST_DECL();
  47. // check empty buffer behaviour
  48. rbuf_t buff = rbuf_create(5);
  49. char *to_write;
  50. size_t ret;
  51. to_write = rbuf_get_linear_insert_range(buff, &ret);
  52. CHECK_EQ(ret, 5, "empty size");
  53. CHECK_EQ(to_write, buff->head, "empty write ptr");
  54. rbuf_free(buff);
  55. // check full buffer behaviour
  56. subtest_no++;
  57. buff = rbuf_create(5);
  58. ret = rbuf_bump_head(buff, 5);
  59. CHECK_EQ(ret, 1, "ret");
  60. to_write = rbuf_get_linear_insert_range(buff, &ret);
  61. CHECK_EQ(to_write, NULL, "writable NULL");
  62. CHECK_EQ(ret, 0, "writable count = 0");
  63. // check buffer flush
  64. subtest_no++;
  65. rbuf_flush(buff);
  66. CHECK_EQ(rbuf_bytes_free(buff), 5, "size_free");
  67. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  68. CHECK_EQ(buff->head, buff->data, "head_ptr");
  69. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  70. // check behaviour head > tail
  71. subtest_no++;
  72. rbuf_flush(buff);
  73. rbuf_bump_head(buff, 3);
  74. to_write = rbuf_get_linear_insert_range(buff, &ret);
  75. CHECK_EQ(to_write, buff->head, "write location");
  76. CHECK_EQ(ret, 2, "availible to linear write");
  77. // check behaviour tail > head
  78. subtest_no++;
  79. rbuf_flush(buff);
  80. rbuf_bump_head(buff, 5);
  81. rbuf_bump_tail(buff, 3);
  82. CHECK_EQ(buff->head, buff->data, "head_ptr");
  83. CHECK_EQ(buff->tail, buff->data + 3, "tail_ptr");
  84. to_write = rbuf_get_linear_insert_range(buff, &ret);
  85. CHECK_EQ(to_write, buff->head, "write location");
  86. CHECK_EQ(ret, 3, "availible to linear write");
  87. /* // check behaviour tail and head at last element
  88. subtest_no++;
  89. rbuf_flush(buff);
  90. rbuf_bump_head(buff, 4);
  91. rbuf_bump_tail(buff, 4);
  92. CHECK_EQ(buff->head, buff->end - 1, "head_ptr");
  93. CHECK_EQ(buff->tail, buff->end - 1, "tail_ptr");
  94. to_write = rbuf_get_linear_insert_range(buff, &ret);
  95. CHECK_EQ(to_write, buff->head, "write location");
  96. CHECK_EQ(ret, 1, "availible to linear write");*/
  97. // check behaviour tail and head at last element
  98. // after rbuf_bump_tail optimisation that restarts buffer
  99. // in case tail catches up with head
  100. subtest_no++;
  101. rbuf_flush(buff);
  102. rbuf_bump_head(buff, 4);
  103. rbuf_bump_tail(buff, 4);
  104. CHECK_EQ(buff->head, buff->data, "head_ptr");
  105. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  106. to_write = rbuf_get_linear_insert_range(buff, &ret);
  107. CHECK_EQ(to_write, buff->head, "write location");
  108. CHECK_EQ(ret, 5, "availible to linear write");
  109. }
  110. #define _CHECK_EQ(x, y, subtest_name, ...) CHECK_EQ_PREFIX(x, y, prefix, subtest_name, ##__VA_ARGS__)
  111. #define _PREFX "(size = %5zu) "
  112. static void test_rbuf_bump_head_bsize(size_t size)
  113. {
  114. char prefix[16];
  115. snprintf(prefix, 16, _PREFX, size);
  116. int subtest_no = 0;
  117. rbuf_t buff = rbuf_create(size);
  118. _CHECK_EQ(rbuf_bytes_free(buff), size, "size_free");
  119. subtest_no++;
  120. int ret = rbuf_bump_head(buff, size);
  121. _CHECK_EQ(buff->data, buff->head, "loc");
  122. _CHECK_EQ(ret, 1, "ret");
  123. _CHECK_EQ(buff->size_data, buff->size, "size");
  124. _CHECK_EQ(rbuf_bytes_free(buff), 0, "size_free");
  125. subtest_no++;
  126. ret = rbuf_bump_head(buff, 1);
  127. _CHECK_EQ(buff->data, buff->head, "loc no move");
  128. _CHECK_EQ(ret, 0, "ret error");
  129. _CHECK_EQ(buff->size_data, buff->size, "size");
  130. _CHECK_EQ(rbuf_bytes_free(buff), 0, "size_free");
  131. rbuf_free(buff);
  132. subtest_no++;
  133. buff = rbuf_create(size);
  134. ret = rbuf_bump_head(buff, size - 1);
  135. _CHECK_EQ(buff->head, buff->end-1, "loc end");
  136. rbuf_free(buff);
  137. }
  138. #undef _CHECK_EQ
  139. static void test_rbuf_bump_head()
  140. {
  141. TEST_DECL();
  142. UNUSED(subtest_no);
  143. size_t test_sizes[] = { 1, 2, 3, 5, 6, 7, 8, 100, 99999, 0 };
  144. for (int i = 0; test_sizes[i]; i++)
  145. test_rbuf_bump_head_bsize(test_sizes[i]);
  146. }
  147. static void test_rbuf_bump_tail_noopt(int subtest_no)
  148. {
  149. rbuf_t buff = rbuf_create(10);
  150. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  151. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  152. subtest_no++;
  153. int ret = rbuf_bump_head(buff, 5);
  154. CHECK_EQ(ret, 1, "ret");
  155. CHECK_EQ(rbuf_bytes_free(buff), 5, "size_free");
  156. CHECK_EQ(rbuf_bytes_available(buff), 5, "size_avail");
  157. CHECK_EQ(buff->head, buff->data + 5, "head_ptr");
  158. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  159. subtest_no++;
  160. ret = rbuf_bump_tail_noopt(buff, 2);
  161. CHECK_EQ(ret, 1, "ret");
  162. CHECK_EQ(rbuf_bytes_available(buff), 3, "size_avail");
  163. CHECK_EQ(rbuf_bytes_free(buff), 7, "size_free");
  164. CHECK_EQ(buff->head, buff->data + 5, "head_ptr");
  165. CHECK_EQ(buff->tail, buff->data + 2, "tail_ptr");
  166. subtest_no++;
  167. ret = rbuf_bump_tail_noopt(buff, 3);
  168. CHECK_EQ(ret, 1, "ret");
  169. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  170. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  171. CHECK_EQ(buff->head, buff->data + 5, "head_ptr");
  172. CHECK_EQ(buff->tail, buff->data + 5, "tail_ptr");
  173. subtest_no++;
  174. ret = rbuf_bump_tail_noopt(buff, 1);
  175. CHECK_EQ(ret, 0, "ret");
  176. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  177. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  178. CHECK_EQ(buff->head, buff->data + 5, "head_ptr");
  179. CHECK_EQ(buff->tail, buff->data + 5, "tail_ptr");
  180. subtest_no++;
  181. ret = rbuf_bump_head(buff, 7);
  182. CHECK_EQ(ret, 1, "ret");
  183. CHECK_EQ(rbuf_bytes_available(buff), 7, "size_avail");
  184. CHECK_EQ(rbuf_bytes_free(buff), 3, "size_free");
  185. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  186. CHECK_EQ(buff->tail, buff->data + 5, "tail_ptr");
  187. subtest_no++;
  188. ret = rbuf_bump_tail_noopt(buff, 5);
  189. CHECK_EQ(ret, 1, "ret");
  190. CHECK_EQ(rbuf_bytes_available(buff), 2, "size_avail");
  191. CHECK_EQ(rbuf_bytes_free(buff), 8, "size_free");
  192. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  193. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  194. // check tail can't overrun head
  195. subtest_no++;
  196. ret = rbuf_bump_tail_noopt(buff, 3);
  197. CHECK_EQ(ret, 0, "ret");
  198. CHECK_EQ(rbuf_bytes_available(buff), 2, "size_avail");
  199. CHECK_EQ(rbuf_bytes_free(buff), 8, "size_free");
  200. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  201. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  202. // check head can't overrun tail
  203. subtest_no++;
  204. ret = rbuf_bump_head(buff, 9);
  205. CHECK_EQ(ret, 0, "ret");
  206. CHECK_EQ(rbuf_bytes_available(buff), 2, "size_avail");
  207. CHECK_EQ(rbuf_bytes_free(buff), 8, "size_free");
  208. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  209. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  210. // check head can fill the buffer
  211. subtest_no++;
  212. ret = rbuf_bump_head(buff, 8);
  213. CHECK_EQ(ret, 1, "ret");
  214. CHECK_EQ(rbuf_bytes_available(buff), 10, "size_avail");
  215. CHECK_EQ(rbuf_bytes_free(buff), 0, "size_free");
  216. CHECK_EQ(buff->head, buff->data, "head_ptr");
  217. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  218. // check can empty the buffer
  219. subtest_no++;
  220. ret = rbuf_bump_tail_noopt(buff, 10);
  221. CHECK_EQ(ret, 1, "ret");
  222. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  223. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  224. CHECK_EQ(buff->head, buff->data, "head_ptr");
  225. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  226. }
  227. static void test_rbuf_bump_tail_opt(int subtest_no)
  228. {
  229. subtest_no++;
  230. rbuf_t buff = rbuf_create(10);
  231. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  232. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  233. subtest_no++;
  234. int ret = rbuf_bump_head(buff, 5);
  235. CHECK_EQ(ret, 1, "ret");
  236. CHECK_EQ(rbuf_bytes_free(buff), 5, "size_free");
  237. CHECK_EQ(rbuf_bytes_available(buff), 5, "size_avail");
  238. CHECK_EQ(buff->head, buff->data + 5, "head_ptr");
  239. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  240. subtest_no++;
  241. ret = rbuf_bump_tail(buff, 2);
  242. CHECK_EQ(ret, 1, "ret");
  243. CHECK_EQ(rbuf_bytes_available(buff), 3, "size_avail");
  244. CHECK_EQ(rbuf_bytes_free(buff), 7, "size_free");
  245. CHECK_EQ(buff->head, buff->data + 5, "head_ptr");
  246. CHECK_EQ(buff->tail, buff->data + 2, "tail_ptr");
  247. subtest_no++;
  248. ret = rbuf_bump_tail(buff, 3);
  249. CHECK_EQ(ret, 1, "ret");
  250. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  251. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  252. CHECK_EQ(buff->head, buff->data, "head_ptr");
  253. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  254. subtest_no++;
  255. ret = rbuf_bump_tail_noopt(buff, 1);
  256. CHECK_EQ(ret, 0, "ret");
  257. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  258. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  259. CHECK_EQ(buff->head, buff->data, "head_ptr");
  260. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  261. subtest_no++;
  262. ret = rbuf_bump_head(buff, 6);
  263. ret = rbuf_bump_tail(buff, 5);
  264. ret = rbuf_bump_head(buff, 6);
  265. CHECK_EQ(ret, 1, "ret");
  266. CHECK_EQ(rbuf_bytes_available(buff), 7, "size_avail");
  267. CHECK_EQ(rbuf_bytes_free(buff), 3, "size_free");
  268. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  269. CHECK_EQ(buff->tail, buff->data + 5, "tail_ptr");
  270. subtest_no++;
  271. ret = rbuf_bump_tail(buff, 5);
  272. CHECK_EQ(ret, 1, "ret");
  273. CHECK_EQ(rbuf_bytes_available(buff), 2, "size_avail");
  274. CHECK_EQ(rbuf_bytes_free(buff), 8, "size_free");
  275. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  276. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  277. // check tail can't overrun head
  278. subtest_no++;
  279. ret = rbuf_bump_tail(buff, 3);
  280. CHECK_EQ(ret, 0, "ret");
  281. CHECK_EQ(rbuf_bytes_available(buff), 2, "size_avail");
  282. CHECK_EQ(rbuf_bytes_free(buff), 8, "size_free");
  283. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  284. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  285. // check head can't overrun tail
  286. subtest_no++;
  287. ret = rbuf_bump_head(buff, 9);
  288. CHECK_EQ(ret, 0, "ret");
  289. CHECK_EQ(rbuf_bytes_available(buff), 2, "size_avail");
  290. CHECK_EQ(rbuf_bytes_free(buff), 8, "size_free");
  291. CHECK_EQ(buff->head, buff->data + 2, "head_ptr");
  292. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  293. // check head can fill the buffer
  294. subtest_no++;
  295. ret = rbuf_bump_head(buff, 8);
  296. CHECK_EQ(ret, 1, "ret");
  297. CHECK_EQ(rbuf_bytes_available(buff), 10, "size_avail");
  298. CHECK_EQ(rbuf_bytes_free(buff), 0, "size_free");
  299. CHECK_EQ(buff->head, buff->data, "head_ptr");
  300. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  301. // check can empty the buffer
  302. subtest_no++;
  303. ret = rbuf_bump_tail(buff, 10);
  304. CHECK_EQ(ret, 1, "ret");
  305. CHECK_EQ(rbuf_bytes_available(buff), 0, "size_avail");
  306. CHECK_EQ(rbuf_bytes_free(buff), 10, "size_free");
  307. CHECK_EQ(buff->head, buff->data, "head_ptr");
  308. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  309. }
  310. static void test_rbuf_bump_tail()
  311. {
  312. TEST_DECL();
  313. test_rbuf_bump_tail_noopt(subtest_no);
  314. test_rbuf_bump_tail_opt(subtest_no);
  315. }
  316. #define ASCII_A 0x61
  317. #define ASCII_Z 0x7A
  318. #define TEST_DATA_SIZE ASCII_Z-ASCII_A+1
  319. static void test_rbuf_push()
  320. {
  321. TEST_DECL();
  322. rbuf_t buff = rbuf_create(10);
  323. int i;
  324. char test_data[TEST_DATA_SIZE];
  325. for (int i = 0; i <= TEST_DATA_SIZE; i++)
  326. test_data[i] = i + ASCII_A;
  327. int ret = rbuf_push(buff, test_data, 10);
  328. CHECK_EQ(ret, 10, "written 10 bytes");
  329. CHECK_EQ(rbuf_bytes_free(buff), 0, "empty size == 0");
  330. for (i = 0; i < 10; i++)
  331. CHECK_EQ(buff->data[i], i + ASCII_A, "Check data");
  332. subtest_no++;
  333. rbuf_flush(buff);
  334. rbuf_bump_head(buff, 5);
  335. rbuf_bump_tail_noopt(buff, 5); //to not reset both pointers to beginning
  336. ret = rbuf_push(buff, test_data, 10);
  337. CHECK_EQ(ret, 10, "written 10 bytes");
  338. for (i = 0; i < 10; i++)
  339. CHECK_EQ(buff->data[i], ((i+5)%10) + ASCII_A, "Check Data");
  340. subtest_no++;
  341. rbuf_flush(buff);
  342. rbuf_bump_head(buff, 9);
  343. rbuf_bump_tail_noopt(buff, 9);
  344. ret = rbuf_push(buff, test_data, 10);
  345. CHECK_EQ(ret, 10, "written 10 bytes");
  346. for (i = 0; i < 10; i++)
  347. CHECK_EQ(buff->data[i], ((i + 1) % 10) + ASCII_A, "Check data");
  348. // let tail > head
  349. subtest_no++;
  350. rbuf_flush(buff);
  351. rbuf_bump_head(buff, 9);
  352. rbuf_bump_tail_noopt(buff, 9);
  353. rbuf_bump_head(buff, 1);
  354. ret = rbuf_push(buff, test_data, 9);
  355. CHECK_EQ(ret, 9, "written 9 bytes");
  356. CHECK_EQ(buff->head, buff->end - 1, "head_ptr");
  357. CHECK_EQ(buff->tail, buff->head, "tail_ptr");
  358. rbuf_bump_tail(buff, 1);
  359. //TODO push byte can be usefull optimisation
  360. ret = rbuf_push(buff, &test_data[9], 1);
  361. CHECK_EQ(ret, 1, "written 1 byte");
  362. CHECK_EQ(rbuf_bytes_free(buff), 0, "empty size == 0");
  363. for (i = 0; i < 10; i++)
  364. CHECK_EQ(buff->data[i], i + ASCII_A, "Check data");
  365. subtest_no++;
  366. rbuf_flush(buff);
  367. rbuf_bump_head(buff, 9);
  368. rbuf_bump_tail_noopt(buff, 7);
  369. rbuf_bump_head(buff, 1);
  370. ret = rbuf_push(buff, test_data, 7);
  371. CHECK_EQ(ret, 7, "written 7 bytes");
  372. CHECK_EQ(buff->head, buff->data + 7, "head_ptr");
  373. CHECK_EQ(buff->tail, buff->head, "tail_ptr");
  374. rbuf_bump_tail(buff, 3);
  375. CHECK_EQ(buff->tail, buff->data, "tail_ptr");
  376. //TODO push byte can be usefull optimisation
  377. ret = rbuf_push(buff, &test_data[7], 3);
  378. CHECK_EQ(ret, 3, "written 3 bytes");
  379. CHECK_EQ(rbuf_bytes_free(buff), 0, "empty size == 0");
  380. for (i = 0; i < 10; i++)
  381. CHECK_EQ(buff->data[i], i + ASCII_A, "Check data");
  382. // test can't overfill the buffer
  383. subtest_no++;
  384. rbuf_flush(buff);
  385. rbuf_push(buff, test_data, TEST_DATA_SIZE);
  386. CHECK_EQ(ret, 3, "written 10 bytes");
  387. for (i = 0; i < 10; i++)
  388. CHECK_EQ(buff->data[i], i + ASCII_A, "Check data");
  389. }
  390. #define TEST_RBUF_FIND_BYTES_SIZE 10
  391. void test_rbuf_find_bytes()
  392. {
  393. TEST_DECL();
  394. rbuf_t buff = rbuf_create(TEST_RBUF_FIND_BYTES_SIZE);
  395. char *filler_3 = " ";
  396. char *needle = "needle";
  397. int idx;
  398. char *ptr;
  399. // make sure needle is wrapped aroung in the buffer
  400. // to test we still can find it
  401. // target "edle ne"
  402. rbuf_bump_head(buff, TEST_RBUF_FIND_BYTES_SIZE / 2);
  403. rbuf_push(buff, filler_3, strlen(filler_3));
  404. rbuf_bump_tail(buff, TEST_RBUF_FIND_BYTES_SIZE / 2);
  405. rbuf_push(buff, needle, strlen(needle));
  406. ptr = rbuf_find_bytes(buff, needle, strlen(needle), &idx);
  407. CHECK_EQ(ptr, buff->data + (TEST_RBUF_FIND_BYTES_SIZE / 2) + strlen(filler_3), "Pointer to needle correct");
  408. CHECK_EQ(idx, ptr - buff->tail, "Check needle index");
  409. }
  410. int main()
  411. {
  412. test_rbuf_bump_head();
  413. test_rbuf_bump_tail();
  414. test_rbuf_get_linear_insert_range();
  415. test_rbuf_push();
  416. test_rbuf_find_bytes();
  417. printf(
  418. KNRM "Total Tests %d, Total Checks %d, Successful Checks %d, Failed Checks %d\n",
  419. total_tests, total_checks, total_checks - total_fails, total_fails);
  420. if (total_fails)
  421. printf(KRED "!!!Some test(s) Failed!!!\n");
  422. else
  423. printf(KGRN "ALL TESTS PASSED\n");
  424. return total_fails;
  425. }