/*
This file is part of GNUnet.
Copyright (C) 2012 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet 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
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/*
* @file namestore/test_plugin_namestore.c
* @brief Test for the namestore plugins
* @author Christian Grothoff
*/
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_namestore_plugin.h"
#include "gnunet_testing_lib.h"
#include "gnunet_dnsparser_lib.h"
#define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT
static int ok;
/**
* Name of plugin under test.
*/
static const char *plugin_name;
/**
* Function called when the service shuts down. Unloads our namestore
* plugin.
*
* @param api api to unload
*/
static void
unload_plugin (struct GNUNET_NAMESTORE_PluginFunctions *api)
{
char *libname;
GNUNET_asprintf (&libname,
"libgnunet_plugin_namestore_%s",
plugin_name);
GNUNET_break (NULL ==
GNUNET_PLUGIN_unload (libname,
api));
GNUNET_free (libname);
}
/**
* Load the namestore plugin.
*
* @param cfg configuration to pass
* @return NULL on error
*/
static struct GNUNET_NAMESTORE_PluginFunctions *
load_plugin (const struct GNUNET_CONFIGURATION_Handle *cfg)
{
struct GNUNET_NAMESTORE_PluginFunctions *ret;
char *libname;
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
_("Loading `%s' namestore plugin\n"),
plugin_name);
GNUNET_asprintf (&libname,
"libgnunet_plugin_namestore_%s",
plugin_name);
if (NULL == (ret = GNUNET_PLUGIN_load (libname, (void*) cfg)))
{
FPRINTF (stderr,
"Failed to load plugin `%s'!\n",
plugin_name);
GNUNET_free (libname);
return NULL;
}
GNUNET_free (libname);
return ret;
}
static void
test_record (void *cls,
uint64_t seq,
const struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key,
const char *label,
unsigned int rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
int *idp = cls;
int id = *idp;
struct GNUNET_CRYPTO_EcdsaPrivateKey tzone_private_key;
char tname[64];
unsigned int trd_count = 1 + (id % 1024);
GNUNET_snprintf (tname,
sizeof (tname),
"a%u",
(unsigned int) id);
GNUNET_assert (trd_count == rd_count);
for (unsigned int i=0;iiterate_records (nsp->cls,
NULL,
0,
1,
&test_record,
&id));
}
static void
put_record (struct GNUNET_NAMESTORE_PluginFunctions *nsp,
int id)
{
struct GNUNET_CRYPTO_EcdsaPrivateKey zone_private_key;
char label[64];
unsigned int rd_count = 1 + (id % 1024);
struct GNUNET_GNSRECORD_Data rd[rd_count];
struct GNUNET_CRYPTO_EcdsaSignature signature;
GNUNET_snprintf (label, sizeof (label),
"a%u", (unsigned int ) id);
for (unsigned int i=0;istore_records (nsp->cls,
&zone_private_key,
label,
rd_count,
rd));
}
static void
run (void *cls,
char *const *args,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
struct GNUNET_NAMESTORE_PluginFunctions *nsp;
ok = 0;
nsp = load_plugin (cfg);
if (NULL == nsp)
{
FPRINTF (stderr,
"%s",
"Failed to initialize namestore. Database likely not setup, skipping test.\n");
return;
}
put_record (nsp, 1);
get_record (nsp, 1);
unload_plugin (nsp);
}
int
main (int argc,
char *argv[])
{
char cfg_name[PATH_MAX];
char *const xargv[] = {
"test-plugin-namestore",
"-c",
cfg_name,
NULL
};
struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_END
};
GNUNET_log_setup ("test-plugin-namestore",
"WARNING",
NULL);
plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
GNUNET_snprintf (cfg_name,
sizeof (cfg_name),
"test_plugin_namestore_%s.conf",
plugin_name);
GNUNET_DISK_purge_cfg_dir (cfg_name,
"GNUNET_TMP");
GNUNET_PROGRAM_run ((sizeof (xargv) / sizeof (char *)) - 1,
xargv,
"test-plugin-namestore",
"nohelp",
options,
&run,
NULL);
GNUNET_DISK_purge_cfg_dir (cfg_name,
"GNUNET_TMP");
if (ok != 0)
FPRINTF (stderr,
"Missed some testcases: %d\n",
ok);
return ok;
}
/* end of test_plugin_namestore.c */