also test reserve history after payback

This commit is contained in:
Christian Grothoff 2017-04-10 17:59:33 +02:00
parent 65d74ec0a0
commit 1fe26d5d2e
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 74 additions and 4 deletions

View File

@ -274,7 +274,7 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
&rhistory[off].details.payback_details.exchange_sig),
GNUNET_JSON_spec_fixed_auto ("exchange_pub",
&rhistory[off].details.payback_details.exchange_pub),
GNUNET_JSON_spec_absolute_time ("timetamp",
GNUNET_JSON_spec_absolute_time ("timestamp",
&timestamp),
TALER_JSON_spec_amount ("amount",
&rhistory[off].amount),
@ -325,6 +325,15 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
TALER_amount_add (&total_in,
&total_in,
&rhistory[off].amount))
{
/* overflow in history already!? inconceivable! Bad exchange! */
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
/* end type==PAYBACK */
}
else if (0 == strcasecmp (type,

View File

@ -921,6 +921,38 @@ compare_reserve_withdraw_history (const struct TALER_EXCHANGE_ReserveHistory *h,
}
/**
* Check if the given historic event @a h corresponds to the given
* command @a cmd.
*
* @param h event in history
* @param cmd an #OC_WITHDRAW_SIGN command
* @return #GNUNET_OK if they match, #GNUNET_SYSERR if not
*/
static int
compare_reserve_payback_history (const struct TALER_EXCHANGE_ReserveHistory *h,
const struct Command *cmd)
{
struct TALER_Amount amount;
if (TALER_EXCHANGE_RTT_PAYBACK != h->type)
{
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (cmd->details.payback.amount,
&amount));
if (0 != TALER_amount_cmp (&amount,
&h->amount))
{
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
return GNUNET_OK;
}
/**
* Function called with the result of a /reserve/status request.
*
@ -945,6 +977,7 @@ reserve_status_cb (void *cls,
struct InterpreterState *is = cls;
struct Command *cmd = &is->commands[is->ip];
struct Command *rel;
const struct Command *xrel;
unsigned int i;
unsigned int j;
struct TALER_Amount amount;
@ -1007,6 +1040,24 @@ reserve_status_cb (void *cls,
j++;
}
break;
case OC_PAYBACK:
xrel = find_command (is,
rel->details.payback.ref);
if (0 == strcmp (cmd->details.reserve_status.reserve_reference,
xrel->details.reserve_withdraw.reserve_reference))
{
if ( (j >= history_length) ||
(GNUNET_OK !=
compare_reserve_payback_history (&history[j],
rel)) )
{
GNUNET_break (0);
fail (is);
return;
}
j++;
}
break;
default:
/* unreleated, just skip */
break;
@ -1088,6 +1139,9 @@ reserve_withdraw_cb (void *cls,
case MHD_HTTP_FORBIDDEN:
/* nothing to check */
break;
case MHD_HTTP_NOT_FOUND:
/* nothing to check */
break;
default:
/* Unsupported status code (by test harness) */
GNUNET_break (0);
@ -2666,7 +2720,7 @@ interpreter_run (void *cls)
const struct Command *ref;
ref = find_command (is,
cmd->details.revoke.ref);
cmd->details.payback.ref);
GNUNET_assert (NULL != ref);
cmd->details.payback.ph
= TALER_EXCHANGE_payback (exchange,
@ -3399,6 +3453,12 @@ run (void *cls)
.expected_response_code = MHD_HTTP_OK,
.details.payback.ref = "payback-withdraw-coin-1",
.details.payback.amount = "EUR:5" },
/* Check the money is back with the reserve */
{ .oc = OC_WITHDRAW_STATUS,
.label = "payback-reserve-status-1",
.expected_response_code = MHD_HTTP_OK,
.details.reserve_status.reserve_reference = "payback-create-reserve-1",
.details.reserve_status.expected_balance = "EUR:5.00" },
/* Fill reserve with EUR:2.02, as withdraw fee is 1 ct per config,

View File

@ -745,12 +745,13 @@ compile_reserve_history (const struct TALER_EXCHANGEDB_ReserveHistory *rh,
GNUNET_assert (0 ==
json_array_append_new (json_history,
json_pack ("{s:s, s:o, s:o, s:o, s:o}",
json_pack ("{s:s, s:o, s:o, s:o, s:o, s:o}",
"type", "PAYBACK",
"exchange_pub", GNUNET_JSON_from_data_auto (&pub),
"exchange_sig", GNUNET_JSON_from_data_auto (&sig),
"timestamp", GNUNET_JSON_from_time_abs (payback->timestamp),
"amount", TALER_JSON_from_amount (&payback->value))));
"amount", TALER_JSON_from_amount (&payback->value),
"details", GNUNET_JSON_from_data_auto (&pc))));
break;
case TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK:
value = pos->details.bank->amount;