bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "test-lib.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "array.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "buffer.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "str.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "str-sanitize.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "istream.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "ostream.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "test-common.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include "smtp-reply-parser.h"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch#include <time.h>
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschstruct smtp_reply_parse_valid_test {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *reply;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch unsigned int status;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch bool ehlo;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch size_t max_size;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch unsigned int x, y, z;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch } enhanced_code;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *const *text_lines;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch};
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch/* Valid reply tests */
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschstatic const struct smtp_reply_parse_valid_test
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschvalid_reply_parse_tests[] = {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "220\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 220,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]){ "", NULL }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "220 \r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 220,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]){ "", NULL }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "220 OK\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 220,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]){ "OK", NULL }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "550 Requested action not taken: mailbox unavailable\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 550,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[])
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch { "Requested action not taken: mailbox unavailable", NULL }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250-smtp.example.com Hello client.example.org [10.0.0.1]\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250-SIZE 52428800\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250-PIPELINING\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250-STARTTLS\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250 HELP\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .ehlo = TRUE,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 250,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "smtp.example.com Hello client.example.org [10.0.0.1]",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "SIZE 52428800",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "PIPELINING",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "STARTTLS",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "HELP",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch NULL
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250-smtp.example.com We got some nice '\x03' and '\x04'\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250 HELP\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .ehlo = TRUE,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 250,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "smtp.example.com We got some nice ' ' and ' '",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "HELP",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch NULL
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250 smtp.example.com We got some nice '\x08'\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .ehlo = TRUE,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 250,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "smtp.example.com We got some nice ' '",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch NULL
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "250 2.1.0 Originator <frop@example.com> ok\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 250,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .enhanced_code = { 2, 1, 0 },
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]){
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "Originator <frop@example.com> ok", NULL
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "551-5.7.1 Forwarding to remote hosts disabled\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "551 5.7.1 Select another host to act as your forwarder\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .status = 551,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .enhanced_code = { 5, 7, 1 },
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .text_lines = (const char *[]) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "Forwarding to remote hosts disabled",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "Select another host to act as your forwarder",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch NULL
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch};
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschunsigned int valid_reply_parse_test_count =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch N_ELEMENTS(valid_reply_parse_tests);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschstatic void test_smtp_reply_parse_valid(void)
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch unsigned int i;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch for (i = 0; i < valid_reply_parse_test_count; i++) T_BEGIN {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct istream *input;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const struct smtp_reply_parse_valid_test *test;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct smtp_reply_parser *parser;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct smtp_reply *reply;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *error;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch int ret;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test = &valid_reply_parse_tests[i];
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch input = i_stream_create_from_data(test->reply, strlen(test->reply));
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch parser = smtp_reply_parser_init(input, test->max_size);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch i_stream_unref(&input);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_begin(t_strdup_printf("smtp reply valid [%d]", i));
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch if (test->ehlo) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch while ((ret=smtp_reply_parse_ehlo
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch (parser, &reply, &error)) > 0) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch } else {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch while ((ret=smtp_reply_parse_next
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch (parser, test->enhanced_code.x > 0, &reply, &error)) > 0) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out_reason("parse success", ret == 0, error);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch if (ret == 0) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch /* verify last response only */
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out(t_strdup_printf("reply->status = %d", test->status),
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch reply->status == test->status);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch if (test->enhanced_code.x > 0) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out(t_strdup_printf("reply->enhanced_code = %d.%d.%d",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test->enhanced_code.x, test->enhanced_code.y, test->enhanced_code.z),
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch (reply->enhanced_code.x == test->enhanced_code.x &&
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch reply->enhanced_code.y == test->enhanced_code.y &&
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch reply->enhanced_code.z == test->enhanced_code.z));
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch if (test->text_lines != NULL) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *const *line = test->text_lines;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *const *reply_line = reply->text_lines;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch unsigned int index = 0;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch while (*line != NULL) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch if (*reply_line == NULL) {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out(
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch t_strdup_printf("reply->text_lines[%d] = NULL", index),
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch FALSE);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch break;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out(t_strdup_printf(
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "reply->text_lines[%d] = \"%s\"", index, *reply_line),
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch strcmp(*line, *reply_line) == 0);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch line++;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch reply_line++;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch index++;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch } else {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out("reply->text_lines = NULL", reply->text_lines == NULL);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_end();
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch smtp_reply_parser_deinit(&parser);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch } T_END;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch}
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschstruct smtp_reply_parse_invalid_test {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *reply;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch bool ehlo;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch size_t max_size;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch};
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschstatic const struct smtp_reply_parse_invalid_test
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch invalid_reply_parse_tests[] = {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "22X OK\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "220OK\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "200-This is\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250 inconsistent.\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "400 This \r is wrong\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "500 This is \x03 worse\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "699 Obscure\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "100 Invalid\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "400 Interrupted\r"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply = "251 example.com We got '\x04'\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .ehlo = TRUE
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250-example.com Hello\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "250 We got some '\x08' for you\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .ehlo = TRUE
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch },{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .reply =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "556-This is a very long reply\r\n"
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch "556 that exceeds the very low limit.\r\n",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch .max_size = 50
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch }
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch};
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschunsigned int invalid_reply_parse_test_count =
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch N_ELEMENTS(invalid_reply_parse_tests);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschstatic void test_smtp_reply_parse_invalid(void)
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch unsigned int i;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch for (i = 0; i < invalid_reply_parse_test_count; i++) T_BEGIN {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const struct smtp_reply_parse_invalid_test *test;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct istream *input;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct smtp_reply_parser *parser;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch struct smtp_reply *reply;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch const char *reply_text, *error;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch int ret;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test = &invalid_reply_parse_tests[i];
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch reply_text = test->reply;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch input = i_stream_create_from_data(reply_text, strlen(reply_text));
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch parser = smtp_reply_parser_init(input, test->max_size);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch i_stream_unref(&input);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_begin(t_strdup_printf("smtp reply invalid [%d]", i));
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch if (test->ehlo)
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch while ((ret=smtp_reply_parse_ehlo(parser, &reply, &error)) > 0);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch else
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch while ((ret=smtp_reply_parse_next(parser, FALSE, &reply, &error)) > 0);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch str_sanitize(reply_text, 80)), ret < 0, error);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_end();
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch smtp_reply_parser_deinit(&parser);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch } T_END;
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch}
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Boschint main(void)
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch{
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch static void (*test_functions[])(void) = {
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_smtp_reply_parse_valid,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch test_smtp_reply_parse_invalid,
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch NULL
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch };
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch return test_run(test_functions);
a8433392e8a5ddfe8a125716f62b2a4dc8f1f01eStephan Bosch}