Merge branch 'master' of git+ssh://taler.net/var/git/exchange

This commit is contained in:
Christian Grothoff 2016-06-08 22:14:24 +02:00
commit 3b9248e9c6
13 changed files with 235 additions and 83 deletions

View File

@ -1,3 +1,7 @@
Wed Jun 8 11:32:41 CEST 2016
Export libtalerfakebank API so we can use it in testcases for the
merchant as well. -CG
Tue Jun 7 15:13:46 CEST 2016 Tue Jun 7 15:13:46 CEST 2016
Adding public key of the exchange that was used to sign replies Adding public key of the exchange that was used to sign replies
to applicable callbacks of libtalerexchange. (This will eventually to applicable callbacks of libtalerexchange. (This will eventually

View File

@ -7,10 +7,8 @@ if USE_COVERAGE
endif endif
lib_LTLIBRARIES = \ lib_LTLIBRARIES = \
libtalerbank.la libtalerbank.la \
libtalerfakebank.la
noinst_LTLIBRARIES = \
libfakebank.la
libtalerbank_la_LDFLAGS = \ libtalerbank_la_LDFLAGS = \
-version-info 0:0:0 \ -version-info 0:0:0 \
@ -27,10 +25,15 @@ libtalerbank_la_LIBADD = \
-ljansson \ -ljansson \
$(XLIB) $(XLIB)
libfakebank_la_SOURCES = \
fakebank.c fakebank.h
libfakebank_la_LIBADD = \ libtalerfakebank_la_LDFLAGS = \
-version-info 0:0:0 \
-no-undefined
libtalerfakebank_la_SOURCES = \
fakebank.c
libtalerfakebank_la_LIBADD = \
$(top_builddir)/src/json/libtalerjson.la \ $(top_builddir)/src/json/libtalerjson.la \
-lgnunetjson \ -lgnunetjson \
-lgnunetutil \ -lgnunetutil \
@ -58,7 +61,7 @@ test_bank_api_SOURCES = \
test_bank_api.c test_bank_api.c
test_bank_api_LDADD = \ test_bank_api_LDADD = \
libtalerbank.la \ libtalerbank.la \
libfakebank.la \ libtalerfakebank.la \
$(top_builddir)/src/util/libtalerutil.la \ $(top_builddir)/src/util/libtalerutil.la \
-lgnunetcurl \ -lgnunetcurl \
-lgnunetutil \ -lgnunetutil \
@ -70,7 +73,7 @@ test_bank_api_with_fakebank_SOURCES = \
test_bank_api_with_fakebank.c test_bank_api_with_fakebank.c
test_bank_api_with_fakebank_LDADD = \ test_bank_api_with_fakebank_LDADD = \
libtalerbank.la \ libtalerbank.la \
libfakebank.la \ libtalerfakebank.la \
$(top_builddir)/src/util/libtalerutil.la \ $(top_builddir)/src/util/libtalerutil.la \
-lgnunetcurl \ -lgnunetcurl \
-lgnunetutil \ -lgnunetutil \

View File

@ -21,7 +21,7 @@
*/ */
#include "platform.h" #include "platform.h"
#include "fakebank.h" #include "taler_fakebank_lib.h"
/** /**
* Maximum POST request size (for /admin/add/incoming) * Maximum POST request size (for /admin/add/incoming)
@ -71,7 +71,7 @@ struct Transaction
/** /**
* Handle for the fake bank. * Handle for the fake bank.
*/ */
struct FAKEBANK_Handle struct TALER_FAKEBANK_Handle
{ {
/** /**
* We store transactions in a DLL. * We store transactions in a DLL.
@ -109,11 +109,11 @@ struct FAKEBANK_Handle
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int int
FAKEBANK_check (struct FAKEBANK_Handle *h, TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
const struct TALER_Amount *want_amount, const struct TALER_Amount *want_amount,
uint64_t want_debit, uint64_t want_debit,
uint64_t want_credit, uint64_t want_credit,
struct TALER_WireTransferIdentifierRawP *wtid) struct TALER_WireTransferIdentifierRawP *wtid)
{ {
struct Transaction *t; struct Transaction *t;
@ -152,14 +152,14 @@ FAKEBANK_check (struct FAKEBANK_Handle *h,
/** /**
* Check that no wire transfers were ordered (or at least none * Check that no wire transfers were ordered (or at least none
* that have not been taken care of via #FAKEBANK_check()). * that have not been taken care of via #TALER_FAKEBANK_check()).
* If any transactions are onrecord, return #GNUNET_SYSERR. * If any transactions are onrecord, return #GNUNET_SYSERR.
* *
* @param h bank instance * @param h bank instance
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int int
FAKEBANK_check_empty (struct FAKEBANK_Handle *h) TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h)
{ {
struct Transaction *t; struct Transaction *t;
@ -190,7 +190,7 @@ FAKEBANK_check_empty (struct FAKEBANK_Handle *h)
* @param h bank to stop * @param h bank to stop
*/ */
void void
FAKEBANK_stop (struct FAKEBANK_Handle *h) TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h)
{ {
if (NULL != h->mhd_task) if (NULL != h->mhd_task)
{ {
@ -226,7 +226,7 @@ handle_mhd_completion_callback (void *cls,
void **con_cls, void **con_cls,
enum MHD_RequestTerminationCode toe) enum MHD_RequestTerminationCode toe)
{ {
/* struct FAKEBANK_Handle *h = cls; */ /* struct TALER_FAKEBANK_Handle *h = cls; */
GNUNET_JSON_post_parser_cleanup (*con_cls); GNUNET_JSON_post_parser_cleanup (*con_cls);
*con_cls = NULL; *con_cls = NULL;
@ -256,7 +256,7 @@ handle_mhd_request (void *cls,
size_t *upload_data_size, size_t *upload_data_size,
void **con_cls) void **con_cls)
{ {
struct FAKEBANK_Handle *h = cls; struct TALER_FAKEBANK_Handle *h = cls;
enum GNUNET_JSON_PostResult pr; enum GNUNET_JSON_PostResult pr;
json_t *json; json_t *json;
struct Transaction *t; struct Transaction *t;
@ -331,7 +331,7 @@ handle_mhd_request (void *cls,
/** /**
* Task run whenever HTTP server operations are pending. * Task run whenever HTTP server operations are pending.
* *
* @param cls the `struct FAKEBANK_Handle` * @param cls the `struct TALER_FAKEBANK_Handle`
*/ */
static void static void
run_mhd (void *cls); run_mhd (void *cls);
@ -343,7 +343,7 @@ run_mhd (void *cls);
* always be called later whenever there is work to be done. * always be called later whenever there is work to be done.
*/ */
static void static void
schedule_httpd (struct FAKEBANK_Handle *h) schedule_httpd (struct TALER_FAKEBANK_Handle *h)
{ {
fd_set rs; fd_set rs;
fd_set ws; fd_set ws;
@ -399,12 +399,12 @@ schedule_httpd (struct FAKEBANK_Handle *h)
/** /**
* Task run whenever HTTP server operations are pending. * Task run whenever HTTP server operations are pending.
* *
* @param cls the `struct FAKEBANK_Handle` * @param cls the `struct TALER_FAKEBANK_Handle`
*/ */
static void static void
run_mhd (void *cls) run_mhd (void *cls)
{ {
struct FAKEBANK_Handle *h = cls; struct TALER_FAKEBANK_Handle *h = cls;
h->mhd_task = NULL; h->mhd_task = NULL;
MHD_run (h->mhd_bank); MHD_run (h->mhd_bank);
@ -418,12 +418,12 @@ run_mhd (void *cls)
* @param port port to listen to * @param port port to listen to
* @return NULL on error * @return NULL on error
*/ */
struct FAKEBANK_Handle * struct TALER_FAKEBANK_Handle *
FAKEBANK_start (uint16_t port) TALER_FAKEBANK_start (uint16_t port)
{ {
struct FAKEBANK_Handle *h; struct TALER_FAKEBANK_Handle *h;
h = GNUNET_new (struct FAKEBANK_Handle); h = GNUNET_new (struct TALER_FAKEBANK_Handle);
h->mhd_bank = MHD_start_daemon (MHD_USE_DEBUG, h->mhd_bank = MHD_start_daemon (MHD_USE_DEBUG,
port, port,
NULL, NULL, NULL, NULL,

View File

@ -26,7 +26,7 @@
#include <gnunet/gnunet_curl_lib.h> #include <gnunet/gnunet_curl_lib.h>
#include <microhttpd.h> #include <microhttpd.h>
#include "test_bank_interpreter.h" #include "test_bank_interpreter.h"
#include "fakebank.h" #include "taler_fakebank_lib.h"
/** /**
@ -72,7 +72,7 @@ struct InterpreterState
/** /**
* Fakebank, or NULL if we are not using the fakebank. * Fakebank, or NULL if we are not using the fakebank.
*/ */
struct FAKEBANK_Handle *fakebank; struct TALER_FAKEBANK_Handle *fakebank;
/** /**
* Instruction pointer. Tells #interpreter_run() which * Instruction pointer. Tells #interpreter_run() which
@ -242,7 +242,7 @@ interpreter_run (void *cls)
TALER_string_to_amount (ref->details.admin_add_incoming.amount, TALER_string_to_amount (ref->details.admin_add_incoming.amount,
&amount)); &amount));
if (GNUNET_OK != if (GNUNET_OK !=
FAKEBANK_check (is->fakebank, TALER_FAKEBANK_check (is->fakebank,
&amount, &amount,
ref->details.admin_add_incoming.debit_account_no, ref->details.admin_add_incoming.debit_account_no,
ref->details.admin_add_incoming.credit_account_no, ref->details.admin_add_incoming.credit_account_no,
@ -265,7 +265,7 @@ interpreter_run (void *cls)
is); is);
return; return;
case TBI_OC_EXPECT_TRANSFERS_EMPTY: case TBI_OC_EXPECT_TRANSFERS_EMPTY:
if (GNUNET_OK != FAKEBANK_check_empty (is->fakebank)) if (GNUNET_OK != TALER_FAKEBANK_check_empty (is->fakebank))
{ {
GNUNET_break (0); GNUNET_break (0);
fail (is); fail (is);
@ -355,7 +355,7 @@ do_shutdown (void *cls)
} }
if (NULL != is->fakebank) if (NULL != is->fakebank)
{ {
FAKEBANK_stop (is->fakebank); TALER_FAKEBANK_stop (is->fakebank);
is->fakebank = NULL; is->fakebank = NULL;
} }
GNUNET_CURL_fini (is->ctx); GNUNET_CURL_fini (is->ctx);
@ -381,7 +381,7 @@ TBI_run_interpreter (int *resultp,
is = GNUNET_new (struct InterpreterState); is = GNUNET_new (struct InterpreterState);
if (GNUNET_YES == run_bank) if (GNUNET_YES == run_bank)
is->fakebank = FAKEBANK_start (8081); is->fakebank = TALER_FAKEBANK_start (8081);
is->resultp = resultp; is->resultp = resultp;
is->commands = commands; is->commands = commands;
is->ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule, is->ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule,

View File

@ -0,0 +1 @@
{"type":"test", "bank_uri":"https://bank.test.taler.net/", "account_number":63}

View File

@ -0,0 +1 @@
{"type":"test", "bank_uri":"https://bank.test.taler.net/", "account_number":63}

View File

@ -26,17 +26,38 @@
#include <gnunet/gnunet_util_lib.h> #include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_curl_lib.h> #include <gnunet/gnunet_curl_lib.h>
#include <microhttpd.h> #include <microhttpd.h>
#include <jansson.h>
/** /**
* How many coins the benchmark should operate on * How many coins the benchmark should operate on
*/ */
static unsigned int pool_size = 100; static unsigned int pool_size = 100;
/**
* Configuration file path
*/
static char *config_file;
/**
* Configuation object (used to get BANK_URI)
*/
struct GNUNET_CONFIGURATION_Handle *cfg;
/** /**
* How many reservers ought to be created given the pool size * How many reservers ought to be created given the pool size
*/ */
static unsigned int nreserves; static unsigned int nreserves;
/**
* Bank details of who creates reserves
*/
json_t *sender_details;
/**
* Bank details of who deposits coins
*/
json_t *merchant_details;
/** /**
* Needed information for a reserve. Other values are the same for all reserves, therefore defined in global variables * Needed information for a reserve. Other values are the same for all reserves, therefore defined in global variables
*/ */
@ -182,7 +203,7 @@ static struct TALER_MerchantPrivateKeyP merchant_priv;
/** /**
* URI under which the exchange is reachable during the benchmark. * URI under which the exchange is reachable during the benchmark.
*/ */
#define EXCHANGE_URI "http://localhost:8081" #define EXCHANGE_URI "http://localhost:8081/"
/** /**
* How many coins (AKA withdraw operations) per reserve should be withdrawn * How many coins (AKA withdraw operations) per reserve should be withdrawn
@ -190,17 +211,21 @@ static struct TALER_MerchantPrivateKeyP merchant_priv;
#define COINS_PER_RESERVE 12 #define COINS_PER_RESERVE 12
/** /**
* Used currency (to be preferably gotten via config file, together * Used currency (read from /keys' output)
* exchange URI and other needed values)
*/ */
#define CURRENCY "PUDOS" static char *currency;
/** /**
* Large enough value to allow having 12 coins per reserve without parsing * Large enough value to allow having 12 coins per reserve without parsing
* /keys in the first place * /keys in the first place
*/ */
#define RESERVE_AMOUNT CURRENCY":1000" #define RESERVE_VALUE 1000
/**
* The benchmark withdraws always the same denomination, since the calculation
* for refreshing is statically done (at least in its very first version).
*/
#define COIN_VALUE 5
/** /**
* Probability a coin can be spent * Probability a coin can be spent
@ -246,6 +271,7 @@ fail (const char *msg)
"%s\n", "%s\n",
msg); msg);
GNUNET_SCHEDULER_shutdown (); GNUNET_SCHEDULER_shutdown ();
return;
} }
@ -335,7 +361,6 @@ deposit_cb (void *cls,
{ {
/* TODO: all the refresh logic here */ /* TODO: all the refresh logic here */
refreshed_once = GNUNET_YES; refreshed_once = GNUNET_YES;
} }
} }
@ -373,7 +398,6 @@ reserve_withdraw_cb (void *cls,
struct GNUNET_TIME_Absolute timestamp; struct GNUNET_TIME_Absolute timestamp;
struct GNUNET_TIME_Absolute refund_deadline; struct GNUNET_TIME_Absolute refund_deadline;
struct GNUNET_HashCode h_contract; struct GNUNET_HashCode h_contract;
json_t *merchant_details;
struct TALER_CoinSpendPublicKeyP coin_pub; struct TALER_CoinSpendPublicKeyP coin_pub;
struct TALER_DepositRequestPS dr; struct TALER_DepositRequestPS dr;
struct TALER_MerchantPublicKeyP merchant_pub; struct TALER_MerchantPublicKeyP merchant_pub;
@ -394,10 +418,6 @@ reserve_withdraw_cb (void *cls,
TALER_amount_subtract (&amount, TALER_amount_subtract (&amount,
&coins[coin_index].pk->value, &coins[coin_index].pk->value,
&coins[coin_index].pk->fee_deposit); &coins[coin_index].pk->fee_deposit);
merchant_details = json_loads ("{ \"type\":\"test\", \"bank_uri\":\"https://bank.test.taler.net/\", \"account_number\":63}",
JSON_REJECT_DUPLICATES,
NULL);
memset (&dr, 0, sizeof (dr)); memset (&dr, 0, sizeof (dr));
dr.purpose.size = htonl (sizeof (struct TALER_DepositRequestPS)); dr.purpose.size = htonl (sizeof (struct TALER_DepositRequestPS));
dr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_DEPOSIT); dr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_DEPOSIT);
@ -482,7 +502,8 @@ add_incoming_cb (void *cls,
coin_index = reserve_index * COINS_PER_RESERVE + i; coin_index = reserve_index * COINS_PER_RESERVE + i;
coins[coin_index].coin_priv.eddsa_priv = *coin_priv; coins[coin_index].coin_priv.eddsa_priv = *coin_priv;
coins[coin_index].reserve_index = reserve_index; coins[coin_index].reserve_index = reserve_index;
TALER_string_to_amount (CURRENCY":5", &amount); TALER_amount_get_zero (currency, &amount);
amount.value = COIN_VALUE;
GNUNET_assert (NULL != (coins[coin_index].pk = find_pk (keys, &amount))); GNUNET_assert (NULL != (coins[coin_index].pk = find_pk (keys, &amount)));
GNUNET_free (coin_priv); GNUNET_free (coin_priv);
coins[coin_index].wsh = coins[coin_index].wsh =
@ -508,7 +529,6 @@ benchmark_run (void *cls)
unsigned int i; unsigned int i;
struct GNUNET_CRYPTO_EddsaPrivateKey *priv; struct GNUNET_CRYPTO_EddsaPrivateKey *priv;
json_t *transfer_details; json_t *transfer_details;
json_t *sender_details;
char *uuid; char *uuid;
struct TALER_ReservePublicKeyP reserve_pub; struct TALER_ReservePublicKeyP reserve_pub;
struct GNUNET_TIME_Absolute execution_date; struct GNUNET_TIME_Absolute execution_date;
@ -521,18 +541,13 @@ benchmark_run (void *cls)
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
&blinding_key, &blinding_key,
sizeof (blinding_key)); sizeof (blinding_key));
TALER_string_to_amount (RESERVE_AMOUNT, &reserve_amount); TALER_amount_get_zero (currency, &reserve_amount);
sender_details = json_loads ("{ \"type\":\"test\", \"bank_uri\":\"https://bank.test.taler.net/\", \"account_number\":62}", reserve_amount.value = RESERVE_VALUE;
JSON_REJECT_DUPLICATES,
NULL);
execution_date = GNUNET_TIME_absolute_get (); execution_date = GNUNET_TIME_absolute_get ();
GNUNET_TIME_round_abs (&execution_date); GNUNET_TIME_round_abs (&execution_date);
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"benchmark_run() invoked\n"); "benchmark_run() invoked\n");
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"gotten pool_size of %d\n",
pool_size);
nreserves = pool_size / COINS_PER_RESERVE; nreserves = pool_size / COINS_PER_RESERVE;
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"creating %d reserves\n", "creating %d reserves\n",
@ -600,6 +615,9 @@ cert_cb (void *cls,
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Certificate callback invoked, invoking benchmark_run()\n"); "Certificate callback invoked, invoking benchmark_run()\n");
keys = _keys; keys = _keys;
currency = _keys->denom_keys[0].value.currency;
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Using currency: %s\n", currency);
benchmark_task = GNUNET_SCHEDULER_add_now (&benchmark_run, benchmark_task = GNUNET_SCHEDULER_add_now (&benchmark_run,
NULL); NULL);
} }
@ -662,6 +680,11 @@ do_shutdown (void *cls)
} }
if (NULL != sender_details)
json_decref (sender_details);
if (NULL != merchant_details)
json_decref (sender_details);
GNUNET_free_non_null (reserves); GNUNET_free_non_null (reserves);
GNUNET_free_non_null (coins); GNUNET_free_non_null (coins);
GNUNET_free_non_null (spent_coins); GNUNET_free_non_null (spent_coins);
@ -692,13 +715,51 @@ do_shutdown (void *cls)
static void static void
run (void *cls) run (void *cls)
{ {
char *sender_details_filename;
char *merchant_details_filename;
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"running run()\n"); "running run()\n");
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"gotten pool_size of %d\n",
pool_size);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"config file: %s\n",
config_file);
if (NULL == config_file)
fail ("-c option is mandatory\n");
/**
* Read sender_details.json here
*/
cfg = GNUNET_CONFIGURATION_create ();
if (GNUNET_SYSERR == GNUNET_CONFIGURATION_parse (cfg, config_file))
fail ("failed to parse configuration file\n");
if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg,
"benchmark",
"sender_details",
&sender_details_filename))
fail ("failed to get SENDER_DETAILS value\n");
sender_details = json_load_file (sender_details_filename,
JSON_REJECT_DUPLICATES,
NULL);
if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg,
"benchmark",
"merchant_details",
&merchant_details_filename))
fail ("failed to get MERCHANT_DETAILS value\n");
merchant_details = json_load_file (merchant_details_filename,
JSON_REJECT_DUPLICATES,
NULL);
GNUNET_CONFIGURATION_destroy (cfg);
GNUNET_array_append (spent_coins, GNUNET_array_append (spent_coins,
spent_coins_size, spent_coins_size,
1); 1);
spent_coins_size++; spent_coins_size++;
reserves = NULL; reserves = NULL;
coins = NULL; coins = NULL;
ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule, ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule,
@ -720,18 +781,96 @@ main (int argc,
char * const *argv) char * const *argv)
{ {
struct GNUNET_OS_Process *proc;
struct GNUNET_OS_Process *exchanged;
unsigned int cnt;
GNUNET_log_setup ("taler-exchange-benchmark", GNUNET_log_setup ("taler-exchange-benchmark",
"WARNING", "WARNING",
NULL); NULL);
const struct GNUNET_GETOPT_CommandLineOption options[] = { const struct GNUNET_GETOPT_CommandLineOption options[] = {
{'s', "pool-size", NULL, {'s', "pool-size", NULL,
"How many coins this benchmark should instantiate", GNUNET_YES, "How many coins this benchmark should instantiate", GNUNET_YES,
&GNUNET_GETOPT_set_uint, &pool_size} &GNUNET_GETOPT_set_uint, &pool_size},
{'c', "config", NULL,
"Configuration file", GNUNET_YES,
&GNUNET_GETOPT_set_string, &config_file}
}; };
GNUNET_assert (GNUNET_SYSERR != GNUNET_assert (GNUNET_SYSERR !=
GNUNET_GETOPT_run ("taler-exchange-benchmark", GNUNET_GETOPT_run ("taler-exchange-benchmark",
options, argc, argv)); options, argc, argv));
proc = GNUNET_OS_start_process (GNUNET_NO,
GNUNET_OS_INHERIT_STD_ALL,
NULL, NULL, NULL,
"taler-exchange-keyup",
"taler-exchange-keyup",
NULL);
if (NULL == proc)
{
fprintf (stderr,
"Failed to run taler-exchange-keyup. Check your PATH.\n");
return 77;
}
GNUNET_OS_process_wait (proc);
GNUNET_OS_process_destroy (proc);
proc = GNUNET_OS_start_process (GNUNET_NO,
GNUNET_OS_INHERIT_STD_ALL,
NULL, NULL, NULL,
"taler-exchange-dbinit",
"taler-exchange-dbinit",
"-r",
NULL);
if (NULL == proc)
{
fprintf (stderr,
"Failed to run taler-exchange-dbinit. Check your PATH.\n");
return 77;
}
GNUNET_OS_process_wait (proc);
GNUNET_OS_process_destroy (proc);
exchanged = GNUNET_OS_start_process (GNUNET_NO,
GNUNET_OS_INHERIT_STD_ALL,
NULL, NULL, NULL,
"taler-exchange-httpd",
"taler-exchange-httpd",
NULL);
if (NULL == exchanged)
{
fprintf (stderr,
"Failed to run taler-exchange-httpd. Check your PATH.\n");
return 77;
}
cnt = 0;
do
{
fprintf (stderr, ".");
sleep (1);
cnt++;
if (cnt > 60)
{
fprintf (stderr,
"\nFailed to start taler-exchange-httpd\n");
GNUNET_OS_process_kill (exchanged,
SIGKILL);
GNUNET_OS_process_wait (exchanged);
GNUNET_OS_process_destroy (exchanged);
return 77;
}
}
while (0 != system ("wget -q -t 1 -T 1 " EXCHANGE_URI "keys -o /dev/null -O /dev/null"));
fprintf (stderr, "\n");
GNUNET_SCHEDULER_run (&run, NULL); GNUNET_SCHEDULER_run (&run, NULL);
GNUNET_OS_process_wait (exchanged);
GNUNET_OS_process_destroy (exchanged);
return GNUNET_OK; return GNUNET_OK;
} }

View File

@ -0,0 +1,3 @@
[benchmark]
SENDER_DETAILS = ~/exchange/src/benchmark/sender_details.json
MERCHANT_DETAILS = ~/exchange/src/benchmark/merchant_details.json

View File

@ -56,7 +56,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/bank-lib/libtalerfakebank.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,7 +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 "fakebank.h" #include "taler_fakebank_lib.h"
/** /**
@ -62,7 +62,7 @@ static struct GNUNET_SCHEDULER_Task *timeout_task;
/** /**
* Handle to our fakebank. * Handle to our fakebank.
*/ */
static struct FAKEBANK_Handle *fakebank; static struct TALER_FAKEBANK_Handle *fakebank;
/** /**
* Result of the testcases, #GNUNET_OK on success * Result of the testcases, #GNUNET_OK on success
@ -2252,7 +2252,7 @@ interpreter_run (void *cls)
return; return;
} }
if (GNUNET_OK != if (GNUNET_OK !=
FAKEBANK_check (fakebank, TALER_FAKEBANK_check (fakebank,
&amount, &amount,
cmd->details.check_bank_transfer.account_debit, cmd->details.check_bank_transfer.account_debit,
cmd->details.check_bank_transfer.account_credit, cmd->details.check_bank_transfer.account_credit,
@ -2268,7 +2268,7 @@ interpreter_run (void *cls)
case OC_CHECK_BANK_TRANSFERS_EMPTY: case OC_CHECK_BANK_TRANSFERS_EMPTY:
{ {
if (GNUNET_OK != if (GNUNET_OK !=
FAKEBANK_check_empty (fakebank)) TALER_FAKEBANK_check_empty (fakebank))
{ {
GNUNET_break (0); GNUNET_break (0);
fail (is); fail (is);
@ -2580,7 +2580,7 @@ do_shutdown (void *cls)
GNUNET_free (is); GNUNET_free (is);
if (NULL != fakebank) if (NULL != fakebank)
{ {
FAKEBANK_stop (fakebank); TALER_FAKEBANK_stop (fakebank);
fakebank = NULL; fakebank = NULL;
} }
if (NULL != exchange) if (NULL != exchange)
@ -3012,7 +3012,7 @@ run (void *cls)
&rc); &rc);
GNUNET_assert (NULL != ctx); GNUNET_assert (NULL != ctx);
rc = GNUNET_CURL_gnunet_rc_create (ctx); rc = GNUNET_CURL_gnunet_rc_create (ctx);
fakebank = FAKEBANK_start (8082); fakebank = TALER_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,

View File

@ -25,7 +25,7 @@
#include "taler_json_lib.h" #include "taler_json_lib.h"
#include "taler_exchangedb_plugin.h" #include "taler_exchangedb_plugin.h"
#include <microhttpd.h> #include <microhttpd.h>
#include "fakebank.h" #include "taler_fakebank_lib.h"
@ -247,7 +247,7 @@ static struct GNUNET_CRYPTO_RsaPublicKey *coin_pub;
/** /**
* Handle for our fake bank. * Handle for our fake bank.
*/ */
static struct FAKEBANK_Handle *fb; static struct TALER_FAKEBANK_Handle *fb;
/** /**
@ -295,7 +295,7 @@ shutdown_action (void *cls)
} }
if (NULL != fb) if (NULL != fb)
{ {
FAKEBANK_stop (fb); TALER_FAKEBANK_stop (fb);
fb = NULL; fb = NULL;
} }
if (NULL != child_death_task) if (NULL != child_death_task)
@ -532,7 +532,7 @@ interpreter (void *cls)
} }
return; return;
case OPCODE_EXPECT_TRANSACTIONS_EMPTY: case OPCODE_EXPECT_TRANSACTIONS_EMPTY:
if (GNUNET_OK != FAKEBANK_check_empty (fb)) if (GNUNET_OK != TALER_FAKEBANK_check_empty (fb))
{ {
fail (cmd); fail (cmd);
return; return;
@ -561,7 +561,7 @@ interpreter (void *cls)
return; return;
} }
if (GNUNET_OK != if (GNUNET_OK !=
FAKEBANK_check (fb, TALER_FAKEBANK_check (fb,
&want_amount, &want_amount,
cmd->details.expect_transaction.debit_account, cmd->details.expect_transaction.debit_account,
cmd->details.expect_transaction.credit_account, cmd->details.expect_transaction.credit_account,
@ -1179,7 +1179,7 @@ run (void *cls)
&timeout_action, &timeout_action,
NULL); NULL);
result = 1; /* test failed for undefined reason */ result = 1; /* test failed for undefined reason */
fb = FAKEBANK_start (8082); fb = TALER_FAKEBANK_start (8082);
if (NULL == fb) if (NULL == fb)
{ {
GNUNET_SCHEDULER_shutdown (); GNUNET_SCHEDULER_shutdown ();

View File

@ -15,11 +15,12 @@ talerinclude_HEADERS = \
taler_amount_lib.h \ taler_amount_lib.h \
taler_bank_service.h \ taler_bank_service.h \
taler_crypto_lib.h \ taler_crypto_lib.h \
taler_json_lib.h \
taler_util.h \
taler_exchange_service.h \ taler_exchange_service.h \
taler_exchangedb_lib.h \ taler_exchangedb_lib.h \
taler_exchangedb_plugin.h \ taler_exchangedb_plugin.h \
taler_fakebank_lib.h \
taler_json_lib.h \
taler_util.h \
taler_pq_lib.h \ taler_pq_lib.h \
taler_signatures.h \ taler_signatures.h \
taler_wire_lib.h \ taler_wire_lib.h \

View File

@ -19,8 +19,8 @@
* @brief API for a library that fakes being a Taler bank * @brief API for a library that fakes being a Taler bank
* @author Christian Grothoff <christian@grothoff.org> * @author Christian Grothoff <christian@grothoff.org>
*/ */
#ifndef FAKEBANK_H #ifndef TALER_FAKEBANK_H
#define FAKEBANK_H #define TALER_FAKEBANK_H
#include "taler_util.h" #include "taler_util.h"
#include <gnunet/gnunet_json_lib.h> #include <gnunet/gnunet_json_lib.h>
@ -30,14 +30,14 @@
/** /**
* Handle for the fake bank. * Handle for the fake bank.
*/ */
struct FAKEBANK_Handle; struct TALER_FAKEBANK_Handle;
/** /**
* Start the fake bank. The fake bank will, like the normal bank, * Start the fake bank. The fake bank will, like the normal bank,
* listen for requests for /admin/add/incoming. However, instead of * listen for requests for /admin/add/incoming. However, instead of
* executing or storing those requests, it will simply allow querying * executing or storing those requests, it will simply allow querying
* whether such a request has been made via #FAKEBANK_check(). * whether such a request has been made via #TALER_FAKEBANK_check().
* *
* This is useful for writing testcases to check whether the exchange * This is useful for writing testcases to check whether the exchange
* would have issued the correct wire transfer orders. * would have issued the correct wire transfer orders.
@ -45,20 +45,20 @@ struct FAKEBANK_Handle;
* @param port port to listen to * @param port port to listen to
* @return NULL on error * @return NULL on error
*/ */
struct FAKEBANK_Handle * struct TALER_FAKEBANK_Handle *
FAKEBANK_start (uint16_t port); TALER_FAKEBANK_start (uint16_t port);
/** /**
* Check that no wire transfers were ordered (or at least none * Check that no wire transfers were ordered (or at least none
* that have not been taken care of via #FAKEBANK_check()). * that have not been taken care of via #TALER_FAKEBANK_check()).
* If any transactions are onrecord, return #GNUNET_SYSERR. * If any transactions are onrecord, return #GNUNET_SYSERR.
* *
* @param h bank instance * @param h bank instance
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int int
FAKEBANK_check_empty (struct FAKEBANK_Handle *h); TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h);
/** /**
@ -75,7 +75,7 @@ FAKEBANK_check_empty (struct FAKEBANK_Handle *h);
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int int
FAKEBANK_check (struct FAKEBANK_Handle *h, TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
const struct TALER_Amount *want_amount, const struct TALER_Amount *want_amount,
uint64_t want_debit, uint64_t want_debit,
uint64_t want_credit, uint64_t want_credit,
@ -88,7 +88,7 @@ FAKEBANK_check (struct FAKEBANK_Handle *h,
* @param h bank to stop * @param h bank to stop
*/ */
void void
FAKEBANK_stop (struct FAKEBANK_Handle *h); TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h);
#endif #endif