From 363af76535f8137ba76d9de7935023bab9a045ef Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Tue, 24 Mar 2020 22:24:20 +0100 Subject: [PATCH] lib-smtp: Add tests for smtp_string_parse() and smtp_string_write(). --- src/lib-smtp/Makefile.am | 5 ++ src/lib-smtp/test-smtp-syntax.c | 150 ++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 src/lib-smtp/test-smtp-syntax.c diff --git a/src/lib-smtp/Makefile.am b/src/lib-smtp/Makefile.am index b03761df8b..d87cd4e6d3 100644 --- a/src/lib-smtp/Makefile.am +++ b/src/lib-smtp/Makefile.am @@ -72,6 +72,7 @@ pkginc_libdir=$(pkgincludedir) pkginc_lib_HEADERS = $(headers) test_programs = \ + test-smtp-syntax \ test-smtp-address \ test-smtp-params \ test-smtp-reply \ @@ -121,6 +122,10 @@ if BUILD_OPENSSL test_libs_ssl += ../lib-ssl-iostream/libssl_iostream_openssl.la endif +test_smtp_syntax_SOURCES = test-smtp-syntax.c +test_smtp_syntax_LDADD = $(test_libs) +test_smtp_syntax_DEPENDENCIES = $(test_deps) + test_smtp_address_SOURCES = test-smtp-address.c test_smtp_address_LDFLAGS = -export-dynamic test_smtp_address_LDADD = $(test_libs) diff --git a/src/lib-smtp/test-smtp-syntax.c b/src/lib-smtp/test-smtp-syntax.c new file mode 100644 index 0000000000..735cd01220 --- /dev/null +++ b/src/lib-smtp/test-smtp-syntax.c @@ -0,0 +1,150 @@ +/* Copyright (c) 2020 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "str.h" +#include "str-sanitize.h" +#include "test-common.h" +#include "smtp-syntax.h" + +/* + * Valid string parse tests + */ + +struct valid_string_parse_test { + const char *input, *parsed, *output; +}; + +static const struct valid_string_parse_test +valid_string_parse_tests[] = { + { + .input = "", + .parsed = "", + }, + { + .input = "atom", + .parsed = "atom", + }, + { + .input = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789!#$%&'*+-/=?^_`{|}~", + .parsed = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789!#$%&'*+-/=?^_`{|}~", + }, + { + .input = "\"quoted-string\"", + .parsed = "quoted-string", + .output = "quoted-string", + }, + { + .input = "\"quoted \\\"string\\\"\"", + .parsed = "quoted \"string\"", + }, + { + .input = "\"quoted \\\\string\\\\\"", + .parsed = "quoted \\string\\", + }, +}; + +static const unsigned int valid_string_parse_test_count = + N_ELEMENTS(valid_string_parse_tests); + +static void test_smtp_string_parse_valid(void) +{ + unsigned int i; + + for (i = 0; i < valid_string_parse_test_count; i++) T_BEGIN { + const struct valid_string_parse_test *test = + &valid_string_parse_tests[i]; + const char *parsed, *error = NULL; + int ret; + + ret = smtp_string_parse(test->input, &parsed, &error); + + test_begin(t_strdup_printf("smtp string valid [%d]", i)); + test_out_reason(t_strdup_printf("parse(\"%s\")", test->input), + ret >= 0, error); + test_assert(ret != 0 || *test->input == '\0'); + + if (!test_has_failed()) { + string_t *encoded; + const char *output; + + test_out(t_strdup_printf("parsed = \"%s\"", parsed), + null_strcmp(parsed, test->parsed) == 0); + + encoded = t_str_new(255); + smtp_string_write(encoded, parsed); + output = (test->output == NULL ? + test->input : test->output); + test_out(t_strdup_printf("write() = \"%s\"", + str_c(encoded)), + strcmp(str_c(encoded), output) == 0); + } + test_end(); + } T_END; +} + +/* + * Invalid string parse tests + */ + +struct invalid_string_parse_test { + const char *input; +}; + +static const struct invalid_string_parse_test +invalid_string_parse_tests[] = { + { + .input = " ", + }, + { + .input = "\\", + }, + { + .input = "\"", + }, + { + .input = "\"aa", + }, + { + .input = "aa\"", + }, +}; + +static const unsigned int invalid_string_parse_test_count = + N_ELEMENTS(invalid_string_parse_tests); + +static void test_smtp_string_parse_invalid(void) +{ + unsigned int i; + + for (i = 0; i < invalid_string_parse_test_count; i++) T_BEGIN { + const struct invalid_string_parse_test *test = + &invalid_string_parse_tests[i]; + const char *parsed, *error; + int ret; + + ret = smtp_string_parse(test->input, &parsed, &error); + + test_begin(t_strdup_printf("smtp string invalid [%d]", i)); + test_out_reason(t_strdup_printf("parse(\"%s\")", test->input), + ret < 0, error); + test_end(); + } T_END; +} + +/* + * Tests + */ + +int main(void) +{ + static void (*test_functions[])(void) = { + test_smtp_string_parse_valid, + test_smtp_string_parse_invalid, + NULL + }; + return test_run(test_functions); +}