really make GNUNET_SCHEDULER_run_from_driver more graceful (must have been late)
[oweals/gnunet.git] / src / identity / test_identity.c
index 4677949f9def55ff2243c8b54b27980cb13bf0f5..7c88e0acebb7fa7227686ca0030d6634fd6fac1b 100644 (file)
@@ -1,6 +1,6 @@
 /*
      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
@@ -14,8 +14,8 @@
 
      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.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -24,7 +24,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 +49,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 +59,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 +77,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 +90,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 +102,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 +131,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;
+  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;
-  end (); /* yepee */
+  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,29 +276,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, &notification_cb, NULL);
+  endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
+                                               &endbadly,
+                                                NULL);
+  GNUNET_SCHEDULER_add_shutdown (&end_normally,
+                                 NULL);
+  h = GNUNET_IDENTITY_connect (cfg,
+                               &notification_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",