preparing test logic for new auditor requirements (incomplete)
This commit is contained in:
parent
48ad5d2b5c
commit
277f90bf2b
@ -170,7 +170,7 @@ main (int argc,
|
||||
/* @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,
|
||||
switch (TALER_TESTING_prepare_exchange (CONFIG_FILE,
|
||||
&auditor_url,
|
||||
&exchange_url))
|
||||
{
|
||||
|
@ -33,25 +33,19 @@
|
||||
/**
|
||||
* Remove files from previous runs
|
||||
*
|
||||
* @param config_name configuration filename.
|
||||
* @param cls NULL
|
||||
* @param cfg configuration
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
void
|
||||
TALER_TESTING_AUDITOR_cleanup_files (const char *config_name)
|
||||
static int
|
||||
cleanup_files_cfg (void *cls,
|
||||
const struct GNUNET_CONFIGURATION_Handle *cfg)
|
||||
{
|
||||
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);
|
||||
}
|
||||
TALER_TESTING_cleanup_files_cfg (NULL,
|
||||
cfg))
|
||||
return GNUNET_SYSERR;
|
||||
// TODO: auditor-specific clean-up here!
|
||||
#if FIXME
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
GNUNET_CONFIGURATION_get_value_filename
|
||||
@ -66,263 +60,24 @@ TALER_TESTING_AUDITOR_cleanup_files (const char *config_name)
|
||||
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.
|
||||
* Remove files from previous runs
|
||||
*
|
||||
* @param base_url what URL should we expect the exchange
|
||||
* to be running at
|
||||
* @return 0 on success
|
||||
* @param config_name configuration filename.
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_AUDITOR_wait_auditor_ready (const char *base_url)
|
||||
void
|
||||
TALER_TESTING_AUDITOR_cleanup_files (const char *config_name)
|
||||
{
|
||||
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;
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_parse_and_run (config_name,
|
||||
&cleanup_files_cfg,
|
||||
NULL))
|
||||
exit (77);
|
||||
}
|
||||
|
||||
|
||||
@ -407,6 +162,13 @@ TALER_TESTING_AUDITOR_setup_with_auditor (TALER_TESTING_Main main_cb,
|
||||
"-c", config_filename,
|
||||
"-i",
|
||||
NULL);
|
||||
auditord = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
"taler-auditor-httpd",
|
||||
"taler-auditor-httpd",
|
||||
"-c", config_filename,
|
||||
NULL);
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
@ -438,9 +200,15 @@ TALER_TESTING_AUDITOR_setup_with_auditor (TALER_TESTING_Main main_cb,
|
||||
GNUNET_break (0 ==
|
||||
GNUNET_OS_process_kill (exchanged,
|
||||
SIGTERM));
|
||||
GNUNET_break (0 ==
|
||||
GNUNET_OS_process_kill (auditord,
|
||||
SIGTERM));
|
||||
GNUNET_break (GNUNET_OK ==
|
||||
GNUNET_OS_process_wait (exchanged));
|
||||
GNUNET_break (GNUNET_OK ==
|
||||
GNUNET_OS_process_wait (auditord));
|
||||
GNUNET_OS_process_destroy (exchanged);
|
||||
GNUNET_OS_process_destroy (auditord);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -809,6 +809,7 @@ main (int argc,
|
||||
char *const *argv)
|
||||
{
|
||||
char *exchange_url;
|
||||
char *auditor_url;
|
||||
struct GNUNET_CONFIGURATION_Handle *cfg;
|
||||
struct GNUNET_GETOPT_CommandLineOption options[] = {
|
||||
GNUNET_GETOPT_option_mandatory
|
||||
@ -951,7 +952,8 @@ main (int argc,
|
||||
GNUNET_assert
|
||||
(GNUNET_OK == TALER_TESTING_prepare_exchange
|
||||
(cfg_filename,
|
||||
&exchange_url));
|
||||
&exchange_url,
|
||||
&auditor_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1002,6 +1004,7 @@ main (int argc,
|
||||
cfg_filename,
|
||||
exchange_url);
|
||||
GNUNET_free (exchange_url);
|
||||
GNUNET_free (auditor_url);
|
||||
duration = GNUNET_TIME_absolute_get_duration (start_time);
|
||||
if (GNUNET_OK == result)
|
||||
{
|
||||
|
@ -9,6 +9,13 @@ TALER_TEST_HOME = test_exchange_api_home/
|
||||
# Currency supported by the exchange (can only be one)
|
||||
CURRENCY = EUR
|
||||
|
||||
[auditor]
|
||||
BASE_URL = "http://localhost:8083/"
|
||||
|
||||
# HTTP port the auditor listens to
|
||||
PORT = 8083
|
||||
|
||||
|
||||
[exchange]
|
||||
|
||||
# how long is one signkey valid?
|
||||
|
@ -8,6 +8,12 @@ TALER_TEST_HOME = test_exchange_api_home/
|
||||
# Currency supported by the exchange (can only be one)
|
||||
CURRENCY = EUR
|
||||
|
||||
[auditor]
|
||||
BASE_URL = "http://localhost:8083/"
|
||||
|
||||
# HTTP port the auditor listens to
|
||||
PORT = 8083
|
||||
|
||||
[exchange]
|
||||
|
||||
# how long is one signkey valid?
|
||||
|
@ -52,6 +52,12 @@
|
||||
*/
|
||||
static char *exchange_url;
|
||||
|
||||
/**
|
||||
* Auditor base URL; mainly purpose is to make the compiler happy.
|
||||
*/
|
||||
static char *auditor_url;
|
||||
|
||||
|
||||
/**
|
||||
* Main function that will tell the interpreter what commands to
|
||||
* run.
|
||||
@ -124,6 +130,7 @@ main (int argc,
|
||||
* fetches the port number from config in order to see
|
||||
* if it's available. */
|
||||
switch (TALER_TESTING_prepare_exchange (CONFIG_FILE,
|
||||
&auditor_url,
|
||||
&exchange_url))
|
||||
{
|
||||
case GNUNET_SYSERR:
|
||||
|
@ -65,6 +65,13 @@ static char *fakebank_url;
|
||||
*/
|
||||
static char *exchange_url;
|
||||
|
||||
/**
|
||||
* Auditor base URL as it appears in the configuration. Note
|
||||
* that it might differ from the one where the auditor actually
|
||||
* listens from.
|
||||
*/
|
||||
static char *auditor_url;
|
||||
|
||||
/**
|
||||
* Account number of the exchange at the bank.
|
||||
*/
|
||||
@ -941,6 +948,7 @@ main (int argc,
|
||||
* fetches the port number from config in order to see
|
||||
* if it's available. */
|
||||
switch (TALER_TESTING_prepare_exchange (CONFIG_FILE,
|
||||
&auditor_url,
|
||||
&exchange_url))
|
||||
{
|
||||
case GNUNET_SYSERR:
|
||||
|
@ -39,58 +39,60 @@
|
||||
void
|
||||
TALER_TESTING_cleanup_files (const char *config_name)
|
||||
{
|
||||
struct GNUNET_CONFIGURATION_Handle *cfg;
|
||||
char *dir;
|
||||
|
||||
cfg = GNUNET_CONFIGURATION_create ();
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_load (cfg,
|
||||
config_name))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
GNUNET_CONFIGURATION_parse_and_run (config_name,
|
||||
&TALER_TESTING_cleanup_files_cfg,
|
||||
NULL))
|
||||
exit (77);
|
||||
}
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
GNUNET_CONFIGURATION_get_value_filename
|
||||
(cfg,
|
||||
|
||||
|
||||
/**
|
||||
* Remove files from previous runs
|
||||
*
|
||||
* @param cls NULL
|
||||
* @param cfg configuration
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_cleanup_files_cfg (void *cls,
|
||||
const struct GNUNET_CONFIGURATION_Handle *cfg)
|
||||
{
|
||||
char *dir;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_filename (cfg,
|
||||
"exchange",
|
||||
"keydir",
|
||||
&dir));
|
||||
&dir))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchange",
|
||||
"keydir");
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
if (GNUNET_YES ==
|
||||
GNUNET_DISK_directory_test (dir,
|
||||
GNUNET_NO))
|
||||
GNUNET_break (GNUNET_OK ==
|
||||
GNUNET_DISK_directory_remove (dir));
|
||||
GNUNET_free (dir);
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare launching an exchange. Checks that the configured
|
||||
* port is available, runs taler-exchange-keyup,
|
||||
* taler-auditor-sign and taler-exchange-dbinit. Does NOT
|
||||
* launch the exchange process itself.
|
||||
* Run `taler-exchange-keyup`.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param 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
|
||||
* @param output_filename where to write the output for the auditor
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
char **base_url)
|
||||
TALER_TESTING_run_keyup (const char *config_filename,
|
||||
const char *output_filename)
|
||||
{
|
||||
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,
|
||||
@ -98,66 +100,39 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
"taler-exchange-keyup",
|
||||
"taler-exchange-keyup",
|
||||
"-c", config_filename,
|
||||
"-o", "auditor.in",
|
||||
"-o", output_filename,
|
||||
NULL);
|
||||
if (NULL == proc)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-exchange-keyup`,"
|
||||
" is your PATH correct?\n");
|
||||
return GNUNET_NO;
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
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",
|
||||
base_url))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
|
||||
"exchange",
|
||||
"BASE_URL");
|
||||
*base_url = NULL;
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
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))
|
||||
/**
|
||||
* Run `taler-auditor-sign`.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param exchange_master_pub master public key of the exchange
|
||||
* @param auditor_base_url what is the base URL of the auditor
|
||||
* @param signdata_in where is the information from taler-exchange-keyup
|
||||
* @param signdata_out where to write the output for the exchange
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_run_auditor_sign (const char *config_filename,
|
||||
const char *exchange_master_pub,
|
||||
const char *auditor_base_url,
|
||||
const char *signdata_in,
|
||||
const char *signdata_out)
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchange",
|
||||
"MASTER_PUBLIC_KEY");
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
struct GNUNET_OS_Process *proc;
|
||||
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
@ -165,28 +140,37 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
"taler-auditor-sign",
|
||||
"taler-auditor-sign",
|
||||
"-c", config_filename,
|
||||
"-u", "http://auditor/",
|
||||
"-u", auditor_base_url,
|
||||
"-m", exchange_master_pub,
|
||||
"-r", "auditor.in",
|
||||
"-o", signed_keys_out,
|
||||
"-r", signdata_in,
|
||||
"-o", signdata_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;
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
GNUNET_OS_process_wait (proc);
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
GNUNET_free (exchange_master_pub);
|
||||
GNUNET_free (signed_keys_out);
|
||||
GNUNET_OS_process_wait (proc);
|
||||
GNUNET_OS_process_destroy (proc);
|
||||
/**
|
||||
* Run `taler-exchange-dbinit -r` (reset exchange database).
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_exchange_db_reset (const char *config_filename)
|
||||
{
|
||||
struct GNUNET_OS_Process *proc;
|
||||
enum GNUNET_OS_ProcessStatusType type;
|
||||
unsigned long code;
|
||||
|
||||
/* Reset exchange database. */
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
NULL, NULL, NULL,
|
||||
@ -200,7 +184,6 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-exchange-dbinit`,"
|
||||
" is your PATH correct?\n");
|
||||
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if (GNUNET_SYSERR ==
|
||||
@ -216,21 +199,34 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
if ( (type == GNUNET_OS_PROCESS_EXITED) &&
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to setup (exchange) database\n");
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if ( (type != GNUNET_OS_PROCESS_EXITED) ||
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Unexpected error running"
|
||||
" `taler-exchange-dbinit'!\n");
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/* Reset auditor database. */
|
||||
/**
|
||||
* Run `taler-auditor-dbinit -r` (reset auditor database).
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_auditor_db_reset (const char *config_filename)
|
||||
{
|
||||
struct GNUNET_OS_Process *proc;
|
||||
enum GNUNET_OS_ProcessStatusType type;
|
||||
unsigned long code;
|
||||
|
||||
proc = GNUNET_OS_start_process (GNUNET_NO,
|
||||
GNUNET_OS_INHERIT_STD_ALL,
|
||||
@ -245,7 +241,6 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to run `taler-auditor-dbinit`,"
|
||||
" is your PATH correct?\n");
|
||||
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if (GNUNET_SYSERR ==
|
||||
@ -261,19 +256,202 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
if ( (type == GNUNET_OS_PROCESS_EXITED) &&
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Failed to setup (auditor) database\n");
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if ( (type != GNUNET_OS_PROCESS_EXITED) ||
|
||||
(0 != code) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Unexpected error running"
|
||||
" `taler-auditor-dbinit'!\n");
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Type of closure for
|
||||
* #sign_keys_for_exchange.
|
||||
*/
|
||||
struct SignInfo
|
||||
{
|
||||
/**
|
||||
* Set to the base URL of the exchange. To be free'd
|
||||
* by the caller.
|
||||
*/
|
||||
char *exchange_base_url;
|
||||
|
||||
/**
|
||||
* Set to the auditor's base URL. To be free'd by the caller.
|
||||
*/
|
||||
char *auditor_base_url;
|
||||
|
||||
/**
|
||||
* Name of the configuration file to use.
|
||||
*/
|
||||
const char *config_filename;
|
||||
|
||||
/**
|
||||
* Must be set to input file with the data to be signed before
|
||||
* calling #TALER_TESTING_sign_keys_for_exchange.
|
||||
*/
|
||||
const char *auditor_sign_input_filename;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Sign the keys for an exchange given configuration @a cfg.
|
||||
* The information to be signed must be in a file "auditor.in".
|
||||
*
|
||||
* @param cls[in,out] a `struct SignInfo` with
|
||||
* further paramters
|
||||
* @param cfg configuration to use
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
static int
|
||||
sign_keys_for_exchange (void *cls,
|
||||
const struct GNUNET_CONFIGURATION_Handle *cfg)
|
||||
{
|
||||
struct SignInfo *si = cls;
|
||||
char *test_home_dir;
|
||||
char *signed_keys_out;
|
||||
char *exchange_master_pub;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
"exchange",
|
||||
"BASE_URL",
|
||||
&si->exchange_base_url))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
|
||||
"exchange",
|
||||
"BASE_URL");
|
||||
si->exchange_base_url = NULL;
|
||||
return GNUNET_NO;
|
||||
}
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_string (cfg,
|
||||
"auditor",
|
||||
"BASE_URL",
|
||||
&si->auditor_base_url))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
|
||||
"auditor",
|
||||
"BASE_URL");
|
||||
GNUNET_free (si->exchange_base_url);
|
||||
si->exchange_base_url = NULL;
|
||||
si->auditor_base_url = NULL;
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
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_free (si->exchange_base_url);
|
||||
GNUNET_free (si->auditor_base_url);
|
||||
si->exchange_base_url = NULL;
|
||||
si->auditor_base_url = NULL;
|
||||
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_free (si->exchange_base_url);
|
||||
GNUNET_free (si->auditor_base_url);
|
||||
si->exchange_base_url = NULL;
|
||||
si->auditor_base_url = NULL;
|
||||
GNUNET_free (signed_keys_out);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
// FIXME: add exchange to auditor with taler-auditor-exchange!
|
||||
|
||||
|
||||
if (GNUNET_OK !=
|
||||
TALER_TESTING_run_auditor_sign (si->config_filename,
|
||||
exchange_master_pub,
|
||||
si->auditor_base_url,
|
||||
si->auditor_sign_input_filename,
|
||||
signed_keys_out))
|
||||
{
|
||||
GNUNET_free (si->exchange_base_url);
|
||||
GNUNET_free (si->auditor_base_url);
|
||||
si->exchange_base_url = NULL;
|
||||
si->auditor_base_url = NULL;
|
||||
return GNUNET_NO;
|
||||
}
|
||||
GNUNET_free (signed_keys_out);
|
||||
GNUNET_free (exchange_master_pub);
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare launching an exchange. Checks that the configured
|
||||
* port is available, runs taler-exchange-keyup,
|
||||
* 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_prepare_exchange (const char *config_filename,
|
||||
char **auditor_base_url,
|
||||
char **exchange_base_url)
|
||||
{
|
||||
struct SignInfo si = {
|
||||
.config_filename = config_filename,
|
||||
.exchange_base_url = NULL,
|
||||
.auditor_base_url = NULL,
|
||||
.auditor_sign_input_filename = "auditor.in"
|
||||
};
|
||||
|
||||
if (GNUNET_OK !=
|
||||
TALER_TESTING_run_keyup (config_filename,
|
||||
si.auditor_sign_input_filename))
|
||||
return GNUNET_NO;
|
||||
if (GNUNET_OK !=
|
||||
TALER_TESTING_exchange_db_reset (config_filename))
|
||||
return GNUNET_NO;
|
||||
if (GNUNET_OK !=
|
||||
TALER_TESTING_auditor_db_reset (config_filename))
|
||||
return GNUNET_NO;
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_parse_and_run (config_filename,
|
||||
&sign_keys_for_exchange,
|
||||
&si))
|
||||
return GNUNET_NO;
|
||||
*exchange_base_url = si.exchange_base_url;
|
||||
*auditor_base_url = si.auditor_base_url;
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
@ -378,6 +556,47 @@ TALER_TESTING_wait_exchange_ready (const char *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 auditor
|
||||
* to be running at
|
||||
* @return 0 on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_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 exchange using the given
|
||||
@ -387,9 +606,9 @@ TALER_TESTING_wait_exchange_ready (const char *base_url)
|
||||
* @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
|
||||
* times.
|
||||
* @return #GNUNET_OK if all is okay, != #GNUNET_OK otherwise.
|
||||
* non-#GNUNET_OK codes are #GNUNET_SYSERR most of the
|
||||
* time.
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_setup_with_exchange (TALER_TESTING_Main main_cb,
|
||||
|
@ -35,27 +35,6 @@
|
||||
|
||||
/* ********************* 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
|
||||
|
@ -102,7 +102,10 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,
|
||||
* launch the exchange process itself.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param base_url[out] will be set to the exchange base url,
|
||||
* @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
|
||||
@ -110,7 +113,8 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_prepare_exchange (const char *config_filename,
|
||||
char **base_url);
|
||||
char **auditor_base_url,
|
||||
char **exchange_base_url);
|
||||
|
||||
|
||||
/**
|
||||
@ -125,13 +129,89 @@ int
|
||||
TALER_TESTING_wait_exchange_ready (const char *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 auditor
|
||||
* to be running at
|
||||
* @return 0 on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_wait_auditor_ready (const char *base_url);
|
||||
|
||||
|
||||
/**
|
||||
* Remove files from previous runs
|
||||
*
|
||||
* @param config_name configuration file to use+
|
||||
*/
|
||||
void
|
||||
TALER_TESTING_cleanup_files (const char *config_name);
|
||||
|
||||
|
||||
/**
|
||||
* Remove files from previous runs
|
||||
*
|
||||
* @param cls NULL
|
||||
* @param cfg configuration
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_cleanup_files_cfg (void *cls,
|
||||
const struct GNUNET_CONFIGURATION_Handle *cfg);
|
||||
|
||||
|
||||
/**
|
||||
* Run `taler-exchange-keyup`.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param output_filename where to write the output for the auditor
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_run_keyup (const char *config_filename,
|
||||
const char *output_filename);
|
||||
|
||||
|
||||
/**
|
||||
* Run `taler-auditor-dbinit -r` (reset auditor database).
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_auditor_db_reset (const char *config_filename);
|
||||
|
||||
|
||||
/**
|
||||
* Run `taler-exchange-dbinit -r` (reset exchange database).
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_exchange_db_reset (const char *config_filename);
|
||||
|
||||
|
||||
/**
|
||||
* Run `taler-auditor-sign`.
|
||||
*
|
||||
* @param config_filename configuration file to use
|
||||
* @param exchange_master_pub master public key of the exchange
|
||||
* @param auditor_base_url what is the base URL of the auditor
|
||||
* @param signdata_in where is the information from taler-exchange-keyup
|
||||
* @param signdata_out where to write the output for the exchange
|
||||
* @return #GNUNET_OK on success
|
||||
*/
|
||||
int
|
||||
TALER_TESTING_run_auditor_sign (const char *config_filename,
|
||||
const char *exchange_master_pub,
|
||||
const char *auditor_base_url,
|
||||
const char *signdata_in,
|
||||
const char *signdata_out);
|
||||
|
||||
|
||||
/**
|
||||
* Test port in URL string for availability.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user