2 * Copyright (c) Zmanda Inc. All Rights Reserved.
4 * This library is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 2.1 as
6 * published by the Free Software Foundation.
8 * This library is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
11 * License for more details.
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this library; if not, write to the Free Software Foundation,
15 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17 * Contact information: Zmanda Inc., 465 S. Mathilda Ave., Suite 300
18 * Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
23 #include "testutils.h"
24 #include "simpleprng.h"
26 static gboolean test_encode(void);
27 static gboolean test_decode(void);
28 static gboolean test_roundtrip(void);
29 static gboolean test_roundtrip_rand(void);
31 typedef struct {char *in; char *out;} enc_vec;
35 static const enc_vec test_strs[] = {
41 {"\nhi\n", "%0ahi%0a"}
43 static const int num = sizeof(test_strs)/sizeof(enc_vec);
49 for (i = 0; i < num; i++) {
50 tmp = hexencode_string(test_strs[i].in);
51 if (!tmp || strcmp(test_strs[i].out, tmp)) {
53 tu_dbg("encode failure:\n")
54 tu_dbg("input: \"%s\"\n", test_strs[i].in);
55 tu_dbg("output: \"%s\"\n", tmp? tmp : "(null)");
56 tu_dbg("expected: \"%s\"\n", test_strs[i].out);
63 typedef struct {char *in; char *out; gboolean expect_err; } dec_vec;
67 static const dec_vec test_strs[] = {
69 {"hi%21", "hi!", FALSE},
75 {"%0ahi%0a", "\nhi\n", FALSE},
83 static const int num = sizeof(test_strs)/sizeof(dec_vec);
90 for (i = 0; i < num; i++) {
91 tmp = hexdecode_string(test_strs[i].in, &err);
92 if (!tmp || strcmp(test_strs[i].out, tmp) ||
93 (!!err != test_strs[i].expect_err)) {
95 tu_dbg("decode failure:\n")
96 tu_dbg("input: \"%s\"\n", test_strs[i].in);
97 tu_dbg("output: \"%s\"\n", tmp? tmp : "(null)");
98 tu_dbg("expected: \"%s\"\n", test_strs[i].out);
99 tu_dbg("error msg: %s\n", err? err->message : "(none)");
108 typedef char* round_vec;
112 static const round_vec test_strs[] = {
121 static const int num = sizeof(test_strs)/sizeof(round_vec);
124 char *tmp_enc = NULL, *tmp_dec = NULL;
128 for (i = 0; i < num; i++) {
129 tmp_enc = hexencode_string(test_strs[i]);
130 tmp_dec = tmp_enc? hexdecode_string(tmp_enc, &err) : NULL;
131 if (!tmp_enc || !tmp_dec || strcmp(test_strs[i], tmp_dec) || err) {
133 tu_dbg("roundtrip failure:\n")
134 tu_dbg("input: \"%s\"\n", test_strs[i]);
135 tu_dbg("enc output: \"%s\"\n", tmp_enc? tmp_enc : "(null)");
136 tu_dbg("dec output: \"%s\"\n", tmp_dec? tmp_dec : "(null)");
137 tu_dbg("error msg: %s\n", err? err->message : "(none)");
147 test_roundtrip_rand(void)
151 simpleprng_state_t state;
152 char *in, *tmp_enc = NULL, *tmp_dec = NULL;
156 simpleprng_seed(&state, 0xface);
158 for (i = 0; i < 100; i++) {
159 size = simpleprng_rand_byte(&state);
160 in = g_malloc0(size+1);
161 simpleprng_fill_buffer(&state, in, size);
162 tmp_enc = hexencode_string(in);
163 tmp_dec = tmp_enc? hexdecode_string(tmp_enc, &err) : NULL;
164 if (!tmp_enc || !tmp_dec || strcmp(in, tmp_dec) || err) {
166 tu_dbg("roundtrip failure:\n")
167 tu_dbg("input: \"%s\"\n", in);
168 tu_dbg("enc output: \"%s\"\n", tmp_enc? tmp_enc : "(null)");
169 tu_dbg("dec output: \"%s\"\n", tmp_dec? tmp_dec : "(null)");
170 tu_dbg("error msg: %s\n", err? err->message : "(none)");
181 main(int argc, char **argv)
183 static TestUtilsTest tests[] = {
184 TU_TEST(test_encode, 90),
185 TU_TEST(test_decode, 90),
186 TU_TEST(test_roundtrip, 90),
187 TU_TEST(test_roundtrip_rand, 90),
190 return testutils_run_tests(argc, argv, tests);