aboutsummaryrefslogtreecommitdiff
path: root/src/fs/test_fs_namespace.c
diff options
context:
space:
mode:
authorLRN <lrn1986@gmail.com>2013-02-19 04:04:35 +0000
committerLRN <lrn1986@gmail.com>2013-02-19 04:04:35 +0000
commit046e90172489ca6091346685bf444a037b1187ee (patch)
treeb4649fab6e1cc543e26dcdd51d1aa8a79ec3d9d7 /src/fs/test_fs_namespace.c
parentd924f127fd9633ce3e484d54a7efdcdee590dc34 (diff)
downloadgnunet-046e90172489ca6091346685bf444a037b1187ee.tar.gz
gnunet-046e90172489ca6091346685bf444a037b1187ee.zip
Asynchronous namespace creation. With a test.
Diffstat (limited to 'src/fs/test_fs_namespace.c')
-rw-r--r--src/fs/test_fs_namespace.c149
1 files changed, 122 insertions, 27 deletions
diff --git a/src/fs/test_fs_namespace.c b/src/fs/test_fs_namespace.c
index e4ac4931e..61f304487 100644
--- a/src/fs/test_fs_namespace.c
+++ b/src/fs/test_fs_namespace.c
@@ -43,27 +43,64 @@ static struct GNUNET_FS_SearchContext *ksk_search;
43 43
44static GNUNET_SCHEDULER_TaskIdentifier kill_task; 44static GNUNET_SCHEDULER_TaskIdentifier kill_task;
45 45
46static GNUNET_SCHEDULER_TaskIdentifier kill_ncc_task;
47
48struct GNUNET_FS_NamespaceCreationContext *ncc;
49
46static int update_started; 50static int update_started;
47 51
48static int err; 52static int err;
49 53
54static int phase;
55
56const struct GNUNET_CONFIGURATION_Handle *config;
57
58static void ns_created (void *cls, struct GNUNET_FS_Namespace *ns, const char *emsg);
59
60static void do_ncc_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
61
50 62
51static void 63static void
52abort_ksk_search_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 64next_phase ()
53{ 65{
54 if (ksk_search != NULL) 66 switch (phase)
55 { 67 {
56 GNUNET_FS_search_stop (ksk_search); 68 case 0:
57 ksk_search = NULL; 69 phase += 1;
58 if (sks_search == NULL) 70 FPRINTF (stderr, "%s", "Testing asynchronous namespace creation\n");
71 ncc = GNUNET_FS_namespace_create_start (fs, "testNamespace", ns_created, NULL);
72 if (NULL == ncc)
59 { 73 {
60 GNUNET_FS_stop (fs); 74 FPRINTF (stderr, "%s", "Failed to start asynchronous namespace creation\n");
61 if (GNUNET_SCHEDULER_NO_TASK != kill_task) 75 err = 1;
62 GNUNET_SCHEDULER_cancel (kill_task); 76 next_phase ();
77 return;
63 } 78 }
79 kill_ncc_task =
80 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &do_ncc_timeout,
81 NULL);
82 break;
83 case 1:
84 FPRINTF (stderr, "%s", "Shutting down FS\n");
85 GNUNET_FS_stop (fs);
86 if (GNUNET_SCHEDULER_NO_TASK != kill_task)
87 GNUNET_SCHEDULER_cancel (kill_task);
88 kill_task = GNUNET_SCHEDULER_NO_TASK;
64 } 89 }
65} 90}
66 91
92static void
93abort_ksk_search_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
94{
95 if (NULL == ksk_search)
96 return;
97 FPRINTF (stderr, "%s", "Stopping KSK search\n");
98 GNUNET_FS_search_stop (ksk_search);
99 ksk_search = NULL;
100 if (sks_search == NULL)
101 next_phase ();
102}
103
67 104
68static void 105static void
69abort_sks_search_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 106abort_sks_search_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
@@ -72,17 +109,14 @@ abort_sks_search_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
72 109
73 if (sks_search == NULL) 110 if (sks_search == NULL)
74 return; 111 return;
112 FPRINTF (stderr, "%s", "Stopping SKS search\n");
75 GNUNET_FS_search_stop (sks_search); 113 GNUNET_FS_search_stop (sks_search);
76 sks_search = NULL; 114 sks_search = NULL;
77 ns = GNUNET_FS_namespace_create (fs, "testNamespace"); 115 ns = GNUNET_FS_namespace_create (fs, "testNamespace");
78 GNUNET_assert (NULL != ns); 116 GNUNET_assert (NULL != ns);
79 GNUNET_assert (GNUNET_OK == GNUNET_FS_namespace_delete (ns, GNUNET_YES)); 117 GNUNET_assert (GNUNET_OK == GNUNET_FS_namespace_delete (ns, GNUNET_YES));
80 if (ksk_search == NULL) 118 if (ksk_search == NULL)
81 { 119 next_phase ();
82 GNUNET_FS_stop (fs);
83 if (GNUNET_SCHEDULER_NO_TASK != kill_task)
84 GNUNET_SCHEDULER_cancel (kill_task);
85 }
86} 120}
87 121
88 122
@@ -99,18 +133,25 @@ do_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
99static void * 133static void *
100progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event) 134progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
101{ 135{
136 char *got;
102 switch (event->status) 137 switch (event->status)
103 { 138 {
104 case GNUNET_FS_STATUS_SEARCH_RESULT: 139 case GNUNET_FS_STATUS_SEARCH_RESULT:
140 got = GNUNET_FS_uri_to_string (event->value.search.specifics.result.uri);
141 FPRINTF (stderr, "Got a search result `%s'\n", got);
105 if (sks_search == event->value.search.sc) 142 if (sks_search == event->value.search.sc)
106 { 143 {
107 if (!GNUNET_FS_uri_test_equal 144 if (!GNUNET_FS_uri_test_equal
108 (sks_expect_uri, event->value.search.specifics.result.uri)) 145 (sks_expect_uri, event->value.search.specifics.result.uri))
109 { 146 {
110 FPRINTF (stderr, "%s", "Wrong result for sks search!\n"); 147 char *expected;
148 expected = GNUNET_FS_uri_to_string (sks_expect_uri);
149 FPRINTF (stderr, "Wrong result for sks search! Expected:\n%s\nGot:\n%s\n", expected, got);
150 GNUNET_free (expected);
111 err = 1; 151 err = 1;
112 } 152 }
113 /* give system 1ms to initiate update search! */ 153 /* give system 1ms to initiate update search! */
154 FPRINTF (stderr, "scheduling `%s'\n", "abort_sks_search_task");
114 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MILLISECONDS, 155 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MILLISECONDS,
115 &abort_sks_search_task, NULL); 156 &abort_sks_search_task, NULL);
116 } 157 }
@@ -119,17 +160,22 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
119 if (!GNUNET_FS_uri_test_equal 160 if (!GNUNET_FS_uri_test_equal
120 (ksk_expect_uri, event->value.search.specifics.result.uri)) 161 (ksk_expect_uri, event->value.search.specifics.result.uri))
121 { 162 {
122 FPRINTF (stderr, "%s", "Wrong result for ksk search!\n"); 163 char *expected;
164 expected = GNUNET_FS_uri_to_string (ksk_expect_uri);
165 FPRINTF (stderr, "Wrong result for ksk search! Expected:\n%s\nGot:\n%s\n", expected, got);
166 GNUNET_free (expected);
123 err = 1; 167 err = 1;
124 } 168 }
169 FPRINTF (stderr, "scheduling `%s'\n", "abort_ksk_search_task");
125 GNUNET_SCHEDULER_add_continuation (&abort_ksk_search_task, NULL, 170 GNUNET_SCHEDULER_add_continuation (&abort_ksk_search_task, NULL,
126 GNUNET_SCHEDULER_REASON_PREREQ_DONE); 171 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
127 } 172 }
128 else 173 else
129 { 174 {
130 FPRINTF (stderr, "%s", "Unexpected search result received!\n"); 175 FPRINTF (stderr, "Unexpected search result `%s' received!\n", got);
131 GNUNET_break (0); 176 GNUNET_break (0);
132 } 177 }
178 GNUNET_free (got);
133 break; 179 break;
134 case GNUNET_FS_STATUS_SEARCH_ERROR: 180 case GNUNET_FS_STATUS_SEARCH_ERROR:
135 FPRINTF (stderr, "Error searching file: %s\n", 181 FPRINTF (stderr, "Error searching file: %s\n",
@@ -144,6 +190,7 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
144 GNUNET_break (0); 190 GNUNET_break (0);
145 break; 191 break;
146 case GNUNET_FS_STATUS_SEARCH_START: 192 case GNUNET_FS_STATUS_SEARCH_START:
193 FPRINTF (stderr, "Search %s started\n", event->value.search.pctx);
147 GNUNET_assert ((NULL == event->value.search.cctx) || 194 GNUNET_assert ((NULL == event->value.search.cctx) ||
148 (0 == strcmp ("sks_search", event->value.search.cctx)) || 195 (0 == strcmp ("sks_search", event->value.search.cctx)) ||
149 (0 == strcmp ("ksk_search", event->value.search.cctx))); 196 (0 == strcmp ("ksk_search", event->value.search.cctx)));
@@ -155,8 +202,10 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
155 GNUNET_assert (1 == event->value.search.anonymity); 202 GNUNET_assert (1 == event->value.search.anonymity);
156 break; 203 break;
157 case GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED: 204 case GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED:
205 FPRINTF (stderr, "%s", "Search result stopped\n");
158 return NULL; 206 return NULL;
159 case GNUNET_FS_STATUS_SEARCH_STOPPED: 207 case GNUNET_FS_STATUS_SEARCH_STOPPED:
208 FPRINTF (stderr, "%s", "Search stopped\n");
160 return NULL; 209 return NULL;
161 default: 210 default:
162 FPRINTF (stderr, "Unexpected event: %d\n", event->status); 211 FPRINTF (stderr, "Unexpected event: %d\n", event->status);
@@ -176,11 +225,12 @@ publish_cont (void *cls, const struct GNUNET_FS_Uri *ksk_uri, const char *emsg)
176 225
177 if (NULL != emsg) 226 if (NULL != emsg)
178 { 227 {
179 FPRINTF (stderr, "Error publishing: %s\n", emsg); 228 FPRINTF (stderr, "Error publishing ksk: %s\n", emsg);
180 err = 1; 229 err = 1;
181 GNUNET_FS_stop (fs); 230 GNUNET_FS_stop (fs);
182 return; 231 return;
183 } 232 }
233 FPRINTF (stderr, "%s", "Published ksk\n");
184 GNUNET_CRYPTO_hash_to_enc (&nsid, &enc); 234 GNUNET_CRYPTO_hash_to_enc (&nsid, &enc);
185 GNUNET_snprintf (sbuf, sizeof (sbuf), "gnunet://fs/sks/%s/this", &enc); 235 GNUNET_snprintf (sbuf, sizeof (sbuf), "gnunet://fs/sks/%s/this", &enc);
186 sks_uri = GNUNET_FS_uri_parse (sbuf, &msg); 236 sks_uri = GNUNET_FS_uri_parse (sbuf, &msg);
@@ -192,6 +242,7 @@ publish_cont (void *cls, const struct GNUNET_FS_Uri *ksk_uri, const char *emsg)
192 GNUNET_free_non_null (msg); 242 GNUNET_free_non_null (msg);
193 return; 243 return;
194 } 244 }
245 FPRINTF (stderr, "%s", "Starting searches\n");
195 ksk_search = 246 ksk_search =
196 GNUNET_FS_search_start (fs, ksk_uri, 1, GNUNET_FS_SEARCH_OPTION_NONE, 247 GNUNET_FS_search_start (fs, ksk_uri, 1, GNUNET_FS_SEARCH_OPTION_NONE,
197 "ksk_search"); 248 "ksk_search");
@@ -212,11 +263,12 @@ sks_cont (void *cls, const struct GNUNET_FS_Uri *uri, const char *emsg)
212 263
213 if (NULL == uri) 264 if (NULL == uri)
214 { 265 {
215 fprintf (stderr, "Error publishing: %s\n", emsg); 266 fprintf (stderr, "Error publishing sks: %s\n", emsg);
216 err = 1; 267 err = 1;
217 GNUNET_FS_stop (fs); 268 GNUNET_FS_stop (fs);
218 return; 269 return;
219 } 270 }
271 FPRINTF (stderr, "%s", "Published sks\n");
220 meta = GNUNET_CONTAINER_meta_data_create (); 272 meta = GNUNET_CONTAINER_meta_data_create ();
221 msg = NULL; 273 msg = NULL;
222 ksk_uri = GNUNET_FS_uri_parse ("gnunet://fs/ksk/ns-search", &msg); 274 ksk_uri = GNUNET_FS_uri_parse ("gnunet://fs/ksk/ns-search", &msg);
@@ -243,11 +295,12 @@ adv_cont (void *cls, const struct GNUNET_FS_Uri *uri, const char *emsg)
243 295
244 if (NULL != emsg) 296 if (NULL != emsg)
245 { 297 {
246 FPRINTF (stderr, "Error publishing: %s\n", emsg); 298 FPRINTF (stderr, "Error advertising: %s\n", emsg);
247 err = 1; 299 err = 1;
248 GNUNET_FS_stop (fs); 300 GNUNET_FS_stop (fs);
249 return; 301 return;
250 } 302 }
303 FPRINTF (stderr, "%s", "Created an advertising\n");
251 ns = GNUNET_FS_namespace_create (fs, "testNamespace"); 304 ns = GNUNET_FS_namespace_create (fs, "testNamespace");
252 GNUNET_assert (NULL != ns); 305 GNUNET_assert (NULL != ns);
253 meta = GNUNET_CONTAINER_meta_data_create (); 306 meta = GNUNET_CONTAINER_meta_data_create ();
@@ -270,24 +323,22 @@ ns_iterator (void *cls, const char *name, const struct GNUNET_HashCode * id)
270{ 323{
271 int *ok = cls; 324 int *ok = cls;
272 325
326 FPRINTF (stderr, "Namespace in the list: %s\n", name);
273 if (0 != strcmp (name, "testNamespace")) 327 if (0 != strcmp (name, "testNamespace"))
274 return; 328 return;
275 *ok = GNUNET_YES; 329 *ok = GNUNET_YES;
276 nsid = *id; 330 nsid = *id;
277} 331}
278 332
279
280static void 333static void
281testNamespace () 334testCreatedNamespace (struct GNUNET_FS_Namespace *ns)
282{ 335{
283 struct GNUNET_FS_Namespace *ns;
284 struct GNUNET_FS_BlockOptions bo; 336 struct GNUNET_FS_BlockOptions bo;
285 struct GNUNET_CONTAINER_MetaData *meta; 337 struct GNUNET_CONTAINER_MetaData *meta;
286 struct GNUNET_FS_Uri *ksk_uri; 338 struct GNUNET_FS_Uri *ksk_uri;
287 int ok; 339 int ok;
288 340
289 ns = GNUNET_FS_namespace_create (fs, "testNamespace"); 341 FPRINTF (stderr, "%s", "Listing namespaces\n");
290 GNUNET_assert (NULL != ns);
291 ok = GNUNET_NO; 342 ok = GNUNET_NO;
292 GNUNET_FS_namespace_list (fs, &ns_iterator, &ok); 343 GNUNET_FS_namespace_list (fs, &ns_iterator, &ok);
293 if (GNUNET_NO == ok) 344 if (GNUNET_NO == ok)
@@ -298,6 +349,7 @@ testNamespace ()
298 err = 1; 349 err = 1;
299 return; 350 return;
300 } 351 }
352 FPRINTF (stderr, "%s", "Creating an advertising\n");
301 meta = GNUNET_CONTAINER_meta_data_create (); 353 meta = GNUNET_CONTAINER_meta_data_create ();
302 ksk_uri = GNUNET_FS_uri_parse ("gnunet://fs/ksk/testnsa", NULL); 354 ksk_uri = GNUNET_FS_uri_parse ("gnunet://fs/ksk/testnsa", NULL);
303 bo.content_priority = 1; 355 bo.content_priority = 1;
@@ -307,22 +359,65 @@ testNamespace ()
307 GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_MINUTES); 359 GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_MINUTES);
308 GNUNET_FS_namespace_advertise (fs, ksk_uri, ns, meta, &bo, "root", &adv_cont, 360 GNUNET_FS_namespace_advertise (fs, ksk_uri, ns, meta, &bo, "root", &adv_cont,
309 NULL); 361 NULL);
310 kill_task =
311 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &do_timeout,
312 NULL);
313 GNUNET_FS_uri_destroy (ksk_uri); 362 GNUNET_FS_uri_destroy (ksk_uri);
314 GNUNET_FS_namespace_delete (ns, GNUNET_NO); 363 GNUNET_FS_namespace_delete (ns, GNUNET_NO);
315 GNUNET_CONTAINER_meta_data_destroy (meta); 364 GNUNET_CONTAINER_meta_data_destroy (meta);
316} 365}
317 366
367static void
368do_ncc_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
369{
370 FPRINTF (stderr, "%s", "Asynchronous NS creation timed out\n");
371 kill_ncc_task = GNUNET_SCHEDULER_NO_TASK;
372 if (NULL == ncc)
373 return;
374 GNUNET_FS_namespace_create_stop (ncc);
375 ncc = NULL;
376 err = 1;
377}
378
379static void
380ns_created (void *cls, struct GNUNET_FS_Namespace *ns, const char *emsg)
381{
382 if (GNUNET_SCHEDULER_NO_TASK != kill_ncc_task)
383 GNUNET_SCHEDULER_cancel (kill_ncc_task);
384 kill_ncc_task = GNUNET_SCHEDULER_NO_TASK;
385 if (NULL == ns)
386 {
387 FPRINTF (stderr, "Asynchronous NS creation failed: %s\n", emsg);
388 err = 1;
389 return;
390 }
391
392 FPRINTF (stderr, "%s", "Namespace created asynchronously\n");
393 testCreatedNamespace (ns);
394}
395
396static void
397testNamespace ()
398{
399 struct GNUNET_FS_Namespace *ns;
400
401 FPRINTF (stderr, "%s", "Testing synchronous namespace creation\n");
402 ns = GNUNET_FS_namespace_create (fs, "testNamespace");
403 GNUNET_assert (NULL != ns);
404 testCreatedNamespace (ns);
405
406 kill_task =
407 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &do_timeout,
408 NULL);
409}
410
318 411
319static void 412static void
320run (void *cls, 413run (void *cls,
321 const struct GNUNET_CONFIGURATION_Handle *cfg, 414 const struct GNUNET_CONFIGURATION_Handle *cfg,
322 struct GNUNET_TESTING_Peer *peer) 415 struct GNUNET_TESTING_Peer *peer)
323{ 416{
417 config = cfg;
324 fs = GNUNET_FS_start (cfg, "test-fs-namespace", &progress_cb, NULL, 418 fs = GNUNET_FS_start (cfg, "test-fs-namespace", &progress_cb, NULL,
325 GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END); 419 GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END);
420 phase = 0;
326 testNamespace (); 421 testNamespace ();
327} 422}
328 423