mirror of
https://github.com/radareorg/sdb.git
synced 2026-11-07 14:48:18 -10:00
250 lines
6.3 KiB
C
250 lines
6.3 KiB
C
|
|
#include <sdb/sdb.h>
|
|
#include "minunit.h"
|
|
|
|
// #define SAVE_FILES
|
|
|
|
static Sdb *test_sdb_new(const char *file) {
|
|
#ifdef SAVE_FILES
|
|
Sdb *r = sdb_new (NULL, file, 0);
|
|
//sdb_disk_create (r);
|
|
#else
|
|
Sdb *r = sdb_new0 ();
|
|
#endif
|
|
sdb_set (r, "some", "stuff", 0);
|
|
sdb_set (r, "and", "even", 0);
|
|
sdb_set (r, "more", "stuff", 0);
|
|
|
|
sdb_ns (r, "emptyns", true);
|
|
|
|
Sdb *test_ns = sdb_ns (r, "test", true);
|
|
sdb_set (test_ns, "a", "123", 0);
|
|
sdb_set (test_ns, "b", "test", 0);
|
|
sdb_set (test_ns, "c", "hello", 0);
|
|
|
|
Sdb *subspace_ns = sdb_ns (test_ns, "subspace", true);
|
|
sdb_set (subspace_ns, "some", "values", 0);
|
|
sdb_set (subspace_ns, "are", "saved", 0);
|
|
sdb_set (subspace_ns, "here", "lol", 0);
|
|
return r;
|
|
}
|
|
|
|
static void test_sdb_free(Sdb *sdb) {
|
|
if (!sdb) {
|
|
return;
|
|
}
|
|
#ifdef SAVE_FILES
|
|
sdb_sync (sdb); // sdb_disk_finish (sdb);
|
|
#endif
|
|
sdb_free (sdb);
|
|
}
|
|
|
|
typedef struct {
|
|
char buf[2048];
|
|
size_t buf_len;
|
|
} Ctx;
|
|
|
|
void diff_cb(const SdbDiff *diff, void *user) {
|
|
Ctx *ctx = user;
|
|
int r = sdb_diff_format (ctx->buf + ctx->buf_len, sizeof (ctx->buf) - ctx->buf_len, diff);
|
|
if (r >= 0) {
|
|
ctx->buf_len += r;
|
|
if (ctx->buf_len >= sizeof (ctx->buf)) {
|
|
ctx->buf_len = sizeof (ctx->buf) - 1;
|
|
}
|
|
if (ctx->buf_len < sizeof (ctx->buf) + 1) {
|
|
ctx->buf[ctx->buf_len++] = '\n';
|
|
ctx->buf[ctx->buf_len] = '\0';
|
|
}
|
|
}
|
|
}
|
|
|
|
static bool diff_str(Sdb *a, Sdb *b, char **diff) {
|
|
Ctx ctx = { 0 };
|
|
bool eq = sdb_diff (a, b, diff ? diff_cb : NULL, diff ? &ctx : NULL);
|
|
if (diff) {
|
|
*diff = strdup (ctx.buf);
|
|
}
|
|
return eq;
|
|
}
|
|
|
|
bool test_sdb_diff_equal_empty() {
|
|
Sdb *a = sdb_new0 ();
|
|
Sdb *b = sdb_new0 ();
|
|
mu_assert ("equal db (no diff)", diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("equal db (diff)", diff_str (a, b, &diff));
|
|
mu_assert_streq (diff, "", "equal db diff");
|
|
free (diff);
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
bool test_sdb_diff_equal() {
|
|
Sdb *a = test_sdb_new ("equal_a.sdb");
|
|
Sdb *b = test_sdb_new ("equal_b.sdb");
|
|
mu_assert ("equal db (no diff)", diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("equal db (diff)", diff_str (a, b, &diff));
|
|
mu_assert_streq (diff, "", "equal db diff");
|
|
free (diff);
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
bool test_sdb_diff_ns_empty() {
|
|
Sdb *a = test_sdb_new ("ns_empty_a.sdb");
|
|
Sdb *b = test_sdb_new ("ns_empty_b.sdb");
|
|
sdb_ns_unset (b, "emptyns", NULL);
|
|
|
|
mu_assert ("empty ns removed (no diff)", !diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("empty ns removed (diff)", !diff_str (a, b, &diff));
|
|
mu_assert_streq (diff, "-NS emptyns\n", "empty ns removed diff");
|
|
free (diff);
|
|
|
|
mu_assert ("empty ns added (no diff)", !diff_str (b, a, NULL));
|
|
mu_assert ("empty ns added (diff)", !diff_str (b, a, &diff));
|
|
mu_assert_streq (diff, "+NS emptyns\n", "empty ns added diff");
|
|
free (diff);
|
|
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
bool test_sdb_diff_ns() {
|
|
Sdb *a = test_sdb_new ("ns_a.sdb");
|
|
Sdb *b = test_sdb_new ("ns_b.sdb");
|
|
sdb_ns_unset (b, "test", NULL);
|
|
|
|
mu_assert ("ns removed (no diff)", !diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("ns removed (diff)", !diff_str (a, b, &diff));
|
|
mu_assert_streq (diff,
|
|
"-NS test\n"
|
|
"-NS test/subspace\n"
|
|
"- test/subspace/here=lol\n"
|
|
"- test/subspace/some=values\n"
|
|
"- test/subspace/are=saved\n"
|
|
"- test/a=123\n"
|
|
"- test/c=hello\n"
|
|
"- test/b=test\n", "ns removed diff");
|
|
free (diff);
|
|
|
|
mu_assert ("ns added (no diff)", !diff_str (b, a, NULL));
|
|
mu_assert ("ns added (diff)", !diff_str (b, a, &diff));
|
|
mu_assert_streq (diff,
|
|
"+NS test\n"
|
|
"+NS test/subspace\n"
|
|
"+ test/subspace/here=lol\n"
|
|
"+ test/subspace/some=values\n"
|
|
"+ test/subspace/are=saved\n"
|
|
"+ test/a=123\n"
|
|
"+ test/c=hello\n"
|
|
"+ test/b=test\n", "ns added diff");
|
|
free (diff);
|
|
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
bool test_sdb_diff_ns_sub() {
|
|
Sdb *a = test_sdb_new ("ns_sub_a.sdb");
|
|
Sdb *b = test_sdb_new ("ns_sub_b.sdb");
|
|
sdb_ns_unset (sdb_ns (b, "test", 0), "subspace", NULL);
|
|
|
|
mu_assert ("sub ns removed (no diff)", !diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("sub ns removed (diff)", !diff_str (a, b, &diff));
|
|
mu_assert_streq (diff,
|
|
"-NS test/subspace\n"
|
|
"- test/subspace/here=lol\n"
|
|
"- test/subspace/some=values\n"
|
|
"- test/subspace/are=saved\n", "sub ns removed diff");
|
|
free (diff);
|
|
|
|
mu_assert ("sub ns added (no diff)", !diff_str (b, a, NULL));
|
|
mu_assert ("sub ns added (diff)", !diff_str (b, a, &diff));
|
|
mu_assert_streq (diff,
|
|
"+NS test/subspace\n"
|
|
"+ test/subspace/here=lol\n"
|
|
"+ test/subspace/some=values\n"
|
|
"+ test/subspace/are=saved\n", "sub ns added diff");
|
|
free (diff);
|
|
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
bool test_sdb_diff_kv() {
|
|
Sdb *a = test_sdb_new ("kv_a.sdb");
|
|
Sdb *b = test_sdb_new ("kv_b.sdb");
|
|
sdb_unset (b, "more", 0);
|
|
sdb_unset (sdb_ns (b, "test", false), "a", 0);
|
|
|
|
mu_assert ("kv removed (no diff)", !diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("kv removed (diff)", !diff_str (a, b, &diff));
|
|
mu_assert_streq (diff,
|
|
"- test/a=123\n"
|
|
"- more=stuff\n", "ns removed diff");
|
|
free (diff);
|
|
|
|
mu_assert ("kv added (no diff)", !diff_str (b, a, NULL));
|
|
mu_assert ("kv added (diff)", !diff_str (b, a, &diff));
|
|
mu_assert_streq (diff,
|
|
"+ test/a=123\n"
|
|
"+ more=stuff\n", "ns added diff");
|
|
free (diff);
|
|
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
bool test_sdb_diff_kv_value() {
|
|
Sdb *a = test_sdb_new ("kv_value_a.sdb");
|
|
Sdb *b = test_sdb_new ("kv_value_b.sdb");
|
|
sdb_set (b, "more", "cowbell", 0);
|
|
sdb_set (sdb_ns (b, "test", false), "a", "reaper", 0);
|
|
|
|
mu_assert ("kv value changed (no diff)", !diff_str (a, b, NULL));
|
|
char *diff;
|
|
mu_assert ("kv value changed (diff)", !diff_str (a, b, &diff));
|
|
mu_assert_streq (diff,
|
|
"- test/a=123\n"
|
|
"+ test/a=reaper\n"
|
|
"- more=stuff\n"
|
|
"+ more=cowbell\n", "ns value changed diff");
|
|
free (diff);
|
|
|
|
test_sdb_free (a);
|
|
test_sdb_free (b);
|
|
mu_end;
|
|
}
|
|
|
|
int all_tests() {
|
|
mu_run_test (test_sdb_diff_equal_empty);
|
|
mu_run_test (test_sdb_diff_equal);
|
|
mu_run_test (test_sdb_diff_ns_empty);
|
|
mu_run_test (test_sdb_diff_ns);
|
|
mu_run_test (test_sdb_diff_ns_sub);
|
|
mu_run_test (test_sdb_diff_kv);
|
|
mu_run_test (test_sdb_diff_kv_value);
|
|
return tests_passed != tests_run;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
//Sdb *sdb = test_sdb_new();
|
|
//sdb_query (sdb, "*");
|
|
//sdb_query (sdb, "***");
|
|
//test_sdb_free (sdb);
|
|
//return 0;
|
|
return all_tests();
|
|
}
|