sl@0: /* sl@0: * Portions copyright (c) 2009 Nokia Corporation. All rights reserved. sl@0: */ sl@0: #include "config.h" sl@0: sl@0: #include sl@0: #include sl@0: #ifdef HAVE_UNISTD_H sl@0: #include sl@0: #endif sl@0: #include sl@0: #ifdef __SYMBIAN32__ sl@0: #include "mrt2_glib2_test.h" sl@0: #endif /*__SYMBIAN32__*/ sl@0: sl@0: #define DATA_SIZE 1024 sl@0: #define BLOCK_SIZE 32 sl@0: #define NUM_BLOCKS 32 sl@0: static guchar data[DATA_SIZE]; sl@0: sl@0: static void sl@0: test_incremental (gboolean line_break, sl@0: gint length) sl@0: { sl@0: char *p; sl@0: gsize len, decoded_len, max, input_len, block_size; sl@0: int state, save; sl@0: guint decoder_save; sl@0: char *text; sl@0: guchar *data2; sl@0: sl@0: data2 = g_malloc (length); sl@0: text = g_malloc (length * 4); sl@0: sl@0: len = 0; sl@0: state = 0; sl@0: save = 0; sl@0: input_len = 0; sl@0: while (input_len < length) sl@0: { sl@0: block_size = MIN (BLOCK_SIZE, length - input_len); sl@0: len += g_base64_encode_step (data + input_len, block_size, sl@0: line_break, text + len, &state, &save); sl@0: input_len += block_size; sl@0: } sl@0: len += g_base64_encode_close (line_break, text + len, &state, &save); sl@0: sl@0: if (line_break) sl@0: max = length * 4 / 3 + length * 4 / (3 * 72) + 7; sl@0: else sl@0: max = length * 4 / 3 + 6; sl@0: if (len > max) sl@0: { sl@0: g_print ("Too long encoded length: got %d, expected max %d\n", sl@0: len, max); sl@0: exit (1); sl@0: } sl@0: sl@0: decoded_len = 0; sl@0: state = 0; sl@0: decoder_save = 0; sl@0: p = text; sl@0: while (len > 0) sl@0: { sl@0: int chunk_len = MIN (BLOCK_SIZE, len); sl@0: decoded_len += g_base64_decode_step (p, sl@0: chunk_len, sl@0: data2 + decoded_len, sl@0: &state, &decoder_save); sl@0: p += chunk_len; sl@0: len -= chunk_len; sl@0: } sl@0: sl@0: if (decoded_len != length) sl@0: { sl@0: g_print ("Wrong decoded length: got %d, expected %d\n", sl@0: decoded_len, length); sl@0: exit (1); sl@0: } sl@0: sl@0: if (memcmp (data, data2, length) != 0) sl@0: { sl@0: g_print ("Wrong decoded base64 data\n"); sl@0: exit (1); sl@0: } sl@0: sl@0: g_free (text); sl@0: g_free (data2); sl@0: } sl@0: sl@0: static void sl@0: test_full (gint length) sl@0: { sl@0: char *text; sl@0: guchar *data2; sl@0: gsize len; sl@0: sl@0: text = g_base64_encode (data, length); sl@0: data2 = g_base64_decode (text, &len); sl@0: g_free (text); sl@0: sl@0: if (len != length) sl@0: { sl@0: g_print ("Wrong decoded length: got %d, expected %d\n", sl@0: len, length); sl@0: exit (1); sl@0: } sl@0: sl@0: if (memcmp (data, data2, length) != 0) sl@0: { sl@0: g_print ("Wrong decoded base64 data\n"); sl@0: exit (1); sl@0: } sl@0: sl@0: g_free (data2); sl@0: } sl@0: sl@0: int sl@0: main (int argc, char *argv[]) sl@0: { sl@0: int i; sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL); sl@0: g_set_print_handler(mrtPrintHandler); sl@0: #endif /*__SYMBIAN32__*/ sl@0: sl@0: for (i = 0; i < DATA_SIZE; i++) sl@0: data[i] = (guchar)i; sl@0: sl@0: test_full (DATA_SIZE); sl@0: test_full (1); sl@0: test_full (2); sl@0: test_full (3); sl@0: sl@0: test_incremental (FALSE, DATA_SIZE); sl@0: test_incremental (TRUE, DATA_SIZE); sl@0: sl@0: test_incremental (FALSE, DATA_SIZE - 1); sl@0: test_incremental (TRUE, DATA_SIZE - 1); sl@0: sl@0: test_incremental (FALSE, DATA_SIZE - 2); sl@0: test_incremental (TRUE, DATA_SIZE - 2); sl@0: sl@0: test_incremental (FALSE, 1); sl@0: test_incremental (FALSE, 2); sl@0: test_incremental (FALSE, 3); sl@0: #ifdef __SYMBIAN32__ sl@0: testResultXml("base64-test"); sl@0: #endif /* EMULATOR */ sl@0: sl@0: return 0; sl@0: }