/*
- This file is part of GNUnet.
- (C) 2009, 2013 Christian Grothoff (and other contributing authors)
-
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
+ This file is part of GNUnet.
+ (C) 2009, 2013 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ */
/**
- * @file dv/test_transport_dv.c
- * @brief base testcase for testing distance vector transport
+ * @file revocation/test_revocation.c
+ * @brief base testcase for revocation exchange
*/
#include "platform.h"
#include "gnunet_core_service.h"
{
struct GNUNET_TESTBED_Peer *p;
struct GNUNET_TESTBED_Operation *identity_op;
+ struct GNUNET_TESTBED_Operation *core_op;
struct GNUNET_IDENTITY_Handle *idh;
const struct GNUNET_CONFIGURATION_Handle *cfg;
const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
struct GNUNET_CRYPTO_EcdsaSignature sig;
+ struct GNUNET_IDENTITY_Operation *create_id_op;
+ struct GNUNET_IDENTITY_EgoLookup *ego_lookup;
+ struct GNUNET_REVOCATION_Handle *revok_handle;
+ struct GNUNET_CORE_Handle *ch;
uint64_t pow;
};
-struct TestPeer testpeers[2];
-
+static struct TestPeer testpeers[2];
+static GNUNET_SCHEDULER_TaskIdentifier die_task;
/**
* Return value from main, set to 0 on success.
do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
int c;
+
+ if (GNUNET_SCHEDULER_NO_TASK != die_task)
+ {
+ GNUNET_SCHEDULER_cancel (die_task);
+ die_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+
for (c = 0; c < NUM_TEST_PEERS; c++)
{
- GNUNET_TESTBED_operation_done (testpeers[c].identity_op);
- testpeers[c].identity_op = NULL;
+ if (NULL != testpeers[c].create_id_op)
+ {
+ GNUNET_IDENTITY_cancel (testpeers[c].create_id_op);
+ testpeers[c].create_id_op = NULL;
+ }
+ if (NULL != testpeers[c].ego_lookup)
+ {
+ GNUNET_IDENTITY_ego_lookup_cancel (testpeers[c].ego_lookup);
+ testpeers[c].ego_lookup = NULL;
+ }
+
+ if (NULL != testpeers[c].revok_handle)
+ {
+ GNUNET_REVOCATION_revoke_cancel (testpeers[c].revok_handle);
+ testpeers[c].revok_handle = NULL;
+ }
+ if (NULL != testpeers[c].identity_op)
+ {
+ GNUNET_TESTBED_operation_done (testpeers[c].identity_op);
+ testpeers[c].identity_op = NULL;
+ }
+ if (NULL != testpeers[c].core_op)
+ {
+ GNUNET_TESTBED_operation_done (testpeers[c].core_op);
+ testpeers[c].core_op = NULL;
+ }
}
GNUNET_SCHEDULER_shutdown ();
ok = 0;
static void
do_shutdown_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
- do_shutdown (NULL, NULL);
+ if (GNUNET_SCHEDULER_NO_TASK != die_task)
+ die_task = GNUNET_SCHEDULER_NO_TASK;
+ do_shutdown (NULL, NULL );
ok = 1;
}
+
static void *
identity_connect_adapter (void *cls,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
struct TestPeer *me = cls;
me->cfg = cfg;
- me->idh = GNUNET_IDENTITY_connect(cfg, NULL, NULL);
+ me->idh = GNUNET_IDENTITY_connect (cfg, NULL, NULL );
if (NULL == me->idh)
- GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
- "Failed to create IDENTITY handle \n");
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to create IDENTITY handle \n");
return me->idh;
}
identity_disconnect_adapter (void *cls, void *op_result)
{
struct TestPeer *me = cls;
- GNUNET_IDENTITY_disconnect(me->idh);
+ GNUNET_IDENTITY_disconnect (me->idh);
me->idh = NULL;
}
-static void check_revocation ();
+static void
+check_revocation ();
-static void revocation_remote_cb (void *cls,
- int is_valid)
+static void
+revocation_remote_cb (void *cls, int is_valid)
{
static int repeat = 0;
- if (GNUNET_NO == is_valid)
+ if (GNUNET_NO == is_valid)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Local revocation successful\n");
- GNUNET_SCHEDULER_add_now(&do_shutdown, NULL);
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Local revocation successful\n");
+ GNUNET_SCHEDULER_add_now (&do_shutdown, NULL );
}
else if (repeat < 10)
{
- GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, &check_revocation, NULL);
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &check_revocation,
+ NULL );
}
else
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Flooding of revocation failed\n");
- GNUNET_SCHEDULER_add_now(&do_shutdown_badly, NULL);
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Flooding of revocation failed\n");
+ if (GNUNET_SCHEDULER_NO_TASK != die_task)
+ {
+ GNUNET_SCHEDULER_cancel (die_task);
+ die_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+ GNUNET_SCHEDULER_add_now (&do_shutdown_badly, NULL );
}
repeat++;
}
-static void check_revocation ()
+static void
+check_revocation ()
{
- GNUNET_REVOCATION_query (testpeers[0].cfg, &testpeers[1].pubkey, &revocation_remote_cb, NULL);
+ GNUNET_REVOCATION_query (testpeers[0].cfg, &testpeers[1].pubkey,
+ &revocation_remote_cb, NULL );
}
-static void revocation_cb (void *cls,
- int is_valid)
+static void
+revocation_cb (void *cls, int is_valid)
{
- if (GNUNET_NO == is_valid)
+ testpeers[1].revok_handle = NULL;
+ if (GNUNET_NO == is_valid)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Revocation successful\n");
- check_revocation();
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Revocation successful\n");
+ check_revocation ();
}
}
-static void ego_cb (void *cls, const struct GNUNET_IDENTITY_Ego *ego)
+static void
+ego_cb (void *cls, const struct GNUNET_IDENTITY_Ego *ego)
{
static int completed = 0;
if ((NULL != ego) && (cls == &testpeers[0]))
{
- testpeers[0].privkey = GNUNET_IDENTITY_ego_get_private_key(ego);
- GNUNET_IDENTITY_ego_get_public_key(ego, &testpeers[0].pubkey);
- completed ++;
+ testpeers[0].ego_lookup = NULL;
+ testpeers[0].privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
+ GNUNET_IDENTITY_ego_get_public_key (ego, &testpeers[0].pubkey);
+ completed++;
}
if ((NULL != ego) && (cls == &testpeers[1]))
{
- testpeers[1].privkey = GNUNET_IDENTITY_ego_get_private_key(ego);
- GNUNET_IDENTITY_ego_get_public_key(ego, &testpeers[1].pubkey);
- GNUNET_REVOCATION_sign_revocation(testpeers[1].privkey, &testpeers[1].sig);
+ testpeers[1].ego_lookup = NULL;
+ testpeers[1].privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
+ GNUNET_IDENTITY_ego_get_public_key (ego, &testpeers[1].pubkey);
+ GNUNET_REVOCATION_sign_revocation (testpeers[1].privkey, &testpeers[1].sig);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Calculating proof of work...\n");
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Calculating proof of work...\n");
testpeers[1].pow = 0;
- int res = GNUNET_REVOCATION_check_pow (&testpeers[1].pubkey, testpeers[1].pow, 5);
+ int res = GNUNET_REVOCATION_check_pow (&testpeers[1].pubkey,
+ testpeers[1].pow, 5);
while (GNUNET_OK != res)
{
testpeers[1].pow++;
- res = GNUNET_REVOCATION_check_pow (&testpeers[1].pubkey, testpeers[1].pow, 5);
+ res = GNUNET_REVOCATION_check_pow (&testpeers[1].pubkey, testpeers[1].pow,
+ 5);
}
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Done calculating proof of work\n");
- completed ++;
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Done calculating proof of work\n");
+ completed++;
}
if (2 == completed)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Egos retrieved\n");
- GNUNET_REVOCATION_revoke (testpeers[1].cfg, &testpeers[1].pubkey, &testpeers[1].sig, testpeers[1].pow, revocation_cb, NULL);
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Egos retrieved\n");
+ testpeers[1].revok_handle = GNUNET_REVOCATION_revoke (testpeers[1].cfg,
+ &testpeers[1].pubkey, &testpeers[1].sig, testpeers[1].pow,
+ revocation_cb, NULL );
}
}
-void identity_create_cb (void *cls, const char *emsg)
+void
+identity_create_cb (void *cls, const char *emsg)
{
static int completed = 0;
if ((NULL == emsg) && (cls == &testpeers[0]))
{
- completed ++;
+ testpeers[0].create_id_op = NULL;
+ completed++;
}
if ((NULL == emsg) && (cls == &testpeers[1]))
{
- completed ++;
+ testpeers[1].create_id_op = NULL;
+ completed++;
}
if (2 == completed)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Identities created\n");
- GNUNET_IDENTITY_ego_lookup (testpeers[0].cfg, "client", ego_cb, &testpeers[0]);
- GNUNET_IDENTITY_ego_lookup (testpeers[1].cfg, "toberevoked", ego_cb, &testpeers[1]);
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Identities created\n");
+ testpeers[0].ego_lookup = GNUNET_IDENTITY_ego_lookup (testpeers[0].cfg,
+ "client", ego_cb, &testpeers[0]);
+ testpeers[1].ego_lookup = GNUNET_IDENTITY_ego_lookup (testpeers[1].cfg,
+ "toberevoked", ego_cb, &testpeers[1]);
}
}
-
static void
identity_completion_cb (void *cls, struct GNUNET_TESTBED_Operation *op,
void *ca_result, const char *emsg)
{
static int completed = 0;
- completed ++;
+ completed++;
if (NUM_TEST_PEERS == completed)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connected to identity\n");
- GNUNET_IDENTITY_create (testpeers[0].idh, "client", identity_create_cb, &testpeers[0]);
- GNUNET_IDENTITY_create (testpeers[1].idh, "toberevoked", identity_create_cb, &testpeers[1]);
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Connected to identity\n");
+ testpeers[0].create_id_op = GNUNET_IDENTITY_create (testpeers[0].idh,
+ "client", identity_create_cb, &testpeers[0]);
+ testpeers[1].create_id_op = GNUNET_IDENTITY_create (testpeers[1].idh,
+ "toberevoked", identity_create_cb, &testpeers[1]);
}
}
+void static connect_cb (void *cls, const struct GNUNET_PeerIdentity *peer)
+{
+ static int connects = 0;
+ connects++;
+ if (4 == connects)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "All peers connected ...\n");
+
+ /* Connect to identity service */
+ testpeers[0].identity_op = GNUNET_TESTBED_service_connect (NULL,
+ testpeers[0].p, "identity", identity_completion_cb, NULL,
+ &identity_connect_adapter, &identity_disconnect_adapter,
+ &testpeers[0]);
+ testpeers[1].identity_op = GNUNET_TESTBED_service_connect (NULL,
+ testpeers[1].p, "identity", identity_completion_cb, NULL,
+ &identity_connect_adapter, &identity_disconnect_adapter,
+ &testpeers[1]);
+ }
+}
+
+
+static void
+core_completion_cb (void *cls, struct GNUNET_TESTBED_Operation *op,
+ void *ca_result, const char *emsg)
+{
+ static int completed = 0;
+ completed++;
+ if (NUM_TEST_PEERS == completed)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Connected to CORE\n");
+ }
+}
+
+
+static void *
+core_connect_adapter (void *cls,
+ const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+ struct TestPeer *me = cls;
+ me->cfg = cfg;
+ me->ch = GNUNET_CORE_connect (cfg, me, NULL, &connect_cb, NULL, NULL, GNUNET_NO, NULL, GNUNET_NO, NULL);
+ if (NULL == me->ch)
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to create CORE handle \n");
+ return me->ch;
+}
+
+
static void
-test_connection (void *cls,
- struct GNUNET_TESTBED_RunHandle *h,
- unsigned int num_peers,
- struct GNUNET_TESTBED_Peer **peers,
- unsigned int links_succeeded,
- unsigned int links_failed)
+core_disconnect_adapter (void *cls, void *op_result)
+{
+ struct TestPeer *me = cls;
+ GNUNET_CORE_disconnect (me->ch);
+ me->ch = NULL;
+}
+
+static void
+test_connection (void *cls, struct GNUNET_TESTBED_RunHandle *h,
+ unsigned int num_peers, struct GNUNET_TESTBED_Peer **peers,
+ unsigned int links_succeeded, unsigned int links_failed)
{
int c;
+
+ die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+ &do_shutdown_badly, NULL );
if (NUM_TEST_PEERS != num_peers)
{
ok = 1;
- fprintf (stderr, "Only %u out of 2 peers were started ...\n",
- num_peers);
+ fprintf (stderr, "Only %u out of 2 peers were started ...\n", num_peers);
}
if (0 == links_failed)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Testbed connected peers\n");
- for (c = 0; c< num_peers; c++)
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Testbed connected peers\n");
+ for (c = 0; c < num_peers; c++)
{
testpeers[c].p = peers[c];
- /* Connect to identity service */
- testpeers[c].identity_op = GNUNET_TESTBED_service_connect (NULL, testpeers[c].p,
- "identity", identity_completion_cb, NULL, &identity_connect_adapter,
- &identity_disconnect_adapter, &testpeers[c]);
+ testpeers[c].core_op = GNUNET_TESTBED_service_connect (NULL,
+ testpeers[c].p, "core", &core_completion_cb, NULL,
+ &core_connect_adapter, &core_disconnect_adapter,
+ &testpeers[c]);
}
}
}
-
int
main (int argc, char *argv[])
{
ok = 1;
/* Connecting initial topology */
- (void) GNUNET_TESTBED_test_run ("test-revocation",
- "test_revocation.conf",
- NUM_TEST_PEERS,
- 0, NULL, NULL,
- &test_connection, NULL);
+ (void) GNUNET_TESTBED_test_run ("test-revocation", "test_revocation.conf",
+ NUM_TEST_PEERS, 0, NULL, NULL, &test_connection, NULL );
return ok;
}
-/* end of test_transport_dv.c */
+/* end of test_revocation.c */