*** empty log message ***
[gnulib.git] / tests / test-base64.c
1 /* Self tests for base64.
2    Copyright (C) 2004 Free Software Foundation, Inc.
3    Written by Simon Josefsson.
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2, or (at your option)
8    any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License along
16    with this program; if not, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22
23 #include <stddef.h>
24 #include <stdio.h>
25 #include <stdbool.h>
26 #include <string.h>
27
28 #include "base64.h"
29
30 int
31 main (int argc, char *argv[])
32 {
33   const char *in = "abcdefghijklmnop";
34   const char *b64in = "YWJjZGVmZw==";
35   char out[255];
36   size_t len;
37   bool ok;
38
39   memset (out, 0x42, sizeof (out));
40   base64_encode (in, 0, out, 0);
41   if (out[0] != '\x42')
42     fprintf (stderr, "failure\n");
43
44   memset (out, 0x42, sizeof (out));
45   base64_encode (in, 1, out, 1);
46   if (memcmp (out, "YQ==", 1) != 0)
47     {
48       out[4] = '\0';
49       fprintf (stderr, "failure (%s)\n", out);
50     }
51
52   memset (out, 0x42, sizeof (out));
53   base64_encode (in, 1, out, 2);
54   if (memcmp (out, "YQ==", 2) != 0)
55     {
56       out[4] = '\0';
57       fprintf (stderr, "failure (%s)\n", out);
58     }
59
60   memset (out, 0x42, sizeof (out));
61   base64_encode (in, 1, out, 3);
62   if (memcmp (out, "YQ==", 3) != 0)
63     {
64       out[4] = '\0';
65       fprintf (stderr, "failure (%s)\n", out);
66     }
67
68   memset (out, 0x42, sizeof (out));
69   base64_encode (in, 1, out, 4);
70   if (memcmp (out, "YQ==", 4) != 0)
71     {
72       out[4] = '\0';
73       fprintf (stderr, "failure (%s)\n", out);
74     }
75
76   memset (out, 0x42, sizeof (out));
77   base64_encode (in, 1, out, 8);
78   if (memcmp (out, "YQ==", 4) != 0)
79     {
80       out[4] = '\0';
81       fprintf (stderr, "failure (%s)\n", out);
82     }
83
84   memset (out, 0x42, sizeof (out));
85   base64_encode (in, 2, out, 4);
86   if (memcmp (out, "YWI=", 4) != 0)
87     {
88       out[4] = '\0';
89       fprintf (stderr, "failure (%s)\n", out);
90     }
91
92   memset (out, 0x42, sizeof (out));
93   base64_encode (in, 3, out, 4);
94   if (memcmp (out, "YWJj", 4) != 0)
95     {
96       out[4] = '\0';
97       fprintf (stderr, "failure (%s)\n", out);
98     }
99
100   memset (out, 0x42, sizeof (out));
101   base64_encode (in, 4, out, 5);
102   if (memcmp (out, "YWJjZA==", 5) != 0)
103     {
104       out[5] = '\0';
105       fprintf (stderr, "failure (%s)\n", out);
106     }
107
108   memset (out, 0x42, sizeof (out));
109   base64_encode (in, 4, out, 100);
110   if (memcmp (out, "YWJjZA==", 6) != 0)
111     {
112       out[6] = '\0';
113       fprintf (stderr, "failure (%s)\n", out);
114     }
115
116   /* Decode. */
117
118   memset (out, 0x42, sizeof (out));
119   len = 0;
120   ok = base64_decode (b64in, 4, out, &len);
121   if (!ok)
122     fprintf (stderr, "decode failed\n");
123   if (len != 0)
124     fprintf (stderr, "failure (%d)\n", len);
125
126   memset (out, 0x42, sizeof (out));
127   len = 1;
128   ok = base64_decode (b64in, 4, out, &len);
129   if (!ok)
130     fprintf (stderr, "decode failed\n");
131   if (len != 1 || memcmp (out, "abcdefg", 1) != 0)
132     {
133       out[2] = '\0';
134       fprintf (stderr, "failure (%d: %s)\n", len, out);
135     }
136
137   memset (out, 0x42, sizeof (out));
138   len = 2;
139   ok = base64_decode (b64in, 4, out, &len);
140   if (!ok)
141     fprintf (stderr, "decode failed\n");
142   if (len != 2 || memcmp (out, "abcdefg", 2) != 0)
143     {
144       out[3] = '\0';
145       fprintf (stderr, "failure (%d: %s)\n", len, out);
146     }
147
148   memset (out, 0x42, sizeof (out));
149   len = 3;
150   ok = base64_decode (b64in, 4, out, &len);
151   if (!ok)
152     fprintf (stderr, "decode failed\n");
153   if (len != 3 || memcmp (out, "abcdefg", 3) != 0)
154     {
155       out[4] = '\0';
156       fprintf (stderr, "failure (%d: %s)\n", len, out);
157     }
158
159   memset (out, 0x42, sizeof (out));
160   len = 4;
161   ok = base64_decode (b64in, 4, out, &len);
162   if (!ok)
163     fprintf (stderr, "decode failed\n");
164   if (len != 3 || memcmp (out, "abcdefg", 3) != 0)
165     {
166       out[3] = '\0';
167       fprintf (stderr, "failure (%d: %s)\n", len, out);
168     }
169
170   memset (out, 0x42, sizeof (out));
171   len = 100;
172   ok = base64_decode (b64in, strlen (b64in), out, &len);
173   if (!ok)
174     fprintf (stderr, "decode failed\n");
175   if (len != 7 || memcmp (out, "abcdefg", 7) != 0)
176     {
177       out[7] = '\0';
178       fprintf (stderr, "failure (%d: %s)\n", len, out);
179     }
180
181   return 0;
182 }