Home | History | Annotate | Download | only in microhttpd
      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2007 Christian Grothoff
      4 
      5      libmicrohttpd 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 2, or (at your
      8      option) any later version.
      9 
     10      libmicrohttpd 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 libmicrohttpd; 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 /**
     22  * @file test_daemon.c
     23  * @brief  Testcase for libmicrohttpd starts and stops
     24  * @author Christian Grothoff
     25  */
     26 
     27 #include "platform.h"
     28 #include "microhttpd.h"
     29 #include <stdlib.h>
     30 #include <string.h>
     31 #include <stdio.h>
     32 
     33 #ifndef WINDOWS
     34 #include <unistd.h>
     35 #endif
     36 
     37 
     38 static int
     39 testStartError ()
     40 {
     41   struct MHD_Daemon *d;
     42 
     43   d = MHD_start_daemon (MHD_USE_DEBUG, 0, NULL, NULL, NULL, NULL);
     44   if (d != NULL)
     45     return 1;
     46   return 0;
     47 }
     48 
     49 static int
     50 apc_nothing (void *cls, const struct sockaddr *addr, socklen_t addrlen)
     51 {
     52   return MHD_NO;
     53 }
     54 
     55 static int
     56 apc_all (void *cls, const struct sockaddr *addr, socklen_t addrlen)
     57 {
     58   return MHD_YES;
     59 }
     60 
     61 static int
     62 ahc_nothing (void *cls,
     63              struct MHD_Connection *connection,
     64              const char *url,
     65              const char *method,
     66              const char *version,
     67              const char *upload_data, size_t *upload_data_size,
     68              void **unused)
     69 {
     70   return MHD_NO;
     71 }
     72 
     73 static int
     74 testStartStop ()
     75 {
     76   struct MHD_Daemon *d;
     77 
     78   d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG,
     79                         1080,
     80                         &apc_nothing,
     81                         NULL, &ahc_nothing, NULL, MHD_OPTION_END);
     82   if (d == NULL)
     83     return 2;
     84   MHD_stop_daemon (d);
     85   return 0;
     86 }
     87 
     88 static int
     89 testExternalRun ()
     90 {
     91   struct MHD_Daemon *d;
     92   fd_set rs;
     93   MHD_socket maxfd;
     94   int i;
     95 
     96   d = MHD_start_daemon (MHD_USE_DEBUG,
     97                         1081,
     98                         &apc_all, NULL, &ahc_nothing, NULL, MHD_OPTION_END);
     99 
    100   if (d == NULL)
    101     return 4;
    102   i = 0;
    103   while (i < 15)
    104     {
    105       maxfd = 0;
    106       FD_ZERO (&rs);
    107       if (MHD_YES != MHD_get_fdset (d, &rs, &rs, &rs, &maxfd))
    108 	{
    109 	  MHD_stop_daemon (d);
    110 	  return 256;
    111 	}
    112       if (MHD_run (d) == MHD_NO)
    113         {
    114           MHD_stop_daemon (d);
    115           return 8;
    116         }
    117       i++;
    118     }
    119   MHD_stop_daemon (d);
    120   return 0;
    121 }
    122 
    123 static int
    124 testThread ()
    125 {
    126   struct MHD_Daemon *d;
    127   d = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_SELECT_INTERNALLY,
    128                         1082,
    129                         &apc_all, NULL, &ahc_nothing, NULL, MHD_OPTION_END);
    130 
    131   if (d == NULL)
    132     return 16;
    133   if (MHD_run (d) != MHD_NO)
    134     return 32;
    135   MHD_stop_daemon (d);
    136   return 0;
    137 }
    138 
    139 static int
    140 testMultithread ()
    141 {
    142   struct MHD_Daemon *d;
    143   d = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_THREAD_PER_CONNECTION,
    144                         1083,
    145                         &apc_all, NULL, &ahc_nothing, NULL, MHD_OPTION_END);
    146 
    147   if (d == NULL)
    148     return 64;
    149   if (MHD_run (d) != MHD_NO)
    150     return 128;
    151   MHD_stop_daemon (d);
    152   return 0;
    153 }
    154 
    155 int
    156 main (int argc, char *const *argv)
    157 {
    158   int errorCount = 0;
    159   errorCount += testStartError ();
    160   errorCount += testStartStop ();
    161   errorCount += testExternalRun ();
    162   errorCount += testThread ();
    163   errorCount += testMultithread ();
    164   if (errorCount != 0)
    165     fprintf (stderr, "Error (code: %u)\n", errorCount);
    166   return errorCount != 0;       /* 0 == pass */
    167 }
    168