diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2016-05-25 09:54:46 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2016-05-25 09:54:46 +0000 |
commit | 0623fdd510f1dacd25f1b8ff592ff6de038c51dc (patch) | |
tree | b97f37a5a523ab6015940e2d279490e1617d7348 | |
parent | c651b45f01ccd44defd30f82fd21beb4426fea65 (diff) |
- add peerstore tests
-rw-r--r-- | src/peerstore/Makefile.am | 23 | ||||
-rw-r--r-- | src/peerstore/plugin_peerstore_flat.c | 4 | ||||
-rw-r--r-- | src/peerstore/test_plugin_peerstore.c | 182 | ||||
-rw-r--r-- | src/peerstore/test_plugin_peerstore_flat.conf | 5 | ||||
-rw-r--r-- | src/peerstore/test_plugin_peerstore_sqlite.conf | 2 |
5 files changed, 210 insertions, 6 deletions
diff --git a/src/peerstore/Makefile.am b/src/peerstore/Makefile.am index dbb86553dc..a12fdde2a1 100644 --- a/src/peerstore/Makefile.am +++ b/src/peerstore/Makefile.am @@ -52,8 +52,8 @@ libgnunetpeerstore_la_LDFLAGS = \ $(GN_LIB_LDFLAGS) if HAVE_EXPERIMENTAL - FLAT_PLUGIN = libgnunet_plugin_peerstore_flat.la - +FLAT_PLUGIN = libgnunet_plugin_peerstore_flat.la +FLAT_TESTS = test_plugin_peerstore_flat libgnunet_plugin_peerstore_flat_la_SOURCES = \ plugin_peerstore_flat.c libgnunet_plugin_peerstore_flat_la_LIBADD = \ @@ -66,7 +66,9 @@ endif if HAVE_SQLITE SQLITE_PLUGIN = libgnunet_plugin_peerstore_sqlite.la - +if HAVE_TESTING +SQLITE_TESTS = test_plugin_peerstore_sqlite +endif libgnunet_plugin_peerstore_sqlite_la_SOURCES = \ plugin_peerstore_sqlite.c libgnunet_plugin_peerstore_sqlite_la_LIBADD = \ @@ -81,13 +83,26 @@ plugin_LTLIBRARIES = \ $(SQLITE_PLUGIN) \ $(FLAT_PLUGIN) +test_plugin_peerstore_sqlite_SOURCES = \ + test_plugin_peerstore.c +test_plugin_peerstore_sqlite_LDADD = \ + $(top_builddir)/src/testing/libgnunettesting.la \ + $(top_builddir)/src/util/libgnunetutil.la + +test_plugin_peerstore_flat_SOURCES = \ + test_plugin_peerstore.c +test_plugin_peerstore_flat_LDADD = \ + $(top_builddir)/src/testing/libgnunettesting.la \ + $(top_builddir)/src/util/libgnunetutil.la check_PROGRAMS = \ test_peerstore_api_store \ test_peerstore_api_iterate \ test_peerstore_api_watch \ test_peerstore_api_sync \ - perf_peerstore_store + perf_peerstore_store \ + $(SQLITE_TESTS) \ + $(FLAT_TESTS) EXTRA_DIST = \ test_peerstore_api_data.conf diff --git a/src/peerstore/plugin_peerstore_flat.c b/src/peerstore/plugin_peerstore_flat.c index ba5301d098..5ffabed8fa 100644 --- a/src/peerstore/plugin_peerstore_flat.c +++ b/src/peerstore/plugin_peerstore_flat.c @@ -294,10 +294,10 @@ peerstore_flat_store_record (void *cls, const char *sub_system, entry->sub_system = GNUNET_strdup (sub_system); entry->key = GNUNET_strdup (key); entry->value = GNUNET_malloc (size); - memcpy (&entry->value, value, size); + memcpy (entry->value, value, size); entry->value_size = size; entry->peer = GNUNET_new (struct GNUNET_PeerIdentity); - memcpy (&entry->peer, peer, sizeof (struct GNUNET_PeerIdentity)); + memcpy (entry->peer, peer, sizeof (struct GNUNET_PeerIdentity)); entry->expiry = GNUNET_new (struct GNUNET_TIME_Absolute); entry->expiry->abs_value_us = expiry.abs_value_us; diff --git a/src/peerstore/test_plugin_peerstore.c b/src/peerstore/test_plugin_peerstore.c new file mode 100644 index 0000000000..da78b3f759 --- /dev/null +++ b/src/peerstore/test_plugin_peerstore.c @@ -0,0 +1,182 @@ +/* + 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 General Public License as published + by the Free Software Foundation; either version 3, 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +/* + * @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; + + +/** + * 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 int +test_record (void *cls, + const struct GNUNET_PEERSTORE_Record *record, + const char *error) +{ + struct GNUNET_PeerIdentity *id = cls; + char* testval = "test_val"; + + if (NULL == record) + return GNUNET_NO; + + 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))); + return GNUNET_YES; +} + + +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); +} + +static void +put_record (struct GNUNET_PEERSTORE_PluginFunctions *psp, 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, + identity)); +} + + +static void +run (void *cls, char *const *args, const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + struct GNUNET_PEERSTORE_PluginFunctions *psp; + struct GNUNET_PeerIdentity p1; + + ok = 0; + 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); + get_record (psp, &p1); + + unload_plugin (psp); +} + + +int +main (int argc, char *argv[]) +{ + char cfg_name[128]; + char *const xargv[] = { + "test-plugin-peerstore", + "-c", + cfg_name, + NULL + }; + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + + //GNUNET_DISK_directory_remove ("/tmp/gnunet-test-plugin-namestore-sqlite"); + 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); + //GNUNET_DISK_directory_remove ("/tmp/gnunet-test-plugin-namestore-sqlite"); + return ok; +} + +/* end of test_plugin_namestore.c */ diff --git a/src/peerstore/test_plugin_peerstore_flat.conf b/src/peerstore/test_plugin_peerstore_flat.conf new file mode 100644 index 0000000000..48cc9940d4 --- /dev/null +++ b/src/peerstore/test_plugin_peerstore_flat.conf @@ -0,0 +1,5 @@ +[peerstore-flat] +FILENAME = /tmp/gnunet-test-plugin-namestore-flat/flatdb + +[peerstore] +PREFIX = valgrind --log-file=/home/schanzen/dev/gnunet/src/peerstore/vg_log diff --git a/src/peerstore/test_plugin_peerstore_sqlite.conf b/src/peerstore/test_plugin_peerstore_sqlite.conf new file mode 100644 index 0000000000..4d011944f5 --- /dev/null +++ b/src/peerstore/test_plugin_peerstore_sqlite.conf @@ -0,0 +1,2 @@ +[peerstore-sqlite] +FILENAME = /tmp/gnunet-test-plugin-peerstore-sqlite/sqlite.db |