Line data Source code
1 : /* t-recsel.c - Module test for recsel.c
2 : * Copyright (C) 2016 Werner Koch
3 : *
4 : * This file is part of GnuPG.
5 : *
6 : * GnuPG is free software; you can redistribute it and/or modify
7 : * it under the terms of the GNU General Public License as published by
8 : * the Free Software Foundation; either version 3 of the License, or
9 : * (at your option) any later version.
10 : *
11 : * GnuPG is distributed in the hope that it will be useful,
12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : * GNU General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License
17 : * along with this program; if not, see <https://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include <config.h>
21 : #include <stdio.h>
22 : #include <stdlib.h>
23 : #include <string.h>
24 :
25 : #include "util.h"
26 : #include "init.h"
27 : #include "recsel.h"
28 :
29 : #define PGM "t-recsel"
30 :
31 : #define pass() do { ; } while(0)
32 : #define fail(a,e) do { log_error ("line %d: test %d failed: %s\n", \
33 : __LINE__, (a), gpg_strerror ((e))); \
34 : exit (1); \
35 : } while(0)
36 :
37 : static int verbose;
38 : static int debug;
39 :
40 :
41 : #define FREEEXPR() do { recsel_release (se); se = NULL; } while (0)
42 : #define ADDEXPR(a) do { \
43 : err = recsel_parse_expr (&se, (a)); \
44 : if (err) \
45 : fail (0, err); \
46 : } while (0)
47 :
48 :
49 : static const char *
50 46 : test_1_getval (void *cookie, const char *name)
51 : {
52 46 : if (strcmp (name, "uid"))
53 0 : fail (0, 0);
54 46 : return cookie;
55 : }
56 :
57 : static void
58 1 : run_test_1 (void)
59 : {
60 : static const char *expr[] = {
61 : "uid =~ Alfa",
62 : "&& uid !~ Test ",
63 : "|| uid =~ Alpha",
64 : " uid !~ Test"
65 : };
66 : gpg_error_t err;
67 1 : recsel_expr_t se = NULL;
68 : int i;
69 :
70 5 : for (i=0; i < DIM (expr); i++)
71 : {
72 4 : err = recsel_parse_expr (&se, expr[i]);
73 4 : if (err)
74 0 : fail (i, err);
75 : }
76 :
77 1 : if (debug)
78 0 : recsel_dump (se);
79 :
80 : /* The example from recsel.c in several variants. */
81 1 : if (!recsel_select (se, test_1_getval, "Alfa"))
82 0 : fail (0, 0);
83 1 : if (!recsel_select (se, test_1_getval, "Alpha"))
84 0 : fail (0, 0);
85 1 : if (recsel_select (se, test_1_getval, "Alfa Test"))
86 0 : fail (0, 0);
87 1 : if (recsel_select (se, test_1_getval, "Alpha Test"))
88 0 : fail (0, 0);
89 :
90 : /* Some modified versions from above. */
91 1 : if (!recsel_select (se, test_1_getval, " AlfA Tes"))
92 0 : fail (0, 0);
93 1 : if (!recsel_select (se, test_1_getval, " AlfA Tes "))
94 0 : fail (0, 0);
95 1 : if (!recsel_select (se, test_1_getval, " Tes AlfA"))
96 0 : fail (0, 0);
97 1 : if (!recsel_select (se, test_1_getval, "TesAlfA"))
98 0 : fail (0, 0);
99 :
100 : /* Simple cases. */
101 1 : if (recsel_select (se, NULL, NULL))
102 0 : fail (0, 0);
103 1 : if (recsel_select (se, test_1_getval, NULL))
104 0 : fail (0, 0);
105 1 : if (recsel_select (se, test_1_getval, ""))
106 0 : fail (0, 0);
107 :
108 1 : FREEEXPR();
109 1 : }
110 :
111 :
112 : /* Same as test1 but using a combined expression.. */
113 : static void
114 1 : run_test_1b (void)
115 : {
116 : gpg_error_t err;
117 1 : recsel_expr_t se = NULL;
118 :
119 1 : err = recsel_parse_expr
120 : (&se, "uid =~ Alfa && uid !~ Test || uid =~ Alpha && uid !~ Test" );
121 1 : if (err)
122 0 : fail (0, err);
123 :
124 1 : if (debug)
125 0 : recsel_dump (se);
126 :
127 : /* The example from recsel.c in several variants. */
128 1 : if (!recsel_select (se, test_1_getval, "Alfa"))
129 0 : fail (0, 0);
130 1 : if (!recsel_select (se, test_1_getval, "Alpha"))
131 0 : fail (0, 0);
132 1 : if (recsel_select (se, test_1_getval, "Alfa Test"))
133 0 : fail (0, 0);
134 1 : if (recsel_select (se, test_1_getval, "Alpha Test"))
135 0 : fail (0, 0);
136 :
137 : /* Some modified versions from above. */
138 1 : if (!recsel_select (se, test_1_getval, " AlfA Tes"))
139 0 : fail (0, 0);
140 1 : if (!recsel_select (se, test_1_getval, " AlfA Tes "))
141 0 : fail (0, 0);
142 1 : if (!recsel_select (se, test_1_getval, " Tes AlfA"))
143 0 : fail (0, 0);
144 1 : if (!recsel_select (se, test_1_getval, "TesAlfA"))
145 0 : fail (0, 0);
146 :
147 : /* Simple cases. */
148 1 : if (recsel_select (se, NULL, NULL))
149 0 : fail (0, 0);
150 1 : if (recsel_select (se, test_1_getval, NULL))
151 0 : fail (0, 0);
152 1 : if (recsel_select (se, test_1_getval, ""))
153 0 : fail (0, 0);
154 :
155 1 : FREEEXPR();
156 1 : }
157 :
158 :
159 : static const char *
160 44 : test_2_getval (void *cookie, const char *name)
161 : {
162 44 : if (!strcmp (name, "uid"))
163 13 : return "foo@example.org";
164 31 : else if (!strcmp (name, "keyid"))
165 8 : return "0x12345678";
166 23 : else if (!strcmp (name, "zero"))
167 2 : return "0";
168 21 : else if (!strcmp (name, "one"))
169 2 : return "1";
170 19 : else if (!strcmp (name, "blanks"))
171 4 : return " ";
172 15 : else if (!strcmp (name, "letters"))
173 3 : return "abcde";
174 12 : else if (!strcmp (name, "str1"))
175 7 : return "aaa";
176 : else
177 5 : return cookie;
178 : }
179 :
180 : static void
181 1 : run_test_2 (void)
182 : {
183 : gpg_error_t err;
184 1 : recsel_expr_t se = NULL;
185 :
186 1 : ADDEXPR ("uid = foo@example.org");
187 1 : if (!recsel_select (se, test_2_getval, NULL))
188 0 : fail (0, 0);
189 1 : FREEEXPR();
190 1 : ADDEXPR ("uid = Foo@example.org");
191 1 : if (!recsel_select (se, test_2_getval, NULL))
192 0 : fail (0, 0);
193 1 : FREEEXPR();
194 1 : ADDEXPR ("-c uid = Foo@example.org");
195 1 : if (recsel_select (se, test_2_getval, NULL))
196 0 : fail (0, 0);
197 :
198 1 : FREEEXPR();
199 1 : ADDEXPR ("uid =~ foo@example.org");
200 1 : if (!recsel_select (se, test_2_getval, NULL))
201 0 : fail (0, 0);
202 1 : FREEEXPR();
203 1 : ADDEXPR ("uid =~ Foo@example.org");
204 1 : if (!recsel_select (se, test_2_getval, NULL))
205 0 : fail (0, 0);
206 1 : FREEEXPR();
207 1 : ADDEXPR ("-c uid =~ Foo@example.org");
208 1 : if (recsel_select (se, test_2_getval, NULL))
209 0 : fail (0, 0);
210 :
211 1 : FREEEXPR();
212 1 : ADDEXPR ("uid !~ foo@example.org");
213 1 : if (recsel_select (se, test_2_getval, NULL))
214 0 : fail (0, 0);
215 1 : FREEEXPR();
216 1 : ADDEXPR ("uid !~ Foo@example.org");
217 1 : if (recsel_select (se, test_2_getval, NULL))
218 0 : fail (0, 0);
219 1 : FREEEXPR();
220 1 : ADDEXPR ("-c uid !~ Foo@example.org");
221 1 : if (!recsel_select (se, test_2_getval, NULL))
222 0 : fail (0, 0);
223 :
224 1 : FREEEXPR();
225 1 : ADDEXPR ("uid =~ @");
226 1 : if (!recsel_select (se, test_2_getval, NULL))
227 0 : fail (0, 0);
228 1 : FREEEXPR();
229 1 : ADDEXPR ("uid =~ @");
230 1 : if (!recsel_select (se, test_2_getval, NULL))
231 0 : fail (0, 0);
232 :
233 1 : FREEEXPR();
234 1 : ADDEXPR ("keyid == 0x12345678");
235 1 : if (!recsel_select (se, test_2_getval, NULL))
236 0 : fail (0, 0);
237 1 : FREEEXPR();
238 1 : ADDEXPR ("keyid != 0x12345678");
239 1 : if (recsel_select (se, test_2_getval, NULL))
240 0 : fail (0, 0);
241 1 : FREEEXPR();
242 1 : ADDEXPR ("keyid >= 0x12345678");
243 1 : if (!recsel_select (se, test_2_getval, NULL))
244 0 : fail (0, 0);
245 1 : FREEEXPR();
246 1 : ADDEXPR ("keyid <= 0x12345678");
247 1 : if (!recsel_select (se, test_2_getval, NULL))
248 0 : fail (0, 0);
249 1 : FREEEXPR();
250 1 : ADDEXPR ("keyid > 0x12345677");
251 1 : if (!recsel_select (se, test_2_getval, NULL))
252 0 : fail (0, 0);
253 1 : FREEEXPR();
254 1 : ADDEXPR ("keyid < 0x12345679");
255 1 : if (!recsel_select (se, test_2_getval, NULL))
256 0 : fail (0, 0);
257 :
258 1 : FREEEXPR();
259 1 : ADDEXPR ("keyid > 0x12345678");
260 1 : if (recsel_select (se, test_2_getval, NULL))
261 0 : fail (0, 0);
262 1 : FREEEXPR();
263 1 : ADDEXPR ("keyid < 0x12345678");
264 1 : if (recsel_select (se, test_2_getval, NULL))
265 0 : fail (0, 0);
266 :
267 :
268 1 : FREEEXPR();
269 1 : ADDEXPR ("str1 -gt aa");
270 1 : if (!recsel_select (se, test_2_getval, NULL))
271 0 : fail (0, 0);
272 1 : FREEEXPR();
273 1 : ADDEXPR ("str1 -gt aaa");
274 1 : if (recsel_select (se, test_2_getval, NULL))
275 0 : fail (0, 0);
276 1 : FREEEXPR();
277 1 : ADDEXPR ("str1 -ge aaa");
278 1 : if (!recsel_select (se, test_2_getval, NULL))
279 0 : fail (0, 0);
280 1 : FREEEXPR();
281 1 : ADDEXPR ("str1 -lt aab");
282 1 : if (!recsel_select (se, test_2_getval, NULL))
283 0 : fail (0, 0);
284 1 : FREEEXPR();
285 1 : ADDEXPR ("str1 -le aaa");
286 1 : if (!recsel_select (se, test_2_getval, NULL))
287 0 : fail (0, 0);
288 :
289 1 : FREEEXPR();
290 1 : ADDEXPR ("-c str1 -lt AAB");
291 1 : if (recsel_select (se, test_2_getval, NULL))
292 0 : fail (0, 0);
293 1 : FREEEXPR();
294 1 : ADDEXPR ("str1 -lt AAB");
295 1 : if (!recsel_select (se, test_2_getval, NULL))
296 0 : fail (0, 0);
297 :
298 :
299 1 : FREEEXPR();
300 1 : ADDEXPR ("uid -n");
301 1 : if (!recsel_select (se, test_2_getval, NULL))
302 0 : fail (0, 0);
303 1 : FREEEXPR();
304 1 : ADDEXPR ("uid -z");
305 1 : if (recsel_select (se, test_2_getval, NULL))
306 0 : fail (0, 0);
307 :
308 1 : FREEEXPR();
309 1 : ADDEXPR ("nothing -z");
310 1 : if (!recsel_select (se, test_2_getval, NULL))
311 0 : fail (0, 0);
312 1 : FREEEXPR();
313 1 : ADDEXPR ("nothing -n");
314 1 : if (recsel_select (se, test_2_getval, NULL))
315 0 : fail (0, 0);
316 :
317 1 : FREEEXPR();
318 1 : ADDEXPR ("blanks -n");
319 1 : if (!recsel_select (se, test_2_getval, NULL))
320 0 : fail (0, 0);
321 1 : FREEEXPR();
322 1 : ADDEXPR ("blanks -z");
323 1 : if (recsel_select (se, test_2_getval, NULL))
324 0 : fail (0, 0);
325 :
326 1 : FREEEXPR();
327 1 : ADDEXPR ("letters -n");
328 1 : if (!recsel_select (se, test_2_getval, NULL))
329 0 : fail (0, 0);
330 1 : FREEEXPR();
331 1 : ADDEXPR ("letters -z");
332 1 : if (recsel_select (se, test_2_getval, NULL))
333 0 : fail (0, 0);
334 :
335 :
336 1 : FREEEXPR();
337 1 : ADDEXPR ("nothing -f");
338 1 : if (!recsel_select (se, test_2_getval, NULL))
339 0 : fail (0, 0);
340 1 : FREEEXPR();
341 1 : ADDEXPR ("nothing -t");
342 1 : if (recsel_select (se, test_2_getval, NULL))
343 0 : fail (0, 0);
344 :
345 1 : FREEEXPR();
346 1 : ADDEXPR ("zero -f");
347 1 : if (!recsel_select (se, test_2_getval, NULL))
348 0 : fail (0, 0);
349 1 : FREEEXPR();
350 1 : ADDEXPR ("zero -t");
351 1 : if (recsel_select (se, test_2_getval, NULL))
352 0 : fail (0, 0);
353 :
354 1 : FREEEXPR();
355 1 : ADDEXPR ("one -t");
356 1 : if (!recsel_select (se, test_2_getval, NULL))
357 0 : fail (0, 0);
358 1 : FREEEXPR();
359 1 : ADDEXPR ("one -f");
360 1 : if (recsel_select (se, test_2_getval, NULL))
361 0 : fail (0, 0);
362 :
363 1 : FREEEXPR();
364 1 : ADDEXPR ("blanks -f");
365 1 : if (!recsel_select (se, test_2_getval, NULL))
366 0 : fail (0, 0);
367 1 : FREEEXPR();
368 1 : ADDEXPR ("blanks -t");
369 1 : if (recsel_select (se, test_2_getval, NULL))
370 0 : fail (0, 0);
371 :
372 1 : FREEEXPR();
373 1 : ADDEXPR ("letter -f");
374 1 : if (!recsel_select (se, test_2_getval, NULL))
375 0 : fail (0, 0);
376 1 : FREEEXPR();
377 1 : ADDEXPR ("letters -t");
378 1 : if (recsel_select (se, test_2_getval, NULL))
379 0 : fail (0, 0);
380 :
381 :
382 1 : FREEEXPR();
383 1 : }
384 :
385 :
386 :
387 : int
388 1 : main (int argc, char **argv)
389 : {
390 1 : int last_argc = -1;
391 :
392 1 : log_set_prefix (PGM, GPGRT_LOG_WITH_PREFIX);
393 1 : init_common_subsystems (&argc, &argv);
394 :
395 1 : if (argc)
396 1 : { argc--; argv++; }
397 2 : while (argc && last_argc != argc )
398 : {
399 0 : last_argc = argc;
400 0 : if (!strcmp (*argv, "--"))
401 : {
402 0 : argc--; argv++;
403 0 : break;
404 : }
405 0 : else if (!strcmp (*argv, "--help"))
406 : {
407 0 : fputs ("usage: " PGM " [options]\n"
408 : "Options:\n"
409 : " --verbose print timings etc.\n"
410 : " --debug flyswatter\n",
411 : stdout);
412 0 : exit (0);
413 : }
414 0 : else if (!strcmp (*argv, "--verbose"))
415 : {
416 0 : verbose++;
417 0 : argc--; argv++;
418 : }
419 0 : else if (!strcmp (*argv, "--debug"))
420 : {
421 0 : verbose += 2;
422 0 : debug++;
423 0 : argc--; argv++;
424 : }
425 0 : else if (!strncmp (*argv, "--", 2))
426 : {
427 0 : log_error ("unknown option '%s'\n", *argv);
428 0 : exit (2);
429 : }
430 : }
431 :
432 1 : run_test_1 ();
433 1 : run_test_1b ();
434 1 : run_test_2 ();
435 : /* Fixme: We should add test for complex conditions. */
436 :
437 1 : return 0;
438 : }
|