X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fidentity%2Ftest_identity.c;h=a1cb1dc6dd359aea530d735dfc4b5e175a934d86;hb=688bd873c3cb463090039f64b9f13b9a029695dc;hp=3712da3bda81aa1300fc6daedcb03f1a27e06e5d;hpb=4064deedf4ee722ba8adab7fd3030cea3e20297e;p=oweals%2Fgnunet.git diff --git a/src/identity/test_identity.c b/src/identity/test_identity.c index 3712da3bd..a1cb1dc6d 100644 --- a/src/identity/test_identity.c +++ b/src/identity/test_identity.c @@ -1,21 +1,19 @@ /* This file is part of GNUnet. - (C) 2013 Christian Grothoff (and other contributing authors) + Copyright (C) 2013, 2016 GNUnet e.V. - 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 free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + 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. + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ /** @@ -24,7 +22,6 @@ * @author Christian Grothoff */ #include "platform.h" -#include "gnunet_common.h" #include "gnunet_util_lib.h" #include "gnunet_identity_service.h" #include "gnunet_testing_lib.h" @@ -50,8 +47,8 @@ static struct GNUNET_IDENTITY_Operation *op; /** * Handle for task for timeout termination. - */ -static GNUNET_SCHEDULER_TaskIdentifier endbadly_task; + */ +static struct GNUNET_SCHEDULER_Task *endbadly_task; /** @@ -60,16 +57,16 @@ static GNUNET_SCHEDULER_TaskIdentifier endbadly_task; static void cleanup () { - if (NULL != h) - { - GNUNET_IDENTITY_disconnect (h); - h = NULL; - } if (NULL != op) { GNUNET_IDENTITY_cancel (op); op = NULL; } + if (NULL != h) + { + GNUNET_IDENTITY_disconnect (h); + h = NULL; + } GNUNET_SCHEDULER_shutdown (); } @@ -78,10 +75,9 @@ cleanup () * Termiante the testcase (failure). * * @param cls NULL - * @param tc scheduler context */ static void -endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +endbadly (void *cls) { cleanup (); res = 1; @@ -92,10 +88,9 @@ endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * Termiante the testcase (success). * * @param cls NULL - * @param tc scheduler context */ static void -end_normally (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +end_normally (void *cls) { cleanup (); res = 0; @@ -105,15 +100,15 @@ end_normally (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) /** * Finish the testcase (successfully). */ -static void +static void end () { - if (endbadly_task != GNUNET_SCHEDULER_NO_TASK) + if (NULL != endbadly_task) { GNUNET_SCHEDULER_cancel (endbadly_task); - endbadly_task = GNUNET_SCHEDULER_NO_TASK; + endbadly_task = NULL; } - GNUNET_SCHEDULER_add_now (&end, NULL); + GNUNET_SCHEDULER_shutdown (); } @@ -134,31 +129,142 @@ notification_cb (void *cls, void **ctx, const char *identifier) { + static struct GNUNET_IDENTITY_Ego *my_ego; + static int round; + + switch (round) + { + case 0: /* end of initial iteration */ + GNUNET_assert (NULL == ego); + GNUNET_assert (NULL == identifier); + break; + case 1: /* create */ + GNUNET_assert (NULL != ego); + GNUNET_assert (0 == strcmp (identifier, + "test-id")); + my_ego = ego; + *ctx = &round; + break; + case 2: /* rename */ + GNUNET_assert (my_ego == ego); + GNUNET_assert (0 == strcmp (identifier, + "test")); + GNUNET_assert (*ctx == &round); + break; + case 3: /* reconnect-down */ + GNUNET_assert (my_ego == ego); + GNUNET_assert (NULL == identifier); + GNUNET_assert (*ctx == &round); + *ctx = NULL; + break; + case 4: /* reconnect-up */ + GNUNET_assert (0 == strcmp (identifier, + "test")); + my_ego = ego; + *ctx = &round; + break; + case 5: /* end of iteration after reconnect */ + GNUNET_assert (NULL == ego); + GNUNET_assert (NULL == identifier); + break; + case 6: /* delete */ + GNUNET_assert (my_ego == ego); + GNUNET_assert (*ctx == &round); + *ctx = NULL; + break; + default: + GNUNET_break (0); + } + round++; } /** - * Called with events about created ego. + * Continuation called from successful delete operation. * * @param cls NULL - * @param ego ego handle - * @param ego_ctx context for application to store data for this ego - * (during the lifetime of this process, initially NULL) - * @param identifier identifier assigned by the user for this ego, - * NULL if the user just deleted the ego and it - * must thus no longer be used + * @param emsg (should also be NULL) */ static void -create_cb (void *cls, - struct GNUNET_IDENTITY_Ego *ego, - void **ctx, - const char *identifier) +delete_cont (void *cls, + const char *emsg) { op = NULL; - end (); /* yepee */ + GNUNET_assert (NULL == emsg); + end (); } +/** + * Continue by deleting the "test" identity. + * + * @param cls NULL + */ +static void +finally_delete (void *cls) +{ + op = GNUNET_IDENTITY_delete (h, + "test", + &delete_cont, + NULL); +} + + +/** + * Continuation called from expected-to-fail rename operation. + * + * @param cls NULL + * @param emsg (should also be NULL) + */ +static void +fail_rename_cont (void *cls, + const char *emsg) +{ + GNUNET_assert (NULL != emsg); + op = NULL; + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, + &finally_delete, + NULL); +} + + +/** + * Continuation called from successful rename operation. + * + * @param cls NULL + * @param emsg (should also be NULL) + */ +static void +success_rename_cont (void *cls, + const char *emsg) +{ + GNUNET_assert (NULL == emsg); + op = GNUNET_IDENTITY_rename (h, + "test-id", + "test", + &fail_rename_cont, + NULL); +} + + +/** + * Called with events about created ego. + * + * @param cls NULL + * @param emsg error message + */ +static void +create_cb (void *cls, + const char *emsg) +{ + GNUNET_assert (NULL == emsg); + op = GNUNET_IDENTITY_rename (h, + "test-id", + "test", + &success_rename_cont, + NULL); +} + /** * Main function of the test, run from scheduler. @@ -168,28 +274,33 @@ create_cb (void *cls, * @param peer handle to access more of the peer (not used) */ static void -run (void *cls, +run (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_TESTING_Peer *peer) { - endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, - &endbadly, NULL); - h = GNUNET_IDENTITY_connect (cfg, ¬ification_cb, NULL); + endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + &endbadly, + NULL); + GNUNET_SCHEDULER_add_shutdown (&end_normally, + NULL); + h = GNUNET_IDENTITY_connect (cfg, + ¬ification_cb, + NULL); + GNUNET_assert (NULL != h); op = GNUNET_IDENTITY_create (h, "test-id", &create_cb, NULL); - -} - +} int main (int argc, char *argv[]) { + GNUNET_DISK_directory_remove ("/tmp/test-identity-service"); res = 1; - if (0 != + if (0 != GNUNET_TESTING_service_run ("test-identity", "identity", "test_identity.conf",