libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

test_http_reasons.c (5001B)


      1 /*
      2   This file is part of libmicrohttpd
      3   Copyright (C) 2017-2021 Karlson2k (Evgeny Grin)
      4 
      5   This test tool is free software; you can redistribute it and/or
      6   modify it under the terms of the GNU General Public License as
      7   published by the Free Software Foundation; either version 2, or
      8   (at your option) any later version.
      9 
     10   This test tool is distributed in the hope that it will be useful,
     11   but WITHOUT ANY WARRANTY; without even the implied warranty of
     12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13   Lesser General Public License for more details.
     14 
     15   You should have received a copy of the GNU Lesser General Public
     16   License along with this library; if not, write to the Free Software
     17   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     18 */
     19 
     20 /**
     21  * @file microhttpd/test_http_reasons.c
     22  * @brief  Unit tests for MHD_get_reason_phrase_for() function
     23  * @author Karlson2k (Evgeny Grin)
     24  */
     25 
     26 #include "mhd_options.h"
     27 #include <stdio.h>
     28 #include <string.h>
     29 #include "microhttpd.h"
     30 #include "mhd_str.h"
     31 
     32 static const char *const r_unknown = "unknown";
     33 
     34 /* Return zero when no error is detected */
     35 static int
     36 expect_result (unsigned int code, const char *expected)
     37 {
     38   const char *const reason = MHD_get_reason_phrase_for (code);
     39   const size_t len = MHD_get_reason_phrase_len_for (code);
     40   size_t exp_len;
     41   if (! MHD_str_equal_caseless_ (reason, expected))
     42   {
     43     fprintf (stderr,
     44              "Incorrect reason returned for code %u:\n  Returned: \"%s\"  \tExpected: \"%s\"\n",
     45              code, reason, expected);
     46     return 1;
     47   }
     48   if (r_unknown == expected)
     49     exp_len = 0;
     50   else
     51     exp_len = strlen (expected);
     52   if (exp_len != len)
     53   {
     54     fprintf (stderr,
     55              "Incorrect reason length returned for code %u:\n  Returned: \"%u\"  \tExpected: \"%u\"\n",
     56              code, (unsigned) len, (unsigned) exp_len);
     57     return 1;
     58   }
     59   return 0;
     60 }
     61 
     62 
     63 static int
     64 expect_absent (unsigned int code)
     65 {
     66   return expect_result (code, r_unknown);
     67 }
     68 
     69 
     70 static int
     71 test_absent_codes (void)
     72 {
     73   int errcount = 0;
     74   errcount += expect_absent (0);
     75   errcount += expect_absent (1);
     76   errcount += expect_absent (50);
     77   errcount += expect_absent (99);
     78   errcount += expect_absent (600);
     79   errcount += expect_absent (601);
     80   errcount += expect_absent (900);
     81   errcount += expect_absent (10000);
     82   return errcount;
     83 }
     84 
     85 
     86 static int
     87 test_1xx (void)
     88 {
     89   int errcount = 0;
     90   errcount += expect_result (MHD_HTTP_CONTINUE, "continue");
     91   errcount += expect_result (MHD_HTTP_PROCESSING, "processing");
     92   errcount += expect_absent (110);
     93   errcount += expect_absent (190);
     94   return errcount;
     95 }
     96 
     97 
     98 static int
     99 test_2xx (void)
    100 {
    101   int errcount = 0;
    102   errcount += expect_result (MHD_HTTP_OK, "ok");
    103   errcount += expect_result (MHD_HTTP_ALREADY_REPORTED, "already reported");
    104   errcount += expect_absent (217);
    105   errcount += expect_result (MHD_HTTP_IM_USED, "im used");
    106   errcount += expect_absent (230);
    107   errcount += expect_absent (295);
    108   return errcount;
    109 }
    110 
    111 
    112 static int
    113 test_3xx (void)
    114 {
    115   int errcount = 0;
    116   errcount += expect_result (MHD_HTTP_MULTIPLE_CHOICES, "multiple choices");
    117   errcount += expect_result (MHD_HTTP_SEE_OTHER, "see other");
    118   errcount += expect_result (MHD_HTTP_PERMANENT_REDIRECT, "permanent redirect");
    119   errcount += expect_absent (311);
    120   errcount += expect_absent (399);
    121   return errcount;
    122 }
    123 
    124 
    125 static int
    126 test_4xx (void)
    127 {
    128   int errcount = 0;
    129   errcount += expect_result (MHD_HTTP_BAD_REQUEST, "bad request");
    130   errcount += expect_result (MHD_HTTP_NOT_FOUND, "not found");
    131   errcount += expect_result (MHD_HTTP_URI_TOO_LONG, "uri too long");
    132   errcount += expect_result (MHD_HTTP_EXPECTATION_FAILED, "expectation failed");
    133   errcount += expect_result (MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE,
    134                              "request header fields too large");
    135   errcount += expect_absent (441);
    136   errcount += expect_result (MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS,
    137                              "unavailable for legal reasons");
    138   errcount += expect_absent (470);
    139   errcount += expect_absent (493);
    140   return errcount;
    141 }
    142 
    143 
    144 static int
    145 test_5xx (void)
    146 {
    147   int errcount = 0;
    148   errcount += expect_result (MHD_HTTP_INTERNAL_SERVER_ERROR,
    149                              "internal server error");
    150   errcount += expect_result (MHD_HTTP_BAD_GATEWAY, "bad gateway");
    151   errcount += expect_result (MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED,
    152                              "http version not supported");
    153   errcount += expect_result (MHD_HTTP_NETWORK_AUTHENTICATION_REQUIRED,
    154                              "network authentication required");
    155   errcount += expect_absent (520);
    156   errcount += expect_absent (597);
    157   return errcount;
    158 }
    159 
    160 
    161 int
    162 main (int argc, char *argv[])
    163 {
    164   int errcount = 0;
    165   (void) argc; (void) argv; /* Unused. Silent compiler warning. */
    166 
    167   errcount += test_absent_codes ();
    168   errcount += test_1xx ();
    169   errcount += test_2xx ();
    170   errcount += test_3xx ();
    171   errcount += test_4xx ();
    172   errcount += test_5xx ();
    173   return errcount == 0 ? 0 : 1;
    174 }