diff options
author | Gabor X Toth <*@tg-x.net> | 2014-03-12 16:39:41 +0000 |
---|---|---|
committer | Gabor X Toth <*@tg-x.net> | 2014-03-12 16:39:41 +0000 |
commit | dbdb091b11204e1e1caaa3f4260bb6cf1168cbd2 (patch) | |
tree | 23d24f1cd487b68d0fcb30f015c4f7f6ef9a015d /src/psyc/test_psyc.c | |
parent | 1bf8c98f6d843f30e9abfa6dde31e31e50170c06 (diff) | |
download | gnunet-dbdb091b11204e1e1caaa3f4260bb6cf1168cbd2.tar.gz gnunet-dbdb091b11204e1e1caaa3f4260bb6cf1168cbd2.zip |
PSYC: in-order delivery of fragments; tests for large messages
Cache message received fragments from multicast and deliver them
in the correct order to clients.
Test messages with large modifier and data payloads.
Diffstat (limited to 'src/psyc/test_psyc.c')
-rw-r--r-- | src/psyc/test_psyc.c | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/src/psyc/test_psyc.c b/src/psyc/test_psyc.c index 88947be60..360d56c06 100644 --- a/src/psyc/test_psyc.c +++ b/src/psyc/test_psyc.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include "gnunet_env_lib.h" | 35 | #include "gnunet_env_lib.h" |
36 | #include "gnunet_psyc_service.h" | 36 | #include "gnunet_psyc_service.h" |
37 | 37 | ||
38 | #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10) | 38 | #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) |
39 | 39 | ||
40 | #define DEBUG_SERVICE 1 | 40 | #define DEBUG_SERVICE 1 |
41 | 41 | ||
@@ -72,6 +72,7 @@ struct TransmitClosure | |||
72 | char *data[16]; | 72 | char *data[16]; |
73 | const char *mod_value; | 73 | const char *mod_value; |
74 | size_t mod_value_size; | 74 | size_t mod_value_size; |
75 | uint8_t data_delay[16]; | ||
75 | uint8_t data_count; | 76 | uint8_t data_count; |
76 | uint8_t paused; | 77 | uint8_t paused; |
77 | uint8_t n; | 78 | uint8_t n; |
@@ -259,13 +260,16 @@ transmit_resume (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
259 | { | 260 | { |
260 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission resumed.\n"); | 261 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission resumed.\n"); |
261 | struct TransmitClosure *tmit = cls; | 262 | struct TransmitClosure *tmit = cls; |
262 | tmit->paused = GNUNET_NO; | 263 | if (NULL != tmit->mst_tmit) |
263 | GNUNET_PSYC_master_transmit_resume (tmit->mst_tmit); | 264 | GNUNET_PSYC_master_transmit_resume (tmit->mst_tmit); |
265 | else | ||
266 | GNUNET_PSYC_slave_transmit_resume (tmit->slv_tmit); | ||
264 | } | 267 | } |
265 | 268 | ||
266 | 269 | ||
267 | static int | 270 | static int |
268 | tmit_notify_mod (void *cls, uint16_t *data_size, void *data, uint8_t *oper) | 271 | tmit_notify_mod (void *cls, uint16_t *data_size, void *data, uint8_t *oper, |
272 | uint32_t *full_value_size) | ||
269 | { | 273 | { |
270 | struct TransmitClosure *tmit = cls; | 274 | struct TransmitClosure *tmit = cls; |
271 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 275 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -288,6 +292,8 @@ tmit_notify_mod (void *cls, uint16_t *data_size, void *data, uint8_t *oper) | |||
288 | return GNUNET_YES; | 292 | return GNUNET_YES; |
289 | } | 293 | } |
290 | 294 | ||
295 | GNUNET_assert (value_size < UINT32_MAX); | ||
296 | *full_value_size = value_size; | ||
291 | *oper = op; | 297 | *oper = op; |
292 | name_size = strlen (name); | 298 | name_size = strlen (name); |
293 | 299 | ||
@@ -351,7 +357,7 @@ tmit_notify_data (void *cls, uint16_t *data_size, void *data) | |||
351 | 357 | ||
352 | uint16_t size = strlen (tmit->data[tmit->n]); | 358 | uint16_t size = strlen (tmit->data[tmit->n]); |
353 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 359 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
354 | "Transmit notify data: %lu bytes available, " | 360 | "Transmit notify data: %u bytes available, " |
355 | "processing fragment %u/%u (size %u).\n", | 361 | "processing fragment %u/%u (size %u).\n", |
356 | *data_size, tmit->n + 1, tmit->data_count, size); | 362 | *data_size, tmit->n + 1, tmit->data_count, size); |
357 | if (*data_size < size) | 363 | if (*data_size < size) |
@@ -361,17 +367,18 @@ tmit_notify_data (void *cls, uint16_t *data_size, void *data) | |||
361 | return GNUNET_SYSERR; | 367 | return GNUNET_SYSERR; |
362 | } | 368 | } |
363 | 369 | ||
364 | if (GNUNET_YES == tmit->paused && tmit->n == tmit->data_count - 1) | 370 | if (GNUNET_YES != tmit->paused && 0 < tmit->data_delay[tmit->n]) |
365 | { | 371 | { |
366 | /* Send last fragment later. */ | ||
367 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission paused.\n"); | 372 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission paused.\n"); |
368 | tmit->paused = GNUNET_YES; | 373 | tmit->paused = GNUNET_YES; |
369 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply | 374 | GNUNET_SCHEDULER_add_delayed ( |
370 | (GNUNET_TIME_UNIT_SECONDS, 3), | 375 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, |
371 | &transmit_resume, tmit); | 376 | tmit->data_delay[tmit->n]), |
377 | &transmit_resume, tmit); | ||
372 | *data_size = 0; | 378 | *data_size = 0; |
373 | return GNUNET_NO; | 379 | return GNUNET_NO; |
374 | } | 380 | } |
381 | tmit->paused = GNUNET_NO; | ||
375 | 382 | ||
376 | *data_size = size; | 383 | *data_size = size; |
377 | memcpy (data, tmit->data[tmit->n], size); | 384 | memcpy (data, tmit->data[tmit->n], size); |
@@ -416,8 +423,9 @@ slave_join () | |||
416 | GNUNET_ENV_environment_add (env, GNUNET_ENV_OP_ASSIGN, | 423 | GNUNET_ENV_environment_add (env, GNUNET_ENV_OP_ASSIGN, |
417 | "_foo_bar", "foo bar baz", 11); | 424 | "_foo_bar", "foo bar baz", 11); |
418 | slv = GNUNET_PSYC_slave_join (cfg, &channel_pub_key, slave_key, &origin, | 425 | slv = GNUNET_PSYC_slave_join (cfg, &channel_pub_key, slave_key, &origin, |
419 | 16, relays, &slave_message, &join_request, &slave_joined, | 426 | 16, relays, &slave_message, &join_request, |
420 | NULL, "_request_join", env, "some data", 9); | 427 | &slave_joined, NULL, "_request_join", env, |
428 | "some data", 9); | ||
421 | GNUNET_ENV_environment_destroy (env); | 429 | GNUNET_ENV_environment_destroy (env); |
422 | } | 430 | } |
423 | 431 | ||
@@ -427,17 +435,45 @@ master_transmit () | |||
427 | { | 435 | { |
428 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Master sending message to all.\n"); | 436 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Master sending message to all.\n"); |
429 | test = TEST_MASTER_TRANSMIT; | 437 | test = TEST_MASTER_TRANSMIT; |
438 | uint32_t i, j; | ||
439 | |||
440 | char *name_max = "_test_max"; | ||
441 | uint8_t name_max_size = sizeof ("_test_max"); | ||
442 | char *val_max = GNUNET_malloc (GNUNET_PSYC_MODIFIER_MAX_PAYLOAD); | ||
443 | for (i = 0; i < GNUNET_PSYC_MODIFIER_MAX_PAYLOAD; i++) | ||
444 | val_max[i] = (0 == i % 10000) ? '0' + i / 10000 : '.'; | ||
445 | |||
446 | char *name_cont = "_test_cont"; | ||
447 | uint8_t name_cont_size = sizeof ("_test_cont"); | ||
448 | char *val_cont = GNUNET_malloc (GNUNET_PSYC_MODIFIER_MAX_PAYLOAD | ||
449 | + GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD); | ||
450 | for (i = 0; i < GNUNET_PSYC_MODIFIER_MAX_PAYLOAD - name_cont_size; i++) | ||
451 | val_cont[i] = (0 == i % 10000) ? '0' + i / 10000 : ':'; | ||
452 | for (j = 0; j < GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD; j++, i++) | ||
453 | val_cont[i] = (0 == j % 10000) ? '0' + j / 10000 : '!'; | ||
430 | 454 | ||
431 | tmit = GNUNET_new (struct TransmitClosure); | 455 | tmit = GNUNET_new (struct TransmitClosure); |
432 | tmit->env = GNUNET_ENV_environment_create (); | 456 | tmit->env = GNUNET_ENV_environment_create (); |
433 | GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN, | 457 | GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN, |
434 | "_foo", "bar baz", 7); | 458 | "_foo", "bar baz", 7); |
435 | GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN, | 459 | GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN, |
460 | name_max, val_max, | ||
461 | GNUNET_PSYC_MODIFIER_MAX_PAYLOAD | ||
462 | - name_max_size); | ||
463 | GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN, | ||
436 | "_foo_bar", "foo bar baz", 11); | 464 | "_foo_bar", "foo bar baz", 11); |
465 | GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN, | ||
466 | name_cont, val_cont, | ||
467 | GNUNET_PSYC_MODIFIER_MAX_PAYLOAD - name_cont_size | ||
468 | + GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD); | ||
437 | tmit->data[0] = "foo"; | 469 | tmit->data[0] = "foo"; |
438 | tmit->data[1] = "foo bar"; | 470 | tmit->data[1] = GNUNET_malloc (GNUNET_PSYC_DATA_MAX_PAYLOAD + 1); |
439 | tmit->data[2] = "foo bar baz"; | 471 | for (i = 0; i < GNUNET_PSYC_DATA_MAX_PAYLOAD; i++) |
440 | tmit->data_count = 3; | 472 | tmit->data[1][i] = (0 == i % 10000) ? '0' + i / 10000 : '_'; |
473 | tmit->data[2] = "foo bar"; | ||
474 | tmit->data[3] = "foo bar baz"; | ||
475 | tmit->data_delay[1] = 3; | ||
476 | tmit->data_count = 4; | ||
441 | tmit->mst_tmit | 477 | tmit->mst_tmit |
442 | = GNUNET_PSYC_master_transmit (mst, "_notice_test", tmit_notify_mod, | 478 | = GNUNET_PSYC_master_transmit (mst, "_notice_test", tmit_notify_mod, |
443 | tmit_notify_data, tmit, | 479 | tmit_notify_data, tmit, |