test-rfc822-parser.c revision efb00f1b47d7219f77d89a963c9f3584583b207e
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Copyright (c) 2015 Dovecot authors, see the included COPYING file */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "lib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "str.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "rfc822-parser.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "test-common.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void test_rfc822_parse_quoted_string(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *input, *output;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int ret;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } tests[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"", "", -1 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"\"", "", 0 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"foo\"", "foo", 0 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"\"foo", "", 1 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"\"\"", "", 1 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"\\\"\"", "\"", 0 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"\\\\\"", "\\", 0 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "\"\\\\foo\\\\foo\\\\\"", "\\foo\\foo\\", 0 }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct rfc822_parser_context parser;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string_t *str = t_str_new(64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned int i = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_begin("rfc822 parse quoted string");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < N_ELEMENTS(tests); i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rfc822_parser_init(&parser, (const void *)tests[i].input,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strlen(tests[i].input), NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_assert_idx(rfc822_parse_quoted_string(&parser, str) == tests[i].ret, i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_assert_idx(tests[i].ret < 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(tests[i].output, str_c(str)) == 0, i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync str_truncate(str, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_end();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void test_rfc822_parse_content_param(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *input =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "; key1=value1#$!%&'*+-.^_`{|}~"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "; key2=\" \\\"(),/:;<=>?@[\\\\]\"";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *key, *value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } output[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "key1", "value1#$!%&'*+-.^_`{|}~" },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { "key2", " \"(),/:;<=>?@[\\]" }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct rfc822_parser_context parser;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *key, *value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned int i = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int ret;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_begin("rfc822 parse content param");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rfc822_parser_init(&parser, (const void *)input, strlen(input), NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((ret = rfc822_parse_content_param(&parser, &key, &value)) > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_assert_idx(strcmp(output[i].key, key) == 0, i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_assert_idx(strcmp(output[i].value, value) == 0, i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_assert(ret == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_end();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint main(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static void (*test_functions[])(void) = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_rfc822_parse_quoted_string,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test_rfc822_parse_content_param,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return test_run(test_functions);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync