move function to libtalerexchangedb, as planned

This commit is contained in:
Christian Grothoff 2020-01-16 22:40:12 +01:00
parent 0a415262da
commit 0305cf5f9e
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
18 changed files with 546 additions and 508 deletions

View File

@ -39,7 +39,7 @@
#include "platform.h"
#include <gnunet/gnunet_util_lib.h>
#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"

View File

@ -29,7 +29,7 @@
#include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_curl_lib.h>
#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"

View File

@ -1293,6 +1293,7 @@ schedule_httpd (struct TALER_FAKEBANK_Handle *h)
h);
}
#else
/**
* Schedule MHD. This function should be called initially when an

View File

@ -20,7 +20,7 @@
*/
#include "platform.h"
#include <gnunet/gnunet_util_lib.h>
#include "taler_exchangedb_plugin.h"
#include "taler_exchangedb_lib.h"
/**

View File

@ -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");

View File

@ -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 */

View File

@ -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 */

View File

@ -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);

View File

@ -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,

View File

@ -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,

View File

@ -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 \

View File

@ -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

View File

@ -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 <http://www.gnu.org/licenses/>
*/
/**
* @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;
}

View File

@ -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

View File

@ -24,7 +24,82 @@
#include <jansson.h>
#include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_db_lib.h>
#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;
};
/**

View File

@ -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 ********* */

View File

@ -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),
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);

View File

@ -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);
@ -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;