dovecot: Added unit test for istream-header-filter.

dovecot at dovecot.org dovecot at dovecot.org
Thu Nov 8 19:44:55 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/d329f3c77c65
changeset: 6741:d329f3c77c65
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Nov 08 19:43:18 2007 +0200
description:
Added unit test for istream-header-filter.

diffstat:

3 files changed, 80 insertions(+), 12 deletions(-)
src/tests/test-common.c |   22 +++++++++++++++
src/tests/test-common.h |    2 +
src/tests/test-mail.c   |   68 ++++++++++++++++++++++++++++++++++++++---------

diffs (155 lines):

diff -r 23afbedda4af -r d329f3c77c65 src/tests/test-common.c
--- a/src/tests/test-common.c	Thu Nov 08 18:44:12 2007 +0200
+++ b/src/tests/test-common.c	Thu Nov 08 19:43:18 2007 +0200
@@ -1,6 +1,7 @@
 /* Copyright (c) 2007 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "istream-internal.h"
 #include "test-common.h"
 
 #include <stdio.h>
@@ -9,6 +10,27 @@
 
 static unsigned int failure_count;
 static unsigned int total_count;
+
+static ssize_t test_read(struct istream_private *stream)
+{
+	if (stream->pos < (uoff_t)stream->statbuf.st_size)
+		return 0;
+
+	stream->istream.eof = TRUE;
+	return -1;
+}
+
+struct istream *test_istream_create(const char *data)
+{
+	struct istream *input;
+	unsigned int len = strlen(data);
+
+	input = i_stream_create_from_data(data, len);
+	input->blocking = FALSE;
+	input->real_stream->statbuf.st_size = len;
+	input->real_stream->read = test_read;
+	return input;
+}
 
 void test_out(const char *name, bool success)
 {
diff -r 23afbedda4af -r d329f3c77c65 src/tests/test-common.h
--- a/src/tests/test-common.h	Thu Nov 08 18:44:12 2007 +0200
+++ b/src/tests/test-common.h	Thu Nov 08 19:43:18 2007 +0200
@@ -1,5 +1,7 @@
 #ifndef TEST_COMMON_H
 #define TEST_COMMON_H
+
+struct istream *test_istream_create(const char *data);
 
 void test_out(const char *name, bool success);
 
diff -r 23afbedda4af -r d329f3c77c65 src/tests/test-mail.c
--- a/src/tests/test-mail.c	Thu Nov 08 18:44:12 2007 +0200
+++ b/src/tests/test-mail.c	Thu Nov 08 19:43:18 2007 +0200
@@ -6,6 +6,7 @@
 #include "message-address.h"
 #include "message-date.h"
 #include "message-parser.h"
+#include "istream-header-filter.h"
 #include "test-common.h"
 
 static const char test_msg[] =
@@ -201,15 +202,6 @@ static bool msg_parts_cmp(struct message
 	return TRUE;
 }
 
-static ssize_t test_read(struct istream_private *stream)
-{
-	if (stream->pos < TEST_MSG_LEN)
-		return 0;
-
-	stream->istream.eof = TRUE;
-	return -1;
-}
-
 static void test_message_parser(void)
 {
 	struct message_parser_ctx *parser;
@@ -230,9 +222,7 @@ static void test_message_parser(void)
 	parts = message_parser_deinit(&parser);
 	i_stream_unref(&input);
 
-	input = i_stream_create_from_data(test_msg, TEST_MSG_LEN);
-	input->blocking = FALSE;
-	input->real_stream->read = test_read;
+	input = test_istream_create(test_msg);
 
 	parser = message_parser_init(pool, input, 0, 0);
 	for (i = 1; i <= TEST_MSG_LEN; i++) {
@@ -254,6 +244,59 @@ static void test_message_parser(void)
 	test_out("message_parser()", success);
 }
 
+static void filter_callback(struct message_header_line *hdr,
+			    bool *matched, void *context ATTR_UNUSED)
+{
+	if (hdr != NULL && hdr->name_offset == 0) {
+		/* drop first header */
+		*matched = TRUE;
+	}
+}
+
+static void test_istream_filter(void)
+{
+	static const char *exclude_headers[] = { "To", NULL };
+	const char *input = "From: foo\nFrom: abc\nTo: bar\n\nhello world\n";
+	const char *output = "From: abc\n\nhello world\n";
+	struct istream *istream, *filter;
+	unsigned int i, input_len = strlen(input);
+	unsigned int output_len = strlen(output);
+	const unsigned char *data;
+	size_t size;
+	ssize_t ret;
+	bool success = TRUE;
+
+	istream = test_istream_create(input);
+	filter = i_stream_create_header_filter(istream,
+					       HEADER_FILTER_EXCLUDE |
+					       HEADER_FILTER_NO_CR,
+					       exclude_headers, 1,
+					       filter_callback, NULL);
+	for (i = 1; i <= input_len; i++) {
+		istream->real_stream->pos = i;
+		ret = i_stream_read(filter);
+		if (ret < 0) {
+			success = FALSE;
+			break;
+		}
+	}
+	data = i_stream_get_data(filter, &size);
+	if (size != output_len || memcmp(data, output, size) != 0)
+		success = FALSE;
+
+	i_stream_skip(filter, size);
+	i_stream_seek(filter, 0);
+	while ((ret = i_stream_read(filter)) > 0) ;
+	data = i_stream_get_data(filter, &size);
+	if (size != output_len || memcmp(data, output, size) != 0)
+		success = FALSE;
+
+	i_stream_unref(&filter);
+	i_stream_unref(&istream);
+
+	test_out("i_stream_create_header_filter()", success);
+}
+
 int main(void)
 {
 	test_init();
@@ -261,5 +304,6 @@ int main(void)
 	test_message_address();
 	test_message_date_parse();
 	test_message_parser();
+	test_istream_filter();
 	return test_deinit();
 }


More information about the dovecot-cvs mailing list