/* This file is part of libmicrohttpd Copyright (C) 2017-2021 Karlson2k (Evgeny Grin) This test tool is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This test tool is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file microhttpd/test_http_reasons.c * @brief Unit tests for MHD_get_reason_phrase_for() function * @author Karlson2k (Evgeny Grin) */ #include "mhd_options.h" #include #include #include "microhttpd.h" #include "mhd_str.h" static const char *const r_unknown = "unknown"; /* Return zero when no error is detected */ static int expect_result (unsigned int code, const char *expected) { const char *const reason = MHD_get_reason_phrase_for (code); const size_t len = MHD_get_reason_phrase_len_for (code); size_t exp_len; if (! MHD_str_equal_caseless_ (reason, expected)) { fprintf (stderr, "Incorrect reason returned for code %u:\n Returned: \"%s\" \tExpected: \"%s\"\n", code, reason, expected); return 1; } if (r_unknown == expected) exp_len = 0; else exp_len = strlen (expected); if (exp_len != len) { fprintf (stderr, "Incorrect reason length returned for code %u:\n Returned: \"%u\" \tExpected: \"%u\"\n", code, (unsigned) len, (unsigned) exp_len); return 1; } return 0; } static int expect_absent (unsigned int code) { return expect_result (code, r_unknown); } static int test_absent_codes (void) { int errcount = 0; errcount += expect_absent (0); errcount += expect_absent (1); errcount += expect_absent (50); errcount += expect_absent (99); errcount += expect_absent (600); errcount += expect_absent (601); errcount += expect_absent (900); errcount += expect_absent (10000); return errcount; } static int test_1xx (void) { int errcount = 0; errcount += expect_result (MHD_HTTP_CONTINUE, "continue"); errcount += expect_result (MHD_HTTP_PROCESSING, "processing"); errcount += expect_absent (110); errcount += expect_absent (190); return errcount; } static int test_2xx (void) { int errcount = 0; errcount += expect_result (MHD_HTTP_OK, "ok"); errcount += expect_result (MHD_HTTP_ALREADY_REPORTED, "already reported"); errcount += expect_absent (217); errcount += expect_result (MHD_HTTP_IM_USED, "im used"); errcount += expect_absent (230); errcount += expect_absent (295); return errcount; } static int test_3xx (void) { int errcount = 0; errcount += expect_result (MHD_HTTP_MULTIPLE_CHOICES, "multiple choices"); errcount += expect_result (MHD_HTTP_SEE_OTHER, "see other"); errcount += expect_result (MHD_HTTP_PERMANENT_REDIRECT, "permanent redirect"); errcount += expect_absent (311); errcount += expect_absent (399); return errcount; } static int test_4xx (void) { int errcount = 0; errcount += expect_result (MHD_HTTP_BAD_REQUEST, "bad request"); errcount += expect_result (MHD_HTTP_NOT_FOUND, "not found"); errcount += expect_result (MHD_HTTP_URI_TOO_LONG, "uri too long"); errcount += expect_result (MHD_HTTP_EXPECTATION_FAILED, "expectation failed"); errcount += expect_result (MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, "request header fields too large"); errcount += expect_absent (441); errcount += expect_result (MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS, "unavailable for legal reasons"); errcount += expect_absent (470); errcount += expect_absent (493); return errcount; } static int test_5xx (void) { int errcount = 0; errcount += expect_result (MHD_HTTP_INTERNAL_SERVER_ERROR, "internal server error"); errcount += expect_result (MHD_HTTP_BAD_GATEWAY, "bad gateway"); errcount += expect_result (MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED, "http version not supported"); errcount += expect_result (MHD_HTTP_NETWORK_AUTHENTICATION_REQUIRED, "network authentication required"); errcount += expect_absent (520); errcount += expect_absent (597); return errcount; } int main (int argc, char *argv[]) { int errcount = 0; (void) argc; (void) argv; /* Unused. Silent compiler warning. */ errcount += test_absent_codes (); errcount += test_1xx (); errcount += test_2xx (); errcount += test_3xx (); errcount += test_4xx (); errcount += test_5xx (); return errcount == 0 ? 0 : 1; }