]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Improved message-parser unit tests.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 11 Jun 2016 18:23:57 +0000 (21:23 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 14 Jun 2016 09:25:33 +0000 (12:25 +0300)
src/lib-mail/test-message-parser.c

index 29fce70726ac99b37e8b30b6dd6065cff44cb2fb..66360d4905334ca17eed7e360e93281b23d1a128 100644 (file)
@@ -68,6 +68,32 @@ static bool msg_parts_cmp(struct message_part *p1, struct message_part *p2)
        return TRUE;
 }
 
+static void test_parsed_parts(struct istream *input, struct message_part *parts)
+{
+       struct message_parser_ctx *parser;
+       struct message_block block;
+       struct message_part *parts2;
+       uoff_t i, input_size;
+       const char *error;
+       int ret;
+
+       i_stream_seek(input, 0);
+       if (i_stream_get_size(input, TRUE, &input_size) < 0)
+               i_unreached();
+
+       parser = message_parser_init_from_parts(parts, input, 0,
+                                       MESSAGE_PARSER_FLAG_SKIP_BODY_BLOCK);
+       for (i = 1; i <= input_size*2+1; i++) {
+               test_istream_set_size(input, i/2);
+               if (i > TEST_MSG_LEN*2)
+                       test_istream_set_allow_eof(input, TRUE);
+               while ((ret = message_parser_parse_next_block(parser,
+                                                             &block)) > 0) ;
+       }
+       test_assert(message_parser_deinit_from_parts(&parser, &parts2, &error) == 0);
+       test_assert(msg_parts_cmp(parts, parts2));
+}
+
 static void test_message_parser_small_blocks(void)
 {
        struct message_parser_ctx *parser;
@@ -170,18 +196,25 @@ static const char input_msg[] =
        test_assert(message_parser_deinit(&parser, &parts) == 0);
 
        test_assert((parts->flags & MESSAGE_PART_FLAG_MULTIPART) != 0);
+       test_assert(parts->header_size.lines == 2);
+       test_assert(parts->header_size.physical_size == 48);
+       test_assert(parts->header_size.virtual_size == 48+2);
        test_assert(parts->body_size.lines == 8);
        test_assert(parts->body_size.physical_size == 112);
        test_assert(parts->body_size.virtual_size == 112+7);
+       test_assert(parts->children->physical_pos == 55);
        test_assert(parts->children->header_size.physical_size == 0);
        test_assert(parts->children->body_size.physical_size == 0);
        test_assert(parts->children->body_size.lines == 0);
+       test_assert(parts->children->next->physical_pos == 62);
        test_assert(parts->children->next->header_size.physical_size == 24);
        test_assert(parts->children->next->header_size.virtual_size == 24);
        test_assert(parts->children->next->header_size.lines == 0);
+       test_assert(parts->children->next->next->physical_pos == 94);
        test_assert(parts->children->next->next->header_size.physical_size == 24);
        test_assert(parts->children->next->next->header_size.virtual_size == 24);
        test_assert(parts->children->next->next->header_size.lines == 0);
+       test_assert(parts->children->next->next->next->physical_pos == 127);
        test_assert(parts->children->next->next->next->header_size.physical_size == 23);
        test_assert(parts->children->next->next->next->header_size.virtual_size == 23);
        test_assert(parts->children->next->next->next->header_size.lines == 0);
@@ -191,6 +224,7 @@ static const char input_msg[] =
        }
        test_assert(parts->children->next->next->next->next == NULL);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -251,6 +285,7 @@ static const char input_msg[] =
        test_assert(parts->children->next->body_size.virtual_size == 5+2);
        test_assert(parts->children->next->children == NULL);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -285,6 +320,7 @@ static const char input_msg[] =
 
        test_assert(parts->children == NULL);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -303,7 +339,7 @@ static const char input_msg[] =
        pool_t pool;
        int ret;
 
-       test_begin("message parser truncated mime headers 3");
+       test_begin("message parser empty multipart");
        pool = pool_alloconly_create("message parser", 10240);
        input = test_istream_create(input_msg);
 
@@ -322,6 +358,7 @@ static const char input_msg[] =
 
        test_assert(parts->children == NULL);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -379,6 +416,7 @@ static const char input_msg[] =
        test_assert(parts->children->children->body_size.physical_size == 5);
        test_assert(parts->children->children->body_size.virtual_size == 5+1);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -436,6 +474,7 @@ static const char input_msg[] =
        test_assert(parts->children->children->body_size.physical_size == 5);
        test_assert(parts->children->children->body_size.virtual_size == 5+1);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -493,6 +532,7 @@ static const char input_msg[] =
        test_assert(parts->children->children->body_size.physical_size == 5);
        test_assert(parts->children->children->body_size.virtual_size == 5+1);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -568,6 +608,7 @@ static const char input_msg[] =
        test_assert(part->children == NULL);
        test_assert(part->next == NULL);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();
@@ -595,6 +636,7 @@ static void test_message_parser_no_eoh(void)
        test_assert(message_parser_parse_next_block(parser, &block) < 0);
        test_assert(message_parser_deinit(&parser, &parts) == 0);
 
+       test_parsed_parts(input, parts);
        i_stream_unref(&input);
        pool_unref(&pool);
        test_end();