Update Japanese Translation
[gnupg.git] / jnlib / t-stringhelp.c
1 /* t-stringhelp.c - Regression tests for stringhelp.c
2  * Copyright (C) 2007 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License 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 #include <errno.h>
25 #ifdef HAVE_PWD_H
26 # include <pwd.h>
27 #endif
28 #include <unistd.h>
29 #include <sys/types.h>
30
31 #include "stringhelp.h"
32
33 #include "t-support.h"
34
35
36 static char *home_buffer;
37
38
39 const char *
40 gethome (void)
41 {
42   if (!home_buffer)
43     {
44       char *home = getenv("HOME");
45       
46 #if defined(HAVE_GETPWUID) && defined(HAVE_PWD_H)
47       if(home)
48         home_buffer = xstrdup (home);
49       else
50         {
51           struct passwd *pwd;
52           
53           pwd = getpwuid (getuid());
54           if (pwd)
55             home_buffer = xstrdup (pwd->pw_dir);
56         }
57 #endif
58     }
59   return home_buffer;
60 }
61
62
63 static void
64 test_percent_escape (void)
65 {
66   char *result;
67   static struct {
68     const char *extra; 
69     const char *value; 
70     const char *expected;
71   } tests[] = 
72     {
73       { NULL, "", "" },
74       { NULL, "%", "%25" },
75       { NULL, "%%", "%25%25" },
76       { NULL, " %", " %25" },
77       { NULL, ":", "%3a" },
78       { NULL, " :", " %3a" },
79       { NULL, ": ", "%3a " },
80       { NULL, " : ", " %3a " },
81       { NULL, "::", "%3a%3a" },
82       { NULL, ": :", "%3a %3a" },
83       { NULL, "%:", "%25%3a" },
84       { NULL, ":%", "%3a%25" },
85       { "\\\n:", ":%", "%3a%25" },
86       { "\\\n:", "\\:%", "%5c%3a%25" },
87       { "\\\n:", "\n:%", "%0a%3a%25" },
88       { "\\\n:", "\xff:%", "\xff%3a%25" },
89       { "\\\n:", "\xfe:%", "\xfe%3a%25" },
90       { "\\\n:", "\x01:%", "\x01%3a%25" },
91       { "\x01",  "\x01:%", "%01%3a%25" },
92       { "\xfe",  "\xfe:%", "%fe%3a%25" },
93       { "\xfe",  "\xff:%", "\xff%3a%25" },
94
95       { NULL, NULL, NULL }
96     };
97   int testno;
98
99   result = percent_escape (NULL, NULL);
100   if (result)
101     fail (0);
102   for (testno=0; tests[testno].value; testno++)
103     {
104       result = percent_escape (tests[testno].value, tests[testno].extra);
105       if (!result)
106         fail (testno);
107       if (strcmp (result, tests[testno].expected))
108         fail (testno);
109       xfree (result);
110     }
111
112 }
113
114
115 static void
116 test_compare_filenames (void)
117 {
118   struct {
119     const char *a;
120     const char *b;
121     int result;
122   } tests[] = {
123     { "", "", 0 },
124     { "", "a", -1 },
125     { "a", "", 1 },
126     { "a", "a", 0 },
127     { "a", "aa", -1 },
128     { "aa", "a", 1 },
129     { "a",  "b", -1  },
130
131 #ifdef HAVE_W32_SYSTEM
132     { "a", "A", 0 },
133     { "A", "a", 0 },
134     { "foo/bar", "foo\\bar", 0 },
135     { "foo\\bar", "foo/bar", 0 },
136     { "foo\\", "foo/", 0 },
137     { "foo/", "foo\\", 0 },
138 #endif /*HAVE_W32_SYSTEM*/
139     { NULL, NULL, 0}
140   };
141   int testno, result;
142
143   for (testno=0; tests[testno].a; testno++)
144     {
145       result = compare_filenames (tests[testno].a, tests[testno].b);
146       result = result < 0? -1 : result > 0? 1 : 0;
147       if (result != tests[testno].result)
148         fail (testno);
149     }
150 }
151
152
153 static void
154 test_strconcat (void)
155 {
156   char *out;
157
158   out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
159                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
160                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
161                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
162                    "1", "2", "3", "4", "5", "6", "7", NULL);
163   if (!out)
164     fail (0);
165   else
166     xfree (out);
167   out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
168                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
169                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
170                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
171                    "1", "2", "3", "4", "5", "6", "7", "8", NULL);
172   if (out)
173     fail (0);
174   else if (errno != EINVAL)
175     fail (0);
176
177   out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
178                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
179                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
180                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
181                    "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL);
182   if (out)
183     fail (0);
184   else if (errno != EINVAL)
185     fail (0);
186   
187 #if __GNUC__ < 4 /* gcc 4.0 has a sentinel attribute.  */
188   out = strconcat (NULL);
189   if (!out || *out)
190     fail (1);
191 #endif
192   out = strconcat (NULL, NULL);
193   if (!out || *out)
194     fail (1);
195   out = strconcat ("", NULL);
196   if (!out || *out)
197     fail (1);
198   xfree (out);
199
200   out = strconcat ("", "", NULL);
201   if (!out || *out)
202     fail (2);
203   xfree (out);
204
205   out = strconcat ("a", "b", NULL);
206   if (!out || strcmp (out, "ab"))
207     fail (3);
208   xfree (out);
209   out = strconcat ("a", "b", "c", NULL);
210   if (!out || strcmp (out, "abc"))
211     fail (3);
212   xfree (out);
213
214   out = strconcat ("a", "b", "cc", NULL);
215   if (!out || strcmp (out, "abcc"))
216     fail (4);
217   xfree (out);
218   out = strconcat ("a1", "b1", "c1", NULL);
219   if (!out || strcmp (out, "a1b1c1"))
220     fail (4);
221   xfree (out);
222
223   out = strconcat ("", " long b ", "", "--even-longer--", NULL);
224   if (!out || strcmp (out, " long b --even-longer--"))
225     fail (5);
226   xfree (out);
227
228   out = strconcat ("", " long b ", "", "--even-longer--", NULL);
229   if (!out || strcmp (out, " long b --even-longer--"))
230     fail (5);
231   xfree (out);
232 }
233
234 static void
235 test_xstrconcat (void)
236 {
237   char *out;
238
239   out = xstrconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
240                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
241                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
242                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
243                    "1", "2", "3", "4", "5", "6", "7", NULL);
244   if (!out)
245     fail (0);
246
247 #if __GNUC__ < 4 /* gcc 4.0 has a sentinel attribute.  */
248   out = xstrconcat (NULL);
249   if (!out)
250     fail (1);
251 #endif
252   out = xstrconcat (NULL, NULL);
253   if (!out)
254     fail (1);
255   out = xstrconcat ("", NULL);
256   if (!out || *out)
257     fail (1);
258   xfree (out);
259
260   out = xstrconcat ("", "", NULL);
261   if (!out || *out)
262     fail (2);
263   xfree (out);
264
265   out = xstrconcat ("a", "b", NULL);
266   if (!out || strcmp (out, "ab"))
267     fail (3);
268   xfree (out);
269   out = xstrconcat ("a", "b", "c", NULL);
270   if (!out || strcmp (out, "abc"))
271     fail (3);
272   xfree (out);
273
274   out = xstrconcat ("a", "b", "cc", NULL);
275   if (!out || strcmp (out, "abcc"))
276     fail (4);
277   xfree (out);
278   out = xstrconcat ("a1", "b1", "c1", NULL);
279   if (!out || strcmp (out, "a1b1c1"))
280     fail (4);
281   xfree (out);
282
283   out = xstrconcat ("", " long b ", "", "--even-longer--", NULL);
284   if (!out || strcmp (out, " long b --even-longer--"))
285     fail (5);
286   xfree (out);
287
288   out = xstrconcat ("", " long b ", "", "--even-longer--", NULL);
289   if (!out || strcmp (out, " long b --even-longer--"))
290     fail (5);
291   xfree (out);
292 }
293
294
295 static void
296 test_make_filename_try (void)
297 {
298   char *out;
299   const char *home = gethome ();
300   size_t homelen = home? strlen (home):0;
301
302   out = make_filename_try ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
303                            "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
304                            "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
305                            "1", "2", "3", NULL);
306   if (out)
307     fail (0);
308   else if (errno != EINVAL)
309     fail (0);
310   xfree (out);
311   out = make_filename_try ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
312                            "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
313                            "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
314                            "1", "2", "3", "4", NULL);
315   if (out)
316     fail (0);
317   else if (errno != EINVAL)
318     fail (0);
319   xfree (out);
320
321   out = make_filename_try ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
322                            "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
323                            "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
324                            "1", "2", NULL);
325   if (!out || strcmp (out, 
326                       "1/2/3/4/5/6/7/8/9/10/" 
327                       "1/2/3/4/5/6/7/8/9/10/" 
328                       "1/2/3/4/5/6/7/8/9/10/" 
329                       "1/2"))
330     fail (0);
331   xfree (out);
332
333   out = make_filename_try ("foo", "~/bar", "baz/cde", NULL);
334   if (!out || strcmp (out, "foo/~/bar/baz/cde"))
335     fail (1);
336   xfree (out);
337
338   out = make_filename_try ("foo", "~/bar", "baz/cde/", NULL);
339   if (!out || strcmp (out, "foo/~/bar/baz/cde/"))
340     fail (1);
341   xfree (out);
342
343   out = make_filename_try ("/foo", "~/bar", "baz/cde/", NULL);
344   if (!out || strcmp (out, "/foo/~/bar/baz/cde/"))
345     fail (1);
346   xfree (out);
347
348   out = make_filename_try ("//foo", "~/bar", "baz/cde/", NULL);
349   if (!out || strcmp (out, "//foo/~/bar/baz/cde/"))
350     fail (1);
351   xfree (out);
352
353   out = make_filename_try ("", "~/bar", "baz/cde", NULL);
354   if (!out || strcmp (out, "/~/bar/baz/cde"))
355     fail (1);
356   xfree (out);
357
358
359   out = make_filename_try ("~/foo", "bar", NULL);
360   if (!out)
361     fail (2);
362   if (home)
363     {
364       if (strlen (out) < homelen + 7)
365         fail (2);
366       if (strncmp (out, home, homelen))
367         fail (2);
368       if (strcmp (out+homelen, "/foo/bar"))
369         fail (2);
370     }
371   else
372     {
373       if (strcmp (out, "~/foo/bar"))
374         fail (2);
375     }
376   xfree (out);
377
378   out = make_filename_try ("~", "bar", NULL);
379   if (!out)
380     fail (2);
381   if (home)
382     {
383       if (strlen (out) < homelen + 3)
384         fail (2);
385       if (strncmp (out, home, homelen))
386         fail (2);
387       if (strcmp (out+homelen, "/bar"))
388         fail (2);
389     }
390   else
391     {
392       if (strcmp (out, "~/bar"))
393         fail (2);
394     }
395   xfree (out);
396 }
397
398
399 int
400 main (int argc, char **argv)
401 {
402   (void)argc;
403   (void)argv;
404
405   test_percent_escape ();
406   test_compare_filenames ();
407   test_strconcat ();
408   test_xstrconcat ();
409   test_make_filename_try ();
410
411   xfree (home_buffer);
412   return 0;
413 }
414