aboutsummaryrefslogtreecommitdiff
path: root/src/fs/test_fs_download.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/test_fs_download.c')
-rw-r--r--src/fs/test_fs_download.c335
1 files changed, 162 insertions, 173 deletions
diff --git a/src/fs/test_fs_download.c b/src/fs/test_fs_download.c
index 6bc287da3..d37b94c03 100644
--- a/src/fs/test_fs_download.c
+++ b/src/fs/test_fs_download.c
@@ -46,7 +46,7 @@
46 46
47/** 47/**
48 * How long should our test-content live? 48 * How long should our test-content live?
49 */ 49 */
50#define LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15) 50#define LIFETIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
51 51
52struct PeerContext 52struct PeerContext
@@ -74,57 +74,52 @@ static char *fn;
74static int err; 74static int err;
75 75
76static void 76static void
77timeout_kill_task (void *cls, 77timeout_kill_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
78 const struct GNUNET_SCHEDULER_TaskContext *tc)
79{ 78{
80 if (download != NULL) 79 if (download != NULL)
81 { 80 {
82 GNUNET_FS_download_stop (download, GNUNET_YES); 81 GNUNET_FS_download_stop (download, GNUNET_YES);
83 download = NULL; 82 download = NULL;
84 } 83 }
85 else if (publish != NULL) 84 else if (publish != NULL)
86 { 85 {
87 GNUNET_FS_publish_stop (publish); 86 GNUNET_FS_publish_stop (publish);
88 publish = NULL; 87 publish = NULL;
89 } 88 }
90 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 89 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Timeout downloading file\n");
91 "Timeout downloading file\n");
92 timeout_kill = GNUNET_SCHEDULER_NO_TASK; 90 timeout_kill = GNUNET_SCHEDULER_NO_TASK;
93 err = 1; 91 err = 1;
94} 92}
95 93
96static void 94static void
97abort_publish_task (void *cls, 95abort_publish_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
98 const struct GNUNET_SCHEDULER_TaskContext *tc)
99{ 96{
100 if (publish != NULL) 97 if (publish != NULL)
101 { 98 {
102 GNUNET_FS_publish_stop (publish); 99 GNUNET_FS_publish_stop (publish);
103 publish = NULL; 100 publish = NULL;
104 } 101 }
105} 102}
106 103
107static void 104static void
108stop_fs_task (void *cls, 105stop_fs_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
109 const struct GNUNET_SCHEDULER_TaskContext *tc)
110{ 106{
111 GNUNET_FS_stop (fs); 107 GNUNET_FS_stop (fs);
112 fs = NULL; 108 fs = NULL;
113} 109}
114 110
115static void 111static void
116abort_download_task (void *cls, 112abort_download_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
117 const struct GNUNET_SCHEDULER_TaskContext *tc)
118{ 113{
119 uint64_t size; 114 uint64_t size;
120 115
121 if (download != NULL) 116 if (download != NULL)
122 { 117 {
123 GNUNET_FS_download_stop (download, GNUNET_YES); 118 GNUNET_FS_download_stop (download, GNUNET_YES);
124 download = NULL; 119 download = NULL;
125 } 120 }
126 GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_size (fn, &size, GNUNET_YES)); 121 GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_size (fn, &size, GNUNET_YES));
127 GNUNET_assert (size == FILESIZE); 122 GNUNET_assert (size == FILESIZE);
128 GNUNET_DISK_directory_remove (fn); 123 GNUNET_DISK_directory_remove (fn);
129 GNUNET_free (fn); 124 GNUNET_free (fn);
130 fn = NULL; 125 fn = NULL;
@@ -134,115 +129,116 @@ abort_download_task (void *cls,
134 129
135 130
136static void * 131static void *
137progress_cb (void *cls, 132progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
138 const struct GNUNET_FS_ProgressInfo *event)
139{ 133{
140 134
141 switch (event->status) 135 switch (event->status)
142 { 136 {
143 case GNUNET_FS_STATUS_PUBLISH_PROGRESS: 137 case GNUNET_FS_STATUS_PUBLISH_PROGRESS:
144#if VERBOSE 138#if VERBOSE
145 printf ("Publish is progressing (%llu/%llu at level %u off %llu)...\n", 139 printf ("Publish is progressing (%llu/%llu at level %u off %llu)...\n",
146 (unsigned long long) event->value.publish.completed, 140 (unsigned long long) event->value.publish.completed,
147 (unsigned long long) event->value.publish.size, 141 (unsigned long long) event->value.publish.size,
148 event->value.publish.specifics.progress.depth, 142 event->value.publish.specifics.progress.depth,
149 (unsigned long long) event->value.publish.specifics.progress.offset); 143 (unsigned long long) event->value.publish.specifics.
150#endif 144 progress.offset);
151 break; 145#endif
152 case GNUNET_FS_STATUS_PUBLISH_COMPLETED: 146 break;
153 printf ("Publishing complete, %llu kb/s.\n", 147 case GNUNET_FS_STATUS_PUBLISH_COMPLETED:
154 (unsigned long long) (FILESIZE * 1000LL / (1+GNUNET_TIME_absolute_get_duration (start).rel_value) / 1024LL)); 148 printf ("Publishing complete, %llu kb/s.\n",
155 GAUGER ("FS", 149 (unsigned long long) (FILESIZE * 1000LL /
156 "Publishing speed (insertion)", 150 (1 +
157 (unsigned long long) (FILESIZE * 1000LL / (1+GNUNET_TIME_absolute_get_duration (start).rel_value) / 1024LL), 151 GNUNET_TIME_absolute_get_duration
158 "kb/s"); 152 (start).rel_value) / 1024LL));
159 fn = GNUNET_DISK_mktemp ("gnunet-download-test-dst"); 153 GAUGER ("FS", "Publishing speed (insertion)",
160 start = GNUNET_TIME_absolute_get (); 154 (unsigned long long) (FILESIZE * 1000LL /
161 download = GNUNET_FS_download_start (fs, 155 (1 +
162 event->value.publish.specifics.completed.chk_uri, 156 GNUNET_TIME_absolute_get_duration
163 NULL, 157 (start).rel_value) / 1024LL), "kb/s");
164 fn, NULL, 158 fn = GNUNET_DISK_mktemp ("gnunet-download-test-dst");
165 0, 159 start = GNUNET_TIME_absolute_get ();
166 FILESIZE, 160 download = GNUNET_FS_download_start (fs,
167 1, 161 event->value.publish.
168 GNUNET_FS_DOWNLOAD_OPTION_NONE, 162 specifics.completed.chk_uri, NULL, fn,
169 "download", 163 NULL, 0, FILESIZE, 1,
170 NULL); 164 GNUNET_FS_DOWNLOAD_OPTION_NONE,
171 GNUNET_assert (download != NULL); 165 "download", NULL);
172 break; 166 GNUNET_assert (download != NULL);
173 case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED: 167 break;
174 printf ("Download complete, %llu kb/s.\n", 168 case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED:
175 (unsigned long long) (FILESIZE * 1000LL / (1+GNUNET_TIME_absolute_get_duration (start).rel_value) / 1024LL)); 169 printf ("Download complete, %llu kb/s.\n",
176 GAUGER ("FS", 170 (unsigned long long) (FILESIZE * 1000LL /
177 "Local download speed (inserted)", 171 (1 +
178 (unsigned long long) (FILESIZE * 1000LL / (1+GNUNET_TIME_absolute_get_duration (start).rel_value) / 1024LL), 172 GNUNET_TIME_absolute_get_duration
179 "kb/s"); 173 (start).rel_value) / 1024LL));
180 GNUNET_SCHEDULER_add_now (&abort_download_task, 174 GAUGER ("FS", "Local download speed (inserted)",
181 NULL); 175 (unsigned long long) (FILESIZE * 1000LL /
182 break; 176 (1 +
183 case GNUNET_FS_STATUS_DOWNLOAD_PROGRESS: 177 GNUNET_TIME_absolute_get_duration
184 GNUNET_assert (download == event->value.download.dc); 178 (start).rel_value) / 1024LL), "kb/s");
179 GNUNET_SCHEDULER_add_now (&abort_download_task, NULL);
180 break;
181 case GNUNET_FS_STATUS_DOWNLOAD_PROGRESS:
182 GNUNET_assert (download == event->value.download.dc);
185#if VERBOSE 183#if VERBOSE
186 printf ("Download is progressing (%llu/%llu at level %u off %llu)...\n", 184 printf ("Download is progressing (%llu/%llu at level %u off %llu)...\n",
187 (unsigned long long) event->value.download.completed, 185 (unsigned long long) event->value.download.completed,
188 (unsigned long long) event->value.download.size, 186 (unsigned long long) event->value.download.size,
189 event->value.download.specifics.progress.depth, 187 event->value.download.specifics.progress.depth,
190 (unsigned long long) event->value.download.specifics.progress.offset); 188 (unsigned long long) event->value.download.specifics.
189 progress.offset);
191#endif 190#endif
192 break; 191 break;
193 case GNUNET_FS_STATUS_PUBLISH_ERROR: 192 case GNUNET_FS_STATUS_PUBLISH_ERROR:
194 fprintf (stderr, 193 fprintf (stderr,
195 "Error publishing file: %s\n", 194 "Error publishing file: %s\n",
196 event->value.publish.specifics.error.message); 195 event->value.publish.specifics.error.message);
197 GNUNET_break (0); 196 GNUNET_break (0);
198 GNUNET_SCHEDULER_add_continuation (&abort_publish_task, 197 GNUNET_SCHEDULER_add_continuation (&abort_publish_task,
199 NULL, 198 NULL,
200 GNUNET_SCHEDULER_REASON_PREREQ_DONE); 199 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
201 break; 200 break;
202 case GNUNET_FS_STATUS_DOWNLOAD_ERROR: 201 case GNUNET_FS_STATUS_DOWNLOAD_ERROR:
203 fprintf (stderr, 202 fprintf (stderr,
204 "Error downloading file: %s\n", 203 "Error downloading file: %s\n",
205 event->value.download.specifics.error.message); 204 event->value.download.specifics.error.message);
206 GNUNET_SCHEDULER_add_now (&abort_download_task, 205 GNUNET_SCHEDULER_add_now (&abort_download_task, NULL);
207 NULL); 206 break;
208 break; 207 case GNUNET_FS_STATUS_DOWNLOAD_ACTIVE:
209 case GNUNET_FS_STATUS_DOWNLOAD_ACTIVE: 208 case GNUNET_FS_STATUS_DOWNLOAD_INACTIVE:
210 case GNUNET_FS_STATUS_DOWNLOAD_INACTIVE: 209 break;
211 break; 210 case GNUNET_FS_STATUS_PUBLISH_START:
212 case GNUNET_FS_STATUS_PUBLISH_START: 211 GNUNET_assert (0 == strcmp ("publish-context", event->value.publish.cctx));
213 GNUNET_assert (0 == strcmp ("publish-context", event->value.publish.cctx)); 212 GNUNET_assert (NULL == event->value.publish.pctx);
214 GNUNET_assert (NULL == event->value.publish.pctx); 213 GNUNET_assert (FILESIZE == event->value.publish.size);
215 GNUNET_assert (FILESIZE == event->value.publish.size); 214 GNUNET_assert (0 == event->value.publish.completed);
216 GNUNET_assert (0 == event->value.publish.completed); 215 GNUNET_assert (1 == event->value.publish.anonymity);
217 GNUNET_assert (1 == event->value.publish.anonymity); 216 break;
218 break; 217 case GNUNET_FS_STATUS_PUBLISH_STOPPED:
219 case GNUNET_FS_STATUS_PUBLISH_STOPPED: 218 GNUNET_assert (publish == event->value.publish.pc);
220 GNUNET_assert (publish == event->value.publish.pc); 219 GNUNET_assert (FILESIZE == event->value.publish.size);
221 GNUNET_assert (FILESIZE == event->value.publish.size); 220 GNUNET_assert (1 == event->value.publish.anonymity);
222 GNUNET_assert (1 == event->value.publish.anonymity); 221 GNUNET_SCHEDULER_add_now (&stop_fs_task, NULL);
223 GNUNET_SCHEDULER_add_now (&stop_fs_task, 222 break;
224 NULL); 223 case GNUNET_FS_STATUS_DOWNLOAD_START:
225 break; 224 GNUNET_assert (0 == strcmp ("download", event->value.download.cctx));
226 case GNUNET_FS_STATUS_DOWNLOAD_START: 225 GNUNET_assert (NULL == event->value.download.pctx);
227 GNUNET_assert (0 == strcmp ("download", event->value.download.cctx)); 226 GNUNET_assert (NULL != event->value.download.uri);
228 GNUNET_assert (NULL == event->value.download.pctx); 227 GNUNET_assert (0 == strcmp (fn, event->value.download.filename));
229 GNUNET_assert (NULL != event->value.download.uri); 228 GNUNET_assert (FILESIZE == event->value.download.size);
230 GNUNET_assert (0 == strcmp (fn, event->value.download.filename)); 229 GNUNET_assert (0 == event->value.download.completed);
231 GNUNET_assert (FILESIZE == event->value.download.size); 230 GNUNET_assert (1 == event->value.download.anonymity);
232 GNUNET_assert (0 == event->value.download.completed); 231 break;
233 GNUNET_assert (1 == event->value.download.anonymity); 232 case GNUNET_FS_STATUS_DOWNLOAD_STOPPED:
234 break; 233 GNUNET_assert (download == event->value.download.dc);
235 case GNUNET_FS_STATUS_DOWNLOAD_STOPPED: 234 GNUNET_SCHEDULER_add_continuation (&abort_publish_task,
236 GNUNET_assert (download == event->value.download.dc); 235 NULL,
237 GNUNET_SCHEDULER_add_continuation (&abort_publish_task, 236 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
238 NULL, 237 break;
239 GNUNET_SCHEDULER_REASON_PREREQ_DONE); 238 default:
240 break; 239 printf ("Unexpected event: %d\n", event->status);
241 default: 240 break;
242 printf ("Unexpected event: %d\n", 241 }
243 event->status);
244 break;
245 }
246 return NULL; 242 return NULL;
247} 243}
248 244
@@ -253,11 +249,11 @@ setup_peer (struct PeerContext *p, const char *cfgname)
253 p->cfg = GNUNET_CONFIGURATION_create (); 249 p->cfg = GNUNET_CONFIGURATION_create ();
254#if START_ARM 250#if START_ARM
255 p->arm_proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-service-arm", 251 p->arm_proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-service-arm",
256 "gnunet-service-arm", 252 "gnunet-service-arm",
257#if VERBOSE 253#if VERBOSE
258 "-L", "DEBUG", 254 "-L", "DEBUG",
259#endif 255#endif
260 "-c", cfgname, NULL); 256 "-c", cfgname, NULL);
261#endif 257#endif
262 GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); 258 GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname));
263} 259}
@@ -268,16 +264,17 @@ stop_arm (struct PeerContext *p)
268{ 264{
269#if START_ARM 265#if START_ARM
270 if (NULL != p->arm_proc) 266 if (NULL != p->arm_proc)
271 { 267 {
272 if (0 != GNUNET_OS_process_kill (p->arm_proc, SIGTERM)) 268 if (0 != GNUNET_OS_process_kill (p->arm_proc, SIGTERM))
273 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); 269 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
274 if (GNUNET_OS_process_wait(p->arm_proc) != GNUNET_OK) 270 if (GNUNET_OS_process_wait (p->arm_proc) != GNUNET_OK)
275 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "waitpid"); 271 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "waitpid");
276 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 272 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
277 "ARM process %u stopped\n", GNUNET_OS_process_get_pid (p->arm_proc)); 273 "ARM process %u stopped\n",
278 GNUNET_OS_process_close (p->arm_proc); 274 GNUNET_OS_process_get_pid (p->arm_proc));
279 p->arm_proc = NULL; 275 GNUNET_OS_process_close (p->arm_proc);
280 } 276 p->arm_proc = NULL;
277 }
281#endif 278#endif
282 GNUNET_CONFIGURATION_destroy (p->cfg); 279 GNUNET_CONFIGURATION_destroy (p->cfg);
283} 280}
@@ -286,8 +283,7 @@ stop_arm (struct PeerContext *p)
286static void 283static void
287run (void *cls, 284run (void *cls,
288 char *const *args, 285 char *const *args,
289 const char *cfgfile, 286 const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
290 const struct GNUNET_CONFIGURATION_Handle *cfg)
291{ 287{
292 const char *keywords[] = { 288 const char *keywords[] = {
293 "down_foo", 289 "down_foo",
@@ -302,12 +298,10 @@ run (void *cls,
302 298
303 setup_peer (&p1, "test_fs_download_data.conf"); 299 setup_peer (&p1, "test_fs_download_data.conf");
304 fs = GNUNET_FS_start (cfg, 300 fs = GNUNET_FS_start (cfg,
305 "test-fs-download", 301 "test-fs-download",
306 &progress_cb, 302 &progress_cb,
307 NULL, 303 NULL, GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END);
308 GNUNET_FS_FLAGS_NONE, 304 GNUNET_assert (NULL != fs);
309 GNUNET_FS_OPTIONS_END);
310 GNUNET_assert (NULL != fs);
311 buf = GNUNET_malloc (FILESIZE); 305 buf = GNUNET_malloc (FILESIZE);
312 for (i = 0; i < FILESIZE; i++) 306 for (i = 0; i < FILESIZE; i++)
313 buf[i] = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 256); 307 buf[i] = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 256);
@@ -316,26 +310,22 @@ run (void *cls,
316 bo.content_priority = 42; 310 bo.content_priority = 42;
317 bo.anonymity_level = 1; 311 bo.anonymity_level = 1;
318 bo.replication_level = 0; 312 bo.replication_level = 0;
319 bo.expiration_time = GNUNET_TIME_relative_to_absolute (LIFETIME); 313 bo.expiration_time = GNUNET_TIME_relative_to_absolute (LIFETIME);
320 fi = GNUNET_FS_file_information_create_from_data (fs, 314 fi = GNUNET_FS_file_information_create_from_data (fs,
321 "publish-context", 315 "publish-context",
322 FILESIZE, 316 FILESIZE,
323 buf, 317 buf,
324 kuri, 318 kuri, meta, GNUNET_NO, &bo);
325 meta,
326 GNUNET_NO,
327 &bo);
328 GNUNET_FS_uri_destroy (kuri); 319 GNUNET_FS_uri_destroy (kuri);
329 GNUNET_CONTAINER_meta_data_destroy (meta); 320 GNUNET_CONTAINER_meta_data_destroy (meta);
330 GNUNET_assert (NULL != fi); 321 GNUNET_assert (NULL != fi);
331 timeout_kill = GNUNET_SCHEDULER_add_delayed (TIMEOUT, 322 timeout_kill = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
332 &timeout_kill_task, 323 &timeout_kill_task, NULL);
333 NULL);
334 start = GNUNET_TIME_absolute_get (); 324 start = GNUNET_TIME_absolute_get ();
335 publish = GNUNET_FS_publish_start (fs, 325 publish = GNUNET_FS_publish_start (fs,
336 fi, 326 fi,
337 NULL, NULL, NULL, 327 NULL, NULL, NULL,
338 GNUNET_FS_PUBLISH_OPTION_NONE); 328 GNUNET_FS_PUBLISH_OPTION_NONE);
339 GNUNET_assert (publish != NULL); 329 GNUNET_assert (publish != NULL);
340} 330}
341 331
@@ -343,7 +333,7 @@ run (void *cls,
343int 333int
344main (int argc, char *argv[]) 334main (int argc, char *argv[])
345{ 335{
346 char *const argvx[] = { 336 char *const argvx[] = {
347 "test-fs-download", 337 "test-fs-download",
348 "-c", 338 "-c",
349 "test_fs_download_data.conf", 339 "test_fs_download_data.conf",
@@ -356,16 +346,15 @@ main (int argc, char *argv[])
356 GNUNET_GETOPT_OPTION_END 346 GNUNET_GETOPT_OPTION_END
357 }; 347 };
358 348
359 GNUNET_log_setup ("test_fs_download", 349 GNUNET_log_setup ("test_fs_download",
360#if VERBOSE 350#if VERBOSE
361 "DEBUG", 351 "DEBUG",
362#else 352#else
363 "WARNING", 353 "WARNING",
364#endif 354#endif
365 NULL); 355 NULL);
366 GNUNET_PROGRAM_run ((sizeof (argvx) / sizeof (char *)) - 1, 356 GNUNET_PROGRAM_run ((sizeof (argvx) / sizeof (char *)) - 1,
367 argvx, "test-fs-download", 357 argvx, "test-fs-download", "nohelp", options, &run, NULL);
368 "nohelp", options, &run, NULL);
369 stop_arm (&p1); 358 stop_arm (&p1);
370 GNUNET_DISK_directory_remove ("/tmp/gnunet-test-fs-download/"); 359 GNUNET_DISK_directory_remove ("/tmp/gnunet-test-fs-download/");
371 return err; 360 return err;