2 * This file is part of GNUnet
3 * Copyright (C) 2013 GNUnet e.V.
5 * GNUnet is free software: you can redistribute it and/or modify it
6 * under the terms of the GNU Affero General Public License as published
7 * by the Free Software Foundation, either version 3 of the License,
8 * or (at your 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 * Affero General Public License for more details.
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * @file psyc/test_psyc_api_join.c
21 * @brief Testbed test for the PSYC API.
27 * - define topology in config
28 * - psyc slave join needs part to end (same with master)
29 * - GNUNET_SCHEDULER_add_delayed return value will outdate at call time
30 * - main can not contain GNUNET_log()
34 #include "gnunet_crypto_lib.h"
35 #include "gnunet_common.h"
36 #include "gnunet_util_lib.h"
37 #include "gnunet_testbed_service.h"
38 #include "gnunet_psyc_util_lib.h"
39 #include "gnunet_psyc_service.h"
40 #include "psyc_test_lib.h"
42 static struct pctx PEERS[2];
48 shutdown_task (void *cls)
50 if (NULL != timeout_task_id) {
51 GNUNET_SCHEDULER_cancel (timeout_task_id);
52 timeout_task_id = NULL;
55 for (int i=0;i<2;i++) {
56 GNUNET_free (PEERS[i].channel_pub_key);
58 if (NULL != PEERS[i].psyc)
61 GNUNET_PSYC_master_stop (PEERS[i].psyc, GNUNET_NO, NULL, NULL);
63 GNUNET_PSYC_slave_part (PEERS[i].psyc, GNUNET_NO, NULL, NULL);
67 for (int i=0;i<MAX_TESTBED_OPS;i++)
69 GNUNET_TESTBED_operation_done (op[i]);
71 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shut down!\n");
75 timeout_task (void *cls)
77 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Timeout!\n");
79 timeout_task_id = NULL;
81 result = GNUNET_SYSERR;
82 GNUNET_SCHEDULER_shutdown ();
86 join_decision_cb (void *cls,
87 const struct GNUNET_PSYC_JoinDecisionMessage *dcsn,
89 const struct GNUNET_PSYC_Message *join_msg)
91 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
92 "slave: got join decision: %s\n",
93 (GNUNET_YES == is_admitted) ? "admitted":"rejected");
95 result = (GNUNET_YES == is_admitted) ? GNUNET_OK : GNUNET_SYSERR;
97 GNUNET_SCHEDULER_shutdown ();
101 join_request_cb (void *cls,
102 const struct GNUNET_PSYC_JoinRequestMessage *req,
103 const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
104 const struct GNUNET_PSYC_Message *join_msg,
105 struct GNUNET_PSYC_JoinHandle *jh)
107 struct GNUNET_HashCode slave_key_hash;
109 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "master: got join request.\n");
111 GNUNET_CRYPTO_hash (slave_key, sizeof (*slave_key), &slave_key_hash);
113 GNUNET_PSYC_join_decision (jh, GNUNET_YES, 0, NULL, NULL);
119 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "disconnect form PSYC service\n");
123 psyc_ca (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
125 struct pctx *peer = (struct pctx*) cls;
128 if (0 == peer->idx) {
129 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connecting to PSYC as master ...\n");
131 peer->psyc = (struct GNUNET_PSYC_Master *)
132 GNUNET_PSYC_master_start (cfg,
134 GNUNET_PSYC_CHANNEL_PRIVATE,
143 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connecting to PSYC as slave ...\n");
145 struct GNUNET_PSYC_Environment *env = GNUNET_PSYC_env_create ();
146 GNUNET_PSYC_env_add (env, GNUNET_PSYC_OP_ASSIGN, "_foo", "bar baz", 7);
147 GNUNET_PSYC_env_add (env, GNUNET_PSYC_OP_ASSIGN, "_foo_bar", "foo bar baz", 11);
149 struct GNUNET_PSYC_Message *
150 join_msg = GNUNET_PSYC_message_create ("_request_join", env, "some data", 40);
152 peer->psyc = (struct GNUNET_PSYC_Slave *)
153 GNUNET_PSYC_slave_join (cfg,
154 peer->channel_pub_key,
156 GNUNET_PSYC_SLAVE_JOIN_NONE,
157 peer->peer_id_master,
167 GNUNET_free (join_msg);
168 peer->channel = GNUNET_PSYC_slave_get_channel (peer->psyc);
169 GNUNET_PSYC_env_destroy (env);
175 service_connect (void *cls,
176 struct GNUNET_TESTBED_Operation *op,
180 GNUNET_assert (NULL != ca_result);
182 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connected to the service\n");
186 connect_to_services (void *cls)
188 for (int i = 0; i < 2; i++)
190 PEERS[i].peer_id_master = PEERS[0].peer_id;
193 GNUNET_TESTBED_service_connect (NULL, PEERS[i].testbed_peer, "psyc",
194 &service_connect, &PEERS[i], &psyc_ca,
195 &psyc_da, &PEERS[i]);
201 struct GNUNET_TESTBED_Operation *operation,
202 const struct GNUNET_TESTBED_PeerInformation *pinfo,
205 struct pctx *peer = (struct pctx*) cls;
207 peer->peer_id = pinfo->result.id;
212 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Got all IDs, starting test\n");
214 GNUNET_SCHEDULER_add_now (&connect_to_services, NULL);
218 testbed_master (void *cls,
219 struct GNUNET_TESTBED_RunHandle *h,
220 unsigned int num_peers,
221 struct GNUNET_TESTBED_Peer **p,
222 unsigned int links_succeeded,
223 unsigned int links_failed)
225 struct GNUNET_CRYPTO_EddsaPrivateKey *channel_key = NULL;
227 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connected to testbed_master\n");
229 // Set up shutdown logic
230 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
232 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 15),
233 &timeout_task, NULL);
234 GNUNET_assert (NULL != timeout_task_id);
236 // Set up channel key
237 channel_key = GNUNET_CRYPTO_eddsa_key_create ();
238 GNUNET_assert (NULL != channel_key);
240 // Set up information contexts for peers
241 for (int i=0 ; i < 2 ; i++)
244 PEERS[i].testbed_peer = p[i];
247 PEERS[i].id_key = GNUNET_CRYPTO_ecdsa_key_create ();
249 // Set up channel keys shared by master and slave
250 PEERS[i].channel_key = channel_key;
252 PEERS[i].channel_pub_key =
253 GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EddsaPublicKey));
255 GNUNET_CRYPTO_eddsa_key_get_public (PEERS[i].channel_key,
256 PEERS[i].channel_pub_key);
259 GNUNET_TESTBED_peer_get_information (p[i],
260 GNUNET_TESTBED_PIT_IDENTITY,
261 pinfo_cb, &PEERS[i]);
266 main (int argc, char *argv[])
270 ret = GNUNET_TESTBED_test_run ("test_psyc_api_join", "test_psyc.conf",
272 &testbed_master, NULL);
274 if ( (GNUNET_OK != ret) || (GNUNET_OK != result) )
280 /* end of test_psyc_api_join.c */