1 /* t-exectool.c - Module test for exectool.c
2 * Copyright (C) 2016 g10 Code GmbH
4 * This file is part of GnuPG.
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.
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.
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/>.
32 #define fail(msg, err) \
33 do { fprintf (stderr, "%s:%d: %s failed: %s\n", \
34 __FILE__,__LINE__, (msg), gpg_strerror (err)); \
39 test_executing_true (void)
42 const char *pgmname = "/bin/true";
43 const char *alt_pgmname = "/usr/bin/true";
44 const char *argv[] = { NULL, NULL };
48 if (access (pgmname, X_OK))
50 if (access (alt_pgmname, X_OK))
52 fprintf (stderr, "skipping test: %s not executable: %s\n",
53 pgmname, strerror (errno));
56 pgmname = alt_pgmname;
60 fprintf (stderr, "Executing %s...\n", pgmname);
62 err = gnupg_exec_tool (pgmname, argv, "", &result, &len);
64 fail ("gnupg_exec_tool", err);
72 test_executing_false (void)
75 const char *pgmname = "/bin/false";
76 const char *alt_pgmname = "/usr/bin/false";
77 const char *argv[] = { NULL, NULL };
81 if (access (pgmname, X_OK))
83 if (access (alt_pgmname, X_OK))
85 fprintf (stderr, "skipping test: %s not executable: %s\n",
86 pgmname, strerror (errno));
89 pgmname = alt_pgmname;
93 fprintf (stderr, "Executing %s...\n", pgmname);
95 err = gnupg_exec_tool (pgmname, argv, "", &result, &len);
96 assert (err == GPG_ERR_GENERAL);
101 test_executing_cat (const char *vector)
104 const char *argv[] = { "/bin/cat", NULL };
108 if (access (argv[0], X_OK))
110 fprintf (stderr, "skipping test: %s not executable: %s\n",
111 argv[0], strerror (errno));
116 fprintf (stderr, "Executing %s...\n", argv[0]);
118 err = gnupg_exec_tool (argv[0], &argv[1], vector, &result, &len);
120 fail ("gnupg_exec_tool", err);
124 /* gnupg_exec_tool returns the correct length... */
125 assert (len == strlen (vector));
126 /* ... but 0-terminates data for ease of use. */
127 assert (result[len] == 0);
129 assert (strcmp (result, vector) == 0);
135 test_catting_cat (void)
138 const char *argv[] = { "/bin/cat", "/bin/cat", NULL };
143 size_t reference_len;
145 if (access (argv[0], X_OK))
147 fprintf (stderr, "skipping test: %s not executable: %s\n",
148 argv[0], strerror (errno));
152 in = es_fopen (argv[1], "r");
155 fprintf (stderr, "skipping test: could not open %s: %s\n",
156 argv[1], strerror (errno));
160 err = es_fseek (in, 0L, SEEK_END);
163 fprintf (stderr, "skipping test: could not seek in %s: %s\n",
164 argv[1], gpg_strerror (err));
168 reference_len = es_ftell (in);
169 err = es_fseek (in, 0L, SEEK_SET);
170 assert (!err || !"rewinding failed");
172 reference = malloc (reference_len);
173 assert (reference || !"allocating reference buffer failed");
175 for (p = reference; p - reference < reference_len; )
177 size_t bytes_read, left;
178 left = reference_len - (p - reference);
181 err = es_read (in, p, left, &bytes_read);
184 fprintf (stderr, "error reading %s: %s",
185 argv[1], gpg_strerror (err));
194 fprintf (stderr, "Executing %s %s...\n", argv[0], argv[1]);
196 err = gnupg_exec_tool (argv[0], &argv[1], "", &result, &len);
198 fail ("gnupg_exec_tool", err);
202 /* gnupg_exec_tool returns the correct length... */
203 assert (len == reference_len);
204 assert (memcmp (result, reference, reference_len) == 0);
211 main (int argc, char **argv)
218 if (argc && !strcmp (argv[0], "--verbose"))
224 test_executing_true ();
225 test_executing_false ();
226 test_executing_cat ("Talking to myself here...");
228 for (i = 0; i < 255 /* one less */; i++)
229 binjunk[i] = i + 1; /* avoid 0 */
232 test_executing_cat (binjunk);