wip
[oweals/gnunet.git] / src / transport / test_transport_api.c
index e429ad7a7391ca797f2cb981197f59f4e6314b06..d78e3264bb3e85294c727a923b93a41e1f011ef6 100644 (file)
@@ -76,12 +76,18 @@ static int is_tcp_nat;
 
 static int is_udp;
 
+static int is_unix;
+
 static int is_udp_nat;
 
 static int is_http;
 
 static int is_https;
 
+static int is_multi_protocol;
+
+static int is_wlan;
+
 static  GNUNET_SCHEDULER_TaskIdentifier die_task;
 
 static char * key_file_p1;
@@ -140,8 +146,8 @@ static void
 notify_receive (void *cls,
                 const struct GNUNET_PeerIdentity *peer,
                 const struct GNUNET_MessageHeader *message,
-                struct GNUNET_TIME_Relative latency,
-               uint32_t distance)
+                const struct GNUNET_TRANSPORT_ATS_Information *ats,
+                uint32_t ats_count)
 {
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ok is (%d)!\n",
               ok);
@@ -182,12 +188,18 @@ notify_ready (void *cls, size_t size, void *buf)
   return sizeof (struct GNUNET_MessageHeader);
 }
 
+static size_t
+notify_ready_connect (void *cls, size_t size, void *buf)
+{
+  return 0;
+}
+
 
 static void
 notify_connect (void *cls,
                 const struct GNUNET_PeerIdentity *peer,
-                struct GNUNET_TIME_Relative latency,
-               uint32_t distance)
+                const struct GNUNET_TRANSPORT_ATS_Information *ats,
+                uint32_t ats_count)
 {
   if (cls == &p1)
     {
@@ -308,6 +320,14 @@ exchange_hello_last (void *cls,
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *)
                                       message, &me->id));
+
+  GNUNET_assert(NULL != GNUNET_TRANSPORT_notify_transmit_ready (p2.th,
+                                          &p1.id,
+                                          sizeof (struct GNUNET_MessageHeader), 0,
+                                          TIMEOUT,
+                                          &notify_ready_connect,
+                                          NULL));
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Finished exchanging HELLOs, now waiting for transmission!\n");
 }
@@ -331,7 +351,7 @@ exchange_hello (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received HELLO size %d\n", GNUNET_HELLO_size((const struct GNUNET_HELLO_Message *)message));
 
-  GNUNET_TRANSPORT_offer_hello (p2.th, message);
+  GNUNET_TRANSPORT_offer_hello (p2.th, message, NULL, NULL);
   GNUNET_TRANSPORT_get_hello (p2.th, &exchange_hello_last, &p2);
 }
 
@@ -351,6 +371,17 @@ run (void *cls,
       setup_peer (&p1, "test_transport_api_udp_peer1.conf");
       setup_peer (&p2, "test_transport_api_udp_peer2.conf");
     }
+  if (is_unix)
+    {
+      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Using unix domain socket transport\n");
+      setup_peer (&p1, "test_transport_api_unix_peer1.conf");
+      setup_peer (&p2, "test_transport_api_unix_peer2.conf");
+    }
+  if (is_multi_protocol)
+    {
+      setup_peer (&p1, "test_transport_api_multi_peer1.conf");
+      setup_peer (&p2, "test_transport_api_multi_peer2.conf");
+    }
   else if (is_tcp)
     {
       setup_peer (&p1, "test_transport_api_tcp_peer1.conf");
@@ -372,10 +403,15 @@ run (void *cls,
       setup_peer (&p2, "test_transport_api_http_peer2.conf");
     }
   else if (is_https)
-       {
-         setup_peer (&p1, "test_transport_api_https_peer1.conf");
-         setup_peer (&p2, "test_transport_api_https_peer2.conf");
-       }
+    {
+      setup_peer (&p1, "test_transport_api_https_peer1.conf");
+      setup_peer (&p2, "test_transport_api_https_peer2.conf");
+    }
+  else if (is_wlan)
+    {
+      setup_peer (&p1, "test_transport_api_wlan_peer1.conf");
+      setup_peer (&p2, "test_transport_api_wlan_peer2.conf");
+    }
   GNUNET_assert(p1.th != NULL);
   GNUNET_assert(p2.th != NULL);
 
@@ -449,9 +485,14 @@ check ()
   return ok;
 }
 
-
+/**
+ * Return the actual path to a file found in the current
+ * PATH environment variable.
+ *
+ * @param binary the name of the file to find
+ */
 static char *
-get_path_from_PATH ()
+get_path_from_PATH (char *binary)
 {
   char *path;
   char *pos;
@@ -461,7 +502,11 @@ get_path_from_PATH ()
 
   p = getenv ("PATH");
   if (p == NULL)
-    return NULL;
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  _("PATH environment variable is unset.\n"));
+      return NULL;
+    }
   path = GNUNET_strdup (p);     /* because we write on it */
   buf = GNUNET_malloc (strlen (path) + 20);
   pos = path;
@@ -469,7 +514,7 @@ get_path_from_PATH ()
   while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
     {
       *end = '\0';
-      sprintf (buf, "%s/%s", pos, "gnunet-nat-server");
+      sprintf (buf, "%s/%s", pos, binary);
       if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
         {
           GNUNET_free (path);
@@ -477,34 +522,78 @@ get_path_from_PATH ()
         }
       pos = end + 1;
     }
-  sprintf (buf, "%s/%s", pos, "gnunet-nat-server");
-  GNUNET_free (path);
+  sprintf (buf, "%s/%s", pos, binary);
   if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
-    return buf;
+    {
+      GNUNET_free (path);
+      return buf;
+    }
   GNUNET_free (buf);
+  GNUNET_free (path);
   return NULL;
 }
 
-
+/**
+ * Check whether the suid bit is set on a file.
+ * Attempts to find the file using the current
+ * PATH environment variable as a search path.
+ *
+ * @param binary the name of the file to check
+ *
+ * @return GNUNET_YES if the binary is found and
+ *         can be run properly, GNUNET_NO otherwise
+ */
 static int
-check_gnunet_nat_server()
+check_gnunet_nat_binary(char *binary)
 {
   struct stat statbuf;
   char *p;
+#ifdef MINGW
+  SOCKET rawsock;
+#endif
 
-  p = get_path_from_PATH ();
+#ifdef MINGW
+  char *binaryexe;
+  GNUNET_asprintf (&binaryexe, "%s.exe", binary);
+  p = get_path_from_PATH (binaryexe);
+  free (binaryexe);
+#else
+  p = get_path_from_PATH (binary);
+#endif
   if (p == NULL)
-    return GNUNET_NO;
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  _("Could not find binary `%s' in PATH!\n"),
+                  binary);
+      return GNUNET_NO;
+    }
   if (0 != STAT (p, &statbuf))
     {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  _("stat (%s) failed: %s\n"),
+                  p,
+                  STRERROR (errno));
       GNUNET_free (p);
       return GNUNET_SYSERR;
     }
   GNUNET_free (p);
+#ifndef MINGW
   if ( (0 != (statbuf.st_mode & S_ISUID)) &&
        (statbuf.st_uid == 0) )
     return GNUNET_YES;
   return GNUNET_NO;
+#else
+  rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);
+  if (INVALID_SOCKET == rawsock)
+    {
+      DWORD err = GetLastError ();
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) have failed! GLE = %d\n", err);
+      return GNUNET_NO; /* not running as administrator */
+    }
+  closesocket (rawsock);
+  return GNUNET_YES;
+#endif
 }
 
 int
@@ -526,7 +615,7 @@ main (int argc, char *argv[])
   if (strstr(argv[0], "tcp_nat") != NULL)
     {
       is_tcp_nat = GNUNET_YES;
-      if (check_gnunet_nat_server() != GNUNET_OK)
+      if (GNUNET_YES != check_gnunet_nat_binary("gnunet-nat-server"))
         {
           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                       "`%s' not properly installed, cannot run NAT test!\n",
@@ -541,7 +630,7 @@ main (int argc, char *argv[])
   else if (strstr(argv[0], "udp_nat") != NULL)
     {
       is_udp_nat = GNUNET_YES;
-      if (check_gnunet_nat_server() != GNUNET_OK)
+      if (GNUNET_YES != check_gnunet_nat_binary("gnunet-nat-server"))
         {
           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                       "`%s' not properly installed, cannot run NAT test!\n",
@@ -553,6 +642,10 @@ main (int argc, char *argv[])
     {
       is_udp = GNUNET_YES;
     }
+  else if (strstr(argv[0], "unix") != NULL)
+    {
+      is_unix = GNUNET_YES;
+    }
   else if (strstr(argv[0], "https") != NULL)
     {
       is_https = GNUNET_YES;
@@ -561,10 +654,27 @@ main (int argc, char *argv[])
     {
       is_http = GNUNET_YES;
     }
+  else if (strstr(argv[0], "wlan") != NULL)
+    {
+       is_wlan = GNUNET_YES;
+    }
+  else if (strstr(argv[0], "multi") != NULL)
+    {
+       is_multi_protocol = GNUNET_YES;
+    }
 
   ret = check ();
-  GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-transport-peer-1");
-  GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-transport-peer-2");
+  if (is_multi_protocol)
+  {
+         GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-transport-multi-peer-1/");
+         GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-transport-multi-peer-2/");
+  }
+  else
+  {
+         GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-transport-peer-1");
+         GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-transport-peer-2");
+  }
+
   return ret;
 }