From 0305cf5f9eb904e7a3ab3e8d39f4974a92a9a0b3 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 16 Jan 2020 22:40:12 +0100 Subject: move function to libtalerexchangedb, as planned --- src/auditor/taler-auditor.c | 2 +- src/auditor/taler-wire-auditor.c | 2 +- src/bank-lib/fakebank.c | 1 + src/exchange-tools/taler-exchange-dbinit.c | 2 +- src/exchange/taler-exchange-aggregator.c | 2 +- src/exchange/taler-exchange-httpd_db.c | 119 ----- src/exchange/taler-exchange-httpd_db.h | 18 - src/exchange/taler-exchange-httpd_deposit.c | 6 +- src/exchange/taler-exchange-httpd_payback.c | 6 +- src/exchange/taler-exchange-httpd_refresh_melt.c | 6 +- src/exchangedb/Makefile.am | 3 +- src/exchangedb/exchangedb_fees.c | 2 +- src/exchangedb/exchangedb_transactions.c | 142 ++++++ src/include/taler_exchangedb_lib.h | 97 +---- src/include/taler_exchangedb_plugin.h | 77 +++- src/include/taler_testing_lib.h | 16 +- src/lib/test_taler_exchange_aggregator.c | 530 ++++++++++++----------- src/lib/testing_api_cmd_insert_deposit.c | 23 +- 18 files changed, 546 insertions(+), 508 deletions(-) create mode 100644 src/exchangedb/exchangedb_transactions.c (limited to 'src') diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c index afce190ec..42724efba 100644 --- a/src/auditor/taler-auditor.c +++ b/src/auditor/taler-auditor.c @@ -39,7 +39,7 @@ #include "platform.h" #include #include "taler_auditordb_plugin.h" -#include "taler_exchangedb_plugin.h" +#include "taler_exchangedb_lib.h" #include "taler_json_lib.h" #include "taler_bank_service.h" #include "taler_signatures.h" diff --git a/src/auditor/taler-wire-auditor.c b/src/auditor/taler-wire-auditor.c index ffbbfd718..d8da36d07 100644 --- a/src/auditor/taler-wire-auditor.c +++ b/src/auditor/taler-wire-auditor.c @@ -29,7 +29,7 @@ #include #include #include "taler_auditordb_plugin.h" -#include "taler_exchangedb_plugin.h" +#include "taler_exchangedb_lib.h" #include "taler_json_lib.h" #include "taler_bank_service.h" #include "taler_signatures.h" diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index 8dc268bba..15b21ba39 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -1293,6 +1293,7 @@ schedule_httpd (struct TALER_FAKEBANK_Handle *h) h); } + #else /** * Schedule MHD. This function should be called initially when an diff --git a/src/exchange-tools/taler-exchange-dbinit.c b/src/exchange-tools/taler-exchange-dbinit.c index e9a1e3349..50c8c4836 100644 --- a/src/exchange-tools/taler-exchange-dbinit.c +++ b/src/exchange-tools/taler-exchange-dbinit.c @@ -20,7 +20,7 @@ */ #include "platform.h" #include -#include "taler_exchangedb_plugin.h" +#include "taler_exchangedb_lib.h" /** diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index 37ac5336b..264cbf62b 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -1835,7 +1835,7 @@ run_transfers (void *cls) if (GNUNET_OK != db_plugin->start (db_plugin->cls, session, - "aggregator run transfer")) + "aggregator run transfer")) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to start database transaction!\n"); diff --git a/src/exchange/taler-exchange-httpd_db.c b/src/exchange/taler-exchange-httpd_db.c index be7a0300b..bc6f1ca60 100644 --- a/src/exchange/taler-exchange-httpd_db.c +++ b/src/exchange/taler-exchange-httpd_db.c @@ -165,123 +165,4 @@ TEH_DB_run_transaction (struct MHD_Connection *connection, } -/** - * Calculate the total value of all transactions performed. - * Stores @a off plus the cost of all transactions in @a tl - * in @a ret. - * - * @param tl transaction list to process - * @param off offset to use as the starting value - * @param[out] ret where the resulting total is to be stored - * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors - */ -// FIXME: maybe move to another module, i.e. exchangedb??? -int -TEH_DB_calculate_transaction_list_totals (struct - TALER_EXCHANGEDB_TransactionList *tl, - const struct TALER_Amount *off, - struct TALER_Amount *ret) -{ - struct TALER_Amount spent = *off; - struct TALER_Amount refunded; - - GNUNET_assert (GNUNET_OK == - TALER_amount_get_zero (spent.currency, - &refunded)); - for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos = - pos->next) - { - switch (pos->type) - { - case TALER_EXCHANGEDB_TT_DEPOSIT: - /* spent += pos->amount_with_fee */ - if (GNUNET_OK != - TALER_amount_add (&spent, - &spent, - &pos->details.deposit->amount_with_fee)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - break; - case TALER_EXCHANGEDB_TT_REFRESH_MELT: - /* spent += pos->amount_with_fee */ - if (GNUNET_OK != - TALER_amount_add (&spent, - &spent, - &pos->details.melt->session.amount_with_fee)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - break; - case TALER_EXCHANGEDB_TT_REFUND: - /* refunded += pos->refund_amount - pos->refund_fee */ - if (GNUNET_OK != - TALER_amount_add (&refunded, - &refunded, - &pos->details.refund->refund_amount)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - if (GNUNET_OK != - TALER_amount_subtract (&refunded, - &refunded, - &pos->details.refund->refund_fee)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - break; - case TALER_EXCHANGEDB_TT_OLD_COIN_PAYBACK: - /* refunded += pos->value */ - if (GNUNET_OK != - TALER_amount_add (&refunded, - &refunded, - &pos->details.old_coin_payback->value)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - break; - case TALER_EXCHANGEDB_TT_PAYBACK: - /* spent += pos->value */ - if (GNUNET_OK != - TALER_amount_add (&spent, - &spent, - &pos->details.payback->value)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - break; - case TALER_EXCHANGEDB_TT_PAYBACK_REFRESH: - /* spent += pos->value */ - if (GNUNET_OK != - TALER_amount_add (&spent, - &spent, - &pos->details.payback_refresh->value)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - break; - } - } - /* spent = spent - refunded */ - if (GNUNET_SYSERR == - TALER_amount_subtract (&spent, - &spent, - &refunded)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - - *ret = spent; - return GNUNET_OK; -} - - /* end of taler-exchange-httpd_db.c */ diff --git a/src/exchange/taler-exchange-httpd_db.h b/src/exchange/taler-exchange-httpd_db.h index c63b3668b..e6d38d7fe 100644 --- a/src/exchange/taler-exchange-httpd_db.h +++ b/src/exchange/taler-exchange-httpd_db.h @@ -107,23 +107,5 @@ TEH_DB_run_transaction (struct MHD_Connection *connection, void *cb_cls); -/** - * Calculate the total value of all transactions performed. - * Stores @a off plus the cost of all transactions in @a tl - * in @a ret. - * - * @param tl transaction list to process - * @param off offset to use as the starting value - * @param[out] ret where the resulting total is to be stored - * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors - */ -// FIXME: maybe move to another module, i.e. exchangedb??? -int -TEH_DB_calculate_transaction_list_totals (struct - TALER_EXCHANGEDB_TransactionList *tl, - const struct TALER_Amount *off, - struct TALER_Amount *ret); - - #endif /* TALER_EXCHANGE_HTTPD_DB_H */ diff --git a/src/exchange/taler-exchange-httpd_deposit.c b/src/exchange/taler-exchange-httpd_deposit.c index 485047784..11f579abc 100644 --- a/src/exchange/taler-exchange-httpd_deposit.c +++ b/src/exchange/taler-exchange-httpd_deposit.c @@ -193,9 +193,9 @@ deposit_transaction (void *cls, if (0 > qs) return qs; if (GNUNET_OK != - TEH_DB_calculate_transaction_list_totals (tl, - &spent, - &spent)) + TALER_EXCHANGEDB_calculate_transaction_list_totals (tl, + &spent, + &spent)) { TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, tl); diff --git a/src/exchange/taler-exchange-httpd_payback.c b/src/exchange/taler-exchange-httpd_payback.c index b7fe593d9..a05045b24 100644 --- a/src/exchange/taler-exchange-httpd_payback.c +++ b/src/exchange/taler-exchange-httpd_payback.c @@ -312,9 +312,9 @@ payback_transaction (void *cls, TALER_amount_get_zero (pc->value.currency, &spent)); if (GNUNET_OK != - TEH_DB_calculate_transaction_list_totals (tl, - &spent, - &spent)) + TALER_EXCHANGEDB_calculate_transaction_list_totals (tl, + &spent, + &spent)) { GNUNET_break (0); TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, diff --git a/src/exchange/taler-exchange-httpd_refresh_melt.c b/src/exchange/taler-exchange-httpd_refresh_melt.c index 8fbb58513..4f429012c 100644 --- a/src/exchange/taler-exchange-httpd_refresh_melt.c +++ b/src/exchange/taler-exchange-httpd_refresh_melt.c @@ -225,9 +225,9 @@ refresh_check_melt (struct MHD_Connection *connection, } } if (GNUNET_OK != - TEH_DB_calculate_transaction_list_totals (tl, - &spent, - &spent)) + TALER_EXCHANGEDB_calculate_transaction_list_totals (tl, + &spent, + &spent)) { GNUNET_break (0); TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index 1a8665849..c0d6bc669 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -46,8 +46,9 @@ libtalerexchangedb_la_SOURCES = \ exchangedb_auditorkeys.c \ exchangedb_denomkeys.c \ exchangedb_fees.c \ + exchangedb_plugin.c \ exchangedb_signkeys.c \ - exchangedb_plugin.c + exchangedb_transactions.c libtalerexchangedb_la_LIBADD = \ $(top_builddir)/src/util/libtalerutil.la \ diff --git a/src/exchangedb/exchangedb_fees.c b/src/exchangedb/exchangedb_fees.c index 386c5de90..c025604fa 100644 --- a/src/exchangedb/exchangedb_fees.c +++ b/src/exchangedb/exchangedb_fees.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2017 GNUnet e.V. + Copyright (C) 2017 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 diff --git a/src/exchangedb/exchangedb_transactions.c b/src/exchangedb/exchangedb_transactions.c new file mode 100644 index 000000000..2891f0adb --- /dev/null +++ b/src/exchangedb/exchangedb_transactions.c @@ -0,0 +1,142 @@ +/* + This file is part of TALER + Copyright (C) 2017-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 exchangedb/exchangedb_transactions.c + * @brief Logic to compute transaction totals of a transaction list for a coin + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_exchangedb_lib.h" + + +/** + * Calculate the total value of all transactions performed. + * Stores @a off plus the cost of all transactions in @a tl + * in @a ret. + * + * @param tl transaction list to process + * @param off offset to use as the starting value + * @param[out] ret where the resulting total is to be stored + * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors + */ +int +TALER_EXCHANGEDB_calculate_transaction_list_totals (struct + TALER_EXCHANGEDB_TransactionList + *tl, + const struct + TALER_Amount *off, + struct TALER_Amount *ret) +{ + struct TALER_Amount spent = *off; + struct TALER_Amount refunded; + + GNUNET_assert (GNUNET_OK == + TALER_amount_get_zero (spent.currency, + &refunded)); + for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos = + pos->next) + { + switch (pos->type) + { + case TALER_EXCHANGEDB_TT_DEPOSIT: + /* spent += pos->amount_with_fee */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.deposit->amount_with_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_REFRESH_MELT: + /* spent += pos->amount_with_fee */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.melt->session.amount_with_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_REFUND: + /* refunded += pos->refund_amount - pos->refund_fee */ + if (GNUNET_OK != + TALER_amount_add (&refunded, + &refunded, + &pos->details.refund->refund_amount)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + if (GNUNET_OK != + TALER_amount_subtract (&refunded, + &refunded, + &pos->details.refund->refund_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_OLD_COIN_PAYBACK: + /* refunded += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&refunded, + &refunded, + &pos->details.old_coin_payback->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_PAYBACK: + /* spent += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.payback->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_PAYBACK_REFRESH: + /* spent += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.payback_refresh->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + } + } + /* spent = spent - refunded */ + if (GNUNET_SYSERR == + TALER_amount_subtract (&spent, + &spent, + &refunded)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + + *ret = spent; + return GNUNET_OK; +} diff --git a/src/include/taler_exchangedb_lib.h b/src/include/taler_exchangedb_lib.h index 1681c45aa..f820d1a25 100644 --- a/src/include/taler_exchangedb_lib.h +++ b/src/include/taler_exchangedb_lib.h @@ -23,9 +23,8 @@ #ifndef TALER_EXCHANGEDB_LIB_H #define TALER_EXCHANGEDB_LIB_H - #include "taler_signatures.h" - +#include "taler_exchangedb_plugin.h" /** * Subdirectroy under the exchange's base directory which contains @@ -40,81 +39,6 @@ #define TALER_EXCHANGEDB_DIR_DENOMINATION_KEYS "denomkeys" -GNUNET_NETWORK_STRUCT_BEGIN - -/** - * @brief On disk format used for a exchange signing key. Signing keys are used - * by the exchange to affirm its messages, but not to create coins. - * Includes the private key followed by the public information about - * the signing key. - */ -struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP -{ - /** - * Private key part of the exchange's signing key. - */ - struct TALER_ExchangePrivateKeyP signkey_priv; - - /** - * Signature over @e issue - */ - struct TALER_MasterSignatureP master_sig; - - /** - * Public information about a exchange signing key. - */ - struct TALER_ExchangeSigningKeyValidityPS issue; - -}; - - -/** - * Information about a denomination key. - */ -struct TALER_EXCHANGEDB_DenominationKeyInformationP -{ - - /** - * Signature over this struct to affirm the validity of the key. - */ - struct TALER_MasterSignatureP signature; - - /** - * Signed properties of the denomination key. - */ - struct TALER_DenominationKeyValidityPS properties; -}; - - -GNUNET_NETWORK_STRUCT_END - - -/** - * @brief All information about a denomination key (which is used to - * sign coins into existence). - */ -struct TALER_EXCHANGEDB_DenominationKeyIssueInformation -{ - /** - * The private key of the denomination. Will be NULL if the private - * key is not available (this is the case after the key has expired - * for signing coins, but is still valid for depositing coins). - */ - struct TALER_DenominationPrivateKey denom_priv; - - /** - * Decoded denomination public key (the hash of it is in - * @e issue, but we sometimes need the full public key as well). - */ - struct TALER_DenominationPublicKey denom_pub; - - /** - * Signed public information about a denomination key. - */ - struct TALER_EXCHANGEDB_DenominationKeyInformationP issue; -}; - - /** * @brief Iterator over signing keys. * @@ -525,4 +449,23 @@ TALER_EXCHANGEDB_find_accounts (const struct GNUNET_CONFIGURATION_Handle *cfg, void *cb_cls); +/** + * Calculate the total value of all transactions performed. + * Stores @a off plus the cost of all transactions in @a tl + * in @a ret. + * + * @param tl transaction list to process + * @param off offset to use as the starting value + * @param[out] ret where the resulting total is to be stored + * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors + */ +int +TALER_EXCHANGEDB_calculate_transaction_list_totals (struct + TALER_EXCHANGEDB_TransactionList + *tl, + const struct + TALER_Amount *off, + struct TALER_Amount *ret); + + #endif diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 06be27e0f..cb5d6cc68 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -24,7 +24,82 @@ #include #include #include -#include "taler_exchangedb_lib.h" +#include "taler_signatures.h" + + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * @brief On disk format used for a exchange signing key. Signing keys are used + * by the exchange to affirm its messages, but not to create coins. + * Includes the private key followed by the public information about + * the signing key. + */ +struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP +{ + /** + * Private key part of the exchange's signing key. + */ + struct TALER_ExchangePrivateKeyP signkey_priv; + + /** + * Signature over @e issue + */ + struct TALER_MasterSignatureP master_sig; + + /** + * Public information about a exchange signing key. + */ + struct TALER_ExchangeSigningKeyValidityPS issue; + +}; + + +/** + * Information about a denomination key. + */ +struct TALER_EXCHANGEDB_DenominationKeyInformationP +{ + + /** + * Signature over this struct to affirm the validity of the key. + */ + struct TALER_MasterSignatureP signature; + + /** + * Signed properties of the denomination key. + */ + struct TALER_DenominationKeyValidityPS properties; +}; + + +GNUNET_NETWORK_STRUCT_END + + +/** + * @brief All information about a denomination key (which is used to + * sign coins into existence). + */ +struct TALER_EXCHANGEDB_DenominationKeyIssueInformation +{ + /** + * The private key of the denomination. Will be NULL if the private + * key is not available (this is the case after the key has expired + * for signing coins, but is still valid for depositing coins). + */ + struct TALER_DenominationPrivateKey denom_priv; + + /** + * Decoded denomination public key (the hash of it is in + * @e issue, but we sometimes need the full public key as well). + */ + struct TALER_DenominationPublicKey denom_pub; + + /** + * Signed public information about a denomination key. + */ + struct TALER_EXCHANGEDB_DenominationKeyInformationP issue; +}; /** diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h index 9b0ca422c..783aa5966 100644 --- a/src/include/taler_testing_lib.h +++ b/src/include/taler_testing_lib.h @@ -104,7 +104,7 @@ struct TALER_TESTING_DatabaseConnection * Database plugin. */ struct TALER_EXCHANGEDB_Plugin *plugin; - + /** * Session with the database. */ @@ -1679,6 +1679,7 @@ TALER_TESTING_cmd_serialize_keys (const char *label); struct TALER_TESTING_Command TALER_TESTING_cmd_connect_with_state (const char *label, const char *state_reference); + /** * Make the "insert-deposit" CMD. * @@ -1694,12 +1695,13 @@ TALER_TESTING_cmd_connect_with_state (const char *label, */ struct TALER_TESTING_Command TALER_TESTING_cmd_insert_deposit (const char *label, - const struct TALER_TESTING_DatabaseConnection *dbc, - const char *merchant_name, - const char *merchant_account, - struct GNUNET_TIME_Relative wire_deadline, - const char *amount_with_fee, - const char *deposit_fee); + const struct + TALER_TESTING_DatabaseConnection *dbc, + const char *merchant_name, + const char *merchant_account, + struct GNUNET_TIME_Relative wire_deadline, + const char *amount_with_fee, + const char *deposit_fee); /* *** Generic trait logic for implementing traits ********* */ diff --git a/src/lib/test_taler_exchange_aggregator.c b/src/lib/test_taler_exchange_aggregator.c index 6f97a71de..e9f96a6d8 100644 --- a/src/lib/test_taler_exchange_aggregator.c +++ b/src/lib/test_taler_exchange_aggregator.c @@ -63,7 +63,7 @@ static char *config_filename; */ static int prepare_database (void *cls, - const struct GNUNET_CONFIGURATION_Handle *cfg) + const struct GNUNET_CONFIGURATION_Handle *cfg) { // connect to the database. @@ -103,424 +103,436 @@ run (void *cls, // check no aggregation happens on a empty database TALER_TESTING_cmd_exec_aggregator ("run-aggregator-on-empty-db", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-on-start"), // check aggregation happens on the simplest case: // one deposit into the database. TALER_TESTING_cmd_insert_deposit ("do-deposit-1", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:1", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-on-deposit-1", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-1", - ec.exchange_url, - "EUR:0.89", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.89", + bc.exchange_payto, + bc.user42_payto), TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-1"), // check aggregation accumulates well. TALER_TESTING_cmd_insert_deposit ("do-deposit-2a", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:1", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + "EUR:0.1"), TALER_TESTING_cmd_insert_deposit ("do-deposit-2b", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:1", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-2", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-2", - ec.exchange_url, - "EUR:1.79", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:1.79", + bc.exchange_payto, + bc.user42_payto), TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-2"), - + // check that different merchants stem different aggregations. - + TALER_TESTING_cmd_insert_deposit ("do-deposit-3a", - &dbc, - "bob", - "4", - GNUNET_TIME_UNIT_ZERO, - "EUR:1", - "EUR:0.1"), + &dbc, + "bob", + "4", + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + "EUR:0.1"), TALER_TESTING_cmd_insert_deposit ("do-deposit-3b", - &dbc, - "bob", - "5", - GNUNET_TIME_UNIT_ZERO, - "EUR:1", - "EUR:0.1"), + &dbc, + "bob", + "5", + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + "EUR:0.1"), TALER_TESTING_cmd_insert_deposit ("do-deposit-3c", - &dbc, - "alice", - "4", - GNUNET_TIME_UNIT_ZERO, - "EUR:1", - "EUR:0.1"), - + &dbc, + "alice", + "4", + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + "EUR:0.1"), + TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-3", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-3a", - ec.exchange_url, - "EUR:0.89", - bc.exchange_payto, - TALER_payto_xtalerbank_make (bc.bank_url, "4")), + ec.exchange_url, + "EUR:0.89", + bc.exchange_payto, + TALER_payto_xtalerbank_make ( + bc.bank_url, "4")), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-3b", - ec.exchange_url, - "EUR:0.89", - bc.exchange_payto, - TALER_payto_xtalerbank_make (bc.bank_url, "4")), + ec.exchange_url, + "EUR:0.89", + bc.exchange_payto, + TALER_payto_xtalerbank_make ( + bc.bank_url, "4")), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-3c", - ec.exchange_url, - "EUR:0.89", - bc.exchange_payto, - TALER_payto_xtalerbank_make (bc.bank_url, "5")), + ec.exchange_url, + "EUR:0.89", + bc.exchange_payto, + TALER_payto_xtalerbank_make ( + bc.bank_url, "5")), TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-3"), // checking that aggregator waits for the deadline. TALER_TESTING_cmd_insert_deposit ("do-deposit-4a", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.2", - "EUR:0.1"), + "EUR:0.2", + "EUR:0.1"), TALER_TESTING_cmd_insert_deposit ("do-deposit-4b", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.2", - "EUR:0.1"), + "EUR:0.2", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-4-early", - config_filename), + config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-4-fast"), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-4-fast"), TALER_TESTING_cmd_sleep ("wait (5s)", 5), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-4-delayed", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-4", - ec.exchange_url, - "EUR:0.19", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.19", + bc.exchange_payto, + bc.user42_payto), // test picking all deposits at earliest deadline TALER_TESTING_cmd_insert_deposit ("do-deposit-5a", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 10), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 10), - "EUR:0.2", - "EUR:0.1"), + "EUR:0.2", + "EUR:0.1"), TALER_TESTING_cmd_insert_deposit ("do-deposit-5b", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.2", - "EUR:0.1"), + "EUR:0.2", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-5-early", - config_filename), + config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-5-early"), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-5-early"), TALER_TESTING_cmd_sleep ("wait (5s)", 5), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-5-delayed", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-5", - ec.exchange_url, - "EUR:0.19", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.19", + bc.exchange_payto, + bc.user42_payto), // Test NEVER running 'tiny' unless they make up minimum unit TALER_TESTING_cmd_insert_deposit ("do-deposit-6a", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.102", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.102", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6a-tiny", - config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-6a-tiny"), + config_filename), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-6a-tiny"), TALER_TESTING_cmd_insert_deposit ("do-deposit-6b", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.102", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.102", + "EUR:0.1"), TALER_TESTING_cmd_insert_deposit ("do-deposit-6c", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.102", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.102", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6c-tiny", - config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-6c-tiny"), + config_filename), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-6c-tiny"), TALER_TESTING_cmd_insert_deposit ("do-deposit-6d", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.102", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.102", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6d-tiny", - config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-6d-tiny"), + config_filename), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-6d-tiny"), TALER_TESTING_cmd_insert_deposit ("do-deposit-6e", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.112", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.112", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6e", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-6", - ec.exchange_url, - "EUR:0.01", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.01", + bc.exchange_payto, + bc.user42_payto), // Test profiteering if wire deadline is short - + TALER_TESTING_cmd_insert_deposit ("do-deposit-7a", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.109", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.109", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-7a-tiny", - config_filename), + config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-7a-tiny"), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-7a-tiny"), TALER_TESTING_cmd_insert_deposit ("do-deposit-7b", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.119", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.119", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-7-profit", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-7", - ec.exchange_url, - "EUR:0.01", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.01", + bc.exchange_payto, + bc.user42_payto), // Now check profit was actually taken TALER_TESTING_cmd_insert_deposit ("do-deposit-7c", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.122", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.122", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-7-loss", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-7", - ec.exchange_url, - "EUR:0.01", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.01", + bc.exchange_payto, + bc.user42_payto), // Test that aggregation would happen fully if wire deadline is long TALER_TESTING_cmd_insert_deposit ("do-deposit-8a", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.109", - "EUR:0.1"), + "EUR:0.109", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-8a-tiny", - config_filename), + config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-8a-tiny"), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-8a-tiny"), TALER_TESTING_cmd_insert_deposit ("do-deposit-8b", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.109", - "EUR:0.1"), + "EUR:0.109", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-8b-tiny", - config_filename), + config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-8b-tiny"), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-8b-tiny"), // now trigger aggregate with large transaction and short deadline TALER_TESTING_cmd_insert_deposit ("do-deposit-8c", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.122", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.122", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-8", - config_filename), + config_filename), TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-8", - ec.exchange_url, - "EUR:0.03", - bc.exchange_payto, - bc.user42_payto), + ec.exchange_url, + "EUR:0.03", + bc.exchange_payto, + bc.user42_payto), // Test aggregation with fees and rounding profits. - + TALER_TESTING_cmd_insert_deposit ("do-deposit-9a", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.104", - "EUR:0.1"), + "EUR:0.104", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-9a-tiny", - config_filename), + config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-9a-tiny"), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-9a-tiny"), TALER_TESTING_cmd_insert_deposit ("do-deposit-9b", - &dbc, - "bob", - USER42_ACCOUNT, + &dbc, + "bob", + USER42_ACCOUNT, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - 5), + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + 5), - "EUR:0.105", - "EUR:0.1"), + "EUR:0.105", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-9b-tiny", - config_filename), - TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-9b-tiny"), - - + config_filename), + TALER_TESTING_cmd_check_bank_empty ( + "expect-empty-transactions-after-9b-tiny"), // now trigger aggregate with large transaction and short deadline TALER_TESTING_cmd_insert_deposit ("do-deposit-9c", - &dbc, - "bob", - USER42_ACCOUNT, - GNUNET_TIME_UNIT_ZERO, - "EUR:0.112", - "EUR:0.1"), + &dbc, + "bob", + USER42_ACCOUNT, + GNUNET_TIME_UNIT_ZERO, + "EUR:0.112", + "EUR:0.1"), TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-9", - config_filename), + config_filename), // 0.009 + 0.009 + 0.022 - 0.001 - 0.002 - 0.008 = 0.029 => 0.02 TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-9", - ec.exchange_url, - "EUR:0.01", - bc.exchange_payto, - bc.user42_payto), - TALER_TESTING_cmd_end () + ec.exchange_url, + "EUR:0.01", + bc.exchange_payto, + bc.user42_payto), + TALER_TESTING_cmd_end () }; - + TALER_TESTING_run_with_fakebank (is, - all, - bc.bank_url); + all, + bc.bank_url); } + int main (int argc, char *const argv[]) @@ -552,22 +564,22 @@ main (int argc, TALER_TESTING_cleanup_files (config_filename); if (GNUNET_OK != TALER_TESTING_prepare_exchange (config_filename, - &ec)) + &ec)) { TALER_LOG_WARNING ("Could not prepare the exchange.\n"); return 77; } if (GNUNET_OK != TALER_TESTING_prepare_fakebank (config_filename, - "account-1", - &bc)) + "account-1", + &bc)) { TALER_LOG_WARNING ("Could not prepare the fakebank\n"); return 77; } if (GNUNET_OK != GNUNET_CONFIGURATION_parse_and_run (config_filename, - &prepare_database, + &prepare_database, NULL)) { TALER_LOG_WARNING ("Could not prepare database for tests.\n"); @@ -575,10 +587,10 @@ main (int argc, } result = TALER_TESTING_setup (&run, - NULL, - config_filename, - NULL, // no exchange process handle. - GNUNET_NO); // do not try to connect to the exchange + NULL, + config_filename, + NULL, // no exchange process handle. + GNUNET_NO); // do not try to connect to the exchange GNUNET_free (config_filename); GNUNET_free (testname); diff --git a/src/lib/testing_api_cmd_insert_deposit.c b/src/lib/testing_api_cmd_insert_deposit.c index a5a285b0c..47729a0ad 100644 --- a/src/lib/testing_api_cmd_insert_deposit.c +++ b/src/lib/testing_api_cmd_insert_deposit.c @@ -98,8 +98,6 @@ fake_issue (struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue) } - - /** * Run the command. * @@ -147,7 +145,7 @@ insert_deposit_run (void *cls, // prepare and store deposit now. memset (&deposit, 0, - sizeof (deposit)); + sizeof (deposit)); GNUNET_CRYPTO_kdf (&merchant_priv, sizeof (struct TALER_MerchantPrivateKeyP), @@ -156,7 +154,7 @@ insert_deposit_run (void *cls, ids->merchant_name, strlen (ids->merchant_name), NULL, - 0); + 0); GNUNET_CRYPTO_eddsa_key_get_public (&merchant_priv.eddsa_priv, &deposit.merchant_pub.eddsa_pub); GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, @@ -173,7 +171,7 @@ insert_deposit_run (void *cls, } GNUNET_CRYPTO_rsa_public_key_hash (dpk.rsa_public_key, - &deposit.coin.denom_pub_hash); + &deposit.coin.denom_pub_hash); GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &hc); @@ -244,7 +242,7 @@ insert_deposit_cleanup (void *cls, const struct TALER_TESTING_Command *cmd) { struct InsertDepositState *ids = cls; - + GNUNET_free (ids); } @@ -283,12 +281,13 @@ insert_deposit_traits (void *cls, */ struct TALER_TESTING_Command TALER_TESTING_cmd_insert_deposit (const char *label, - const struct TALER_TESTING_DatabaseConnection *dbc, - const char *merchant_name, - const char *merchant_account, - struct GNUNET_TIME_Relative wire_deadline, - const char *amount_with_fee, - const char *deposit_fee) + const struct + TALER_TESTING_DatabaseConnection *dbc, + const char *merchant_name, + const char *merchant_account, + struct GNUNET_TIME_Relative wire_deadline, + const char *amount_with_fee, + const char *deposit_fee) { struct TALER_TESTING_Command cmd; struct InsertDepositState *ids; -- cgit v1.2.3