summaryrefslogtreecommitdiff
path: root/src/psyc/test_psyc.c
diff options
context:
space:
mode:
authorGabor X Toth <*@tg-x.net>2014-03-12 16:39:41 +0000
committerGabor X Toth <*@tg-x.net>2014-03-12 16:39:41 +0000
commitdbdb091b11204e1e1caaa3f4260bb6cf1168cbd2 (patch)
tree23d24f1cd487b68d0fcb30f015c4f7f6ef9a015d /src/psyc/test_psyc.c
parent1bf8c98f6d843f30e9abfa6dde31e31e50170c06 (diff)
downloadgnunet-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.c66
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
267static int 270static int
268tmit_notify_mod (void *cls, uint16_t *data_size, void *data, uint8_t *oper) 271tmit_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,