f51e96ff24b292441cc35e6abdea25a872cd53d7
[oweals/gnunet.git] / src / transport / test_transport_api.c
1 /*
2      This file is part of GNUnet.
3      (C) 2009, 2010 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20 /**
21  * @file transport/test_transport_api.c
22  * @brief base test case for transport implementations
23  *
24  * This test case serves as a base for tcp, udp, and udp-nat
25  * transport test cases.  Based on the executable being run
26  * the correct test case will be performed.  Conservation of
27  * C code apparently.
28  */
29 #include "platform.h"
30 #include "gnunet_common.h"
31 #include "gnunet_hello_lib.h"
32 #include "gnunet_getopt_lib.h"
33 #include "gnunet_os_lib.h"
34 #include "gnunet_program_lib.h"
35 #include "gnunet_scheduler_lib.h"
36 #include "gnunet_transport_service.h"
37 #include "transport.h"
38 #include "transport-testing.h"
39
40 #define VERBOSE GNUNET_NO
41
42 #define VERBOSE_ARM GNUNET_NO
43
44 #define START_ARM GNUNET_YES
45
46 /**
47  * How long until we give up on transmitting the message?
48  */
49 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300)
50
51 /**
52  * How long until we give up on transmitting the message?
53  */
54 #define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
55
56 #define MTYPE 12345
57
58 static struct PeerContext p1;
59
60 static struct PeerContext p2;
61
62 static int ok;
63
64 static int is_tcp;
65
66 static int is_tcp_nat;
67
68 static int is_udp;
69
70 static int is_unix;
71
72 static int is_udp_nat;
73
74 static int is_http;
75
76 static int is_https;
77
78 static int is_multi_protocol;
79
80 static int is_wlan;
81
82 static  GNUNET_SCHEDULER_TaskIdentifier die_task;
83
84 static  GNUNET_SCHEDULER_TaskIdentifier tct;
85
86 static char * key_file_p1;
87 static char * cert_file_p1;
88
89 static char * key_file_p2;
90 static char * cert_file_p2;
91
92 struct GNUNET_TRANSPORT_TransmitHandle * th;
93
94 #if VERBOSE
95 #define OKPP do { ok++; fprintf (stderr, "Now at stage %u at %s:%u\n", ok, __FILE__, __LINE__); } while (0)
96 #else
97 #define OKPP do { ok++; } while (0)
98 #endif
99
100
101 static void
102 end ()
103 {
104   GNUNET_assert (ok == 6);
105   if (GNUNET_SCHEDULER_NO_TASK != die_task)
106     GNUNET_SCHEDULER_cancel (die_task);
107   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
108               "Disconnecting from transports!\n");
109   if (th != NULL)
110     GNUNET_TRANSPORT_notify_transmit_ready_cancel(th);
111   th = NULL;
112
113   GNUNET_TRANSPORT_disconnect (p1.th);
114   GNUNET_TRANSPORT_disconnect (p2.th);
115   die_task = GNUNET_SCHEDULER_NO_TASK;
116   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
117               "Transports disconnected, returning success!\n");
118   ok = 0;
119 }
120
121 static void
122 stop_arm (struct PeerContext *p)
123 {
124 #if START_ARM
125   if (0 != GNUNET_OS_process_kill (p->arm_proc, SIGTERM))
126     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
127   GNUNET_OS_process_wait (p->arm_proc);
128   GNUNET_OS_process_close (p->arm_proc);
129   p->arm_proc = NULL;
130 #endif
131   GNUNET_CONFIGURATION_destroy (p->cfg);
132 }
133
134
135 static void
136 end_badly ()
137 {
138   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Disconnecting from transports!\n");
139   GNUNET_break (0);
140
141   if (th != NULL)
142     GNUNET_TRANSPORT_notify_transmit_ready_cancel(th);
143   th = NULL;
144
145   GNUNET_TRANSPORT_disconnect (p1.th);
146   GNUNET_TRANSPORT_disconnect (p2.th);
147   if (GNUNET_SCHEDULER_NO_TASK != tct)
148     {
149       GNUNET_SCHEDULER_cancel (tct);
150       tct = GNUNET_SCHEDULER_NO_TASK;
151     }
152   ok = 1;
153 }
154
155
156 static void
157 notify_receive (void *cls,
158                 const struct GNUNET_PeerIdentity *peer,
159                 const struct GNUNET_MessageHeader *message,
160                 const struct GNUNET_TRANSPORT_ATS_Information *ats,
161                 uint32_t ats_count)
162 {
163   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
164               "Received message of type %d from peer %s!\n",
165               ntohs(message->type), 
166               GNUNET_i2s (peer));
167   GNUNET_assert (ok == 5);
168   OKPP;
169   GNUNET_assert (MTYPE == ntohs (message->type));
170   GNUNET_assert (sizeof (struct GNUNET_MessageHeader) ==
171                  ntohs (message->size));
172   end ();
173 }
174
175
176 static size_t
177 notify_ready (void *cls, size_t size, void *buf)
178 {
179   struct PeerContext *p = cls;
180   struct GNUNET_MessageHeader *hdr;
181
182   th = NULL;
183
184   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
185               "Transmitting message with %u bytes to peer %s\n", 
186               sizeof (struct GNUNET_MessageHeader),
187               GNUNET_i2s (&p->id));
188   GNUNET_assert (size >= 256);
189   GNUNET_assert (ok == 4);
190   OKPP;
191   if (buf != NULL)
192   {
193     hdr = buf;
194     hdr->size = htons (sizeof (struct GNUNET_MessageHeader));
195     hdr->type = htons (MTYPE);
196   }
197   return sizeof (struct GNUNET_MessageHeader);
198 }
199
200
201 static void
202 exchange_hello_last (void *cls,
203                      const struct GNUNET_MessageHeader *message)
204 {
205   struct PeerContext *me = cls;
206
207   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
208               "Exchanging HELLO of size %d with peer (%s)!\n", 
209               (int) GNUNET_HELLO_size((const struct GNUNET_HELLO_Message *)message),
210               GNUNET_i2s (&me->id));
211   GNUNET_assert (message != NULL);
212   GNUNET_assert (GNUNET_OK ==
213                  GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *)
214                                       message, &me->id));
215   GNUNET_TRANSPORT_offer_hello (p1.th, message, NULL, NULL);
216 }
217
218
219
220 static void
221 exchange_hello (void *cls,
222                 const struct GNUNET_MessageHeader *message)
223 {
224   struct PeerContext *me = cls;
225
226   GNUNET_assert (message != NULL);
227   GNUNET_assert (GNUNET_OK ==
228                  GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *)
229                                       message, &me->id));
230   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
231               "Exchanging HELLO of size %d from peer %s!\n", 
232               (int) GNUNET_HELLO_size((const struct GNUNET_HELLO_Message *)message),
233               GNUNET_i2s (&me->id));
234   GNUNET_TRANSPORT_offer_hello (p2.th, message, NULL, NULL);
235 }
236
237
238
239 static void
240 notify_connect (void *cls,
241                 const struct GNUNET_PeerIdentity *peer,
242                 const struct GNUNET_TRANSPORT_ATS_Information *ats,
243                 uint32_t ats_count)
244 {
245   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
246               "Peer `%4s' connected to us (%p)!\n", 
247               GNUNET_i2s (peer), 
248               cls);
249   if (cls == &p1)
250     {
251       GNUNET_assert (ok >= 2);
252       OKPP;
253       OKPP;
254       if (GNUNET_SCHEDULER_NO_TASK != die_task)
255         GNUNET_SCHEDULER_cancel (die_task);
256       if (GNUNET_SCHEDULER_NO_TASK != tct)
257         GNUNET_SCHEDULER_cancel (tct);
258       tct = GNUNET_SCHEDULER_NO_TASK;
259       GNUNET_TRANSPORT_get_hello_cancel (p2.th, &exchange_hello_last, &p2);
260       GNUNET_TRANSPORT_get_hello_cancel (p1.th, &exchange_hello, &p1);
261       die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT_TRANSMIT,
262                                                &end_badly, NULL);
263       th = GNUNET_TRANSPORT_notify_transmit_ready (p1.th,
264                                               &p2.id,
265                                               256, 0, TIMEOUT, &notify_ready,
266                                               &p1);
267     }
268 }
269
270
271 static void
272 notify_disconnect (void *cls,
273                    const struct GNUNET_PeerIdentity *peer)
274 {
275   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
276               "Peer `%4s' disconnected (%p)!\n",
277               GNUNET_i2s (peer), cls);
278 }
279
280
281 static void
282 setup_peer (struct PeerContext *p, 
283             const char *cfgname)
284 {
285   p->cfg = GNUNET_CONFIGURATION_create ();
286
287   GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname));
288   if (GNUNET_CONFIGURATION_have_value (p->cfg,"PATHS", "SERVICEHOME"))
289       GNUNET_CONFIGURATION_get_value_string (p->cfg, "PATHS", "SERVICEHOME", &p->servicehome);
290   GNUNET_DISK_directory_remove (p->servicehome);
291
292 #if START_ARM
293   p->arm_proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-service-arm",
294                                         "gnunet-service-arm",
295 #if VERBOSE_ARM
296                                         "-L", "DEBUG",
297 #endif
298                                         "-c", cfgname, NULL);
299 #endif
300
301
302   if (GNUNET_CONFIGURATION_have_value (p->cfg,"PATHS", "SERVICEHOME"))
303       GNUNET_CONFIGURATION_get_value_string (p->cfg, "PATHS", "SERVICEHOME", &p->servicehome);
304
305   if (is_https)
306     {
307       struct stat sbuf;
308       if (p==&p1)
309         {
310           if (GNUNET_CONFIGURATION_have_value (p->cfg,
311                                                "transport-https", "KEY_FILE"))
312             GNUNET_CONFIGURATION_get_value_string (p->cfg, "transport-https", "KEY_FILE", &key_file_p1);
313           if (key_file_p1==NULL)
314             GNUNET_asprintf(&key_file_p1,"https.key");
315           if (0 == stat (key_file_p1, &sbuf ))
316             {
317               if (0 == remove(key_file_p1))
318                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
319                             "Successfully removed existing private key file `%s'\n",key_file_p1);
320               else
321                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
322                             "Failed to remove private key file `%s'\n",key_file_p1);
323             }
324           if (GNUNET_CONFIGURATION_have_value (p->cfg,"transport-https", "CERT_FILE"))
325             GNUNET_CONFIGURATION_get_value_string (p->cfg, "transport-https", "CERT_FILE", &cert_file_p1);
326           if (cert_file_p1==NULL)
327             GNUNET_asprintf(&cert_file_p1,"https.cert");
328           if (0 == stat (cert_file_p1, &sbuf ))
329             {
330               if (0 == remove(cert_file_p1))
331                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
332                             "Successfully removed existing certificate file `%s'\n",
333                             cert_file_p1);
334               else
335                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
336                             "Failed to remove existing certificate file `%s'\n",
337                             cert_file_p1);
338             }
339         }
340       else if (p==&p2)
341         {
342           if (GNUNET_CONFIGURATION_have_value (p->cfg,
343                                                "transport-https", "KEY_FILE"))
344             GNUNET_CONFIGURATION_get_value_string (p->cfg, "transport-https", "KEY_FILE", &key_file_p2);
345           if (key_file_p2==NULL)
346             GNUNET_asprintf(&key_file_p2,"https.key");
347           if (0 == stat (key_file_p2, &sbuf ))
348             {
349               if (0 == remove(key_file_p2))
350                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
351                             "Successfully removed existing private key file `%s'\n",
352                             key_file_p2);
353               else
354                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
355                             "Failed to remove private key file `%s'\n",
356                             key_file_p2);
357             }
358           if (GNUNET_CONFIGURATION_have_value (p->cfg,"transport-https", "CERT_FILE"))
359             GNUNET_CONFIGURATION_get_value_string (p->cfg, "transport-https", "CERT_FILE", &cert_file_p2);
360           if (cert_file_p2==NULL)
361             GNUNET_asprintf(&cert_file_p2,"https.cert");
362           if (0 == stat (cert_file_p2, &sbuf ))
363             {
364               if (0 == remove(cert_file_p2))
365                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
366                             "Successfully removed existing certificate file `%s'\n",cert_file_p2);
367               else
368                 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
369                             "Failed to remove existing certificate file `%s'\n",cert_file_p2);
370             }
371         }
372     }
373   
374   p->th = GNUNET_TRANSPORT_connect (p->cfg,
375                                     NULL, p,
376                                     &notify_receive,
377                                     &notify_connect, &notify_disconnect);
378   GNUNET_assert (p->th != NULL);
379 }
380
381
382 static void
383 try_connect (void *cls,
384              const struct GNUNET_SCHEDULER_TaskContext *tc)
385 {
386   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
387               "Asking peers to connect...\n");
388   GNUNET_TRANSPORT_try_connect (p2.th,
389                                 &p1.id);
390   GNUNET_TRANSPORT_try_connect (p1.th,
391                                 &p2.id);
392   tct = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
393                                       &try_connect,
394                                       NULL);
395 }
396
397
398 static void
399 run (void *cls,
400      char *const *args,
401      const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
402 {
403   GNUNET_assert (ok == 1);
404   OKPP;
405   die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
406                                            &end_badly, NULL);
407
408   if (is_udp)
409     {
410       setup_peer (&p1, "test_transport_api_udp_peer1.conf");
411       setup_peer (&p2, "test_transport_api_udp_peer2.conf");
412     }
413   if (is_unix)
414     {
415       setup_peer (&p1, "test_transport_api_unix_peer1.conf");
416       setup_peer (&p2, "test_transport_api_unix_peer2.conf");
417     }
418   if (is_multi_protocol)
419     {
420       setup_peer (&p1, "test_transport_api_multi_peer1.conf");
421       setup_peer (&p2, "test_transport_api_multi_peer2.conf");
422     }
423   else if (is_tcp)
424     {
425       setup_peer (&p1, "test_transport_api_tcp_peer1.conf");
426       setup_peer (&p2, "test_transport_api_tcp_peer2.conf");
427     }
428   else if (is_tcp_nat)
429     {
430       setup_peer (&p1, "test_transport_api_tcp_nat_peer1.conf");
431       setup_peer (&p2, "test_transport_api_tcp_nat_peer2.conf");
432     }
433   else if (is_udp_nat)
434     {
435       setup_peer (&p1, "test_transport_api_udp_nat_peer1.conf");
436       setup_peer (&p2, "test_transport_api_udp_nat_peer2.conf");
437     }
438   else if (is_http)
439     {
440       setup_peer (&p1, "test_transport_api_http_peer1.conf");
441       setup_peer (&p2, "test_transport_api_http_peer2.conf");
442     }
443   else if (is_https)
444     {
445       setup_peer (&p1, "test_transport_api_https_peer1.conf");
446       setup_peer (&p2, "test_transport_api_https_peer2.conf");
447     }
448   else if (is_wlan)
449     {
450       setup_peer (&p1, "test_transport_api_wlan_peer1.conf");
451       setup_peer (&p2, "test_transport_api_wlan_peer2.conf");
452     }
453   GNUNET_assert(p1.th != NULL);
454   GNUNET_assert(p2.th != NULL);
455
456   GNUNET_TRANSPORT_get_hello (p1.th, &exchange_hello, &p1);
457   GNUNET_TRANSPORT_get_hello (p2.th, &exchange_hello_last, &p2);
458   tct = GNUNET_SCHEDULER_add_now (&try_connect, NULL);
459 }
460
461 static int
462 check ()
463 {
464   static char *const argv[] = { "test-transport-api",
465     "-c",
466     "test_transport_api_data.conf",
467 #if VERBOSE
468     "-L", "DEBUG",
469 #endif
470     NULL
471   };
472   static struct GNUNET_GETOPT_CommandLineOption options[] = {
473     GNUNET_GETOPT_OPTION_END
474   };
475
476 #if WRITECONFIG
477   setTransportOptions("test_transport_api_data.conf");
478 #endif
479   ok = 1;
480   GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
481                       argv, "test-transport-api", "nohelp",
482                       options, &run, &ok);
483   stop_arm (&p1);
484   stop_arm (&p2);
485
486   if (is_https)
487     {
488       struct stat sbuf;
489       if (0 == stat (cert_file_p1, &sbuf ))
490         {
491           if (0 == remove(cert_file_p1))
492             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
493                         "Successfully removed existing certificate file `%s'\n",cert_file_p1);
494           else
495             GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
496                         "Failed to remove certfile `%s'\n",cert_file_p1);
497         }
498       
499       if (0 == stat (key_file_p1, &sbuf ))
500         {
501           if (0 == remove(key_file_p1))
502             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
503                         "Successfully removed private key file `%s'\n",key_file_p1);
504           else
505             GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 
506                         "Failed to private key file `%s'\n",key_file_p1);
507         }
508       
509       if (0 == stat (cert_file_p2, &sbuf ))
510         {
511           if (0 == remove(cert_file_p2))
512             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
513                         "Successfully removed existing certificate file `%s'\n",cert_file_p2);
514           else
515             GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
516                         "Failed to remove certfile `%s'\n",cert_file_p2);
517         }
518       
519       if (0 == stat (key_file_p2, &sbuf ))
520         {
521           if (0 == remove(key_file_p2))
522             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
523                         "Successfully removed private key file `%s'\n",key_file_p2);
524           else
525             GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
526                         "Failed to private key file `%s'\n",key_file_p2);
527         }
528       GNUNET_free(key_file_p1);
529       GNUNET_free(key_file_p2);
530       GNUNET_free(cert_file_p1);
531       GNUNET_free(cert_file_p2);
532     }
533
534   if ((p1.servicehome != NULL) && (p2.servicehome != NULL))
535   {
536     GNUNET_DISK_directory_remove (p1.servicehome);
537     GNUNET_DISK_directory_remove (p2.servicehome);
538     GNUNET_free(p1.servicehome);
539     GNUNET_free(p2.servicehome);
540   }
541   return ok;
542 }
543
544 /**
545  * Return the actual path to a file found in the current
546  * PATH environment variable.
547  *
548  * @param binary the name of the file to find
549  */
550 static char *
551 get_path_from_PATH (char *binary)
552 {
553   char *path;
554   char *pos;
555   char *end;
556   char *buf;
557   const char *p;
558
559   p = getenv ("PATH");
560   if (p == NULL)
561     {
562       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
563                   _("PATH environment variable is unset.\n"));
564       return NULL;
565     }
566   path = GNUNET_strdup (p);     /* because we write on it */
567   buf = GNUNET_malloc (strlen (path) + 20);
568   pos = path;
569
570   while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
571     {
572       *end = '\0';
573       sprintf (buf, "%s/%s", pos, binary);
574       if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
575         {
576           GNUNET_free (path);
577           return buf;
578         }
579       pos = end + 1;
580     }
581   sprintf (buf, "%s/%s", pos, binary);
582   if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
583     {
584       GNUNET_free (path);
585       return buf;
586     }
587   GNUNET_free (buf);
588   GNUNET_free (path);
589   return NULL;
590 }
591
592 /**
593  * Check whether the suid bit is set on a file.
594  * Attempts to find the file using the current
595  * PATH environment variable as a search path.
596  *
597  * @param binary the name of the file to check
598  *
599  * @return GNUNET_YES if the binary is found and
600  *         can be run properly, GNUNET_NO otherwise
601  */
602 static int
603 check_gnunet_nat_binary(char *binary)
604 {
605   struct stat statbuf;
606   char *p;
607 #ifdef MINGW
608   SOCKET rawsock;
609 #endif
610
611 #ifdef MINGW
612   char *binaryexe;
613   GNUNET_asprintf (&binaryexe, "%s.exe", binary);
614   p = get_path_from_PATH (binaryexe);
615   free (binaryexe);
616 #else
617   p = get_path_from_PATH (binary);
618 #endif
619   if (p == NULL)
620     {
621       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
622                   _("Could not find binary `%s' in PATH!\n"),
623                   binary);
624       return GNUNET_NO;
625     }
626   if (0 != STAT (p, &statbuf))
627     {
628       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
629                   _("stat (%s) failed: %s\n"),
630                   p,
631                   STRERROR (errno));
632       GNUNET_free (p);
633       return GNUNET_SYSERR;
634     }
635   GNUNET_free (p);
636 #ifndef MINGW
637   if ( (0 != (statbuf.st_mode & S_ISUID)) &&
638        (statbuf.st_uid == 0) )
639     return GNUNET_YES;
640   return GNUNET_NO;
641 #else
642   rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);
643   if (INVALID_SOCKET == rawsock)
644     {
645       DWORD err = GetLastError ();
646       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
647                   "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) have failed! GLE = %d\n", err);
648       return GNUNET_NO; /* not running as administrator */
649     }
650   closesocket (rawsock);
651   return GNUNET_YES;
652 #endif
653 }
654
655 int
656 main (int argc, char *argv[])
657 {
658   int ret;
659
660   GNUNET_log_setup ("test-transport-api",
661 #if VERBOSE
662                     "DEBUG",
663 #else
664                     "WARNING",
665 #endif
666                     NULL);
667
668   if (strstr(argv[0], "tcp_nat") != NULL)
669     {
670       is_tcp_nat = GNUNET_YES;
671 #ifdef MINGW
672       return 0;
673 #endif
674       if (GNUNET_YES != check_gnunet_nat_binary("gnunet-nat-server"))
675         {
676           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
677                       "`%s' not properly installed, cannot run NAT test!\n",
678                       "gnunet-nat-server");
679           return 0;
680         }
681     }
682   else if (strstr(argv[0], "tcp") != NULL)
683     {
684       is_tcp = GNUNET_YES;
685     }
686   else if (strstr(argv[0], "udp_nat") != NULL)
687     {
688       is_udp_nat = GNUNET_YES;
689 #ifdef MINGW
690       return 0;
691 #endif
692       if (GNUNET_YES != check_gnunet_nat_binary("gnunet-nat-server"))
693         {
694           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
695                       "`%s' not properly installed, cannot run NAT test!\n",
696                       "gnunet-nat-server");
697           return 0;
698         }
699     }
700   else if (strstr(argv[0], "udp") != NULL)
701     {
702       is_udp = GNUNET_YES;
703     }
704   else if (strstr(argv[0], "unix") != NULL)
705     {
706       is_unix = GNUNET_YES;
707     }
708   else if (strstr(argv[0], "https") != NULL)
709     {
710       is_https = GNUNET_YES;
711 #ifdef MINGW
712       return 0;
713 #endif
714     }
715   else if (strstr(argv[0], "http") != NULL)
716     {
717       is_http = GNUNET_YES;
718     }
719   else if (strstr(argv[0], "wlan") != NULL)
720     {
721        is_wlan = GNUNET_YES;
722     }
723   else if (strstr(argv[0], "multi") != NULL)
724     {
725        is_multi_protocol = GNUNET_YES;
726     }
727
728   ret = check ();
729
730   return ret;
731 }
732
733 /* end of test_transport_api.c */