mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 01:43:36 +01:00
bkpr-tests: first test of plugin bkpr database
First test of bookkeeper database, for just the migrations.
This commit is contained in:
parent
fb951dbbd6
commit
cd95d91ed5
2
.gitignore
vendored
2
.gitignore
vendored
@ -34,6 +34,8 @@ monkeytype.sqlite3
|
||||
!*/test/run-*.c
|
||||
*/test/exp-run-*
|
||||
!*/test/exp-run-*.c
|
||||
*/*/test/run-*
|
||||
!*/*/test/run-*.c
|
||||
test/test_protocol
|
||||
test/test_sphinx
|
||||
tests/.pytest.restart
|
||||
|
@ -41,3 +41,5 @@ bkpr-maintainer-clean:
|
||||
$(RM) plugins/bkpr/statements.po
|
||||
$(RM) plugins/bkpr/statements_gettextgen.po
|
||||
$(RM) $(BOOKKEEPER_DB_QUERIES)
|
||||
|
||||
include plugins/bkpr/test/Makefile
|
||||
|
33
plugins/bkpr/test/Makefile
Normal file
33
plugins/bkpr/test/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
BOOKKEEPER_TEST_SRC := $(wildcard plugins/bkpr/test/run-*.c)
|
||||
BOOKKEEPER_TEST_OBJS := $(BOOKKEEPER_TEST_SRC:.c=.o)
|
||||
BOOKKEEPER_TEST_PROGRAMS := $(BOOKKEEPER_TEST_OBJS:.o=)
|
||||
|
||||
ALL_C_SOURCES += $(BOOKKEEPER_TEST_SRC)
|
||||
ALL_TEST_PROGRAMS += $(BOOKKEEPER_TEST_PROGRAMS)
|
||||
|
||||
BOOKKEEPER_TEST_COMMON_OBJS := \
|
||||
common/amount.o \
|
||||
common/autodata.o \
|
||||
common/base32.o \
|
||||
common/blockheight_states.o \
|
||||
common/channel_type.o \
|
||||
common/features.o \
|
||||
common/json_stream.o \
|
||||
common/key_derive.o \
|
||||
common/memleak.o \
|
||||
common/node_id.o \
|
||||
common/setup.o \
|
||||
common/timeout.o \
|
||||
common/type_to_string.o \
|
||||
common/utils.o \
|
||||
common/version.o \
|
||||
db/bindings.o \
|
||||
db/db_sqlite3.o \
|
||||
db/exec.o \
|
||||
db/utils.o \
|
||||
plugins/bkpr/db_sqlite3_sqlgen.o
|
||||
|
||||
$(BOOKKEEPER_TEST_PROGRAMS): $(BITCOIN_OBJS) $(BOOKKEEPER_TEST_COMMON_OBJS)
|
||||
$(BOOKKEEPER_TEST_OBJS): $(BOOKKEEPER_HEADER) $(BOOKKEEPER_SRC) $(BOOKKEEPER_TEST_COMMON_OBJS)
|
||||
|
||||
check-units: $(BOOKKEEPER_TEST_PROGRAMS:%=unittest/%)
|
270
plugins/bkpr/test/run-bkpr_db.c
Normal file
270
plugins/bkpr/test/run-bkpr_db.c
Normal file
@ -0,0 +1,270 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <ccan/tal/str/str.h>
|
||||
#include <db/common.h>
|
||||
|
||||
#ifndef DB_FATAL
|
||||
#define DB_FATAL
|
||||
static char *db_err;
|
||||
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);
|
||||
}
|
||||
#endif /* DB_FATAL */
|
||||
|
||||
#include "plugins/bkpr/db.c"
|
||||
#include "plugins/libplugin.c"
|
||||
|
||||
#include "test_utils.h"
|
||||
|
||||
#include <common/fee_states.h>
|
||||
#include <common/htlc.h>
|
||||
#include <common/json_stream.h>
|
||||
#include <common/setup.h>
|
||||
#include <common/utils.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <wire/wire.h>
|
||||
|
||||
/* AUTOGENERATED MOCKS START */
|
||||
/* Generated stub for daemon_maybe_debug */
|
||||
void daemon_maybe_debug(char *argv[])
|
||||
{ fprintf(stderr, "daemon_maybe_debug called!\n"); abort(); }
|
||||
/* Generated stub for daemon_setup */
|
||||
void daemon_setup(const char *argv0 UNNEEDED,
|
||||
void (*backtrace_print)(const char *fmt UNNEEDED, ...) UNNEEDED,
|
||||
void (*backtrace_exit)(void))
|
||||
{ fprintf(stderr, "daemon_setup called!\n"); abort(); }
|
||||
/* Generated stub for first_fee_state */
|
||||
enum htlc_state first_fee_state(enum side opener UNNEEDED)
|
||||
{ fprintf(stderr, "first_fee_state called!\n"); abort(); }
|
||||
/* Generated stub for fmt_wireaddr_without_port */
|
||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
||||
/* Generated stub for fromwire */
|
||||
const u8 *fromwire(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, void *copy UNNEEDED, size_t n UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_bool */
|
||||
bool fromwire_bool(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_bool called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_fail */
|
||||
void *fromwire_fail(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_fail called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_secp256k1_ecdsa_signature */
|
||||
void fromwire_secp256k1_ecdsa_signature(const u8 **cursor UNNEEDED, size_t *max UNNEEDED,
|
||||
secp256k1_ecdsa_signature *signature UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_secp256k1_ecdsa_signature called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_sha256 */
|
||||
void fromwire_sha256(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct sha256 *sha256 UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_sha256 called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_tal_arrn */
|
||||
u8 *fromwire_tal_arrn(const tal_t *ctx UNNEEDED,
|
||||
const u8 **cursor UNNEEDED, size_t *max UNNEEDED, size_t num UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_tal_arrn called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_u16 */
|
||||
u16 fromwire_u16(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_u16 called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_u32 */
|
||||
u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_u32 called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_u64 */
|
||||
u64 fromwire_u64(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_u64 called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_u8 */
|
||||
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_u8_array */
|
||||
void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_u8_array called!\n"); abort(); }
|
||||
/* Generated stub for htlc_state_flags */
|
||||
int htlc_state_flags(enum htlc_state state UNNEEDED)
|
||||
{ fprintf(stderr, "htlc_state_flags called!\n"); abort(); }
|
||||
/* Generated stub for htlc_state_name */
|
||||
const char *htlc_state_name(enum htlc_state s UNNEEDED)
|
||||
{ fprintf(stderr, "htlc_state_name called!\n"); abort(); }
|
||||
/* Generated stub for json_get_member */
|
||||
const jsmntok_t *json_get_member(const char *buffer UNNEEDED, const jsmntok_t tok[] UNNEEDED,
|
||||
const char *label UNNEEDED)
|
||||
{ fprintf(stderr, "json_get_member called!\n"); abort(); }
|
||||
/* Generated stub for json_next */
|
||||
const jsmntok_t *json_next(const jsmntok_t *tok UNNEEDED)
|
||||
{ fprintf(stderr, "json_next called!\n"); abort(); }
|
||||
/* Generated stub for json_parse_input */
|
||||
bool json_parse_input(jsmn_parser *parser UNNEEDED,
|
||||
jsmntok_t **toks UNNEEDED,
|
||||
const char *input UNNEEDED, int len UNNEEDED,
|
||||
bool *complete UNNEEDED)
|
||||
{ fprintf(stderr, "json_parse_input called!\n"); abort(); }
|
||||
/* Generated stub for json_parse_simple */
|
||||
jsmntok_t *json_parse_simple(const tal_t *ctx UNNEEDED, const char *input UNNEEDED, int len UNNEEDED)
|
||||
{ fprintf(stderr, "json_parse_simple called!\n"); abort(); }
|
||||
/* Generated stub for json_scan */
|
||||
const char *json_scan(const tal_t *ctx UNNEEDED,
|
||||
const char *buffer UNNEEDED,
|
||||
const jsmntok_t *tok UNNEEDED,
|
||||
const char *guide UNNEEDED,
|
||||
...)
|
||||
{ fprintf(stderr, "json_scan called!\n"); abort(); }
|
||||
/* Generated stub for json_scanv */
|
||||
const char *json_scanv(const tal_t *ctx UNNEEDED,
|
||||
const char *buffer UNNEEDED,
|
||||
const jsmntok_t *tok UNNEEDED,
|
||||
const char *guide UNNEEDED,
|
||||
va_list ap UNNEEDED)
|
||||
{ fprintf(stderr, "json_scanv called!\n"); abort(); }
|
||||
/* Generated stub for json_strdup */
|
||||
char *json_strdup(const tal_t *ctx UNNEEDED, const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED)
|
||||
{ fprintf(stderr, "json_strdup called!\n"); abort(); }
|
||||
/* Generated stub for json_to_bool */
|
||||
bool json_to_bool(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, bool *b UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_bool called!\n"); abort(); }
|
||||
/* Generated stub for json_to_int */
|
||||
bool json_to_int(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, int *num UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_int called!\n"); abort(); }
|
||||
/* Generated stub for json_to_msat */
|
||||
bool json_to_msat(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED,
|
||||
struct amount_msat *msat UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_msat called!\n"); abort(); }
|
||||
/* Generated stub for json_to_node_id */
|
||||
bool json_to_node_id(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED,
|
||||
struct node_id *id UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_node_id called!\n"); abort(); }
|
||||
/* Generated stub for json_to_number */
|
||||
bool json_to_number(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED,
|
||||
unsigned int *num UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_number called!\n"); abort(); }
|
||||
/* Generated stub for json_to_secret */
|
||||
bool json_to_secret(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, struct secret *dest UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_secret called!\n"); abort(); }
|
||||
/* Generated stub for json_to_short_channel_id */
|
||||
bool json_to_short_channel_id(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED,
|
||||
struct short_channel_id *scid UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_short_channel_id called!\n"); abort(); }
|
||||
/* Generated stub for json_to_txid */
|
||||
bool json_to_txid(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED,
|
||||
struct bitcoin_txid *txid UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_txid called!\n"); abort(); }
|
||||
/* Generated stub for json_to_u64 */
|
||||
bool json_to_u64(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, u64 *num UNNEEDED)
|
||||
{ fprintf(stderr, "json_to_u64 called!\n"); abort(); }
|
||||
/* Generated stub for json_tok_bin_from_hex */
|
||||
u8 *json_tok_bin_from_hex(const tal_t *ctx UNNEEDED, const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED)
|
||||
{ fprintf(stderr, "json_tok_bin_from_hex called!\n"); abort(); }
|
||||
/* Generated stub for json_tok_full */
|
||||
const char *json_tok_full(const char *buffer UNNEEDED, const jsmntok_t *t UNNEEDED)
|
||||
{ fprintf(stderr, "json_tok_full called!\n"); abort(); }
|
||||
/* Generated stub for json_tok_full_len */
|
||||
int json_tok_full_len(const jsmntok_t *t UNNEEDED)
|
||||
{ fprintf(stderr, "json_tok_full_len called!\n"); abort(); }
|
||||
/* Generated stub for json_tok_streq */
|
||||
bool json_tok_streq(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, const char *str UNNEEDED)
|
||||
{ fprintf(stderr, "json_tok_streq called!\n"); abort(); }
|
||||
/* Generated stub for last_fee_state */
|
||||
enum htlc_state last_fee_state(enum side opener UNNEEDED)
|
||||
{ fprintf(stderr, "last_fee_state called!\n"); abort(); }
|
||||
/* Generated stub for log_level_name */
|
||||
const char *log_level_name(enum log_level level UNNEEDED)
|
||||
{ fprintf(stderr, "log_level_name called!\n"); abort(); }
|
||||
/* Generated stub for toks_alloc */
|
||||
jsmntok_t *toks_alloc(const tal_t *ctx UNNEEDED)
|
||||
{ fprintf(stderr, "toks_alloc called!\n"); abort(); }
|
||||
/* Generated stub for toks_reset */
|
||||
void toks_reset(jsmntok_t *toks UNNEEDED)
|
||||
{ fprintf(stderr, "toks_reset called!\n"); abort(); }
|
||||
/* Generated stub for towire */
|
||||
void towire(u8 **pptr UNNEEDED, const void *data UNNEEDED, size_t len UNNEEDED)
|
||||
{ fprintf(stderr, "towire called!\n"); abort(); }
|
||||
/* Generated stub for towire_bool */
|
||||
void towire_bool(u8 **pptr UNNEEDED, bool v UNNEEDED)
|
||||
{ fprintf(stderr, "towire_bool called!\n"); abort(); }
|
||||
/* Generated stub for towire_secp256k1_ecdsa_signature */
|
||||
void towire_secp256k1_ecdsa_signature(u8 **pptr UNNEEDED,
|
||||
const secp256k1_ecdsa_signature *signature UNNEEDED)
|
||||
{ fprintf(stderr, "towire_secp256k1_ecdsa_signature called!\n"); abort(); }
|
||||
/* Generated stub for towire_sha256 */
|
||||
void towire_sha256(u8 **pptr UNNEEDED, const struct sha256 *sha256 UNNEEDED)
|
||||
{ fprintf(stderr, "towire_sha256 called!\n"); abort(); }
|
||||
/* Generated stub for towire_u16 */
|
||||
void towire_u16(u8 **pptr UNNEEDED, u16 v UNNEEDED)
|
||||
{ fprintf(stderr, "towire_u16 called!\n"); abort(); }
|
||||
/* Generated stub for towire_u32 */
|
||||
void towire_u32(u8 **pptr UNNEEDED, u32 v UNNEEDED)
|
||||
{ fprintf(stderr, "towire_u32 called!\n"); abort(); }
|
||||
/* Generated stub for towire_u64 */
|
||||
void towire_u64(u8 **pptr UNNEEDED, u64 v UNNEEDED)
|
||||
{ fprintf(stderr, "towire_u64 called!\n"); abort(); }
|
||||
/* Generated stub for towire_u8 */
|
||||
void towire_u8(u8 **pptr UNNEEDED, u8 v UNNEEDED)
|
||||
{ fprintf(stderr, "towire_u8 called!\n"); abort(); }
|
||||
/* Generated stub for towire_u8_array */
|
||||
void towire_u8_array(u8 **pptr UNNEEDED, const u8 *arr UNNEEDED, size_t num UNNEEDED)
|
||||
{ fprintf(stderr, "towire_u8_array called!\n"); abort(); }
|
||||
/* AUTOGENERATED MOCKS END */
|
||||
|
||||
static char *tmp_dsn(const tal_t *ctx)
|
||||
{
|
||||
char *dsn, *filename;
|
||||
int fd = tmpdir_mkstemp(ctx, "lacct-db-XXXXXX", &filename);
|
||||
if (fd == -1)
|
||||
return NULL;
|
||||
close(fd);
|
||||
|
||||
dsn = tal_fmt(NULL, "sqlite3://%s", filename);
|
||||
tal_free(filename);
|
||||
|
||||
return dsn;
|
||||
}
|
||||
|
||||
static struct db *create_test_db(void)
|
||||
{
|
||||
struct db *db;
|
||||
char *dsn;
|
||||
|
||||
dsn = tmp_dsn(NULL);
|
||||
db = db_open(NULL, dsn);
|
||||
db->data_version = 0;
|
||||
db->report_changes_fn = NULL;
|
||||
|
||||
tal_free(dsn);
|
||||
return db;
|
||||
}
|
||||
|
||||
static bool test_empty_db_migrate(struct plugin *plugin)
|
||||
{
|
||||
struct db *db = create_test_db();
|
||||
CHECK(db);
|
||||
db_begin_transaction(db);
|
||||
CHECK(db_get_version(db) == -1);
|
||||
db_migrate(plugin, db);
|
||||
db_commit_transaction(db);
|
||||
|
||||
db_begin_transaction(db);
|
||||
CHECK(db_get_version(db) == ARRAY_SIZE(db_migrations) - 1);
|
||||
db_commit_transaction(db);
|
||||
|
||||
tal_free(db);
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
bool ok = true;
|
||||
/* Dummy for migration hooks */
|
||||
struct plugin *plugin = tal(NULL, struct plugin);
|
||||
plugin->js_arr = tal_arr(plugin, struct json_stream *, 0);
|
||||
|
||||
common_setup(argv[0]);
|
||||
|
||||
ok &= test_empty_db_migrate(plugin);
|
||||
|
||||
tal_free(plugin);
|
||||
common_shutdown();
|
||||
return !ok;
|
||||
}
|
26
plugins/bkpr/test/test_utils.h
Normal file
26
plugins/bkpr/test/test_utils.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef LIGHTNING_PLUGINS_BKPR_TEST_TEST_UTILS_H
|
||||
#define LIGHTNING_PLUGINS_BKPR_TEST_TEST_UTILS_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
/* Definitions "inspired" by libsecp256k1 */
|
||||
#define TEST_FAILURE(msg) do { \
|
||||
fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
|
||||
return false; \
|
||||
} while(0)
|
||||
|
||||
#ifdef HAVE_BUILTIN_EXPECT
|
||||
#define EXPECT(x,c) __builtin_expect((x),(c))
|
||||
#else
|
||||
#define EXPECT(x,c) (x)
|
||||
#endif
|
||||
|
||||
#define CHECK_MSG(cond,msg) do { \
|
||||
if (EXPECT(!(cond), 0)) { \
|
||||
TEST_FAILURE(msg); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define CHECK(cond) CHECK_MSG(cond,"test condition failed");
|
||||
|
||||
#endif /* LIGHTNING_PLUGINS_BKPR_TEST_TEST_UTILS_H */
|
Loading…
Reference in New Issue
Block a user