towards fixing #4399

This commit is contained in:
Christian Grothoff 2016-05-03 13:55:40 +02:00
parent 79c316f0d5
commit dc2d0a186c
2 changed files with 124 additions and 18 deletions

View File

@ -1,5 +1,5 @@
# This Makefile.am is in the public domain # This Makefile.am is in the public domain
AM_CPPFLAGS = -I$(top_srcdir)/src/include AM_CPPFLAGS = -I$(top_srcdir)/src/include -I$(top_srcdir)/src/bank-lib
if USE_COVERAGE if USE_COVERAGE
AM_CFLAGS = --coverage -O0 AM_CFLAGS = --coverage -O0
@ -55,6 +55,7 @@ test_exchange_api_SOURCES = \
test_exchange_api_LDADD = \ test_exchange_api_LDADD = \
libtalerexchange.la \ libtalerexchange.la \
$(LIBGCRYPT_LIBS) \ $(LIBGCRYPT_LIBS) \
$(top_builddir)/src/bank-lib/libfakebank.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,8 @@
#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 "fakebank.h"
/** /**
* Is the configuration file is set to include wire format 'test'? * Is the configuration file is set to include wire format 'test'?
@ -57,6 +59,11 @@ static struct GNUNET_CURL_RescheduleContext *rc;
*/ */
static struct GNUNET_SCHEDULER_Task *timeout_task; static struct GNUNET_SCHEDULER_Task *timeout_task;
/**
* Handle to our fakebank.
*/
static struct FAKEBANK_Handle *fakebank;
/** /**
* Result of the testcases, #GNUNET_OK on success * Result of the testcases, #GNUNET_OK on success
*/ */
@ -127,7 +134,17 @@ enum OpCode
/** /**
* Run the aggregator to execute deposits. * Run the aggregator to execute deposits.
*/ */
OC_RUN_AGGREGATOR OC_RUN_AGGREGATOR,
/**
* Check that the fakebank has received a certain transaction.
*/
OC_CHECK_BANK_DEPOSIT,
/**
* Check that the fakebank has not received any other transactions.
*/
OC_CHECK_BANK_DEPOSITS_EMPTY
}; };
@ -549,6 +566,30 @@ struct Command
} run_aggregator; } run_aggregator;
struct {
/**
* Which amount do we expect to see transferred?
*/
const char *amount;
/**
* Which account do we expect to be debited?
*/
uint64_t account_debit;
/**
* Which account do we expect to be credited?
*/
uint64_t account_credit;
/**
* Set (!) to the wire transfer identifier observed.
*/
struct TALER_WireTransferIdentifierRawP wtid;
} check_bank_deposit;
} details; } details;
}; };
@ -1685,20 +1726,20 @@ interpreter_run (void *cls)
} }
cmd->details.deposit.dh cmd->details.deposit.dh
= TALER_EXCHANGE_deposit (exchange, = TALER_EXCHANGE_deposit (exchange,
&amount, &amount,
wire_deadline, wire_deadline,
wire, wire,
&h_contract, &h_contract,
&coin_pub, &coin_pub,
coin_pk_sig, coin_pk_sig,
&coin_pk->key, &coin_pk->key,
timestamp, timestamp,
cmd->details.deposit.transaction_id, cmd->details.deposit.transaction_id,
&merchant_pub, &merchant_pub,
refund_deadline, refund_deadline,
&coin_sig, &coin_sig,
&deposit_cb, &deposit_cb,
is); is);
if (NULL == cmd->details.deposit.dh) if (NULL == cmd->details.deposit.dh)
{ {
GNUNET_break (0); GNUNET_break (0);
@ -1873,7 +1914,19 @@ interpreter_run (void *cls)
ref = find_command (is, ref = find_command (is,
cmd->details.wire_deposits.wtid_ref); cmd->details.wire_deposits.wtid_ref);
GNUNET_assert (NULL != ref); GNUNET_assert (NULL != ref);
cmd->details.wire_deposits.wtid = ref->details.deposit_wtid.wtid; switch (ref->oc)
{
case OC_DEPOSIT_WTID:
cmd->details.wire_deposits.wtid = ref->details.deposit_wtid.wtid;
break;
case OC_CHECK_BANK_DEPOSIT:
cmd->details.wire_deposits.wtid = ref->details.check_bank_deposit.wtid;
break;
default:
GNUNET_break (0);
fail (is);
return;
}
} }
cmd->details.wire_deposits.wdh cmd->details.wire_deposits.wdh
= TALER_EXCHANGE_wire_deposits (exchange, = TALER_EXCHANGE_wire_deposits (exchange,
@ -1967,6 +2020,45 @@ interpreter_run (void *cls)
next_command (is); next_command (is);
return; return;
} }
case OC_CHECK_BANK_DEPOSIT:
{
if (GNUNET_OK !=
TALER_string_to_amount (cmd->details.check_bank_deposit.amount,
&amount))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to parse amount `%s' at %u\n",
cmd->details.reserve_withdraw.amount,
is->ip);
fail (is);
return;
}
if (GNUNET_OK !=
FAKEBANK_check (fakebank,
&amount,
cmd->details.check_bank_deposit.account_debit,
cmd->details.check_bank_deposit.account_credit,
&cmd->details.check_bank_deposit.wtid))
{
GNUNET_break (0);
fail (is);
return;
}
next_command (is);
return;
}
case OC_CHECK_BANK_DEPOSITS_EMPTY:
{
if (GNUNET_OK !=
FAKEBANK_check_empty (fakebank))
{
GNUNET_break (0);
fail (is);
return;
}
next_command (is);
return;
}
default: default:
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Unknown instruction %d at %u (%s)\n", "Unknown instruction %d at %u (%s)\n",
@ -2159,6 +2251,10 @@ do_shutdown (void *cls)
cmd->details.run_aggregator.aggregator_proc = NULL; cmd->details.run_aggregator.aggregator_proc = NULL;
} }
break; break;
case OC_CHECK_BANK_DEPOSIT:
break;
case OC_CHECK_BANK_DEPOSITS_EMPTY:
break;
default: default:
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Unknown instruction %d at %u (%s)\n", "Unknown instruction %d at %u (%s)\n",
@ -2174,6 +2270,11 @@ do_shutdown (void *cls)
is->task = NULL; is->task = NULL;
} }
GNUNET_free (is); GNUNET_free (is);
if (NULL != fakebank)
{
FAKEBANK_stop (fakebank);
fakebank = NULL;
}
if (NULL != exchange) if (NULL != exchange)
{ {
TALER_EXCHANGE_disconnect (exchange); TALER_EXCHANGE_disconnect (exchange);
@ -2465,6 +2566,9 @@ run (void *cls)
{ .oc = OC_RUN_AGGREGATOR, { .oc = OC_RUN_AGGREGATOR,
.label = "run-aggregator" }, .label = "run-aggregator" },
{ .oc = OC_CHECK_BANK_DEPOSITS_EMPTY,
.label = "check_bank_empty" },
/* TODO: trigger aggregation logic and then check the /* TODO: trigger aggregation logic and then check the
cases where tracking succeeds! */ cases where tracking succeeds! */
@ -2481,8 +2585,9 @@ run (void *cls)
ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule, ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule,
&rc); &rc);
rc = GNUNET_CURL_gnunet_rc_create (ctx);
GNUNET_assert (NULL != ctx); GNUNET_assert (NULL != ctx);
rc = GNUNET_CURL_gnunet_rc_create (ctx);
fakebank = FAKEBANK_start (8082);
exchange = TALER_EXCHANGE_connect (ctx, exchange = TALER_EXCHANGE_connect (ctx,
"http://localhost:8081", "http://localhost:8081",
&cert_cb, is, &cert_cb, is,