cover actual aggregation in exchange test

This commit is contained in:
Florian Dold 2020-03-27 20:47:30 +05:30
parent 1a15cd29e8
commit e267cb985b
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 202 additions and 0 deletions

View File

@ -1319,6 +1319,40 @@ TALER_TESTING_cmd_deposit (const char *label,
const char *amount,
unsigned int expected_response_code);
/**
* Create a "deposit" command that references an existing merchant key.
*
* @param label command label.
* @param coin_reference reference to any operation that can
* provide a coin.
* @param coin_index if @a withdraw_reference offers an array of
* coins, this parameter selects which one in that array.
* This value is currently ignored, as only one-coin
* withdrawals are implemented.
* @param target_account_payto target account for the "deposit"
* request.
* @param contract_terms contract terms to be signed over by the
* coin.
* @param refund_deadline refund deadline, zero means 'no refunds'.
* Note, if time were absolute, then it would have come
* one day and disrupt tests meaning.
* @param amount how much is going to be deposited.
* @param expected_response_code expected HTTP response code.
* @param merchant_priv_reference reference to another operation
* that has a merchant private key trait
*
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_deposit_with_ref (const char *label,
const char *coin_reference,
unsigned int coin_index,
const char *target_account_payto,
const char *contract_terms,
struct GNUNET_TIME_Relative refund_deadline,
const char *amount,
unsigned int expected_response_code,
const char *merchant_priv_reference);
/**
* Modify a deposit command to enable retries when we get transient

View File

@ -436,6 +436,53 @@ run (void *cls,
TALER_TESTING_cmd_end ()
};
/**
* This block exercises the aggretation logic by making two payments
* to the same merchant.
*/
struct TALER_TESTING_Command aggregation[] = {
CMD_TRANSFER_TO_EXCHANGE ("create-reserve-aggtest",
"EUR:5.01"),
/* "consume" reserve creation transfer. */
TALER_TESTING_cmd_check_bank_admin_transfer (
"check-create-reserve-aggtest",
"EUR:5.01",
bc.user42_payto,
bc.exchange_payto,
"create-reserve-aggtest"),
CMD_EXEC_WIREWATCH ("wirewatch-aggtest"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-aggtest",
"create-reserve-aggtest",
"EUR:5",
MHD_HTTP_OK),
TALER_TESTING_cmd_deposit ("deposit-aggtest-1",
"withdraw-coin-aggtest",
0,
bc.user43_payto,
"{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
GNUNET_TIME_UNIT_ZERO,
"EUR:2",
MHD_HTTP_OK),
TALER_TESTING_cmd_deposit_with_ref ("deposit-aggtest-2",
"withdraw-coin-aggtest",
0,
bc.user43_payto,
"{\"items\":[{\"name\":\"foo bar\",\"value\":1}]}",
GNUNET_TIME_UNIT_ZERO,
"EUR:2",
MHD_HTTP_OK,
"deposit-aggtest-1"),
CMD_EXEC_AGGREGATOR ("aggregation-aggtest"),
TALER_TESTING_cmd_check_bank_transfer ("check-bank-transfer-aggtest",
ec.exchange_url,
"EUR:3.97",
bc.exchange_payto,
bc.user43_payto),
TALER_TESTING_cmd_check_bank_empty ("check-bank-empty-aggtest"),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command refund[] = {
/**
* Fill reserve with EUR:5.01, as withdraw fee is 1 ct per
@ -786,6 +833,8 @@ run (void *cls,
track),
TALER_TESTING_cmd_batch ("unaggregation",
unaggregation),
TALER_TESTING_cmd_batch ("aggregation",
aggregation),
TALER_TESTING_cmd_batch ("refund",
refund),
TALER_TESTING_cmd_batch ("recoup",

View File

@ -151,6 +151,12 @@ struct DepositState
* this will only be set after the command has been started.
*/
int command_initialized;
/**
* Reference to fetch the merchant private key from.
* If NULL, we generate our own, fresh merchant key.
*/
const char *merchant_priv_reference;
};
@ -307,6 +313,31 @@ deposit_run (void *cls,
ds->merchant_priv = ods->merchant_priv;
ds->command_initialized = GNUNET_YES;
}
else if (NULL != ds->merchant_priv_reference)
{
// We're copying the merchant key from another deposit operation
const struct TALER_MerchantPrivateKeyP *merchant_priv;
const struct TALER_TESTING_Command *cmd;
cmd = TALER_TESTING_interpreter_lookup_command
(is,
ds->merchant_priv_reference);
if (NULL == cmd)
{
GNUNET_break (0);
TALER_TESTING_interpreter_fail (is);
return;
}
if ( (GNUNET_OK !=
TALER_TESTING_get_trait_merchant_priv (cmd,
0,
&merchant_priv)) )
{
GNUNET_break (0);
TALER_TESTING_interpreter_fail (is);
return;
}
ds->merchant_priv = *merchant_priv;
}
GNUNET_assert (ds->coin_reference);
coin_cmd = TALER_TESTING_interpreter_lookup_command
(is,
@ -608,6 +639,94 @@ TALER_TESTING_cmd_deposit (const char *label,
}
/**
* Create a "deposit" command that references an existing merchant key.
*
* @param label command label.
* @param coin_reference reference to any operation that can
* provide a coin.
* @param coin_index if @a withdraw_reference offers an array of
* coins, this parameter selects which one in that array.
* This value is currently ignored, as only one-coin
* withdrawals are implemented.
* @param target_account_payto target account for the "deposit"
* request.
* @param contract_terms contract terms to be signed over by the
* coin.
* @param refund_deadline refund deadline, zero means 'no refunds'.
* Note, if time were absolute, then it would have come
* one day and disrupt tests meaning.
* @param amount how much is going to be deposited.
* @param expected_response_code expected HTTP response code.
* @param merchant_priv_reference reference to another operation
* that has a merchant private key trait
*
* @return the command.
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_deposit_with_ref (const char *label,
const char *coin_reference,
unsigned int coin_index,
const char *target_account_payto,
const char *contract_terms,
struct GNUNET_TIME_Relative refund_deadline,
const char *amount,
unsigned int expected_response_code,
const char *merchant_priv_reference)
{
struct DepositState *ds;
json_t *wire_details;
wire_details = TALER_TESTING_make_wire_details (target_account_payto);
ds = GNUNET_new (struct DepositState);
ds->merchant_priv_reference = merchant_priv_reference;
ds->coin_reference = coin_reference;
ds->coin_index = coin_index;
ds->wire_details = wire_details;
ds->contract_terms = json_loads (contract_terms,
JSON_REJECT_DUPLICATES,
NULL);
if (NULL == ds->contract_terms)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to parse contract terms `%s' for CMD `%s'\n",
contract_terms,
label);
GNUNET_assert (0);
}
ds->timestamp = GNUNET_TIME_absolute_get ();
(void) GNUNET_TIME_round_abs (&ds->timestamp);
json_object_set_new (ds->contract_terms,
"timestamp",
GNUNET_JSON_from_time_abs (ds->timestamp));
if (0 != refund_deadline.rel_value_us)
{
ds->refund_deadline = GNUNET_TIME_relative_to_absolute (refund_deadline);
(void) GNUNET_TIME_round_abs (&ds->refund_deadline);
json_object_set_new (ds->contract_terms,
"refund_deadline",
GNUNET_JSON_from_time_abs (ds->refund_deadline));
}
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (amount,
&ds->amount));
ds->expected_response_code = expected_response_code;
ds->command_initialized = GNUNET_YES;
{
struct TALER_TESTING_Command cmd = {
.cls = ds,
.label = label,
.run = &deposit_run,
.cleanup = &deposit_cleanup,
.traits = &deposit_traits
};
return cmd;
}
}
/**
* Create a "deposit" command that repeats an existing
* deposit command.