diff options
Diffstat (limited to 'src/exchangedb')
| -rw-r--r-- | src/exchangedb/Makefile.am | 20 | ||||
| -rw-r--r-- | src/exchangedb/pg_reserves_in_insert.c | 24 | ||||
| -rw-r--r-- | src/exchangedb/test_exchangedb_by_j.c | 194 | 
3 files changed, 220 insertions, 18 deletions
| diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index ac300a9c..4d892efe 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 38524bd6..2fcca241 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 00000000..b17b51bc --- /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 <http://www.gnu.org/licenses/> +*/ +/** + * @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;k<batch_size;k++) +    { +      FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != +              plugin->reserves_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 */ | 
