/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "str.h"
#include "imap-quote.h"
#include "test-common.h"
static void test_imap_append_string_for_humans(void)
{
static const struct {
const char *input, *output;
} tests[] = {
{ "", "\"\"" },
{ " ", "\"\"" },
{ " ", "\"\"" },
{ "\t", "\"\"" },
{ " \t", "\"\"" },
{ " \t ", "\"\"" },
{ " foo", "{3}\r\nfoo" },
{ "\tfoo", "{3}\r\nfoo" },
{ "\t \tfoo", "{3}\r\nfoo" },
{ " foo ", "{3}\r\nfoo" },
{ " foo ", "{3}\r\nfoo" },
{ " foo \t \t", "{3}\r\nfoo" },
{ "hello\"world", "{11}\r\nhello\"world" },
{ "hello\\world", "{11}\r\nhello\\world" },
{ "hello\rworld", "{11}\r\nhello world" },
{ "hello\nworld", "{11}\r\nhello world" },
{ "hello\r\nworld", "{11}\r\nhello world" },
{ "hello\r\n world", "{11}\r\nhello world" },
{ "hello \r\n world", "{11}\r\nhello world" },
};
string_t *str = t_str_new(128);
unsigned int i;
test_begin("imap_append_string_for_humans()");
for (i = 0; i < N_ELEMENTS(tests); i++) {
str_truncate(str, 0);
imap_append_string_for_humans(str, (const void *)tests[i].input,
strlen(tests[i].input));
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
}
test_end();
}
static void test_imap_append_astring(void)
{
static const struct {
const char *input, *output;
} tests[] = {
{ "", "\"\"" },
{ "NIL", "\"NIL\"" },
{ "niL", "\"niL\"" },
{ "ni", "ni" },
{ "\\", "\"\\\\\"" },
{ "\\\\", "\"\\\\\\\\\"" },
{ "\\\\\\", "\"\\\\\\\\\\\\\"" },
{ "\\\\\\\\", "\"\\\\\\\\\\\\\\\\\"" },
{ "\\\\\\\\\\", "{5}\r\n\\\\\\\\\\" },
{ "\\\\\\\\\\\\", "{6}\r\n\\\\\\\\\\\\" },
{ "\"", "\"\\\"\"" },
{ "\"\"", "\"\\\"\\\"\"" },
{ "\"\"\"", "\"\\\"\\\"\\\"\"" },
{ "\"\"\"\"", "\"\\\"\\\"\\\"\\\"\"" },
{ "\"\"\"\"\"", "{5}\r\n\"\"\"\"\"" },
{ "\"\"\"\"\"\"", "{6}\r\n\"\"\"\"\"\"" },
{ "\r", "{1}\r\n\r" },
{ "\n", "{1}\r\n\n" },
{ "\r\n", "{2}\r\n\r\n" },
{ "\x7f", "\"\x7f\"" },
{ "\x80", "{1}\r\n\x80" },
{ "\xff", "{1}\r\n\xff" },
};
string_t *str = t_str_new(128);
unsigned int i;
test_begin("test_imap_append_astring()");
for (i = 0; i < N_ELEMENTS(tests); i++) {
str_truncate(str, 0);
imap_append_astring(str, tests[i].input);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
}
test_end();
}
static void test_imap_append_nstring(void)
{
static const struct {
const char *input, *output;
} tests[] = {
{ "", "\"\"" },
{ NULL, "NIL" },
{ "NIL", "\"NIL\"" },
{ "\"America N.\"", "\"\\\"America N.\\\"\"" },
{ "\"America N.\", \"America S.\"", "\"\\\"America N.\\\", \\\"America S.\\\"\"" },
{ "\"America N.\", \"America S.\", \"Africa\"", "{36}\r\n\"America N.\", \"America S.\", \"Africa\"" },
{ "Antarctica\n Australia", "{21}\r\nAntarctica\n Australia" },
{ "ni", "\"ni\"" }
};
string_t *str = t_str_new(128);
unsigned int i;
test_begin("test_imap_append_nstring()");
for (i = 0; i < N_ELEMENTS(tests); i++) {
str_truncate(str, 0);
imap_append_nstring(str, tests[i].input);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
}
test_end();
}
static void test_imap_append_nstring_nolf(void)
{
static const struct {
const char *input, *output;
} tests[] = {
{ "", "\"\"" },
{ NULL, "NIL" },
{ "NIL", "\"NIL\"" },
{ "ni", "\"ni\"" },
{ "\"NIL\n foo", "\"\\\"NIL foo\"" },
{ "\"America N.\", \"America S.\", \"Africa\"", "{36}\r\n\"America N.\", \"America S.\", \"Africa\"" },
{ "foo\nbar", "\"foo bar\"" },
{ "foo\r\nbar", "\"foo bar\"" },
{ "foo\rbar", "\"foo bar\"" },
{ "foo\n bar", "\"foo bar\"" },
{ "foo\r\n bar", "\"foo bar\"" },
{ "foo\r bar", "\"foo bar\"" },
{ "foo\n\tbar", "\"foo\tbar\"" },
{ "foo\r\n\tbar", "\"foo\tbar\"" },
{ "foo\r\tbar", "\"foo\tbar\"" },
{ "foo\n bar", "\"foo bar\"" },
{ "foo\r\n bar", "\"foo bar\"" },
{ "foo\r bar", "\"foo bar\"" },
{ "\nfoo\r bar\r\n", "\" foo bar\"" }
};
unsigned int i;
test_begin("test_imap_append_nstring_nolf()");
for (i = 0; i < N_ELEMENTS(tests); i++) T_BEGIN {
string_t *str = t_str_new(1);
string_t *str2 = str_new(default_pool, 1);
str_truncate(str, 0);
imap_append_nstring_nolf(str, tests[i].input);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
str_truncate(str2, 0);
imap_append_nstring_nolf(str2, tests[i].input);
test_assert_idx(strcmp(tests[i].output, str_c(str2)) == 0, i);
str_free(&str2);
} T_END;
test_end();
}
int main(void)
{
static void (*const test_functions[])(void) = {
test_imap_append_string_for_humans,
test_imap_append_astring,
test_imap_append_nstring,
test_imap_append_nstring_nolf,
NULL
};
return test_run(test_functions);
}