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
8 #define KBUFSZ 1024
9 #define VBUFSZ 1024
10 char kbuf[KBUFSZ];
11 char vbuf[VBUFSZ];
12
13 uint32_t g_seed;
14
init_suite(void)15 int init_suite(void) {
16 iwrc rc = iwkv_init();
17 RCRET(rc);
18 g_seed = 2681089616;
19 return rc;
20 }
21
clean_suite(void)22 int clean_suite(void) {
23 return 0;
24 }
25
iwkv_test7_1_impl(int direction)26 static void iwkv_test7_1_impl(int direction) {
27 iwrc rc;
28 IWKV iwkv;
29 IWDB db;
30 IWKV_val key = {0};
31 IWKV_val val = {0};
32 IWKV_OPTS opts = {
33 .path = direction > 0 ? "iwkv_test7_2_fwd.db" : "iwkv_test7_2_back.db",
34 .oflags = IWKV_TRUNC,
35 .random_seed = g_seed
36 };
37 rc = iwkv_open(&opts, &iwkv);
38 CU_ASSERT_EQUAL_FATAL(rc, 0);
39 rc = iwkv_db(iwkv, 1, IWDB_COMPOUND_KEYS, &db);
40 CU_ASSERT_EQUAL_FATAL(rc, 0);
41
42 const int nrecords = 50000;
43
44 for (int i = 0; i < nrecords; ++i) {
45 snprintf(kbuf, KBUFSZ, "5368fce5-c138-4f0d-bfee-dbce07eb28e1%d", i);
46 snprintf(vbuf, VBUFSZ, "%04d", i);
47 key.data = kbuf;
48 key.size = strlen(key.data);
49 key.compound = direction > 0 ? i + 1 : nrecords - i;
50
51 val.data = vbuf;
52 val.size = strlen(val.data);
53 rc = iwkv_put(db, &key, &val, 0);
54 CU_ASSERT_EQUAL_FATAL(rc, 0);
55 }
56
57 for (int i = 0; i < nrecords; ++i) {
58 snprintf(kbuf, KBUFSZ, "5368fce5-c138-4f0d-bfee-dbce07eb28e1%d", i);
59 snprintf(vbuf, VBUFSZ, "%04d", i);
60 key.data = kbuf;
61 key.size = strlen(key.data);
62 key.compound = direction > 0 ? i + 1 : nrecords - i;
63 rc = iwkv_get(db, &key, &val);
64 CU_ASSERT_EQUAL_FATAL(rc, 0);
65 iwkv_val_dispose(&val);
66 }
67 rc = iwkv_close(&iwkv);
68 CU_ASSERT_EQUAL_FATAL(rc, 0);
69 }
70
iwkv_test7_1()71 static void iwkv_test7_1() {
72 iwkv_test7_1_impl(1);
73 iwkv_test7_1_impl(-1);
74 IWP_FILE_STAT fwd_s = {0};
75 IWP_FILE_STAT back_s = {0};
76 iwrc rc = iwp_fstat("iwkv_test7_2_fwd.db", &fwd_s);
77 CU_ASSERT_EQUAL_FATAL(rc, 0);
78 rc = iwp_fstat("iwkv_test7_2_back.db", &back_s);
79 CU_ASSERT_EQUAL_FATAL(rc, 0);
80 CU_ASSERT_TRUE((double)fwd_s.size / back_s.size < 1.1);
81 }
82
main()83 int main() {
84 CU_pSuite pSuite = NULL;
85
86 /* Initialize the CUnit test registry */
87 if (CUE_SUCCESS != CU_initialize_registry()) return CU_get_error();
88
89 /* Add a suite to the registry */
90 pSuite = CU_add_suite("iwkv_test7", init_suite, clean_suite);
91
92 if (NULL == pSuite) {
93 CU_cleanup_registry();
94 return CU_get_error();
95 }
96
97 /* Add the tests to the suite */
98 if (
99 (NULL == CU_add_test(pSuite, "iwkv_test7_1", iwkv_test7_1))
100 ) {
101 CU_cleanup_registry();
102 return CU_get_error();
103 }
104
105 /* Run all tests using the CUnit Basic interface */
106 CU_basic_set_mode(CU_BRM_VERBOSE);
107 CU_basic_run_tests();
108 int ret = CU_get_error() || CU_get_number_of_failures();
109 CU_cleanup_registry();
110 return ret;
111 }
112