From d0a37b783584677f24d8f8897ca515557accb5c3 Mon Sep 17 00:00:00 2001 From: Maximilian Szengel Date: Thu, 5 Apr 2012 12:38:15 +0000 Subject: [PATCH] better testing --- src/regex/test_regex.c | 71 ++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/src/regex/test_regex.c b/src/regex/test_regex.c index d32bc9ed8..d4e4e1ec5 100644 --- a/src/regex/test_regex.c +++ b/src/regex/test_regex.c @@ -37,14 +37,20 @@ struct Regex_String_Pair { char *regex; int string_count; - char **strings; - enum Match_Result *expected_results; + char *strings[20]; + enum Match_Result expected_results[20]; }; +static const char allowed_literals[] = + "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + int test_random (unsigned int rx_length, unsigned int max_str_len, unsigned int str_count) { int i; + int j; int rx_exp; char rand_rx[rx_length+1]; char matching_str[str_count][max_str_len+1]; @@ -58,9 +64,9 @@ test_random (unsigned int rx_length, unsigned int max_str_len, unsigned int str_ struct GNUNET_REGEX_Automaton *dfa; regex_t rx; regmatch_t matchptr[1]; - int char_offset; char error[200]; int result; + unsigned int str_len; // At least one string is needed for matching GNUNET_assert (str_count > 0); @@ -74,7 +80,6 @@ test_random (unsigned int rx_length, unsigned int max_str_len, unsigned int str_ for (i=0; istring_count; i++) { eval = GNUNET_REGEX_eval (a, rxstr->strings[i]); - eval_check = regexec (rx, rxstr->strings[i], 0, NULL, 0); + eval_check = regexec (rx, rxstr->strings[i], 1, matchptr, 0); + + // We only want to match the whole string, because that's what our DFA does, too. + if (eval_check == 0 && (matchptr[0].rm_so != 0 || matchptr[0].rm_eo != strlen (rxstr->strings[i]))) + eval_check = 1; if ((rxstr->expected_results[i] == match && (0 != eval || 0 != eval_check)) @@ -190,8 +210,8 @@ test_automaton (struct GNUNET_REGEX_Automaton *a, regex_t *rx, struct Regex_Stri result = 1; regerror (eval_check, rx, error, sizeof error); GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected result:\nregex: %s\nstring: %s\nexpected result: %i\ngnunet regex: %i\nglibc regex: %i\nglibc error: %s\n\n", - rxstr->regex, rxstr->strings[i], rxstr->expected_results[i], eval, eval_check, error); + "Unexpected result:\nregex: %s\nstring: %s\nexpected result: %i\ngnunet regex: %i\nglibc regex: %i\nglibc error: %s\nrm_so: %i\nrm_eo: %i\n\n", + rxstr->regex, rxstr->strings[i], rxstr->expected_results[i], eval, eval_check, error, matchptr[0].rm_so, matchptr[0].rm_eo); } } return result; @@ -211,7 +231,13 @@ main (int argc, char *argv[]) int check_nfa; int check_dfa; int check_rand; - struct Regex_String_Pair rxstr[3]; + struct Regex_String_Pair rxstr[2] = { + {"ab(c|d)+c*(a(b|c)d)+", 5, + {"abcdcdcdcdddddabd", "abcd", "abcddddddccccccccccccccccccccccccabdacdabd", "abccccca", "abcdcdcdccdabdabd"}, + {match, nomatch, match, nomatch, match}}, + {"ab+c*(a(bx|c)d)+", 5, + {"abcdcdcdcdddddabd", "abcd", "abcddddddccccccccccccccccccccccccabdacdabd", "abccccca", "abcdcdcdccdabdabd"}, + {nomatch, nomatch, nomatch, nomatch, nomatch}}}; struct GNUNET_REGEX_Automaton *a; regex_t rx; int i; @@ -220,24 +246,9 @@ main (int argc, char *argv[]) check_dfa = 0; check_rand = 0; - rxstr[0].regex = "ab(c|d)+c*(a(b|c)d)+"; - rxstr[0].string_count = 5; - rxstr[0].strings = GNUNET_malloc (sizeof (char *) * rxstr[0].string_count); - rxstr[0].strings[0] = "abcdcdcdcdddddabd"; - rxstr[0].strings[1] = "abcd"; - rxstr[0].strings[2] = "abcddddddccccccccccccccccccccccccabdacdabd"; - rxstr[0].strings[3] = "abccccca"; - rxstr[0].strings[4] = "abcdcdcdccdabdabd"; - rxstr[0].expected_results = GNUNET_malloc (sizeof (enum Match_Result) * rxstr[0].string_count); - rxstr[0].expected_results[0] = match; - rxstr[0].expected_results[1] = nomatch; - rxstr[0].expected_results[2] = match; - rxstr[0].expected_results[3] = nomatch; - rxstr[0].expected_results[4] = match; - - for (i=0; i<1; i++) + for (i=0; i<2; i++) { - if (0 != regcomp (&rx, rxstr->regex, REG_EXTENDED | REG_NOSUB)) + if (0 != regcomp (&rx, rxstr[i].regex, REG_EXTENDED)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not compile regex using regcomp()\n"); return 1; @@ -258,7 +269,7 @@ main (int argc, char *argv[]) srand (time(NULL)); for (i=0; i< 100; i++) - check_rand += test_random (100, 100, 1); + check_rand += test_random (100, 100, 10); return check_nfa + check_dfa + check_rand; } -- 2.25.1