aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-06-11 15:25:59 +0200
committerChristian Grothoff <christian@grothoff.org>2017-06-11 15:25:59 +0200
commit16b7c266057cbfc6d235b6a1c3fe914b14944a25 (patch)
tree8d35fb560e52d54c01b12ca476112027c296fa0f
parent1eb739c670ffdb3363f54b1efdcb8343cb1bd272 (diff)
modify fakebank API to allow arbitrary subjects, not just well-fromed WTIDs
-rw-r--r--src/bank-lib/fakebank.c113
-rw-r--r--src/bank-lib/test_bank_interpreter.c50
-rw-r--r--src/exchange-lib/test_exchange_api.c26
-rw-r--r--src/exchange/test_taler_exchange_aggregator.c4
-rw-r--r--src/exchange/test_taler_exchange_wirewatch.c7
-rw-r--r--src/include/taler_fakebank_lib.h27
6 files changed, 154 insertions, 73 deletions
diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c
index ceda4d37b..34a11f9b7 100644
--- a/src/bank-lib/fakebank.c
+++ b/src/bank-lib/fakebank.c
@@ -65,7 +65,7 @@ struct Transaction
/**
* Subject of the transfer.
*/
- struct TALER_WireTransferIdentifierRawP wtid;
+ char *subject;
/**
* Base URL of the exchange.
@@ -119,7 +119,7 @@ struct TALER_FAKEBANK_Handle
/**
* Check that the @a want_amount was transferred from
* the @a want_debit to the @a want_credit account. If
- * so, set the @a wtid to the transfer identifier.
+ * so, set the @a subject to the transfer identifier.
* If not, return #GNUNET_SYSERR.
*
* @param h bank instance
@@ -137,11 +137,9 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
uint64_t want_debit,
uint64_t want_credit,
const char *exchange_base_url,
- struct TALER_WireTransferIdentifierRawP *wtid)
+ char **subject)
{
- struct Transaction *t;
-
- for (t = h->transactions_head; NULL != t; t = t->next)
+ for (struct Transaction *t = h->transactions_head; NULL != t; t = t->next)
{
if ( (want_debit == t->debit_account) &&
(want_credit == t->credit_account) &&
@@ -153,7 +151,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail,
t);
- *wtid = t->wtid;
+ *subject = t->subject;
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
return GNUNET_OK;
@@ -161,7 +159,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
}
fprintf (stderr,
"Did not find matching transaction!\nI have:\n");
- for (t = h->transactions_head; NULL != t; t = t->next)
+ for (struct Transaction *t = h->transactions_head; NULL != t; t = t->next)
{
char *s;
@@ -179,6 +177,49 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
/**
+ * Tell the fakebank to create another wire transfer.
+ *
+ * @param h fake bank handle
+ * @param debit_account account to debit
+ * @param credit_account account to credit
+ * @param amount amount to transfer
+ * @param subject wire transfer subject to use
+ * @param exchange_base_url exchange URL
+ * @return serial_id of the transfer
+ */
+uint64_t
+TALER_FAKEBANK_make_transfer (struct TALER_FAKEBANK_Handle *h,
+ uint64_t debit_account,
+ uint64_t credit_account,
+ const struct TALER_Amount *amount,
+ const char *subject,
+ const char *exchange_base_url)
+{
+ struct Transaction *t;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Making transfer from %llu to %llu over %s and subject %s\n",
+ (unsigned long long) debit_account,
+ (unsigned long long) credit_account,
+ TALER_amount2s (amount),
+ subject);
+ t = GNUNET_new (struct Transaction);
+ t->debit_account = debit_account;
+ t->credit_account = credit_account;
+ t->amount = *amount;
+ t->exchange_base_url = GNUNET_strdup (exchange_base_url);
+ t->serial_id = ++h->serial_counter;
+ t->date = GNUNET_TIME_absolute_get ();
+ t->subject = GNUNET_strdup (subject);
+ GNUNET_TIME_round_abs (&t->date);
+ GNUNET_CONTAINER_DLL_insert_tail (h->transactions_head,
+ h->transactions_tail,
+ t);
+ return t->serial_id;
+}
+
+
+/**
* Check that no wire transfers were ordered (or at least none
* that have not been taken care of via #TALER_FAKEBANK_check()).
* If any transactions are onrecord, return #GNUNET_SYSERR.
@@ -228,6 +269,7 @@ TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h)
GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail,
t);
+ GNUNET_free (t->subject);
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
}
@@ -291,9 +333,9 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
{
enum GNUNET_JSON_PostResult pr;
json_t *json;
- struct Transaction *t;
struct MHD_Response *resp;
int ret;
+ uint64_t serial_id;
pr = GNUNET_JSON_post_parser (REQUEST_BUFFER_MAX,
con_cls,
@@ -316,14 +358,17 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
case GNUNET_JSON_PR_SUCCESS:
break;
}
- t = GNUNET_new (struct Transaction);
{
+ const char *wtid;
+ uint64_t debit_account;
+ uint64_t credit_account;
const char *base_url;
+ struct TALER_Amount amount;
struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_fixed_auto ("wtid", &t->wtid),
- GNUNET_JSON_spec_uint64 ("debit_account", &t->debit_account),
- GNUNET_JSON_spec_uint64 ("credit_account", &t->credit_account),
- TALER_JSON_spec_amount ("amount", &t->amount),
+ GNUNET_JSON_spec_string ("wtid", &wtid),
+ GNUNET_JSON_spec_uint64 ("debit_account", &debit_account),
+ GNUNET_JSON_spec_uint64 ("credit_account", &credit_account),
+ TALER_JSON_spec_amount ("amount", &amount),
GNUNET_JSON_spec_string ("exchange_url", &base_url),
GNUNET_JSON_spec_end ()
};
@@ -336,19 +381,18 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
json_decref (json);
return MHD_NO;
}
- t->exchange_base_url = GNUNET_strdup (base_url);
- t->serial_id = ++h->serial_counter;
- t->date = GNUNET_TIME_absolute_get ();
- GNUNET_TIME_round_abs (&t->date);
- GNUNET_CONTAINER_DLL_insert_tail (h->transactions_head,
- h->transactions_tail,
- t);
+ serial_id = TALER_FAKEBANK_make_transfer (h,
+ debit_account,
+ credit_account,
+ &amount,
+ wtid,
+ base_url);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Receiving incoming wire transfer: %llu->%llu from %s\n",
+ (unsigned long long) debit_account,
+ (unsigned long long) credit_account,
+ base_url);
}
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Receiving incoming wire transfer: %llu->%llu from %s\n",
- (unsigned long long) t->debit_account,
- (unsigned long long) t->credit_account,
- t->exchange_base_url);
json_decref (json);
/* Finally build response object */
@@ -358,7 +402,7 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
json = json_pack ("{s:I}",
"serial_id",
- (json_int_t) t->serial_id);
+ (json_int_t) serial_id);
json_str = json_dumps (json,
JSON_INDENT(2));
json_decref (json);
@@ -514,17 +558,10 @@ handle_history (struct TALER_FAKEBANK_Handle *h,
continue;
}
- {
- char *ws;
-
- ws = GNUNET_STRINGS_data_to_string_alloc (&pos->wtid,
- sizeof (pos->wtid));
- GNUNET_asprintf (&subject,
- "%s %s",
- ws,
- pos->exchange_base_url);
- GNUNET_free (ws);
- }
+ GNUNET_asprintf (&subject,
+ "%s %s",
+ pos->subject,
+ pos->exchange_base_url);
trans = json_pack ("{s:I, s:o, s:o, s:s, s:I, s:s}",
"row_id", (json_int_t) pos->serial_id,
"date", GNUNET_JSON_from_time_abs (pos->date),
diff --git a/src/bank-lib/test_bank_interpreter.c b/src/bank-lib/test_bank_interpreter.c
index e966424ef..f5aee8ee6 100644
--- a/src/bank-lib/test_bank_interpreter.c
+++ b/src/bank-lib/test_bank_interpreter.c
@@ -572,7 +572,9 @@ history_cb (void *cls,
"Expected history of length %llu, got %llu\n",
(unsigned long long) total,
(unsigned long long) cmd->details.history.results_obtained);
- print_expected (h, total, UINT_MAX);
+ print_expected (h,
+ total,
+ UINT_MAX);
free_history (h,
total);
fail (is);
@@ -621,7 +623,6 @@ interpreter_run (void *cls)
struct InterpreterState *is = cls;
struct TBI_Command *cmd = &is->commands[is->ip];
const struct TBI_Command *ref;
- struct TALER_WireTransferIdentifierRawP wtid;
struct TALER_Amount amount;
const struct GNUNET_SCHEDULER_TaskContext *tc;
struct TALER_BANK_AuthenticationData auth;
@@ -719,25 +720,34 @@ interpreter_run (void *cls)
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (ref->details.admin_add_incoming.amount,
&amount));
- if (GNUNET_OK !=
- TALER_FAKEBANK_check (is->fakebank,
- &amount,
- ref->details.admin_add_incoming.debit_account_no,
- ref->details.admin_add_incoming.credit_account_no,
- ref->details.admin_add_incoming.exchange_base_url,
- &wtid))
{
- GNUNET_break (0);
- fail (is);
- return;
- }
- if (0 != memcmp (&wtid,
- &ref->details.admin_add_incoming.wtid,
- sizeof (wtid)))
- {
- GNUNET_break (0);
- fail (is);
- return;
+ char *subject;
+ char *expect;
+
+ if (GNUNET_OK !=
+ TALER_FAKEBANK_check (is->fakebank,
+ &amount,
+ ref->details.admin_add_incoming.debit_account_no,
+ ref->details.admin_add_incoming.credit_account_no,
+ ref->details.admin_add_incoming.exchange_base_url,
+ &subject))
+ {
+ GNUNET_break (0);
+ fail (is);
+ return;
+ }
+ expect = GNUNET_STRINGS_data_to_string_alloc (&ref->details.admin_add_incoming.wtid,
+ sizeof (ref->details.admin_add_incoming.wtid));
+ if (0 != strcmp (subject, expect))
+ {
+ GNUNET_free (expect);
+ GNUNET_free (subject);
+ GNUNET_break (0);
+ fail (is);
+ return;
+ }
+ GNUNET_free (subject);
+ GNUNET_free (expect);
}
is->ip++;
is->task = GNUNET_SCHEDULER_add_now (&interpreter_run,
diff --git a/src/exchange-lib/test_exchange_api.c b/src/exchange-lib/test_exchange_api.c
index 53bfbd19b..e435ed77c 100644
--- a/src/exchange-lib/test_exchange_api.c
+++ b/src/exchange-lib/test_exchange_api.c
@@ -636,9 +636,9 @@ struct Command
const char *exchange_base_url;
/**
- * Set (!) to the wire transfer identifier observed.
+ * Set (!) to the wire transfer subject observed.
*/
- struct TALER_WireTransferIdentifierRawP wtid;
+ char *subject;
} check_bank_transfer;
@@ -1805,18 +1805,24 @@ deposit_wtid_cb (void *cls,
if (NULL != cmd->details.deposit_wtid.bank_transfer_ref)
{
const struct Command *ref;
+ char *ws;
+
+ ws = GNUNET_STRINGS_data_to_string_alloc (wtid,
+ sizeof (*wtid));
+
ref = find_command (is,
cmd->details.deposit_wtid.bank_transfer_ref);
GNUNET_assert (NULL != ref);
- if (0 != memcmp (wtid,
- &ref->details.check_bank_transfer.wtid,
- sizeof (struct TALER_WireTransferIdentifierRawP)))
+ if (0 != strcmp (ws,
+ ref->details.check_bank_transfer.subject))
{
GNUNET_break (0);
+ GNUNET_free (ws);
fail (is);
return;
}
+ GNUNET_free (ws);
}
break;
case MHD_HTTP_ACCEPTED:
@@ -2496,7 +2502,11 @@ interpreter_run (void *cls)
cmd->details.wire_deposits.wtid = ref->details.deposit_wtid.wtid;
break;
case OC_CHECK_BANK_TRANSFER:
- cmd->details.wire_deposits.wtid = ref->details.check_bank_transfer.wtid;
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_STRINGS_string_to_data (ref->details.check_bank_transfer.subject,
+ strlen (ref->details.check_bank_transfer.subject),
+ &cmd->details.wire_deposits.wtid,
+ sizeof (cmd->details.wire_deposits.wtid)));
break;
default:
GNUNET_break (0);
@@ -2597,7 +2607,7 @@ interpreter_run (void *cls)
cmd->details.check_bank_transfer.account_debit,
cmd->details.check_bank_transfer.account_credit,
cmd->details.check_bank_transfer.exchange_base_url,
- &cmd->details.check_bank_transfer.wtid))
+ &cmd->details.check_bank_transfer.subject))
{
GNUNET_break (0);
fail (is);
@@ -2951,6 +2961,8 @@ do_shutdown (void *cls)
}
break;
case OC_CHECK_BANK_TRANSFER:
+ GNUNET_free_non_null (cmd->details.check_bank_transfer.subject);
+ cmd->details.check_bank_transfer.subject = NULL;
break;
case OC_CHECK_BANK_TRANSFERS_EMPTY:
break;
diff --git a/src/exchange/test_taler_exchange_aggregator.c b/src/exchange/test_taler_exchange_aggregator.c
index 6eaa09320..db22613b7 100644
--- a/src/exchange/test_taler_exchange_aggregator.c
+++ b/src/exchange/test_taler_exchange_aggregator.c
@@ -118,7 +118,7 @@ struct Command
/**
* Subject of the transfer, set by the command.
*/
- struct TALER_WireTransferIdentifierRawP wtid;
+ char *subject;
} expect_transaction;
@@ -565,7 +565,7 @@ interpreter (void *cls)
cmd->details.expect_transaction.debit_account,
cmd->details.expect_transaction.credit_account,
cmd->details.expect_transaction.exchange_base_url,
- &cmd->details.expect_transaction.wtid))
+ &cmd->details.expect_transaction.subject))
{
fail (cmd);
return;
diff --git a/src/exchange/test_taler_exchange_wirewatch.c b/src/exchange/test_taler_exchange_wirewatch.c
index cf3cd49a0..f47a126b6 100644
--- a/src/exchange/test_taler_exchange_wirewatch.c
+++ b/src/exchange/test_taler_exchange_wirewatch.c
@@ -31,7 +31,6 @@
#include "taler_fakebank_lib.h"
-
/**
* Commands for the interpreter.
*/
@@ -127,7 +126,7 @@ struct Command
/**
* Subject of the transfer, set by the command.
*/
- struct TALER_WireTransferIdentifierRawP wtid;
+ char *subject;
} expect_transfer;
@@ -371,6 +370,8 @@ shutdown_action (void *cls)
state);
break;
case OPCODE_EXPECT_TRANSFER:
+ GNUNET_free_non_null (cmd->details.expect_transfer.subject);
+ cmd->details.expect_transfer.subject = NULL;
break;
case OPCODE_EXPECT_TRANSFERS_EMPTY:
break;
@@ -521,7 +522,7 @@ interpreter (void *cls)
cmd->details.expect_transfer.debit_account,
cmd->details.expect_transfer.credit_account,
cmd->details.expect_transfer.exchange_base_url,
- &cmd->details.expect_transfer.wtid))
+ &cmd->details.expect_transfer.subject))
{
fail (cmd);
return;
diff --git a/src/include/taler_fakebank_lib.h b/src/include/taler_fakebank_lib.h
index 7d8757d99..3df1e6095 100644
--- a/src/include/taler_fakebank_lib.h
+++ b/src/include/taler_fakebank_lib.h
@@ -62,8 +62,29 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h);
/**
+ * Tell the fakebank to create another wire transfer.
+ *
+ * @param h fake bank handle
+ * @param debit_account account to debit
+ * @param credit_account account to credit
+ * @param amount amount to transfer
+ * @param subject wire transfer subject to use
+ * @param exchange_base_url exchange URL
+ * @return serial_id of the transfer
+ */
+uint64_t
+TALER_FAKEBANK_make_transfer (struct TALER_FAKEBANK_Handle *h,
+ uint64_t debit_account,
+ uint64_t credit_account,
+ const struct TALER_Amount *amount,
+ const char *subject,
+ const char *exchange_base_url);
+
+
+
+/**
* Check that the @a want_amount was transferred from the @a
- * want_debit to the @a want_credit account. If so, set the @a wtid
+ * want_debit to the @a want_credit account. If so, set the @a subject
* to the transfer identifier and remove the transaction from the
* list. If the transaction was not recorded, return #GNUNET_SYSERR.
*
@@ -73,7 +94,7 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h);
* @param want_debit account that should have been credited
* @param exchange_base_url expected base URL of the exchange,
* i.e. "https://example.com/"; may include a port
- * @param[out] wtid set to the wire transfer identifier
+ * @param[out] subject set to the wire transfer identifier
* @return #GNUNET_OK on success
*/
int
@@ -82,7 +103,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
uint64_t want_debit,
uint64_t want_credit,
const char *exchange_base_url,
- struct TALER_WireTransferIdentifierRawP *wtid);
+ char **subject);
/**