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