add testcase for #5077 (passes), start to reduce use of exchange's admin/add/incoming (#5172, more to come)

This commit is contained in:
Christian Grothoff 2017-12-10 16:02:03 +01:00
parent d36de3bdd6
commit 6623afa2a3
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 267 additions and 151 deletions

View File

@ -86,6 +86,13 @@ struct Transaction
* Flag set if the transfer was rejected. * Flag set if the transfer was rejected.
*/ */
int rejected; int rejected;
/**
* Has this transaction been subjected to #TALER_FAKEBANK_check()
* and should thus no longer be counted in
* #TALER_FAKEBANK_check_empty()?
*/
int checked;
}; };
@ -150,15 +157,12 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
(want_credit == t->credit_account) && (want_credit == t->credit_account) &&
(0 == TALER_amount_cmp (want_amount, (0 == TALER_amount_cmp (want_amount,
&t->amount)) && &t->amount)) &&
(GNUNET_NO == t->checked) &&
(0 == strcasecmp (exchange_base_url, (0 == strcasecmp (exchange_base_url,
t->exchange_base_url)) ) t->exchange_base_url)) )
{ {
GNUNET_CONTAINER_DLL_remove (h->transactions_head, *subject = GNUNET_strdup (t->subject);
h->transactions_tail, t->checked = GNUNET_YES;
t);
*subject = t->subject;
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
return GNUNET_OK; return GNUNET_OK;
} }
} }
@ -168,6 +172,8 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
{ {
char *s; char *s;
if (GNUNET_YES == t->checked)
continue;
s = TALER_amount_to_string (&t->amount); s = TALER_amount_to_string (&t->amount);
fprintf (stderr, fprintf (stderr,
"%llu -> %llu (%s) from %s\n", "%llu -> %llu (%s) from %s\n",
@ -262,23 +268,35 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h)
{ {
struct Transaction *t; struct Transaction *t;
if (NULL == h->transactions_head) t = h->transactions_head;
while (NULL != t)
{
if ( (GNUNET_YES != t->checked) &&
(GNUNET_YES != t->rejected) )
break;
t = t->next;
}
if (NULL == t)
return GNUNET_OK; return GNUNET_OK;
fprintf (stderr, fprintf (stderr,
"Expected empty transaction set, but I have:\n"); "Expected empty transaction set, but I have:\n");
for (t = h->transactions_head; NULL != t; t = t->next) while (NULL != t)
{ {
char *s; if ( (GNUNET_YES != t->checked) &&
(GNUNET_YES != t->rejected) )
{
char *s;
s = TALER_amount_to_string (&t->amount); s = TALER_amount_to_string (&t->amount);
fprintf (stderr, fprintf (stderr,
"%llu -> %llu (%s) from %s\n", "%llu -> %llu (%s) from %s\n",
(unsigned long long) t->debit_account, (unsigned long long) t->debit_account,
(unsigned long long) t->credit_account, (unsigned long long) t->credit_account,
s, s,
t->exchange_base_url); t->exchange_base_url);
GNUNET_free (s); GNUNET_free (s);
}
t = t->next;
} }
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
@ -748,7 +766,9 @@ handle_history (struct TALER_FAKEBANK_Handle *h,
break; break;
if (NULL == pos) if (NULL == pos)
{ {
GNUNET_break (0); GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Invalid range specified, transaction %llu not known!\n",
(unsigned long long) start_number);
return MHD_NO; return MHD_NO;
} }
/* range is exclusive, skip the matching entry */ /* range is exclusive, skip the matching entry */

View File

@ -158,35 +158,6 @@ test_cancelled (struct InterpreterState *is,
} }
/**
* Test if the /admin/add/incoming transaction at offset @a off
* has been #TBI_OC_EXPECT_TRANSFER treated, and thus been
* forgotten by the fakebank.
*
* @param is interpreter state (where we are right now)
* @param off offset of the command to test for rejection
* @return #GNUNET_YES if the command at @a off was cancelled
*/
static int
test_deleted_by_expected (struct InterpreterState *is,
unsigned int off)
{
const struct TBI_Command *cmd = &is->commands[off];
for (unsigned int i=0;i<is->ip;i++)
{
const struct TBI_Command *c = &is->commands[i];
if (TBI_OC_EXPECT_TRANSFER != c->oc)
continue;
if (0 == strcmp (c->details.expect_transfer.cmd_ref,
cmd->label))
return GNUNET_YES;
}
return GNUNET_NO;
}
/** /**
* Item in the transaction history, as reconstructed from the * Item in the transaction history, as reconstructed from the
* command history. * command history.
@ -286,10 +257,6 @@ build_history (struct InterpreterState *is,
continue; /* skip until we find the marker */ continue; /* skip until we find the marker */
if (total >= cmd->details.history.num_results * inc) if (total >= cmd->details.history.num_results * inc)
break; /* hit limit specified by command */ break; /* hit limit specified by command */
if (GNUNET_YES ==
test_deleted_by_expected (is,
off))
continue;
cancelled = test_cancelled (is, cancelled = test_cancelled (is,
off); off);
if ( (GNUNET_YES == cancelled) && if ( (GNUNET_YES == cancelled) &&
@ -335,11 +302,6 @@ build_history (struct InterpreterState *is,
continue; /* skip until we find the marker */ continue; /* skip until we find the marker */
if (total >= cmd->details.history.num_results * inc) if (total >= cmd->details.history.num_results * inc)
break; /* hit limit specified by command */ break; /* hit limit specified by command */
if (GNUNET_YES ==
test_deleted_by_expected (is,
off))
continue;
if ( ( (0 != (cmd->details.history.direction & TALER_BANK_DIRECTION_CREDIT)) && if ( ( (0 != (cmd->details.history.direction & TALER_BANK_DIRECTION_CREDIT)) &&
(cmd->details.history.account_number == (cmd->details.history.account_number ==
pos->details.admin_add_incoming.credit_account_no)) && pos->details.admin_add_incoming.credit_account_no)) &&
@ -787,6 +749,10 @@ interpreter_run (void *cls)
case 2: case 2:
auth.details.basic.username = "Exchange"; auth.details.basic.username = "Exchange";
break; break;
case 3:
auth.details.basic.username = "user3";
auth.details.basic.password = "pass3";
break;
default: default:
GNUNET_break (0); GNUNET_break (0);
break; break;

View File

@ -59,6 +59,7 @@ test_exchange_api_LDADD = \
libtalerexchange.la \ libtalerexchange.la \
$(LIBGCRYPT_LIBS) \ $(LIBGCRYPT_LIBS) \
$(top_builddir)/src/bank-lib/libtalerfakebank.la \ $(top_builddir)/src/bank-lib/libtalerfakebank.la \
$(top_builddir)/src/bank-lib/libtalerbank.la \
$(top_builddir)/src/json/libtalerjson.la \ $(top_builddir)/src/json/libtalerjson.la \
$(top_builddir)/src/util/libtalerutil.la \ $(top_builddir)/src/util/libtalerutil.la \
-lgnunetcurl \ -lgnunetcurl \

View File

@ -26,6 +26,7 @@
#include "taler_json_lib.h" #include "taler_json_lib.h"
#include <gnunet/gnunet_util_lib.h> #include <gnunet/gnunet_util_lib.h>
#include <microhttpd.h> #include <microhttpd.h>
#include "taler_bank_service.h"
#include "taler_fakebank_lib.h" #include "taler_fakebank_lib.h"
@ -39,6 +40,11 @@
*/ */
#define WIRE_SEPA 1 #define WIRE_SEPA 1
/**
* Account number of the exchange at the bank.
*/
#define EXCHANGE_ACCOUNT_NO 2
/** /**
* Main execution context for the main loop. * Main execution context for the main loop.
*/ */
@ -268,14 +274,31 @@ struct Command
const char *amount; const char *amount;
/** /**
* Sender account details (JSON). * Wire transfer subject. NULL to use public key corresponding
* to @e reserve_priv or @e reserve_reference. Should only be
* set manually to test invalid wire transfer subjects.
*/ */
const char *sender_details; const char *subject;
/** /**
* Transfer information identifier (JSON). * Sender (debit) account number.
*/ */
const char *transfer_details; uint64_t debit_account_no;
/**
* Receiver (credit) account number.
*/
uint64_t credit_account_no;
/**
* Username to use for authentication.
*/
const char *auth_username;
/**
* Password to use for authentication.
*/
const char *auth_password;
/** /**
* Set (by the interpreter) to the reserve's private key * Set (by the interpreter) to the reserve's private key
@ -286,7 +309,12 @@ struct Command
/** /**
* Set to the API's handle during the operation. * Set to the API's handle during the operation.
*/ */
struct TALER_EXCHANGE_AdminAddIncomingHandle *aih; struct TALER_BANK_AdminAddIncomingHandle *aih;
/**
* Set to the wire transfer's unique ID.
*/
uint64_t serial_id;
} admin_add_incoming; } admin_add_incoming;
@ -844,18 +872,21 @@ next_command (struct InterpreterState *is)
* @param http_status HTTP response code, #MHD_HTTP_OK (200) for successful status request * @param http_status HTTP response code, #MHD_HTTP_OK (200) for successful status request
* 0 if the exchange's reply is bogus (fails to follow the protocol) * 0 if the exchange's reply is bogus (fails to follow the protocol)
* @param ec taler-specific error code, #TALER_EC_NONE on success * @param ec taler-specific error code, #TALER_EC_NONE on success
* @param serial_id unique ID of the wire transfer
* @param full_response full response from the exchange (for logging, in case of errors) * @param full_response full response from the exchange (for logging, in case of errors)
*/ */
static void static void
add_incoming_cb (void *cls, add_incoming_cb (void *cls,
unsigned int http_status, unsigned int http_status,
enum TALER_ErrorCode ec, enum TALER_ErrorCode ec,
uint64_t serial_id,
const json_t *full_response) const json_t *full_response)
{ {
struct InterpreterState *is = cls; struct InterpreterState *is = cls;
struct Command *cmd = &is->commands[is->ip]; struct Command *cmd = &is->commands[is->ip];
cmd->details.admin_add_incoming.aih = NULL; cmd->details.admin_add_incoming.aih = NULL;
cmd->details.admin_add_incoming.serial_id = serial_id;
if (MHD_HTTP_OK != http_status) if (MHD_HTTP_OK != http_status)
{ {
GNUNET_break (0); GNUNET_break (0);
@ -2037,9 +2068,6 @@ interpreter_run (void *cls)
const struct Command *ref; const struct Command *ref;
struct TALER_ReservePublicKeyP reserve_pub; struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_Amount amount; struct TALER_Amount amount;
struct GNUNET_TIME_Absolute execution_date;
json_t *sender_details;
json_t *transfer_details;
const struct GNUNET_SCHEDULER_TaskContext *tc; const struct GNUNET_SCHEDULER_TaskContext *tc;
is->task = NULL; is->task = NULL;
@ -2061,80 +2089,73 @@ interpreter_run (void *cls)
GNUNET_SCHEDULER_shutdown (); GNUNET_SCHEDULER_shutdown ();
return; return;
case OC_ADMIN_ADD_INCOMING: case OC_ADMIN_ADD_INCOMING:
if (NULL !=
cmd->details.admin_add_incoming.reserve_reference)
{ {
ref = find_command (is, char *subject;
cmd->details.admin_add_incoming.reserve_reference); struct TALER_BANK_AuthenticationData auth;
GNUNET_assert (NULL != ref);
GNUNET_assert (OC_ADMIN_ADD_INCOMING == ref->oc);
cmd->details.admin_add_incoming.reserve_priv
= ref->details.admin_add_incoming.reserve_priv;
}
else
{
struct GNUNET_CRYPTO_EddsaPrivateKey *priv;
priv = GNUNET_CRYPTO_eddsa_key_create (); if (NULL !=
cmd->details.admin_add_incoming.reserve_priv.eddsa_priv = *priv; cmd->details.admin_add_incoming.subject)
GNUNET_free (priv); {
} subject = GNUNET_strdup (cmd->details.admin_add_incoming.subject);
GNUNET_CRYPTO_eddsa_key_get_public (&cmd->details.admin_add_incoming.reserve_priv.eddsa_priv, }
&reserve_pub.eddsa_pub); else
if (GNUNET_OK != {
TALER_string_to_amount (cmd->details.admin_add_incoming.amount, /* Use reserve public key as subject */
&amount)) if (NULL !=
{ cmd->details.admin_add_incoming.reserve_reference)
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, {
"Failed to parse amount `%s' at %u\n", ref = find_command (is,
cmd->details.admin_add_incoming.amount, cmd->details.admin_add_incoming.reserve_reference);
is->ip); GNUNET_assert (NULL != ref);
fail (is); GNUNET_assert (OC_ADMIN_ADD_INCOMING == ref->oc);
return; cmd->details.admin_add_incoming.reserve_priv
} = ref->details.admin_add_incoming.reserve_priv;
sender_details = json_loads (cmd->details.admin_add_incoming.sender_details, }
JSON_REJECT_DUPLICATES, else
NULL); {
if (NULL == sender_details) struct GNUNET_CRYPTO_EddsaPrivateKey *priv;
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, priv = GNUNET_CRYPTO_eddsa_key_create ();
"Failed to parse sender details `%s' at %u\n", cmd->details.admin_add_incoming.reserve_priv.eddsa_priv = *priv;
cmd->details.admin_add_incoming.sender_details, GNUNET_free (priv);
is->ip); }
fail (is); GNUNET_CRYPTO_eddsa_key_get_public (&cmd->details.admin_add_incoming.reserve_priv.eddsa_priv,
return; &reserve_pub.eddsa_pub);
} subject = GNUNET_STRINGS_data_to_string_alloc (&reserve_pub,
transfer_details = json_loads (cmd->details.admin_add_incoming.transfer_details, sizeof (reserve_pub));
JSON_REJECT_DUPLICATES, }
NULL); if (GNUNET_OK !=
if (NULL == transfer_details) TALER_string_to_amount (cmd->details.admin_add_incoming.amount,
{ &amount))
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, {
"Failed to parse transfer details `%s' at %u\n", GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
cmd->details.admin_add_incoming.transfer_details, "Failed to parse amount `%s' at %u\n",
is->ip); cmd->details.admin_add_incoming.amount,
fail (is); is->ip);
return; fail (is);
} return;
execution_date = GNUNET_TIME_absolute_get (); }
GNUNET_TIME_round_abs (&execution_date); auth.method = TALER_BANK_AUTH_BASIC;
cmd->details.admin_add_incoming.aih auth.details.basic.username = (char *) cmd->details.admin_add_incoming.auth_username;
= TALER_EXCHANGE_admin_add_incoming (exchange, auth.details.basic.password = (char *) cmd->details.admin_add_incoming.auth_password;
"http://localhost:18080/", cmd->details.admin_add_incoming.aih
&reserve_pub, = TALER_BANK_admin_add_incoming (ctx,
&amount, "http://localhost:8082/", /* bank URL */
execution_date, &auth,
sender_details, "https://exchange.com/", /* exchange URL */
transfer_details, subject,
&add_incoming_cb, &amount,
is); cmd->details.admin_add_incoming.debit_account_no,
json_decref (sender_details); cmd->details.admin_add_incoming.credit_account_no,
json_decref (transfer_details); &add_incoming_cb,
if (NULL == cmd->details.admin_add_incoming.aih) is);
{ GNUNET_free (subject);
GNUNET_break (0); if (NULL == cmd->details.admin_add_incoming.aih)
fail (is); {
return; GNUNET_break (0);
fail (is);
return;
}
} }
return; return;
case OC_WITHDRAW_STATUS: case OC_WITHDRAW_STATUS:
@ -2869,7 +2890,7 @@ do_shutdown (void *cls)
"Command %u (%s) did not complete\n", "Command %u (%s) did not complete\n",
i, i,
cmd->label); cmd->label);
TALER_EXCHANGE_admin_add_incoming_cancel (cmd->details.admin_add_incoming.aih); TALER_BANK_admin_add_incoming_cancel (cmd->details.admin_add_incoming.aih);
cmd->details.admin_add_incoming.aih = NULL; cmd->details.admin_add_incoming.aih = NULL;
} }
break; break;
@ -3009,6 +3030,22 @@ do_shutdown (void *cls)
cmd->details.run_aggregator.child_death_task = NULL; cmd->details.run_aggregator.child_death_task = NULL;
} }
break; break;
case OC_RUN_WIREWATCH:
if (NULL != cmd->details.run_wirewatch.wirewatch_proc)
{
GNUNET_break (0 ==
GNUNET_OS_process_kill (cmd->details.run_wirewatch.wirewatch_proc,
SIGKILL));
GNUNET_OS_process_wait (cmd->details.run_wirewatch.wirewatch_proc);
GNUNET_OS_process_destroy (cmd->details.run_wirewatch.wirewatch_proc);
cmd->details.run_wirewatch.wirewatch_proc = NULL;
}
if (NULL != cmd->details.run_wirewatch.child_death_task)
{
GNUNET_SCHEDULER_cancel (cmd->details.run_wirewatch.child_death_task);
cmd->details.run_wirewatch.child_death_task = NULL;
}
break;
case OC_CHECK_BANK_TRANSFER: case OC_CHECK_BANK_TRANSFER:
GNUNET_free_non_null (cmd->details.check_bank_transfer.subject); GNUNET_free_non_null (cmd->details.check_bank_transfer.subject);
cmd->details.check_bank_transfer.subject = NULL; cmd->details.check_bank_transfer.subject = NULL;
@ -3190,9 +3227,14 @@ run (void *cls)
{ .oc = OC_ADMIN_ADD_INCOMING, { .oc = OC_ADMIN_ADD_INCOMING,
.label = "create-reserve-1", .label = "create-reserve-1",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.sender_details = "{ \"type\":\"test\", \"bank_uri\":\"http://localhost:8082/\", \"account_number\":42}", .details.admin_add_incoming.debit_account_no = 42,
.details.admin_add_incoming.transfer_details = "{ \"uuid\":1 }", .details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user42",
.details.admin_add_incoming.auth_password = "pass42",
.details.admin_add_incoming.amount = "EUR:5.01" }, .details.admin_add_incoming.amount = "EUR:5.01" },
/* Run wirewatch to observe /admin/add/incoming */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-1" },
/* Withdraw a 5 EUR coin, at fee of 1 ct */ /* Withdraw a 5 EUR coin, at fee of 1 ct */
{ .oc = OC_WITHDRAW_SIGN, { .oc = OC_WITHDRAW_SIGN,
.label = "withdraw-coin-1", .label = "withdraw-coin-1",
@ -3255,9 +3297,14 @@ run (void *cls)
{ .oc = OC_ADMIN_ADD_INCOMING, { .oc = OC_ADMIN_ADD_INCOMING,
.label = "refresh-create-reserve-1", .label = "refresh-create-reserve-1",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.sender_details = "{ \"type\":\"test\", \"bank_uri\":\"http://localhost:8082/\", \"account_number\":424 }", .details.admin_add_incoming.debit_account_no = 424,
.details.admin_add_incoming.transfer_details = "{ \"uuid\":2 }", .details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user424",
.details.admin_add_incoming.auth_password = "pass424",
.details.admin_add_incoming.amount = "EUR:5.01" }, .details.admin_add_incoming.amount = "EUR:5.01" },
/* Run wirewatch to observe /admin/add/incoming */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-2" },
/* Withdraw a 5 EUR coin, at fee of 1 ct */ /* Withdraw a 5 EUR coin, at fee of 1 ct */
{ .oc = OC_WITHDRAW_SIGN, { .oc = OC_WITHDRAW_SIGN,
.label = "refresh-withdraw-coin-1", .label = "refresh-withdraw-coin-1",
@ -3395,10 +3442,23 @@ run (void *cls)
.details.check_bank_transfer.account_debit = 2, .details.check_bank_transfer.account_debit = 2,
.details.check_bank_transfer.account_credit = 43 .details.check_bank_transfer.account_credit = 43
}, },
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-aai-1",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:5.01",
.details.check_bank_transfer.account_debit = 42,
.details.check_bank_transfer.account_credit = 2
},
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-aai-2",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:5.01",
.details.check_bank_transfer.account_debit = 424,
.details.check_bank_transfer.account_credit = 2
},
{ .oc = OC_CHECK_BANK_TRANSFERS_EMPTY, { .oc = OC_CHECK_BANK_TRANSFERS_EMPTY,
.label = "check_bank_empty" }, .label = "check_bank_empty" },
{ .oc = OC_DEPOSIT_WTID, { .oc = OC_DEPOSIT_WTID,
.label = "deposit-wtid-ok", .label = "deposit-wtid-ok",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
@ -3428,9 +3488,14 @@ run (void *cls)
{ .oc = OC_ADMIN_ADD_INCOMING, { .oc = OC_ADMIN_ADD_INCOMING,
.label = "create-reserve-r1", .label = "create-reserve-r1",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.sender_details = "{ \"type\":\"test\", \"bank_uri\":\"http://localhost:8082/\", \"account_number\":42 }", .details.admin_add_incoming.debit_account_no = 42,
.details.admin_add_incoming.transfer_details = "{ \"uuid\":3 }", .details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user42",
.details.admin_add_incoming.auth_password = "pass42",
.details.admin_add_incoming.amount = "EUR:5.01" }, .details.admin_add_incoming.amount = "EUR:5.01" },
/* Run wirewatch to observe /admin/add/incoming */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-3" },
/* Withdraw a 5 EUR coin, at fee of 1 ct */ /* Withdraw a 5 EUR coin, at fee of 1 ct */
{ .oc = OC_WITHDRAW_SIGN, { .oc = OC_WITHDRAW_SIGN,
.label = "withdraw-coin-r1", .label = "withdraw-coin-r1",
@ -3451,6 +3516,13 @@ run (void *cls)
/* Run transfers. Should do nothing as refund deadline blocks it */ /* Run transfers. Should do nothing as refund deadline blocks it */
{ .oc = OC_RUN_AGGREGATOR, { .oc = OC_RUN_AGGREGATOR,
.label = "run-aggregator-refund" }, .label = "run-aggregator-refund" },
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-aai-3",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:5.01",
.details.check_bank_transfer.account_debit = 42,
.details.check_bank_transfer.account_credit = 2
},
/* check that aggregator didn't do anything, as expected */ /* check that aggregator didn't do anything, as expected */
{ .oc = OC_CHECK_BANK_TRANSFERS_EMPTY, { .oc = OC_CHECK_BANK_TRANSFERS_EMPTY,
.label = "check-refund-not-run" }, .label = "check-refund-not-run" },
@ -3501,9 +3573,14 @@ run (void *cls)
{ .oc = OC_ADMIN_ADD_INCOMING, { .oc = OC_ADMIN_ADD_INCOMING,
.label = "payback-create-reserve-1", .label = "payback-create-reserve-1",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.sender_details = "{ \"type\":\"test\", \"bank_uri\":\"http://localhost:8082/\", \"account_number\":42}", .details.admin_add_incoming.debit_account_no = 42,
.details.admin_add_incoming.transfer_details = "{ \"uuid\":4 }", .details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user42",
.details.admin_add_incoming.auth_password = "pass42",
.details.admin_add_incoming.amount = "EUR:5.01" }, .details.admin_add_incoming.amount = "EUR:5.01" },
/* Run wirewatch to observe /admin/add/incoming */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-4" },
/* Withdraw a 5 EUR coin, at fee of 1 ct */ /* Withdraw a 5 EUR coin, at fee of 1 ct */
{ .oc = OC_WITHDRAW_SIGN, { .oc = OC_WITHDRAW_SIGN,
.label = "payback-withdraw-coin-1", .label = "payback-withdraw-coin-1",
@ -3535,9 +3612,14 @@ run (void *cls)
{ .oc = OC_ADMIN_ADD_INCOMING, { .oc = OC_ADMIN_ADD_INCOMING,
.label = "payback-create-reserve-2", .label = "payback-create-reserve-2",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.sender_details = "{ \"type\":\"test\", \"bank_uri\":\"http://localhost:8082/\", \"account_number\":42}", .details.admin_add_incoming.debit_account_no = 42,
.details.admin_add_incoming.transfer_details = "{ \"uuid\":5 }", .details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user42",
.details.admin_add_incoming.auth_password = "pass42",
.details.admin_add_incoming.amount = "EUR:2.02" }, .details.admin_add_incoming.amount = "EUR:2.02" },
/* Run wirewatch to observe /admin/add/incoming */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-5" },
/* Withdraw a 1 EUR coin, at fee of 1 ct */ /* Withdraw a 1 EUR coin, at fee of 1 ct */
{ .oc = OC_WITHDRAW_SIGN, { .oc = OC_WITHDRAW_SIGN,
.label = "payback-withdraw-coin-2a", .label = "payback-withdraw-coin-2a",
@ -3596,15 +3678,62 @@ run (void *cls)
{ .oc = OC_ADMIN_ADD_INCOMING, { .oc = OC_ADMIN_ADD_INCOMING,
.label = "payback-create-reserve-3", .label = "payback-create-reserve-3",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.sender_details = "{ \"type\":\"test\", \"bank_uri\":\"http://localhost:8082/\", \"account_number\":42}", .details.admin_add_incoming.debit_account_no = 42,
.details.admin_add_incoming.transfer_details = "{ \"uuid\":6 }", .details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user42",
.details.admin_add_incoming.auth_password = "pass42",
.details.admin_add_incoming.amount = "EUR:1.01" }, .details.admin_add_incoming.amount = "EUR:1.01" },
/* Run wirewatch to observe /admin/add/incoming */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-6" },
{ .oc = OC_WITHDRAW_SIGN, { .oc = OC_WITHDRAW_SIGN,
.label = "payback-withdraw-coin-3-revoked", .label = "payback-withdraw-coin-3-revoked",
.expected_response_code = MHD_HTTP_NOT_FOUND, .expected_response_code = MHD_HTTP_NOT_FOUND,
.details.reserve_withdraw.reserve_reference = "payback-create-reserve-3", .details.reserve_withdraw.reserve_reference = "payback-create-reserve-3",
.details.reserve_withdraw.amount = "EUR:1" }, .details.reserve_withdraw.amount = "EUR:1" },
/* check that we are empty before the rejection test */
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-pr1",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:5.01",
.details.check_bank_transfer.account_debit = 42,
.details.check_bank_transfer.account_credit = 2
},
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-pr2",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:2.02",
.details.check_bank_transfer.account_debit = 42,
.details.check_bank_transfer.account_credit = 2
},
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-pr3",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:1.01",
.details.check_bank_transfer.account_debit = 42,
.details.check_bank_transfer.account_credit = 2
},
{ .oc = OC_CHECK_BANK_TRANSFERS_EMPTY,
.label = "check-empty-again" },
/* Test rejection of bogus wire transfers */
{ .oc = OC_ADMIN_ADD_INCOMING,
.label = "bogus-subject",
.expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.subject = "not a reserve public key",
.details.admin_add_incoming.debit_account_no = 42,
.details.admin_add_incoming.credit_account_no = EXCHANGE_ACCOUNT_NO,
.details.admin_add_incoming.auth_username = "user42",
.details.admin_add_incoming.auth_password = "pass42",
.details.admin_add_incoming.amount = "EUR:1.01" },
/* Run wirewatch to observe rejection */
{ .oc = OC_RUN_WIREWATCH,
.label = "wirewatch-7" },
{ .oc = OC_CHECK_BANK_TRANSFERS_EMPTY,
.label = "check-empty-from-reject" },
/* ************** End of payback API testing************* */ /* ************** End of payback API testing************* */
#endif #endif