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