changeset 20310:dde8a2de828c

lib-mail: Improved message-parser unit tests.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sat, 11 Jun 2016 21:23:57 +0300
parents c71559ff040d
children f12074f591ec
files src/lib-mail/test-message-parser.c
diffstat 1 files changed, 43 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/test-message-parser.c	Sat Jun 11 21:23:07 2016 +0300
+++ b/src/lib-mail/test-message-parser.c	Sat Jun 11 21:23:57 2016 +0300
@@ -68,6 +68,32 @@
 	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 @@
 	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 @@
 	}
 	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 @@
 	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 @@
 
 	test_assert(parts->children == NULL);
 
+	test_parsed_parts(input, parts);
 	i_stream_unref(&input);
 	pool_unref(&pool);
 	test_end();
@@ -303,7 +339,7 @@
 	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 @@
 
 	test_assert(parts->children == NULL);
 
+	test_parsed_parts(input, parts);
 	i_stream_unref(&input);
 	pool_unref(&pool);
 	test_end();
@@ -379,6 +416,7 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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();