tighten formatting rules
[oweals/gnunet.git] / src / datastore / test_datastore_api.c
index 12f2ef762ee9cbca4d6599f6f13ca3215c510718..dbe590bab8a985d7b1519ab9e42c068a10c0d726 100644 (file)
@@ -2,21 +2,21 @@
      This file is part of GNUnet.
      Copyright (C) 2004, 2005, 2006, 2007, 2009, 2015 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.
+     Affero 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., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
-*/
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
 /*
  * @file datastore/test_datastore_api.c
  * @brief Test for the basic datastore API.
@@ -30,6 +30,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
 #include "gnunet_datastore_service.h"
+#include "gnunet_datastore_plugin.h"
 #include "gnunet_testing_lib.h"
 
 
@@ -129,8 +130,6 @@ enum RunPhase
   RP_PUT_MULTIPLE_NEXT = 8,
   RP_GET_MULTIPLE = 9,
   RP_GET_MULTIPLE_NEXT = 10,
-  RP_UPDATE = 11,
-  RP_UPDATE_VALIDATE = 12,
 
   /**
    * Execution failed with some kind of error.
@@ -157,8 +156,6 @@ struct CpsRunContext
   void *data;
   size_t size;
 
-  uint64_t uid;
-  uint64_t offset;
   uint64_t first_uid;
 };
 
@@ -168,11 +165,9 @@ struct CpsRunContext
  * depending on the current state.
  *
  * @param cls the `struct CpsRunContext`
- * @param tc scheduler context (unused)
  */
 static void
-run_continuation (void *cls,
-                  const struct GNUNET_SCHEDULER_TaskContext *tc);
+run_continuation (void *cls);
 
 
 /**
@@ -236,6 +231,7 @@ check_value (void *cls,
              enum GNUNET_BLOCK_Type type,
              uint32_t priority,
              uint32_t anonymity,
+             uint32_t replication,
              struct GNUNET_TIME_Absolute expiration,
              uint64_t uid)
 {
@@ -255,14 +251,14 @@ check_value (void *cls,
     return;
   }
 #if 0
-  FPRINTF (stderr,
-          "Check value got `%s' of size %u, type %d, expire %s\n",
+  fprintf (stderr,
+           "Check value got `%s' of size %u, type %d, expire %s\n",
            GNUNET_h2s (key), (unsigned int) size, type,
            GNUNET_STRINGS_absolute_time_to_string (expiration));
-  FPRINTF (stderr,
+  fprintf (stderr,
            "Check value iteration %d wants size %u, type %d, expire %s\n", i,
            (unsigned int) get_size (i), get_type (i),
-           GNUNET_STRINGS_absolute_time_to_string (get_expiration(i)));
+           GNUNET_STRINGS_absolute_time_to_string (get_expiration (i)));
 #endif
   GNUNET_assert (size == get_size (i));
   GNUNET_assert (0 == memcmp (data, get_data (i), size));
@@ -270,7 +266,6 @@ check_value (void *cls,
   GNUNET_assert (priority == get_priority (i));
   GNUNET_assert (anonymity == get_anonymity (i));
   GNUNET_assert (expiration.abs_value_us == get_expiration (i).abs_value_us);
-  crc->offset++;
   if (crc->i == 0)
   {
     crc->phase = RP_DEL;
@@ -289,6 +284,7 @@ delete_value (void *cls,
               enum GNUNET_BLOCK_Type type,
               uint32_t priority,
               uint32_t anonymity,
+              uint32_t replication,
               struct GNUNET_TIME_Absolute expiration,
               uint64_t uid)
 {
@@ -299,7 +295,7 @@ delete_value (void *cls,
   crc->size = size;
   crc->key = *key;
   crc->data = GNUNET_malloc (size);
-  memcpy (crc->data, data, size);
+  GNUNET_memcpy (crc->data, data, size);
   crc->phase = RP_DO_DEL;
   GNUNET_SCHEDULER_add_now (&run_continuation,
                             crc);
@@ -314,6 +310,7 @@ check_nothing (void *cls,
                enum GNUNET_BLOCK_Type type,
                uint32_t priority,
                uint32_t anonymity,
+               uint32_t replication,
                struct GNUNET_TIME_Absolute expiration,
                uint64_t uid)
 {
@@ -335,6 +332,7 @@ check_multiple (void *cls,
                 enum GNUNET_BLOCK_Type type,
                 uint32_t priority,
                 uint32_t anonymity,
+                uint32_t replication,
                 struct GNUNET_TIME_Absolute expiration,
                 uint64_t uid)
 {
@@ -346,45 +344,18 @@ check_multiple (void *cls,
   case RP_GET_MULTIPLE:
     crc->phase = RP_GET_MULTIPLE_NEXT;
     crc->first_uid = uid;
-    crc->offset++;
     break;
+
   case RP_GET_MULTIPLE_NEXT:
     GNUNET_assert (uid != crc->first_uid);
-    crc->phase = RP_UPDATE;
+    crc->phase = RP_DONE;
     break;
+
   default:
     GNUNET_break (0);
     crc->phase = RP_ERROR;
     break;
   }
-  if (priority == get_priority (42))
-    crc->uid = uid;
-  GNUNET_SCHEDULER_add_now (&run_continuation, crc);
-}
-
-
-static void
-check_update (void *cls,
-              const struct GNUNET_HashCode *key,
-              size_t size,
-              const void *data,
-              enum GNUNET_BLOCK_Type type,
-              uint32_t priority,
-              uint32_t anonymity,
-              struct GNUNET_TIME_Absolute expiration,
-              uint64_t uid)
-{
-  struct CpsRunContext *crc = cls;
-
-  GNUNET_assert (key != NULL);
-  if ((anonymity == get_anonymity (42)) && (size == get_size (42)) &&
-      (priority == get_priority (42) + 100))
-    crc->phase = RP_DONE;
-  else
-  {
-    GNUNET_assert (size == get_size (43));
-    crc->offset++;
-  }
   GNUNET_SCHEDULER_add_now (&run_continuation, crc);
 }
 
@@ -394,11 +365,9 @@ check_update (void *cls,
  * depending on the current state.
  *
  * @param cls the `struct CpsRunContext`
- * @param tc scheduler context (unused)
  */
 static void
-run_continuation (void *cls,
-                  const struct GNUNET_SCHEDULER_TaskContext *tc)
+run_continuation (void *cls)
 {
   struct CpsRunContext *crc = cls;
 
@@ -412,38 +381,55 @@ run_continuation (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Executing PUT number %u\n",
                 crc->i);
-    GNUNET_CRYPTO_hash (&crc->i, sizeof (int), &crc->key);
+    GNUNET_CRYPTO_hash (&crc->i, sizeof(int), &crc->key);
     GNUNET_DATASTORE_put (datastore, 0, &crc->key, get_size (crc->i),
                           get_data (crc->i), get_type (crc->i),
                           get_priority (crc->i), get_anonymity (crc->i), 0,
-                          get_expiration (crc->i), 1, 1, TIMEOUT,
+                          get_expiration (crc->i), 1, 1,
                           &check_success, crc);
     crc->i++;
     if (crc->i == ITERATIONS)
       crc->phase = RP_GET;
     break;
+
   case RP_GET:
     crc->i--;
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Executing GET number %u\n",
                 crc->i);
-    GNUNET_CRYPTO_hash (&crc->i, sizeof (int), &crc->key);
-    GNUNET_DATASTORE_get_key (datastore, crc->offset, &crc->key,
-                              get_type (crc->i), 1, 1, TIMEOUT,
-                              &check_value, crc);
+    GNUNET_CRYPTO_hash (&crc->i,
+                        sizeof(int),
+                        &crc->key);
+    GNUNET_DATASTORE_get_key (datastore,
+                              0,
+                              false,
+                              &crc->key,
+                              get_type (crc->i),
+                              1,
+                              1,
+                              &check_value,
+                              crc);
     break;
+
   case RP_DEL:
     crc->i--;
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Executing DEL number %u\n",
                 crc->i);
     crc->data = NULL;
-    GNUNET_CRYPTO_hash (&crc->i, sizeof (int), &crc->key);
+    GNUNET_CRYPTO_hash (&crc->i, sizeof(int), &crc->key);
     GNUNET_assert (NULL !=
-                   GNUNET_DATASTORE_get_key (datastore, crc->offset, &crc->key,
-                                             get_type (crc->i), 1, 1, TIMEOUT,
-                                             &delete_value, crc));
+                   GNUNET_DATASTORE_get_key (datastore,
+                                             0,
+                                             false,
+                                             &crc->key,
+                                             get_type (crc->i),
+                                             1,
+                                             1,
+                                             &delete_value,
+                                             crc));
     break;
+
   case RP_DO_DEL:
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Executing DO_DEL number %u\n",
@@ -459,32 +445,42 @@ run_continuation (void *cls,
     }
     GNUNET_assert (NULL !=
                    GNUNET_DATASTORE_remove (datastore, &crc->key, crc->size,
-                                            crc->data, 1, 1, TIMEOUT,
+                                            crc->data, 1, 1,
                                             &check_success, crc));
     break;
+
   case RP_DELVALIDATE:
     crc->i--;
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Executing DELVALIDATE number %u\n",
                 crc->i);
-    GNUNET_CRYPTO_hash (&crc->i, sizeof (int), &crc->key);
+    GNUNET_CRYPTO_hash (&crc->i, sizeof(int), &crc->key);
     GNUNET_assert (NULL !=
-                   GNUNET_DATASTORE_get_key (datastore, crc->offset, &crc->key,
-                                             get_type (crc->i), 1, 1, TIMEOUT,
-                                             &check_nothing, crc));
+                   GNUNET_DATASTORE_get_key (datastore,
+                                             0,
+                                             false,
+                                             &crc->key,
+                                             get_type (crc->i),
+                                             1,
+                                             1,
+                                             &check_nothing,
+                                             crc));
     break;
+
   case RP_RESERVE:
     crc->phase = RP_PUT_MULTIPLE;
     GNUNET_DATASTORE_reserve (datastore, 128 * 1024, 2,
                               &get_reserved, crc);
     break;
+
   case RP_PUT_MULTIPLE:
     crc->phase = RP_PUT_MULTIPLE_NEXT;
     GNUNET_DATASTORE_put (datastore, crc->rid, &crc->key, get_size (42),
                           get_data (42), get_type (42), get_priority (42),
                           get_anonymity (42), 0, get_expiration (42), 1, 1,
-                          TIMEOUT, &check_success, crc);
+                          &check_success, crc);
     break;
+
   case RP_PUT_MULTIPLE_NEXT:
     crc->phase = RP_GET_MULTIPLE;
     GNUNET_DATASTORE_put (datastore, crc->rid,
@@ -497,47 +493,35 @@ run_continuation (void *cls,
                           0,
                           get_expiration (43),
                           1, 1,
-                          TIMEOUT,
                           &check_success, crc);
     break;
+
   case RP_GET_MULTIPLE:
     GNUNET_assert (NULL !=
                    GNUNET_DATASTORE_get_key (datastore,
-                                             crc->offset,
-                                             &crc->key,
-                                             get_type (42), 1, 1,
-                                             TIMEOUT,
-                                             &check_multiple, crc));
-    break;
-  case RP_GET_MULTIPLE_NEXT:
-    GNUNET_assert (NULL !=
-                   GNUNET_DATASTORE_get_key (datastore,
-                                             crc->offset,
+                                             0,
+                                             false,
                                              &crc->key,
                                              get_type (42),
-                                             1, 1,
-                                             TIMEOUT,
-                                             &check_multiple, crc));
-    break;
-  case RP_UPDATE:
-    GNUNET_assert (crc->uid > 0);
-    crc->phase = RP_UPDATE_VALIDATE;
-    GNUNET_DATASTORE_update (datastore,
-                             crc->uid, 100,
-                             get_expiration (42), 1,
-                             1, TIMEOUT,
-                             &check_success, crc);
+                                             1,
+                                             1,
+                                             &check_multiple,
+                                             crc));
     break;
-  case RP_UPDATE_VALIDATE:
+
+  case RP_GET_MULTIPLE_NEXT:
     GNUNET_assert (NULL !=
                    GNUNET_DATASTORE_get_key (datastore,
-                                             crc->offset,
+                                             crc->first_uid + 1,
+                                             false,
                                              &crc->key,
                                              get_type (42),
-                                             1, 1,
-                                             TIMEOUT,
-                                             &check_update, crc));
+                                             1,
+                                             1,
+                                             &check_multiple,
+                                             crc));
     break;
+
   case RP_DONE:
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Finished, disconnecting\n");
@@ -546,6 +530,7 @@ run_continuation (void *cls,
     GNUNET_free (crc);
     ok = 0;
     break;
+
   case RP_ERROR:
     GNUNET_DATASTORE_disconnect (datastore,
                                  GNUNET_YES);
@@ -582,21 +567,24 @@ run_tests (void *cls,
     GNUNET_SCHEDULER_add_now (&run_continuation,
                               crc);
     return;
+
   case GNUNET_NO:
-    FPRINTF (stderr,
+    fprintf (stderr,
              "%s", "Test 'put' operation failed, key already exists (!?)\n");
     GNUNET_DATASTORE_disconnect (datastore,
                                  GNUNET_YES);
     GNUNET_free (crc);
     return;
+
   case GNUNET_SYSERR:
-    FPRINTF (stderr,
+    fprintf (stderr,
              "Test 'put' operation failed with error `%s' database likely not setup, skipping test.\n",
              msg);
     GNUNET_DATASTORE_disconnect (datastore,
                                  GNUNET_YES);
     GNUNET_free (crc);
     return;
+
   default:
     GNUNET_assert (0);
   }
@@ -633,12 +621,11 @@ run (void *cls,
                             GNUNET_BLOCK_TYPE_TEST,
                             0, 0, 0,
                             GNUNET_TIME_relative_to_absolute
-                            (GNUNET_TIME_UNIT_SECONDS),
+                              (GNUNET_TIME_UNIT_SECONDS),
                             0, 1,
-                            TIMEOUT,
                             &run_tests, crc))
   {
-    FPRINTF (stderr,
+    fprintf (stderr,
              "%s",
              "Test 'put' operation failed.\n");
     ok = 1;
@@ -647,6 +634,66 @@ run (void *cls,
 }
 
 
+/**
+ * Function invoked to notify service of disk utilization
+ * changes.
+ *
+ * @param cls closure
+ * @param delta change in disk utilization,
+ *        0 for "reset to empty"
+ */
+static void
+duc_dummy (void *cls,
+           int delta)
+{
+  /* intentionally empty */
+}
+
+
+/**
+ * check if plugin is actually working
+ */
+static int
+test_plugin (const char *cfg_name)
+{
+  char libname[128];
+  struct GNUNET_CONFIGURATION_Handle *cfg;
+  struct GNUNET_DATASTORE_PluginFunctions *api;
+  struct GNUNET_DATASTORE_PluginEnvironment env;
+
+  cfg = GNUNET_CONFIGURATION_create ();
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_load (cfg,
+                                 cfg_name))
+  {
+    GNUNET_CONFIGURATION_destroy (cfg);
+    fprintf (stderr,
+             "Failed to load configuration %s\n",
+             cfg_name);
+    return 1;
+  }
+  memset (&env, 0, sizeof(env));
+  env.cfg = cfg;
+  env.duc = &duc_dummy;
+  GNUNET_snprintf (libname,
+                   sizeof(libname),
+                   "libgnunet_plugin_datastore_%s",
+                   plugin_name);
+  api = GNUNET_PLUGIN_load (libname, &env);
+  if (NULL == api)
+  {
+    GNUNET_CONFIGURATION_destroy (cfg);
+    fprintf (stderr,
+             "Failed to load plugin `%s'\n",
+             libname);
+    return 77;
+  }
+  GNUNET_PLUGIN_unload (libname, api);
+  GNUNET_CONFIGURATION_destroy (cfg);
+  return 0;
+}
+
+
 /**
  * Entry point into the test. Determines which configuration / plugin
  * we are running with based on the name of the binary and starts
@@ -660,20 +707,26 @@ int
 main (int argc,
       char *argv[])
 {
-  char cfg_name[128];
+  char cfg_name[PATH_MAX];
+  int ret;
 
   plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
   GNUNET_snprintf (cfg_name,
-                   sizeof (cfg_name),
+                   sizeof(cfg_name),
                    "test_datastore_api_data_%s.conf",
                    plugin_name);
+  ret = test_plugin (cfg_name);
+  if (0 != ret)
+    return ret;
+  /* run actual test */
   if (0 !=
       GNUNET_TESTING_peer_run ("test-gnunet-datastore",
-                              cfg_name,
-                              &run,
-                              NULL))
+                               cfg_name,
+                               &run,
+                               NULL))
     return 1;
   return ok;
 }
 
+
 /* end of test_datastore_api.c */