This commit is contained in:
Christian Grothoff 2020-03-28 20:45:53 +01:00
parent 9d9b0e0e57
commit d5351641f8
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
12 changed files with 590 additions and 197 deletions

View File

@ -548,8 +548,8 @@ TALER_TESTING_interpreter_get_context (struct TALER_TESTING_Interpreter *is);
* @return the label.
*/
const char *
TALER_TESTING_interpreter_get_current_label (struct
TALER_TESTING_Interpreter *is);
TALER_TESTING_interpreter_get_current_label (
struct TALER_TESTING_Interpreter *is);
/**
@ -730,9 +730,9 @@ struct TALER_TESTING_SetupContext
* @return #GNUNET_OK if no errors occurred.
*/
int
TALER_TESTING_setup_with_exchange_cfg (void *cls,
const struct
GNUNET_CONFIGURATION_Handle *cfg);
TALER_TESTING_setup_with_exchange_cfg (
void *cls,
const struct GNUNET_CONFIGURATION_Handle *cfg);
/**
@ -766,10 +766,9 @@ TALER_TESTING_setup_with_exchange (TALER_TESTING_Main main_cb,
* @return #GNUNET_OK if no errors occurred.
*/
int
TALER_TESTING_setup_with_auditor_and_exchange_cfg (void *cls,
const struct
GNUNET_CONFIGURATION_Handle *
cfg);
TALER_TESTING_setup_with_auditor_and_exchange_cfg (
void *cls,
const struct GNUNET_CONFIGURATION_Handle *cfg);
/**
@ -866,11 +865,11 @@ TALER_TESTING_has_in_name (const char *prog,
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_bank_credits (const char *label,
const struct
TALER_BANK_AuthenticationData *auth,
const char *start_row_reference,
long long num_results);
TALER_TESTING_cmd_bank_credits (
const char *label,
const struct TALER_BANK_AuthenticationData *auth,
const char *start_row_reference,
long long num_results);
/**
@ -968,8 +967,9 @@ TALER_TESTING_cmd_deposit_confirmation (const char *label,
* @return the command with retries enabled
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_deposit_confirmation_with_retry (struct TALER_TESTING_Command
cmd);
TALER_TESTING_cmd_deposit_confirmation_with_retry (
struct TALER_TESTING_Command
cmd);
/**
@ -1024,11 +1024,11 @@ TALER_TESTING_cmd_exchanges_with_retry (struct TALER_TESTING_Command cmd);
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_admin_add_incoming (const char *label,
const char *amount,
const struct
TALER_BANK_AuthenticationData *auth,
const char *payto_debit_account);
TALER_TESTING_cmd_admin_add_incoming (
const char *label,
const char *amount,
const struct TALER_BANK_AuthenticationData *auth,
const char *payto_debit_account);
/**
@ -1046,13 +1046,12 @@ TALER_TESTING_cmd_admin_add_incoming (const char *label,
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_admin_add_incoming_with_ref (const char *label,
const char *amount,
const struct
TALER_BANK_AuthenticationData *
auth,
const char *payto_debit_account,
const char *ref);
TALER_TESTING_cmd_admin_add_incoming_with_ref (
const char *label,
const char *amount,
const struct TALER_BANK_AuthenticationData *auth,
const char *payto_debit_account,
const char *ref);
/**
@ -1074,15 +1073,13 @@ TALER_TESTING_cmd_admin_add_incoming_with_ref (const char *label,
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_admin_add_incoming_with_instance (const char *label,
const char *amount,
const struct
TALER_BANK_AuthenticationData
*auth,
const char *
payto_debit_account,
const char *instance,
const char *config_filename);
TALER_TESTING_cmd_admin_add_incoming_with_instance (
const char *label,
const char *amount,
const struct TALER_BANK_AuthenticationData *auth,
const char *payto_debit_account,
const char *instance,
const char *config_filename);
/**
@ -1123,16 +1120,27 @@ TALER_TESTING_cmd_exec_aggregator (const char *label,
/**
* Make a "closer" CMD.
* Make a "closer" CMD. Note that it is right now not supported to run the
* closer to close multiple reserves in combination with a subsequent reserve
* status call, as we cannot generate the traits necessary for multiple closed
* reserves. You can work around this by using multiple closer commands, one
* per reserve that is being closed.
*
* @param label command label.
* @param config_filename configuration file for the
* closer to use.
* @param expected_amount amount we expect to see wired from a @a expected_reserve_ref
* @param expected_fee closing fee we expect to see
* @param expected_reserve_ref reference to a reserve we expect the closer to drain;
* NULL if we do not expect the closer to do anything
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_exec_closer (const char *label,
const char *config_filename);
const char *config_filename,
const char *expected_amount,
const char *expected_fee,
const char *expected_reserve_ref);
/**
@ -1661,13 +1669,15 @@ TALER_TESTING_cmd_refund (const char *label,
* the index of the coin using "$LABEL#$INDEX" syntax.
* Here, $INDEX must be a non-negative number.
* @param melt_reference NULL if coin was not refreshed, otherwise label of the melt operation
* @param amount how much do we expect to recoup, NULL for nothing
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_recoup (const char *label,
unsigned int expected_response_code,
const char *coin_reference,
const char *melt_reference);
const char *melt_reference,
const char *amount);
/**
@ -2006,9 +2016,9 @@ TALER_TESTING_make_trait_bank_row (const uint64_t *row);
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_reserve_priv (unsigned int index,
const struct
TALER_ReservePrivateKeyP *reserve_priv);
TALER_TESTING_make_trait_reserve_priv (
unsigned int index,
const struct TALER_ReservePrivateKeyP *reserve_priv);
/**
@ -2020,10 +2030,10 @@ TALER_TESTING_make_trait_reserve_priv (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_reserve_priv (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_ReservePrivateKeyP **reserve_priv);
TALER_TESTING_get_trait_reserve_priv (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_ReservePrivateKeyP **reserve_priv);
/**
@ -2034,9 +2044,9 @@ TALER_TESTING_get_trait_reserve_priv (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_reserve_pub (unsigned int index,
const struct
TALER_ReservePublicKeyP *reserve_pub);
TALER_TESTING_make_trait_reserve_pub (
unsigned int index,
const struct TALER_ReservePublicKeyP *reserve_pub);
/**
@ -2048,10 +2058,38 @@ TALER_TESTING_make_trait_reserve_pub (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_reserve_pub (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_ReservePublicKeyP **reserve_pub);
TALER_TESTING_get_trait_reserve_pub (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_ReservePublicKeyP **reserve_pub);
/**
* Offer a reserve history entry.
*
* @param index reserve pubs's index number.
* @param rh reserve history entry to offer.
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_reserve_history (
unsigned int index,
const struct TALER_EXCHANGE_ReserveHistory *rh);
/**
* Obtain a reserve history entry from a @a cmd.
*
* @param cmd command to extract the reserve history from.
* @param index reserve history's index number.
* @param[out] rhp set to the reserve history.
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_reserve_history (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_EXCHANGE_ReserveHistory **rhp);
/**
@ -2063,9 +2101,9 @@ TALER_TESTING_get_trait_reserve_pub (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_exchange_sig (unsigned int index,
const struct
TALER_ExchangeSignatureP *exchange_sig);
TALER_TESTING_make_trait_exchange_sig (
unsigned int index,
const struct TALER_ExchangeSignatureP *exchange_sig);
/**
@ -2077,10 +2115,10 @@ TALER_TESTING_make_trait_exchange_sig (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_exchange_sig (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_ExchangeSignatureP **exchange_sig);
TALER_TESTING_get_trait_exchange_sig (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_ExchangeSignatureP **exchange_sig);
/**
@ -2092,9 +2130,9 @@ TALER_TESTING_get_trait_exchange_sig (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_exchange_pub (unsigned int index,
const struct
TALER_ExchangePublicKeyP *exchange_pub);
TALER_TESTING_make_trait_exchange_pub (
unsigned int index,
const struct TALER_ExchangePublicKeyP *exchange_pub);
/**
@ -2106,10 +2144,10 @@ TALER_TESTING_make_trait_exchange_pub (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_exchange_pub (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_ExchangePublicKeyP **exchange_pub);
TALER_TESTING_get_trait_exchange_pub (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_ExchangePublicKeyP **exchange_pub);
/**
@ -2149,9 +2187,9 @@ TALER_TESTING_make_trait_process (unsigned int index,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_coin_priv (unsigned int index,
const struct
TALER_CoinSpendPrivateKeyP *coin_priv);
TALER_TESTING_make_trait_coin_priv (
unsigned int index,
const struct TALER_CoinSpendPrivateKeyP *coin_priv);
/**
* Obtain a coin private key from a @a cmd.
@ -2162,10 +2200,10 @@ TALER_TESTING_make_trait_coin_priv (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_coin_priv (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_CoinSpendPrivateKeyP **coin_priv);
TALER_TESTING_get_trait_coin_priv (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_CoinSpendPrivateKeyP **coin_priv);
/**
@ -2176,10 +2214,9 @@ TALER_TESTING_get_trait_coin_priv (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_blinding_key (unsigned int index,
const struct
TALER_DenominationBlindingKeyP *
blinding_key);
TALER_TESTING_make_trait_blinding_key (
unsigned int index,
const struct TALER_DenominationBlindingKeyP *blinding_key);
/**
@ -2191,11 +2228,10 @@ TALER_TESTING_make_trait_blinding_key (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_blinding_key (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_DenominationBlindingKeyP **
blinding_key);
TALER_TESTING_get_trait_blinding_key (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_DenominationBlindingKeyP **blinding_key);
/**
@ -2206,9 +2242,9 @@ TALER_TESTING_get_trait_blinding_key (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_denom_pub (unsigned int index,
const struct
TALER_EXCHANGE_DenomPublicKey *dpk);
TALER_TESTING_make_trait_denom_pub (
unsigned int index,
const struct TALER_EXCHANGE_DenomPublicKey *dpk);
/**
@ -2220,10 +2256,10 @@ TALER_TESTING_make_trait_denom_pub (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_denom_pub (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_EXCHANGE_DenomPublicKey **dpk);
TALER_TESTING_get_trait_denom_pub (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_EXCHANGE_DenomPublicKey **dpk);
/**
@ -2235,10 +2271,10 @@ TALER_TESTING_get_trait_denom_pub (const struct TALER_TESTING_Command *cmd,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_denom_sig (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_DenominationSignature **dpk);
TALER_TESTING_get_trait_denom_sig (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_DenominationSignature **dpk);
/**
@ -2250,9 +2286,9 @@ TALER_TESTING_get_trait_denom_sig (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_denom_sig (unsigned int index,
const struct
TALER_DenominationSignature *sig);
TALER_TESTING_make_trait_denom_sig (
unsigned int index,
const struct TALER_DenominationSignature *sig);
/**
@ -2323,9 +2359,9 @@ struct TALER_TESTING_FreshCoinData;
* @return the trait,
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_fresh_coins (unsigned int index,
const struct TALER_TESTING_FreshCoinData *
fresh_coins);
TALER_TESTING_make_trait_fresh_coins (
unsigned int index,
const struct TALER_TESTING_FreshCoinData *fresh_coins);
/**
@ -2338,10 +2374,10 @@ TALER_TESTING_make_trait_fresh_coins (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_fresh_coins (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_TESTING_FreshCoinData **fresh_coins);
TALER_TESTING_get_trait_fresh_coins (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_TESTING_FreshCoinData **fresh_coins);
/**
@ -2440,10 +2476,10 @@ TALER_TESTING_make_trait_exchange_keys (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_merchant_priv (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_MerchantPrivateKeyP **priv);
TALER_TESTING_get_trait_merchant_priv (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_MerchantPrivateKeyP **priv);
/**
@ -2456,9 +2492,9 @@ TALER_TESTING_get_trait_merchant_priv (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_merchant_priv (unsigned int index,
const struct
TALER_MerchantPrivateKeyP *priv);
TALER_TESTING_make_trait_merchant_priv (
unsigned int index,
const struct TALER_MerchantPrivateKeyP *priv);
/**
@ -2472,10 +2508,10 @@ TALER_TESTING_make_trait_merchant_priv (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_merchant_pub (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_MerchantPublicKeyP **pub);
TALER_TESTING_get_trait_merchant_pub (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_MerchantPublicKeyP **pub);
/**
@ -2488,9 +2524,9 @@ TALER_TESTING_get_trait_merchant_pub (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_merchant_pub (unsigned int index,
const struct
TALER_MerchantPublicKeyP *pub);
TALER_TESTING_make_trait_merchant_pub (
unsigned int index,
const struct TALER_MerchantPublicKeyP *pub);
/**
@ -2504,10 +2540,10 @@ TALER_TESTING_make_trait_merchant_pub (unsigned int index,
* @return #GNUNET_OK on success.
*/
int
TALER_TESTING_get_trait_string (const struct
TALER_TESTING_Command *cmd,
unsigned int index,
const char **s);
TALER_TESTING_get_trait_string (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const char **s);
/**
@ -2533,10 +2569,10 @@ TALER_TESTING_make_trait_string (unsigned int index,
* @return #GNUNET_OK on success
*/
int
TALER_TESTING_get_trait_wtid (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
TALER_WireTransferIdentifierRawP **wtid);
TALER_TESTING_get_trait_wtid (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct TALER_WireTransferIdentifierRawP **wtid);
/**
@ -2547,9 +2583,9 @@ TALER_TESTING_get_trait_wtid (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_wtid (unsigned int index,
const struct
TALER_WireTransferIdentifierRawP *wtid);
TALER_TESTING_make_trait_wtid (
unsigned int index,
const struct TALER_WireTransferIdentifierRawP *wtid);
/**
@ -2752,10 +2788,10 @@ TALER_TESTING_get_trait_cmd (const struct TALER_TESTING_Command *cmd,
* @return #GNUNET_OK on success
*/
int
TALER_TESTING_get_trait_absolute_time (const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct
GNUNET_TIME_Absolute **time);
TALER_TESTING_get_trait_absolute_time (
const struct TALER_TESTING_Command *cmd,
unsigned int index,
const struct GNUNET_TIME_Absolute **time);
/**
@ -2766,8 +2802,8 @@ TALER_TESTING_get_trait_absolute_time (const struct TALER_TESTING_Command *cmd,
* @return the trait.
*/
struct TALER_TESTING_Trait
TALER_TESTING_make_trait_absolute_time (unsigned int index,
const struct
GNUNET_TIME_Absolute *time);
TALER_TESTING_make_trait_absolute_time (
unsigned int index,
const struct GNUNET_TIME_Absolute *time);
#endif

View File

@ -59,6 +59,7 @@ libtalertesting_la_SOURCES = \
testing_api_cmd_recoup.c \
testing_api_cmd_refund.c \
testing_api_cmd_refresh.c \
testing_api_cmd_revoke.c \
testing_api_cmd_serialize_keys.c \
testing_api_cmd_signal.c \
testing_api_cmd_sleep.c \
@ -88,6 +89,7 @@ libtalertesting_la_SOURCES = \
testing_api_trait_merchant_key.c \
testing_api_trait_number.c \
testing_api_trait_process.c \
testing_api_trait_reserve_history.c \
testing_api_trait_reserve_pub.c \
testing_api_trait_reserve_priv.c \
testing_api_trait_string.c \

View File

@ -71,7 +71,6 @@ static struct TALER_TESTING_BankConfiguration bc;
*/
#define CMD_EXEC_AGGREGATOR(label) \
TALER_TESTING_cmd_exec_aggregator (label, CONFIG_FILE), \
TALER_TESTING_cmd_exec_closer (label, CONFIG_FILE), \
TALER_TESTING_cmd_exec_transfer (label, CONFIG_FILE)
/**
@ -401,7 +400,8 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-1",
MHD_HTTP_OK,
"recoup-withdraw-coin-1",
NULL),
NULL,
"EUR:5"),
/**
* Re-withdraw from this reserve
*/
@ -460,7 +460,8 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-2",
MHD_HTTP_OK,
"recoup-withdraw-coin-2a",
NULL),
NULL,
"EUR:0.5"),
TALER_TESTING_cmd_end ()
};

View File

@ -72,7 +72,6 @@ static struct TALER_TESTING_BankConfiguration bc;
*/
#define CMD_EXEC_AGGREGATOR(label) \
TALER_TESTING_cmd_exec_aggregator (label "-aggregator", CONFIG_FILE), \
TALER_TESTING_cmd_exec_closer (label "-closer", CONFIG_FILE), \
TALER_TESTING_cmd_exec_transfer (label "-transfer", CONFIG_FILE)
@ -651,7 +650,8 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-1",
MHD_HTTP_OK,
"recoup-withdraw-coin-1",
NULL),
NULL,
"EUR:5"),
/* Check the money is back with the reserve */
TALER_TESTING_cmd_status ("recoup-reserve-status-1",
"recoup-create-reserve-1",
@ -674,7 +674,6 @@ run (void *cls,
"recoup-create-reserve-1",
"EUR:3.99",
MHD_HTTP_OK),
/* These commands should close the reserve because
* the aggregator is given a config file that ovverrides
* the reserve expiration time (making it now-ish) */
@ -687,9 +686,11 @@ run (void *cls,
"short-lived-reserve"),
TALER_TESTING_cmd_exec_wirewatch ("short-lived-aggregation",
CONFIG_FILE_EXPIRE_RESERVE_NOW),
TALER_TESTING_cmd_exec_closer ("close-reserves",
CONFIG_FILE_EXPIRE_RESERVE_NOW),
CONFIG_FILE_EXPIRE_RESERVE_NOW,
"EUR:5",
"EUR:0.01",
"short-lived-reserve"),
TALER_TESTING_cmd_exec_transfer ("close-reserves-transfer",
CONFIG_FILE_EXPIRE_RESERVE_NOW),
@ -745,11 +746,13 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-2",
MHD_HTTP_OK,
"recoup-withdraw-coin-2a",
NULL),
NULL,
"EUR:0.5"),
/* Idempotency of recoup (withdrawal variant) */
TALER_TESTING_cmd_recoup ("recoup-2b",
MHD_HTTP_OK,
"recoup-withdraw-coin-2a",
NULL,
NULL),
TALER_TESTING_cmd_deposit ("recoup-deposit-revoked",
"recoup-withdraw-coin-2b",
@ -809,7 +812,10 @@ run (void *cls,
CONFIG_FILE_EXPIRE_RESERVE_NOW);
reserve_open_close[(i * RESERVE_OPEN_CLOSE_CHUNK) + 2]
= TALER_TESTING_cmd_exec_closer ("reserve-open-close-aggregation",
CONFIG_FILE_EXPIRE_RESERVE_NOW);
CONFIG_FILE_EXPIRE_RESERVE_NOW,
"EUR:19.99",
"EUR:0.01",
"reserve-open-close-key");
reserve_open_close[(i * RESERVE_OPEN_CLOSE_CHUNK) + 3]
= TALER_TESTING_cmd_status ("reserve-open-close-status",
"reserve-open-close-key",

View File

@ -126,7 +126,8 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-not-allowed",
MHD_HTTP_NOT_FOUND,
"refresh-reveal-1#0",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
/* Make refreshed coin invalid */
TALER_TESTING_cmd_revoke ("revoke-2-EUR:5",
MHD_HTTP_OK,
@ -141,37 +142,45 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-fully-spent",
MHD_HTTP_CONFLICT,
"withdraw-revocation-coin-2",
NULL,
NULL),
/* Refund coin to original coin */
TALER_TESTING_cmd_recoup ("recoup-1a",
MHD_HTTP_OK,
"refresh-reveal-1#0",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
TALER_TESTING_cmd_recoup ("recoup-1b",
MHD_HTTP_OK,
"refresh-reveal-1#1",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
TALER_TESTING_cmd_recoup ("recoup-1c",
MHD_HTTP_OK,
"refresh-reveal-1#2",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
/* Repeat recoup to test idempotency */
TALER_TESTING_cmd_recoup ("recoup-1c",
MHD_HTTP_OK,
"refresh-reveal-1#2",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
TALER_TESTING_cmd_recoup ("recoup-1c",
MHD_HTTP_OK,
"refresh-reveal-1#2",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
TALER_TESTING_cmd_recoup ("recoup-1c",
MHD_HTTP_OK,
"refresh-reveal-1#2",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
TALER_TESTING_cmd_recoup ("recoup-1c",
MHD_HTTP_OK,
"refresh-reveal-1#2",
"refresh-melt-1"),
"refresh-melt-1",
NULL),
/* Now we have EUR:3.83 EUR back after 3x EUR:1 in recoups */
/* Melt original coin AGAIN, but only create one 0.1 EUR coin;
This costs EUR:0.03 in refresh and EUR:01 in withdraw fees,
@ -201,13 +210,15 @@ run (void *cls,
TALER_TESTING_cmd_recoup ("recoup-2",
MHD_HTTP_OK,
"refresh-reveal-2",
"refresh-melt-2"),
"refresh-melt-2",
NULL),
/* Due to recoup, original coin is now at EUR:3.79 */
/* Refund original (now zombie) coin to reserve */
TALER_TESTING_cmd_recoup ("recoup-3",
MHD_HTTP_OK,
"withdraw-revocation-coin-1",
NULL),
NULL,
"EUR:3.79"),
/* Check the money is back with the reserve */
TALER_TESTING_cmd_status ("recoup-reserve-status-1",
"create-reserve-1",

View File

@ -67,7 +67,6 @@ static char *config_filename;
*/
#define CMD_EXEC_AGGREGATOR(label, cfg_fn) \
TALER_TESTING_cmd_exec_aggregator (label "-aggregator", cfg_fn), \
TALER_TESTING_cmd_exec_closer (label "-closer", cfg_fn), \
TALER_TESTING_cmd_exec_transfer (label "-transfer", cfg_fn)

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
(C) 2016, 2017, 2018 Taler Systems SA
(C) 2016-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
@ -57,7 +57,6 @@ static char *config_filename;
*/
#define CMD_EXEC_AGGREGATOR(label) \
TALER_TESTING_cmd_exec_aggregator (label "-aggregator", config_filename), \
TALER_TESTING_cmd_exec_closer (label "-closer", config_filename), \
TALER_TESTING_cmd_exec_transfer (label "-transfer", config_filename)
@ -101,12 +100,25 @@ run (void *cls,
bc.exchange_payto, // credit
"run-transfer-good-to-exchange"),
CMD_EXEC_AGGREGATOR ("run-aggregator-non-expired-reserve"),
TALER_TESTING_cmd_exec_closer ("run-closer-non-expired-reserve",
config_filename,
NULL,
NULL,
NULL),
TALER_TESTING_cmd_exec_transfer ("do-idle-transfer", config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-1"),
TALER_TESTING_cmd_sleep ("wait (5s)",
5),
CMD_EXEC_AGGREGATOR ("run-aggregator-on-expired-reserve"),
TALER_TESTING_cmd_exec_closer ("run-closer-expired-reserve",
config_filename,
"EUR:4.99",
"EUR:0.01",
"run-transfer-good-to-exchange"),
TALER_TESTING_cmd_exec_transfer ("do-closing-transfer",
config_filename),
CMD_EXEC_AGGREGATOR ("run-closer-on-expired-reserve"),
TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-1",
ec.exchange_url,
"EUR:4.99",

View File

@ -96,11 +96,24 @@ struct AdminAddIncomingState
*/
struct TALER_TESTING_Interpreter *is;
/**
* Reserve history entry that corresponds to this operation.
* Will be of type #TALER_EXCHANGE_RTT_CREDIT. Note that
* the "sender_url" field is set to a 'const char *' and
* MUST NOT be free()'ed.
*/
struct TALER_EXCHANGE_ReserveHistory reserve_history;
/**
* Set to the wire transfer's unique ID.
*/
uint64_t serial_id;
/**
* Set to the wire transfer's row ID in network byte order.
*/
uint64_t row_id_nbo;
/**
* Timestamp of the transaction (as returned from the bank).
*/
@ -196,6 +209,11 @@ confirmation_cb (void *cls,
struct TALER_TESTING_Interpreter *is = fts->is;
(void) json;
fts->row_id_nbo = GNUNET_htonll (serial_id);
fts->reserve_history.details.in_details.timestamp = timestamp;
fts->reserve_history.details.in_details.wire_reference = &fts->row_id_nbo;
fts->reserve_history.details.in_details.wire_reference_size
= sizeof (fts->row_id_nbo);
fts->aih = NULL;
if (MHD_HTTP_OK != http_status)
{
@ -322,11 +340,10 @@ admin_add_incoming_run (void *cls,
GNUNET_free (keys);
if (NULL == priv)
{
GNUNET_log_config_invalid
(GNUNET_ERROR_TYPE_ERROR,
section,
"TIP_RESERVE_PRIV_FILENAME",
"Failed to read private key");
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
section,
"TIP_RESERVE_PRIV_FILENAME",
"Failed to read private key");
GNUNET_free (section);
TALER_TESTING_interpreter_fail (is);
return;
@ -349,10 +366,14 @@ admin_add_incoming_run (void *cls,
}
GNUNET_CRYPTO_eddsa_key_get_public (&fts->reserve_priv.eddsa_priv,
&fts->reserve_pub.eddsa_pub);
fts->reserve_history.type = TALER_EXCHANGE_RTT_CREDIT;
fts->reserve_history.amount = fts->amount;
fts->reserve_history.details.in_details.sender_url
= (char *) fts->payto_debit_account; /* remember to NOT free this one... */
fts->is = is;
fts->aih
= TALER_BANK_admin_add_incoming
(TALER_TESTING_interpreter_get_context (is),
= TALER_BANK_admin_add_incoming (
TALER_TESTING_interpreter_get_context (is),
&fts->auth,
&fts->reserve_pub,
&fts->amount,
@ -430,6 +451,8 @@ admin_add_incoming_traits (void *cls,
&fts->reserve_priv),
TALER_TESTING_make_trait_reserve_pub (0,
&fts->reserve_pub),
TALER_TESTING_make_trait_reserve_history (0,
&fts->reserve_history),
TALER_TESTING_trait_end ()
};

View File

@ -43,6 +43,29 @@ struct CloserState
* Configuration file used by the closer.
*/
const char *config_filename;
/**
* Reserve history entry that corresponds to this operation. Set if @e
* expect_close is true. Will be of type
* #TALER_EXCHANGE_RTT_RESERVE_CLOSED.
*/
struct TALER_EXCHANGE_ReserveHistory reserve_history;
/**
* If the closer filled a reserve (@e expect_close is set), this is set to
* the reserve's public key.
*/
struct TALER_ReservePublicKeyP reserve_pub;
/**
* Reference to a command to get the @e reserve_pub.
*/
const char *reserve_ref;
/**
* Do we expect the command to actually close a reserve?
*/
int expect_close;
};
@ -61,6 +84,24 @@ closer_run (void *cls,
struct CloserState *as = cls;
(void) cmd;
if (NULL != as->reserve_ref)
{
const struct TALER_TESTING_Command *rcmd;
const struct TALER_ReservePublicKeyP *reserve_pubp;
rcmd = TALER_TESTING_interpreter_lookup_command (is,
as->reserve_ref);
if (GNUNET_OK !=
TALER_TESTING_get_trait_reserve_pub (rcmd,
0,
&reserve_pubp))
{
GNUNET_break (0);
TALER_TESTING_interpreter_fail (is);
return;
}
as->reserve_pub = *reserve_pubp;
}
as->closer_proc
= GNUNET_OS_start_process (GNUNET_NO,
GNUNET_OS_INHERIT_STD_ALL,
@ -127,8 +168,18 @@ closer_traits (void *cls,
TALER_TESTING_make_trait_process (0, &as->closer_proc),
TALER_TESTING_trait_end ()
};
struct TALER_TESTING_Trait xtraits[] = {
TALER_TESTING_make_trait_process (0, &as->closer_proc),
TALER_TESTING_make_trait_reserve_pub (0,
&as->reserve_pub),
TALER_TESTING_make_trait_reserve_history (0,
&as->reserve_history),
TALER_TESTING_trait_end ()
};
return TALER_TESTING_get_trait (traits,
return TALER_TESTING_get_trait ((as->expect_close)
? xtraits
: traits,
ret,
trait,
index);
@ -136,21 +187,58 @@ closer_traits (void *cls,
/**
* Make a "closer" CMD.
* Make a "closer" CMD. Note that it is right now not supported to run the
* closer to close multiple reserves in combination with a subsequent reserve
* status call, as we cannot generate the traits necessary for multiple closed
* reserves. You can work around this by using multiple closer commands, one
* per reserve that is being closed.
*
* @param label command label.
* @param config_filename configuration file for the
* closer to use.
* @param expected_amount amount we expect to see wired from a @a expected_reserve_ref
* @param expected_fee closing fee we expect to see
* @param expected_reserve_ref reference to a reserve we expect the closer to drain;
* NULL if we do not expect the closer to do anything
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_exec_closer (const char *label,
const char *config_filename)
const char *config_filename,
const char *expected_amount,
const char *expected_fee,
const char *expected_reserve_ref)
{
struct CloserState *as;
as = GNUNET_new (struct CloserState);
as->config_filename = config_filename;
if (NULL != expected_reserve_ref)
{
as->expect_close = GNUNET_YES;
as->reserve_ref = expected_reserve_ref;
if (GNUNET_OK !=
TALER_string_to_amount (expected_amount,
&as->reserve_history.amount))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to parse amount `%s' at %s\n",
expected_amount,
label);
GNUNET_assert (0);
}
if (GNUNET_OK !=
TALER_string_to_amount (expected_fee,
&as->reserve_history.details.close_details.fee))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to parse amount `%s' at %s\n",
expected_fee,
label);
GNUNET_assert (0);
}
as->reserve_history.type = TALER_EXCHANGE_RTT_CLOSE;
}
{
struct TALER_TESTING_Command cmd = {
.cls = as,

View File

@ -48,6 +48,11 @@ struct StatusState
*/
const char *expected_balance;
/**
* Public key of the reserve being analyzed.
*/
const struct TALER_ReservePublicKeyP *reserve_pubp;
/**
* Expected HTTP response code.
*/
@ -60,6 +65,175 @@ struct StatusState
};
/**
* Compare @a h1 and @a h2.
*
* @param h1 a history entry
* @param h2 a history entry
* @return 0 if @a h1 and @a h2 are equal
*/
static int
history_entry_cmp (const struct TALER_EXCHANGE_ReserveHistory *h1,
const struct TALER_EXCHANGE_ReserveHistory *h2)
{
if (h1->type != h2->type)
return 1;
switch (h1->type)
{
case TALER_EXCHANGE_RTT_CREDIT:
if ( (0 ==
TALER_amount_cmp (&h1->amount,
&h2->amount)) &&
(h1->details.in_details.wire_reference_size ==
h2->details.in_details.wire_reference_size) &&
(0 == strcasecmp (h1->details.in_details.sender_url,
h2->details.in_details.sender_url)) &&
(0 == memcmp (h1->details.in_details.wire_reference,
h2->details.in_details.wire_reference,
h1->details.in_details.wire_reference_size)) &&
(h1->details.in_details.timestamp.abs_value_us ==
h2->details.in_details.timestamp.abs_value_us) )
return 0;
return 1;
case TALER_EXCHANGE_RTT_WITHDRAWAL:
if ( (0 ==
TALER_amount_cmp (&h1->amount,
&h2->amount)) &&
(0 ==
TALER_amount_cmp (&h1->details.withdraw.fee,
&h2->details.withdraw.fee)) )
/* testing_api_cmd_withdraw doesn't set the out_authorization_sig,
so we cannot test for it here. but if the amount matches,
that should be good enough. */
return 0;
return 1;
case TALER_EXCHANGE_RTT_RECOUP:
/* exchange_sig, exchange_pub and timestamp are NOT available
from the original recoup response, hence here NOT check(able/ed) */
if ( (0 ==
TALER_amount_cmp (&h1->amount,
&h2->amount)) &&
(0 ==
GNUNET_memcmp (&h1->details.recoup_details.coin_pub,
&h2->details.recoup_details.coin_pub)) )
return 0;
return 1;
case TALER_EXCHANGE_RTT_CLOSE:
/* testing_api_cmd_exec_closer doesn't set the
receiver_account_details, exchange_sig, exchange_pub or wtid or timestamp
so we cannot test for it here. but if the amount matches,
that should be good enough. */
if ( (0 ==
TALER_amount_cmp (&h1->amount,
&h2->amount)) &&
(0 ==
TALER_amount_cmp (&h1->details.close_details.fee,
&h2->details.close_details.fee)) )
return 0;
return 1;
}
GNUNET_assert (0);
return 1;
}
/**
* Check if @a cmd changed the reserve, if so, find the
* entry in @a history and set the respective index in @a found
* to #GNUNET_YES. If the entry is not found, return #GNUNET_SYSERR.
*
* @param reserve_pub public key of the reserve for which we have the @a history
* @param cmd command to analyze for impact on history
* @param history_length number of entries in @a history and @a found
* @param history history to check
* @param[in,out] found array to update
* @return #GNUNET_OK if @a cmd action on reserve was found in @a history
*/
static int
analyze_command (const struct TALER_ReservePublicKeyP *reserve_pub,
const struct TALER_TESTING_Command *cmd,
unsigned int history_length,
const struct TALER_EXCHANGE_ReserveHistory *history,
int *found)
{
if (TALER_TESTING_cmd_is_batch (cmd))
{
#define BATCH_INDEX 1
struct TALER_TESTING_Command *cur;
struct TALER_TESTING_Command *bcmd;
cur = TALER_TESTING_cmd_batch_get_current (cmd);
if (GNUNET_OK !=
TALER_TESTING_get_trait_cmd (cmd,
BATCH_INDEX,
&bcmd))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
for (unsigned int i = 0; NULL != bcmd[i].label; i++)
{
struct TALER_TESTING_Command *step = &bcmd[i];
if (step == cur)
break; /* if *we* are in a batch, make sure not to analyze commands past 'now' */
if (GNUNET_OK !=
analyze_command (reserve_pub,
step,
history_length,
history,
found))
return GNUNET_SYSERR;
}
return GNUNET_OK;
}
else
{
const struct TALER_ReservePublicKeyP *rp;
const struct TALER_EXCHANGE_ReserveHistory *he;
if (GNUNET_OK !=
TALER_TESTING_get_trait_reserve_pub (cmd,
0,
&rp))
return GNUNET_OK; /* command does nothing for reserves */
if (0 !=
GNUNET_memcmp (rp,
reserve_pub))
return GNUNET_OK; /* command affects some _other_ reserve */
if (GNUNET_OK !=
TALER_TESTING_get_trait_reserve_history (cmd,
0,
&he))
{
/* NOTE: good for debugging for now, might later reduce debug
level in case there are commands that legitimately don't
impact the reserve history but have the public key trait */
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Command `%s' has the reserve_pub trait, but does not reserve history trait\n",
cmd->label);
return GNUNET_OK; /* command does nothing for reserves */
}
for (unsigned int i = 0; i<history_length; i++)
{
if (found[i])
continue; /* already found, skip */
if (0 ==
history_entry_cmp (he,
&history[i]))
{
found[i] = GNUNET_YES;
return GNUNET_OK;
}
}
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Command `%s' reserve history entry not found\n",
cmd->label);
return GNUNET_SYSERR;
}
}
/**
* Check that the reserve balance and HTTP response code are
* both acceptable.
@ -83,6 +257,7 @@ reserve_status_cb (void *cls,
const struct TALER_EXCHANGE_ReserveHistory *history)
{
struct StatusState *ss = cls;
struct TALER_TESTING_Interpreter *is = ss->is;
struct TALER_Amount eb;
ss->rsh = NULL;
@ -111,24 +286,40 @@ reserve_status_cb (void *cls,
TALER_TESTING_interpreter_fail (ss->is);
return;
}
{
int found[history_length];
/**
* TODO (#6049): We should check that reserve history is consistent. Every
* command which relates to reserve 'x' should be added in a linked list of
* all commands that relate to the same reserve 'x'.
*
* API-wise, any command that relates to a reserve should offer a
* method called e.g. "compare_with_history" that takes an element
* of the array returned by "/reserve/status" and checks if that
* element correspond to itself (= the command exposing the check-
* method).
*
* IDEA: Maybe realize this via another trait, some kind of
* "reserve history update trait" which returns information about
* how the command changes the history (provided only by commands
* that change reserve balances)?
*///
TALER_TESTING_interpreter_next (ss->is);
memset (found, 0, sizeof (found));
for (unsigned int i = 0; i<=is->ip; i++)
{
struct TALER_TESTING_Command *cmd = &is->commands[i];
if (GNUNET_OK !=
analyze_command (ss->reserve_pubp,
cmd,
history_length,
history,
found))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Entry for command `%s' missing in history\n",
cmd->label);
TALER_TESTING_interpreter_fail (ss->is);
return;
}
}
for (unsigned int i = 0; i<history_length; i++)
if (! found[i])
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"History entry at index %u of type %d not justified by command history\n",
i,
history[i].type);
TALER_TESTING_interpreter_fail (ss->is);
return;
}
}
TALER_TESTING_interpreter_next (is);
}
@ -146,7 +337,6 @@ status_run (void *cls,
{
struct StatusState *ss = cls;
const struct TALER_TESTING_Command *create_reserve;
const struct TALER_ReservePublicKeyP *reserve_pubp;
ss->is = is;
create_reserve
@ -162,7 +352,7 @@ status_run (void *cls,
if (GNUNET_OK !=
TALER_TESTING_get_trait_reserve_pub (create_reserve,
0,
&reserve_pubp))
&ss->reserve_pubp))
{
GNUNET_break (0);
TALER_LOG_ERROR ("Failed to find reserve_pub for status query\n");
@ -170,7 +360,7 @@ status_run (void *cls,
return;
}
ss->rsh = TALER_EXCHANGE_reserves_get (is->exchange,
reserve_pubp,
ss->reserve_pubp,
&reserve_status_cb,
ss);
}

View File

@ -94,6 +94,12 @@ struct WithdrawState
*/
struct TALER_PlanchetSecretsP ps;
/**
* Reserve history entry that corresponds to this operation.
* Will be of type #TALER_EXCHANGE_RTT_WITHDRAWAL.
*/
struct TALER_EXCHANGE_ReserveHistory reserve_history;
/**
* Withdraw handle (while operation is running).
*/
@ -286,8 +292,10 @@ withdraw_run (void *cls,
const struct TALER_EXCHANGE_DenomPublicKey *dpk;
(void) cmd;
create_reserve = TALER_TESTING_interpreter_lookup_command
(is, ws->reserve_reference);
create_reserve
= TALER_TESTING_interpreter_lookup_command (
is,
ws->reserve_reference);
if (NULL == create_reserve)
{
GNUNET_break (0);
@ -322,6 +330,16 @@ withdraw_run (void *cls,
* would free the old one. */
ws->pk = TALER_EXCHANGE_copy_denomination_key (dpk);
}
else
{
ws->amount = ws->pk->value;
}
ws->reserve_history.type = TALER_EXCHANGE_RTT_WITHDRAWAL;
GNUNET_assert (GNUNET_OK ==
TALER_amount_add (&ws->reserve_history.amount,
&ws->amount,
&ws->pk->fee_withdraw));
ws->reserve_history.details.withdraw.fee = ws->pk->fee_withdraw;
ws->wsh = TALER_EXCHANGE_withdraw (is->exchange,
ws->pk,
rp,
@ -401,8 +419,8 @@ withdraw_traits (void *cls,
/* We offer the reserve key where these coins were withdrawn
* from. */
reserve_cmd = TALER_TESTING_interpreter_lookup_command
(ws->is, ws->reserve_reference);
reserve_cmd = TALER_TESTING_interpreter_lookup_command (ws->is,
ws->reserve_reference);
if (NULL == reserve_cmd)
{
@ -434,6 +452,9 @@ withdraw_traits (void *cls,
= GNUNET_strdup (TALER_EXCHANGE_get_base_url (ws->is->exchange));
{
struct TALER_TESTING_Trait traits[] = {
/* history entry MUST be first due to response code logic below! */
TALER_TESTING_make_trait_reserve_history (0,
&ws->reserve_history),
TALER_TESTING_make_trait_coin_priv (0 /* only one coin */,
&ws->ps.coin_priv),
TALER_TESTING_make_trait_blinding_key (0 /* only one coin */,
@ -453,7 +474,9 @@ withdraw_traits (void *cls,
TALER_TESTING_trait_end ()
};
return TALER_TESTING_get_trait (traits,
return TALER_TESTING_get_trait ((ws->expected_response_code == MHD_HTTP_OK)
? &traits[0] /* we have reserve history */
: &traits[1],/* skip reserve history */
ret,
trait,
index);

View File

@ -45,6 +45,8 @@ TALER_TESTING_get_trait_reserve_pub
unsigned int index,
const struct TALER_ReservePublicKeyP **reserve_pub)
{
if (NULL == cmd->traits)
return GNUNET_SYSERR;
return cmd->traits (cmd->cls,
(const void **) reserve_pub,
TALER_TESTING_TRAIT_RESERVE_PUBLIC_KEY,