04e82c5d70910eea23e3ed8bc7f6f32bb86603d4
[oweals/gnunet.git] / src / fs / test_fs_namespace.c
1 /*
2      This file is part of GNUnet.
3      (C) 2005, 2006, 2008, 2009 Christian Grothoff (and other contributing authors)
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 2, 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., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file fs/test_fs_namespace.c
23  * @brief Test for fs_namespace.c
24  * @author Christian Grothoff
25  */
26
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
29 #include "gnunet_arm_service.h"
30 #include "gnunet_fs_service.h"
31
32 #define START_ARM GNUNET_YES
33
34 static struct GNUNET_SCHEDULER_Handle *sched;
35
36 static struct PeerContext p1;
37
38 static struct GNUNET_FS_Handle *fs;
39
40
41 struct PeerContext
42 {
43   struct GNUNET_CONFIGURATION_Handle *cfg;
44   struct GNUNET_PeerIdentity id;   
45 #if START_ARM
46   pid_t arm_pid;
47 #endif
48 };
49
50
51 static void *
52 progress_cb (void *cls, 
53              const struct GNUNET_FS_ProgressInfo *event)
54 {
55   return NULL;
56 }
57
58
59 static void
60 setup_peer (struct PeerContext *p, const char *cfgname)
61 {
62   p->cfg = GNUNET_CONFIGURATION_create ();
63 #if START_ARM
64   p->arm_pid = GNUNET_OS_start_process ("gnunet-service-arm",
65                                         "gnunet-service-arm",
66 #if VERBOSE
67                                         "-L", "DEBUG",
68 #endif
69                                         "-c", cfgname, NULL);
70   sleep (1);                    /* allow ARM to start */
71 #endif
72   GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname));
73   GNUNET_ARM_start_services (p->cfg, sched, "core", NULL);
74 }
75
76
77 static void
78 stop_arm (struct PeerContext *p)
79 {
80 #if START_ARM
81   if (0 != PLIBC_KILL (p->arm_pid, SIGTERM))
82     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
83   if (GNUNET_OS_process_wait(p->arm_pid) != GNUNET_OK)
84     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "waitpid");
85   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
86               "ARM process %u stopped\n", p->arm_pid);
87 #endif
88   GNUNET_CONFIGURATION_destroy (p->cfg);
89 }
90
91
92 #if 0
93 static void
94 spcb (void *cls,
95       const char *name,
96       const GNUNET_HashCode * key)
97 {
98 }
99 #endif
100
101
102 static void
103 publish_cont (void *cls,
104               const struct GNUNET_FS_Uri *uri,
105               const char *emsg)
106 {
107   struct GNUNET_FS_SearchContext *search;
108
109   GNUNET_assert (NULL == emsg);
110   fprintf (stderr, "Starting namespace search...\n");
111   search = GNUNET_FS_search_start (fs, uri, 1);
112 }
113
114
115 static void
116 testNamespace ()
117 {
118   struct GNUNET_FS_Namespace *ns;
119   struct GNUNET_FS_Uri *adv;
120   struct GNUNET_FS_Uri *rootUri;
121   struct GNUNET_CONTAINER_MetaData *meta;
122   struct GNUNET_TIME_Absolute expiration;
123
124   expiration = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_MINUTES);
125   meta = GNUNET_CONTAINER_meta_data_create ();
126   adv = GNUNET_FS_uri_ksk_create ("testNamespace", NULL);
127   ns = GNUNET_FS_namespace_create (fs,
128                                    "testNamespace");
129   rootUri = GNUNET_FS_namespace_advertise (fs,
130                                            ns,
131                                            meta,
132                                            1, 1,
133                                            expiration,
134                                            adv,
135                                            "root");
136   GNUNET_assert (NULL != rootUri);
137   GNUNET_FS_publish_sks (fs,
138                          ns,
139                          "this",
140                          "next",
141                          meta,
142                          rootUri,
143                          expiration,
144                          1, 1,
145                          GNUNET_FS_PUBLISH_OPTION_NONE,
146                          &publish_cont,
147                          NULL);
148   GNUNET_CONTAINER_meta_data_destroy (meta);
149 }
150
151 #if 0
152   fprintf (stderr, "Completed namespace search...\n");
153   GNUNET_assert (GNUNET_OK == GNUNET_FS_namespace_delete (NULL, cfg, &pid));
154   GNUNET_assert (GNUNET_SYSERR == GNUNET_FS_namespace_delete (NULL, cfg, &pid));
155   GNUNET_FS_uri_destroy (rootURI);
156   GNUNET_FS_uri_destroy (advURI);
157   GNUNET_assert (match == 1);
158   return 0;
159 }
160 #endif
161
162
163 static void
164 run (void *cls,
165      struct GNUNET_SCHEDULER_Handle *s,
166      char *const *args,
167      const char *cfgfile,
168      const struct GNUNET_CONFIGURATION_Handle *cfg)
169 {
170   sched = s;
171   setup_peer (&p1, "test_fs_download_data.conf");
172   fs = GNUNET_FS_start (sched,
173                         cfg,
174                         "test-fs-namespace",
175                         &progress_cb,
176                         NULL,
177                         GNUNET_FS_FLAGS_NONE,
178                         GNUNET_FS_OPTIONS_END);
179   testNamespace ();
180 }
181
182
183 int
184 main (int argc, char *argv[])
185 {
186   char *const argvx[] = { 
187     "test-fs-namespace",
188     "-c",
189     "test_fs_namespace_data.conf",
190 #if VERBOSE
191     "-L", "DEBUG",
192 #endif
193     NULL
194   };
195   struct GNUNET_GETOPT_CommandLineOption options[] = {
196     GNUNET_GETOPT_OPTION_END
197   };
198
199   GNUNET_log_setup ("test_fs_namespace", 
200 #if VERBOSE
201                     "DEBUG",
202 #else
203                     "WARNING",
204 #endif
205                     NULL);
206   GNUNET_PROGRAM_run ((sizeof (argvx) / sizeof (char *)) - 1,
207                       argvx, "test-fs-namespace",
208                       "nohelp", options, &run, NULL);
209   stop_arm (&p1);
210   GNUNET_DISK_directory_remove ("/tmp/gnunet-test-fs-namespace/");
211   return 0;
212 }
213
214
215
216 /* end of test_fs_namespace.c */