test-quoted-printable.c revision 1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen#include "lib.h"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen#include "buffer.h"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen#include "str.h"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen#include "quoted-printable.h"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen#include "test-common.h"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainenstatic void test_quoted_printable_decode(void)
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen{
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen const char *data[] = {
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo \r\nbar=", "foo\r\nbar",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo =\nbar", "foo bar",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo =\r\nbar", "foo bar",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo \nbar=", "foo\r\nbar",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "=0A=0D ", "\n\r",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo_bar", "foo_bar",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=", "foo",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=A", "foo",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=Ax", "foo=Ax",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=Ax=xy", "foo=Ax=xy"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen };
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buffer_t *buf;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen unsigned int i, start, end, len;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen size_t src_pos;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_begin("quoted printable decode");
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buf = buffer_create_dynamic(pool_datastack_create(), 128);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen for (i = 0; i < N_ELEMENTS(data); i += 2) {
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen len = strlen(data[i]);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen for (start = 0, end = 1; end <= len; ) {
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen quoted_printable_decode(CONST_PTR_OFFSET(data[i], start),
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen end - start, &src_pos, buf);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen src_pos += start;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen start = src_pos;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen if (src_pos <= end)
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen end++;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen else
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen end = src_pos + 1;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen }
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_assert(strcmp(data[i+1], str_c(buf)) == 0);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buffer_set_used_size(buf, 0);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen }
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_end();
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen}
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainenstatic void test_quoted_printable_q_decode(void)
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen{
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen const char *data[] = {
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "=0A=0D ", "\n\r ",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "__foo__bar__", " foo bar ",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=", "foo=",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=A", "foo=A",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=Ax", "foo=Ax",
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen "foo=Ax=xy", "foo=Ax=xy"
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen };
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buffer_t *buf;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen unsigned int i;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_begin("quoted printable q decode");
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buf = buffer_create_dynamic(pool_datastack_create(), 128);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen for (i = 0; i < N_ELEMENTS(data); i += 2) {
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen quoted_printable_q_decode((const void *)data[i], strlen(data[i]),
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buf);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_assert(strcmp(data[i+1], str_c(buf)) == 0);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen buffer_set_used_size(buf, 0);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen }
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_end();
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen}
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainenint main(void)
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen{
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen static void (*test_functions[])(void) = {
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_quoted_printable_decode,
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen test_quoted_printable_q_decode,
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen NULL
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen };
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen return test_run(test_functions);
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen}