commit 1e010db7320af28d0cf6bd5c1ca7c0ad3c79ba4d
parent 1a37de9601862a2875629cc6698b17cda4ca534c
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date: Mon, 6 Jun 2022 15:54:57 +0300
test_str_quote: added testing of the new function
Diffstat:
1 file changed, 317 insertions(+), 6 deletions(-)
diff --git a/src/microhttpd/test_str_quote.c b/src/microhttpd/test_str_quote.c
@@ -49,6 +49,7 @@ expect_result_unquote_n (const char *const quoted, const size_t quoted_len,
size_t res_len;
unsigned int ret1;
unsigned int ret2;
+ unsigned int ret3;
mhd_assert (NULL != quoted);
mhd_assert (NULL != unquoted);
@@ -106,7 +107,29 @@ expect_result_unquote_n (const char *const quoted, const size_t quoted_len,
ret2 = 1;
}
- return ret1 + ret2;
+ /* Third check: MHD_str_equal_caseless_quoted_bin_n () */
+ ret3 = 0;
+ if (! MHD_str_equal_caseless_quoted_bin_n (quoted, quoted_len, unquoted,
+ unquoted_len))
+ {
+ fprintf (stderr,
+ "'MHD_str_equal_caseless_quoted_bin_n ()' FAILED: Wrong result:\n");
+ /* This does NOT print part of the string after binary zero */
+ fprintf (stderr,
+ "\tRESULT : MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> true\n"
+ "\tEXPECTED: MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> false\n",
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len,
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len);
+ fprintf (stderr,
+ "The check is at line: %u\n\n", line_num);
+ ret3 = 1;
+ }
+
+ return ret1 + ret2 + ret3;
}
@@ -144,6 +167,77 @@ check_match (void)
/* return zero if succeed, one otherwise */
static unsigned int
+expect_match_caseless_n (const char *const quoted, const size_t quoted_len,
+ const char *const unquoted, const size_t unquoted_len,
+ const unsigned int line_num)
+{
+ unsigned int ret3;
+
+ mhd_assert (NULL != quoted);
+ mhd_assert (NULL != unquoted);
+ mhd_assert (TEST_STR_MAX_LEN > quoted_len);
+
+ /* The check: MHD_str_equal_caseless_quoted_bin_n () */
+ ret3 = 0;
+ if (! MHD_str_equal_caseless_quoted_bin_n (quoted, quoted_len, unquoted,
+ unquoted_len))
+ {
+ fprintf (stderr,
+ "'MHD_str_equal_caseless_quoted_bin_n ()' FAILED: Wrong result:\n");
+ /* This does NOT print part of the string after binary zero */
+ fprintf (stderr,
+ "\tRESULT : MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> true\n"
+ "\tEXPECTED: MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> false\n",
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len,
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len);
+ fprintf (stderr,
+ "The check is at line: %u\n\n", line_num);
+ ret3 = 1;
+ }
+
+ return ret3;
+}
+
+
+#define expect_match_caseless(q,u) \
+ expect_match_caseless_n(q,MHD_STATICSTR_LEN_(q),\
+ u,MHD_STATICSTR_LEN_(u),__LINE__)
+
+static unsigned int
+check_match_caseless (void)
+{
+ unsigned int r = 0; /**< The number of errors */
+
+ r += expect_match_caseless ("a", "A");
+ r += expect_match_caseless ("abC", "aBc");
+ r += expect_match_caseless ("AbCdeF", "aBCdEF");
+ r += expect_match_caseless ("a\0" "Bc", "a\0" "bC");
+ r += expect_match_caseless ("Abc\\\"", "abC\"");
+ r += expect_match_caseless ("\\\"", "\"");
+ r += expect_match_caseless ("\\\"aBc", "\"abc");
+ r += expect_match_caseless ("abc\\\\", "ABC\\");
+ r += expect_match_caseless ("\\\\", "\\");
+ r += expect_match_caseless ("\\\\ABC", "\\abc");
+ r += expect_match_caseless ("\\\\ZYX", "\\ZYX");
+ r += expect_match_caseless ("abc", "ABC");
+ r += expect_match_caseless ("ABCabc", "abcABC");
+ r += expect_match_caseless ("abcXYZ", "ABCxyz");
+ r += expect_match_caseless ("AbCdEfABCabc", "ABcdEFabcABC");
+ r += expect_match_caseless ("a\\\\bc", "A\\BC");
+ r += expect_match_caseless ("ABCa\\\\bc", "abcA\\BC");
+ r += expect_match_caseless ("abcXYZ\\\\", "ABCxyz\\");
+ r += expect_match_caseless ("\\\\AbCdEfABCabc", "\\ABcdEFabcABC");
+
+ return r;
+}
+
+
+/* return zero if succeed, one otherwise */
+static unsigned int
expect_result_invalid_n (const char *const quoted, const size_t quoted_len,
const unsigned int line_num)
{
@@ -202,13 +296,15 @@ check_invalid (void)
}
-/* return zero if succeed, one otherwise */
+/* return zero if succeed, non-zero otherwise */
static unsigned int
expect_result_unmatch_n (const char *const quoted, const size_t quoted_len,
- const char *const unquoted, const size_t unquoted_len,
+ const char *const unquoted,
+ const size_t unquoted_len,
const unsigned int line_num)
{
unsigned int ret2;
+ unsigned int ret3;
mhd_assert (NULL != quoted);
mhd_assert (NULL != unquoted);
@@ -234,7 +330,29 @@ expect_result_unmatch_n (const char *const quoted, const size_t quoted_len,
ret2 = 1;
}
- return ret2;
+ /* The check: MHD_str_equal_quoted_bin_n () */
+ ret3 = 0;
+ if (MHD_str_equal_caseless_quoted_bin_n (quoted, quoted_len, unquoted,
+ unquoted_len))
+ {
+ fprintf (stderr,
+ "'MHD_str_equal_caseless_quoted_bin_n ()' FAILED: Wrong result:\n");
+ /* This does NOT print part of the string after binary zero */
+ fprintf (stderr,
+ "\tRESULT : MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> true\n"
+ "\tEXPECTED: MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> false\n",
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len,
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len);
+ fprintf (stderr,
+ "The check is at line: %u\n\n", line_num);
+ ret3 = 1;
+ }
+
+ return ret2 + ret3;
}
@@ -338,8 +456,6 @@ check_unmatch (void)
r += expect_result_unmatch ("\\\\\\\\\\\\\\\\123", "");
r += expect_result_unmatch ("", "\\\\\\\\123");
/* Various unmatched strings */
- r += expect_result_unmatch ("abc", "ABC");
- r += expect_result_unmatch ("ABCabc", "abcABC");
r += expect_result_unmatch ("a", "x");
r += expect_result_unmatch ("abc", "abcabc");
r += expect_result_unmatch ("abc", "abcabcabc");
@@ -356,14 +472,209 @@ check_unmatch (void)
}
+/* return zero if succeed, one otherwise */
+static unsigned int
+expect_result_case_unmatch_n (const char *const quoted,
+ const size_t quoted_len,
+ const char *const unquoted,
+ const size_t unquoted_len,
+ const unsigned int line_num)
+{
+ unsigned int ret2;
+
+ mhd_assert (NULL != quoted);
+ mhd_assert (NULL != unquoted);
+
+ /* THe check: MHD_str_equal_quoted_bin_n () */
+ ret2 = 0;
+ if (MHD_str_equal_quoted_bin_n (quoted, quoted_len, unquoted, unquoted_len))
+ {
+ fprintf (stderr,
+ "'MHD_str_equal_quoted_bin_n ()' FAILED: Wrong result:\n");
+ /* This does NOT print part of the string after binary zero */
+ fprintf (stderr,
+ "\tRESULT : MHD_str_equal_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> true\n"
+ "\tEXPECTED: MHD_str_equal_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> false\n",
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len,
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len);
+ fprintf (stderr,
+ "The check is at line: %u\n\n", line_num);
+ ret2 = 1;
+ }
+
+ return ret2;
+}
+
+
+#define expect_result_case_unmatch(q,u) \
+ expect_result_case_unmatch_n(q,MHD_STATICSTR_LEN_(q),\
+ u,MHD_STATICSTR_LEN_(u),__LINE__)
+
+static unsigned int
+check_unmatch_case (void)
+{
+ unsigned int r = 0; /**< The number of errors */
+
+ r += expect_result_case_unmatch ("a", "A");
+ r += expect_result_case_unmatch ("abC", "aBc");
+ r += expect_result_case_unmatch ("AbCdeF", "aBCdEF");
+ r += expect_result_case_unmatch ("a\0" "Bc", "a\0" "bC");
+ r += expect_result_case_unmatch ("Abc\\\"", "abC\"");
+ r += expect_result_case_unmatch ("\\\"aBc", "\"abc");
+ r += expect_result_case_unmatch ("abc\\\\", "ABC\\");
+ r += expect_result_case_unmatch ("\\\\ABC", "\\abc");
+ r += expect_result_case_unmatch ("\\\\ZYX", "\\ZYx");
+ r += expect_result_case_unmatch ("abc", "ABC");
+ r += expect_result_case_unmatch ("ABCabc", "abcABC");
+ r += expect_result_case_unmatch ("abcXYZ", "ABCxyz");
+ r += expect_result_case_unmatch ("AbCdEfABCabc", "ABcdEFabcABC");
+ r += expect_result_case_unmatch ("a\\\\bc", "A\\BC");
+ r += expect_result_case_unmatch ("ABCa\\\\bc", "abcA\\BC");
+ r += expect_result_case_unmatch ("abcXYZ\\\\", "ABCxyz\\");
+ r += expect_result_case_unmatch ("\\\\AbCdEfABCabc", "\\ABcdEFabcABC");
+
+ return r;
+}
+
+
+/* return zero if succeed, one otherwise */
+static unsigned int
+expect_result_caseless_unmatch_n (const char *const quoted,
+ const size_t quoted_len,
+ const char *const unquoted,
+ const size_t unquoted_len,
+ const unsigned int line_num)
+{
+ unsigned int ret2;
+ unsigned int ret3;
+
+ mhd_assert (NULL != quoted);
+ mhd_assert (NULL != unquoted);
+
+ /* The check: MHD_str_equal_quoted_bin_n () */
+ ret2 = 0;
+ if (MHD_str_equal_quoted_bin_n (quoted, quoted_len, unquoted, unquoted_len))
+ {
+ fprintf (stderr,
+ "'MHD_str_equal_quoted_bin_n ()' FAILED: Wrong result:\n");
+ /* This does NOT print part of the string after binary zero */
+ fprintf (stderr,
+ "\tRESULT : MHD_str_equal_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> true\n"
+ "\tEXPECTED: MHD_str_equal_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> false\n",
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len,
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len);
+ fprintf (stderr,
+ "The check is at line: %u\n\n", line_num);
+ ret2 = 1;
+ }
+
+ /* The check: MHD_str_equal_quoted_bin_n () */
+ ret3 = 0;
+ if (MHD_str_equal_caseless_quoted_bin_n (quoted, quoted_len, unquoted,
+ unquoted_len))
+ {
+ fprintf (stderr,
+ "'MHD_str_equal_caseless_quoted_bin_n ()' FAILED: Wrong result:\n");
+ /* This does NOT print part of the string after binary zero */
+ fprintf (stderr,
+ "\tRESULT : MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> true\n"
+ "\tEXPECTED: MHD_str_equal_caseless_quoted_bin_n('%.*s', %u, "
+ "'%.*s', %u) -> false\n",
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len,
+ (int) quoted_len, quoted, (unsigned) quoted_len,
+ (int) unquoted_len, unquoted, (unsigned) unquoted_len);
+ fprintf (stderr,
+ "The check is at line: %u\n\n", line_num);
+ ret3 = 1;
+ }
+
+ return ret2 + ret3;
+}
+
+
+#define expect_result_caseless_unmatch(q,u) \
+ expect_result_caseless_unmatch_n(q,MHD_STATICSTR_LEN_(q),\
+ u,MHD_STATICSTR_LEN_(u),__LINE__)
+
+
+static unsigned int
+check_unmatch_caseless (void)
+{
+ unsigned int r = 0; /**< The number of errors */
+
+ /* Matched sequence except invalid backslash at the end */
+ r += expect_result_caseless_unmatch ("a\\", "A");
+ r += expect_result_caseless_unmatch ("abC\\", "abc");
+ r += expect_result_caseless_unmatch ("a\0" "Bc\\", "a\0" "bc");
+ r += expect_result_caseless_unmatch ("abc\\\"\\", "ABC\"");
+ r += expect_result_caseless_unmatch ("\\\"\\", "\"");
+ r += expect_result_caseless_unmatch ("\\\"ABC\\", "\"abc");
+ r += expect_result_caseless_unmatch ("Abc\\\\\\", "abC\\");
+ r += expect_result_caseless_unmatch ("\\\\\\", "\\");
+ r += expect_result_caseless_unmatch ("\\\\aBc\\", "\\abC");
+ /* Difference at binary zero */
+ r += expect_result_caseless_unmatch ("a\0", "A");
+ r += expect_result_caseless_unmatch ("A", "a\0");
+ r += expect_result_caseless_unmatch ("abC\0", "abc");
+ r += expect_result_caseless_unmatch ("abc", "ABc\0");
+ r += expect_result_caseless_unmatch ("a\0" "bC\0", "a\0" "bc");
+ r += expect_result_caseless_unmatch ("a\0" "bc", "A\0" "bc\0");
+ r += expect_result_caseless_unmatch ("ABC\\\"\0", "abc\"");
+ r += expect_result_caseless_unmatch ("abc\\\"", "ABC\"\0");
+ r += expect_result_caseless_unmatch ("\\\"aBc\0", "\"abc");
+ r += expect_result_caseless_unmatch ("\\\"Abc", "\"abc\0");
+ r += expect_result_caseless_unmatch ("\\\\\\\\\\\\\\\\\0", "\\\\\\\\");
+ r += expect_result_caseless_unmatch ("\\\\\\\\\\\\\\\\", "\\\\\\\\\0");
+ r += expect_result_caseless_unmatch ("\\\\\\\\\\\\\0" "\\\\", "\\\\\\\\");
+ r += expect_result_caseless_unmatch ("\\\\\\\\\\\\\\\\", "\\\\\\\0" "\\");
+ r += expect_result_caseless_unmatch ("\0" "aBc", "abc");
+ r += expect_result_caseless_unmatch ("abc", "\0" "abC");
+ r += expect_result_caseless_unmatch ("\0" "abc", "0abc");
+ r += expect_result_caseless_unmatch ("0abc", "\0" "aBc");
+ r += expect_result_caseless_unmatch ("xyZ", "xy" "\0" "z");
+ r += expect_result_caseless_unmatch ("Xy" "\0" "z", "xyz");
+ /* Difference after binary zero */
+ r += expect_result_caseless_unmatch ("abc\0" "1", "aBC\0" "2");
+ r += expect_result_caseless_unmatch ("a\0" "bcX", "a\0" "bcy");
+ r += expect_result_caseless_unmatch ("\0" "abc\\\"2", "\0" "Abc\"1");
+ r += expect_result_caseless_unmatch ("\0" "Abc1\\\"", "\0" "abc2\"");
+ r += expect_result_caseless_unmatch ("\0" "\\\"c", "\0" "\"d");
+ r += expect_result_caseless_unmatch ("\\\"ab" "\0" "1C", "\"ab" "\0" "2C");
+ r += expect_result_caseless_unmatch ("a\0" "BCDef2", "a\0" "bcdef1");
+ r += expect_result_caseless_unmatch ("a\0" "bc2def", "a\0" "BC1def");
+ r += expect_result_caseless_unmatch ("a\0" "1bcdeF", "a\0" "2bcdef");
+ r += expect_result_caseless_unmatch ("abcde\0" "f2", "ABCDE\0" "f1");
+ r += expect_result_caseless_unmatch ("\\\"ab" "\0" "XC", "\"ab" "\0" "yC");
+ r += expect_result_caseless_unmatch ("a\0" "BCDefY", "a\0" "bcdefx");
+ r += expect_result_caseless_unmatch ("a\0" "bczdef", "a\0" "BCXdef");
+ r += expect_result_caseless_unmatch ("a\0" "YbcdeF", "a\0" "zbcdef");
+ r += expect_result_caseless_unmatch ("abcde\0" "fy", "ABCDE\0" "fX");
+
+ return r;
+}
+
+
int
main (int argc, char *argv[])
{
unsigned int errcount = 0;
(void) argc; (void) argv; /* Unused. Silent compiler warning. */
errcount += check_match ();
+ errcount += check_match_caseless ();
errcount += check_invalid ();
errcount += check_unmatch ();
+ errcount += check_unmatch_case ();
+ errcount += check_unmatch_caseless ();
if (0 == errcount)
printf ("All tests were passed without errors.\n");
return errcount == 0 ? 0 : 1;