summaryrefslogtreecommitdiff
path: root/src/bank-lib/taler-fakebank-run.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bank-lib/taler-fakebank-run.c')
-rw-r--r--src/bank-lib/taler-fakebank-run.c191
1 files changed, 175 insertions, 16 deletions
diff --git a/src/bank-lib/taler-fakebank-run.c b/src/bank-lib/taler-fakebank-run.c
index 4b94a4bd9..c15145ecb 100644
--- a/src/bank-lib/taler-fakebank-run.c
+++ b/src/bank-lib/taler-fakebank-run.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2016, 2017 Taler Systems SA
+ Copyright (C) 2016-2022 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
@@ -21,12 +21,73 @@
* @file bank-lib/taler-fakebank-run.c
* @brief Launch the fakebank, for testing the fakebank itself.
* @author Marcello Stanisci
+ * @author Christian Grothoff
*/
-
#include "platform.h"
#include "taler_fakebank_lib.h"
+#include "taler_mhd_lib.h"
+
+/**
+ * Number of threads to use (-n)
+ */
+static unsigned int num_threads;
+
+/**
+ * Force connection close after each request (-C)
+ */
+static int connection_close;
+
+/**
+ * Global return value.
+ */
+static int ret;
+
+/**
+ * Handle for the service.
+ */
+static struct TALER_FAKEBANK_Handle *fb;
+
+/**
+ * Keepalive task in multi-threaded mode.
+ */
+static struct GNUNET_SCHEDULER_Task *keepalive;
+
+/**
+ * Amount to credit an account with on /register.
+ */
+static struct TALER_Amount signup_bonus;
+
+/**
+ * Stop the process.
+ *
+ * @param cls NULL
+ */
+static void
+do_shutdown (void *cls)
+{
+ (void) cls;
+ TALER_FAKEBANK_stop (fb);
+ fb = NULL;
+ if (NULL != keepalive)
+ {
+ GNUNET_SCHEDULER_cancel (keepalive);
+ keepalive = NULL;
+ }
+}
+
+
+/**
+ * Task that should never be run.
+ *
+ * @param cls NULL
+ */
+static void
+keepalive_task (void *cls)
+{
+ (void) cls;
+ GNUNET_assert (0);
+}
-int ret;
/**
* Main function that will be run.
@@ -43,7 +104,11 @@ run (void *cls,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
+ unsigned long long port = 8082;
+ unsigned long long ram = 1024 * 128; /* 128 k entries */
char *currency_string;
+ char *hostname;
+ char *exchange_url;
(void) cls;
(void) args;
@@ -52,14 +117,91 @@ run (void *cls,
TALER_config_get_currency (cfg,
&currency_string))
{
- ret = 1;
+ ret = EXIT_NOTCONFIGURED;
return;
}
- if (NULL == TALER_FAKEBANK_start (8082,
- currency_string))
- ret = 1;
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_number (cfg,
+ "bank",
+ "HTTP_PORT",
+ &port))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Listening on default port %llu\n",
+ port);
+ }
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_string (cfg,
+ "bank",
+ "SUGGESTED_EXCHANGE",
+ &exchange_url))
+ {
+ /* no suggested exchange */
+ exchange_url = NULL;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_string (cfg,
+ "bank",
+ "HOSTNAME",
+ &hostname))
+ {
+ hostname = GNUNET_strdup ("localhost");
+ }
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_number (cfg,
+ "bank",
+ "RAM_LIMIT",
+ &ram))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Maximum transaction history in RAM set to default of %llu\n",
+ ram);
+ }
+ {
+ enum TALER_MHD_GlobalOptions go;
+
+ go = TALER_MHD_GO_NONE;
+ if (0 != connection_close)
+ go |= TALER_MHD_GO_FORCE_CONNECTION_CLOSE;
+ TALER_MHD_setup (go);
+ }
+ if (GNUNET_OK !=
+ TALER_amount_is_valid (&signup_bonus))
+ {
+ GNUNET_assert (GNUNET_OK ==
+ TALER_amount_set_zero (currency_string,
+ &signup_bonus));
+ }
+ if (0 != strcmp (currency_string,
+ signup_bonus.currency))
+ {
+ fprintf (stderr,
+ "Signup bonus and main currency do not match\n");
+ ret = EXIT_INVALIDARGUMENT;
+ return;
+ }
+ fb = TALER_FAKEBANK_start3 (hostname,
+ (uint16_t) port,
+ exchange_url,
+ currency_string,
+ ram,
+ num_threads,
+ &signup_bonus);
+ GNUNET_free (hostname);
+ GNUNET_free (exchange_url);
GNUNET_free (currency_string);
- ret = 0;
+ if (NULL == fb)
+ {
+ GNUNET_break (0);
+ ret = EXIT_FAILURE;
+ return;
+ }
+ keepalive = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+ &keepalive_task,
+ NULL);
+ GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
+ NULL);
+ ret = EXIT_SUCCESS;
}
@@ -75,16 +217,33 @@ main (int argc,
char *const *argv)
{
const struct GNUNET_GETOPT_CommandLineOption options[] = {
+ GNUNET_GETOPT_option_flag ('C',
+ "connection-close",
+ "force HTTP connections to be closed after each request",
+ &connection_close),
+ GNUNET_GETOPT_option_uint ('n',
+ "num-threads",
+ "NUM_THREADS",
+ "size of the thread pool",
+ &num_threads),
+ TALER_getopt_get_amount ('s',
+ "signup-bonus",
+ "AMOUNT",
+ "amount to credit newly registered account (created out of thin air)",
+ &signup_bonus),
GNUNET_GETOPT_OPTION_END
};
+ enum GNUNET_GenericReturnValue iret;
- if (GNUNET_OK !=
- GNUNET_PROGRAM_run (argc, argv,
- "taler-fakebank-run",
- "Runs the fakebank",
- options,
- &run,
- NULL))
- return 1;
+ iret = GNUNET_PROGRAM_run (argc, argv,
+ "taler-fakebank-run",
+ "Runs the fakebank",
+ options,
+ &run,
+ NULL);
+ if (GNUNET_SYSERR == iret)
+ return EXIT_INVALIDARGUMENT;
+ if (GNUNET_NO == iret)
+ return EXIT_SUCCESS;
return ret;
}