WiP
[oweals/gnunet.git] / src / dht / test_dht_twopeer_put_get.c
index 1aa83716b0a2f9bd700561691bbbe8cfe722728d..40a1652362469365c6ab5cde32ca929e07d290c4 100644 (file)
@@ -40,6 +40,8 @@
 #include "gnunet_testing_lib.h"
 #include "gnunet_core_service.h"
 #include "gnunet_dht_service.h"
+#include "block_dns.h"
+#include "gnunet_signatures.h"
 
 /* DEFINES */
 #define VERBOSE GNUNET_NO
@@ -53,6 +55,8 @@
 /* If number of peers not in config file, use this number */
 #define DEFAULT_NUM_PEERS 2
 
+#define DNS GNUNET_NO
+
 /* Globals */
 
 /**
@@ -80,10 +84,6 @@ static struct GNUNET_TESTING_PeerGroup *pg;
  */
 struct GNUNET_DHT_GetHandle *global_get_handle;
 
-/**
- * Global scheduler, used for all GNUNET_SCHEDULER_* functions.
- */
-static struct GNUNET_SCHEDULER_Handle *sched;
 
 /**
  * Total number of peers to run, set based on config file.
@@ -110,6 +110,10 @@ GNUNET_SCHEDULER_TaskIdentifier die_task;
 /* Global return value (0 for success, anything else for failure) */
 static int ok;
 
+#if DNS
+struct GNUNET_DNS_Record data;
+#endif
+
 /**
  * Peer identity of the first peer started.
  */
@@ -190,7 +194,7 @@ end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
       GNUNET_DHT_get_stop(global_get_handle);
       global_get_handle = NULL;
     }
-  GNUNET_SCHEDULER_add_now(sched, &end_badly_cont, NULL);
+  GNUNET_SCHEDULER_add_now(&end_badly_cont, NULL);
   ok = 1;
 }
 
@@ -211,25 +215,34 @@ void get_result_iterator (void *cls,
                          const struct GNUNET_PeerIdentity * const *put_path,
                          enum GNUNET_BLOCK_Type type,
                           size_t size,
-                          const void *data)
+                          const void *result_data)
 {
   GNUNET_HashCode original_key; /* Key data was stored data under */
   char original_data[4]; /* Made up data that was stored */
   memset(&original_key, 42, sizeof(GNUNET_HashCode)); /* Set the key to what it was set to previously */
   memset(original_data, 43, sizeof(original_data));
 
-  if ((0 != memcmp(&original_key, key, sizeof (GNUNET_HashCode))) || (0 != memcmp(original_data, data, sizeof(original_data))))
+#if DNS
+  if ((0 != memcmp(&data.service_descriptor, key, sizeof (GNUNET_HashCode))) || (0 != memcmp((char *)&data, result_data, sizeof(original_data))))
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Key or data is not the same as was inserted!\n");
+      GNUNET_SCHEDULER_cancel(die_task);
+      GNUNET_SCHEDULER_add_now(&end_badly, "key or data mismatch in get response!\n");
+      return;
+    }
+#else
+  if ((0 != memcmp(&original_key, key, sizeof (GNUNET_HashCode))) || (0 != memcmp(original_data, result_data, sizeof(original_data))))
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Key or data is not the same as was inserted!\n");
-    GNUNET_SCHEDULER_cancel(sched, die_task);
-    GNUNET_SCHEDULER_add_now(sched, &end_badly, "key or data mismatch in get response!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Key or data is not the same as was inserted!\n");
+    GNUNET_SCHEDULER_cancel(die_task);
+    GNUNET_SCHEDULER_add_now(&end_badly, "key or data mismatch in get response!\n");
     return;
   }
+#endif
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received correct GET response!\n");
-  GNUNET_SCHEDULER_cancel(sched, die_task);
+  GNUNET_SCHEDULER_cancel(die_task);
   GNUNET_DHT_get_stop(global_get_handle);
-  GNUNET_SCHEDULER_add_now (sched, &finish_testing, NULL);
+  GNUNET_SCHEDULER_add_now (&finish_testing, NULL);
 }
 
 /**
@@ -239,14 +252,23 @@ static void
 do_get (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
 {
   GNUNET_HashCode key; /* Key for data lookup */
+#if DNS
+  memcpy(&key, &data.service_descriptor, sizeof(GNUNET_HashCode));
+#else
   memset(&key, 42, sizeof(GNUNET_HashCode)); /* Set the key to the same thing as when data was inserted */
+#endif
   global_get_handle = GNUNET_DHT_get_start(peer2dht, GNUNET_TIME_relative_get_forever(),
-                                          GNUNET_BLOCK_TYPE_TEST,
-                                          &key,
-                                          GNUNET_DHT_RO_NONE,
-                                          NULL, 0,
-                                          NULL, 0,
-                                          &get_result_iterator, NULL);
+#if DNS
+                                           GNUNET_BLOCK_TYPE_DNS,
+#else
+                                           GNUNET_BLOCK_TYPE_TEST,
+#endif
+                                           &key,
+                                           DEFAULT_GET_REPLICATION,
+                                           GNUNET_DHT_RO_NONE,
+                                           NULL, 0,
+                                           NULL, 0,
+                                           &get_result_iterator, NULL);
 }
 
 /**
@@ -256,12 +278,14 @@ do_get (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
 static void
 put_finished (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
 {
-  GNUNET_SCHEDULER_cancel (sched, die_task);
-  die_task = GNUNET_SCHEDULER_add_delayed (sched, GET_TIMEOUT,
+  GNUNET_SCHEDULER_cancel (die_task);
+  die_task = GNUNET_SCHEDULER_add_delayed (GET_TIMEOUT,
                                            &end_badly, "waiting for get response (data not found)");
-  GNUNET_SCHEDULER_add_delayed(sched, GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 10), &do_get, NULL);
+  GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 10), &do_get, NULL);
 }
 
+
+#if !DNS
 /**
  * Set up some data, and call API PUT function
  */
@@ -276,13 +300,71 @@ do_put (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
   /* Insert the data at the first peer */
   GNUNET_DHT_put(peer1dht,
                  &key,
-                GNUNET_DHT_RO_NONE,
+                 DEFAULT_PUT_REPLICATION,
+                 GNUNET_DHT_RO_NONE,
                  GNUNET_BLOCK_TYPE_TEST,
                  sizeof(data), data,
                  GNUNET_TIME_UNIT_FOREVER_ABS,
                  GNUNET_TIME_UNIT_FOREVER_REL,
                  &put_finished, NULL);
 }
+#else
+
+/**
+ * Set up some data, and call API PUT function
+ */
+static void
+do_put (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
+{
+  char* name = "philipptoelke.gnunet.";
+  size_t size = sizeof(struct GNUNET_DNS_Record);
+  memset(&data, 0, size);
+
+  data.purpose.size = htonl(size - sizeof(struct GNUNET_CRYPTO_RsaSignature));
+  data.purpose.purpose = GNUNET_SIGNATURE_PURPOSE_DNS_RECORD;
+
+  GNUNET_CRYPTO_hash(name, strlen(name)+1, &data.service_descriptor);
+
+  data.service_type = htonl(GNUNET_DNS_SERVICE_TYPE_UDP);
+  data.ports = htons(69);
+
+  char* keyfile;
+  GNUNET_asprintf(&keyfile, "/tmp/test_dns_data_key");
+  struct GNUNET_CRYPTO_RsaPrivateKey *my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file(keyfile);
+  GNUNET_free(keyfile);
+  GNUNET_assert(my_private_key != NULL);
+
+  GNUNET_CRYPTO_rsa_key_get_public(my_private_key, &data.peer);
+
+  data.expiration_time = GNUNET_TIME_relative_to_absolute(GNUNET_TIME_UNIT_HOURS);
+
+  /* Sign the block */
+  if (GNUNET_OK != GNUNET_CRYPTO_rsa_sign(my_private_key,
+                                          &data.purpose,
+                                          &data.signature))
+    {
+      GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "could not sign DNS_Record\n");
+      return;
+    }
+  GNUNET_CRYPTO_rsa_key_free(my_private_key);
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+             "Putting with key %08x\n",
+             *((unsigned int*)&data.service_descriptor));
+
+  GNUNET_DHT_put(peer1dht,
+                 &data.service_descriptor,
+                 DEFAULT_PUT_REPLICATION,
+                 GNUNET_DHT_RO_NONE,
+                 GNUNET_BLOCK_TYPE_DNS,
+                 size,
+                 (char*)&data,
+                 GNUNET_TIME_relative_to_absolute(GNUNET_TIME_UNIT_HOURS),
+                 GNUNET_TIME_UNIT_MINUTES,
+                 &put_finished,
+                 NULL);
+}
+#endif
 
 /**
  * This function is called whenever a connection attempt is finished between two of
@@ -331,17 +413,16 @@ topology_callback (void *cls,
                   "Created %d total connections, which is our target number!  Starting next phase of testing.\n",
                   total_connections);
 #endif
-      GNUNET_SCHEDULER_cancel (sched, die_task);
-      die_task = GNUNET_SCHEDULER_add_delayed (sched, TIMEOUT,
+      GNUNET_SCHEDULER_cancel (die_task);
+      die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
                                                &end_badly, "from test gets");
 
-      GNUNET_SCHEDULER_add_delayed (sched, GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 2), &do_put, NULL);
+      GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 2), &do_put, NULL);
     }
   else if (total_connections + failed_connections == expected_connections)
     {
-      GNUNET_SCHEDULER_cancel (sched, die_task);
-      die_task = GNUNET_SCHEDULER_add_now (sched,
-                                           &end_badly, "from topology_callback (too many failed connections)");
+      GNUNET_SCHEDULER_cancel (die_task);
+      die_task = GNUNET_SCHEDULER_add_now (&end_badly, "from topology_callback (too many failed connections)");
     }
 }
 
@@ -375,21 +456,21 @@ peers_started_callback (void *cls,
   if (peers_left == num_peers)
   {
     memcpy(&peer1id, id, sizeof(struct GNUNET_PeerIdentity)); /* Save the peer id */
-    peer1dht = GNUNET_DHT_connect(sched, cfg, 100); /* Connect to the first peers DHT service */
+    peer1dht = GNUNET_DHT_connect(cfg, 100); /* Connect to the first peers DHT service */
     if (peer1dht == NULL) /* If DHT connect failed */
     {
-      GNUNET_SCHEDULER_cancel (sched, die_task);
-      GNUNET_SCHEDULER_add_now(sched, &end_badly, "Failed to get dht handle!\n");
+      GNUNET_SCHEDULER_cancel (die_task);
+      GNUNET_SCHEDULER_add_now(&end_badly, "Failed to get dht handle!\n");
     }
   }
   else /* This is the second peer started */
   {
     memcpy(&peer2id, id, sizeof(struct GNUNET_PeerIdentity)); /* Same as for first peer... */
-    peer2dht = GNUNET_DHT_connect(sched, cfg, 100);
+    peer2dht = GNUNET_DHT_connect(cfg, 100);
     if (peer2dht == NULL)
     {
-      GNUNET_SCHEDULER_cancel (sched, die_task);
-      GNUNET_SCHEDULER_add_now(sched, &end_badly, "Failed to get dht handle!\n");
+      GNUNET_SCHEDULER_cancel (die_task);
+      GNUNET_SCHEDULER_add_now(&end_badly, "Failed to get dht handle!\n");
     }
   }
 
@@ -407,18 +488,22 @@ peers_started_callback (void *cls,
       if ((pg != NULL)) /* Sanity check */
         {
           /* Connect peers in a "straight line" topology, return the number of expected connections */
-          expected_connections = GNUNET_TESTING_connect_topology (pg, GNUNET_TESTING_TOPOLOGY_LINE, GNUNET_TESTING_TOPOLOGY_OPTION_ALL, 0.0);
+          expected_connections = GNUNET_TESTING_connect_topology (pg,
+                                                                  GNUNET_TESTING_TOPOLOGY_LINE,
+                                                                  GNUNET_TESTING_TOPOLOGY_OPTION_ALL,
+                                                                  0.0,
+                                                                  TIMEOUT,
+                                                                  12,
+                                                                  NULL, NULL);
         }
 
       /* Cancel current timeout fail task */
-      GNUNET_SCHEDULER_cancel (sched, die_task);
+      GNUNET_SCHEDULER_cancel (die_task);
       if (expected_connections == GNUNET_SYSERR) /* Some error happened */
-        die_task = GNUNET_SCHEDULER_add_now (sched,
-                                             &end_badly, "from connect topology (bad return)");
+        die_task = GNUNET_SCHEDULER_add_now (&end_badly, "from connect topology (bad return)");
 
       /* Schedule timeout on failure task */
-      die_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                               TIMEOUT,
+      die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
                                                &end_badly, "from connect topology (timeout)");
       ok = 0;
     }
@@ -426,11 +511,9 @@ peers_started_callback (void *cls,
 
 static void
 run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *s,
      char *const *args,
      const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  sched = s;
 
   /* Get path from configuration file */
   if (GNUNET_YES != GNUNET_CONFIGURATION_get_value_string(cfg, "paths", "servicehome", &test_directory))
@@ -449,15 +532,23 @@ run (void *cls,
   peers_left = num_peers;
 
   /* Set up a task to end testing if peer start fails */
-  die_task = GNUNET_SCHEDULER_add_delayed (sched,
-                                           TIMEOUT,
+  die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
                                            &end_badly, "didn't start all daemons in reasonable amount of time!!!");
 
   /* Start num_peers peers, call peers_started_callback on peer start, topology_callback on peer connect */
   /* Read the API documentation for other parameters! */
-  pg = GNUNET_TESTING_daemons_start (sched, cfg,
-                                     num_peers, TIMEOUT, NULL, NULL, &peers_started_callback, NULL,
-                                     &topology_callback, NULL, NULL);
+  pg = GNUNET_TESTING_daemons_start (cfg,
+                                     num_peers,
+                                     2,
+                                     2,
+                                     TIMEOUT,
+                                     NULL,
+                                     NULL,
+                                     &peers_started_callback,
+                                     NULL,
+                                     &topology_callback,
+                                     NULL,
+                                     NULL);
 
 }