1 #include "iwkv.h"
2 #include "iwlog.h"
3 #include "iwutils.h"
4 #include "iwcfg.h"
5 #include "iwkv_tests.h"
6 #include "iwkv_internal.h"
7 
init_suite(void)8 int init_suite(void) {
9   iwrc rc = iwkv_init();
10   return rc;
11 }
12 
clean_suite(void)13 int clean_suite(void) {
14   return 0;
15 }
16 
iwkv_test6_1_impl(int fmt_version)17 static void iwkv_test6_1_impl(int fmt_version) {
18   iwrc rc;
19   IWKV_val key = { 0 };
20   IWKV_val val = { 0 };
21   IWKV iwkv;
22   IWDB db;
23   IWKV_cursor cur;
24 
25   IWKV_OPTS opts = {
26     .path        = "iwkv_test6_1.db",
27     .oflags      = IWKV_TRUNC,
28     .fmt_version = fmt_version
29   };
30   rc = iwkv_open(&opts, &iwkv);
31   CU_ASSERT_EQUAL_FATAL(rc, 0);
32   rc = iwkv_db(iwkv, 1, IWDB_VNUM64_KEYS | IWDB_COMPOUND_KEYS, &db);
33   CU_ASSERT_EQUAL_FATAL(rc, 0);
34 
35   for (uint32_t i = 0; i < 100; ++i) {
36     key.data = &i;
37     key.size = sizeof(i);
38     for (uint32_t j = 0; j < 1000; ++j) {
39       key.compound = j;
40       val.data = &j;
41       val.size = sizeof(j);
42       rc = iwkv_put(db, &key, &val, 0);
43       CU_ASSERT_EQUAL_FATAL(rc, 0);
44       rc = iwkv_get(db, &key, &val);
45       CU_ASSERT_EQUAL_FATAL(rc, 0);
46       CU_ASSERT_EQUAL_FATAL(key.size, sizeof(i));
47       CU_ASSERT_TRUE_FATAL(!memcmp(key.data, &i, sizeof(i)));
48       CU_ASSERT_TRUE_FATAL(val.size == 4 && val.compound == 0 && !memcmp(val.data, &j, sizeof(j)));
49       iwkv_val_dispose(&val);
50     }
51   }
52   for (uint32_t i = 0; i < 10; ++i) {
53     key.data = &i;
54     key.size = sizeof(i);
55     for (uint32_t j = 0; j < 10; ++j) {
56       key.compound = j;
57       IWKV_val ckey;
58       rc = iwkv_cursor_open(db, &cur, IWKV_CURSOR_EQ, &key);
59       CU_ASSERT_EQUAL_FATAL(rc, 0);
60       rc = iwkv_cursor_key(cur, &ckey);
61       CU_ASSERT_EQUAL_FATAL(rc, 0);
62       int64_t llv;
63       CU_ASSERT_TRUE_FATAL(ckey.size == 8);
64       memcpy(&llv, ckey.data, sizeof(llv));
65       CU_ASSERT_TRUE_FATAL(ckey.compound == j && llv == i);
66       iwkv_val_dispose(&ckey);
67       rc = iwkv_cursor_close(&cur);
68       CU_ASSERT_EQUAL_FATAL(rc, 0);
69     }
70   }
71   rc = iwkv_close(&iwkv);
72   CU_ASSERT_EQUAL_FATAL(rc, 0);
73 }
74 
iwkv_test6_1_v1()75 void iwkv_test6_1_v1() {
76   iwkv_test6_1_impl(1);
77 }
78 
iwkv_test6_1_v2()79 void iwkv_test6_1_v2() {
80   iwkv_test6_1_impl(2);
81 }
82 
iwkv_test6_2_impl(int fmt_version)83 static void iwkv_test6_2_impl(int fmt_version) {
84   iwrc rc;
85   IWKV iwkv;
86   IWDB db;
87   IWKV_val key = { 0 };
88   IWKV_val val = { 0 };
89   char kbuf[PREFIX_KEY_LEN_V1];
90 
91   IWKV_OPTS opts = {
92     .path        = "iwkv_test6_2.db",
93     .oflags      = IWKV_TRUNC,
94     .fmt_version = fmt_version
95   };
96   rc = iwkv_open(&opts, &iwkv);
97   CU_ASSERT_EQUAL_FATAL(rc, 0);
98 
99   for (int i = 0; i < iwkv->pklen - 1; ++i) {
100     kbuf[i] = (i % 94) + 33;
101   }
102 
103   rc = iwkv_db(iwkv, 1, IWDB_COMPOUND_KEYS, &db);
104   CU_ASSERT_EQUAL_FATAL(rc, 0);
105 
106   for (uint32_t i = 0; i < 1000; ++i) {
107     key.data = kbuf;
108     key.size = iwkv->pklen - 1;
109     key.compound = i;
110     rc = iwkv_put(db, &key, &val, 0);
111     CU_ASSERT_EQUAL_FATAL(rc, 0);
112     rc = iwkv_get(db, &key, &val);
113     CU_ASSERT_EQUAL_FATAL(rc, 0);
114   }
115   rc = iwkv_close(&iwkv);
116   CU_ASSERT_EQUAL_FATAL(rc, 0);
117 }
118 
iwkv_test6_2_v1()119 static void iwkv_test6_2_v1() {
120   iwkv_test6_2_impl(1);
121 }
122 
iwkv_test6_2_v2()123 static void iwkv_test6_2_v2() {
124   iwkv_test6_2_impl(2);
125 }
126 
main()127 int main() {
128   CU_pSuite pSuite = NULL;
129 
130   /* Initialize the CUnit test registry */
131   if (CUE_SUCCESS != CU_initialize_registry()) {
132     return CU_get_error();
133   }
134 
135   /* Add a suite to the registry */
136   pSuite = CU_add_suite("iwkv_test6", init_suite, clean_suite);
137 
138   if (NULL == pSuite) {
139     CU_cleanup_registry();
140     return CU_get_error();
141   }
142 
143   /* Add the tests to the suite */
144   if (  (NULL == CU_add_test(pSuite, "iwkv_test6_1_v1", iwkv_test6_1_v1))
145      || (NULL == CU_add_test(pSuite, "iwkv_test6_1_v2", iwkv_test6_1_v2))
146      || (NULL == CU_add_test(pSuite, "iwkv_test6_2_v1", iwkv_test6_2_v1))
147      || (NULL == CU_add_test(pSuite, "iwkv_test6_2_v2", iwkv_test6_2_v2))) {
148     CU_cleanup_registry();
149     return CU_get_error();
150   }
151 
152   /* Run all tests using the CUnit Basic interface */
153   CU_basic_set_mode(CU_BRM_VERBOSE);
154   CU_basic_run_tests();
155   int ret = CU_get_error() || CU_get_number_of_failures();
156   CU_cleanup_registry();
157   return ret;
158 }
159