test-message-header-parser.c revision bfe21a7777922339efd32724c22b2cc40de829d2
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "lib.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "str.h"
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen#include "istream.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "message-size.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "message-header-parser.h"
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen#include "test-common.h"
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define TEST1_MSG_BODY_LEN 5
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstatic const char *test1_msg =
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen "h1: v1\n"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "h2:\n"
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen " v2\r\n"
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen "h3: \r\n"
a8fe899601735459641edae975c0fa08be8482e2Timo Sirainen "\tv3\n"
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen "\tw3\r\n"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "\n"
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen " body";
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainentest_message_header_parser_one(struct message_header_parser_ctx *parser,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen enum message_header_parser_flags hdr_flags)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct message_header_line *hdr;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool use_full_value;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen use_full_value = hdr_flags != 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen test_assert(hdr->name_offset == 0);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP) == 0)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen test_assert(hdr->full_value_offset == 4);
8a524e87e44ae629cf90262e92f7972ea3450c35Timo Sirainen else
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->full_value_offset == 5);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->name_len == 2 && strcmp(hdr->name, "h1") == 0);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP) == 0) {
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen test_assert(hdr->middle_len == 2 && memcmp(hdr->middle, ": ", 2) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->value_len == 3 && memcmp(hdr->value, " v1", 3) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen } else {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen test_assert(hdr->middle_len == 3 && memcmp(hdr->middle, ": ", 3) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->value_len == 2 && memcmp(hdr->value, "v1", 2) == 0);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen }
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen test_assert(!hdr->continues && !hdr->continued && !hdr->eoh &&
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen !hdr->no_newline && !hdr->crlf_newline);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen test_assert(hdr->name_offset == 8 && hdr->full_value_offset == 11);
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen test_assert(hdr->name_len == 2 && strcmp(hdr->name, "h2") == 0);
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen test_assert(hdr->middle_len == 1 && memcmp(hdr->middle, ":", 1) == 0);
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen test_assert(hdr->value_len == 0);
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen test_assert(hdr->continues && !hdr->continued && !hdr->eoh &&
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen !hdr->no_newline && !hdr->crlf_newline);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (use_full_value) hdr->use_full_value = TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen test_assert(hdr->name_offset == 8 && hdr->full_value_offset == 11);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen test_assert(hdr->name_len == 2 && strcmp(hdr->name, "h2") == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->middle_len == 1 && memcmp(hdr->middle, ":", 1) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->value_len == 3 && memcmp(hdr->value, " v2", 3) == 0);
7bb371485650002935888b2f9b72b23aba5a5d9aStephan Bosch test_assert(!hdr->continues && hdr->continued && !hdr->eoh &&
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen !hdr->no_newline && hdr->crlf_newline);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0) {
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen test_assert(hdr->full_value_len == 3 &&
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen memcmp(hdr->full_value, " v2", 3) == 0);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen } else if (use_full_value) {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen test_assert(hdr->full_value_len == 4 &&
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen memcmp(hdr->full_value, "\n v2", 4) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
428fb4dc39c6e9b2eb36216c396dad6096a65f8fTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->name_offset == 17 && hdr->full_value_offset == 21);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->name_len == 2 && strcmp(hdr->name, "h3") == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->middle_len == 2 && memcmp(hdr->middle, ": ", 2) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->value_len == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->continues && !hdr->continued && !hdr->eoh &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen !hdr->no_newline && hdr->crlf_newline);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (use_full_value) hdr->use_full_value = TRUE;
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->name_offset == 17 && hdr->full_value_offset == 21);
c64840e98649f906a7b587c259d5b9e697c37498Timo Sirainen test_assert(hdr->name_len == 2 && strcmp(hdr->name, "h3") == 0);
c64840e98649f906a7b587c259d5b9e697c37498Timo Sirainen test_assert(hdr->middle_len == 2 && memcmp(hdr->middle, ": ", 2) == 0);
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen test_assert(hdr->value_len == 3 && memcmp(hdr->value, "\tv3", 3) == 0);
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen test_assert(hdr->continues && hdr->continued && !hdr->eoh &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen !hdr->no_newline && !hdr->crlf_newline);
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen if (use_full_value) hdr->use_full_value = TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0) {
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen test_assert(hdr->full_value_len == 3 &&
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen memcmp(hdr->full_value, " v3", 3) == 0);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen } else if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_DROP_CR) != 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->full_value_len == 4 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memcmp(hdr->full_value, "\n\tv3", 4) == 0);
c64840e98649f906a7b587c259d5b9e697c37498Timo Sirainen } else if (use_full_value) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->full_value_len == 5 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memcmp(hdr->full_value, "\r\n\tv3", 5) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen test_assert(hdr->name_offset == 17 && hdr->full_value_offset == 21);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen test_assert(hdr->name_len == 2 && strcmp(hdr->name, "h3") == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->middle_len == 2 && memcmp(hdr->middle, ": ", 2) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->value_len == 3 && memcmp(hdr->value, "\tw3", 3) == 0);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen test_assert(!hdr->continues && hdr->continued && !hdr->eoh &&
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen !hdr->no_newline && hdr->crlf_newline);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->full_value_len == 6 &&
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen memcmp(hdr->full_value, " v3 w3", 6) == 0);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen } else if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_DROP_CR) != 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->full_value_len == 8 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memcmp(hdr->full_value, "\n\tv3\n\tw3", 8) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen } else if (use_full_value) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->full_value_len == 9 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memcmp(hdr->full_value, "\r\n\tv3\n\tw3", 9) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr->name_offset == 32 && hdr->full_value_offset == 32);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen test_assert(hdr->name_len == 0 && hdr->middle_len == 0 && hdr->value_len == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(!hdr->continues && !hdr->continued && hdr->eoh &&
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen !hdr->no_newline && !hdr->crlf_newline);
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) < 0);
67770c0874918e3b73bbd1ff75b5ec91790d51dcTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void test_message_header_parser(void)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen static enum message_header_parser_flags max_hdr_flags =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP |
f67059a0fb0ea694dfa49910c5af2ff0f60ea18eTimo Sirainen MESSAGE_HEADER_PARSER_FLAG_DROP_CR |
f67059a0fb0ea694dfa49910c5af2ff0f60ea18eTimo Sirainen MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen enum message_header_parser_flags hdr_flags;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct message_header_parser_ctx *parser;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct message_size hdr_size;
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen struct istream *input;
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen test_begin("message header parser");
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen input = test_istream_create(test1_msg);
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen for (hdr_flags = 0; hdr_flags <= max_hdr_flags; hdr_flags++) {
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen i_stream_seek(input, 0);
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen parser = message_parse_header_init(input, &hdr_size, hdr_flags);
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen test_message_header_parser_one(parser, hdr_flags);
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen message_parse_header_deinit(&parser);
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(hdr_size.physical_size == strlen(test1_msg)-TEST1_MSG_BODY_LEN);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen test_assert(hdr_size.virtual_size == strlen(test1_msg) - TEST1_MSG_BODY_LEN + 4);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen i_stream_unref(&input);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen test_end();
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainenstatic void hdr_write(string_t *str, struct message_header_line *hdr)
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen{
2128e2bebe4af374561ea2846b9d3eca3cde233eTimo Sirainen if (!hdr->continued) {
2128e2bebe4af374561ea2846b9d3eca3cde233eTimo Sirainen str_append(str, hdr->name);
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen str_append_n(str, hdr->middle, hdr->middle_len);
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen }
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen str_append_n(str, hdr->value, hdr->value_len);
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen if (!hdr->no_newline) {
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen if (hdr->crlf_newline)
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen str_append_c(str, '\r');
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen str_append_c(str, '\n');
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen }
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen}
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenstatic void test_message_header_parser_partial(void)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen{
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen struct message_header_parser_ctx *parser;
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen struct message_header_line *hdr;
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen struct istream *input;
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen unsigned int i, max = (strlen(test1_msg)-TEST1_MSG_BODY_LEN)*2;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen string_t *str;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen int ret;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_begin("message header parser partial");
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen input = test_istream_create(test1_msg);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_istream_set_allow_eof(input, FALSE);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen str = t_str_new(max);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen parser = message_parse_header_init(input, NULL, 0);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen for (i = 0; i <= max; i++) {
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_istream_set_size(input, i/2);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen while ((ret = message_parse_header_next(parser, &hdr)) > 0)
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen hdr_write(str, hdr);
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen test_assert((ret == 0 && i < max) ||
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen (ret < 0 && i == max));
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen }
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen message_parse_header_deinit(&parser);
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen str_append(str, " body");
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_assert(strcmp(str_c(str), test1_msg) == 0);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen i_stream_unref(&input);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_end();
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen}
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainenint main(void)
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen{
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen static void (*test_functions[])(void) = {
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_message_header_parser,
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_message_header_parser_partial,
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen NULL
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen };
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen return test_run(test_functions);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen}
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen