/* This file is part of GNUnet. Copyright (C) 2015 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_peerstore_plugin.h" #include "gnunet_testing_lib.h" static int ok; /** * Name of plugin under test. */ static const char *plugin_name; static struct GNUNET_PEERSTORE_PluginFunctions *psp; static struct GNUNET_PeerIdentity p1; /** * Function called when the service shuts down. Unloads our namestore * plugin. * * @param api api to unload */ static void unload_plugin (struct GNUNET_PEERSTORE_PluginFunctions *api) { char *libname; GNUNET_asprintf (&libname, "libgnunet_plugin_peer_%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_PEERSTORE_PluginFunctions * load_plugin (const struct GNUNET_CONFIGURATION_Handle *cfg) { struct GNUNET_PEERSTORE_PluginFunctions *ret; char *libname; GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Loading `%s' peer plugin\n"), plugin_name); GNUNET_asprintf (&libname, "libgnunet_plugin_peerstore_%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, const struct GNUNET_PEERSTORE_Record *record, const char *error) { const struct GNUNET_PeerIdentity *id = cls; const char*testval = "test_val"; if (NULL == record) { unload_plugin (psp); return; } GNUNET_assert (0 == memcmp (&record->peer, id, sizeof(struct GNUNET_PeerIdentity))); GNUNET_assert (0 == strcmp ("subsys", record->sub_system)); GNUNET_assert (0 == strcmp ("key", record->key)); GNUNET_assert (0 == memcmp (testval, record->value, strlen (testval))); ok = 0; } static void get_record (struct GNUNET_PEERSTORE_PluginFunctions *psp, const struct GNUNET_PeerIdentity *identity) { GNUNET_assert (GNUNET_OK == psp->iterate_records (psp->cls, "subsys", identity, "key", &test_record, (void *) identity)); } static void store_cont (void *cls, int status) { GNUNET_assert (GNUNET_OK == status); get_record (psp, &p1); } static void put_record (struct GNUNET_PEERSTORE_PluginFunctions *psp, const struct GNUNET_PeerIdentity *identity) { GNUNET_assert (GNUNET_OK == psp->store_record (psp->cls, "subsys", identity, "key", "test_value", strlen ("test_value"), GNUNET_TIME_absolute_get (), GNUNET_PEERSTORE_STOREOPTION_REPLACE, &store_cont, NULL)); } static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { ok = 1; psp = load_plugin (cfg); if (NULL == psp) { fprintf (stderr, "%s", "Failed to initialize peerstore. Database likely not setup, skipping test.\n"); return; } memset (&p1, 1, sizeof(p1)); put_record (psp, &p1); } int main (int argc, char *argv[]) { char cfg_name[PATH_MAX]; char *const xargv[] = { "test-plugin-peerstore", "-c", cfg_name, NULL }; struct GNUNET_GETOPT_CommandLineOption options[] = { GNUNET_GETOPT_OPTION_END }; GNUNET_log_setup ("test-plugin-peerstore", "WARNING", NULL); plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]); GNUNET_snprintf (cfg_name, sizeof(cfg_name), "test_plugin_peerstore_%s.conf", plugin_name); GNUNET_PROGRAM_run ((sizeof(xargv) / sizeof(char *)) - 1, xargv, "test-plugin-peerstore", "nohelp", options, &run, NULL); if (ok != 0) fprintf (stderr, "Missed some testcases: %d\n", ok); return ok; } /* end of test_plugin_peerstore.c */