Merge branch 'master' into STABLE-BRANCH-2-2
[gnupg.git] / common / t-recsel.c
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 <http://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 test_1_getval (void *cookie, const char *name)
51 {
52   if (strcmp (name, "uid"))
53     fail (0, 0);
54   return cookie;
55 }
56
57 static void
58 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   recsel_expr_t se = NULL;
68   int i;
69
70   for (i=0; i < DIM (expr); i++)
71     {
72       err = recsel_parse_expr (&se, expr[i]);
73       if (err)
74         fail (i, err);
75     }
76
77   if (debug)
78     recsel_dump (se);
79
80   /* The example from recsel.c in several variants. */
81   if (!recsel_select (se, test_1_getval, "Alfa"))
82     fail (0, 0);
83   if (!recsel_select (se, test_1_getval, "Alpha"))
84     fail (0, 0);
85   if (recsel_select (se, test_1_getval, "Alfa Test"))
86     fail (0, 0);
87   if (recsel_select (se, test_1_getval, "Alpha Test"))
88     fail (0, 0);
89
90   /* Some modified versions from above.  */
91   if (!recsel_select (se, test_1_getval, " AlfA Tes"))
92     fail (0, 0);
93   if (!recsel_select (se, test_1_getval, " AlfA Tes "))
94     fail (0, 0);
95   if (!recsel_select (se, test_1_getval, " Tes  AlfA"))
96     fail (0, 0);
97   if (!recsel_select (se, test_1_getval, "TesAlfA"))
98     fail (0, 0);
99
100   /* Simple cases. */
101   if (recsel_select (se, NULL, NULL))
102     fail (0, 0);
103   if (recsel_select (se, test_1_getval, NULL))
104     fail (0, 0);
105   if (recsel_select (se, test_1_getval, ""))
106     fail (0, 0);
107
108   FREEEXPR();
109 }
110
111
112 /* Same as test1 but using a combined expression.. */
113 static void
114 run_test_1b (void)
115 {
116   gpg_error_t err;
117   recsel_expr_t se = NULL;
118
119   err = recsel_parse_expr
120     (&se, "uid =~ Alfa && uid !~   Test  || uid =~  Alpha && uid  !~ Test" );
121   if (err)
122     fail (0, err);
123
124   if (debug)
125     recsel_dump (se);
126
127   /* The example from recsel.c in several variants. */
128   if (!recsel_select (se, test_1_getval, "Alfa"))
129     fail (0, 0);
130   if (!recsel_select (se, test_1_getval, "Alpha"))
131     fail (0, 0);
132   if (recsel_select (se, test_1_getval, "Alfa Test"))
133     fail (0, 0);
134   if (recsel_select (se, test_1_getval, "Alpha Test"))
135     fail (0, 0);
136
137   /* Some modified versions from above.  */
138   if (!recsel_select (se, test_1_getval, " AlfA Tes"))
139     fail (0, 0);
140   if (!recsel_select (se, test_1_getval, " AlfA Tes "))
141     fail (0, 0);
142   if (!recsel_select (se, test_1_getval, " Tes  AlfA"))
143     fail (0, 0);
144   if (!recsel_select (se, test_1_getval, "TesAlfA"))
145     fail (0, 0);
146
147   /* Simple cases. */
148   if (recsel_select (se, NULL, NULL))
149     fail (0, 0);
150   if (recsel_select (se, test_1_getval, NULL))
151     fail (0, 0);
152   if (recsel_select (se, test_1_getval, ""))
153     fail (0, 0);
154
155   FREEEXPR();
156 }
157
158
159 static const char *
160 test_2_getval (void *cookie, const char *name)
161 {
162   if (!strcmp (name, "uid"))
163     return "foo@example.org";
164   else if (!strcmp (name, "keyid"))
165     return "0x12345678";
166   else if (!strcmp (name, "zero"))
167     return "0";
168   else if (!strcmp (name, "one"))
169     return "1";
170   else if (!strcmp (name, "blanks"))
171     return "    ";
172   else if (!strcmp (name, "letters"))
173     return "abcde";
174   else
175     return cookie;
176 }
177
178 static void
179 run_test_2 (void)
180 {
181   gpg_error_t err;
182   recsel_expr_t se = NULL;
183
184   ADDEXPR ("uid = foo@example.org");
185   if (!recsel_select (se, test_2_getval, NULL))
186     fail (0, 0);
187   FREEEXPR();
188   ADDEXPR ("uid = Foo@example.org");
189   if (!recsel_select (se, test_2_getval, NULL))
190     fail (0, 0);
191   FREEEXPR();
192   ADDEXPR ("-c uid = Foo@example.org");
193   if (recsel_select (se, test_2_getval, NULL))
194     fail (0, 0);
195
196   FREEEXPR();
197   ADDEXPR ("uid =~ foo@example.org");
198   if (!recsel_select (se, test_2_getval, NULL))
199     fail (0, 0);
200   FREEEXPR();
201   ADDEXPR ("uid =~ Foo@example.org");
202   if (!recsel_select (se, test_2_getval, NULL))
203     fail (0, 0);
204   FREEEXPR();
205   ADDEXPR ("-c uid =~ Foo@example.org");
206   if (recsel_select (se, test_2_getval, NULL))
207     fail (0, 0);
208
209   FREEEXPR();
210   ADDEXPR ("uid !~ foo@example.org");
211   if (recsel_select (se, test_2_getval, NULL))
212     fail (0, 0);
213   FREEEXPR();
214   ADDEXPR ("uid !~ Foo@example.org");
215   if (recsel_select (se, test_2_getval, NULL))
216     fail (0, 0);
217   FREEEXPR();
218   ADDEXPR ("-c uid !~ Foo@example.org");
219   if (!recsel_select (se, test_2_getval, NULL))
220     fail (0, 0);
221
222   FREEEXPR();
223   ADDEXPR ("uid =~ @");
224   if (!recsel_select (se, test_2_getval, NULL))
225     fail (0, 0);
226   FREEEXPR();
227   ADDEXPR ("uid =~ @");
228   if (!recsel_select (se, test_2_getval, NULL))
229     fail (0, 0);
230
231   FREEEXPR();
232   ADDEXPR ("keyid == 0x12345678");
233   if (!recsel_select (se, test_2_getval, NULL))
234     fail (0, 0);
235   FREEEXPR();
236   ADDEXPR ("keyid != 0x12345678");
237   if (recsel_select (se, test_2_getval, NULL))
238     fail (0, 0);
239   FREEEXPR();
240   ADDEXPR ("keyid >= 0x12345678");
241   if (!recsel_select (se, test_2_getval, NULL))
242     fail (0, 0);
243   FREEEXPR();
244   ADDEXPR ("keyid <= 0x12345678");
245   if (!recsel_select (se, test_2_getval, NULL))
246     fail (0, 0);
247   FREEEXPR();
248   ADDEXPR ("keyid > 0x12345677");
249   if (!recsel_select (se, test_2_getval, NULL))
250     fail (0, 0);
251   FREEEXPR();
252   ADDEXPR ("keyid < 0x12345679");
253   if (!recsel_select (se, test_2_getval, NULL))
254     fail (0, 0);
255
256   FREEEXPR();
257   ADDEXPR ("keyid > 0x12345678");
258   if (recsel_select (se, test_2_getval, NULL))
259     fail (0, 0);
260   FREEEXPR();
261   ADDEXPR ("keyid < 0x12345678");
262   if (recsel_select (se, test_2_getval, NULL))
263     fail (0, 0);
264
265
266   FREEEXPR();
267   ADDEXPR ("uid -n");
268   if (!recsel_select (se, test_2_getval, NULL))
269     fail (0, 0);
270   FREEEXPR();
271   ADDEXPR ("uid -z");
272   if (recsel_select (se, test_2_getval, NULL))
273     fail (0, 0);
274
275   FREEEXPR();
276   ADDEXPR ("nothing -z");
277   if (!recsel_select (se, test_2_getval, NULL))
278     fail (0, 0);
279   FREEEXPR();
280   ADDEXPR ("nothing -n");
281   if (recsel_select (se, test_2_getval, NULL))
282     fail (0, 0);
283
284   FREEEXPR();
285   ADDEXPR ("blanks -n");
286   if (!recsel_select (se, test_2_getval, NULL))
287     fail (0, 0);
288   FREEEXPR();
289   ADDEXPR ("blanks -z");
290   if (recsel_select (se, test_2_getval, NULL))
291     fail (0, 0);
292
293   FREEEXPR();
294   ADDEXPR ("letters -n");
295   if (!recsel_select (se, test_2_getval, NULL))
296     fail (0, 0);
297   FREEEXPR();
298   ADDEXPR ("letters -z");
299   if (recsel_select (se, test_2_getval, NULL))
300     fail (0, 0);
301
302
303   FREEEXPR();
304   ADDEXPR ("nothing -f");
305   if (!recsel_select (se, test_2_getval, NULL))
306     fail (0, 0);
307   FREEEXPR();
308   ADDEXPR ("nothing -t");
309   if (recsel_select (se, test_2_getval, NULL))
310     fail (0, 0);
311
312   FREEEXPR();
313   ADDEXPR ("zero -f");
314   if (!recsel_select (se, test_2_getval, NULL))
315     fail (0, 0);
316   FREEEXPR();
317   ADDEXPR ("zero -t");
318   if (recsel_select (se, test_2_getval, NULL))
319     fail (0, 0);
320
321   FREEEXPR();
322   ADDEXPR ("one -t");
323   if (!recsel_select (se, test_2_getval, NULL))
324     fail (0, 0);
325   FREEEXPR();
326   ADDEXPR ("one -f");
327   if (recsel_select (se, test_2_getval, NULL))
328     fail (0, 0);
329
330   FREEEXPR();
331   ADDEXPR ("blanks -f");
332   if (!recsel_select (se, test_2_getval, NULL))
333     fail (0, 0);
334   FREEEXPR();
335   ADDEXPR ("blanks -t");
336   if (recsel_select (se, test_2_getval, NULL))
337     fail (0, 0);
338
339   FREEEXPR();
340   ADDEXPR ("letter -f");
341   if (!recsel_select (se, test_2_getval, NULL))
342     fail (0, 0);
343   FREEEXPR();
344   ADDEXPR ("letters -t");
345   if (recsel_select (se, test_2_getval, NULL))
346     fail (0, 0);
347
348
349   FREEEXPR();
350 }
351
352
353
354 int
355 main (int argc, char **argv)
356 {
357   int last_argc = -1;
358
359   log_set_prefix (PGM, GPGRT_LOG_WITH_PREFIX);
360   init_common_subsystems (&argc, &argv);
361
362   if (argc)
363     { argc--; argv++; }
364   while (argc && last_argc != argc )
365     {
366       last_argc = argc;
367       if (!strcmp (*argv, "--"))
368         {
369           argc--; argv++;
370           break;
371         }
372       else if (!strcmp (*argv, "--help"))
373         {
374           fputs ("usage: " PGM " [options]\n"
375                  "Options:\n"
376                  "  --verbose       print timings etc.\n"
377                  "  --debug         flyswatter\n",
378                  stdout);
379           exit (0);
380         }
381       else if (!strcmp (*argv, "--verbose"))
382         {
383           verbose++;
384           argc--; argv++;
385         }
386       else if (!strcmp (*argv, "--debug"))
387         {
388           verbose += 2;
389           debug++;
390           argc--; argv++;
391         }
392       else if (!strncmp (*argv, "--", 2))
393         {
394           log_error ("unknown option '%s'\n", *argv);
395           exit (2);
396         }
397     }
398
399   run_test_1 ();
400   run_test_1b ();
401   run_test_2 ();
402   /* Fixme: We should add test for complex conditions.  */
403
404   return 0;
405 }