1 #include "ejdb2.h"
2 #include "ejdb_test.h"
3 #include <ejdb2/iowow/iwxstr.h>
4 #include <CUnit/Basic.h>
5
init_suite()6 int init_suite() {
7 int rc = ejdb_init();
8 return rc;
9 }
10
clean_suite()11 int clean_suite() {
12 return 0;
13 }
14
ejdb_test1_3()15 void ejdb_test1_3() {
16 EJDB_OPTS opts = {
17 .kv = {
18 .path = "ejdb_test1_3.db",
19 .oflags = IWKV_TRUNC
20 },
21 .no_wal = true
22 };
23 EJDB db;
24 JBL jbl;
25 int64_t id = 0;
26
27 iwrc rc = ejdb_open(&opts, &db);
28 CU_ASSERT_EQUAL_FATAL(rc, 0);
29
30 rc = put_json2(db, "c1", "{'foo':'bar'}", &id);
31 CU_ASSERT_EQUAL_FATAL(rc, 0);
32 CU_ASSERT_TRUE_FATAL(id > 0);
33
34 rc = patch_json(db, "c1", "[ { 'op': 'add', 'path': '/baz', 'value': 'qux' } ]", id);
35 if (rc) {
36 iwlog_ecode_error3(rc);
37 }
38 CU_ASSERT_EQUAL_FATAL(rc, 0);
39
40 // Now check the result
41 rc = ejdb_get(db, "c1", id, &jbl);
42 CU_ASSERT_EQUAL_FATAL(rc, 0);
43
44 IWXSTR *xstr = iwxstr_new();
45 CU_ASSERT_PTR_NOT_NULL_FATAL(xstr);
46
47 rc = jbl_as_json(jbl, jbl_xstr_json_printer, xstr, 0);
48 CU_ASSERT_EQUAL_FATAL(rc, 0);
49 CU_ASSERT_STRING_EQUAL(iwxstr_ptr(xstr), "{\"foo\":\"bar\",\"baz\":\"qux\"}");
50
51 rc = ejdb_close(&db);
52 CU_ASSERT_EQUAL_FATAL(rc, 0);
53 iwxstr_destroy(xstr);
54 jbl_destroy(&jbl);
55 }
56
ejdb_test1_2()57 void ejdb_test1_2() {
58 EJDB_OPTS opts = {
59 .kv = {
60 .path = "ejdb_test1_2.db",
61 .oflags = IWKV_TRUNC
62 },
63 .no_wal = true
64 };
65 EJDB db;
66 JBL jbl, at, meta;
67 int64_t llv = 0, llv2;
68 iwrc rc = ejdb_open(&opts, &db);
69 CU_ASSERT_EQUAL_FATAL(rc, 0);
70
71 rc = jbl_from_json(&jbl, "{\"foo\":22}");
72 CU_ASSERT_EQUAL_FATAL(rc, 0);
73 rc = ejdb_put_new(db, "foocoll", jbl, &llv);
74 CU_ASSERT_EQUAL_FATAL(rc, 0);
75 jbl_destroy(&jbl);
76 CU_ASSERT_TRUE(llv > 0);
77
78 rc = ejdb_get(db, "foocoll", llv, &jbl);
79 CU_ASSERT_EQUAL_FATAL(rc, 0);
80
81 rc = jbl_at(jbl, "/foo", &at);
82 CU_ASSERT_EQUAL_FATAL(rc, 0);
83 llv2 = jbl_get_i64(at);
84 CU_ASSERT_EQUAL(llv2, 22);
85 jbl_destroy(&at);
86 jbl_destroy(&jbl);
87
88 rc = ejdb_del(db, "foocoll", llv);
89 CU_ASSERT_EQUAL_FATAL(rc, 0);
90
91 rc = ejdb_get(db, "foocoll", llv, &jbl);
92 CU_ASSERT_EQUAL(rc, IWKV_ERROR_NOTFOUND);
93 CU_ASSERT_PTR_NULL(jbl);
94
95 rc = jbl_from_json(&jbl, "{\"foo\":22}");
96 CU_ASSERT_EQUAL_FATAL(rc, 0);
97 rc = ejdb_put_new(db, "foocoll", jbl, &llv);
98 CU_ASSERT_EQUAL_FATAL(rc, 0);
99 jbl_destroy(&jbl);
100 CU_ASSERT_TRUE(llv > 0);
101
102 // Ensure indexes
103 rc = ejdb_ensure_index(db, "col1", "/foo/bar", EJDB_IDX_I64 | EJDB_IDX_UNIQUE);
104 CU_ASSERT_EQUAL_FATAL(rc, 0);
105
106 rc = ejdb_ensure_index(db, "col1", "/foo/baz", EJDB_IDX_STR);
107 CU_ASSERT_EQUAL_FATAL(rc, 0);
108
109 rc = ejdb_ensure_index(db, "col1", "/foo/gaz", EJDB_IDX_STR | EJDB_IDX_UNIQUE);
110 CU_ASSERT_EQUAL_FATAL(rc, 0);
111
112 rc = ejdb_get_meta(db, &meta);
113 CU_ASSERT_EQUAL_FATAL(rc, 0);
114
115 // fprintf(stderr, "\n");
116 // rc = jbl_as_json(meta, jbl_fstream_json_printer, stderr, JBL_PRINT_PRETTY);
117 // CU_ASSERT_EQUAL_FATAL(rc, 0);
118 // fprintf(stderr, "\n");
119
120 // "version": "2.0.0",
121 // "file": "ejdb_test1_2.db",
122 // "size": 8192,
123 // "collections": [
124 // {
125 // "name": "col1",
126 // "dbid": 3,
127 // "indexes": [
128 // {
129 // "ptr": "/foo/bar",
130 // "mode": 9,
131 // "idbf": 2,
132 // "dbid": 4,
133 // "auxdbid": 0
134 // },
135 // {
136 // "ptr": "/foo/baz",
137 // "mode": 4,
138 // "idbf": 8,
139 // "dbid": 5,
140 // "auxdbid": 0
141 // }
142 // ]
143 // },
144 // {
145 // "name": "foocoll",
146 // "dbid": 2,
147 // "indexes": []
148 // }
149 // ]
150
151 rc = jbl_at(meta, "/collections/0/name", &jbl);
152 CU_ASSERT_EQUAL_FATAL(rc, 0);
153 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "col1");
154 jbl_destroy(&jbl);
155
156 rc = jbl_at(meta, "/collections/0/indexes/0/ptr", &jbl);
157 CU_ASSERT_EQUAL_FATAL(rc, 0);
158 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "/foo/gaz");
159 jbl_destroy(&jbl);
160
161 rc = jbl_at(meta, "/collections/1/name", &jbl);
162 CU_ASSERT_EQUAL_FATAL(rc, 0);
163 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "foocoll");
164 jbl_destroy(&jbl);
165
166 rc = jbl_at(meta, "/collections/0/indexes/1/ptr", &jbl);
167 CU_ASSERT_EQUAL_FATAL(rc, 0);
168 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "/foo/baz");
169 jbl_destroy(&jbl);
170
171 rc = ejdb_close(&db);
172 CU_ASSERT_EQUAL_FATAL(rc, 0);
173 jbl_destroy(&meta);
174
175 // Now reopen db and check indexes
176 opts.kv.oflags &= ~IWKV_TRUNC;
177 rc = ejdb_open(&opts, &db);
178 CU_ASSERT_EQUAL_FATAL(rc, 0);
179
180 rc = ejdb_get_meta(db, &meta);
181 CU_ASSERT_EQUAL_FATAL(rc, 0);
182
183 rc = jbl_at(meta, "/collections/0/name", &jbl);
184 CU_ASSERT_EQUAL_FATAL(rc, 0);
185 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "col1");
186 jbl_destroy(&jbl);
187
188 rc = jbl_at(meta, "/collections/0/indexes/0/ptr", &jbl);
189 CU_ASSERT_EQUAL_FATAL(rc, 0);
190 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "/foo/gaz");
191 jbl_destroy(&jbl);
192
193 rc = jbl_at(meta, "/collections/1/name", &jbl);
194 CU_ASSERT_EQUAL_FATAL(rc, 0);
195 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "foocoll");
196 jbl_destroy(&jbl);
197
198 rc = jbl_at(meta, "/collections/1/rnum", &jbl);
199 CU_ASSERT_EQUAL_FATAL(rc, 0);
200 CU_ASSERT_EQUAL(jbl_get_i64(jbl), 1);
201 jbl_destroy(&jbl);
202
203 rc = jbl_at(meta, "/collections/0/indexes/1/ptr", &jbl);
204 CU_ASSERT_EQUAL_FATAL(rc, 0);
205 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "/foo/baz");
206 jbl_destroy(&jbl);
207 jbl_destroy(&meta);
208
209 rc = ejdb_remove_index(db, "col1", "/foo/baz", EJDB_IDX_STR);
210 CU_ASSERT_EQUAL_FATAL(rc, 0);
211
212 rc = ejdb_remove_index(db, "col1", "/foo/gaz", EJDB_IDX_STR);
213 CU_ASSERT_EQUAL_FATAL(rc, 0);
214
215 rc = ejdb_get_meta(db, &meta);
216 CU_ASSERT_EQUAL_FATAL(rc, 0);
217
218 rc = jbl_at(meta, "/collections/1/indexes/0/ptr", &jbl);
219 CU_ASSERT_EQUAL_FATAL(rc, JBL_ERROR_PATH_NOTFOUND);
220
221 rc = jbl_at(meta, "/collections/2/indexes/0/ptr", &jbl);
222 CU_ASSERT_EQUAL_FATAL(rc, JBL_ERROR_PATH_NOTFOUND);
223
224 rc = jbl_at(meta, "/collections/0/indexes/0/ptr", &jbl);
225 CU_ASSERT_EQUAL_FATAL(rc, 0);
226 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "/foo/bar");
227 jbl_destroy(&jbl);
228
229 rc = ejdb_close(&db);
230 CU_ASSERT_EQUAL_FATAL(rc, 0);
231 jbl_destroy(&meta);
232 }
233
ejdb_test1_1()234 void ejdb_test1_1() {
235 EJDB_OPTS opts = {
236 .kv = {
237 .path = "ejdb_test1_1.db",
238 .oflags = IWKV_TRUNC
239 },
240 .no_wal = true
241 };
242 EJDB db;
243 JBL meta, jbl;
244 iwrc rc = ejdb_open(&opts, &db);
245 CU_ASSERT_EQUAL_FATAL(rc, 0);
246 rc = ejdb_ensure_collection(db, "foo");
247 CU_ASSERT_EQUAL_FATAL(rc, 0);
248
249 // Meta: {
250 // "version": "2.0.0",
251 // "file": "ejdb_test1_1.db",
252 // "size": 8192,
253 // "collections": [
254 // {
255 // "name": "foo",
256 // "dbid": 2
257 // }
258 // ]
259 //}
260 rc = ejdb_get_meta(db, &meta);
261 CU_ASSERT_EQUAL_FATAL(rc, 0);
262
263 rc = jbl_at(meta, "/file", &jbl);
264 CU_ASSERT_EQUAL_FATAL(rc, 0);
265 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "ejdb_test1_1.db");
266 jbl_destroy(&jbl);
267
268 rc = jbl_at(meta, "/collections/0/name", &jbl);
269 CU_ASSERT_EQUAL_FATAL(rc, 0);
270 CU_ASSERT_STRING_EQUAL(jbl_get_str(jbl), "foo");
271 jbl_destroy(&jbl);
272 jbl_destroy(&meta);
273
274 rc = ejdb_close(&db);
275 CU_ASSERT_EQUAL_FATAL(rc, 0);
276
277 // Now reopen database then load collection
278 opts.kv.oflags &= ~IWKV_TRUNC;
279 rc = ejdb_open(&opts, &db);
280 CU_ASSERT_EQUAL_FATAL(rc, 0);
281 rc = ejdb_remove_collection(db, "foo");
282 CU_ASSERT_EQUAL_FATAL(rc, 0);
283
284 rc = ejdb_get_meta(db, &meta);
285 CU_ASSERT_EQUAL_FATAL(rc, 0);
286
287 rc = jbl_at(meta, "/collections/0/name", &jbl); // No collections
288 CU_ASSERT_EQUAL_FATAL(rc, JBL_ERROR_PATH_NOTFOUND);
289 jbl_destroy(&meta);
290
291 rc = ejdb_close(&db);
292 CU_ASSERT_EQUAL_FATAL(rc, 0);
293 }
294
main()295 int main() {
296 CU_pSuite pSuite = NULL;
297 if (CUE_SUCCESS != CU_initialize_registry()) {
298 return CU_get_error();
299 }
300 pSuite = CU_add_suite("ejdb_test1", init_suite, clean_suite);
301 if (NULL == pSuite) {
302 CU_cleanup_registry();
303 return CU_get_error();
304 }
305 if ( (NULL == CU_add_test(pSuite, "ejdb_test1_1", ejdb_test1_1))
306 || (NULL == CU_add_test(pSuite, "ejdb_test1_2", ejdb_test1_2))
307 || (NULL == CU_add_test(pSuite, "ejdb_test1_3", ejdb_test1_3))) {
308 CU_cleanup_registry();
309 return CU_get_error();
310 }
311 CU_basic_set_mode(CU_BRM_VERBOSE);
312 CU_basic_run_tests();
313 int ret = CU_get_error() || CU_get_number_of_failures();
314 CU_cleanup_registry();
315 return ret;
316 }
317