update changelog
[debian/iodine.git] / tests / base64.c
1 /*
2  * Copyright (c) 2006-2009 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include <check.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <errno.h>
22
23 #include "encoding.h"
24 #include "base64.h"
25 #include "test.h"
26
27 #define TUPLES 5
28
29 static struct tuple
30 {
31         char *a;
32         char *b;
33 } testpairs[TUPLES] = {
34         { "iodinetestingtesting", "Aw8KAw4LDgvZDgLUz2rLC2rPBMC" },
35         { "abc1231", "ywjJmtiZmq" },
36         {
37           "\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xAA\x68"
38           "\x9E\x69\x64\x8E\x28\x60\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50"
39           "\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40\x3F\x3F\x3C\xEF\xAE\x78"
40           "\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xAA\x68\x9E\x69\x64\x8E\x28\x60"
41           "\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48"
42           "\x1C\x61\x44\x0C\x20\x40\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70"
43           "\xBE\xEB\x6C\xAE\xAA\x68\x9E\x69\x64\x8E\x28\x60\x7D\xE7\x5C\x6D\xA6\x58"
44           "\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40",
45
46           "+9876543210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcbapZ"
47           "776543210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba+987654"
48           "3210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
49         },
50         {
51           "\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xAA\x68"
52           "\x9E\x69\x64\x8E\x28\x60\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50"
53           "\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40\x3F\x3F\x3C\xEF\xAE\x78"
54           "\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xA1\x61\x91\x61\x61\x81\x28\x60"
55           "\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48"
56           "\x1C\x61\x44\x0C\x20\x40\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70"
57           "\xBE\xEB\x6C\xAE\xA1\x61\x91\x61\x61\x81\x28\x60\x7D\xE7\x5C\x6D\xA6\x58"
58           "\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40",
59
60           "+9876543210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcbapZ"
61           "776543210-ZYXWVUTSRQfHKwfHGsHGFEDCBAzyxwvutsrqponmlkjihgfedcba+987654321"
62           "0-ZYXWVUTSRQfHKwfHGsHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
63         },
64         { "", "" }
65 };
66
67 START_TEST(test_base64_encode)
68 {
69         size_t len;
70         char buf[4096];
71         struct encoder *b64;
72         int val;
73
74         b64 = get_base64_encoder();
75
76         len = sizeof(buf);
77         val = b64->encode(buf, &len, testpairs[_i].a, strlen(testpairs[_i].a));
78
79         fail_unless(strcmp(buf, testpairs[_i].b) == 0,
80                         "'%s' != '%s'", buf, testpairs[_i].b);
81 }
82 END_TEST
83
84 START_TEST(test_base64_decode)
85 {
86         size_t len;
87         char buf[4096];
88         struct encoder *b64;
89         int val;
90
91         b64 = get_base64_encoder();
92
93         len = sizeof(buf);
94         val = b64->decode(buf, &len, testpairs[_i].b, strlen(testpairs[_i].b));
95
96         fail_unless(buf != NULL, "buf == NULL");
97         fail_unless(strcmp(buf, testpairs[_i].a) == 0,
98                         "'%s' != '%s'", buf, testpairs[_i].a);
99 }
100 END_TEST
101
102 START_TEST(test_base64_blksize)
103 {
104         size_t rawlen;
105         size_t enclen;
106         char *rawbuf;
107         char *encbuf;
108         struct encoder *b64;
109         int i;
110         int val;
111
112         b64 = get_base64_encoder();
113
114         rawlen = b64->blocksize_raw();
115         enclen = b64->blocksize_encoded();
116
117         rawbuf = malloc(rawlen + 16);
118         encbuf = malloc(enclen + 16);
119
120         for (i = 0; i < rawlen; i++) {
121                 rawbuf[i] = 'A';
122         }
123         rawbuf[i] = 0;
124
125         val = b64->encode(encbuf, &enclen, rawbuf, rawlen);
126
127         fail_unless(rawlen == 3, "raw length was %d not 3", rawlen);
128         fail_unless(enclen == 3, "encoded %d bytes, not 3", enclen);
129         fail_unless(val == 4, "encoded string %s was length %d", encbuf, val);
130
131         memset(rawbuf, 0, rawlen + 16);
132
133         enclen = val;
134         val = b64->decode(rawbuf, &rawlen, encbuf, enclen);
135
136         fail_unless(rawlen == 3, "raw length was %d not 3", rawlen);
137         fail_unless(val == 3);
138         for (i = 0; i < rawlen; i++) {
139                 fail_unless(rawbuf[i] == 'A');
140         }
141 }
142 END_TEST
143
144 TCase *
145 test_base64_create_tests()
146 {
147         TCase *tc;
148
149         tc = tcase_create("Base64");
150         tcase_add_loop_test(tc, test_base64_encode, 0, TUPLES);
151         tcase_add_loop_test(tc, test_base64_decode, 0, TUPLES);
152         tcase_add_test(tc, test_base64_blksize);
153
154         return tc;
155 }