forked from ElementsProject/lightning
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun-db.c
122 lines (96 loc) · 2.44 KB
/
run-db.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <lightningd/log.h>
static void db_fatal(const char *fmt, ...);
#define fatal db_fatal
static void db_log_(struct log *log, enum log_level level, const char *fmt, ...)
{
}
#define log_ db_log_
#include "wallet/db.c"
#include "test_utils.h"
#include <common/memleak.h>
#include <stdio.h>
#include <unistd.h>
/* AUTOGENERATED MOCKS START */
/* AUTOGENERATED MOCKS END */
static char *db_err;
static void db_fatal(const char *fmt, ...)
{
va_list ap;
/* Fail hard if we're complaining about not being in transaction */
assert(!strstarts(fmt, "No longer in transaction"));
va_start(ap, fmt);
db_err = tal_vfmt(NULL, fmt, ap);
va_end(ap);
}
static struct db *create_test_db(const char *testname)
{
struct db *db;
char filename[] = "/tmp/ldb-XXXXXX";
int fd = mkstemp(filename);
if (fd == -1)
return NULL;
close(fd);
db = db_open(NULL, filename);
return db;
}
static bool test_empty_db_migrate(void)
{
struct db *db = create_test_db(__func__);
CHECK(db);
db_begin_transaction(db);
CHECK(db_get_version(db) == -1);
db_commit_transaction(db);
db_migrate(db, NULL);
db_begin_transaction(db);
CHECK(db_get_version(db) == db_migration_count());
db_commit_transaction(db);
tal_free(db);
return true;
}
static bool test_primitives(void)
{
struct db *db = create_test_db(__func__);
db_begin_transaction(db);
CHECK(db->in_transaction);
db_commit_transaction(db);
CHECK(!db->in_transaction);
db_begin_transaction(db);
db_commit_transaction(db);
db_begin_transaction(db);
db_exec(__func__, db, "SELECT name FROM sqlite_master WHERE type='table';");
CHECK_MSG(!db_err, "Simple correct SQL command");
db_exec(__func__, db, "not a valid SQL statement");
CHECK_MSG(db_err, "Failing SQL command");
db_err = tal_free(db_err);
db_commit_transaction(db);
CHECK(!db->in_transaction);
tal_free(db);
return true;
}
static bool test_vars(void)
{
struct db *db = create_test_db(__func__);
char *varname = "testvar";
CHECK(db);
db_migrate(db, NULL);
db_begin_transaction(db);
/* Check default behavior */
CHECK(db_get_intvar(db, varname, 42) == 42);
/* Check setting and getting */
db_set_intvar(db, varname, 1);
CHECK(db_get_intvar(db, varname, 42) == 1);
/* Check updating */
db_set_intvar(db, varname, 2);
CHECK(db_get_intvar(db, varname, 42) == 2);
db_commit_transaction(db);
tal_free(db);
return true;
}
int main(void)
{
bool ok = true;
ok &= test_empty_db_migrate();
ok &= test_vars();
ok &= test_primitives();
return !ok;
}