| /* |
| 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_str_token.c |
| * @brief Unit tests for MHD_str_remove_token_caseless_() function |
| * @author Karlson2k (Evgeny Grin) |
| */ |
| |
| #include "mhd_options.h" |
| #include <string.h> |
| #include <stdio.h> |
| #include "mhd_str.h" |
| #include "mhd_assert.h" |
| |
| |
| static int |
| expect_result_n (const char *str, size_t str_len, |
| const char *token, size_t token_len, |
| const char *expected, size_t expected_len, |
| const bool expected_removed) |
| { |
| char buf_in[1024]; |
| char buf_token[256]; |
| char buf_out[1024]; |
| size_t buf_len; |
| |
| mhd_assert (sizeof(buf_in) > str_len + 2); |
| mhd_assert (sizeof(buf_token) > token_len + 2); |
| mhd_assert (sizeof(buf_out) > expected_len + 2); |
| |
| memset (buf_in, '#', sizeof(buf_in)); |
| memset (buf_token, '#', sizeof(buf_token)); |
| memcpy (buf_in, str, str_len); /* Copy without zero-termination */ |
| memcpy (buf_token, token, token_len); /* Copy without zero-termination */ |
| |
| for (buf_len = 0; buf_len <= expected_len + 3; ++buf_len) |
| { |
| bool res; |
| ssize_t result_len; |
| memset (buf_out, '$', sizeof(buf_out)); |
| |
| result_len = (ssize_t) buf_len; |
| mhd_assert (0 <= result_len); |
| |
| res = MHD_str_remove_token_caseless_ (buf_in, str_len, buf_token, token_len, |
| buf_out, &result_len); |
| if (buf_len < expected_len) |
| { /* The result should not fit into the buffer */ |
| if (res || (0 < result_len)) |
| { |
| fprintf (stderr, |
| "MHD_str_remove_token_caseless_() FAILED:\n" |
| "\tMHD_str_remove_token_caseless_(\"%.*s\", %lu," |
| " \"%.*s\", %lu, buf, &(%ld->%ld)) returned %s\n", |
| (int) str_len + 2, buf_in, (unsigned long) str_len, |
| (int) token_len + 2, buf_token, (unsigned long) token_len, |
| (long) buf_len, (long) result_len, res ? "true" : "false"); |
| return 1; |
| } |
| } |
| else |
| { /* The result should fit into the buffer */ |
| if ( (expected_removed != res) || |
| (expected_len != (size_t) result_len) || |
| ((0 != result_len) && (0 != memcmp (expected, buf_out, |
| (size_t) result_len))) || |
| ('$' != buf_out[result_len])) |
| { |
| fprintf (stderr, |
| "MHD_str_remove_token_caseless_() FAILED:\n" |
| "\tMHD_str_remove_token_caseless_(\"%.*s\", %lu," |
| " \"%.*s\", %lu, \"%.*s\", &(%ld->%ld)) returned %s\n", |
| (int) str_len + 2, buf_in, (unsigned long) str_len, |
| (int) token_len + 2, buf_token, (unsigned long) token_len, |
| (int) expected_len + 2, buf_out, |
| (long) buf_len, (long) result_len, |
| res ? "true" : "false"); |
| return 1; |
| } |
| } |
| } |
| return 0; |
| } |
| |
| |
| #define expect_result(s,t,e,found) \ |
| expect_result_n ((s),MHD_STATICSTR_LEN_ (s), \ |
| (t),MHD_STATICSTR_LEN_ (t), \ |
| (e),MHD_STATICSTR_LEN_ (e), found) |
| |
| static int |
| check_result (void) |
| { |
| int errcount = 0; |
| errcount += expect_result ("string", "string", "", true); |
| errcount += expect_result ("String", "string", "", true); |
| errcount += expect_result ("string", "String", "", true); |
| errcount += expect_result ("strinG", "String", "", true); |
| errcount += expect_result ("\t strinG", "String", "", true); |
| errcount += expect_result ("strinG\t ", "String", "", true); |
| errcount += expect_result (" \t tOkEn ", "toKEN", "", true); |
| errcount += expect_result ("not token\t, tOkEn ", "toKEN", "not token", |
| true); |
| errcount += expect_result ("not token,\t tOkEn, more token", "toKEN", |
| "not token, more token", true); |
| errcount += expect_result ("not token,\t tOkEn\t, more token", "toKEN", |
| "not token, more token", true); |
| errcount += expect_result (",,,,,,test,,,,", "TESt", "", true); |
| errcount += expect_result (",,,,,\t,test,,,,", "TESt", "", true); |
| errcount += expect_result (",,,,,,test, ,,,", "TESt", "", true); |
| errcount += expect_result (",,,,,, test,,,,", "TESt", "", true); |
| errcount += expect_result (",,,,,, test not,test,,", "TESt", "test not", |
| true); |
| errcount += expect_result (",,,,,, test not,,test,,", "TESt", "test not", |
| true); |
| errcount += expect_result (",,,,,, test not ,test,,", "TESt", "test not", |
| true); |
| errcount += expect_result (",,,,,, test", "TESt", "", true); |
| errcount += expect_result (",,,,,, test ", "TESt", "", true); |
| errcount += expect_result ("no test,,,,,, test ", "TESt", "no test", |
| true); |
| errcount += expect_result ("the-token,, the-token , the-token" \ |
| ",the-token ,the-token", "the-token", "", true); |
| errcount += expect_result (" the-token,, the-token , the-token," \ |
| "the-token ,the-token ", "the-token", "", true); |
| errcount += expect_result (" the-token ,, the-token , the-token," \ |
| "the-token , the-token ", "the-token", "", true); |
| errcount += expect_result ("the-token,a, the-token , the-token,b," \ |
| "the-token , c,the-token", "the-token", "a, b, c", |
| true); |
| errcount += expect_result (" the-token, a, the-token , the-token, b," \ |
| "the-token ,c ,the-token ", "the-token", |
| "a, b, c", true); |
| errcount += expect_result (" the-token , a , the-token , the-token, b ," \ |
| "the-token , c , the-token ", "the-token", |
| "a, b, c",true); |
| errcount += expect_result ("the-token,aa, the-token , the-token,bb," \ |
| "the-token , cc,the-token", "the-token", |
| "aa, bb, cc", true); |
| errcount += expect_result (" the-token, aa, the-token , the-token, bb," \ |
| "the-token ,cc ,the-token ", "the-token", |
| "aa, bb, cc", true); |
| errcount += expect_result (" the-token , aa , the-token , the-token, bb ," \ |
| "the-token , cc , the-token ", "the-token", |
| "aa, bb, cc", true); |
| |
| errcount += expect_result ("strin", "string", "strin", false); |
| errcount += expect_result ("Stringer", "string", "Stringer", false); |
| errcount += expect_result ("sstring", "String", "sstring", false); |
| errcount += expect_result ("string", "Strin", "string", false); |
| errcount += expect_result ("\t( strinG", "String", "( strinG", false); |
| errcount += expect_result (")strinG\t ", "String", ")strinG", false); |
| errcount += expect_result (" \t tOkEn t ", "toKEN", "tOkEn t", false); |
| errcount += expect_result ("not token\t, tOkEner ", "toKEN", |
| "not token, tOkEner", false); |
| errcount += expect_result ("not token,\t tOkEns, more token", "toKEN", |
| "not token, tOkEns, more token", false); |
| errcount += expect_result ("not token,\t tOkEns\t, more token", "toKEN", |
| "not token, tOkEns, more token", false); |
| errcount += expect_result (",,,,,,testing,,,,", "TESt", "testing", false); |
| errcount += expect_result (",,,,,\t,test,,,,", "TESting", "test", false); |
| errcount += expect_result ("tests,,,,,,quest, ,,,", "TESt", "tests, quest", |
| false); |
| errcount += expect_result (",,,,,, testы,,,,", "TESt", "testы", false); |
| errcount += expect_result (",,,,,, test not,хtest,,", "TESt", |
| "test not, хtest", false); |
| errcount += expect_result ("testing,,,,,, test not,,test2,,", "TESt", |
| "testing, test not, test2", false); |
| errcount += expect_result (",testi,,,,, test not ,test,,", "TESting", |
| "testi, test not, test", false); |
| errcount += expect_result (",,,,,,2 test", "TESt", "2 test", false); |
| errcount += expect_result (",,,,,,test test ", "test", "test test", |
| false); |
| errcount += expect_result ("no test,,,,,,test test", "test", |
| "no test, test test", false); |
| errcount += expect_result (",,,,,,,,,,,,,,,,,,,", "the-token", "", false); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,", "the-token", |
| "a, b, c, d, e, f, g", false); |
| errcount += expect_result (",,,,,,,,,,,,,,,,,,,", "", "", false); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,", "", |
| "a, b, c, d, e, f, g", false); |
| errcount += expect_result ("a,b,c,d,e,f,g", "", "a, b, c, d, e, f, g", |
| false); |
| errcount += expect_result ("a1,b1,c1,d1,e1,f1,g1", "", |
| "a1, b1, c1, d1, e1, f1, g1", false); |
| |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,the-token", |
| "the-token", "a, b, c, d, e, f, g", true); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,the-token,", |
| "the-token", "a, b, c, d, e, f, g", true); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,the-token,x", |
| "the-token", "a, b, c, d, e, f, g, x", true); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,the-token x", |
| "the-token", "a, b, c, d, e, f, g, the-token x", |
| false); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,the-token x,", |
| "the-token", "a, b, c, d, e, f, g, the-token x", |
| false); |
| errcount += expect_result (",a,b,c,d,e,f,g,,,,,,,,,,,,the-token x,x", |
| "the-token", "a, b, c, d, e, f, g," \ |
| " the-token x, x", false); |
| errcount += expect_result ("the-token,a,b,c,d,e,f,g,,,,,,,,,,,,the-token", |
| "the-token", "a, b, c, d, e, f, g", true); |
| errcount += expect_result ("the-token ,a,b,c,d,e,f,g,,,,,,,,,,,,the-token,", |
| "the-token", "a, b, c, d, e, f, g", true); |
| errcount += expect_result ("the-token,a,b,c,d,e,f,g,,,,,,,,,,,,the-token,x", |
| "the-token", "a, b, c, d, e, f, g, x", true); |
| errcount += expect_result ("the-token x,a,b,c,d,e,f,g,,,,,,,,,,,," \ |
| "the-token x", "the-token", |
| "the-token x, a, b, c, d, e, f, g, the-token x", |
| false); |
| errcount += expect_result ("the-token x,a,b,c,d,e,f,g,,,,,,,,,,,," \ |
| "the-token x,", "the-token", |
| "the-token x, a, b, c, d, e, f, g, the-token x", |
| false); |
| errcount += expect_result ("the-token x,a,b,c,d,e,f,g,,,,,,,,,,,," \ |
| "the-token x,x", "the-token", |
| "the-token x, a, b, c, d, e, f, g, " \ |
| "the-token x, x", false); |
| |
| return errcount; |
| } |
| |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| int errcount = 0; |
| (void) argc; (void) argv; /* Unused. Silent compiler warning. */ |
| errcount += check_result (); |
| return errcount == 0 ? 0 : 1; |
| } |