Trigger conflicting refunds

This commit is contained in:
Marcello Stanisci 2018-05-17 15:50:50 +02:00
parent 5e1178a74b
commit 381ac75ae0
No known key found for this signature in database
GPG Key ID: 8D526861953F4C0F
4 changed files with 68 additions and 0 deletions

View File

@ -184,6 +184,10 @@ handle_refund_finished (void *cls,
/* Client request was inconsistent; might be a currency missmatch /* Client request was inconsistent; might be a currency missmatch
problem. */ problem. */
break; break;
case MHD_HTTP_CONFLICT:
/* Two refund requests were made about the same deposit, but
carrying different refund transaction ids. */
break;
case MHD_HTTP_INTERNAL_SERVER_ERROR: case MHD_HTTP_INTERNAL_SERVER_ERROR:
/* Server had an internal issue; we should retry, but this API /* Server had an internal issue; we should retry, but this API
leaves this to the application */ leaves this to the application */

View File

@ -500,6 +500,11 @@ run (void *cls,
("refund-ok-double", MHD_HTTP_OK, ("refund-ok-double", MHD_HTTP_OK,
"EUR:5", "EUR:0.01", "deposit-refund-1"), "EUR:5", "EUR:0.01", "deposit-refund-1"),
/* Previous /refund(s) had id == 0. */
TALER_TESTING_cmd_refund_with_id
("refund-conflicting", MHD_HTTP_CONFLICT,
"EUR:5", "EUR:0.01", "deposit-refund-1", 1),
/** /**
* Spend 4.99 EUR of the refunded 4.99 EUR coin (1ct gone * Spend 4.99 EUR of the refunded 4.99 EUR coin (1ct gone
* due to refund) (merchant would receive EUR:4.98 due to * due to refund) (merchant would receive EUR:4.98 due to

View File

@ -298,3 +298,42 @@ TALER_TESTING_cmd_refund (const char *label,
return cmd; return cmd;
} }
/**
* Create a /refund test command, allows to specify refund
* transaction id. Mainly used to create conflicting requests.
*
* @param label command label
* @param expected_response_code expected HTTP status code
* @param refund_amount the amount to ask a refund for
* @param refund_fee expected refund fee
* @param coin_reference reference to a command that can
* provide a coin to be refunded.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_refund_with_id
(const char *label,
unsigned int expected_response_code,
const char *refund_amount,
const char *refund_fee,
const char *coin_reference,
uint64_t refund_transaction_id)
{
struct RefundState *rs;
struct TALER_TESTING_Command cmd;
rs = GNUNET_new (struct RefundState);
rs->expected_response_code = expected_response_code;
rs->refund_amount = refund_amount;
rs->refund_fee = refund_fee;
rs->coin_reference = coin_reference;
rs->refund_transaction_id = refund_transaction_id;
cmd.cls = rs;
cmd.label = label;
cmd.run = &refund_run;
cmd.cleanup = &refund_cleanup;
return cmd;
}

View File

@ -828,6 +828,26 @@ TALER_TESTING_cmd_check_bank_transfer_with_ref
struct TALER_TESTING_Command struct TALER_TESTING_Command
TALER_TESTING_cmd_check_bank_empty (const char *label); TALER_TESTING_cmd_check_bank_empty (const char *label);
/**
* Create a /refund test command, allows to specify refund
* transaction id.
*
* @param label command label
* @param expected_response_code expected HTTP status code
* @param refund_amount the amount to ask a refund for
* @param refund_fee expected refund fee
* @param coin_reference reference to a command that can
* provide a coin to be refunded.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_refund_with_id
(const char *label,
unsigned int expected_response_code,
const char *refund_amount,
const char *refund_fee,
const char *deposit_reference,
uint64_t refund_transaction_id);
/** /**
* Create a /refund test command. * Create a /refund test command.
* *