libmicrohttpd

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

test_mhd_version.c (6678B)


      1 /*
      2   This file is part of libmicrohttpd
      3   Copyright (C) 2023 Evgeny Grin (Karlson2k)
      4 
      5   This test tool is free software; you can redistribute it and/or
      6   modify it under the terms of the GNU Lesser General Public
      7   License as published by the Free Software Foundation; either
      8   version 2.1 of the License, or (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.
     17   If not, see <http://www.gnu.org/licenses/>.
     18 */
     19 
     20 /**
     21  * @file microhttpd/test_mhd_version.с
     22  * @brief  Tests for MHD versions identifiers
     23  * @author Karlson2k (Evgeny Grin)
     24  */
     25 
     26 #include "mhd_options.h"
     27 #include <stdio.h>
     28 #include <string.h>
     29 #include <stdint.h>
     30 #ifdef HAVE_INTTYPES_H
     31 #include <inttypes.h>
     32 #else  /* ! HAVE_INTTYPES_H */
     33 #define PRIX32 "X"
     34 #endif /* ! HAVE_INTTYPES_H */
     35 #ifdef HAVE_STDLIB_H
     36 #include <stdlib.h>
     37 #endif /* HAVE_STDLIB_H */
     38 #include "microhttpd.h"
     39 
     40 
     41 #ifdef PACKAGE_VERSION
     42 static const char str_macro_pkg_ver[] = PACKAGE_VERSION;
     43 #else  /* ! PACKAGE_VERSION */
     44 static const char str_macro_pkg_ver[] = "error!";
     45 #error No PACKAGE_VERSION defined
     46 #endif /* ! PACKAGE_VERSION */
     47 
     48 #ifdef VERSION
     49 static const char str_macro_ver[] = VERSION;
     50 #else  /* ! VERSION */
     51 static const char str_macro_ver[] = "error!";
     52 #error No PACKAGE_VERSION defined
     53 #endif /* ! VERSION */
     54 
     55 #ifdef MHD_VERSION
     56 static const uint32_t bin_macro = (uint32_t) (MHD_VERSION);
     57 #else  /* ! MHD_VERSION */
     58 static const uint32_t bin_macro = 0;
     59 #error MHD_VERSION is not defined
     60 #endif /* ! MHD_VERSION */
     61 
     62 /* 0 = success, 1 = failure */
     63 static int
     64 test_macro1_vs_macro2_str (void)
     65 {
     66   printf ("Checking PACKAGE_VERSION macro vs VERSION macro.\n");
     67   if (0 != strcmp (str_macro_pkg_ver, str_macro_ver))
     68   {
     69     fflush (stdout);
     70     fprintf (stderr, "'%s' vs '%s' - FAILED.\n",
     71              str_macro_pkg_ver, str_macro_ver);
     72     return 1;
     73   }
     74   printf ("'%s' vs '%s' - success.\n",
     75           str_macro_pkg_ver, str_macro_ver);
     76   return 0;
     77 }
     78 
     79 
     80 /* 0 = success, 1 = failure */
     81 static int
     82 test_macro2_vs_func_str (void)
     83 {
     84   const char *str_func = MHD_get_version ();
     85   printf ("Checking VERSION macro vs MHD_get_version() function.\n");
     86   if (NULL == str_func)
     87   {
     88     fflush (stdout);
     89     fprintf (stderr, "MHD_get_version() returned NULL.\n");
     90     fflush (stderr);
     91     return 1;
     92   }
     93   if (0 != strcmp (str_macro_ver, str_func))
     94   {
     95     fflush (stdout);
     96     fprintf (stderr, "'%s' vs '%s' - FAILED.\n",
     97              str_macro_ver, str_func);
     98     fflush (stderr);
     99     return 1;
    100   }
    101   printf ("'%s' vs '%s' - success.\n",
    102           str_macro_ver, str_func);
    103   return 0;
    104 }
    105 
    106 
    107 /* 0 = success, 1 = failure */
    108 static int
    109 test_func_str_vs_macro_bin (void)
    110 {
    111   char bin_print[64];
    112   int res;
    113   const char *str_func = MHD_get_version ();
    114 
    115   printf ("Checking MHD_get_version() function vs MHD_VERSION macro.\n");
    116 #ifdef HAVE_SNPRINTF
    117   res = snprintf (bin_print, sizeof(bin_print), "%X.%X.%X",
    118                   (unsigned int) ((bin_macro >> 24) & 0xFF),
    119                   (unsigned int) ((bin_macro >> 16) & 0xFF),
    120                   (unsigned int) ((bin_macro >> 8) & 0xFF));
    121 #else  /* ! HAVE_SNPRINTF */
    122   res = sprintf (bin_print, "%X.%X.%X",
    123                  (unsigned int) ((bin_macro >> 24) & 0xFF),
    124                  (unsigned int) ((bin_macro >> 16) & 0xFF),
    125                  (unsigned int) ((bin_macro >> 8) & 0xFF));
    126 #endif /* ! HAVE_SNPRINTF */
    127   if ((9 < res) || (0 >= res))
    128   {
    129     fflush (stdout);
    130     fprintf (stderr, "snprintf() error.\n");
    131     fflush (stderr);
    132     exit (99);
    133   }
    134 
    135   if (0 != strcmp (str_func, bin_print))
    136   {
    137     fflush (stdout);
    138     fprintf (stderr, "'%s' vs '0x%08" PRIX32 "' ('%s') - FAILED.\n",
    139              str_func,
    140              bin_macro,
    141              bin_print);
    142     fflush (stderr);
    143     return 1;
    144   }
    145   printf ("'%s' vs '0x%08" PRIX32 "' ('%s') - success.\n",
    146           str_func,
    147           bin_macro,
    148           bin_print);
    149   return 0;
    150 }
    151 
    152 
    153 /* 0 = success, 1 = failure */
    154 static int
    155 test_macro_vs_func_bin (void)
    156 {
    157   const uint32_t bin_func = MHD_get_version_bin ();
    158 
    159   printf ("Checking MHD_VERSION macro vs MHD_get_version_bin() function.\n");
    160   if (bin_macro != bin_func)
    161   {
    162     fflush (stdout);
    163     fprintf (stderr, "'0x%08" PRIX32 "' vs '0x%08" PRIX32 "' - FAILED.\n",
    164              bin_macro, bin_func);
    165     fflush (stderr);
    166     return 1;
    167   }
    168   printf ("'0x%08" PRIX32 "' vs '0x%08" PRIX32 "' - success.\n",
    169           bin_macro, bin_func);
    170   return 0;
    171 }
    172 
    173 
    174 /* 0 = success, 1 = failure */
    175 static int
    176 test_func_bin_format (void)
    177 {
    178   const uint32_t bin_func = MHD_get_version_bin ();
    179   unsigned int test_byte;
    180   int ret = 0;
    181   printf ("Checking format of MHD_get_version_bin() function return value.\n");
    182   test_byte = (unsigned int) ((bin_func >> 24) & 0xFF);
    183   if ((0xA <= (test_byte & 0xF))
    184       || (0xA <= (test_byte >> 4)))
    185   {
    186     fflush (stdout);
    187     fprintf (stderr,
    188              "Invalid value in the first (most significant) byte: %02X\n",
    189              test_byte);
    190     fflush (stderr);
    191     ret = 1;
    192   }
    193   test_byte = (unsigned int) ((bin_func >> 16) & 0xFF);
    194   if ((0xA <= (test_byte & 0xF))
    195       || (0xA <= (test_byte >> 4)))
    196   {
    197     fflush (stdout);
    198     fprintf (stderr,
    199              "Invalid value in the second byte: %02X\n",
    200              test_byte);
    201     fflush (stderr);
    202     ret = 1;
    203   }
    204   test_byte = (unsigned int) ((bin_func >> 8) & 0xFF);
    205   if ((0xA <= (test_byte & 0xF))
    206       || (0xA <= (test_byte >> 4)))
    207   {
    208     fflush (stdout);
    209     fprintf (stderr,
    210              "Invalid value in the third byte: %02X\n",
    211              test_byte);
    212     fflush (stderr);
    213     ret = 1;
    214   }
    215   if (0 != ret)
    216   {
    217     fflush (stdout);
    218     fprintf (stderr,
    219              "The value (0x%08" PRIX32 ") returned by MHD_get_version_bin() "
    220              "function is invalid as it cannot be used as packed BCD form "
    221              "(its hexadecimal representation has at least one digit in "
    222              "A-F range).\n",
    223              bin_func);
    224     fflush (stderr);
    225     return 1;
    226   }
    227   printf ("'0x%08" PRIX32 "' - success.\n", bin_func);
    228   return 0;
    229 }
    230 
    231 
    232 int
    233 main (void)
    234 {
    235   int res;
    236   res = test_macro1_vs_macro2_str ();
    237   res += test_macro2_vs_func_str ();
    238   res += test_func_str_vs_macro_bin ();
    239   res += test_macro_vs_func_bin ();
    240   res += test_func_bin_format ();
    241 
    242   if (0 != res)
    243   {
    244     fflush (stdout);
    245     fprintf (stderr, "Test failed. Number of errors: %d\n", res);
    246     fflush (stderr);
    247     return 1;
    248   }
    249   printf ("Test succeed.\n");
    250   return 0;
    251 }