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 int test_encode(void);
27 static int test_decode(void);
28 static int test_roundtrip(void);
29 static int 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);
48 for (i = 0; i < num; i++) {
49 tmp = hexencode_string(test_strs[i].in);
50 if (!tmp || strcmp(test_strs[i].out, tmp)) {
52 tu_dbg("encode failure:\n")
53 tu_dbg("input: \"%s\"\n", test_strs[i].in);
54 tu_dbg("output: \"%s\"\n", tmp? tmp : "(null)");
55 tu_dbg("expected: \"%s\"\n", test_strs[i].out);
62 typedef struct {char *in; char *out; gboolean expect_err; } dec_vec;
66 static const dec_vec test_strs[] = {
68 {"hi%21", "hi!", FALSE},
74 {"%0ahi%0a", "\nhi\n", FALSE},
82 static const int num = sizeof(test_strs)/sizeof(dec_vec);
88 for (i = 0; i < num; i++) {
89 tmp = hexdecode_string(test_strs[i].in, &err);
90 if (!tmp || strcmp(test_strs[i].out, tmp) ||
91 (!!err != test_strs[i].expect_err)) {
93 tu_dbg("decode failure:\n")
94 tu_dbg("input: \"%s\"\n", test_strs[i].in);
95 tu_dbg("output: \"%s\"\n", tmp? tmp : "(null)");
96 tu_dbg("expected: \"%s\"\n", test_strs[i].out);
97 tu_dbg("error msg: %s\n", err? err->message : "(none)");
106 typedef char* round_vec;
110 static const round_vec test_strs[] = {
119 static const int num = sizeof(test_strs)/sizeof(round_vec);
121 char *tmp_enc = NULL, *tmp_dec = NULL;
125 for (i = 0; i < num; i++) {
126 tmp_enc = hexencode_string(test_strs[i]);
127 tmp_dec = tmp_enc? hexdecode_string(tmp_enc, &err) : NULL;
128 if (!tmp_enc || !tmp_dec || strcmp(test_strs[i], tmp_dec) || err) {
130 tu_dbg("roundtrip failure:\n")
131 tu_dbg("input: \"%s\"\n", test_strs[i]);
132 tu_dbg("enc output: \"%s\"\n", tmp_enc? tmp_enc : "(null)");
133 tu_dbg("dec output: \"%s\"\n", tmp_dec? tmp_dec : "(null)");
134 tu_dbg("error msg: %s\n", err? err->message : "(none)");
144 test_roundtrip_rand(void)
147 simpleprng_state_t state;
148 char *in, *tmp_enc = NULL, *tmp_dec = NULL;
152 simpleprng_seed(&state, 0xface);
154 for (i = 0; i < 100; i++) {
155 size = simpleprng_rand_byte(&state);
156 in = g_malloc0(size+1);
157 simpleprng_fill_buffer(&state, in, size);
158 tmp_enc = hexencode_string(in);
159 tmp_dec = tmp_enc? hexdecode_string(tmp_enc, &err) : NULL;
160 if (!tmp_enc || !tmp_dec || strcmp(in, tmp_dec) || err) {
162 tu_dbg("roundtrip failure:\n")
163 tu_dbg("input: \"%s\"\n", in);
164 tu_dbg("enc output: \"%s\"\n", tmp_enc? tmp_enc : "(null)");
165 tu_dbg("dec output: \"%s\"\n", tmp_dec? tmp_dec : "(null)");
166 tu_dbg("error msg: %s\n", err? err->message : "(none)");
177 main(int argc, char **argv)
179 static TestUtilsTest tests[] = {
180 TU_TEST(test_encode, 90),
181 TU_TEST(test_decode, 90),
182 TU_TEST(test_roundtrip, 90),
183 TU_TEST(test_roundtrip_rand, 90),
186 return testutils_run_tests(argc, argv, tests);