2 * This file is part of GNUnet
3 * Copyright (C) 2013 Christian Grothoff (and other contributing authors)
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 3, or (at your
8 * option) any later version.
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.
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., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
22 * @file psyc/test_psyc.c
23 * @brief Tests for the PSYC API.
24 * @author Gabor X Toth
25 * @author Christian Grothoff
31 #include "gnunet_crypto_lib.h"
32 #include "gnunet_common.h"
33 #include "gnunet_util_lib.h"
34 #include "gnunet_testing_lib.h"
35 #include "gnunet_env_lib.h"
36 #include "gnunet_psyc_util_lib.h"
37 #include "gnunet_psyc_service.h"
38 #include "gnunet_core_service.h"
40 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
43 * Return value from 'main'.
47 const struct GNUNET_CONFIGURATION_Handle *cfg;
49 struct GNUNET_CORE_Handle *core;
50 struct GNUNET_PeerIdentity this_peer;
53 * Handle for task for timeout termination.
55 struct GNUNET_SCHEDULER_Task * end_badly_task;
57 struct GNUNET_PSYC_Master *mst;
58 struct GNUNET_PSYC_Slave *slv;
60 struct GNUNET_PSYC_Channel *mst_chn, *slv_chn;
62 struct GNUNET_CRYPTO_EddsaPrivateKey *channel_key;
63 struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_key;
65 struct GNUNET_CRYPTO_EddsaPublicKey channel_pub_key;
66 struct GNUNET_CRYPTO_EcdsaPublicKey slave_pub_key;
68 struct TransmitClosure
70 struct GNUNET_PSYC_MasterTransmitHandle *mst_tmit;
71 struct GNUNET_PSYC_SlaveTransmitHandle *slv_tmit;
72 struct GNUNET_ENV_Environment *env;
73 struct GNUNET_ENV_Modifier *mod;
75 const char *mod_value;
76 size_t mod_value_size;
77 uint8_t data_delay[16];
83 struct TransmitClosure *tmit;
85 uint8_t join_req_count, end_count;
90 TEST_MASTER_START = 1,
91 TEST_SLAVE_JOIN_REJECT = 2,
92 TEST_SLAVE_JOIN_ACCEPT = 3,
94 TEST_SLAVE_REMOVE = 5,
95 TEST_SLAVE_TRANSMIT = 6,
96 TEST_MASTER_TRANSMIT = 7,
97 TEST_MASTER_HISTORY_REPLAY_LATEST = 8,
98 TEST_SLAVE_HISTORY_REPLAY_LATEST = 9,
99 TEST_MASTER_HISTORY_REPLAY = 10,
100 TEST_SLAVE_HISTORY_REPLAY = 11,
101 TEST_MASTER_STATE_GET = 12,
102 TEST_SLAVE_STATE_GET = 13,
103 TEST_MASTER_STATE_GET_PREFIX = 14,
104 TEST_SLAVE_STATE_GET_PREFIX = 15,
112 master_history_replay_latest ();
115 void master_stopped (void *cls)
119 GNUNET_ENV_environment_destroy (tmit->env);
123 GNUNET_SCHEDULER_shutdown ();
126 void slave_parted (void *cls)
130 GNUNET_PSYC_master_stop (mst, GNUNET_NO, &master_stopped, NULL);
134 master_stopped (NULL);
138 * Clean up all resources used.
145 GNUNET_CORE_disconnect (core);
150 GNUNET_PSYC_slave_part (slv, GNUNET_NO, &slave_parted, NULL);
159 * Terminate the test case (failure).
162 * @param tc scheduler context
165 end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
169 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Test FAILED.\n");
174 * Terminate the test case (success).
177 * @param tc scheduler context
180 end_normally (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
184 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Test PASSED.\n");
189 * Finish the test case (successfully).
194 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ending tests.\n");
196 if (end_badly_task != NULL)
198 GNUNET_SCHEDULER_cancel (end_badly_task);
199 end_badly_task = NULL;
201 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MILLISECONDS,
202 &end_normally, NULL);
207 master_message_cb (void *cls, uint64_t message_id, uint32_t flags,
208 const struct GNUNET_PSYC_MessageHeader *msg)
210 GNUNET_assert (NULL != msg);
211 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
212 "Test #%d: Master got PSYC message fragment of size %u "
213 "belonging to message ID %" PRIu64 " with flags %x\n",
214 test, ntohs (msg->header.size), message_id, flags);
220 master_message_part_cb (void *cls,
221 const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
222 uint64_t message_id, uint32_t flags, uint64_t data_offset,
223 const struct GNUNET_MessageHeader *msg)
227 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
228 "Error while receiving message %" PRIu64 "\n", message_id);
232 uint16_t type = ntohs (msg->type);
233 uint16_t size = ntohs (msg->size);
235 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
236 "Test #%d: Master got message part of type %u and size %u "
237 "belonging to message ID %" PRIu64 " with flags %x\n",
238 test, type, size, message_id, flags);
242 case TEST_SLAVE_TRANSMIT:
243 if (GNUNET_PSYC_MESSAGE_REQUEST != flags)
245 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
246 "Unexpected request flags: %x" PRIu32 "\n", flags);
250 // FIXME: check rest of message
252 if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END == type)
256 case TEST_MASTER_TRANSMIT:
257 if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END == type && 2 == ++end_count)
258 master_history_replay_latest ();
261 case TEST_MASTER_HISTORY_REPLAY:
262 case TEST_MASTER_HISTORY_REPLAY_LATEST:
263 if (GNUNET_PSYC_MESSAGE_HISTORIC != flags)
265 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
266 "Test #%d: Unexpected flags for historic message: %x" PRIu32 "\n",
280 slave_message_cb (void *cls, uint64_t message_id, uint32_t flags,
281 const struct GNUNET_PSYC_MessageHeader *msg)
283 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
284 "Test #%d: Slave got PSYC message fragment of size %u "
285 "belonging to message ID %" PRIu64 " with flags %x\n",
286 test, ntohs (msg->header.size), message_id, flags);
292 slave_message_part_cb (void *cls,
293 const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
294 uint64_t message_id, uint32_t flags, uint64_t data_offset,
295 const struct GNUNET_MessageHeader *msg)
299 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
300 "Error while receiving message " PRIu64 "\n", message_id);
304 uint16_t type = ntohs (msg->type);
305 uint16_t size = ntohs (msg->size);
307 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
308 "Test #%d: Slave got message part of type %u and size %u "
309 "belonging to message ID %" PRIu64 " with flags %x\n",
310 test, type, size, message_id, flags);
314 case TEST_MASTER_TRANSMIT:
315 if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END == type && 2 == ++end_count)
316 master_history_replay_latest ();
319 case TEST_SLAVE_HISTORY_REPLAY:
320 case TEST_SLAVE_HISTORY_REPLAY_LATEST:
321 if (GNUNET_PSYC_MESSAGE_HISTORIC != flags)
323 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
324 "Test #%d: Unexpected flags for historic message: %x" PRIu32 "\n",
338 state_get_var (void *cls, const struct GNUNET_MessageHeader *mod,
339 const char *name, const void *value,
340 uint32_t value_size, uint32_t full_value_size)
342 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
343 "Got state var: %s\n%.*s\n", name, value_size, value);
347 /*** Slave state_get_prefix() ***/
350 slave_state_get_prefix_result (void *cls, int64_t result,
351 const void *err_msg, uint16_t err_msg_size)
353 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
354 "slave_state_get_prefix:\t%" PRId64 " (%.s)\n",
355 result, err_msg_size, err_msg);
356 // FIXME: GNUNET_assert (2 == result);
362 slave_state_get_prefix ()
364 test = TEST_SLAVE_STATE_GET_PREFIX;
365 GNUNET_PSYC_channel_state_get_prefix (slv_chn, "_foo", state_get_var,
366 slave_state_get_prefix_result, NULL);
370 /*** Master state_get_prefix() ***/
374 master_state_get_prefix_result (void *cls, int64_t result,
375 const void *err_msg, uint16_t err_msg_size)
377 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
378 "master_state_get_prefix:\t%" PRId64 " (%s)\n", result, err_msg);
379 // FIXME: GNUNET_assert (2 == result);
380 slave_state_get_prefix ();
385 master_state_get_prefix ()
387 test = TEST_MASTER_STATE_GET_PREFIX;
388 GNUNET_PSYC_channel_state_get_prefix (mst_chn, "_foo", state_get_var,
389 master_state_get_prefix_result, NULL);
393 /*** Slave state_get() ***/
397 slave_state_get_result (void *cls, int64_t result,
398 const void *err_msg, uint16_t err_msg_size)
400 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
401 "slave_state_get:\t%" PRId64 " (%.*s)\n",
402 result, err_msg_size, err_msg);
403 // FIXME: GNUNET_assert (2 == result);
404 master_state_get_prefix ();
411 test = TEST_SLAVE_STATE_GET;
412 GNUNET_PSYC_channel_state_get (slv_chn, "_foo_bar_baz", state_get_var,
413 slave_state_get_result, NULL);
417 /*** Master state_get() ***/
421 master_state_get_result (void *cls, int64_t result,
422 const void *err_msg, uint16_t err_msg_size)
424 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
425 "master_state_get:\t%" PRId64 " (%.*s)\n",
426 result, err_msg_size, err_msg);
427 // FIXME: GNUNET_assert (1 == result);
435 test = TEST_MASTER_STATE_GET;
436 GNUNET_PSYC_channel_state_get (mst_chn, "_foo_bar_baz", state_get_var,
437 master_state_get_result, NULL);
441 /*** Slave history_replay() ***/
444 slave_history_replay_result (void *cls, int64_t result,
445 const void *err_msg, uint16_t err_msg_size)
447 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
448 "slave_history_replay:\t%" PRId64 " (%.*s)\n",
449 result, err_msg_size, err_msg);
450 GNUNET_assert (9 == result);
457 slave_history_replay ()
459 test = TEST_SLAVE_HISTORY_REPLAY;
460 GNUNET_PSYC_channel_history_replay (slv_chn, 1, 1, "",
461 GNUNET_PSYC_HISTORY_REPLAY_LOCAL,
463 slave_message_part_cb,
464 slave_history_replay_result, NULL);
468 /*** Master history_replay() ***/
472 master_history_replay_result (void *cls, int64_t result,
473 const void *err_msg, uint16_t err_msg_size)
475 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
476 "master_history_replay:\t%" PRId64 " (%.*s)\n",
477 result, err_msg_size, err_msg);
478 GNUNET_assert (9 == result);
480 slave_history_replay ();
485 master_history_replay ()
487 test = TEST_MASTER_HISTORY_REPLAY;
488 GNUNET_PSYC_channel_history_replay (mst_chn, 1, 1, "",
489 GNUNET_PSYC_HISTORY_REPLAY_LOCAL,
491 master_message_part_cb,
492 master_history_replay_result, NULL);
496 /*** Slave history_replay_latest() ***/
500 slave_history_replay_latest_result (void *cls, int64_t result,
501 const void *err_msg, uint16_t err_msg_size)
503 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
504 "slave_history_replay_latest:\t%" PRId64 " (%.*s)\n",
505 result, err_msg_size, err_msg);
506 GNUNET_assert (9 == result);
508 master_history_replay ();
513 slave_history_replay_latest ()
515 test = TEST_SLAVE_HISTORY_REPLAY_LATEST;
516 GNUNET_PSYC_channel_history_replay_latest (slv_chn, 1, "",
517 GNUNET_PSYC_HISTORY_REPLAY_LOCAL,
519 &slave_message_part_cb,
520 &slave_history_replay_latest_result,
525 /*** Master history_replay_latest() ***/
529 master_history_replay_latest_result (void *cls, int64_t result,
530 const void *err_msg, uint16_t err_msg_size)
532 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
533 "master_history_replay_latest:\t%" PRId64 " (%.*s)\n",
534 result, err_msg_size, err_msg);
535 GNUNET_assert (9 == result);
537 slave_history_replay_latest ();
542 master_history_replay_latest ()
544 test = TEST_MASTER_HISTORY_REPLAY_LATEST;
545 GNUNET_PSYC_channel_history_replay_latest (mst_chn, 1, "",
546 GNUNET_PSYC_HISTORY_REPLAY_LOCAL,
548 &master_message_part_cb,
549 &master_history_replay_latest_result,
555 transmit_resume (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
557 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission resumed.\n");
558 struct TransmitClosure *tmit = cls;
559 if (NULL != tmit->mst_tmit)
560 GNUNET_PSYC_master_transmit_resume (tmit->mst_tmit);
562 GNUNET_PSYC_slave_transmit_resume (tmit->slv_tmit);
567 tmit_notify_data (void *cls, uint16_t *data_size, void *data)
569 struct TransmitClosure *tmit = cls;
570 if (0 == tmit->data_count)
576 uint16_t size = strlen (tmit->data[tmit->n]);
577 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
578 "Transmit notify data: %u bytes available, "
579 "processing fragment %u/%u (size %u).\n",
580 *data_size, tmit->n + 1, tmit->data_count, size);
581 if (*data_size < size)
585 return GNUNET_SYSERR;
588 if (GNUNET_YES != tmit->paused && 0 < tmit->data_delay[tmit->n])
590 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission paused.\n");
591 tmit->paused = GNUNET_YES;
592 GNUNET_SCHEDULER_add_delayed (
593 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
594 tmit->data_delay[tmit->n]),
595 &transmit_resume, tmit);
599 tmit->paused = GNUNET_NO;
602 memcpy (data, tmit->data[tmit->n], size);
604 return ++tmit->n < tmit->data_count ? GNUNET_NO : GNUNET_YES;
609 tmit_notify_mod (void *cls, uint16_t *data_size, void *data, uint8_t *oper,
610 uint32_t *full_value_size)
612 struct TransmitClosure *tmit = cls;
613 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
614 "Transmit notify modifier: %lu bytes available, "
615 "%u modifiers left to process.\n",
616 *data_size, GNUNET_ENV_environment_get_count (tmit->env));
618 uint16_t name_size = 0;
619 size_t value_size = 0;
620 const char *value = NULL;
622 if (NULL != oper && NULL != tmit->mod)
624 tmit->mod = tmit->mod->next;
625 if (NULL == tmit->mod)
626 { /* No more modifiers, continue with data */
631 GNUNET_assert (tmit->mod->value_size < UINT32_MAX);
632 *full_value_size = tmit->mod->value_size;
633 *oper = tmit->mod->oper;
634 name_size = strlen (tmit->mod->name);
636 if (name_size + 1 + tmit->mod->value_size <= *data_size)
638 *data_size = name_size + 1 + tmit->mod->value_size;
642 tmit->mod_value_size = tmit->mod->value_size;
643 value_size = *data_size - name_size - 1;
644 tmit->mod_value_size -= value_size;
645 tmit->mod_value = tmit->mod->value + value_size;
648 memcpy (data, tmit->mod->name, name_size);
649 ((char *)data)[name_size] = '\0';
650 memcpy ((char *)data + name_size + 1, tmit->mod->value, value_size);
652 else if (NULL != tmit->mod_value && 0 < tmit->mod_value_size)
653 { /* Modifier continuation */
654 value = tmit->mod_value;
655 if (tmit->mod_value_size <= *data_size)
657 value_size = tmit->mod_value_size;
658 tmit->mod_value = NULL;
662 value_size = *data_size;
663 tmit->mod_value += value_size;
665 tmit->mod_value_size -= value_size;
667 if (*data_size < value_size)
669 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
670 "value larger than buffer: %u < %zu\n",
671 *data_size, value_size);
676 *data_size = value_size;
677 memcpy (data, value, value_size);
692 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Slave sending request to master.\n");
693 test = TEST_SLAVE_TRANSMIT;
695 tmit = GNUNET_new (struct TransmitClosure);
696 tmit->env = GNUNET_ENV_environment_create ();
697 GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN,
698 "_abc", "abc def", 7);
699 GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN,
700 "_abc_def", "abc def ghi", 11);
701 tmit->mod = GNUNET_ENV_environment_head (tmit->env);
703 tmit->data[0] = "slave test";
704 tmit->data_count = 1;
706 = GNUNET_PSYC_slave_transmit (slv, "_request_test", &tmit_notify_mod,
707 &tmit_notify_data, tmit,
708 GNUNET_PSYC_SLAVE_TRANSMIT_NONE);
713 slave_remove_cb (void *cls, int64_t result,
714 const void *err_msg, uint16_t err_msg_size)
716 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
717 "slave_remove:\t%" PRId64 " (%.*s)\n",
718 result, err_msg_size, err_msg);
727 test = TEST_SLAVE_REMOVE;
728 struct GNUNET_PSYC_Channel *chn = GNUNET_PSYC_master_get_channel (mst);
729 GNUNET_PSYC_channel_slave_remove (chn, &slave_pub_key, 2,
730 &slave_remove_cb, chn);
735 slave_add_cb (void *cls, int64_t result,
736 const void *err_msg, uint16_t err_msg_size)
738 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
739 "slave_add:\t%" PRId64 " (%.*s)\n",
740 result, err_msg_size, err_msg);
748 test = TEST_SLAVE_ADD;
749 struct GNUNET_PSYC_Channel *chn = GNUNET_PSYC_master_get_channel (mst);
750 GNUNET_PSYC_channel_slave_add (chn, &slave_pub_key, 2, 2, &slave_add_cb, chn);
754 void first_slave_parted (void *cls)
756 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "First slave parted.\n");
757 slave_join (TEST_SLAVE_JOIN_ACCEPT);
762 schedule_slave_part (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
764 GNUNET_PSYC_slave_part (slv, GNUNET_NO, first_slave_parted, NULL);
769 join_decision_cb (void *cls,
770 const struct GNUNET_PSYC_JoinDecisionMessage *dcsn,
772 const struct GNUNET_PSYC_Message *join_msg)
774 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
775 "Slave got join decision: %d\n", is_admitted);
779 case TEST_SLAVE_JOIN_REJECT:
780 GNUNET_assert (0 == is_admitted);
781 GNUNET_assert (1 == join_req_count);
782 GNUNET_SCHEDULER_add_now (schedule_slave_part, NULL);
785 case TEST_SLAVE_JOIN_ACCEPT:
786 GNUNET_assert (1 == is_admitted);
787 GNUNET_assert (2 == join_req_count);
798 join_request_cb (void *cls,
799 const struct GNUNET_PSYC_JoinRequestMessage *req,
800 const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
801 const struct GNUNET_PSYC_Message *join_msg,
802 struct GNUNET_PSYC_JoinHandle *jh)
804 struct GNUNET_HashCode slave_key_hash;
805 GNUNET_CRYPTO_hash (slave_key, sizeof (*slave_key), &slave_key_hash);
806 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
807 "Got join request #%u from %s.\n",
808 join_req_count, GNUNET_h2s (&slave_key_hash));
810 /* Reject first request */
811 int is_admitted = (0 < join_req_count++) ? GNUNET_YES : GNUNET_NO;
812 GNUNET_PSYC_join_decision (jh, is_admitted, 0, NULL, NULL);
817 slave_connect_cb (void *cls, int result, uint64_t max_message_id)
819 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
820 "Slave connected: %d, max_message_id: %" PRIu64 "\n",
821 result, max_message_id);
822 GNUNET_assert (TEST_SLAVE_JOIN_REJECT == test || TEST_SLAVE_JOIN_ACCEPT == test);
823 GNUNET_assert (GNUNET_OK == result || GNUNET_NO == result);
830 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Joining slave.\n");
833 struct GNUNET_PeerIdentity origin = this_peer;
834 struct GNUNET_ENV_Environment *env = GNUNET_ENV_environment_create ();
835 GNUNET_ENV_environment_add (env, GNUNET_ENV_OP_ASSIGN,
836 "_foo", "bar baz", 7);
837 GNUNET_ENV_environment_add (env, GNUNET_ENV_OP_ASSIGN,
838 "_foo_bar", "foo bar baz", 11);
839 struct GNUNET_PSYC_Message *
840 join_msg = GNUNET_PSYC_message_create ("_request_join", env, "some data", 9);
842 slv = GNUNET_PSYC_slave_join (cfg, &channel_pub_key, slave_key, &origin, 0, NULL,
843 &slave_message_cb, &slave_message_part_cb,
844 &slave_connect_cb, &join_decision_cb, NULL,
846 GNUNET_free (join_msg);
847 slv_chn = GNUNET_PSYC_slave_get_channel (slv);
848 GNUNET_ENV_environment_destroy (env);
855 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Master sending message to all.\n");
856 test = TEST_MASTER_TRANSMIT;
861 char *name_max = "_test_max";
862 uint8_t name_max_size = sizeof ("_test_max");
863 char *val_max = GNUNET_malloc (GNUNET_PSYC_MODIFIER_MAX_PAYLOAD);
864 for (i = 0; i < GNUNET_PSYC_MODIFIER_MAX_PAYLOAD; i++)
865 val_max[i] = (0 == i % 10000) ? '0' + i / 10000 : '.';
867 char *name_cont = "_test_cont";
868 uint8_t name_cont_size = sizeof ("_test_cont");
869 char *val_cont = GNUNET_malloc (GNUNET_PSYC_MODIFIER_MAX_PAYLOAD
870 + GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD);
871 for (i = 0; i < GNUNET_PSYC_MODIFIER_MAX_PAYLOAD - name_cont_size; i++)
872 val_cont[i] = (0 == i % 10000) ? '0' + i / 10000 : ':';
873 for (j = 0; j < GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD; j++, i++)
874 val_cont[i] = (0 == j % 10000) ? '0' + j / 10000 : '!';
876 tmit = GNUNET_new (struct TransmitClosure);
877 tmit->env = GNUNET_ENV_environment_create ();
878 GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN,
879 "_foo", "bar baz", 7);
880 GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN,
882 GNUNET_PSYC_MODIFIER_MAX_PAYLOAD
884 GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN,
885 "_foo_bar", "foo bar baz", 11);
886 GNUNET_ENV_environment_add (tmit->env, GNUNET_ENV_OP_ASSIGN,
888 GNUNET_PSYC_MODIFIER_MAX_PAYLOAD - name_cont_size
889 + GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD);
890 tmit->mod = GNUNET_ENV_environment_head (tmit->env);
891 tmit->data[0] = "foo";
892 tmit->data[1] = GNUNET_malloc (GNUNET_PSYC_DATA_MAX_PAYLOAD + 1);
893 for (i = 0; i < GNUNET_PSYC_DATA_MAX_PAYLOAD; i++)
894 tmit->data[1][i] = (0 == i % 10000) ? '0' + i / 10000 : '_';
895 tmit->data[2] = "foo bar";
896 tmit->data[3] = "foo bar baz";
897 tmit->data_delay[1] = 3;
898 tmit->data_count = 4;
900 = GNUNET_PSYC_master_transmit (mst, "_notice_test", &tmit_notify_mod,
901 &tmit_notify_data, tmit,
902 GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN);
907 master_start_cb (void *cls, int result, uint64_t max_message_id)
909 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
910 "Master started: %d, max_message_id: %" PRIu64 "\n",
911 result, max_message_id);
912 GNUNET_assert (TEST_MASTER_START == test);
913 GNUNET_assert (GNUNET_OK == result || GNUNET_NO == result);
914 slave_join (TEST_SLAVE_JOIN_REJECT);
921 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Starting master.\n");
922 test = TEST_MASTER_START;
923 mst = GNUNET_PSYC_master_start (cfg, channel_key, GNUNET_PSYC_CHANNEL_PRIVATE,
924 &master_start_cb, &join_request_cb,
925 &master_message_cb, &master_message_part_cb,
927 mst_chn = GNUNET_PSYC_master_get_channel (mst);
931 schedule_master_start (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
938 core_connected (void *cls, const struct GNUNET_PeerIdentity *my_identity)
940 this_peer = *my_identity;
945 /* Allow some time for the services to initialize. */
946 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
947 &schedule_master_start, NULL);
953 * Main function of the test, run from scheduler.
956 * @param cfg configuration we use (also to connect to PSYC service)
957 * @param peer handle to access more of the peer (not used)
961 run (void *cls, char *const *args, const char *cfgfile,
962 const struct GNUNET_CONFIGURATION_Handle *c)
965 const struct GNUNET_CONFIGURATION_Handle *c,
966 struct GNUNET_TESTING_Peer *peer)
970 end_badly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL);
972 channel_key = GNUNET_CRYPTO_eddsa_key_create ();
973 slave_key = GNUNET_CRYPTO_ecdsa_key_create ();
975 GNUNET_CRYPTO_eddsa_key_get_public (channel_key, &channel_pub_key);
976 GNUNET_CRYPTO_ecdsa_key_get_public (slave_key, &slave_pub_key);
978 core = GNUNET_CORE_connect (cfg, NULL, &core_connected, NULL, NULL,
979 NULL, GNUNET_NO, NULL, GNUNET_NO, NULL);
984 main (int argc, char *argv[])
988 const struct GNUNET_GETOPT_CommandLineOption opts[] = {
989 GNUNET_GETOPT_OPTION_END
991 if (GNUNET_OK != GNUNET_PROGRAM_run (argc, argv, "test-psyc",
992 "test-psyc [options]",
996 if (0 != GNUNET_TESTING_peer_run ("test-psyc", "test_psyc.conf", &run, NULL))
1002 /* end of test_psyc.c */