exchange/src/mint-lib/test_mint_api.c

224 lines
6.1 KiB
C
Raw Normal View History

2015-01-08 18:37:20 +01:00
/*
This file is part of TALER
Copyright (C) 2014, 2015 Christian Grothoff (and other contributing authors)
2015-01-08 18:37:20 +01:00
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, If not, see <http://www.gnu.org/licenses/>
*/
/**
* @file mint/test_mint_api.c
* @brief testcase to test mint's HTTP API interface
* @author Sree Harsha Totakura <sreeharsha@totakura.in>
* @author Christian Grothoff
2015-01-08 18:37:20 +01:00
*/
#include "platform.h"
#include "taler_util.h"
#include "taler_mint_service.h"
/**
* Main execution context for the main loop.
*/
2015-06-18 01:17:01 +02:00
static struct TALER_MINT_Context *ctx;
2015-01-08 18:37:20 +01:00
/**
* Handle to access the mint.
*/
2015-06-18 01:17:01 +02:00
static struct TALER_MINT_Handle *mint;
2015-01-08 18:37:20 +01:00
/**
* Task run on shutdown.
*/
static struct GNUNET_SCHEDULER_Task *shutdown_task;
2015-01-08 18:37:20 +01:00
/**
* Task that runs the main event loop.
*/
2015-06-18 01:17:01 +02:00
static struct GNUNET_SCHEDULER_Task *ctx_task;
/**
* Result of the testcases, #GNUNET_OK on success
*/
2015-01-08 18:37:20 +01:00
static int result;
/**
* Function run when the test terminates (good or bad).
* Cleans up our state.
*
* @param cls NULL
* @param tc unused
*/
2015-01-08 18:37:20 +01:00
static void
2015-06-18 01:17:01 +02:00
do_shutdown (void *cls,
const struct GNUNET_SCHEDULER_TaskContext *tc)
2015-01-08 18:37:20 +01:00
{
shutdown_task = NULL;
2015-06-18 01:17:01 +02:00
if (NULL != ctx_task)
2015-01-08 18:37:20 +01:00
{
2015-06-18 01:17:01 +02:00
GNUNET_SCHEDULER_cancel (ctx_task);
ctx_task = NULL;
}
if (NULL != mint)
{
TALER_MINT_disconnect (mint);
mint = NULL;
}
if (NULL != ctx)
{
TALER_MINT_fini (ctx);
ctx = NULL;
2015-01-08 18:37:20 +01:00
}
}
2015-06-18 01:17:01 +02:00
2015-01-08 18:37:20 +01:00
/**
2015-06-18 01:17:01 +02:00
* Functions of this type are called to provide the retrieved signing and
* denomination keys of the mint. No TALER_MINT_*() functions should be called
* in this callback.
2015-01-08 18:37:20 +01:00
*
* @param cls closure
2015-06-18 01:17:01 +02:00
* @param keys information about keys of the mint
2015-01-08 18:37:20 +01:00
*/
static void
2015-06-18 01:17:01 +02:00
cert_cb (void *cls,
const struct TALER_MINT_Keys *keys)
2015-01-08 18:37:20 +01:00
{
GNUNET_assert (NULL == cls);
2015-06-18 01:17:01 +02:00
#define ERR(cond) do { if(!(cond)) break; GNUNET_break (0); GNUNET_SCHEDULER_shutdown(); return; } while (0)
ERR (NULL == keys);
ERR (0 == keys->num_sign_keys);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Read %u signing keys\n",
keys->num_sign_keys);
ERR (0 == keys->num_denom_keys);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Read %u denomination keys\n",
keys->num_denom_keys);
#undef ERR
/* TODO: start running rest of test suite here! */
result = GNUNET_OK;
GNUNET_SCHEDULER_shutdown ();
2015-01-08 18:37:20 +01:00
}
/**
2015-06-18 01:17:01 +02:00
* Task that runs the context's event loop with the GNUnet scheduler.
2015-01-08 18:37:20 +01:00
*
2015-06-18 01:17:01 +02:00
* @param cls unused
* @param tc scheduler context (unused)
2015-01-08 18:37:20 +01:00
*/
static void
2015-06-18 01:17:01 +02:00
context_task (void *cls,
const struct GNUNET_SCHEDULER_TaskContext *tc)
2015-01-08 18:37:20 +01:00
{
2015-06-18 01:17:01 +02:00
long timeout;
int max_fd;
fd_set read_fd_set;
fd_set write_fd_set;
fd_set except_fd_set;
struct GNUNET_NETWORK_FDSet *rs;
struct GNUNET_NETWORK_FDSet *ws;
struct GNUNET_TIME_Relative delay;
ctx_task = NULL;
TALER_MINT_perform (ctx);
max_fd = -1;
timeout = -1;
FD_ZERO (&read_fd_set);
FD_ZERO (&write_fd_set);
FD_ZERO (&except_fd_set);
TALER_MINT_get_select_info (ctx,
&read_fd_set,
&write_fd_set,
&except_fd_set,
&max_fd,
&timeout);
if (timeout >= 0)
delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
timeout);
else
delay = GNUNET_TIME_UNIT_FOREVER_REL;
rs = GNUNET_NETWORK_fdset_create ();
GNUNET_NETWORK_fdset_copy_native (rs,
&read_fd_set,
max_fd);
ws = GNUNET_NETWORK_fdset_create ();
GNUNET_NETWORK_fdset_copy_native (ws,
&write_fd_set,
max_fd + 1);
ctx_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
delay,
rs,
ws,
&context_task,
cls);
GNUNET_NETWORK_fdset_destroy (rs);
GNUNET_NETWORK_fdset_destroy (ws);
2015-01-08 18:37:20 +01:00
}
/**
* Main function that will be run by the scheduler.
*
* @param cls closure
* @param args remaining command-line arguments
* @param cfgfile name of the configuration file used (for saving, can be NULL!)
* @param config configuration
*/
static void
2015-06-18 01:17:01 +02:00
run (void *cls,
char *const *args,
const char *cfgfile,
2015-01-08 18:37:20 +01:00
const struct GNUNET_CONFIGURATION_Handle *config)
{
ctx = TALER_MINT_init ();
2015-06-18 01:17:01 +02:00
GNUNET_assert (NULL != ctx);
ctx_task = GNUNET_SCHEDULER_add_now (&context_task,
ctx);
mint = TALER_MINT_connect (ctx,
"http://localhost:8080",
&cert_cb, NULL,
TALER_MINT_OPTION_END);
2015-01-08 18:37:20 +01:00
GNUNET_assert (NULL != mint);
shutdown_task =
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 5),
&do_shutdown, NULL);
}
2015-06-18 01:17:01 +02:00
/**
* Main function for the testcase for the mint API.
*
* @param argc expected to be 1
* @param argv expected to only contain the program name
*/
2015-01-08 18:37:20 +01:00
int
2015-06-18 01:17:01 +02:00
main (int argc,
char * const *argv)
2015-01-08 18:37:20 +01:00
{
static struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_END
};
result = GNUNET_SYSERR;
if (GNUNET_OK !=
GNUNET_PROGRAM_run (argc, argv, "test-mint-api",
2015-06-18 01:17:01 +02:00
gettext_noop ("Testcase to test mint's HTTP API interface"),
options,
&run, NULL))
2015-01-08 18:37:20 +01:00
return 3;
return (GNUNET_OK == result) ? 0 : 1;
}
/* end of test_mint_api.c */