• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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