2 This file is part of GNUnet
3 (C) 2012 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
21 * @file regex/test_regex_proofs.c
22 * @brief test for regex.c
23 * @author Maximilian Szengel
26 #include "gnunet_regex_lib.h"
27 #include "regex_internal.h"
31 * Test if the given regex's canonical regex is the same as this canonical
32 * regex's canonical regex. Confused? Ok, then: 1. construct a dfa A from the
33 * given 'regex' 2. get the canonical regex of dfa A 3. construct a dfa B from
34 * this canonical regex 3. compare the canonical regex of dfa A with the
35 * canonical regex of dfa B.
37 * @param regex regular expression used for this test (see above).
39 * @return 0 on success, 1 on failure
42 test_proof (const char *regex)
45 struct GNUNET_REGEX_Automaton *dfa;
49 dfa = GNUNET_REGEX_construct_dfa (regex, strlen (regex));
50 c_rx1 = GNUNET_strdup (GNUNET_REGEX_get_canonical_regex (dfa));
51 GNUNET_REGEX_automaton_destroy (dfa);
52 dfa = GNUNET_REGEX_construct_dfa (c_rx1, strlen (c_rx1));
53 c_rx2 = GNUNET_REGEX_get_canonical_regex (dfa);
55 error = (0 == strcmp (c_rx1, c_rx2)) ? 0 : 1;
59 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
60 "Comparing canonical regex of\n%s\nfailed:\n%s\nvs.\n%s\n",
65 GNUNET_REGEX_automaton_destroy (dfa);
71 * Use 'test_proof' function to randomly test the canonical regexes of 'count'
72 * random expressions of length 'rx_length'.
74 * @param count number of random regular expressions to test.
75 * @param rx_length length of the random regular expressions.
77 * @return 0 on succes, number of failures otherwise.
80 test_proofs_random (unsigned int count, size_t rx_length)
84 unsigned int failures;
88 for (i = 0; i < count; i++)
90 rand_rx = GNUNET_REGEX_generate_random_regex (rx_length, NULL);
91 failures += test_proof (rand_rx);
92 GNUNET_free (rand_rx);
99 * Test a number of known examples of regexes for proper canonicalization.
101 * @return 0 on success, number of failures otherwise.
104 test_proofs_static (void)
109 const char *regex[6] = {
117 /* "((j|2j)K|(j|2j)AK|(j|2j)(D|e|(j|2j)A(D|e))D*K)", */
118 /* "((j|2j)K|(j|2j)(D|e|((j|2j)j|(j|2j)2j)A(D|e))D*K|(j|2j)AK)", */
121 const char *canon_rx1;
122 const char *canon_rx2;
123 struct GNUNET_REGEX_Automaton *dfa1;
124 struct GNUNET_REGEX_Automaton *dfa2;
128 for (i = 0; i < 6; i += 2)
130 dfa1 = GNUNET_REGEX_construct_dfa (regex[i], strlen (regex[i]));
131 dfa2 = GNUNET_REGEX_construct_dfa (regex[i + 1], strlen (regex[i + 1]));
133 canon_rx1 = GNUNET_REGEX_get_canonical_regex (dfa1);
134 canon_rx2 = GNUNET_REGEX_get_canonical_regex (dfa2);
136 error += (0 == strcmp (canon_rx1, canon_rx2)) ? 0 : 1;
140 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
141 "Comparing canonical regex failed:\nrx1: %s\ncrx1: %s\nrx2: %s\ncrx2: %s\n",
142 regex[i], canon_rx1, regex[i + 1], canon_rx2);
144 /* Save the graphs of the two conflicting DFAs */
145 /* GNUNET_REGEX_automaton_save_graph (dfa1, "proofs_fail_dfa1.dot"); */
146 /* GNUNET_REGEX_automaton_save_graph (dfa2, "proofs_fail_dfa2.dot"); */
149 GNUNET_REGEX_automaton_destroy (dfa1);
150 GNUNET_REGEX_automaton_destroy (dfa2);
158 main (int argc, char *argv[])
160 GNUNET_log_setup ("test-regex",
172 error += test_proofs_static ();
173 /* error += test_proofs_random (10000, 10); */