test-idr.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. #include "ktest.h"
  2. #include "ktest_utils.h"
  3. #include <common/idr.h>
  4. /**
  5. * @brief 测试idr的构建,预获取空间是否成功
  6. *
  7. * 以下函数将被测试:
  8. * 1. idr_pre_get
  9. * 2. DECLARE_IDR
  10. * 3. idr_init
  11. * 4. idr_destroy
  12. *
  13. * 同时还会(间接)测试一些内部函数:
  14. * 1. move_to_free_list
  15. *
  16. * @param arg0
  17. * @param arg1
  18. */
  19. static long ktest_idr_case0(uint64_t arg0, uint64_t arg1)
  20. {
  21. unsigned long bitmap = -1;
  22. assert((int)(bitmap == IDR_FULL));
  23. DECLARE_IDR(k_idr);
  24. assert(k_idr.top == NULL); // 刚被创建,必须是NULL
  25. assert(k_idr.id_free_cnt == 0); // 必须是0
  26. assert(k_idr.free_list == NULL);
  27. k_idr.id_free_cnt = arg1;
  28. idr_init(&k_idr);
  29. assert(k_idr.id_free_cnt == 0);
  30. assert(idr_pre_get(&k_idr, 0) == 0);
  31. assert(k_idr.id_free_cnt == IDR_FREE_MAX);
  32. for (uint64_t i = 1; i < 64; i++)
  33. {
  34. int id = __lowbit_id(i), chk_id = -1;
  35. for (int j = 0; j < 64; j++)
  36. if ((i >> j) & 1)
  37. {
  38. chk_id = j;
  39. break;
  40. }
  41. assert(id == chk_id);
  42. }
  43. // 销毁
  44. idr_destroy(&k_idr);
  45. assert(k_idr.id_free_cnt == 0);
  46. assert(k_idr.free_list == NULL);
  47. assert(k_idr.top == NULL);
  48. return 0;
  49. }
  50. /**
  51. * @brief 测试id的获取,id的删除,id的全体删除, idr的find函数
  52. *
  53. * @param arg0
  54. * @param arg1
  55. */
  56. static long ktest_idr_case1(uint64_t arg0, uint64_t arg1)
  57. {
  58. DECLARE_IDR(k_idr);
  59. int a[128];
  60. // 获取128个id
  61. for (int i = 0; i < 128; i++)
  62. {
  63. assert(idr_get_new(&k_idr, &a[i], &a[i]) == 0);
  64. assert(a[i] == i);
  65. }
  66. // 查询128个ptr
  67. for (int i = 0; i < 128; i++)
  68. {
  69. int *ptr = idr_find(&k_idr, a[i]);
  70. assert(ptr == &a[i]);
  71. assert(ptr != NULL);
  72. assert(*ptr == a[i]);
  73. }
  74. // 倒序:删除64个id
  75. for (int i = 127; i >= 64; i--)
  76. {
  77. idr_remove(&k_idr, a[i]);
  78. assert(idr_find(&k_idr, a[i]) == NULL);
  79. }
  80. // 正序:删除64个id
  81. for (int i = 0; i <= 63; i++)
  82. {
  83. idr_remove(&k_idr, a[i]);
  84. assert(idr_find(&k_idr, a[i]) == NULL);
  85. }
  86. // 重新申请128个id, 值域范围应该仍然是[0,127]
  87. for (int i = 0; i < 128; i++)
  88. {
  89. assert(idr_get_new(&k_idr, &a[i], &a[i]) == 0);
  90. assert(a[i] == i);
  91. }
  92. // 正序:删除32个id
  93. for (int i = 0; i <= 31; i++)
  94. {
  95. idr_remove(&k_idr, a[i]);
  96. assert(idr_find(&k_idr, a[i]) == NULL);
  97. }
  98. // 倒序:删除32个id
  99. for (int i = 127; i >= 96; i--)
  100. {
  101. idr_remove(&k_idr, a[i]);
  102. assert(idr_find(&k_idr, a[i]) == NULL);
  103. }
  104. // 整体删除
  105. idr_remove_all(&k_idr);
  106. assert(k_idr.top == NULL);
  107. // 获取128个id
  108. for (int i = 0; i < 128; i++)
  109. {
  110. assert(idr_get_new(&k_idr, &a[i], &a[i]) == 0);
  111. assert(a[i] == i);
  112. }
  113. // 查询128个ptr
  114. for (int i = 0; i < 128; i++)
  115. {
  116. int *ptr = idr_find(&k_idr, a[i]);
  117. assert(ptr == &a[i]);
  118. assert(*ptr == a[i]);
  119. }
  120. // 正序:删除64个id
  121. for (int i = 0; i <= 63; i++)
  122. {
  123. idr_remove(&k_idr, a[i]);
  124. assert(idr_find(&k_idr, a[i]) == NULL);
  125. }
  126. // 倒序:删除64个id
  127. for (int i = 127; i >= 64; i--)
  128. {
  129. idr_remove(&k_idr, a[i]);
  130. assert(idr_find(&k_idr, a[i]) == NULL);
  131. }
  132. // 销毁
  133. idr_destroy(&k_idr);
  134. assert(k_idr.id_free_cnt == 0);
  135. assert(k_idr.free_list == NULL);
  136. return 0;
  137. }
  138. /**
  139. * @brief case1 的大数据测试
  140. *
  141. * @param arg0
  142. * @param arg1
  143. */
  144. static long ktest_idr_case2(uint64_t arg0, uint64_t arg1)
  145. {
  146. DECLARE_IDR(k_idr);
  147. // 获取 1000‘000 个ID
  148. const int N = 1e7;
  149. const int M = 3e6;
  150. int tmp;
  151. for (int i = 0; i < N; i++)
  152. {
  153. assert(idr_get_new(&k_idr, &tmp, &tmp) == 0);
  154. assert(tmp == i);
  155. int *ptr = idr_find(&k_idr, i);
  156. assert(ptr != NULL);
  157. assert(*ptr == i);
  158. }
  159. // 正向: M 个ID
  160. for (int i = 0; i < M; i++)
  161. {
  162. int *ptr = idr_find(&k_idr, i);
  163. assert(ptr != NULL);
  164. assert(*ptr == N - 1);
  165. idr_remove(&k_idr, i);
  166. assert(idr_find(&k_idr, i) == NULL);
  167. }
  168. // 倒序: N-M 个ID
  169. for (int i = (N)-1; i >= M; i--)
  170. {
  171. int *ptr = idr_find(&k_idr, i);
  172. assert(*ptr == N - 1);
  173. idr_remove(&k_idr, i);
  174. assert(idr_find(&k_idr, i) == NULL);
  175. }
  176. // 重新插入数据
  177. for (int i = 0; i < N; i++)
  178. {
  179. assert(idr_get_new(&k_idr, &tmp, &tmp) == 0);
  180. assert(tmp == i);
  181. assert(k_idr.top != NULL);
  182. int *ptr = idr_find(&k_idr, i);
  183. assert(ptr != NULL);
  184. assert(*ptr == i);
  185. }
  186. assert(k_idr.top != NULL);
  187. for (int i = 0; i < M; i++)
  188. {
  189. assert(idr_replace(&k_idr, NULL, i) == 0);
  190. }
  191. // 销毁
  192. idr_destroy(&k_idr);
  193. assert(k_idr.id_free_cnt == 0);
  194. assert(k_idr.free_list == NULL);
  195. return 0;
  196. }
  197. /**
  198. * @brief case1 的大数据测试
  199. *
  200. * @param arg0
  201. * @param arg1
  202. */
  203. static long ktest_idr_case3(uint64_t arg0, uint64_t arg1)
  204. {
  205. DECLARE_IDR(k_idr);
  206. const int N = 1949;
  207. int tmp;
  208. // 获取ID
  209. for (int i = 0; i < N; i++)
  210. {
  211. assert(idr_get_new(&k_idr, &tmp, &tmp) == 0);
  212. assert(tmp == i);
  213. int *ptr = idr_find(&k_idr, i);
  214. assert(ptr != NULL);
  215. assert(*ptr == i);
  216. }
  217. // 查询 nextid
  218. for (int i = 1; i <= N; i++)
  219. {
  220. int nextid;
  221. int *ptr = idr_find_next_getid(&k_idr, i - 1, &nextid);
  222. if (likely(i < N))
  223. {
  224. assert(ptr != NULL);
  225. assert(*ptr == N - 1);
  226. assert(nextid == i);
  227. }
  228. else
  229. {
  230. assert(ptr == NULL);
  231. assert(nextid == -1);
  232. }
  233. }
  234. int sz = N;
  235. // 删掉某一段
  236. for (int i = N / 3, j = 2 * (N / 3), k = 0; i <= j; k++, i++)
  237. {
  238. int *ptr = idr_find(&k_idr, i);
  239. assert(ptr != NULL);
  240. assert(*ptr == N - 1);
  241. idr_remove(&k_idr, i);
  242. assert(idr_find(&k_idr, i) == NULL);
  243. sz--;
  244. assert(k_idr.top != NULL);
  245. }
  246. // 查询 nextid
  247. for (int i = 1; i <= N; i++)
  248. {
  249. int nextid;
  250. int *ptr = idr_find_next_getid(&k_idr, i - 1, &nextid);
  251. if (likely(i < N))
  252. {
  253. int target = i < N / 3 ? i : max(i, 2 * (N / 3) + 1);
  254. assert(ptr != NULL);
  255. assert(*ptr == N - 1);
  256. assert(nextid == target);
  257. }
  258. else
  259. {
  260. assert(ptr == NULL);
  261. assert(nextid == -1);
  262. }
  263. }
  264. // 销毁
  265. idr_destroy(&k_idr);
  266. assert(k_idr.id_free_cnt == 0);
  267. assert(k_idr.free_list == NULL);
  268. return 0;
  269. }
  270. /**
  271. * @brief 更加全面覆盖所有函数 - 小数据测试
  272. *
  273. * @param arg0
  274. * @param arg1
  275. */
  276. static long ktest_idr_case4(uint64_t arg0, uint64_t arg1)
  277. {
  278. DECLARE_IDR(k_idr);
  279. idr_init(&k_idr);
  280. const int N =91173;
  281. int tmp;
  282. for (int i = 1; i <= 20; i++)
  283. {
  284. int M = N / i, T = M / 3, O = 2 * T;
  285. for (int j = 0; j < M; j++)
  286. {
  287. assert(idr_get_new(&k_idr, &tmp, &tmp) == 0);
  288. assert(tmp == j);
  289. }
  290. for (int j = O; j >= T; j--)
  291. {
  292. int *ptr = idr_find(&k_idr, j);
  293. assert(ptr != NULL);
  294. assert(*ptr == M - 1);
  295. idr_remove(&k_idr, j);
  296. }
  297. for (int j = O + 1; j < M; j++)
  298. {
  299. int *ptr = idr_find(&k_idr, j);
  300. assert(ptr != NULL);
  301. assert(*ptr == M - 1);
  302. idr_remove(&k_idr, j);
  303. }
  304. for (int j = T - 1; j >= 0; j--)
  305. {
  306. int *ptr = idr_find(&k_idr, j);
  307. assert(ptr != NULL);
  308. assert(*ptr == M - 1);
  309. idr_remove(&k_idr, j);
  310. }
  311. assert(k_idr.top == NULL);
  312. }
  313. // 销毁
  314. idr_destroy(&k_idr);
  315. assert(k_idr.id_free_cnt == 0);
  316. assert(k_idr.free_list == NULL);
  317. return 0;
  318. }
  319. /**
  320. * @brief 测试id的获取,id的删除,id的全体删除, idr的find函数
  321. *
  322. * @param arg0
  323. * @param arg1
  324. */
  325. static long ktest_idr_case5(uint64_t arg0, uint64_t arg1)
  326. {
  327. DECLARE_IDR(k_idr);
  328. const int N = 128;
  329. int a[N];
  330. // 获取128个id
  331. for (int i = 0; i < N; i++)
  332. {
  333. assert(idr_get_new(&k_idr, &a[i], &a[i]) == 0);
  334. assert(a[i] == i);
  335. }
  336. // 把id指向的指针向后移动一个单位
  337. for (int i = 0; i < N; i++)
  338. {
  339. int *ptr;
  340. int flags = idr_replace_get_old(&k_idr, &a[(i + 1) % N], i, (void*)&ptr);
  341. assert(flags == 0); // 0 是成功
  342. assert(ptr != NULL);
  343. assert(*ptr == i);
  344. // 测试是否替换成功
  345. ptr = idr_find(&k_idr, i);
  346. assert(ptr != NULL);
  347. assert(*ptr == (i + 1) % N);
  348. }
  349. // 销毁
  350. idr_destroy(&k_idr);
  351. assert(k_idr.id_free_cnt == 0);
  352. assert(k_idr.free_list == NULL);
  353. // destroy之后,再获取128个id
  354. for (int i = 0; i < N; i++)
  355. {
  356. assert(idr_get_new(&k_idr, &a[i], &a[i]) == 0);
  357. assert(a[i] == i);
  358. }
  359. // 销毁
  360. idr_destroy(&k_idr);
  361. assert(k_idr.id_free_cnt == 0);
  362. assert(k_idr.free_list == NULL);
  363. return 0;
  364. }
  365. /**
  366. * @brief 测试ida的插入/删除
  367. *
  368. * @param arg0
  369. * @param arg1
  370. * @return long
  371. */
  372. static long ktest_idr_case6(uint64_t arg0, uint64_t arg1)
  373. {
  374. assert(IDA_BITMAP_LONGS != 0);
  375. assert(IDA_BMP_SIZE != 0);
  376. assert(IDA_FULL != 0);
  377. assert(IDA_BITMAP_BITS != 0);
  378. DECLARE_IDA(k_ida);
  379. ida_init(&k_ida);
  380. const int N = IDA_FULL * IDR_SIZE + 1;
  381. for (int i = 0; i < N; i++)
  382. {
  383. int p_id;
  384. assert(ida_get_new(&k_ida, &p_id) == 0);
  385. assert(p_id == i);
  386. }
  387. for (int i = 0; i < N; i++)
  388. {
  389. assert(ida_count(&k_ida, i) == 1);
  390. }
  391. for (int i = N - 1; i >= 0; i--)
  392. {
  393. ida_remove(&k_ida, i);
  394. assert(ida_count(&k_ida, i) == 0);
  395. }
  396. assert(k_ida.idr.top == NULL);
  397. for (int i = 0; i < N; i++)
  398. {
  399. int p_id;
  400. assert(ida_get_new(&k_ida, &p_id) == 0);
  401. assert(p_id == i);
  402. }
  403. assert(k_ida.idr.top != NULL);
  404. ida_destroy(&k_ida);
  405. assert(k_ida.idr.top == NULL);
  406. assert(k_ida.free_list == NULL);
  407. // 测试destroy之后能否重新获取ID
  408. for (int i = 0; i < N; i++)
  409. {
  410. int p_id;
  411. assert(ida_get_new(&k_ida, &p_id) == 0);
  412. assert(p_id == i);
  413. }
  414. for (int i = 0; i < N / 3; i++)
  415. {
  416. ida_remove(&k_ida, i);
  417. assert(ida_count(&k_ida, i) == 0);
  418. }
  419. for (int i = 2 * N / 3; i < N; i++)
  420. {
  421. ida_remove(&k_ida, i);
  422. assert(ida_count(&k_ida, i) == 0);
  423. }
  424. assert(k_ida.idr.top != NULL);
  425. ida_destroy(&k_ida);
  426. assert(k_ida.idr.top == NULL);
  427. assert(k_ida.free_list == NULL);
  428. return 0;
  429. }
  430. static ktest_case_table kt_idr_func_table[] = {
  431. ktest_idr_case0,
  432. ktest_idr_case1,
  433. // ktest_idr_case2, // 为了加快启动速度, 暂时注释掉这个测试
  434. ktest_idr_case3,
  435. ktest_idr_case4,
  436. ktest_idr_case5,
  437. ktest_idr_case6,
  438. };
  439. int ktest_test_idr(void* arg)
  440. {
  441. kTEST("Testing idr...");
  442. unsigned int sz = sizeof(kt_idr_func_table) / sizeof(ktest_case_table);
  443. for (int i = 0; i < sz; ++i)
  444. {
  445. kTEST("Testing case %d", i);
  446. kt_idr_func_table[i](i, i + 1);
  447. }
  448. kTEST("idr Test done.");
  449. return 0;
  450. }