From 055ade7b750dc9f037f550505d0cbd757a12b6f5 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sun, 2 Aug 2009 00:58:47 +0200
Subject: [PATCH] Testsuite: added support for testing delivered messages by
 looping these back as the evaluated message. Added tests for the fileinto
 command.

---
 Makefile.am                             |  1 +
 TODO                                    |  4 +-
 src/testsuite/cmd-test-message.c        | 17 ++++-
 src/testsuite/testsuite-mailstore.c     |  2 +-
 tests/execute/mailstore.svtest          | 84 +++++++++++++++++++++++++
 tests/extensions/mailbox/execute.svtest | 32 ++++++++++
 6 files changed, 134 insertions(+), 6 deletions(-)
 create mode 100644 tests/execute/mailstore.svtest

diff --git a/Makefile.am b/Makefile.am
index 3e0005334..6c1b79827 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -37,6 +37,7 @@ test_cases = \
 	tests/execute/errors.svtest \
 	tests/execute/actions.svtest \
 	tests/execute/smtp.svtest \
+	tests/execute/mailstore.svtest \
 	tests/exists.svtest \
 	tests/header.svtest \
 	tests/address.svtest \
diff --git a/TODO b/TODO
index eaa307a86..9e793c3d5 100644
--- a/TODO
+++ b/TODO
@@ -6,9 +6,7 @@ Current activities:
 	- Write manual page
 * Testsuite:
 	- add support for testing binary load/save
-	- add support for testing messages stored into a mailbox by looping these back
-	  as the tested mail message
-	- add execution tests for fileinto and imap4flags extensions.
+	- add execution tests for imap4flags extensions.
 
 Next (in order of descending priority/precedence):
 
diff --git a/src/testsuite/cmd-test-message.c b/src/testsuite/cmd-test-message.c
index c269d0262..4a4d804d4 100644
--- a/src/testsuite/cmd-test-message.c
+++ b/src/testsuite/cmd-test-message.c
@@ -12,6 +12,7 @@
 
 #include "testsuite-common.h"
 #include "testsuite-smtp.h"
+#include "testsuite-mailstore.h"
 
 /*
  * Test_message command
@@ -196,6 +197,9 @@ static bool cmd_test_message_validate_folder_tag
 		(valdtr, cmd, tag, *arg, SAAT_STRING) ) {
 		return FALSE;
 	}
+
+	/* Skip parameter */
+	*arg = sieve_ast_argument_next(*arg);
 			
 	return TRUE;
 }
@@ -346,7 +350,8 @@ static int cmd_test_message_mailbox_operation_execute
 {
 	string_t *folder;
 	sieve_number_t msg_index;
-    unsigned int is_test = -1;
+	unsigned int is_test = -1;
+	bool result;
 
 	/*
 	 * Read operands
@@ -377,7 +382,15 @@ static int cmd_test_message_mailbox_operation_execute
 	sieve_runtime_trace(renv, "TEST_MESSAGE_MAILBOX (%s) \"%s\" [%d]", 
 		( is_test ? "TEST" : "COMMAND" ), str_c(folder), msg_index);
 
-	/* FIXME: to be implemented */
+	result = testsuite_mailstore_mail_index(renv, str_c(folder), msg_index);
+
+	if ( is_test ) {
+		sieve_interpreter_set_test_result(renv->interp, result);
+		return SIEVE_EXEC_OK;
+	}
+
+	if ( !result )
+		testsuite_test_failf("no outgoing SMTP message with index %d", msg_index);
 
 	return SIEVE_EXEC_OK;
 }
diff --git a/src/testsuite/testsuite-mailstore.c b/src/testsuite/testsuite-mailstore.c
index 4882a9f88..91746e5c6 100644
--- a/src/testsuite/testsuite-mailstore.c
+++ b/src/testsuite/testsuite-mailstore.c
@@ -194,7 +194,7 @@ bool testsuite_mailstore_mail_index
 	if ( mail == NULL )
 		return FALSE;
 
-	mail_set_seq(mail, index);
+	mail_set_seq(mail, index+1);
 	testsuite_message_set_mail(renv, mail);
 
 	return TRUE;
diff --git a/tests/execute/mailstore.svtest b/tests/execute/mailstore.svtest
new file mode 100644
index 000000000..5ecdaa883
--- /dev/null
+++ b/tests/execute/mailstore.svtest
@@ -0,0 +1,84 @@
+require "vnd.dovecot.testsuite";
+require "fileinto";
+require "variables";
+require "mailbox";
+
+set "message1" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: First message
+
+Frop
+.
+;
+
+set "message2" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Second message
+
+Frop
+.
+;
+
+set "message3" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Third message
+
+Frop
+.
+;
+
+test "Duplicates" {
+	test_set "message" "${message1}";
+
+	fileinto :create "Folder";
+	fileinto :create "Folder";
+
+	if not test_result_execute {
+		test_fail "failed to execute first result";
+	}
+
+	test_result_reset;
+
+	test_set "message" "${message2}";
+
+	fileinto :create "Folder";
+	fileinto :create "Folder";
+
+	if not test_result_execute {
+		test_fail "failed to execute second result";
+	}
+
+	test_result_reset;
+
+	test_set "message" "${message3}";
+
+	fileinto :create "Folder";
+	fileinto :create "Folder";
+
+	if not test_result_execute {
+		test_fail "failed to execute third result";
+	}
+
+	test_message :folder "Folder" 0;
+	
+	if not header :is "subject" "First message" {
+		test_fail "first message incorrect";
+	}
+
+	test_message :folder "Folder" 1;
+
+	if not header :is "subject" "Second message" {
+		test_fail "first message incorrect";
+	}
+
+	test_message :folder "Folder" 2;
+
+	if not header :is "subject" "Third message" {
+		test_fail "first message incorrect";
+	}
+}
+
+
diff --git a/tests/extensions/mailbox/execute.svtest b/tests/extensions/mailbox/execute.svtest
index 22c0d0f29..6bea19373 100644
--- a/tests/extensions/mailbox/execute.svtest
+++ b/tests/extensions/mailbox/execute.svtest
@@ -36,6 +36,15 @@ test ":Create" {
 		test_fail "mailbox exists already";
 	}
 
+	test_set "message" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Frop 1
+
+Frop!
+.
+	;
+
 	fileinto :create "created";
 
 	if not test_result_execute {
@@ -45,4 +54,27 @@ test ":Create" {
 	if not mailboxexists "created" {
 		test_fail "mailbox somehow not created";
 	}
+
+	test_result_reset;
+
+	test_set "message" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Frop 2
+
+Frop!
+.
+	;
+
+	fileinto "created";
+
+	if not test_result_execute {
+		test_fail "execution of result failed second time";
+	}
+
+	test_message :folder "created" 0;
+
+	if not header :is "subject" "Frop 1" {
+		test_fail "incorrect message read back from mail store";
+	}
 }
-- 
GitLab