allow empty/NULL context message
[oweals/gnunet.git] / src / peerstore / test_plugin_peerstore.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2015 GNUnet e.V.
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20 /*
21  * @file namestore/test_plugin_namestore.c
22  * @brief Test for the namestore plugins
23  * @author Christian Grothoff
24  */
25 #include "platform.h"
26 #include "gnunet_util_lib.h"
27 #include "gnunet_peerstore_plugin.h"
28 #include "gnunet_testing_lib.h"
29
30
31 static int ok;
32
33 /**
34  * Name of plugin under test.
35  */
36 static const char *plugin_name;
37
38
39 /**
40  * Function called when the service shuts down.  Unloads our namestore
41  * plugin.
42  *
43  * @param api api to unload
44  */
45 static void
46 unload_plugin (struct GNUNET_PEERSTORE_PluginFunctions *api)
47 {
48   char *libname;
49
50   GNUNET_asprintf (&libname, "libgnunet_plugin_peer_%s", plugin_name);
51   GNUNET_break (NULL == GNUNET_PLUGIN_unload (libname, api));
52   GNUNET_free (libname);
53 }
54
55
56 /**
57  * Load the namestore plugin.
58  *
59  * @param cfg configuration to pass
60  * @return NULL on error
61  */
62 static struct GNUNET_PEERSTORE_PluginFunctions *
63 load_plugin (const struct GNUNET_CONFIGURATION_Handle *cfg)
64 {
65   struct GNUNET_PEERSTORE_PluginFunctions *ret;
66   char *libname;
67
68   GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Loading `%s' peer plugin\n"),
69               plugin_name);
70   GNUNET_asprintf (&libname, "libgnunet_plugin_peerstore_%s", plugin_name);
71   if (NULL == (ret = GNUNET_PLUGIN_load (libname, (void*) cfg)))
72   {
73     FPRINTF (stderr, "Failed to load plugin `%s'!\n", plugin_name);
74     GNUNET_free (libname);
75     return NULL;
76   }
77   GNUNET_free (libname);
78   return ret;
79 }
80
81
82 static void
83 test_record (void *cls,
84                                                  const struct GNUNET_PEERSTORE_Record *record,
85                                                  const char *error)
86 {
87   struct GNUNET_PeerIdentity *id = cls;
88   char* testval = "test_val";
89
90   if (NULL == record)
91     return;
92
93   GNUNET_assert (0 == memcmp (record->peer, id, sizeof (struct GNUNET_PeerIdentity)));
94   GNUNET_assert (0 == strcmp ("subsys", record->sub_system));
95   GNUNET_assert (0 == strcmp ("key", record->key));
96   GNUNET_assert (0 == memcmp (testval, record->value, strlen (testval)));
97 }
98
99
100 static void
101 get_record (struct GNUNET_PEERSTORE_PluginFunctions *psp,
102             const struct GNUNET_PeerIdentity *identity)
103 {
104   GNUNET_assert (GNUNET_OK == psp->iterate_records (psp->cls,
105                                             "subsys", identity, "key", &test_record, (void*)identity));
106 }
107
108 static void
109 store_cont (void *cls, int status)
110 {
111   GNUNET_assert (GNUNET_OK == status);
112 }
113
114 static void
115 put_record (struct GNUNET_PEERSTORE_PluginFunctions *psp, struct GNUNET_PeerIdentity *identity)
116 {
117   GNUNET_assert (GNUNET_OK == psp->store_record (psp->cls,
118             "subsys",
119                                                 identity,
120             "key", "test_value", strlen ("test_value"),
121             GNUNET_TIME_absolute_get (),
122             GNUNET_PEERSTORE_STOREOPTION_REPLACE,
123                                                 &store_cont,
124             identity));
125 }
126
127
128 static void
129 run (void *cls, char *const *args, const char *cfgfile,
130      const struct GNUNET_CONFIGURATION_Handle *cfg)
131 {
132   struct GNUNET_PEERSTORE_PluginFunctions *psp;
133   struct GNUNET_PeerIdentity p1;
134
135   ok = 0;
136   psp = load_plugin (cfg);
137   if (NULL == psp)
138   {
139     FPRINTF (stderr,
140              "%s",
141              "Failed to initialize peerstore.  Database likely not setup, skipping test.\n");
142     return;
143   }
144   memset (&p1, 1, sizeof (p1));
145   put_record (psp, &p1);
146   get_record (psp, &p1);
147
148   unload_plugin (psp);
149 }
150
151
152 int
153 main (int argc, char *argv[])
154 {
155   char cfg_name[128];
156   char *const xargv[] = {
157     "test-plugin-peerstore",
158     "-c",
159     cfg_name,
160     NULL
161   };
162   struct GNUNET_GETOPT_CommandLineOption options[] = {
163     GNUNET_GETOPT_OPTION_END
164   };
165
166   //GNUNET_DISK_directory_remove ("/tmp/gnunet-test-plugin-namestore-sqlite");
167   GNUNET_log_setup ("test-plugin-peerstore",
168                     "WARNING",
169                     NULL);
170   plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
171   GNUNET_snprintf (cfg_name, sizeof (cfg_name), "test_plugin_peerstore_%s.conf",
172                    plugin_name);
173   GNUNET_PROGRAM_run ((sizeof (xargv) / sizeof (char *)) - 1, xargv,
174                       "test-plugin-peerstore", "nohelp", options, &run, NULL);
175   if (ok != 0)
176     FPRINTF (stderr, "Missed some testcases: %d\n", ok);
177   //GNUNET_DISK_directory_remove ("/tmp/gnunet-test-plugin-namestore-sqlite");
178   return ok;
179 }
180
181 /* end of test_plugin_namestore.c */