common: New function log_logv_with_prefix.
[gnupg.git] / common / t-session-env.c
1 /* t-session-env.c - Module test for session-env.c
2  *      Copyright (C) 2009 Free Software Foundation, Inc.
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 <errno.h>
24 #include <assert.h>
25
26 #include "util.h"
27 #include "session-env.h"
28
29 #define pass()  do { ; } while(0)
30 #define fail(e) do { fprintf (stderr, "%s:%d: function failed: %s\n",  \
31                                __FILE__,__LINE__, gpg_strerror (e));  \
32                      exit (1);                                        \
33                    } while(0)
34
35 static int verbose;
36
37 static void
38 listall (session_env_t se)
39 {
40   int iterator = 0;
41   const char *name, *value;
42   int def;
43
44   if (verbose)
45     printf ("environment of %p\n", se);
46   while ( (name = session_env_listenv (se, &iterator, &value, &def)) )
47     if (verbose)
48       printf ("  %s%s=%s\n",  def? "[def] ":"      ", name, value);
49
50 }
51
52
53 static void
54 show_stdnames (void)
55 {
56   const char *name, *assname;
57   int iterator = 0;
58   int count;
59
60   printf ("    > Known envvars:");
61   count = 20;
62   while ((name = session_env_list_stdenvnames (&iterator, &assname)))
63     {
64       if (count > 60)
65         {
66           printf ("\n    >");
67           count = 7;
68         }
69       printf ( " %s", name);
70       count += strlen (name) + 1;
71       if (assname)
72         {
73           printf ( "(%s)", assname);
74           count += strlen (assname) + 2;
75         }
76     }
77   putchar('\n');
78 }
79
80
81 static void
82 test_all (void)
83 {
84   gpg_error_t err;
85   session_env_t se_0, se;
86   const char *s, *s2;
87   int idx;
88
89   se_0 = session_env_new ();
90   if (!se_0)
91     fail (gpg_error_from_syserror ());
92   se = session_env_new ();
93   if (!se)
94     fail (gpg_error_from_syserror ());
95
96   err = session_env_putenv (se, NULL);
97   if (gpg_err_code (err) != GPG_ERR_INV_VALUE)
98     fail (err);
99   err = session_env_putenv (se, "");
100   if (gpg_err_code (err) != GPG_ERR_INV_VALUE)
101     fail (err);
102   err = session_env_putenv (se, "=");
103   if (gpg_err_code (err) != GPG_ERR_INV_VALUE)
104     fail (err);
105
106   /* Delete some nonexistant variables.  */
107   err = session_env_putenv (se, "A");
108   if (err)
109     fail (err);
110   err = session_env_putenv (se, "a");
111   if (err)
112     fail (err);
113   err = session_env_putenv (se, "_aaaa aaaaaasssssssssssss\nddd");
114   if (err)
115     fail (err);
116
117   /* Create a few variables.  */
118   err = session_env_putenv (se, "EMPTY=");
119   if (err)
120     fail (err);
121   err = session_env_putenv (se, "foo=value_of_foo");
122   if (err)
123     fail (err);
124   err = session_env_putenv (se, "bar=the value_of_bar");
125   if (err)
126     fail (err);
127   err = session_env_putenv (se, "baz=this-is-baz");
128   if (err)
129     fail (err);
130   err = session_env_putenv (se, "BAZ=this-is-big-baz");
131   if (err)
132     fail (err);
133
134   listall (se);
135
136   /* Update one.  */
137   err = session_env_putenv (se, "baz=this-is-another-baz");
138   if (err)
139     fail (err);
140
141   listall (se);
142
143   /* Delete one.  */
144   err = session_env_putenv (se, "bar");
145   if (err)
146     fail (err);
147
148   listall (se);
149
150   /* Insert a new one.  */
151   err = session_env_putenv (se, "FOO=value_of_foo");
152   if (err)
153     fail (err);
154
155   listall (se);
156
157   /* Retrieve a default one.  */
158   s = session_env_getenv_or_default (se, "HOME", NULL);
159   if (!s)
160     {
161       fprintf (stderr, "failed to get default of HOME\n");
162       exit (1);
163     }
164
165   s = session_env_getenv (se, "HOME");
166   if (s)
167     fail(0);  /* This is a default value, thus we should not see it.  */
168
169   s = session_env_getenv_or_default (se, "HOME", NULL);
170   if (!s)
171     fail(0);  /* But here we should see it.  */
172
173   /* Add a few more.  */
174   err = session_env_putenv (se, "X1=A value");
175   if (err)
176     fail (err);
177   err = session_env_putenv (se, "X2=Another value");
178   if (err)
179     fail (err);
180   err = session_env_putenv (se, "X3=A value");
181   if (err)
182     fail (err);
183
184   listall (se);
185
186   /* Check that we can overwrite a default value.  */
187   err = session_env_putenv (se, "HOME=/this/is/my/new/home");
188   if (err)
189     fail (err);
190   /* And that we get this string back.  */
191   s = session_env_getenv (se, "HOME");
192   if (!s)
193     fail (0);
194   if (strcmp (s, "/this/is/my/new/home"))
195     fail (0);
196   /* A new get default should return the very same string.  */
197   s2 = session_env_getenv_or_default (se, "HOME", NULL);
198   if (!s2)
199     fail (0);
200   if (s2 != s)
201     fail (0);
202
203   listall (se);
204
205   /* Check that the other object is clean.  */
206   {
207     int iterator = 0;
208
209     if (session_env_listenv (se_0, &iterator, NULL, NULL))
210       fail (0);
211   }
212
213
214   session_env_release (se);
215
216   /* Use a new session for quick mass test.  */
217   se = session_env_new ();
218   if (!se)
219     fail (gpg_error_from_syserror ());
220
221   /* Create.  */
222   for (idx=0; idx < 500; idx++)
223     {
224       char buf[100];
225
226       snprintf (buf, sizeof buf, "FOO_%d=Value for %x", idx, idx);
227       err = session_env_putenv (se, buf);
228       if (err)
229         fail (err);
230     }
231   err = session_env_setenv (se, "TEST1", "value1");
232   if (err)
233     fail (err);
234   err = session_env_setenv (se, "TEST1", "value1-updated");
235   if (err)
236     fail (err);
237
238   listall (se);
239
240   /* Delete all.  */
241   for (idx=0; idx < 500; idx++)
242     {
243       char buf[100];
244
245       snprintf (buf, sizeof buf, "FOO_%d", idx);
246       err = session_env_putenv (se, buf);
247       if (err)
248         fail (err);
249     }
250   err = session_env_setenv (se, "TEST1", NULL);
251   if (err)
252     fail (err);
253
254   /* Check that all are deleted.  */
255   {
256     int iterator = 0;
257
258     if (session_env_listenv (se, &iterator, NULL, NULL))
259       fail (0);
260   }
261
262   /* Add a few strings again.  */
263   for (idx=0; idx < 500; idx++)
264     {
265       char buf[100];
266
267       if (!(idx % 10))
268         {
269           if ( !(idx % 3))
270             snprintf (buf, sizeof buf, "FOO_%d=", idx);
271           else
272             snprintf (buf, sizeof buf, "FOO_%d=new value for %x", idx, idx);
273           err = session_env_putenv (se, buf);
274           if (err)
275             fail (err);
276         }
277     }
278
279   listall (se);
280
281   session_env_release (se);
282
283   session_env_release (se_0);
284 }
285
286
287
288 int
289 main (int argc, char **argv)
290 {
291   if (argc)
292     { argc--; argv++; }
293   if (argc && !strcmp (argv[0], "--verbose"))
294     {
295       verbose = 1;
296       argc--; argv++;
297     }
298
299
300   show_stdnames ();
301   test_all ();
302
303   return 0;
304 }