From a07d036c804ab879c7953e835d68ec0a595a379b Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Wed, 4 Sep 2019 15:24:24 +0200 Subject: More on #5746. --- src/wire-plugins/Makefile.am | 14 +- .../test_wire_plugin_legacy_taler-bank.c | 394 +++++++++++++++++++++ .../test_wire_plugin_legacy_taler-bank.conf | 12 + 3 files changed, 419 insertions(+), 1 deletion(-) create mode 100644 src/wire-plugins/test_wire_plugin_legacy_taler-bank.c create mode 100644 src/wire-plugins/test_wire_plugin_legacy_taler-bank.conf (limited to 'src') diff --git a/src/wire-plugins/Makefile.am b/src/wire-plugins/Makefile.am index e46ef48fa..df2c6f8e4 100644 --- a/src/wire-plugins/Makefile.am +++ b/src/wire-plugins/Makefile.am @@ -74,7 +74,8 @@ AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH= TESTS = \ test_ebics_wireformat \ test_wire_plugin \ - test_wire_plugin_transactions_taler_bank + test_wire_plugin_transactions_taler_bank \ + test_wire_plugin_legacy_taler_bank check_PROGRAMS= \ test_ebics_wireformat \ @@ -98,6 +99,17 @@ test_wire_plugin_LDADD = \ $(top_builddir)/src/util/libtalerutil.la +test_wire_plugin_legacy_taler_bank_SOURCES = \ + test_wire_plugin_legacy_taler-bank.c +test_wire_plugin_legacy_taler_bank_LDADD = \ + -lgnunetjson \ + -lgnunetutil \ + -ljansson \ + $(top_builddir)/src/wire/libtalerwire.la \ + $(top_builddir)/src/bank-lib/libtalerbank.la \ + $(top_builddir)/src/bank-lib/libtalerfakebank.la \ + $(top_builddir)/src/util/libtalerutil.la + test_wire_plugin_transactions_taler_bank_SOURCES = \ test_wire_plugin_transactions_taler-bank.c test_wire_plugin_transactions_taler_bank_LDADD = \ diff --git a/src/wire-plugins/test_wire_plugin_legacy_taler-bank.c b/src/wire-plugins/test_wire_plugin_legacy_taler-bank.c new file mode 100644 index 000000000..a69d618cc --- /dev/null +++ b/src/wire-plugins/test_wire_plugin_legacy_taler-bank.c @@ -0,0 +1,394 @@ +/* + This file is part of TALER + (C) 2015-2018 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 wire/test_wire_plugin_legacy_taler-bank.c + * @brief Tests legacy history-range API against the Fakebank. + * Version for the real Python bank forthcoming. + * + * @author Christian Grothoff + * @author Marcello Stanisci + */ +#include "platform.h" +#include "taler_util.h" +#include "taler_wire_lib.h" +#include "taler_wire_plugin.h" +#include "taler_fakebank_lib.h" +#include + + +/** + * When does the test timeout? Right now, we expect this to be very + * fast. + */ +#define TIMEOUT GNUNET_TIME_UNIT_SECONDS + + +/** + * Destination account to use. + */ +static const char *dest_account = "payto://x-taler-bank/localhost:8088/42"; + +/** + * Origin account, section in the configuration file. + */ +static const char *my_account = "account-test"; + +/** + * Our configuration. + */ +static struct GNUNET_CONFIGURATION_Handle *cfg; + +/** + * Set to #GNUNET_SYSERR if the test failed. + */ +static int global_ret; + +/** + * The 'test' plugin that we are using for the test. + */ +static struct TALER_WIRE_Plugin *plugin; + +/** + * Active preparation handle, or NULL if not active. + */ +static struct TALER_WIRE_PrepareHandle *ph; + +/** + * Active execution handle, or NULL if not active. + */ +static struct TALER_WIRE_ExecuteHandle *eh; + +/** + * Handle to the bank. + */ +static struct TALER_FAKEBANK_Handle *fb; + +/** + * Handle to the history request. + */ +static struct TALER_WIRE_HistoryHandle *hh; + +/** + * Handle to the history-range request (the "legacy" bank API). + */ +static struct TALER_WIRE_HistoryHandle *hhr; + +/** + * Handle for the timeout task. + */ +static struct GNUNET_SCHEDULER_Task *tt; + +/** + * Which serial ID do we expect to get from /history? + */ +static uint64_t serial_target; + +/** + * Wire transfer identifier we are using. + */ +static struct TALER_WireTransferIdentifierRawP wtid; + +/** + * Number of total transaction to make it happen in the test. + */ +static int ntransactions = 5; + +/** + * Function called on shutdown (regular, error or CTRL-C). + * + * @param cls NULL + */ +static void +do_shutdown (void *cls) +{ + TALER_FAKEBANK_stop (fb); + fb = NULL; + if (NULL != eh) + { + plugin->execute_wire_transfer_cancel (plugin->cls, + eh); + eh = NULL; + } + if (NULL != ph) + { + plugin->prepare_wire_transfer_cancel (plugin->cls, + ph); + ph = NULL; + } + if (NULL != hh) + { + plugin->get_history_cancel (plugin->cls, + hh); + hh = NULL; + } + + if (NULL != hhr) + { + plugin->get_history_cancel (plugin->cls, + hhr); + hhr = NULL; + } + + if (NULL != tt) + { + GNUNET_SCHEDULER_cancel (tt); + tt = NULL; + } + TALER_WIRE_plugin_unload (plugin); +} + + +/** + * Function called on timeout. + * + * @param cls NULL + */ +static void +timeout_cb (void *cls) +{ + tt = NULL; + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); +} + + +/** + * Callbacks of this type are used to serve the result of asking + * the bank for the transaction history. + * + * @param cls closure + * @param ec taler status code + * @param dir direction of the transfer + * @param row_off identification of the position at + * which we are querying + * @param row_off_size number of bytes in @a row_off + * @param details details about the wire transfer + * @return #GNUNET_OK to continue, #GNUNET_SYSERR to + * abort iteration + */ +static int +history_result_cb + (void *cls, + enum TALER_ErrorCode ec, + enum TALER_BANK_Direction dir, + const void *row_off, + size_t row_off_size, + const struct TALER_WIRE_TransferDetails *details) +{ + uint64_t *serialp; + uint64_t serialh; + struct TALER_Amount amount; + + hh = NULL; + if ( (TALER_BANK_DIRECTION_NONE == dir) && + (GNUNET_OK == global_ret) ) + { + GNUNET_SCHEDULER_shutdown (); + return GNUNET_OK; + } + if (sizeof (uint64_t) != row_off_size) + { + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return GNUNET_SYSERR; + } + serialp = (uint64_t *) row_off; + serialh = GNUNET_ntohll (*serialp); + if (serialh != serial_target) + { + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return GNUNET_SYSERR; + } + GNUNET_assert (GNUNET_OK == + TALER_string_to_amount ("KUDOS:5.01", + &amount)); + if (0 != TALER_amount_cmp (&amount, + &details->amount)) + { + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return GNUNET_SYSERR; + } + if (0 != GNUNET_memcmp (&wtid, + &details->wtid)) + { + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return GNUNET_SYSERR; + } + global_ret = GNUNET_OK; + return GNUNET_OK; +} + + +/** + * Function called with the result from the execute step. + * + * @param cls closure + * @param success #GNUNET_OK on success, + * #GNUNET_SYSERR on failure + * @param row_id ID of the fresh transaction, + * in _network_ byte order. + * @param emsg NULL on success, otherwise an error message + */ +static void +confirmation_cb (void *cls, + int success, + const void *row_id, + size_t row_id_size, + const char *emsg) +{ + uint64_t tmp; + struct TALER_Amount amount; + + + eh = NULL; + if (GNUNET_OK != success) + { + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return; + } + + if (0 => --ntransactions) + { + /* Done, check all is correct here. */ + + if (GNUNET_YES) + { + /* Something went wrong. */ + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return; + } + + /* All correct, ending the test. */ + GNUNET_SCHEDULER_shutdown (); + return; + } + + /* Issue a new wire transfer! */ + GNUNET_assert (GNUNET_OK == + TALER_string_to_amount ("KUDOS:5.01", + &amount)); + ph = plugin->prepare_wire_transfer (plugin->cls, + my_account, + dest_account, + &amount, + "https://exchange.net/", + &wtid, + &prepare_cb, + NULL); +} + + +/** + * Callback with prepared transaction. + * + * @param cls closure + * @param buf transaction data to persist, NULL on error + * @param buf_size number of bytes in @a buf, 0 on error + */ +static void +prepare_cb (void *cls, + const char *buf, + size_t buf_size) +{ + + ph = NULL; + if (NULL == buf) + { + GNUNET_break (0); + global_ret = GNUNET_SYSERR; + GNUNET_SCHEDULER_shutdown (); + return; + } + plugin->execute_wire_transfer (plugin->cls, + buf, + buf_size, + &confirmation_cb, + NULL); +} + + +/** + * Run the test. + * + * @param cls NULL + */ +static void +run (void *cls) +{ + struct TALER_Amount amount; + + ntransactions = 5; + GNUNET_SCHEDULER_add_shutdown (&do_shutdown, + NULL); + tt = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + &timeout_cb, + NULL); + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, + &wtid, + sizeof (wtid)); + GNUNET_assert (GNUNET_OK == + TALER_string_to_amount ("KUDOS:5.01", + &amount)); + fb = TALER_FAKEBANK_start (8088); + + ph = plugin->prepare_wire_transfer (plugin->cls, + my_account, + dest_account, + &amount, + "https://exchange.net/", + &wtid, + &prepare_cb, + NULL); +} + + +int +main (int argc, + const char *const argv[]) +{ + + GNUNET_log_setup ("test-wire-plugin-legacy-test", + "WARNING", + NULL); + cfg = GNUNET_CONFIGURATION_create (); + GNUNET_assert (GNUNET_OK == + GNUNET_CONFIGURATION_load (cfg, + "test_wire_plugin_legacy_taler-bank.conf")); + global_ret = GNUNET_OK; + plugin = TALER_WIRE_plugin_load (cfg, + "taler_bank"); + GNUNET_assert (NULL != plugin); + GNUNET_SCHEDULER_run (&run, + NULL); + GNUNET_CONFIGURATION_destroy (cfg); + if (GNUNET_OK != global_ret) + return 1; + return 0; +} + +/* end of test_wire_plugin_legacy_taler-bank.c */ diff --git a/src/wire-plugins/test_wire_plugin_legacy_taler-bank.conf b/src/wire-plugins/test_wire_plugin_legacy_taler-bank.conf new file mode 100644 index 000000000..d6d2e8346 --- /dev/null +++ b/src/wire-plugins/test_wire_plugin_legacy_taler-bank.conf @@ -0,0 +1,12 @@ +# This file is in the public domain. +# +[account-test] +# This is the response we give out for the /wire request. It provides +# wallets with the bank information for transfers to the exchange. + +TALER_BANK_AUTH_METHOD = NONE + +URL = payto://x-taler-bank/localhost:8088/2 + +[taler] +CURRENCY = "KUDOS" -- cgit v1.2.3