1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
/* -*- c-file-style: "gnu" -*- */
#include <cutter.h>
#include <glib.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdlib.h>
#define DATA_SIZE 1024
#define BLOCK_SIZE 32
#define NUM_BLOCKS 32
static guchar data[DATA_SIZE];
static guchar *data2 = NULL;
static gchar *text = NULL;
void test_full (void);
void test_incremental_with_line_breaks1 (void);
void test_incremental_with_line_breaks2 (void);
void test_incremental_with_line_breaks3 (void);
void test_incremental_no_line_breaks1 (void);
void test_incremental_no_line_breaks2 (void);
void test_incremental_no_line_breaks3 (void);
void
setup (void)
{
int i;
for (i = 0; i < DATA_SIZE; i++)
data[i] = (guchar)i;
data2 = NULL;
text = NULL;
}
void
teardown (void)
{
g_free (data2);
g_free (text);
}
static void
test_incremental (gboolean line_break,
gint length,
gsize *encoded_length,
gsize *decoded_length)
{
char *p;
gsize len, max, input_len, block_size;
int state, save;
guint decoder_save;
data2 = g_malloc (length);
text = g_malloc (length * 2);
len = 0;
state = 0;
save = 0;
input_len = 0;
while (input_len < length)
{
block_size = MIN (BLOCK_SIZE, length - input_len);
len += g_base64_encode_step (data + input_len, block_size,
line_break, text + len, &state, &save);
input_len += block_size;
}
len += g_base64_encode_close (line_break, text + len, &state, &save);
*encoded_length = len;
if (line_break)
max = length * 4 / 3 + length * 4 / (3 * 72) + 7;
else
max = length * 4 / 3 + 6;
*decoded_length = 0;
state = 0;
decoder_save = 0;
p = text;
while (len > 0)
{
int chunk_len = MIN (BLOCK_SIZE, len);
*decoded_length += g_base64_decode_step (p,
chunk_len,
data2 + *decoded_length,
&state, &decoder_save);
p += chunk_len;
len -= chunk_len;
}
}
static void
test_incremental_with_line_breaks_for_length (gsize length)
{
gsize encoded_length, decoded_length, max;
max = length * 4 / 3 + length * 4 / (3 * 72) + 7;
test_incremental (FALSE, length,
&encoded_length, &decoded_length);
cut_assert (encoded_length <= max,
cut_message ("Too long encoded length: got "
"%" G_GSIZE_FORMAT ", expected max "
"%" G_GSIZE_FORMAT,
encoded_length, max));
cut_assert_equal_memory (data, length, data2, decoded_length);
}
static void
test_incremental_no_line_breaks_for_length (gsize length)
{
gsize encoded_length, decoded_length, max;
max = length * 4 / 3 + 6;
test_incremental (FALSE, length,
&encoded_length, &decoded_length);
cut_assert (encoded_length <= max,
cut_message ("Too long encoded length: got "
"%" G_GSIZE_FORMAT ", expected max "
"%" G_GSIZE_FORMAT,
encoded_length, max));
cut_assert_equal_memory (data, length, data2, decoded_length);
}
void
test_incremental_no_line_breaks1 (void)
{
test_incremental_no_line_breaks_for_length (DATA_SIZE);
}
void
test_incremental_no_line_breaks2 (void)
{
test_incremental_no_line_breaks_for_length (DATA_SIZE - 1);
}
void
test_incremental_no_line_breaks3 (void)
{
test_incremental_no_line_breaks_for_length (DATA_SIZE - 2);
}
void
test_incremental_with_line_breaks1 (void)
{
test_incremental_with_line_breaks_for_length (DATA_SIZE);
}
void
test_incremental_with_line_breaks2 (void)
{
test_incremental_with_line_breaks_for_length (DATA_SIZE - 1);
}
void
test_incremental_with_line_breaks3 (void)
{
test_incremental_with_line_breaks_for_length (DATA_SIZE - 2);
}
void
test_full (void)
{
gsize len;
text = g_base64_encode (data, DATA_SIZE);
data2 = g_base64_decode (text, &len);
cut_assert_equal_memory (data, DATA_SIZE, data2, len);
}
|