Blame src/microhttpd/test_daemon.c

Packit 875988
/*
Packit 875988
     This file is part of libmicrohttpd
Packit 875988
     Copyright (C) 2007, 2017 Christian Grothoff
Packit 875988
Packit 875988
     libmicrohttpd is free software; you can redistribute it and/or modify
Packit 875988
     it under the terms of the GNU General Public License as published
Packit 875988
     by the Free Software Foundation; either version 2, or (at your
Packit 875988
     option) any later version.
Packit 875988
Packit 875988
     libmicrohttpd is distributed in the hope that it will be useful, but
Packit 875988
     WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 875988
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 875988
     General Public License for more details.
Packit 875988
Packit 875988
     You should have received a copy of the GNU General Public License
Packit 875988
     along with libmicrohttpd; see the file COPYING.  If not, write to the
Packit 875988
     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit 875988
     Boston, MA 02110-1301, USA.
Packit 875988
*/
Packit 875988
Packit 875988
/**
Packit 875988
 * @file test_daemon.c
Packit 875988
 * @brief  Testcase for libmicrohttpd starts and stops
Packit 875988
 * @author Christian Grothoff
Packit 875988
 */
Packit 875988
Packit 875988
#include "platform.h"
Packit 875988
#include "microhttpd.h"
Packit 875988
#include <stdlib.h>
Packit 875988
#include <string.h>
Packit 875988
#include <stdio.h>
Packit 875988
Packit 875988
#ifndef WINDOWS
Packit 875988
#include <unistd.h>
Packit 875988
#endif
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
testStartError ()
Packit 875988
{
Packit 875988
  struct MHD_Daemon *d;
Packit 875988
Packit 875988
  d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0, NULL, NULL, NULL, NULL);
Packit 875988
  if (NULL != d)
Packit 875988
  {
Packit 875988
    MHD_stop_daemon (d);
Packit 875988
    fprintf (stderr,
Packit 875988
             "Succeeded to start without MHD_AccessHandlerCallback?\n");
Packit 875988
    return 1;
Packit 875988
  }
Packit 875988
  return 0;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
apc_nothing (void *cls,
Packit 875988
             const struct sockaddr *addr,
Packit 875988
             socklen_t addrlen)
Packit 875988
{
Packit 875988
  (void)cls; (void)addr; (void)addrlen; /* Unused. Silent compiler warning. */
Packit 875988
Packit 875988
  return MHD_NO;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
apc_all (void *cls,
Packit 875988
         const struct sockaddr *addr,
Packit 875988
         socklen_t addrlen)
Packit 875988
{
Packit 875988
  (void)cls; (void)addr; (void)addrlen; /* Unused. Silent compiler warning. */
Packit 875988
Packit 875988
  return MHD_YES;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
ahc_nothing (void *cls,
Packit 875988
             struct MHD_Connection *connection,
Packit 875988
             const char *url,
Packit 875988
             const char *method,
Packit 875988
             const char *version,
Packit 875988
             const char *upload_data, size_t *upload_data_size,
Packit 875988
             void **unused)
Packit 875988
{
Packit 875988
  (void)cls;(void)connection;(void)url;          /* Unused. Silent compiler warning. */
Packit 875988
  (void)method;(void)version;(void)upload_data;  /* Unused. Silent compiler warning. */
Packit 875988
  (void)upload_data_size;(void)unused;           /* Unused. Silent compiler warning. */
Packit 875988
Packit 875988
  return MHD_NO;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
testStartStop ()
Packit 875988
{
Packit 875988
  struct MHD_Daemon *d;
Packit 875988
Packit 875988
  d = MHD_start_daemon (MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_ERROR_LOG,
Packit 875988
                        0,
Packit 875988
                        &apc_nothing, NULL,
Packit 875988
                        &ahc_nothing, NULL,
Packit 875988
                        MHD_OPTION_END);
Packit 875988
  if (NULL == d)
Packit 875988
  {
Packit 875988
    fprintf (stderr,
Packit 875988
             "Failed to start daemon on port %u\n",
Packit 875988
             0);
Packit 875988
    exit (77);
Packit 875988
  }
Packit 875988
  MHD_stop_daemon (d);
Packit 875988
  return 0;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
testExternalRun ()
Packit 875988
{
Packit 875988
  struct MHD_Daemon *d;
Packit 875988
  fd_set rs;
Packit 875988
  MHD_socket maxfd;
Packit 875988
  int i;
Packit 875988
Packit 875988
  d = MHD_start_daemon (MHD_USE_ERROR_LOG,
Packit 875988
                        0,
Packit 875988
                        &apc_all, NULL,
Packit 875988
                        &ahc_nothing, NULL,
Packit 875988
                        MHD_OPTION_END);
Packit 875988
Packit 875988
  if (NULL == d)
Packit 875988
  {
Packit 875988
    fprintf (stderr,
Packit 875988
             "Failed to start daemon on port %u\n",
Packit 875988
             0);
Packit 875988
    exit (77);
Packit 875988
  }
Packit 875988
  i = 0;
Packit 875988
  while (i < 15)
Packit 875988
    {
Packit 875988
      maxfd = 0;
Packit 875988
      FD_ZERO (&rs);
Packit 875988
      if (MHD_YES != MHD_get_fdset (d, &rs, &rs, &rs, &maxfd))
Packit 875988
        {
Packit 875988
          MHD_stop_daemon (d);
Packit 875988
          fprintf (stderr,
Packit 875988
                   "Failed in MHD_get_fdset()\n");
Packit 875988
          return 256;
Packit 875988
        }
Packit 875988
      if (MHD_run (d) == MHD_NO)
Packit 875988
        {
Packit 875988
          MHD_stop_daemon (d);
Packit 875988
          fprintf (stderr,
Packit 875988
                   "Failed in MHD_run()\n");
Packit 875988
          return 8;
Packit 875988
        }
Packit 875988
      i++;
Packit 875988
    }
Packit 875988
  MHD_stop_daemon (d);
Packit 875988
  return 0;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
testThread ()
Packit 875988
{
Packit 875988
  struct MHD_Daemon *d;
Packit 875988
Packit 875988
  d = MHD_start_daemon (MHD_USE_ERROR_LOG | MHD_USE_INTERNAL_POLLING_THREAD,
Packit 875988
                        0,
Packit 875988
                        &apc_all, NULL,
Packit 875988
                        &ahc_nothing, NULL,
Packit 875988
                        MHD_OPTION_END);
Packit 875988
Packit 875988
  if (NULL == d)
Packit 875988
  {
Packit 875988
    fprintf (stderr,
Packit 875988
             "Failed to start daemon on port %u\n",
Packit 875988
             1082);
Packit 875988
    exit (77);
Packit 875988
  }
Packit 875988
  if (MHD_run (d) != MHD_NO)
Packit 875988
    {
Packit 875988
      fprintf (stderr,
Packit 875988
               "Failed in MHD_run()\n");
Packit 875988
      return 32;
Packit 875988
    }
Packit 875988
  MHD_stop_daemon (d);
Packit 875988
  return 0;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
static int
Packit 875988
testMultithread ()
Packit 875988
{
Packit 875988
  struct MHD_Daemon *d;
Packit 875988
Packit 875988
  d = MHD_start_daemon (MHD_USE_ERROR_LOG | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_THREAD_PER_CONNECTION,
Packit 875988
                        0,
Packit 875988
                        &apc_all, NULL,
Packit 875988
                        &ahc_nothing, NULL,
Packit 875988
                        MHD_OPTION_END);
Packit 875988
Packit 875988
  if (NULL == d)
Packit 875988
  {
Packit 875988
    fprintf (stderr,
Packit 875988
             "Failed to start daemon on port %u\n",
Packit 875988
             0);
Packit 875988
    exit (77);
Packit 875988
  }
Packit 875988
  if (MHD_run (d) != MHD_NO)
Packit 875988
    {
Packit 875988
      fprintf (stderr,
Packit 875988
               "Failed in MHD_run()\n");
Packit 875988
      return 128;
Packit 875988
    }
Packit 875988
  MHD_stop_daemon (d);
Packit 875988
  return 0;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
int
Packit 875988
main (int argc,
Packit 875988
      char *const *argv)
Packit 875988
{
Packit 875988
  int errorCount = 0;
Packit 875988
  (void)argc; (void)argv; /* Unused. Silent compiler warning. */
Packit 875988
Packit 875988
  errorCount += testStartError ();
Packit 875988
  errorCount += testStartStop ();
Packit 875988
  errorCount += testExternalRun ();
Packit 875988
  errorCount += testThread ();
Packit 875988
  errorCount += testMultithread ();
Packit 875988
  if (0 != errorCount)
Packit 875988
    fprintf (stderr,
Packit 875988
             "Error (code: %u)\n",
Packit 875988
             errorCount);
Packit 875988
  return 0 != errorCount;       /* 0 == pass */
Packit 875988
}