add skeleton for auditor httpd tests
This commit is contained in:
parent
ac850bfcd2
commit
42a21ffc8e
@ -22,12 +22,12 @@ pkgcfg_DATA = \
|
||||
EXTRA_DIST = \
|
||||
taler.conf
|
||||
|
||||
SUBDIRS = include util wire json $(PQ_DIR) $(BANK_LIB) wire-plugins exchangedb exchange exchange-tools auditordb auditor auditor-lib
|
||||
SUBDIRS = include util wire json $(PQ_DIR) $(BANK_LIB) wire-plugins exchangedb exchange exchange-tools auditordb auditor
|
||||
if HAVE_LIBCURL
|
||||
SUBDIRS += exchange-lib benchmark
|
||||
SUBDIRS += exchange-lib auditor-lib benchmark
|
||||
else
|
||||
if HAVE_LIBGNURL
|
||||
SUBDIRS += exchange-lib benchmark
|
||||
SUBDIRS += exchange-lib auditor-lib benchmark
|
||||
endif
|
||||
endif
|
||||
|
||||
|
1
src/auditor-lib/.gitignore
vendored
Normal file
1
src/auditor-lib/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
test_auditor_api
|
@ -7,7 +7,8 @@ if USE_COVERAGE
|
||||
endif
|
||||
|
||||
lib_LTLIBRARIES = \
|
||||
libtalerauditor.la
|
||||
libtalerauditor.la \
|
||||
libtalerauditortesting.la
|
||||
|
||||
libtalerauditor_la_LDFLAGS = \
|
||||
-version-info 0:0:0 \
|
||||
@ -33,3 +34,51 @@ if HAVE_LIBGNURL
|
||||
libtalerauditor_la_LIBADD += -lgnurl
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
libtalerauditortesting_la_LDFLAGS = \
|
||||
-version-info 0:0:0 \
|
||||
-no-undefined
|
||||
libtalerauditortesting_la_SOURCES = \
|
||||
testing_auditor_api_helpers.c
|
||||
libtalerauditortesting_la_LIBADD = \
|
||||
libtalerauditor.la \
|
||||
$(top_builddir)/src/exchange-lib/libtalerexchange.la \
|
||||
$(top_builddir)/src/exchange-lib/libtalertesting.la \
|
||||
$(top_builddir)/src/wire/libtalerwire.la \
|
||||
$(top_builddir)/src/json/libtalerjson.la \
|
||||
$(top_builddir)/src/util/libtalerutil.la \
|
||||
-lgnunetcurl \
|
||||
-lgnunetjson \
|
||||
-lgnunetutil \
|
||||
-ljansson \
|
||||
$(XLIB)
|
||||
|
||||
|
||||
check_PROGRAMS = \
|
||||
test_auditor_api
|
||||
|
||||
AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH;
|
||||
|
||||
TESTS = \
|
||||
$(check_PROGRAMS)
|
||||
|
||||
test_auditor_api_SOURCES = \
|
||||
test_auditor_api.c
|
||||
test_auditor_api_LDADD = \
|
||||
libtalerauditortesting.la \
|
||||
libtalerauditor.la \
|
||||
$(top_builddir)/src/exchange-lib/libtalertesting.la \
|
||||
$(top_builddir)/src/exchange-lib/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 \
|
||||
-lgnunetutil \
|
||||
-ljansson
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
test_auditor_api.conf
|
||||
|
200
src/auditor-lib/test_auditor_api.c
Normal file
200
src/auditor-lib/test_auditor_api.c
Normal file
@ -0,0 +1,200 @@
|
||||
/*
|
||||
This file is part of TALER
|
||||
Copyright (C) 2014-2018 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 by the Free Software Foundation; either version 3, or
|
||||
(at your option) any later version.
|
||||
|
||||
TALER is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with TALER; see the file COPYING. If not, see
|
||||
<http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file auditor-lib/test_auditor_api.c
|
||||
* @brief testcase to test auditor's HTTP API interface
|
||||
* @author Christian Grothoff
|
||||
* @author Marcello Stanisci
|
||||
*/
|
||||
#include "platform.h"
|
||||
#include "taler_util.h"
|
||||
#include "taler_signatures.h"
|
||||
#include "taler_exchange_service.h"
|
||||
#include "taler_auditor_service.h"
|
||||
#include "taler_json_lib.h"
|
||||
#include <gnunet/gnunet_util_lib.h>
|
||||
#include <microhttpd.h>
|
||||
#include "taler_bank_service.h"
|
||||
#include "taler_fakebank_lib.h"
|
||||
#include "taler_testing_lib.h"
|
||||
#include "taler_testing_auditor_lib.h"
|
||||
|
||||
/**
|
||||
* Configuration file we use. One (big) configuration is used
|
||||
* for the various components for this test.
|
||||
*/
|
||||
#define CONFIG_FILE "test_auditor_api.conf"
|
||||
|
||||
/**
|
||||
* URL of the fakebank. Obtained from CONFIG_FILE's
|
||||
* "exchange-wire-test:BANK_URI" option.
|
||||
*/
|
||||
static char *fakebank_url;
|
||||
|
||||
/**
|
||||
* Auditor base URL as it appears in the configuration. Note
|
||||
* that it might differ from the one where the exchange actually
|
||||
* listens from.
|
||||
*/
|
||||
static char *auditor_url;
|
||||
|
||||
/**
|
||||
* Exchange base URL as it appears in the configuration. Note
|
||||
* that it might differ from the one where the exchange actually
|
||||
* listens from.
|
||||
*/
|
||||
static char *exchange_url;
|
||||
|
||||
/**
|
||||
* Account number of the exchange at the bank.
|
||||
*/
|
||||
#define EXCHANGE_ACCOUNT_NO 2
|
||||
|
||||
/**
|
||||
* Account number of some user.
|
||||
*/
|
||||
#define USER_ACCOUNT_NO 42
|
||||
|
||||
/**
|
||||
* User name. Never checked by fakebank.
|
||||
*/
|
||||
#define USER_LOGIN_NAME "user42"
|
||||
|
||||
/**
|
||||
* User password. Never checked by fakebank.
|
||||
*/
|
||||
#define USER_LOGIN_PASS "pass42"
|
||||
|
||||
/**
|
||||
* Execute the taler-exchange-wirewatch command with
|
||||
* our configuration file.
|
||||
*
|
||||
* @param label label to use for the command.
|
||||
*/
|
||||
#define CMD_EXEC_WIREWATCH(label) \
|
||||
TALER_TESTING_cmd_exec_wirewatch (label, CONFIG_FILE)
|
||||
|
||||
/**
|
||||
* Execute the taler-exchange-aggregator command with
|
||||
* our configuration file.
|
||||
*
|
||||
* @param label label to use for the command.
|
||||
*/
|
||||
#define CMD_EXEC_AGGREGATOR(label) \
|
||||
TALER_TESTING_cmd_exec_aggregator (label, CONFIG_FILE)
|
||||
|
||||
/**
|
||||
* Run wire transfer of funds from some user's account to the
|
||||
* exchange.
|
||||
*
|
||||
* @param label label to use for the command.
|
||||
* @param amount amount to transfer, i.e. "EUR:1"
|
||||
*/
|
||||
#define CMD_TRANSFER_TO_EXCHANGE(label,amount) \
|
||||
TALER_TESTING_cmd_fakebank_transfer (label, amount, \
|
||||
fakebank_url, USER_ACCOUNT_NO, EXCHANGE_ACCOUNT_NO, \
|
||||
USER_LOGIN_NAME, USER_LOGIN_PASS, exchange_url)
|
||||
|
||||
/**
|
||||
* Run wire transfer of funds from some user's account to the
|
||||
* exchange.
|
||||
*
|
||||
* @param label label to use for the command.
|
||||
* @param amount amount to transfer, i.e. "EUR:1"
|
||||
*/
|
||||
#define CMD_TRANSFER_TO_EXCHANGE_SUBJECT(label,amount,subject) \
|
||||
TALER_TESTING_cmd_fakebank_transfer_with_subject \
|
||||
(label, amount, fakebank_url, USER_ACCOUNT_NO, \
|
||||
EXCHANGE_ACCOUNT_NO, USER_LOGIN_NAME, USER_LOGIN_PASS, \
|
||||
subject, exchange_url)
|
||||
|
||||
|
||||
/**
|
||||
* Main function that will tell the interpreter what commands to
|
||||
* run.
|
||||
*
|
||||
* @param cls closure
|
||||
*/
|
||||
static void
|
||||
run (void *cls,
|
||||
struct TALER_TESTING_Interpreter *is)
|
||||
{
|
||||
struct TALER_TESTING_Command commands[] = {
|
||||
/**
|
||||
* End the suite. Fixme: better to have a label for this
|
||||
* too, as it shows a "(null)" token on logs.
|
||||
*/
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
TALER_TESTING_run_with_fakebank (is,
|
||||
commands,
|
||||
fakebank_url);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char * const *argv)
|
||||
{
|
||||
/* These environment variables get in the way... */
|
||||
unsetenv ("XDG_DATA_HOME");
|
||||
unsetenv ("XDG_CONFIG_HOME");
|
||||
GNUNET_log_setup ("test-auditor-api",
|
||||
"INFO",
|
||||
NULL);
|
||||
if (NULL == (fakebank_url
|
||||
/* Check fakebank port is available and config cares
|
||||
* about bank url. */
|
||||
= TALER_TESTING_prepare_fakebank (CONFIG_FILE,
|
||||
"account-2")))
|
||||
return 77;
|
||||
TALER_TESTING_AUDITOR_cleanup_files (CONFIG_FILE);
|
||||
/* @helpers. Run keyup, create tables, ... Note: it
|
||||
* fetches the port number from config in order to see
|
||||
* if it's available. */
|
||||
switch (TALER_TESTING_AUDITOR_prepare_auditor (CONFIG_FILE,
|
||||
&auditor_url,
|
||||
&exchange_url))
|
||||
{
|
||||
case GNUNET_SYSERR:
|
||||
GNUNET_break (0);
|
||||
return 1;
|
||||
case GNUNET_NO:
|
||||
return 77;
|
||||
case GNUNET_OK:
|
||||
if (GNUNET_OK !=
|
||||
/* Set up event loop and reschedule context, plus
|
||||
* start/stop the exchange. It calls TALER_TESTING_setup
|
||||
* which creates the 'is' object.
|
||||
*/
|
||||
TALER_TESTING_AUDITOR_setup_with_auditor (&run,
|
||||
NULL,
|
||||
CONFIG_FILE))
|
||||
return 1;
|
||||
break;
|
||||
default:
|
||||
GNUNET_break (0);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* end of test_auditor_api.c */
|
0
src/auditor-lib/test_auditor_api.conf
Normal file
0
src/auditor-lib/test_auditor_api.conf
Normal file
448
src/auditor-lib/testing_auditor_api_helpers.c
Normal file
448
src/auditor-lib/testing_auditor_api_helpers.c
Normal file
@ -0,0 +1,448 @@
|
||||
/*
|
||||
This file is part of TALER
|
||||
Copyright (C) 2018 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 by the Free Software Foundation; either version 3, or
|
||||
(at your option) any later version.
|
||||
|
||||
TALER is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with TALER; see the file COPYING. If not, see
|
||||
<http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file auditor-lib/testing_auditor_api_helpers.c
|
||||
* @brief helper functions
|
||||
* @author Christian Grothoff
|
||||
* @author Marcello Stanisci
|
||||
*/
|
||||
#include "platform.h"
|
||||
#include "taler_json_lib.h"
|
||||
#include <gnunet/gnunet_curl_lib.h>
|
||||
#include "taler_signatures.h"
|
||||
#include "taler_testing_lib.h"
|
||||
|
||||
|
||||
/**
|
||||
* Remove files from previous runs
|
||||
*
|
||||
* @param config_name configuration filename.
|
||||
*/
|
||||
void
|
||||
TALER_TESTING_AUDITOR_cleanup_files (const char *config_name)
|
||||
{
|
||||
struct GNUNET_CONFIGURATION_Handle *cfg;
|
||||
char *dir;
|
||||
|
||||
TALER_TESTING_cleanup_files (config_name);
|
||||
// TODO: auditor-specific clean-up here!
|
||||
cfg = GNUNET_CONFIGURATION_create ();
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_load (cfg,
|
||||
config_name))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
exit (77);
|
||||
}
|
||||
#if FIXME
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
GNUNET_CONFIGURATION_get_value_filename
|
||||
(cfg,
|
||||
"exchange",
|
||||
"keydir",
|
||||
&dir));
|
||||
if (GNUNET_YES ==
|
||||
GNUNET_DISK_directory_test (dir,
|
||||
GNUNET_NO))
|
||||
GNUNET_break (GNUNET_OK ==
|
||||
GNUNET_DISK_directory_remove (dir));
|
||||
GNUNET_free (dir);
|
||||
#endif
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare launching an auditor and exchange. Checks that the configured
|
||||
* port is available, runs taler-exchange-keyup, taler-auditor-exchange,
|
||||
* taler-auditor-sign and taler-exchange-dbinit. Does NOT
|
||||
* launch the exchange process itself.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param auditor_base_url[out] will be set to the auditor base url,
|
||||
* if the config has any; otherwise it will be set to
|
||||
* NULL.
|
||||
* @param exchange_base_url[out] will be set to the exchange base url,
|
||||
* if the config has any; otherwise it will be set to
|
||||
* NULL.
|
||||
* @return #GNUNET_OK on success, #GNUNET_NO if test should be
|
||||
* skipped, #GNUNET_SYSERR on test failure
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_prepare_auditor (const char *config_filename,
|
||||
char **auditor_base_url,
|
||||
char **exchange_base_url)
|
||||
{
|
||||
struct GNUNET_OS_Process *proc;
|
||||
enum GNUNET_OS_ProcessStatusType type;
|
||||
unsigned long code;
|
||||
struct GNUNET_CONFIGURATION_Handle *cfg;
|
||||
char *test_home_dir;
|
||||
char *signed_keys_out;
|
||||
char *exchange_master_pub;
|
||||
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
"taler-exchange-keyup",
|
||||
"taler-exchange-keyup",
|
||||
"-c", config_filename,
|
||||
"-o", "auditor.in",
|
||||
NULL);
|
||||
if (NULL == proc)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-exchange-keyup`,"
|
||||
" is your PATH correct?\n");
|
||||
return GNUNET_NO;
|
||||
}
|
||||
GNUNET_OS_process_wait (proc);
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
|
||||
cfg = GNUNET_CONFIGURATION_create ();
|
||||
if (GNUNET_OK != GNUNET_CONFIGURATION_load
|
||||
(cfg, config_filename))
|
||||
return GNUNET_SYSERR;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
"exchange",
|
||||
"BASE_URL",
|
||||
exchange_base_url))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
|
||||
"exchange",
|
||||
"BASE_URL");
|
||||
*exchange_base_url = NULL;
|
||||
}
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_filename (cfg,
|
||||
"paths",
|
||||
"TALER_TEST_HOME",
|
||||
&test_home_dir))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"paths",
|
||||
"TALER_TEST_HOME");
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
GNUNET_asprintf (&signed_keys_out,
|
||||
"%s/.local/share/taler/auditors/auditor.out",
|
||||
test_home_dir);
|
||||
GNUNET_free (test_home_dir);
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
"exchange",
|
||||
"MASTER_PUBLIC_KEY",
|
||||
&exchange_master_pub))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchange",
|
||||
"MASTER_PUBLIC_KEY");
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
"taler-auditor-sign",
|
||||
"taler-auditor-sign",
|
||||
"-c", config_filename,
|
||||
"-u", "http://auditor/",
|
||||
"-m", exchange_master_pub,
|
||||
"-r", "auditor.in",
|
||||
"-o", signed_keys_out,
|
||||
NULL);
|
||||
if (NULL == proc)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-auditor-sign`,"
|
||||
" is your PATH correct?\n");
|
||||
GNUNET_free (signed_keys_out);
|
||||
GNUNET_free (exchange_master_pub);
|
||||
return GNUNET_NO;
|
||||
}
|
||||
|
||||
|
||||
GNUNET_free (exchange_master_pub);
|
||||
GNUNET_free (signed_keys_out);
|
||||
GNUNET_OS_process_wait (proc);
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
|
||||
/* Reset exchange database. */
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
"taler-exchange-dbinit",
|
||||
"taler-exchange-dbinit",
|
||||
"-c", config_filename,
|
||||
"-r",
|
||||
NULL);
|
||||
if (NULL == proc)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-exchange-dbinit`,"
|
||||
" is your PATH correct?\n");
|
||||
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if (GNUNET_SYSERR ==
|
||||
GNUNET_OS_process_wait_status (proc,
|
||||
&type,
|
||||
&code))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
if ( (type == GNUNET_OS_PROCESS_EXITED) &&
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Failed to setup (exchange) database\n");
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if ( (type != GNUNET_OS_PROCESS_EXITED) ||
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Unexpected error running"
|
||||
" `taler-exchange-dbinit'!\n");
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
|
||||
/* Reset auditor database. */
|
||||
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
"taler-auditor-dbinit",
|
||||
"taler-auditor-dbinit",
|
||||
"-c", config_filename,
|
||||
"-r",
|
||||
NULL);
|
||||
if (NULL == proc)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-auditor-dbinit`,"
|
||||
" is your PATH correct?\n");
|
||||
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if (GNUNET_SYSERR ==
|
||||
GNUNET_OS_process_wait_status (proc,
|
||||
&type,
|
||||
&code))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
if ( (type == GNUNET_OS_PROCESS_EXITED) &&
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Failed to setup (auditor) database\n");
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if ( (type != GNUNET_OS_PROCESS_EXITED) ||
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Unexpected error running"
|
||||
" `taler-auditor-dbinit'!\n");
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Wait for the exchange to have started. Waits for at
|
||||
* most 10s, after that returns 77 to indicate an error.
|
||||
*
|
||||
* @param base_url what URL should we expect the exchange
|
||||
* to be running at
|
||||
* @return 0 on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_wait_auditor_ready (const char *base_url)
|
||||
{
|
||||
char *wget_cmd;
|
||||
unsigned int iter;
|
||||
|
||||
GNUNET_asprintf (&wget_cmd,
|
||||
"wget -q -t 1 -T 1 %sversion"
|
||||
" -o /dev/null -O /dev/null",
|
||||
base_url); // make sure ends with '/'
|
||||
/* give child time to start and bind against the socket */
|
||||
fprintf (stderr,
|
||||
"Waiting for `taler-auditor-httpd' to be ready\n");
|
||||
iter = 0;
|
||||
do
|
||||
{
|
||||
if (10 == iter)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Failed to launch `taler-auditor-httpd' (or `wget')\n");
|
||||
GNUNET_free (wget_cmd);
|
||||
return 77;
|
||||
}
|
||||
fprintf (stderr, ".\n");
|
||||
sleep (1);
|
||||
iter++;
|
||||
}
|
||||
while (0 != system (wget_cmd));
|
||||
GNUNET_free (wget_cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize scheduler loop and curl context for the testcase
|
||||
* including starting and stopping the auditor and exchange using the
|
||||
* given configuration file.
|
||||
*
|
||||
* @param main_cb routine containing all the commands to run.
|
||||
* @param main_cb_cls closure for @a main_cb, typically NULL.
|
||||
* @param config_file configuration file for the test-suite.
|
||||
*
|
||||
* @return #GNUNET_OK if all is okay, != #GNUNET_OK otherwise.
|
||||
* non-#GNUNET_OK codes are #GNUNET_SYSERR most of the
|
||||
* time.
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_setup_with_auditor (TALER_TESTING_Main main_cb,
|
||||
void *main_cb_cls,
|
||||
const char *config_filename)
|
||||
{
|
||||
int result;
|
||||
struct GNUNET_OS_Process *exchanged;
|
||||
struct GNUNET_OS_Process *auditord;
|
||||
struct GNUNET_CONFIGURATION_Handle *cfg;
|
||||
unsigned long long port;
|
||||
char *serve;
|
||||
char *base_url;
|
||||
|
||||
cfg = GNUNET_CONFIGURATION_create ();
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_load (cfg,
|
||||
config_filename))
|
||||
return GNUNET_NO;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
"exchange",
|
||||
"SERVE",
|
||||
&serve))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchange",
|
||||
"SERVE");
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
return GNUNET_NO;
|
||||
}
|
||||
|
||||
if (0 == strcmp ("tcp", serve))
|
||||
{
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_number (cfg,
|
||||
"exchange",
|
||||
"PORT",
|
||||
&port))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchange",
|
||||
"PORT");
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
GNUNET_free (serve);
|
||||
return GNUNET_NO;
|
||||
}
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_NETWORK_test_port_free (IPPROTO_TCP,
|
||||
(uint16_t) port))
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Required port %llu not available, skipping.\n",
|
||||
port);
|
||||
GNUNET_free (serve);
|
||||
return GNUNET_NO;
|
||||
}
|
||||
}
|
||||
GNUNET_free (serve);
|
||||
exchanged = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
"taler-exchange-httpd",
|
||||
"taler-exchange-httpd",
|
||||
"-c", config_filename,
|
||||
"-i",
|
||||
NULL);
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
"exchange",
|
||||
"BASE_URL",
|
||||
&base_url))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchange",
|
||||
"BASE_URL");
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
return GNUNET_NO;
|
||||
}
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
|
||||
if (0 != TALER_TESTING_wait_exchange_ready (base_url))
|
||||
{
|
||||
GNUNET_free (base_url);
|
||||
return 77;
|
||||
}
|
||||
GNUNET_free (base_url);
|
||||
|
||||
/* NOTE: this blocks. */
|
||||
result = TALER_TESTING_setup (main_cb,
|
||||
main_cb_cls,
|
||||
config_filename,
|
||||
exchanged,
|
||||
GNUNET_YES);
|
||||
GNUNET_break (0 ==
|
||||
GNUNET_OS_process_kill (exchanged,
|
||||
SIGTERM));
|
||||
GNUNET_break (GNUNET_OK ==
|
||||
GNUNET_OS_process_wait (exchanged));
|
||||
GNUNET_OS_process_destroy (exchanged);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* end of testing_auditor_api_helpers.c */
|
98
src/include/taler_testing_auditor_lib.h
Normal file
98
src/include/taler_testing_auditor_lib.h
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
This file is part of TALER
|
||||
(C) 2018 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 by the Free Software Foundation; either version 3, or
|
||||
(at your option) any later version.
|
||||
|
||||
TALER is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with TALER; see the file COPYING. If not, see
|
||||
<http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file include/taler_testing_auditor_lib.h
|
||||
* @brief API for writing an interpreter to test Taler components
|
||||
* @author Christian Grothoff <christian@grothoff.org>
|
||||
* @author Marcello Stanisci
|
||||
*/
|
||||
#ifndef TALER_TESTING_AUDITOR_LIB_H
|
||||
#define TALER_TESTING_AUDITOR_LIB_H
|
||||
|
||||
#include "taler_util.h"
|
||||
#include "taler_exchange_service.h"
|
||||
#include <gnunet/gnunet_json_lib.h>
|
||||
#include "taler_json_lib.h"
|
||||
#include <microhttpd.h>
|
||||
|
||||
|
||||
/* ********************* Helper functions ********************* */
|
||||
|
||||
/**
|
||||
* Prepare launching an auditor and exchange. Checks that the configured
|
||||
* port is available, runs taler-exchange-keyup, taler-auditor-exchange,
|
||||
* taler-auditor-sign and taler-exchange-dbinit. Does not
|
||||
* launch the exchange process itself.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param auditor_base_url[out] will be set to the auditor base url,
|
||||
* if the config has any; otherwise it will be set to
|
||||
* NULL.
|
||||
* @param exchange_base_url[out] will be set to the exchange base url,
|
||||
* if the config has any; otherwise it will be set to
|
||||
* NULL.
|
||||
* @return #GNUNET_OK on success, #GNUNET_NO if test should be
|
||||
* skipped, #GNUNET_SYSERR on test failure
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_prepare_auditor (const char *config_filename,
|
||||
char **auditor_base_url,
|
||||
char **exchange_base_url);
|
||||
|
||||
|
||||
/**
|
||||
* Wait for the auditor to have started. Waits for at
|
||||
* most 10s, after that returns 77 to indicate an error.
|
||||
*
|
||||
* @param base_url what URL should we expect the exchange
|
||||
* to be running at
|
||||
* @return 0 on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_wait_auditor_ready (const char *base_url);
|
||||
|
||||
|
||||
/**
|
||||
* Remove files from previous runs
|
||||
*/
|
||||
void
|
||||
TALER_TESTING_AUDITOR_cleanup_files (const char *config_name);
|
||||
|
||||
|
||||
/**
|
||||
* Initialize scheduler loop and curl context for the testcase
|
||||
* including starting and stopping the auditor and exchange using the
|
||||
* given configuration file.
|
||||
*
|
||||
* @param main_cb routine containing all the commands to run.
|
||||
* @param main_cb_cls closure for @a main_cb, typically NULL.
|
||||
* @param config_file configuration file for the test-suite.
|
||||
*
|
||||
* @return #GNUNET_OK if all is okay, != #GNUNET_OK otherwise.
|
||||
* non-#GNUNET_OK codes are #GNUNET_SYSERR most of the
|
||||
* time.
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_setup_with_auditor (TALER_TESTING_Main main_cb,
|
||||
void *main_cb_cls,
|
||||
const char *config_filename);
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user