add test case (currently fails) for deposit idempotency

This commit is contained in:
Florian Dold 2020-03-27 19:14:55 +05:30
parent d923f29144
commit 6620a5b691
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 79 additions and 1 deletions

View File

@ -1330,6 +1330,20 @@ TALER_TESTING_cmd_deposit (const char *label,
struct TALER_TESTING_Command
TALER_TESTING_cmd_deposit_with_retry (struct TALER_TESTING_Command cmd);
/**
* Create a "deposit" command that repeats an existing
* deposit command.
*
* @param label command label.
* @param expected_response_code expected HTTP response code.
*
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_deposit_replay (const char *label,
const char *deposit_reference,
unsigned int expected_response_code);
/**
* Create a "refresh melt" command.

View File

@ -176,7 +176,10 @@ run (void *cls,
GNUNET_TIME_UNIT_ZERO,
"EUR:5",
MHD_HTTP_OK),
/**
TALER_TESTING_cmd_deposit_replay ("deposit-simple-replay",
"deposit-simple",
MHD_HTTP_OK),
/*
* Try to overdraw.
*/
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",

View File

@ -137,6 +137,12 @@ struct DepositState
* deposit confirmation.
*/
struct TALER_ExchangeSignatureP exchange_sig;
/**
* Reference to previous deposit operation.
* Only present if we're supposed to replay the previous deposit.
*/
const char *deposit_reference;
};
@ -269,6 +275,29 @@ deposit_run (void *cls,
(void) cmd;
ds->is = is;
if (NULL != ds->deposit_reference)
{
// We're copying another deposit operation, initialize here.
const struct TALER_TESTING_Command *cmd;
struct DepositState *ods;
cmd = TALER_TESTING_interpreter_lookup_command
(is,
ds->deposit_reference);
if (NULL == cmd)
{
GNUNET_break (0);
TALER_TESTING_interpreter_fail (is);
return;
}
ods = cmd->cls;
ds->coin_reference = ods->coin_reference;
ds->coin_index = ods->coin_index;
ds->wire_details = ods->wire_details;
ds->contract_terms = ods->contract_terms;
ds->timestamp = ods->timestamp;
ds->refund_deadline = ods->refund_deadline;
ds->amount = ods->amount;
}
GNUNET_assert (ds->coin_reference);
coin_cmd = TALER_TESTING_interpreter_lookup_command
(is,
@ -562,6 +591,38 @@ TALER_TESTING_cmd_deposit (const char *label,
}
/**
* Create a "deposit" command that repeats an existing
* deposit command.
*
* @param label command label.
* @param expected_response_code expected HTTP response code.
*
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_deposit_replay (const char *label,
const char *deposit_reference,
unsigned int expected_response_code)
{
struct DepositState *ds;
ds = GNUNET_new (struct DepositState);
ds->deposit_reference = deposit_reference;
ds->expected_response_code = expected_response_code;
{
struct TALER_TESTING_Command cmd = {
.cls = ds,
.label = label,
.run = &deposit_run,
.cleanup = &deposit_cleanup,
.traits = &deposit_traits
};
return cmd;
}
}
/**
* Modify a deposit command to enable retries when we get transient
* errors from the exchange.