From 17cfbced1dff07ee058997e88e027e7fd4627445 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 27 Mar 2020 17:28:33 +0100 Subject: fix inconsistency in field naming --- src/auditor/Makefile.am | 1 + src/auditordb/test_auditordb.c | 1 + src/exchange/Makefile.am | 1 + src/exchangedb/test_exchangedb.c | 59 +- src/exchangedb/test_exchangedb_auditors.c | 2 + src/exchangedb/test_exchangedb_denomkeys.c | 3 + src/exchangedb/test_exchangedb_fees.c | 2 + src/exchangedb/test_exchangedb_signkeys.c | 3 + src/json/test_json.c | 4 +- src/json/test_json_wire.c | 2 + src/pq/test_pq.c | 3 +- src/testing/Makefile.am | 4 +- src/testing/testing_api_cmd_deposits_get.c | 379 +++++++++++ src/testing/testing_api_cmd_exec_auditor-sign.c | 3 +- src/testing/testing_api_cmd_exec_closer.c | 2 + src/testing/testing_api_cmd_exec_keyup.c | 1 + src/testing/testing_api_cmd_track.c | 805 ------------------------ src/testing/testing_api_cmd_transfer_get.c | 459 ++++++++++++++ src/testing/testing_api_cmd_wait.c | 1 + src/testing/testing_api_cmd_wire.c | 6 +- src/testing/testing_api_cmd_withdraw.c | 10 +- src/util/test_amount.c | 2 + src/util/test_crypto.c | 6 +- src/util/test_payto.c | 2 + src/util/test_url.c | 2 + 25 files changed, 938 insertions(+), 825 deletions(-) create mode 100644 src/testing/testing_api_cmd_deposits_get.c delete mode 100644 src/testing/testing_api_cmd_track.c create mode 100644 src/testing/testing_api_cmd_transfer_get.c diff --git a/src/auditor/Makefile.am b/src/auditor/Makefile.am index dbf982d10..36a32dc5b 100644 --- a/src/auditor/Makefile.am +++ b/src/auditor/Makefile.am @@ -172,6 +172,7 @@ check_SCRIPTS = \ test-auditor.sh \ test-revocation.sh +.NOTPARALLEL: TESTS = $(check_SCRIPTS) EXTRA_DIST = \ diff --git a/src/auditordb/test_auditordb.c b/src/auditordb/test_auditordb.c index 48e250a2c..201d61b80 100644 --- a/src/auditordb/test_auditordb.c +++ b/src/auditordb/test_auditordb.c @@ -781,6 +781,7 @@ main (int argc, char *testname; struct GNUNET_CONFIGURATION_Handle *cfg; + (void) argc; result = -1; if (NULL == (plugin_name = strrchr (argv[0], (int) '-'))) { diff --git a/src/exchange/Makefile.am b/src/exchange/Makefile.am index 2fc601e77..4876b3074 100644 --- a/src/exchange/Makefile.am +++ b/src/exchange/Makefile.am @@ -117,6 +117,7 @@ check_SCRIPTS += \ test_taler_exchange_httpd_afl.sh endif +.NOTPARALLEL: TESTS = \ $(check_SCRIPTS) diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index 96fbe3dc2..61bdb4813 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -75,6 +75,11 @@ dead_prepare_cb (void *cls, const char *buf, size_t buf_size) { + (void) cls; + (void) rowid; + (void) wire_method; + (void) buf; + (void) buf_size; GNUNET_assert (0); } @@ -344,6 +349,12 @@ never_called_cb (void *cls, const struct TALER_TransferPrivateKeyP *tprivs, const struct TALER_TransferPublicKeyP *tp) { + (void) cls; + (void) num_freshcoins; + (void) rrcs; + (void) num_tprivs; + (void) tprivs; + (void) tp; GNUNET_assert (0); /* should never be called! */ } @@ -361,14 +372,15 @@ never_called_cb (void *cls, * @param tpr transfer public key information */ static void -check_refresh_reveal_cb (void *cls, - uint32_t num_freshcoins, - const struct - TALER_EXCHANGEDB_RefreshRevealedCoin *rrcs, - unsigned int num_tprivs, - const struct TALER_TransferPrivateKeyP *tprivsr, - const struct TALER_TransferPublicKeyP *tpr) +check_refresh_reveal_cb ( + void *cls, + uint32_t num_freshcoins, + const struct TALER_EXCHANGEDB_RefreshRevealedCoin *rrcs, + unsigned int num_tprivs, + const struct TALER_TransferPrivateKeyP *tprivsr, + const struct TALER_TransferPublicKeyP *tpr) { + (void) cls; /* compare the refresh commit coin arrays */ for (unsigned int cnt = 0; cnt < num_freshcoins; cnt++) { @@ -426,6 +438,13 @@ audit_refresh_session_cb (void *cls, uint32_t noreveal_index, const struct TALER_RefreshCommitmentP *rc) { + (void) cls; + (void) rowid; + (void) denom_pub; + (void) coin_sig; + (void) amount_with_fee; + (void) noreveal_index; + (void) rc; auditor_row_cnt++; return GNUNET_OK; } @@ -450,6 +469,8 @@ handle_link_data_cb (void *cls, const struct TALER_TransferPublicKeyP *transfer_pub, const struct TALER_EXCHANGEDB_LinkList *ldl) { + (void) cls; + (void) transfer_pub; for (const struct TALER_EXCHANGEDB_LinkList *ldlp = ldl; NULL != ldlp; ldlp = ldlp->next) @@ -931,6 +952,15 @@ audit_refund_cb (void *cls, uint64_t rtransaction_id, const struct TALER_Amount *amount_with_fee) { + (void) cls; + (void) rowid; + (void) denom_pub; + (void) coin_pub; + (void) merchant_pub; + (void) merchant_sig; + (void) h_contract_terms; + (void) rtransaction_id; + (void) amount_with_fee; auditor_row_cnt++; return GNUNET_OK; } @@ -957,6 +987,13 @@ audit_reserve_in_cb (void *cls, uint64_t wire_reference, struct GNUNET_TIME_Absolute execution_date) { + (void) cls; + (void) rowid; + (void) reserve_pub; + (void) credit; + (void) sender_account_details; + (void) wire_reference; + (void) execution_date; auditor_row_cnt++; return GNUNET_OK; } @@ -985,6 +1022,14 @@ audit_reserve_out_cb (void *cls, struct GNUNET_TIME_Absolute execution_date, const struct TALER_Amount *amount_with_fee) { + (void) cls; + (void) rowid; + (void) h_blind_ev; + (void) denom_pub; + (void) reserve_pub; + (void) reserve_sig; + (void) execution_date; + (void) amount_with_fee; auditor_row_cnt++; return GNUNET_OK; } diff --git a/src/exchangedb/test_exchangedb_auditors.c b/src/exchangedb/test_exchangedb_auditors.c index 518326f5e..efd3ffe14 100644 --- a/src/exchangedb/test_exchangedb_auditors.c +++ b/src/exchangedb/test_exchangedb_auditors.c @@ -114,6 +114,8 @@ main (int argc, struct GNUNET_CONFIGURATION_Handle *cfg = NULL; int ret; + (void) argc; + (void) argv; ret = 1; GNUNET_log_setup ("test-exchangedb-auditors", "WARNING", diff --git a/src/exchangedb/test_exchangedb_denomkeys.c b/src/exchangedb/test_exchangedb_denomkeys.c index 0b3c71776..12add14da 100644 --- a/src/exchangedb/test_exchangedb_denomkeys.c +++ b/src/exchangedb/test_exchangedb_denomkeys.c @@ -49,6 +49,7 @@ dki_iter (void *cls, { const struct TALER_EXCHANGEDB_DenominationKey *exp = cls; + (void) alias; if (0 != GNUNET_memcmp (&exp->issue, &dki->issue)) { @@ -124,6 +125,8 @@ main (int argc, int ret; struct GNUNET_TIME_Absolute start; + (void) argc; + (void) argv; ret = 1; GNUNET_log_setup ("test-exchangedb-denomkeys", "WARNING", diff --git a/src/exchangedb/test_exchangedb_fees.c b/src/exchangedb/test_exchangedb_fees.c index cb33e2de8..7cd890eb3 100644 --- a/src/exchangedb/test_exchangedb_fees.c +++ b/src/exchangedb/test_exchangedb_fees.c @@ -60,6 +60,8 @@ main (int argc, int ret; unsigned int year; + (void) argc; + (void) argv; GNUNET_log_setup ("test-exchangedb-fees", "WARNING", NULL); diff --git a/src/exchangedb/test_exchangedb_signkeys.c b/src/exchangedb/test_exchangedb_signkeys.c index 4fb112f35..3969c9708 100644 --- a/src/exchangedb/test_exchangedb_signkeys.c +++ b/src/exchangedb/test_exchangedb_signkeys.c @@ -47,6 +47,7 @@ ski_iter (void *cls, { const struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP *exp = cls; + (void) filename; if (0 != GNUNET_memcmp (ski, exp)) { @@ -66,6 +67,8 @@ main (int argc, char *tmpfile; int ret; + (void) argc; + (void) argv; ret = 1; tmpfile = NULL; GNUNET_log_setup ("test-exchangedb-signkeys", diff --git a/src/json/test_json.c b/src/json/test_json.c index d2f1e2b73..732a3d774 100644 --- a/src/json/test_json.c +++ b/src/json/test_json.c @@ -30,7 +30,7 @@ * @return 0 on success */ static int -test_amount () +test_amount (void) { json_t *j; struct TALER_Amount a1; @@ -60,6 +60,8 @@ int main (int argc, const char *const argv[]) { + (void) argc; + (void) argv; GNUNET_log_setup ("test-json", "WARNING", NULL); diff --git a/src/json/test_json_wire.c b/src/json/test_json_wire.c index c4d49de7a..3b2123e26 100644 --- a/src/json/test_json_wire.c +++ b/src/json/test_json_wire.c @@ -35,6 +35,8 @@ main (int argc, const char *payto = "payto://x-taler-bank/42"; char *p; + (void) argc; + (void) argv; GNUNET_log_setup ("test-json-wire", "WARNING", NULL); diff --git a/src/pq/test_pq.c b/src/pq/test_pq.c index 7eb62efec..52e92b561 100644 --- a/src/pq/test_pq.c +++ b/src/pq/test_pq.c @@ -175,10 +175,11 @@ main (int argc, ")"), GNUNET_PQ_EXECUTE_STATEMENT_END }; - struct GNUNET_PQ_Context *conn; int ret; + (void) argc; + (void) argv; GNUNET_log_setup ("test-pq", "WARNING", NULL); diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am index 7a1a6422a..7b36a3aed 100644 --- a/src/testing/Makefile.am +++ b/src/testing/Makefile.am @@ -49,6 +49,7 @@ libtalertesting_la_SOURCES = \ testing_api_cmd_batch.c \ testing_api_cmd_check_keys.c \ testing_api_cmd_deposit.c \ + testing_api_cmd_deposits_get.c \ testing_api_cmd_exec_aggregator.c \ testing_api_cmd_exec_auditor-sign.c \ testing_api_cmd_exec_closer.c \ @@ -63,7 +64,7 @@ libtalertesting_la_SOURCES = \ testing_api_cmd_sleep.c \ testing_api_cmd_stat.c \ testing_api_cmd_status.c \ - testing_api_cmd_track.c \ + testing_api_cmd_transfer_get.c \ testing_api_cmd_wait.c \ testing_api_cmd_wire.c \ testing_api_cmd_withdraw.c \ @@ -109,6 +110,7 @@ libtalertesting_la_LIBADD = \ AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH; +.NOTPARALLEL: check_PROGRAMS = \ test_auditor_api \ test_auditor_api_version \ diff --git a/src/testing/testing_api_cmd_deposits_get.c b/src/testing/testing_api_cmd_deposits_get.c new file mode 100644 index 000000000..8eab8f51b --- /dev/null +++ b/src/testing/testing_api_cmd_deposits_get.c @@ -0,0 +1,379 @@ +/* + This file is part of TALER + Copyright (C) 2014-2020 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 testing/testing_api_cmd_deposits_get.c + * @brief Implement the testing CMDs for the /deposits/ GET operations. + * @author Marcello Stanisci + */ +#include "platform.h" +#include "taler_json_lib.h" +#include +#include "taler_testing_lib.h" + +/** + * State for a "track transaction" CMD. + */ +struct TrackTransactionState +{ + + /** + * If non NULL, will provide a WTID to be compared against + * the one returned by the "track transaction" operation. + */ + const char *bank_transfer_reference; + + /** + * The WTID associated by the transaction being tracked. + */ + struct TALER_WireTransferIdentifierRawP wtid; + + /** + * Expected HTTP response code. + */ + unsigned int expected_response_code; + + /** + * Reference to any operation that can provide a transaction. + * Will be the transaction to track. + */ + const char *transaction_reference; + + /** + * Index of the coin involved in the transaction. Recall: + * at the exchange, the tracking is done _per coin_. + */ + unsigned int coin_index; + + /** + * Handle to the "track transaction" pending operation. + */ + struct TALER_EXCHANGE_DepositGetHandle *tth; + + /** + * Interpreter state. + */ + struct TALER_TESTING_Interpreter *is; +}; + + +/** + * Checks what is returned by the "track transaction" operation. + * Checks that the HTTP response code is acceptable, and - if the + * right reference is non NULL - that the wire transfer subject + * line matches our expectations. + * + * @param cls closure. + * @param http_status HTTP status code we got. + * @param ec taler-specific error code. + * @param exchange_pub public key of the exchange + * @param json original json reply (may include signatures, those + * have then been validated already). + * @param wtid wire transfer identifier, NULL if exchange did not + * execute the transaction yet. + * @param execution_time actual or planned execution time for the + * wire transfer. + * @param coin_contribution contribution to the total amount of + * the deposited coin (can be NULL). + */ +static void +deposit_wtid_cb (void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const struct TALER_ExchangePublicKeyP *exchange_pub, + const json_t *json, + const struct TALER_WireTransferIdentifierRawP *wtid, + struct GNUNET_TIME_Absolute execution_time, + const struct TALER_Amount *coin_contribution) +{ + struct TrackTransactionState *tts = cls; + struct TALER_TESTING_Interpreter *is = tts->is; + struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; + + (void) coin_contribution; + (void) exchange_pub; + (void) ec; + (void) execution_time; + tts->tth = NULL; + if (tts->expected_response_code != http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u to command %s in %s:%u\n", + http_status, + cmd->label, + __FILE__, + __LINE__); + json_dumpf (json, stderr, 0); + TALER_TESTING_interpreter_fail (is); + return; + } + switch (http_status) + { + case MHD_HTTP_OK: + tts->wtid = *wtid; + if (NULL != tts->bank_transfer_reference) + { + const struct TALER_TESTING_Command *bank_transfer_cmd; + const struct TALER_WireTransferIdentifierRawP *wtid_want; + + /* _this_ wire transfer subject line. */ + bank_transfer_cmd = TALER_TESTING_interpreter_lookup_command + (is, tts->bank_transfer_reference); + if (NULL == bank_transfer_cmd) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (GNUNET_OK != + TALER_TESTING_get_trait_wtid + (bank_transfer_cmd, 0, &wtid_want)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + /* Compare that expected and gotten subjects match. */ + if (0 != GNUNET_memcmp (wtid, + wtid_want)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + } + break; + case MHD_HTTP_ACCEPTED: + /* allowed, nothing to check here */ + break; + case MHD_HTTP_NOT_FOUND: + /* allowed, nothing to check here */ + break; + default: + GNUNET_break (0); + break; + } + TALER_TESTING_interpreter_next (tts->is); +} + + +/** + * Run the command. + * + * @param cls closure. + * @param cmd the command to execute. + * @param is the interpreter state. + */ +static void +track_transaction_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct TrackTransactionState *tts = cls; + const struct TALER_TESTING_Command *transaction_cmd; + const struct TALER_CoinSpendPrivateKeyP *coin_priv; + struct TALER_CoinSpendPublicKeyP coin_pub; + const json_t *contract_terms; + const json_t *wire_details; + struct GNUNET_HashCode h_wire_details; + struct GNUNET_HashCode h_contract_terms; + const struct TALER_MerchantPrivateKeyP *merchant_priv; + + (void) cmd; + tts->is = is; + transaction_cmd + = TALER_TESTING_interpreter_lookup_command (tts->is, + tts->transaction_reference); + if (NULL == transaction_cmd) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + if (GNUNET_OK != + TALER_TESTING_get_trait_coin_priv (transaction_cmd, + tts->coin_index, + &coin_priv)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv, + &coin_pub.eddsa_pub); + + /* Get the strings.. */ + if (GNUNET_OK != + TALER_TESTING_get_trait_wire_details (transaction_cmd, + 0, + &wire_details)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + if (GNUNET_OK != + TALER_TESTING_get_trait_contract_terms (transaction_cmd, + 0, + &contract_terms)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + if ( (NULL == wire_details) || + (NULL == contract_terms) ) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + /* Should not fail here, json has been parsed already */ + GNUNET_assert + ( (GNUNET_OK == + TALER_JSON_merchant_wire_signature_hash (wire_details, + &h_wire_details)) && + (GNUNET_OK == + TALER_JSON_hash (contract_terms, + &h_contract_terms)) ); + + if (GNUNET_OK != + TALER_TESTING_get_trait_merchant_priv (transaction_cmd, + 0, + &merchant_priv)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + tts->tth = TALER_EXCHANGE_deposits_get (is->exchange, + merchant_priv, + &h_wire_details, + &h_contract_terms, + &coin_pub, + &deposit_wtid_cb, + tts); + GNUNET_assert (NULL != tts->tth); +} + + +/** + * Cleanup the state from a "track transaction" CMD, and possibly + * cancel a operation thereof. + * + * @param cls closure. + * @param cmd the command which is being cleaned up. + */ +static void +track_transaction_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct TrackTransactionState *tts = cls; + + if (NULL != tts->tth) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Command %u (%s) did not complete\n", + tts->is->ip, + cmd->label); + TALER_EXCHANGE_deposits_get_cancel (tts->tth); + tts->tth = NULL; + } + GNUNET_free (tts); +} + + +/** + * Offer internal data from a "track transaction" CMD. + * + * @param cls closure. + * @param[out] ret result (could be anything). + * @param trait name of the trait. + * @param index index number of the object to offer. + * @return #GNUNET_OK on success. + */ +static int +track_transaction_traits (void *cls, + const void **ret, + const char *trait, + unsigned int index) +{ + struct TrackTransactionState *tts = cls; + struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_wtid (0, &tts->wtid), + TALER_TESTING_trait_end () + }; + + return TALER_TESTING_get_trait (traits, + ret, + trait, + index); +} + + +/** + * Create a "track transaction" command. + * + * @param label the command label. + * @param transaction_reference reference to a deposit operation, + * will be used to get the input data for the track. + * @param coin_index index of the coin involved in the transaction. + * @param expected_response_code expected HTTP response code. + * @param bank_transfer_reference reference to a command that + * can offer a WTID so as to check that against what WTID + * the tracked operation has. Set as NULL if not needed. + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_track_transaction (const char *label, + const char *transaction_reference, + unsigned int coin_index, + unsigned int expected_response_code, + const char *bank_transfer_reference) +{ + struct TrackTransactionState *tts; + + tts = GNUNET_new (struct TrackTransactionState); + tts->transaction_reference = transaction_reference; + tts->expected_response_code = expected_response_code; + tts->bank_transfer_reference = bank_transfer_reference; + tts->coin_index = coin_index; + { + struct TALER_TESTING_Command cmd = { + .cls = tts, + .label = label, + .run = &track_transaction_run, + .cleanup = &track_transaction_cleanup, + .traits = &track_transaction_traits + }; + + return cmd; + } +} + + +/* end of testing_api_cmd_deposits_get.c */ diff --git a/src/testing/testing_api_cmd_exec_auditor-sign.c b/src/testing/testing_api_cmd_exec_auditor-sign.c index fec7da7cb..4c88ccca0 100644 --- a/src/testing/testing_api_cmd_exec_auditor-sign.c +++ b/src/testing/testing_api_cmd_exec_auditor-sign.c @@ -65,12 +65,12 @@ auditor_sign_run (void *cls, struct TALER_TESTING_Interpreter *is) { struct AuditorSignState *ass = cls; - struct GNUNET_CONFIGURATION_Handle *cfg; char *test_home_dir; char *exchange_master_pub; struct GNUNET_TIME_Absolute now; + (void) cmd; cfg = GNUNET_CONFIGURATION_create (); if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, ass->config_filename)) @@ -157,6 +157,7 @@ auditor_sign_cleanup (void *cls, { struct AuditorSignState *ass = cls; + (void) cmd; if (NULL != ass->auditor_sign_proc) { GNUNET_break (0 == GNUNET_OS_process_kill diff --git a/src/testing/testing_api_cmd_exec_closer.c b/src/testing/testing_api_cmd_exec_closer.c index d40c563c2..17eed7a88 100644 --- a/src/testing/testing_api_cmd_exec_closer.c +++ b/src/testing/testing_api_cmd_exec_closer.c @@ -60,6 +60,7 @@ closer_run (void *cls, { struct CloserState *as = cls; + (void) cmd; as->closer_proc = GNUNET_OS_start_process (GNUNET_NO, GNUNET_OS_INHERIT_STD_ALL, @@ -92,6 +93,7 @@ closer_cleanup (void *cls, { struct CloserState *as = cls; + (void) cmd; if (NULL != as->closer_proc) { GNUNET_break (0 == diff --git a/src/testing/testing_api_cmd_exec_keyup.c b/src/testing/testing_api_cmd_exec_keyup.c index cc4fb9e2e..4283c7eae 100644 --- a/src/testing/testing_api_cmd_exec_keyup.c +++ b/src/testing/testing_api_cmd_exec_keyup.c @@ -125,6 +125,7 @@ keyup_cleanup (void *cls, { struct KeyupState *ks = cls; + (void) cmd; if (NULL != ks->keyup_proc) { GNUNET_break (0 == diff --git a/src/testing/testing_api_cmd_track.c b/src/testing/testing_api_cmd_track.c deleted file mode 100644 index 6ebef6933..000000000 --- a/src/testing/testing_api_cmd_track.c +++ /dev/null @@ -1,805 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2014-2020 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 testing/testing_api_cmd_track.c - * @brief Implement the testing CMDs for the /track operations. - * @author Marcello Stanisci - */ -#include "platform.h" -#include "taler_json_lib.h" -#include -#include "taler_testing_lib.h" - -/** - * State for a "track transaction" CMD. - */ -struct TrackTransactionState -{ - - /** - * If non NULL, will provide a WTID to be compared against - * the one returned by the "track transaction" operation. - */ - const char *bank_transfer_reference; - - /** - * The WTID associated by the transaction being tracked. - */ - struct TALER_WireTransferIdentifierRawP wtid; - - /** - * Expected HTTP response code. - */ - unsigned int expected_response_code; - - /** - * Reference to any operation that can provide a transaction. - * Will be the transaction to track. - */ - const char *transaction_reference; - - /** - * Index of the coin involved in the transaction. Recall: - * at the exchange, the tracking is done _per coin_. - */ - unsigned int coin_index; - - /** - * Handle to the "track transaction" pending operation. - */ - struct TALER_EXCHANGE_DepositGetHandle *tth; - - /** - * Interpreter state. - */ - struct TALER_TESTING_Interpreter *is; -}; - - -/** - * State for a "track transfer" CMD. - */ -struct TrackTransferState -{ - - /** - * Expected amount for the WTID being tracked. - */ - const char *expected_total_amount; - - /** - * Expected fee for this WTID. - */ - const char *expected_wire_fee; - - /** - * Expected HTTP response code. - */ - unsigned int expected_response_code; - - /** - * Reference to any operation that can provide a WTID. - * Will be the WTID to track. - */ - const char *wtid_reference; - - /** - * Reference to any operation that can provide wire details. - * Those wire details will then be matched against the credit - * bank account of the tracked WTID. This way we can test that - * a wire transfer paid back one particular bank account. - */ - const char *wire_details_reference; - - /** - * Reference to any operation that can provide an amount. - * This way we can check that the transferred amount matches - * our expectations. - */ - const char *total_amount_reference; - - /** - * Index to the WTID to pick, in case @a wtid_reference has - * many on offer. - */ - unsigned int index; - - /** - * Handle to a pending "track transfer" operation. - */ - struct TALER_EXCHANGE_TransfersGetHandle *tth; - - /** - * Interpreter state. - */ - struct TALER_TESTING_Interpreter *is; -}; - - -/** - * Checks what is returned by the "track transaction" operation. - * Checks that the HTTP response code is acceptable, and - if the - * right reference is non NULL - that the wire transfer subject - * line matches our expectations. - * - * @param cls closure. - * @param http_status HTTP status code we got. - * @param ec taler-specific error code. - * @param exchange_pub public key of the exchange - * @param json original json reply (may include signatures, those - * have then been validated already). - * @param wtid wire transfer identifier, NULL if exchange did not - * execute the transaction yet. - * @param execution_time actual or planned execution time for the - * wire transfer. - * @param coin_contribution contribution to the total amount of - * the deposited coin (can be NULL). - */ -static void -deposit_wtid_cb (void *cls, - unsigned int http_status, - enum TALER_ErrorCode ec, - const struct TALER_ExchangePublicKeyP *exchange_pub, - const json_t *json, - const struct TALER_WireTransferIdentifierRawP *wtid, - struct GNUNET_TIME_Absolute execution_time, - const struct TALER_Amount *coin_contribution) -{ - struct TrackTransactionState *tts = cls; - struct TALER_TESTING_Interpreter *is = tts->is; - struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; - - (void) coin_contribution; - (void) exchange_pub; - tts->tth = NULL; - if (tts->expected_response_code != http_status) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected response code %u to command %s in %s:%u\n", - http_status, - cmd->label, - __FILE__, - __LINE__); - json_dumpf (json, stderr, 0); - TALER_TESTING_interpreter_fail (is); - return; - } - switch (http_status) - { - case MHD_HTTP_OK: - tts->wtid = *wtid; - if (NULL != tts->bank_transfer_reference) - { - const struct TALER_TESTING_Command *bank_transfer_cmd; - const struct TALER_WireTransferIdentifierRawP *wtid_want; - - /* _this_ wire transfer subject line. */ - bank_transfer_cmd = TALER_TESTING_interpreter_lookup_command - (is, tts->bank_transfer_reference); - if (NULL == bank_transfer_cmd) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (GNUNET_OK != - TALER_TESTING_get_trait_wtid - (bank_transfer_cmd, 0, &wtid_want)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - /* Compare that expected and gotten subjects match. */ - if (0 != GNUNET_memcmp (wtid, - wtid_want)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - } - break; - case MHD_HTTP_ACCEPTED: - /* allowed, nothing to check here */ - break; - case MHD_HTTP_NOT_FOUND: - /* allowed, nothing to check here */ - break; - default: - GNUNET_break (0); - break; - } - TALER_TESTING_interpreter_next (tts->is); -} - - -/** - * Run the command. - * - * @param cls closure. - * @param cmd the command to execute. - * @param is the interpreter state. - */ -static void -track_transaction_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - struct TrackTransactionState *tts = cls; - const struct TALER_TESTING_Command *transaction_cmd; - const struct TALER_CoinSpendPrivateKeyP *coin_priv; - struct TALER_CoinSpendPublicKeyP coin_pub; - const json_t *contract_terms; - const json_t *wire_details; - struct GNUNET_HashCode h_wire_details; - struct GNUNET_HashCode h_contract_terms; - const struct TALER_MerchantPrivateKeyP *merchant_priv; - - tts->is = is; - transaction_cmd - = TALER_TESTING_interpreter_lookup_command (tts->is, - tts->transaction_reference); - if (NULL == transaction_cmd) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - if (GNUNET_OK != - TALER_TESTING_get_trait_coin_priv (transaction_cmd, - tts->coin_index, - &coin_priv)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv, - &coin_pub.eddsa_pub); - - /* Get the strings.. */ - if (GNUNET_OK != - TALER_TESTING_get_trait_wire_details (transaction_cmd, - 0, - &wire_details)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - if (GNUNET_OK != - TALER_TESTING_get_trait_contract_terms (transaction_cmd, - 0, - &contract_terms)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - if ( (NULL == wire_details) || - (NULL == contract_terms) ) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - /* Should not fail here, json has been parsed already */ - GNUNET_assert - ( (GNUNET_OK == - TALER_JSON_merchant_wire_signature_hash (wire_details, - &h_wire_details)) && - (GNUNET_OK == - TALER_JSON_hash (contract_terms, - &h_contract_terms)) ); - - if (GNUNET_OK != - TALER_TESTING_get_trait_merchant_priv (transaction_cmd, - 0, - &merchant_priv)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - tts->tth = TALER_EXCHANGE_deposits_get (is->exchange, - merchant_priv, - &h_wire_details, - &h_contract_terms, - &coin_pub, - &deposit_wtid_cb, - tts); - GNUNET_assert (NULL != tts->tth); -} - - -/** - * Cleanup the state from a "track transaction" CMD, and possibly - * cancel a operation thereof. - * - * @param cls closure. - * @param cmd the command which is being cleaned up. - */ -static void -track_transaction_cleanup (void *cls, - const struct TALER_TESTING_Command *cmd) -{ - struct TrackTransactionState *tts = cls; - - if (NULL != tts->tth) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Command %u (%s) did not complete\n", - tts->is->ip, - cmd->label); - TALER_EXCHANGE_deposits_get_cancel (tts->tth); - tts->tth = NULL; - } - GNUNET_free (tts); -} - - -/** - * Offer internal data from a "track transaction" CMD. - * - * @param cls closure. - * @param[out] ret result (could be anything). - * @param trait name of the trait. - * @param index index number of the object to offer. - * @return #GNUNET_OK on success. - */ -static int -track_transaction_traits (void *cls, - const void **ret, - const char *trait, - unsigned int index) -{ - struct TrackTransactionState *tts = cls; - struct TALER_TESTING_Trait traits[] = { - TALER_TESTING_make_trait_wtid (0, &tts->wtid), - TALER_TESTING_trait_end () - }; - - return TALER_TESTING_get_trait (traits, - ret, - trait, - index); -} - - -/** - * Create a "track transaction" command. - * - * @param label the command label. - * @param transaction_reference reference to a deposit operation, - * will be used to get the input data for the track. - * @param coin_index index of the coin involved in the transaction. - * @param expected_response_code expected HTTP response code. - * @param bank_transfer_reference reference to a command that - * can offer a WTID so as to check that against what WTID - * the tracked operation has. Set as NULL if not needed. - * @return the command. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_track_transaction (const char *label, - const char *transaction_reference, - unsigned int coin_index, - unsigned int expected_response_code, - const char *bank_transfer_reference) -{ - struct TrackTransactionState *tts; - - tts = GNUNET_new (struct TrackTransactionState); - tts->transaction_reference = transaction_reference; - tts->expected_response_code = expected_response_code; - tts->bank_transfer_reference = bank_transfer_reference; - tts->coin_index = coin_index; - { - struct TALER_TESTING_Command cmd = { - .cls = tts, - .label = label, - .run = &track_transaction_run, - .cleanup = &track_transaction_cleanup, - .traits = &track_transaction_traits - }; - - return cmd; - } -} - - -/** - * Cleanup the state for a "track transfer" CMD, and possibly - * cancel a pending operation thereof. - * - * @param cls closure. - * @param cmd the command which is being cleaned up. - */ -static void -track_transfer_cleanup (void *cls, - const struct TALER_TESTING_Command *cmd) -{ - - struct TrackTransferState *tts = cls; - - if (NULL != tts->tth) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Command %u (%s) did not complete\n", - tts->is->ip, - cmd->label); - TALER_EXCHANGE_transfers_get_cancel (tts->tth); - tts->tth = NULL; - } - GNUNET_free (tts); -} - - -/** - * Check whether the HTTP response code from a "track transfer" - * operation is acceptable, and all other values like total amount, - * wire fees and hashed wire details as well. - * - * @param cls closure. - * @param http_status HTTP status code we got. - * @param ec taler-specific error code. - * @param exchange_pub public key the exchange used for signing - * the response. - * @param json original json reply (may include signatures, those - * have then been validated already). - * @param h_wire hash of the wire transfer address the transfer - * went to, or NULL on error. - * @param execution_time time when the exchange claims to have - * performed the wire transfer. - * @param total_amount total amount of the wire transfer, or NULL - * if the exchange could not provide any @a wtid (set only - * if @a http_status is "200 OK"). - * @param wire_fee wire fee that was charged by the exchange. - * @param details_length length of the @a details array. - * @param details array with details about the combined - * transactions. - */ -static void -track_transfer_cb (void *cls, - unsigned int http_status, - enum TALER_ErrorCode ec, - const struct TALER_ExchangePublicKeyP *exchange_pub, - const json_t *json, - const struct GNUNET_HashCode *h_wire, - struct GNUNET_TIME_Absolute execution_time, - const struct TALER_Amount *total_amount, - const struct TALER_Amount *wire_fee, - unsigned int details_length, - const struct TALER_TrackTransferDetails *details) -{ - struct TrackTransferState *tts = cls; - struct TALER_TESTING_Interpreter *is = tts->is; - struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; - struct TALER_Amount expected_amount; - - (void) exchange_pub; - tts->tth = NULL; - if (tts->expected_response_code != http_status) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected response code %u to command %s in %s:%u\n", - http_status, - cmd->label, - __FILE__, - __LINE__); - json_dumpf (json, stderr, 0); - TALER_TESTING_interpreter_fail (is); - return; - } - - switch (http_status) - { - case MHD_HTTP_OK: - if (NULL == tts->expected_total_amount) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - if (NULL == tts->expected_wire_fee) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (GNUNET_OK != - TALER_string_to_amount (tts->expected_total_amount, - &expected_amount)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - if (0 != TALER_amount_cmp (total_amount, - &expected_amount)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Total amount mismatch to command %s - " - "%s vs %s\n", - cmd->label, - TALER_amount_to_string (total_amount), - TALER_amount_to_string (&expected_amount)); - json_dumpf (json, stderr, 0); - fprintf (stderr, "\n"); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (GNUNET_OK != - TALER_string_to_amount (tts->expected_wire_fee, - &expected_amount)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (0 != TALER_amount_cmp (wire_fee, - &expected_amount)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Wire fee mismatch to command %s\n", - cmd->label); - json_dumpf (json, stderr, 0); - TALER_TESTING_interpreter_fail (is); - return; - } - - /** - * Optionally checking: (1) wire-details for this transfer - * match the ones from a referenced "deposit" operation - - * or any operation that could provide wire-details. (2) - * Total amount for this transfer matches the one from any - * referenced command that could provide one. - */if (NULL != tts->wire_details_reference) - { - const struct TALER_TESTING_Command *wire_details_cmd; - const json_t *wire_details; - struct GNUNET_HashCode h_wire_details; - - if (NULL == (wire_details_cmd - = TALER_TESTING_interpreter_lookup_command - (is, tts->wire_details_reference))) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (GNUNET_OK != - TALER_TESTING_get_trait_wire_details (wire_details_cmd, - 0, - &wire_details)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - GNUNET_assert - (GNUNET_OK == - TALER_JSON_merchant_wire_signature_hash (wire_details, - &h_wire_details)); - - if (0 != GNUNET_memcmp (&h_wire_details, - h_wire)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Wire hash missmath to command %s\n", - cmd->label); - json_dumpf (json, stderr, 0); - TALER_TESTING_interpreter_fail (is); - return; - } - } - if (NULL != tts->total_amount_reference) - { - const struct TALER_TESTING_Command *total_amount_cmd; - const struct TALER_Amount *total_amount_from_reference; - - if (NULL == (total_amount_cmd - = TALER_TESTING_interpreter_lookup_command - (is, tts->total_amount_reference))) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (GNUNET_OK != - TALER_TESTING_get_trait_amount_obj (total_amount_cmd, - 0, - &total_amount_from_reference)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (is); - return; - } - - if (0 != TALER_amount_cmp (total_amount, - total_amount_from_reference)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Amount missmath to command %s\n", - cmd->label); - json_dumpf (json, stderr, 0); - TALER_TESTING_interpreter_fail (is); - return; - } - } - } - TALER_TESTING_interpreter_next (is); -} - - -/** - * Run the command. - * - * @param cls closure. - * @param cmd the command under execution. - * @param is the interpreter state. - */ -static void -track_transfer_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - /* looking for a wtid to track .. */ - struct TrackTransferState *tts = cls; - struct TALER_WireTransferIdentifierRawP wtid; - const struct TALER_WireTransferIdentifierRawP *wtid_ptr; - - /* If no reference is given, we'll use a all-zeros - * WTID */ - memset (&wtid, 0, sizeof (wtid)); - wtid_ptr = &wtid; - - tts->is = is; - if (NULL != tts->wtid_reference) - { - const struct TALER_TESTING_Command *wtid_cmd; - - wtid_cmd = TALER_TESTING_interpreter_lookup_command - (tts->is, tts->wtid_reference); - - if (NULL == wtid_cmd) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - - if (GNUNET_OK != TALER_TESTING_get_trait_wtid - (wtid_cmd, tts->index, &wtid_ptr)) - { - GNUNET_break (0); - TALER_TESTING_interpreter_fail (tts->is); - return; - } - GNUNET_assert (NULL != wtid_ptr); - } - tts->tth = TALER_EXCHANGE_transfers_get (is->exchange, - wtid_ptr, - &track_transfer_cb, - tts); - GNUNET_assert (NULL != tts->tth); -} - - -/** - * Make a "track transfer" CMD where no "expected"-arguments, - * except the HTTP response code, are given. The best use case - * is when what matters to check is the HTTP response code, e.g. - * when a bogus WTID was passed. - * - * @param label the command label - * @param wtid_reference reference to any command which can provide - * a wtid. If NULL is given, then a all zeroed WTID is - * used that will at 99.9999% probability NOT match any - * existing WTID known to the exchange. - * @param index index number of the WTID to track, in case there - * are multiple on offer. - * @param expected_response_code expected HTTP response code. - * @return the command. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_track_transfer_empty (const char *label, - const char *wtid_reference, - unsigned int index, - unsigned int expected_response_code) -{ - struct TrackTransferState *tts; - - tts = GNUNET_new (struct TrackTransferState); - tts->wtid_reference = wtid_reference; - tts->index = index; - tts->expected_response_code = expected_response_code; - { - struct TALER_TESTING_Command cmd = { - .cls = tts, - .label = label, - .run = &track_transfer_run, - .cleanup = &track_transfer_cleanup - }; - - return cmd; - } -} - - -/** - * Make a "track transfer" command, specifying which amount and - * wire fee are expected. - * - * @param label the command label. - * @param wtid_reference reference to any command which can provide - * a wtid. Will be the one tracked. - * @param index in case there are multiple WTID offered, this - * parameter selects a particular one. - * @param expected_response_code expected HTTP response code. - * @param expected_total_amount how much money we expect being moved - * with this wire-transfer. - * @param expected_wire_fee expected wire fee. - * @return the command - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_track_transfer (const char *label, - const char *wtid_reference, - unsigned int index, - unsigned int expected_response_code, - const char *expected_total_amount, - const char *expected_wire_fee) -{ - struct TrackTransferState *tts; - - tts = GNUNET_new (struct TrackTransferState); - tts->wtid_reference = wtid_reference; - tts->index = index; - tts->expected_response_code = expected_response_code; - tts->expected_total_amount = expected_total_amount; - tts->expected_wire_fee = expected_wire_fee; - { - struct TALER_TESTING_Command cmd = { - .cls = tts, - .label = label, - .run = &track_transfer_run, - .cleanup = &track_transfer_cleanup - }; - - return cmd; - } -} - - -/* end of testing_api_cmd_track.c */ diff --git a/src/testing/testing_api_cmd_transfer_get.c b/src/testing/testing_api_cmd_transfer_get.c new file mode 100644 index 000000000..2b133188e --- /dev/null +++ b/src/testing/testing_api_cmd_transfer_get.c @@ -0,0 +1,459 @@ +/* + This file is part of TALER + Copyright (C) 2014-2020 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 testing/testing_api_cmd_transfer_get.c + * @brief Implement the testing CMDs for the /transfer GET operation. + * @author Marcello Stanisci + */ +#include "platform.h" +#include "taler_json_lib.h" +#include +#include "taler_testing_lib.h" + +/** + * State for a "track transfer" CMD. + */ +struct TrackTransferState +{ + + /** + * Expected amount for the WTID being tracked. + */ + const char *expected_total_amount; + + /** + * Expected fee for this WTID. + */ + const char *expected_wire_fee; + + /** + * Expected HTTP response code. + */ + unsigned int expected_response_code; + + /** + * Reference to any operation that can provide a WTID. + * Will be the WTID to track. + */ + const char *wtid_reference; + + /** + * Reference to any operation that can provide wire details. + * Those wire details will then be matched against the credit + * bank account of the tracked WTID. This way we can test that + * a wire transfer paid back one particular bank account. + */ + const char *wire_details_reference; + + /** + * Reference to any operation that can provide an amount. + * This way we can check that the transferred amount matches + * our expectations. + */ + const char *total_amount_reference; + + /** + * Index to the WTID to pick, in case @a wtid_reference has + * many on offer. + */ + unsigned int index; + + /** + * Handle to a pending "track transfer" operation. + */ + struct TALER_EXCHANGE_TransfersGetHandle *tth; + + /** + * Interpreter state. + */ + struct TALER_TESTING_Interpreter *is; +}; + + +/** + * Cleanup the state for a "track transfer" CMD, and possibly + * cancel a pending operation thereof. + * + * @param cls closure. + * @param cmd the command which is being cleaned up. + */ +static void +track_transfer_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + + struct TrackTransferState *tts = cls; + + if (NULL != tts->tth) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Command %u (%s) did not complete\n", + tts->is->ip, + cmd->label); + TALER_EXCHANGE_transfers_get_cancel (tts->tth); + tts->tth = NULL; + } + GNUNET_free (tts); +} + + +/** + * Check whether the HTTP response code from a "track transfer" + * operation is acceptable, and all other values like total amount, + * wire fees and hashed wire details as well. + * + * @param cls closure. + * @param http_status HTTP status code we got. + * @param ec taler-specific error code. + * @param exchange_pub public key the exchange used for signing + * the response. + * @param json original json reply (may include signatures, those + * have then been validated already). + * @param h_wire hash of the wire transfer address the transfer + * went to, or NULL on error. + * @param execution_time time when the exchange claims to have + * performed the wire transfer. + * @param total_amount total amount of the wire transfer, or NULL + * if the exchange could not provide any @a wtid (set only + * if @a http_status is "200 OK"). + * @param wire_fee wire fee that was charged by the exchange. + * @param details_length length of the @a details array. + * @param details array with details about the combined + * transactions. + */ +static void +track_transfer_cb (void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const struct TALER_ExchangePublicKeyP *exchange_pub, + const json_t *json, + const struct GNUNET_HashCode *h_wire, + struct GNUNET_TIME_Absolute execution_time, + const struct TALER_Amount *total_amount, + const struct TALER_Amount *wire_fee, + unsigned int details_length, + const struct TALER_TrackTransferDetails *details) +{ + struct TrackTransferState *tts = cls; + struct TALER_TESTING_Interpreter *is = tts->is; + struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; + struct TALER_Amount expected_amount; + + (void) exchange_pub; + tts->tth = NULL; + if (tts->expected_response_code != http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u to command %s in %s:%u\n", + http_status, + cmd->label, + __FILE__, + __LINE__); + json_dumpf (json, stderr, 0); + TALER_TESTING_interpreter_fail (is); + return; + } + + switch (http_status) + { + case MHD_HTTP_OK: + if (NULL == tts->expected_total_amount) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + if (NULL == tts->expected_wire_fee) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (GNUNET_OK != + TALER_string_to_amount (tts->expected_total_amount, + &expected_amount)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + if (0 != TALER_amount_cmp (total_amount, + &expected_amount)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Total amount mismatch to command %s - " + "%s vs %s\n", + cmd->label, + TALER_amount_to_string (total_amount), + TALER_amount_to_string (&expected_amount)); + json_dumpf (json, stderr, 0); + fprintf (stderr, "\n"); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (GNUNET_OK != + TALER_string_to_amount (tts->expected_wire_fee, + &expected_amount)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (0 != TALER_amount_cmp (wire_fee, + &expected_amount)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Wire fee mismatch to command %s\n", + cmd->label); + json_dumpf (json, stderr, 0); + TALER_TESTING_interpreter_fail (is); + return; + } + + /** + * Optionally checking: (1) wire-details for this transfer + * match the ones from a referenced "deposit" operation - + * or any operation that could provide wire-details. (2) + * Total amount for this transfer matches the one from any + * referenced command that could provide one. + */if (NULL != tts->wire_details_reference) + { + const struct TALER_TESTING_Command *wire_details_cmd; + const json_t *wire_details; + struct GNUNET_HashCode h_wire_details; + + if (NULL == (wire_details_cmd + = TALER_TESTING_interpreter_lookup_command + (is, tts->wire_details_reference))) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (GNUNET_OK != + TALER_TESTING_get_trait_wire_details (wire_details_cmd, + 0, + &wire_details)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + GNUNET_assert + (GNUNET_OK == + TALER_JSON_merchant_wire_signature_hash (wire_details, + &h_wire_details)); + + if (0 != GNUNET_memcmp (&h_wire_details, + h_wire)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Wire hash missmath to command %s\n", + cmd->label); + json_dumpf (json, stderr, 0); + TALER_TESTING_interpreter_fail (is); + return; + } + } + if (NULL != tts->total_amount_reference) + { + const struct TALER_TESTING_Command *total_amount_cmd; + const struct TALER_Amount *total_amount_from_reference; + + if (NULL == (total_amount_cmd + = TALER_TESTING_interpreter_lookup_command + (is, tts->total_amount_reference))) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (GNUNET_OK != + TALER_TESTING_get_trait_amount_obj (total_amount_cmd, + 0, + &total_amount_from_reference)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + if (0 != TALER_amount_cmp (total_amount, + total_amount_from_reference)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Amount missmath to command %s\n", + cmd->label); + json_dumpf (json, stderr, 0); + TALER_TESTING_interpreter_fail (is); + return; + } + } + } + TALER_TESTING_interpreter_next (is); +} + + +/** + * Run the command. + * + * @param cls closure. + * @param cmd the command under execution. + * @param is the interpreter state. + */ +static void +track_transfer_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + /* looking for a wtid to track .. */ + struct TrackTransferState *tts = cls; + struct TALER_WireTransferIdentifierRawP wtid; + const struct TALER_WireTransferIdentifierRawP *wtid_ptr; + + /* If no reference is given, we'll use a all-zeros + * WTID */ + memset (&wtid, 0, sizeof (wtid)); + wtid_ptr = &wtid; + + tts->is = is; + if (NULL != tts->wtid_reference) + { + const struct TALER_TESTING_Command *wtid_cmd; + + wtid_cmd = TALER_TESTING_interpreter_lookup_command + (tts->is, tts->wtid_reference); + + if (NULL == wtid_cmd) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + + if (GNUNET_OK != TALER_TESTING_get_trait_wtid + (wtid_cmd, tts->index, &wtid_ptr)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (tts->is); + return; + } + GNUNET_assert (NULL != wtid_ptr); + } + tts->tth = TALER_EXCHANGE_transfers_get (is->exchange, + wtid_ptr, + &track_transfer_cb, + tts); + GNUNET_assert (NULL != tts->tth); +} + + +/** + * Make a "track transfer" CMD where no "expected"-arguments, + * except the HTTP response code, are given. The best use case + * is when what matters to check is the HTTP response code, e.g. + * when a bogus WTID was passed. + * + * @param label the command label + * @param wtid_reference reference to any command which can provide + * a wtid. If NULL is given, then a all zeroed WTID is + * used that will at 99.9999% probability NOT match any + * existing WTID known to the exchange. + * @param index index number of the WTID to track, in case there + * are multiple on offer. + * @param expected_response_code expected HTTP response code. + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_track_transfer_empty (const char *label, + const char *wtid_reference, + unsigned int index, + unsigned int expected_response_code) +{ + struct TrackTransferState *tts; + + tts = GNUNET_new (struct TrackTransferState); + tts->wtid_reference = wtid_reference; + tts->index = index; + tts->expected_response_code = expected_response_code; + { + struct TALER_TESTING_Command cmd = { + .cls = tts, + .label = label, + .run = &track_transfer_run, + .cleanup = &track_transfer_cleanup + }; + + return cmd; + } +} + + +/** + * Make a "track transfer" command, specifying which amount and + * wire fee are expected. + * + * @param label the command label. + * @param wtid_reference reference to any command which can provide + * a wtid. Will be the one tracked. + * @param index in case there are multiple WTID offered, this + * parameter selects a particular one. + * @param expected_response_code expected HTTP response code. + * @param expected_total_amount how much money we expect being moved + * with this wire-transfer. + * @param expected_wire_fee expected wire fee. + * @return the command + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_track_transfer (const char *label, + const char *wtid_reference, + unsigned int index, + unsigned int expected_response_code, + const char *expected_total_amount, + const char *expected_wire_fee) +{ + struct TrackTransferState *tts; + + tts = GNUNET_new (struct TrackTransferState); + tts->wtid_reference = wtid_reference; + tts->index = index; + tts->expected_response_code = expected_response_code; + tts->expected_total_amount = expected_total_amount; + tts->expected_wire_fee = expected_wire_fee; + { + struct TALER_TESTING_Command cmd = { + .cls = tts, + .label = label, + .run = &track_transfer_run, + .cleanup = &track_transfer_cleanup + }; + + return cmd; + } +} + + +/* end of testing_api_cmd_gransfer_get.c */ diff --git a/src/testing/testing_api_cmd_wait.c b/src/testing/testing_api_cmd_wait.c index 5558f7b95..919fb7c3b 100644 --- a/src/testing/testing_api_cmd_wait.c +++ b/src/testing/testing_api_cmd_wait.c @@ -84,6 +84,7 @@ wait_service_run (void *cls, const char *url = cmd->cls; char *wget_cmd; + (void) cls; GNUNET_asprintf (&wget_cmd, "wget -q -t 1 -T 1 %s -o /dev/null -O /dev/null", url); diff --git a/src/testing/testing_api_cmd_wire.c b/src/testing/testing_api_cmd_wire.c index 609a875c5..2d79a546f 100644 --- a/src/testing/testing_api_cmd_wire.c +++ b/src/testing/testing_api_cmd_wire.c @@ -86,10 +86,10 @@ wire_cb (void *cls, const struct TALER_EXCHANGE_WireAccount *accounts) { struct WireState *ws = cls; - struct TALER_TESTING_Command *cmd = \ - &ws->is->commands[ws->is->ip]; + struct TALER_TESTING_Command *cmd = &ws->is->commands[ws->is->ip]; struct TALER_Amount expected_fee; + (void) ec; TALER_LOG_DEBUG ("Checking parsed /wire response\n"); ws->wh = NULL; if (ws->expected_response_code != http_status) @@ -165,6 +165,8 @@ wire_run (void *cls, struct TALER_TESTING_Interpreter *is) { struct WireState *ws = cls; + + (void) cmd; ws->is = is; ws->wh = TALER_EXCHANGE_wire (is->exchange, &wire_cb, diff --git a/src/testing/testing_api_cmd_withdraw.c b/src/testing/testing_api_cmd_withdraw.c index 8ecf52011..5bb34a045 100644 --- a/src/testing/testing_api_cmd_withdraw.c +++ b/src/testing/testing_api_cmd_withdraw.c @@ -520,11 +520,11 @@ TALER_TESTING_cmd_withdraw_amount (const char *label, * @return the command. */ struct TALER_TESTING_Command -TALER_TESTING_cmd_withdraw_denomination (const char *label, - const char *reserve_reference, - const struct - TALER_EXCHANGE_DenomPublicKey *dk, - unsigned int expected_response_code) +TALER_TESTING_cmd_withdraw_denomination ( + const char *label, + const char *reserve_reference, + const struct TALER_EXCHANGE_DenomPublicKey *dk, + unsigned int expected_response_code) { struct WithdrawState *ws; diff --git a/src/util/test_amount.c b/src/util/test_amount.c index 7bb47caf8..03f15cb88 100644 --- a/src/util/test_amount.c +++ b/src/util/test_amount.c @@ -34,6 +34,8 @@ main (int argc, struct TALER_Amount r; char *c; + (void) argc; + (void) argv; GNUNET_log_setup ("test-amout", "WARNING", NULL); diff --git a/src/util/test_crypto.c b/src/util/test_crypto.c index 1fce0cd3c..de10e567d 100644 --- a/src/util/test_crypto.c +++ b/src/util/test_crypto.c @@ -30,7 +30,7 @@ * @return 0 on success */ static int -test_high_level () +test_high_level (void) { struct GNUNET_CRYPTO_EddsaPrivateKey *pk; struct TALER_CoinSpendPrivateKeyP coin_priv; @@ -88,7 +88,7 @@ test_high_level () * @return 0 on success */ static int -test_planchets () +test_planchets (void) { struct TALER_PlanchetSecretsP ps; struct TALER_DenominationPrivateKey dk_priv; @@ -127,6 +127,8 @@ int main (int argc, const char *const argv[]) { + (void) argc; + (void) argv; if (0 != test_high_level ()) return 1; if (0 != test_planchets ()) diff --git a/src/util/test_payto.c b/src/util/test_payto.c index b7d73f80a..7dc2eb142 100644 --- a/src/util/test_payto.c +++ b/src/util/test_payto.c @@ -39,6 +39,8 @@ main (int argc, { char *r; + (void) argc; + (void) argv; GNUNET_log_setup ("test-payto", "WARNING", NULL); diff --git a/src/util/test_url.c b/src/util/test_url.c index 4be1e7307..029302993 100644 --- a/src/util/test_url.c +++ b/src/util/test_url.c @@ -45,6 +45,8 @@ int main (int argc, const char *const argv[]) { + (void) argc; + (void) argv; cf (TALER_urlencode (""), ""); cf (TALER_urlencode ("abc"), "abc"); cf (TALER_urlencode ("~~"), "~~"); -- cgit v1.2.3