bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .localpart = "user+detail", .domain = NULL };
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .localpart = "e=mc2", .domain = "example.com" };
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Valid mail params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct valid_mail_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .type = SMTP_PARAM_MAIL_BODY_TYPE_UNSPECIFIED,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int valid_mail_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_auth(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->auth->localpart == test->auth->localpart));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->domain = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->auth->domain == test->auth->domain));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->domain = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_body(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.body.type = %s", type_name),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->body.type != SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->body.ext, test->body.ext) == 0))));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_envid(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_ret(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.ret = %s", ret_name),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_size(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.size = %"PRIuUOFF_T, parsed->size),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_extensions(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (!array_is_created(&parsed->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out("params.extra_params.count = 0", FALSE);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < array_count(&test->extra_params); i++) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch "params.extra_params[%u] = [\"%s\"=\"%s\"]", i,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(pparam->keyword, tparam->keyword) == 0 &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ((pparam->value == NULL && tparam->value == NULL) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (pparam->value != NULL && tparam->value != NULL &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_mail_params_parse_valid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < valid_mail_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct valid_mail_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_mail_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, ¶ms,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp mail params valid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_auth(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_8BITMIME) != 0 ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (test->caps & SMTP_CAPABILITY_BINARYMIME) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_body(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_envid(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_ret(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_size(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_extensions(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch smtp_params_mail_write(encoded, test->caps, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch output = (test->output == NULL ? test->input : test->output);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Invalid mail params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct invalid_mail_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int invalid_mail_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_mail_params_parse_invalid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < invalid_mail_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct invalid_mail_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_mail_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, ¶ms,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp mail params invalid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Valid rcpt params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct valid_rcpt_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#if 0 // FIXME: message_address_parser() does not allow bare localpart
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch // addresses.
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int valid_rcpt_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_rcpt_params_orcpt(const struct smtp_params_rcpt *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->localpart = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->localpart = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->domain = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->domain = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_rcpt_params_notify(const struct smtp_params_rcpt *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_NEVER) != 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_assert((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_SUCCESS) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_assert((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_FAILURE) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_assert((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_DELAY) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_SUCCESS) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_FAILURE) != 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_DELAY) != 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.notify = %s", str_c(notify_name)),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_rcpt_params_extensions(const struct smtp_params_rcpt *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (!array_is_created(&parsed->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out("params.extra_params.count = 0", FALSE);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < array_count(&test->extra_params); i++) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch "params.extra_params[%u] = [\"%s\"=\"%s\"]", i,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(pparam->keyword, tparam->keyword) == 0 &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ((pparam->value == NULL && tparam->value == NULL) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (pparam->value != NULL && tparam->value != NULL &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_rcpt_params_parse_valid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < valid_rcpt_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct valid_rcpt_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_rcpt_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, ¶ms,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp rcpt params valid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_orcpt(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_notify(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_extensions(&test->params, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch smtp_params_rcpt_write(encoded, test->caps, ¶ms);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch output = (test->output == NULL ? test->input : test->output);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Invalid rcpt params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct invalid_rcpt_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int invalid_rcpt_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_rcpt_params_parse_invalid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < invalid_rcpt_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct invalid_rcpt_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_rcpt_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, ¶ms,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp rcpt params invalid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch static void (*test_functions[])(void) = {