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