test-message-header-parser.c revision bfe21a7777922339efd32724c22b2cc40de829d2
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstatic const char *test1_msg =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainentest_message_header_parser_one(struct message_header_parser_ctx *parser,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) > 0);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP) == 0)
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);
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);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen test_assert(!hdr->continues && !hdr->continued && !hdr->eoh &&
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->continues && !hdr->continued && !hdr->eoh &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (use_full_value) hdr->use_full_value = TRUE;
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 if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0) {
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->continues && !hdr->continued && !hdr->eoh &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (use_full_value) hdr->use_full_value = TRUE;
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 &&
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen if (use_full_value) hdr->use_full_value = TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0) {
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen } else if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_DROP_CR) != 0) {
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 if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0) {
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen } else if ((hdr_flags & MESSAGE_HEADER_PARSER_FLAG_DROP_CR) != 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memcmp(hdr->full_value, "\n\tv3\n\tw3", 8) == 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memcmp(hdr->full_value, "\r\n\tv3\n\tw3", 9) == 0);
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 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert(message_parse_header_next(parser, &hdr) < 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen static enum message_header_parser_flags max_hdr_flags =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP |
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen for (hdr_flags = 0; hdr_flags <= max_hdr_flags; hdr_flags++) {
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen parser = message_parse_header_init(input, &hdr_size, hdr_flags);
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen test_message_header_parser_one(parser, hdr_flags);
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);
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainenstatic void hdr_write(string_t *str, struct message_header_line *hdr)
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen str_append_n(str, hdr->middle, hdr->middle_len);
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen str_append_n(str, hdr->value, hdr->value_len);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenstatic void test_message_header_parser_partial(void)
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen unsigned int i, max = (strlen(test1_msg)-TEST1_MSG_BODY_LEN)*2;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen parser = message_parse_header_init(input, NULL, 0);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen for (i = 0; i <= max; i++) {
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen while ((ret = message_parse_header_next(parser, &hdr)) > 0)
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen test_assert(strcmp(str_c(str), test1_msg) == 0);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen static void (*test_functions[])(void) = {