dovecot-1.2-sieve: Testsuite: added support for changing and tes...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sun Jan 3 03:19:46 EET 2010


details:   http://hg.rename-it.nl/dovecot-1.2-sieve/rev/5ba2e2d73892
changeset: 1178:5ba2e2d73892
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Jan 03 02:19:33 2010 +0100
description:
Testsuite: added support for changing and testing an extension's configuration.

diffstat:

 Makefile.am                                                    |    1 +
 src/lib-sieve/plugins/enotify/ext-enotify.c                    |    4 +
 src/lib-sieve/plugins/imap4flags/ext-imapflags.c               |    8 +-
 src/lib-sieve/plugins/include/ext-include.c                    |    8 +-
 src/lib-sieve/plugins/spamvirustest/ext-spamvirustest-common.c |   10 +
 src/lib-sieve/plugins/subaddress/ext-subaddress.c              |    8 +-
 src/lib-sieve/sieve-extensions.c                               |   16 +
 src/lib-sieve/sieve-extensions.h                               |    3 +
 src/testsuite/Makefile.am                                      |    1 +
 src/testsuite/cmd-test-config.c                                |  343 ++++++++++++++
 src/testsuite/ext-testsuite.c                                  |    5 +-
 src/testsuite/testsuite-common.h                               |    5 +
 tests/extensions/subaddress/config.svtest                      |   77 +++
 13 files changed, 483 insertions(+), 6 deletions(-)

diffs (truncated from 636 to 300 lines):

diff -r 5bf4bbe87004 -r 5ba2e2d73892 Makefile.am
--- a/Makefile.am	Sat Jan 02 19:06:03 2010 +0100
+++ b/Makefile.am	Sun Jan 03 02:19:33 2010 +0100
@@ -93,6 +93,7 @@
 	tests/extensions/relational/errors.svtest \
 	tests/extensions/subaddress/basic.svtest \
 	tests/extensions/subaddress/rfc.svtest \
+	tests/extensions/subaddress/config.svtest \
 	tests/extensions/vacation/errors.svtest \
 	tests/extensions/vacation/execute.svtest \
 	tests/extensions/vacation/message.svtest \
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/plugins/enotify/ext-enotify.c
--- a/src/lib-sieve/plugins/enotify/ext-enotify.c	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/plugins/enotify/ext-enotify.c	Sun Jan 03 02:19:33 2010 +0100
@@ -61,6 +61,10 @@
 {
 	struct ext_enotify_context *ectx;
 
+	if ( *context != NULL ) {
+		ext_enotify_unload(ext);
+	}	
+
 	ectx = i_new(struct ext_enotify_context, 1);
 	ectx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
 	*context = (void *) ectx;
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/plugins/imap4flags/ext-imapflags.c
--- a/src/lib-sieve/plugins/imap4flags/ext-imapflags.c	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/plugins/imap4flags/ext-imapflags.c	Sun Jan 03 02:19:33 2010 +0100
@@ -91,9 +91,11 @@
 static bool ext_imapflags_load
 (const struct sieve_extension *ext, void **context)
 {
-	/* Make sure real extension is registered, it is needed by the binary */
-	*context = (void *)	
-		sieve_extension_require(ext->svinst, &imap4flags_extension);
+	if ( *context == NULL ) {	
+		/* Make sure real extension is registered, it is needed by the binary */
+		*context = (void *)	
+			sieve_extension_require(ext->svinst, &imap4flags_extension);
+	}
 
 	return TRUE;
 }
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/plugins/include/ext-include.c
--- a/src/lib-sieve/plugins/include/ext-include.c	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/plugins/include/ext-include.c	Sun Jan 03 02:19:33 2010 +0100
@@ -84,7 +84,13 @@
 static bool ext_include_load
 (const struct sieve_extension *ext, void **context)
 {
-	struct ext_include_context *ctx = i_new(struct ext_include_context, 1);
+	struct ext_include_context *ctx;
+
+	if ( *context != NULL ) {
+		ctx = (struct ext_include_context *) ext->context;
+	} else {
+		ctx =  i_new(struct ext_include_context, 1);
+	}
 
 	/* Extension dependencies */	
 	ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/plugins/spamvirustest/ext-spamvirustest-common.c
--- a/src/lib-sieve/plugins/spamvirustest/ext-spamvirustest-common.c	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/plugins/spamvirustest/ext-spamvirustest-common.c	Sun Jan 03 02:19:33 2010 +0100
@@ -237,6 +237,10 @@
 	const char *ext_name;
 	const char *error;
 
+	if ( *context != NULL ) {
+		ext_spamvirustest_unload(ext);
+	}
+
 	/* FIXME: 
 	 *   Prevent loading of both spamtest and spamtestplus: let these share 
 	 *   contexts.
@@ -326,6 +330,12 @@
 	return TRUE;
 }
 
+void ext_spamvirustest_unload(const struct sieve_extension *ext)
+{
+	/* FIXME */
+}
+
+
 /*
  * Score extraction
  */
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/plugins/subaddress/ext-subaddress.c
--- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c	Sun Jan 03 02:19:33 2010 +0100
@@ -70,7 +70,13 @@
 (const struct sieve_extension *ext, void **context)
 {
 	struct ext_subaddress_config *config;
-	const char *delim = sieve_setting_get(ext->svinst, "sieve_subaddress_sep");
+	const char *delim;
+
+	if ( *context != NULL ) {
+		ext_subaddress_unload(ext);
+	}
+
+	delim = sieve_setting_get(ext->svinst, "sieve_subaddress_sep");
 
 	/* Fallback to Dovecot setting */
 	if ( delim == NULL )
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/sieve-extensions.c
--- a/src/lib-sieve/sieve-extensions.c	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/sieve-extensions.c	Sun Jan 03 02:19:33 2010 +0100
@@ -281,6 +281,22 @@
 	return TRUE;
 }
 
+bool sieve_extension_reload(const struct sieve_extension *ext)
+{
+	struct sieve_extension_registry *ext_reg = ext->svinst->ext_reg;
+	struct sieve_extension *mod_ext;
+	int ext_id = ext->id;
+	
+	/* Let's not just cast the 'const' away */
+	if ( ext_id > 0 && ext_id < (int) array_count(&ext_reg->extensions) ) {
+		mod_ext = array_idx_modifiable(&ext_reg->extensions, ext_id);
+
+		return _sieve_extension_load(mod_ext);
+	}
+
+	return FALSE;
+}
+
 static struct sieve_extension *_sieve_extension_register
 (struct sieve_instance *svinst, const struct sieve_extension_def *extdef, 
 	bool load, bool required)
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/lib-sieve/sieve-extensions.h
--- a/src/lib-sieve/sieve-extensions.h	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/lib-sieve/sieve-extensions.h	Sun Jan 03 02:19:33 2010 +0100
@@ -116,7 +116,10 @@
 		bool load);
 const struct sieve_extension *sieve_extension_require
 	(struct sieve_instance *svinst, const struct sieve_extension_def *extension);
+bool sieve_extension_reload(const struct sieve_extension *ext);
+
 int sieve_extensions_get_count(struct sieve_instance *svinst);
+
 const struct sieve_extension *sieve_extension_get_by_id
 	(struct sieve_instance *svinst, unsigned int ext_id);
 const struct sieve_extension *sieve_extension_get_by_name
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/testsuite/Makefile.am
--- a/src/testsuite/Makefile.am	Sat Jan 02 19:06:03 2010 +0100
+++ b/src/testsuite/Makefile.am	Sun Jan 03 02:19:33 2010 +0100
@@ -28,6 +28,7 @@
 commands = \
 	cmd-test.c \
 	cmd-test-fail.c \
+	cmd-test-config.c \
 	cmd-test-set.c \
 	cmd-test-result-reset.c \
 	cmd-test-result-print.c \
diff -r 5bf4bbe87004 -r 5ba2e2d73892 src/testsuite/cmd-test-config.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/testsuite/cmd-test-config.c	Sun Jan 03 02:19:33 2010 +0100
@@ -0,0 +1,343 @@
+/* Copyright (c) 2002-2010 Dovecot Sieve authors, see the included COPYING file
+ */
+
+#include "sieve-common.h"
+#include "sieve-extensions.h"
+#include "sieve-commands.h"
+#include "sieve-validator.h"
+#include "sieve-generator.h"
+#include "sieve-interpreter.h"
+#include "sieve-code.h"
+#include "sieve-binary.h"
+#include "sieve-dump.h"
+
+#include "testsuite-common.h"
+#include "testsuite-settings.h"
+
+/*
+ * Test_config command
+ *
+ * Syntax:   
+ *   test_config (
+ *     :set <setting: string> <value: string> / 
+ *     :reload [<extension: string>] )
+ */
+
+static bool cmd_test_config_registered
+	(struct sieve_validator *valdtr, const struct sieve_extension *ext,
+		struct sieve_command_registration *cmd_reg);
+static bool cmd_test_config_generate
+	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
+
+const struct sieve_command_def cmd_test_config = { 
+	"test_config", 
+	SCT_COMMAND, 
+	0, 0, FALSE, FALSE,
+	cmd_test_config_registered, 
+	NULL, NULL,
+	cmd_test_config_generate, 
+	NULL 
+};
+
+/* 
+ * Operations
+ */ 
+ 
+/* Test_message_set operation */
+
+static bool cmd_test_config_set_operation_dump
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+static int cmd_test_config_set_operation_execute
+	(const struct sieve_runtime_env *renv, sieve_size_t *address);
+
+const struct sieve_operation_def test_config_set_operation = { 
+	"TEST_CONFIG_SET",
+	&testsuite_extension, 
+	TESTSUITE_OPERATION_TEST_CONFIG_SET,
+	cmd_test_config_set_operation_dump, 
+	cmd_test_config_set_operation_execute 
+};
+
+/* Test_message_mailbox operation */
+
+static bool cmd_test_config_reload_operation_dump
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+static int cmd_test_config_reload_operation_execute
+	(const struct sieve_runtime_env *renv, sieve_size_t *address);
+
+const struct sieve_operation_def test_config_reload_operation = { 
+	"TEST_CONFIG_RELOAD",
+	&testsuite_extension, 
+	TESTSUITE_OPERATION_TEST_CONFIG_RELOAD,
+	cmd_test_config_reload_operation_dump, 
+	cmd_test_config_reload_operation_execute 
+};
+
+/*
+ * Compiler context data
+ */
+
+enum cmd_test_config_action {
+	CONFIG_ACTION_SET,
+	CONFIG_ACTION_RELOAD,
+	CONFIG_ACTION_LAST
+};
+
+const struct sieve_operation_def *test_config_operations[] = {
+	&test_config_set_operation,
+	&test_config_reload_operation
+};
+ 
+struct cmd_test_config_data {
+	enum cmd_test_config_action action;
+};
+
+/* 
+ * Command tags 
+ */
+ 
+static bool tag_action_is_instance_of
+	(struct sieve_validator *valdtr, struct sieve_command *cmd, 
+		const struct sieve_extension *ext, const char *identifier, void **data);
+static bool tag_action_validate
+	(struct sieve_validator *valdtr, struct sieve_ast_argument **arg, 
+		struct sieve_command *cmd);
+static bool tag_action_generate
+	(const struct sieve_codegen_env *cgenv, struct sieve_ast_argument *arg, 
+		struct sieve_command *cmd);
+
+static const struct sieve_argument_def config_action_tag = { 
+	"CONFIG_ACTION",
+	tag_action_is_instance_of,
+	tag_action_validate, 
+	NULL,	NULL,
+	tag_action_generate 
+};
+
+static bool tag_action_is_instance_of
+(struct sieve_validator *valdtr ATTR_UNUSED, struct sieve_command *cmd, 
+	const struct sieve_extension *ext ATTR_UNUSED, const char *identifier, 
+	void **data)
+{
+	enum cmd_test_config_action action = CONFIG_ACTION_LAST; 
+	struct cmd_test_config_data *ctx_data;
+
+	if ( strcmp(identifier, "set") == 0 )
+		action = CONFIG_ACTION_SET;
+	else if ( strcmp(identifier, "reload") == 0 )
+		action = CONFIG_ACTION_RELOAD;
+	else 
+		return FALSE;
+
+	if ( data != NULL ) {
+		ctx_data = p_new
+			(sieve_command_pool(cmd), struct cmd_test_config_data, 1);
+		ctx_data->action = action;
+		*data = (void *) ctx_data;
+  }		
+		
+	return TRUE;


More information about the dovecot-cvs mailing list