#include #include #include #include #define DATA_SIZE 1024 #define BLOCK_SIZE 32 #define NUM_BLOCKS 32 static guchar data[DATA_SIZE]; static void test_incremental (gboolean line_break) { char text[DATA_SIZE * 2]; char *p; guchar data2[DATA_SIZE]; int i; gsize len, decoded_len, max; int state, save; guint decoder_save; len = 0; state = 0; save = 0; for (i = 0; i < NUM_BLOCKS; i++) len += g_base64_encode_step (data + i * BLOCK_SIZE, BLOCK_SIZE, line_break, text + len, &state, &save); len += g_base64_encode_close (line_break, text + len, &state, &save); if (line_break) max = DATA_SIZE * 4 / 3 + DATA_SIZE * 4 / (3 * 72) + 7; else max = DATA_SIZE * 4 / 3 + 6; if (len > max) { g_print ("To long encoded length: got %d, expected max %d\n", len, max); exit (1); } decoded_len = 0; state = 0; decoder_save = 0; p = text; while (len > 0) { int chunk_len = MAX (32, len); decoded_len += g_base64_decode_step (p, chunk_len, data2 + decoded_len, &state, &decoder_save); p += chunk_len; len -= chunk_len; } if (decoded_len != DATA_SIZE) { g_print ("Wrong decoded length: got %d, expected %d\n", decoded_len, DATA_SIZE); exit (1); } if (memcmp (data, data2, DATA_SIZE) != 0) { g_print ("Wrong decoded base64 data\n"); exit (1); } } static void test_full (void) { char *text; guchar *data2; gsize len; text = g_base64_encode (data, DATA_SIZE); data2 = g_base64_decode (text, &len); g_free (text); if (len != DATA_SIZE) { g_print ("Wrong decoded length: got %d, expected %d\n", len, DATA_SIZE); exit (1); } if (memcmp (data, data2, DATA_SIZE) != 0) { g_print ("Wrong decoded base64 data\n"); exit (1); } } int main (int argc, char *argv[]) { int i; for (i = 0; i < DATA_SIZE; i++) data[i] = (guchar)i; test_full (); test_incremental (FALSE); test_incremental (TRUE); return 0; }