diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib-smtp/test-smtp-syntax.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/lib-smtp/test-smtp-syntax.c b/src/lib-smtp/test-smtp-syntax.c new file mode 100644 index 0000000..735cd01 --- /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); +} |