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