From 6623afa2a306a6c00f414ddd75aa51fe464cae56 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 10 Dec 2017 16:02:03 +0100 Subject: add testcase for #5077 (passes), start to reduce use of exchange's admin/add/incoming (#5172, more to come) --- src/bank-lib/fakebank.c | 60 ++++--- src/bank-lib/test_bank_interpreter.c | 42 +---- src/exchange-lib/Makefile.am | 1 + src/exchange-lib/test_exchange_api.c | 317 ++++++++++++++++++++++++----------- 4 files changed, 268 insertions(+), 152 deletions(-) (limited to 'src') diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index 39ba6d7a6..bd1b3b225 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -86,6 +86,13 @@ struct Transaction * Flag set if the transfer was 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) && (0 == TALER_amount_cmp (want_amount, &t->amount)) && + (GNUNET_NO == t->checked) && (0 == strcasecmp (exchange_base_url, t->exchange_base_url)) ) { - GNUNET_CONTAINER_DLL_remove (h->transactions_head, - h->transactions_tail, - t); - *subject = t->subject; - GNUNET_free (t->exchange_base_url); - GNUNET_free (t); + *subject = GNUNET_strdup (t->subject); + t->checked = GNUNET_YES; return GNUNET_OK; } } @@ -168,6 +172,8 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h, { char *s; + if (GNUNET_YES == t->checked) + continue; s = TALER_amount_to_string (&t->amount); fprintf (stderr, "%llu -> %llu (%s) from %s\n", @@ -262,23 +268,35 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h) { 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; - fprintf (stderr, "Expected empty transaction set, but I have:\n"); - for (t = h->transactions_head; NULL != t; t = t->next) + while (NULL != t) { - char *s; - - s = TALER_amount_to_string (&t->amount); - fprintf (stderr, - "%llu -> %llu (%s) from %s\n", - (unsigned long long) t->debit_account, - (unsigned long long) t->credit_account, - s, - t->exchange_base_url); - GNUNET_free (s); + if ( (GNUNET_YES != t->checked) && + (GNUNET_YES != t->rejected) ) + { + char *s; + + s = TALER_amount_to_string (&t->amount); + fprintf (stderr, + "%llu -> %llu (%s) from %s\n", + (unsigned long long) t->debit_account, + (unsigned long long) t->credit_account, + s, + t->exchange_base_url); + GNUNET_free (s); + } + t = t->next; } return GNUNET_SYSERR; } @@ -748,7 +766,9 @@ handle_history (struct TALER_FAKEBANK_Handle *h, break; 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; } /* range is exclusive, skip the matching entry */ diff --git a/src/bank-lib/test_bank_interpreter.c b/src/bank-lib/test_bank_interpreter.c index 0dfc4c401..ab41ed611 100644 --- a/src/bank-lib/test_bank_interpreter.c +++ b/src/bank-lib/test_bank_interpreter.c @@ -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;iip;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 * command history. @@ -286,10 +257,6 @@ build_history (struct InterpreterState *is, continue; /* skip until we find the marker */ if (total >= cmd->details.history.num_results * inc) break; /* hit limit specified by command */ - if (GNUNET_YES == - test_deleted_by_expected (is, - off)) - continue; cancelled = test_cancelled (is, off); if ( (GNUNET_YES == cancelled) && @@ -335,11 +302,6 @@ build_history (struct InterpreterState *is, continue; /* skip until we find the marker */ if (total >= cmd->details.history.num_results * inc) 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)) && (cmd->details.history.account_number == pos->details.admin_add_incoming.credit_account_no)) && @@ -787,6 +749,10 @@ interpreter_run (void *cls) case 2: auth.details.basic.username = "Exchange"; break; + case 3: + auth.details.basic.username = "user3"; + auth.details.basic.password = "pass3"; + break; default: GNUNET_break (0); break; diff --git a/src/exchange-lib/Makefile.am b/src/exchange-lib/Makefile.am index b3a30e107..f92ea630f 100644 --- a/src/exchange-lib/Makefile.am +++ b/src/exchange-lib/Makefile.am @@ -59,6 +59,7 @@ test_exchange_api_LDADD = \ libtalerexchange.la \ $(LIBGCRYPT_LIBS) \ $(top_builddir)/src/bank-lib/libtalerfakebank.la \ + $(top_builddir)/src/bank-lib/libtalerbank.la \ $(top_builddir)/src/json/libtalerjson.la \ $(top_builddir)/src/util/libtalerutil.la \ -lgnunetcurl \ diff --git a/src/exchange-lib/test_exchange_api.c b/src/exchange-lib/test_exchange_api.c index 7811ffa47..475fbde4e 100644 --- a/src/exchange-lib/test_exchange_api.c +++ b/src/exchange-lib/test_exchange_api.c @@ -26,6 +26,7 @@ #include "taler_json_lib.h" #include #include +#include "taler_bank_service.h" #include "taler_fakebank_lib.h" @@ -39,6 +40,11 @@ */ #define WIRE_SEPA 1 +/** + * Account number of the exchange at the bank. + */ +#define EXCHANGE_ACCOUNT_NO 2 + /** * Main execution context for the main loop. */ @@ -268,14 +274,31 @@ struct Command 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 *subject; + + /** + * Sender (debit) account number. + */ + uint64_t debit_account_no; + + /** + * Receiver (credit) account number. */ - const char *sender_details; + uint64_t credit_account_no; /** - * Transfer information identifier (JSON). + * Username to use for authentication. */ - const char *transfer_details; + const char *auth_username; + + /** + * Password to use for authentication. + */ + const char *auth_password; /** * 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. */ - 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; @@ -844,18 +872,21 @@ next_command (struct InterpreterState *is) * @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) * @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) */ static void add_incoming_cb (void *cls, unsigned int http_status, enum TALER_ErrorCode ec, + uint64_t serial_id, const json_t *full_response) { struct InterpreterState *is = cls; struct Command *cmd = &is->commands[is->ip]; cmd->details.admin_add_incoming.aih = NULL; + cmd->details.admin_add_incoming.serial_id = serial_id; if (MHD_HTTP_OK != http_status) { GNUNET_break (0); @@ -2037,9 +2068,6 @@ interpreter_run (void *cls) const struct Command *ref; struct TALER_ReservePublicKeyP reserve_pub; struct TALER_Amount amount; - struct GNUNET_TIME_Absolute execution_date; - json_t *sender_details; - json_t *transfer_details; const struct GNUNET_SCHEDULER_TaskContext *tc; is->task = NULL; @@ -2061,80 +2089,73 @@ interpreter_run (void *cls) GNUNET_SCHEDULER_shutdown (); return; case OC_ADMIN_ADD_INCOMING: - if (NULL != - cmd->details.admin_add_incoming.reserve_reference) { - ref = find_command (is, - cmd->details.admin_add_incoming.reserve_reference); - 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; + char *subject; + struct TALER_BANK_AuthenticationData auth; - priv = GNUNET_CRYPTO_eddsa_key_create (); - cmd->details.admin_add_incoming.reserve_priv.eddsa_priv = *priv; - GNUNET_free (priv); - } - GNUNET_CRYPTO_eddsa_key_get_public (&cmd->details.admin_add_incoming.reserve_priv.eddsa_priv, - &reserve_pub.eddsa_pub); - if (GNUNET_OK != - TALER_string_to_amount (cmd->details.admin_add_incoming.amount, - &amount)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to parse amount `%s' at %u\n", - cmd->details.admin_add_incoming.amount, - is->ip); - fail (is); - return; - } - sender_details = json_loads (cmd->details.admin_add_incoming.sender_details, - JSON_REJECT_DUPLICATES, - NULL); - if (NULL == sender_details) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to parse sender details `%s' at %u\n", - cmd->details.admin_add_incoming.sender_details, - is->ip); - fail (is); - return; - } - transfer_details = json_loads (cmd->details.admin_add_incoming.transfer_details, - JSON_REJECT_DUPLICATES, - NULL); - if (NULL == transfer_details) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to parse transfer details `%s' at %u\n", - cmd->details.admin_add_incoming.transfer_details, - is->ip); - fail (is); - return; - } - execution_date = GNUNET_TIME_absolute_get (); - GNUNET_TIME_round_abs (&execution_date); - cmd->details.admin_add_incoming.aih - = TALER_EXCHANGE_admin_add_incoming (exchange, - "http://localhost:18080/", - &reserve_pub, - &amount, - execution_date, - sender_details, - transfer_details, - &add_incoming_cb, - is); - json_decref (sender_details); - json_decref (transfer_details); - if (NULL == cmd->details.admin_add_incoming.aih) - { - GNUNET_break (0); - fail (is); - return; + if (NULL != + cmd->details.admin_add_incoming.subject) + { + subject = GNUNET_strdup (cmd->details.admin_add_incoming.subject); + } + else + { + /* Use reserve public key as subject */ + if (NULL != + cmd->details.admin_add_incoming.reserve_reference) + { + ref = find_command (is, + cmd->details.admin_add_incoming.reserve_reference); + 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 (); + cmd->details.admin_add_incoming.reserve_priv.eddsa_priv = *priv; + GNUNET_free (priv); + } + GNUNET_CRYPTO_eddsa_key_get_public (&cmd->details.admin_add_incoming.reserve_priv.eddsa_priv, + &reserve_pub.eddsa_pub); + subject = GNUNET_STRINGS_data_to_string_alloc (&reserve_pub, + sizeof (reserve_pub)); + } + if (GNUNET_OK != + TALER_string_to_amount (cmd->details.admin_add_incoming.amount, + &amount)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Failed to parse amount `%s' at %u\n", + cmd->details.admin_add_incoming.amount, + is->ip); + fail (is); + return; + } + auth.method = TALER_BANK_AUTH_BASIC; + auth.details.basic.username = (char *) cmd->details.admin_add_incoming.auth_username; + auth.details.basic.password = (char *) cmd->details.admin_add_incoming.auth_password; + cmd->details.admin_add_incoming.aih + = TALER_BANK_admin_add_incoming (ctx, + "http://localhost:8082/", /* bank URL */ + &auth, + "https://exchange.com/", /* exchange URL */ + subject, + &amount, + cmd->details.admin_add_incoming.debit_account_no, + cmd->details.admin_add_incoming.credit_account_no, + &add_incoming_cb, + is); + GNUNET_free (subject); + if (NULL == cmd->details.admin_add_incoming.aih) + { + GNUNET_break (0); + fail (is); + return; + } } return; case OC_WITHDRAW_STATUS: @@ -2869,7 +2890,7 @@ do_shutdown (void *cls) "Command %u (%s) did not complete\n", i, 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; } break; @@ -3009,6 +3030,22 @@ do_shutdown (void *cls) cmd->details.run_aggregator.child_death_task = NULL; } 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: GNUNET_free_non_null (cmd->details.check_bank_transfer.subject); cmd->details.check_bank_transfer.subject = NULL; @@ -3190,9 +3227,14 @@ run (void *cls) { .oc = OC_ADMIN_ADD_INCOMING, .label = "create-reserve-1", .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.transfer_details = "{ \"uuid\":1 }", + .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: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 */ { .oc = OC_WITHDRAW_SIGN, .label = "withdraw-coin-1", @@ -3255,9 +3297,14 @@ run (void *cls) { .oc = OC_ADMIN_ADD_INCOMING, .label = "refresh-create-reserve-1", .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.transfer_details = "{ \"uuid\":2 }", + .details.admin_add_incoming.debit_account_no = 424, + .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" }, + /* Run wirewatch to observe /admin/add/incoming */ + { .oc = OC_RUN_WIREWATCH, + .label = "wirewatch-2" }, /* Withdraw a 5 EUR coin, at fee of 1 ct */ { .oc = OC_WITHDRAW_SIGN, .label = "refresh-withdraw-coin-1", @@ -3395,10 +3442,23 @@ run (void *cls) .details.check_bank_transfer.account_debit = 2, .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, .label = "check_bank_empty" }, - { .oc = OC_DEPOSIT_WTID, .label = "deposit-wtid-ok", .expected_response_code = MHD_HTTP_OK, @@ -3428,9 +3488,14 @@ run (void *cls) { .oc = OC_ADMIN_ADD_INCOMING, .label = "create-reserve-r1", .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.transfer_details = "{ \"uuid\":3 }", + .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: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 */ { .oc = OC_WITHDRAW_SIGN, .label = "withdraw-coin-r1", @@ -3451,6 +3516,13 @@ run (void *cls) /* Run transfers. Should do nothing as refund deadline blocks it */ { .oc = OC_RUN_AGGREGATOR, .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 */ { .oc = OC_CHECK_BANK_TRANSFERS_EMPTY, .label = "check-refund-not-run" }, @@ -3501,9 +3573,14 @@ run (void *cls) { .oc = OC_ADMIN_ADD_INCOMING, .label = "payback-create-reserve-1", .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.transfer_details = "{ \"uuid\":4 }", + .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: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 */ { .oc = OC_WITHDRAW_SIGN, .label = "payback-withdraw-coin-1", @@ -3535,9 +3612,14 @@ run (void *cls) { .oc = OC_ADMIN_ADD_INCOMING, .label = "payback-create-reserve-2", .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.transfer_details = "{ \"uuid\":5 }", + .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: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 */ { .oc = OC_WITHDRAW_SIGN, .label = "payback-withdraw-coin-2a", @@ -3596,15 +3678,62 @@ run (void *cls) { .oc = OC_ADMIN_ADD_INCOMING, .label = "payback-create-reserve-3", .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.transfer_details = "{ \"uuid\":6 }", + .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 /admin/add/incoming */ + { .oc = OC_RUN_WIREWATCH, + .label = "wirewatch-6" }, { .oc = OC_WITHDRAW_SIGN, .label = "payback-withdraw-coin-3-revoked", .expected_response_code = MHD_HTTP_NOT_FOUND, .details.reserve_withdraw.reserve_reference = "payback-create-reserve-3", .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************* */ #endif -- cgit v1.2.3