Add base64 encode/decode functions
[platform/upstream/glib.git] / tests / base64-test.c
1 #include <glib.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5
6 #define DATA_SIZE 1024
7 #define BLOCK_SIZE 32
8 #define NUM_BLOCKS 32
9 static guchar data[DATA_SIZE];
10
11 static void
12 test_incremental (gboolean line_break)
13 {
14   char text[DATA_SIZE * 2];
15   char *p;
16   guchar data2[DATA_SIZE];
17   int i;
18   gsize len, decoded_len, max;
19   int state, save;
20   guint decoder_save;
21
22   len = 0;
23   state = 0;
24   save = 0;
25   for (i = 0; i < NUM_BLOCKS; i++)
26     len += g_base64_encode_step (data + i * BLOCK_SIZE, BLOCK_SIZE,
27                                  line_break, text + len, &state, &save);
28   len += g_base64_encode_close (line_break, text + len, &state, &save);
29
30   if (line_break)
31     max = DATA_SIZE * 4 / 3 + DATA_SIZE * 4 / (3 * 72) + 7;
32   else
33     max = DATA_SIZE * 4 / 3 + 6;
34   if (len > max)
35     {
36       g_print ("To long encoded length: got %d, expected max %d\n",
37                len, max);
38       exit (1);
39     }
40
41   decoded_len = 0;
42   state = 0;
43   decoder_save = 0;
44   p = text;
45   while (len > 0)
46     {
47       int chunk_len = MAX (32, len);
48       decoded_len += g_base64_decode_step (p, 
49                                            chunk_len, 
50                                            data2 + decoded_len,
51                                            &state, &decoder_save);
52       p += chunk_len;
53       len -= chunk_len;
54     }
55   
56   if (decoded_len != DATA_SIZE)
57     {
58       g_print ("Wrong decoded length: got %d, expected %d\n",
59                decoded_len, DATA_SIZE);
60       exit (1);
61     }
62
63   if (memcmp (data, data2, DATA_SIZE) != 0)
64     {
65       g_print ("Wrong decoded base64 data\n");
66       exit (1);
67     }
68 }
69
70 static void
71 test_full (void)
72 {
73   char *text;
74   guchar *data2;
75   gsize len;
76
77   text = g_base64_encode (data, DATA_SIZE);
78   data2 = g_base64_decode (text, &len);
79   g_free (text);
80
81   if (len != DATA_SIZE)
82     {
83       g_print ("Wrong decoded length: got %d, expected %d\n",
84                len, DATA_SIZE);
85       exit (1);
86     }
87
88   if (memcmp (data, data2, DATA_SIZE) != 0)
89     {
90       g_print ("Wrong decoded base64 data\n");
91       exit (1);
92     }
93 }
94
95 int
96 main (int argc, char *argv[])
97 {
98   int i;
99   for (i = 0; i < DATA_SIZE; i++)
100     data[i] = (guchar)i;
101
102   test_full ();
103   test_incremental (FALSE);
104   test_incremental (TRUE);
105   
106   return 0;
107 }