Update Red Hat Copyright Notices
[nbdkit.git] / common / utils / test-quotes.c
blob2a8409dc4949a19f744aa977ec4d2f53b3fdb44f
1 /* nbdkit
2 * Copyright Red Hat
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of Red Hat nor the names of its contributors may be
16 * used to endorse or promote products derived from this software without
17 * specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
33 /* Unit tests of utils quoting code. */
35 #include <config.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #undef NDEBUG /* Keep test strong even for nbdkit built without assertions */
41 #include <assert.h>
42 #include <stdbool.h>
44 #include "array-size.h"
45 #include "utils.h"
47 #ifdef HAVE_OPEN_MEMSTREAM
49 static bool
50 test (const char *orig, const char *fnname, void (*fn) (const char *, FILE *),
51 const char *exp)
53 char *str = NULL;
54 size_t str_len = 0;
55 FILE *fp;
57 fp = open_memstream (&str, &str_len);
58 assert (fp);
59 fn (orig, fp);
60 if (fclose (fp) == EOF)
61 assert (false);
62 if (str_len == 0 && !str)
63 str = strdup ("");
64 assert (str);
66 if (strcmp (str, exp)) {
67 fprintf (stderr, "%s failed, got '%s' expected '%s'\n",
68 fnname, str, exp);
69 free (str);
70 return true;
72 free (str);
73 return false;
76 int
77 main (void)
79 struct {
80 const char *orig;
81 const char *shell;
82 const char *uri;
83 } tests[] = {
84 { "a-b_c.0", "a-b_c.0", "a-b_c.0" },
85 { "/Safe/Path", "/Safe/Path", "/Safe/Path" },
86 { "a~b", "\"a~b\"", "a~b" },
87 { "", "\"\"", "" },
88 { "a=b", "a=b", "a%3Db" }, /* XXX shell wrong if used as argv[0] */
89 { "a;b", "\"a;b\"", "a%3Bb" },
90 { "a b", "\"a b\"", "a%20b" },
91 { "a%b", "\"a%b\"", "a%25b" },
92 { "a'b\"c$d`e\\f", "\"a'b\\\"c\\$d\\`e\\\\f\"", "a%27b%22c%24d%60e%5Cf" },
94 size_t i;
95 bool fail = false;
97 for (i = 0; i < ARRAY_SIZE (tests); i++) {
98 fail |= test (tests[i].orig, "shell_quote", shell_quote, tests[i].shell);
99 fail |= test (tests[i].orig, "uri_quote", uri_quote, tests[i].uri);
101 return fail ? EXIT_FAILURE : EXIT_SUCCESS;
104 #else /* !OPEN_MEMSTREAM */
107 main (int argc, char *argv[])
109 fprintf (stderr, "%s: test skipped because no support for open_memstream\n",
110 argv[0]);
111 exit (77);
114 #endif /* !OPEN_MEMSTREAM */