From 656ec29d5e30f4020046b2126254dda22dd5bc25 Mon Sep 17 00:00:00 2001 From: Joseph Date: Tue, 15 Nov 2022 05:46:26 -0500 Subject: new test --- src/exchangedb/Makefile.am | 20 +++- src/exchangedb/pg_reserves_in_insert.c | 24 ++-- src/exchangedb/test_exchangedb_by_j.c | 194 +++++++++++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 18 deletions(-) create mode 100644 src/exchangedb/test_exchangedb_by_j.c (limited to 'src/exchangedb') diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index ac300a9c2..4d892efef 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -274,12 +274,12 @@ libtalerexchangedb_la_LDFLAGS = \ check_PROGRAMS = \ test-exchangedb-postgres \ - bench-db-postgres - + bench-db-postgres\ + test-exchangedb-by-j-postgres AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH; TESTS = \ - test-exchangedb-postgres - + test-exchangedb-postgres\ + test-exchangedb-by-j-postgres test_exchangedb_postgres_SOURCES = \ test_exchangedb.c test_exchangedb_postgres_LDADD = \ @@ -292,6 +292,18 @@ test_exchangedb_postgres_LDADD = \ -lgnunetutil \ $(XLIB) +test_exchangedb_by_j_postgres_SOURCES = \ + test_exchangedb_by_j.c +test_exchangedb_by_j_postgres_LDADD = \ + libtalerexchangedb.la \ + $(top_builddir)/src/json/libtalerjson.la \ + $(top_builddir)/src/util/libtalerutil.la \ + $(top_builddir)/src/pq/libtalerpq.la \ + -ljansson \ + -lgnunetjson \ + -lgnunetutil \ + $(XLIB) + bench_db_postgres_SOURCES = \ bench_db.c bench_db_postgres_LDADD = \ diff --git a/src/exchangedb/pg_reserves_in_insert.c b/src/exchangedb/pg_reserves_in_insert.c index 38524bd61..2fcca241d 100644 --- a/src/exchangedb/pg_reserves_in_insert.c +++ b/src/exchangedb/pg_reserves_in_insert.c @@ -59,12 +59,12 @@ notify_on_reserve (struct PostgresClosure *pg, enum GNUNET_DB_QueryStatus TEH_PG_reserves_in_insert (void *cls, - const struct TALER_ReservePublicKeyP *reserve_pub, - const struct TALER_Amount *balance, - struct GNUNET_TIME_Timestamp execution_time, - const char *sender_account_details, - const char *exchange_account_section, - uint64_t wire_ref) + const struct TALER_ReservePublicKeyP *reserve_pub, + const struct TALER_Amount *balance, + struct GNUNET_TIME_Timestamp execution_time, + const char *sender_account_details, + const char *exchange_account_section, + uint64_t wire_ref) { struct PostgresClosure *pg = cls; enum GNUNET_DB_QueryStatus qs1; @@ -107,9 +107,6 @@ TEH_PG_reserves_in_insert (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Reserve does not exist; creating a new one\n"); /* Note: query uses 'on conflict do nothing' */ - - - PREPARE (pg, "reserve_create", "INSERT INTO reserves " @@ -122,7 +119,6 @@ TEH_PG_reserves_in_insert (void *cls, "($1, $2, $3, $4, $5)" " ON CONFLICT DO NOTHING" " RETURNING reserve_uuid;"); - qs1 = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "reserve_create", params, @@ -154,7 +150,6 @@ TEH_PG_reserves_in_insert (void *cls, GNUNET_PQ_query_param_end }; - PREPARE (pg, "reserves_in_add_transaction", "INSERT INTO reserves_in " @@ -207,7 +202,7 @@ TEH_PG_reserves_in_insert (void *cls, return cs; if (GNUNET_OK != TEH_PG_start (pg, - "reserve-update-serializable")) + "reserve-update-serializable")) { GNUNET_break (0); return GNUNET_DB_STATUS_HARD_ERROR; @@ -217,7 +212,7 @@ TEH_PG_reserves_in_insert (void *cls, enum GNUNET_DB_QueryStatus reserve_exists; reserve_exists = TEH_PG_reserves_get (pg, - &reserve); + &reserve); switch (reserve_exists) { case GNUNET_DB_STATUS_HARD_ERROR: @@ -287,7 +282,8 @@ TEH_PG_reserves_in_insert (void *cls, if (cs < 0) return cs; if (GNUNET_OK != - TEH_PG_start_read_committed (pg, "reserve-insert-continued")) + TEH_PG_start_read_committed (pg, + "reserve-insert-continued")) { GNUNET_break (0); return GNUNET_DB_STATUS_HARD_ERROR; diff --git a/src/exchangedb/test_exchangedb_by_j.c b/src/exchangedb/test_exchangedb_by_j.c new file mode 100644 index 000000000..b17b51bc5 --- /dev/null +++ b/src/exchangedb/test_exchangedb_by_j.c @@ -0,0 +1,194 @@ +/* + This file is part of TALER + Copyright (C) 2014-2022 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see +*/ +/** + * @file exchangedb/test_exchangedb_by_j.c + * @brief test cases for DB interaction functions + * @author Joseph Xu + */ +#include "platform.h" +#include "taler_exchangedb_lib.h" +#include "taler_json_lib.h" +#include "taler_exchangedb_plugin.h" + +/** + * Global result from the testcase. + */ +static int result; + +/** + * Report line of error if @a cond is true, and jump to label "drop". + */ +#define FAILIF(cond) \ + do { \ + if (! (cond)) { break;} \ + GNUNET_break (0); \ + goto drop; \ + } while (0) + + +/** + * Initializes @a ptr with random data. + */ +#define RND_BLK(ptr) \ + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, ptr, sizeof (*ptr)) + +/** + * Initializes @a ptr with zeros. + */ +#define ZR_BLK(ptr) \ + memset (ptr, 0, sizeof (*ptr)) + + +/** + * Currency we use. Must match test-exchange-db-*.conf. + */ +#define CURRENCY "EUR" + +/** + * Database plugin under test. + */ +static struct TALER_EXCHANGEDB_Plugin *plugin; + + +/** + * Main function that will be run by the scheduler. + * + * @param cls closure with config + */ +static void +run (void *cls) +{ + struct GNUNET_CONFIGURATION_Handle *cfg = cls; + const uint32_t num_partitions = 10; + + if (NULL == + (plugin = TALER_EXCHANGEDB_plugin_load (cfg))) + { + GNUNET_break (0); + result = 77; + return; + } + (void) plugin->drop_tables (plugin->cls); + if (GNUNET_OK != + plugin->create_tables (plugin->cls)) + { + GNUNET_break (0); + result = 77; + goto cleanup; + } + if (GNUNET_OK != + plugin->setup_partitions (plugin->cls, + num_partitions)) + { + GNUNET_break (0); + result = 77; + goto cleanup; + } + + for (unsigned int i = 0; i< 5;i++) + { + static unsigned int batches[]={1, 2, 4, 16, 64}; + const char *sndr = "payto://x-taler-bank/localhost:8080/1"; + struct TALER_Amount value; + unsigned int batch_size = batches[i]; + struct GNUNET_TIME_Timestamp now; + struct GNUNET_TIME_Relative duration; + struct TALER_ReservePublicKeyP reserve_pub; + + now = GNUNET_TIME_timestamp_get(); + RND_BLK (&reserve_pub); + GNUNET_assert (GNUNET_OK == + TALER_string_to_amount (CURRENCY ":1.000010", + &value)); + plugin->start (plugin->cls, + "test_by_exchange_j"); + for (unsigned int k=0;kreserves_in_insert (plugin->cls, + &reserve_pub, + &value, + now, + sndr, + "section", + 4)); + } + plugin->commit (plugin->cls); + duration = GNUNET_TIME_absolute_get_duration(now.abs_time); + fprintf (stderr, + "for a batchsize equal to %d it took %s\n", + batch_size, + GNUNET_STRINGS_relative_time_to_string(duration, + GNUNET_YES) ); + } + drop: + GNUNET_break (GNUNET_OK == + plugin->drop_tables (plugin->cls)); +cleanup: + TALER_EXCHANGEDB_plugin_unload (plugin); + plugin = NULL; +} + + +int +main (int argc, + char *const argv[]) +{ + const char *plugin_name; + char *config_filename; + char *testname; + struct GNUNET_CONFIGURATION_Handle *cfg; + + (void) argc; + result = -1; + if (NULL == (plugin_name = strrchr (argv[0], (int) '-'))) + { + GNUNET_break (0); + return -1; + } + GNUNET_log_setup (argv[0], + "DEBUG", + NULL); + plugin_name++; + (void) GNUNET_asprintf (&testname, + "test-exchange-db-%s", + plugin_name); + (void) GNUNET_asprintf (&config_filename, + "%s.conf", + testname); + fprintf (stderr, + "Using config: %s\n", + config_filename); + cfg = GNUNET_CONFIGURATION_create (); + if (GNUNET_OK != + GNUNET_CONFIGURATION_parse (cfg, + config_filename)) + { + GNUNET_break (0); + GNUNET_free (config_filename); + GNUNET_free (testname); + return 2; + } + GNUNET_SCHEDULER_run (&run, + cfg); + GNUNET_CONFIGURATION_destroy (cfg); + GNUNET_free (config_filename); + GNUNET_free (testname); + return result; +} + + +/* end of test_exchangedb.c */ -- cgit v1.2.3