summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/testsuite/cmd-test-mailbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/testsuite/cmd-test-mailbox.c')
-rw-r--r--pigeonhole/src/testsuite/cmd-test-mailbox.c261
1 files changed, 261 insertions, 0 deletions
diff --git a/pigeonhole/src/testsuite/cmd-test-mailbox.c b/pigeonhole/src/testsuite/cmd-test-mailbox.c
new file mode 100644
index 0000000..b5d946c
--- /dev/null
+++ b/pigeonhole/src/testsuite/cmd-test-mailbox.c
@@ -0,0 +1,261 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+#include "lib.h"
+#include "str-sanitize.h"
+
+#include "sieve-common.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 "sieve-actions.h"
+
+#include "testsuite-common.h"
+#include "testsuite-mailstore.h"
+
+/*
+ * Commands
+ */
+
+static bool
+cmd_test_mailbox_validate(struct sieve_validator *valdtr,
+ struct sieve_command *cmd);
+static bool
+cmd_test_mailbox_generate(const struct sieve_codegen_env *cgenv,
+ struct sieve_command *ctx);
+
+/* Test_mailbox_create command
+ *
+ * Syntax:
+ * test_mailbox_create <mailbox: string>
+ */
+
+const struct sieve_command_def cmd_test_mailbox_create = {
+ .identifier = "test_mailbox_create",
+ .type = SCT_COMMAND,
+ .positional_args = 1,
+ .subtests = 0,
+ .block_allowed = FALSE,
+ .block_required = FALSE,
+ .validate = cmd_test_mailbox_validate,
+ .generate = cmd_test_mailbox_generate,
+};
+
+/* Test_mailbox_delete command
+ *
+ * Syntax:
+ * test_mailbox_create <mailbox: string>
+ */
+
+const struct sieve_command_def cmd_test_mailbox_delete = {
+ .identifier = "test_mailbox_delete",
+ .type = SCT_COMMAND,
+ .positional_args = 1,
+ .subtests = 0,
+ .block_allowed = FALSE,
+ .block_required = FALSE,
+ .validate = cmd_test_mailbox_validate,
+ .generate = cmd_test_mailbox_generate,
+};
+
+/*
+ * Operations
+ */
+
+static bool
+cmd_test_mailbox_operation_dump(const struct sieve_dumptime_env *denv,
+ sieve_size_t *address);
+static int
+cmd_test_mailbox_operation_execute(const struct sieve_runtime_env *renv,
+ sieve_size_t *address);
+
+/* Test_mailbox_create operation */
+
+const struct sieve_operation_def test_mailbox_create_operation = {
+ .mnemonic = "TEST_MAILBOX_CREATE",
+ .ext_def = &testsuite_extension,
+ .code = TESTSUITE_OPERATION_TEST_MAILBOX_CREATE,
+ .dump = cmd_test_mailbox_operation_dump,
+ .execute = cmd_test_mailbox_operation_execute,
+};
+
+/* Test_mailbox_delete operation */
+
+const struct sieve_operation_def test_mailbox_delete_operation = {
+ .mnemonic = "TEST_MAILBOX_DELETE",
+ .ext_def = &testsuite_extension,
+ .code = TESTSUITE_OPERATION_TEST_MAILBOX_DELETE,
+ .dump = cmd_test_mailbox_operation_dump,
+ .execute = cmd_test_mailbox_operation_execute,
+};
+
+/*
+ * Validation
+ */
+
+static bool
+cmd_test_mailbox_validate(struct sieve_validator *valdtr,
+ struct sieve_command *cmd)
+{
+ struct sieve_ast_argument *arg = cmd->first_positional;
+
+ if (!sieve_validate_positional_argument(valdtr, cmd, arg, "mailbox", 1,
+ SAAT_STRING))
+ return FALSE;
+
+ if ( !sieve_validator_argument_activate(valdtr, cmd, arg, FALSE) )
+ return FALSE;
+
+ /* Check name validity when folder argument is not a variable */
+ if ( sieve_argument_is_string_literal(arg) ) {
+ const char *folder = sieve_ast_argument_strc(arg), *error;
+
+ if ( !sieve_mailbox_check_name(folder, &error) ) {
+ sieve_command_validate_error(
+ valdtr, cmd, "%s command: "
+ "invalid mailbox `%s' specified: %s",
+ sieve_command_identifier(cmd),
+ str_sanitize(folder, 256), error);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/*
+ * Code generation
+ */
+
+static bool
+cmd_test_mailbox_generate(const struct sieve_codegen_env *cgenv,
+ struct sieve_command *cmd)
+{
+ /* Emit operation */
+ if (sieve_command_is(cmd, cmd_test_mailbox_create)) {
+ sieve_operation_emit(cgenv->sblock, cmd->ext,
+ &test_mailbox_create_operation);
+ } else if (sieve_command_is(cmd, cmd_test_mailbox_delete)) {
+ sieve_operation_emit(cgenv->sblock, cmd->ext,
+ &test_mailbox_delete_operation);
+ } else {
+ i_unreached();
+ }
+
+ /* Generate arguments */
+ if (!sieve_generate_arguments(cgenv, cmd, NULL))
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+ * Code dump
+ */
+
+static bool
+cmd_test_mailbox_operation_dump(const struct sieve_dumptime_env *denv,
+ sieve_size_t *address)
+{
+ sieve_code_dumpf(denv, "%s:", sieve_operation_mnemonic(denv->oprtn));
+
+ sieve_code_descend(denv);
+
+ return sieve_opr_string_dump(denv, address, "mailbox");
+}
+
+/*
+ * Intepretation
+ */
+
+static const char *
+cmd_test_mailbox_get_command_name(const struct sieve_operation *oprtn)
+{
+ if (sieve_operation_is(oprtn, test_mailbox_create_operation))
+ return "test_mailbox_create";
+ if (sieve_operation_is(oprtn, test_mailbox_delete_operation))
+ return "test_mailbox_delete";
+
+ i_unreached();
+}
+
+static int
+cmd_test_mailbox_create_execute(const struct sieve_runtime_env *renv,
+ const char *mailbox)
+{
+ if (sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS)) {
+ sieve_runtime_trace(
+ renv, 0,
+ "testsuite/test_mailbox_create command");
+ sieve_runtime_trace_descend(renv);
+ sieve_runtime_trace(
+ renv, 0, "create mailbox `%s'", mailbox);
+ }
+
+ testsuite_mailstore_mailbox_create(renv, mailbox);
+ return SIEVE_EXEC_OK;
+}
+
+static int
+cmd_test_mailbox_delete_execute(const struct sieve_runtime_env *renv,
+ const char *mailbox)
+{
+ if (sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS)) {
+ sieve_runtime_trace(
+ renv, 0,
+ "testsuite/test_mailbox_delete command");
+ sieve_runtime_trace_descend(renv);
+ sieve_runtime_trace(
+ renv, 0, "delete mailbox `%s'", mailbox);
+ }
+
+ /* FIXME: implement */
+ return testsuite_test_failf(
+ renv, "test_mailbox_delete: NOT IMPLEMENTED");
+}
+
+static int
+cmd_test_mailbox_operation_execute(const struct sieve_runtime_env *renv,
+ sieve_size_t *address)
+{
+ const struct sieve_operation *oprtn = renv->oprtn;
+ string_t *mailbox = NULL;
+ const char *error;
+ int ret;
+
+ /*
+ * Read operands
+ */
+
+ /* Mailbox */
+
+ ret = sieve_opr_string_read(renv, address, "mailbox", &mailbox);
+ if (ret <= 0)
+ return ret;
+
+ if (!sieve_mailbox_check_name(str_c(mailbox), &error)) {
+ sieve_runtime_error(
+ renv, NULL, "%s command: "
+ "invalid mailbox `%s' specified: %s",
+ cmd_test_mailbox_get_command_name(oprtn),
+ str_c(mailbox), error);
+ return SIEVE_EXEC_FAILURE;
+ }
+
+ /*
+ * Perform operation
+ */
+
+ if (sieve_operation_is(oprtn, test_mailbox_create_operation))
+ ret = cmd_test_mailbox_create_execute(renv, str_c(mailbox));
+ else if (sieve_operation_is(oprtn, test_mailbox_delete_operation))
+ ret = cmd_test_mailbox_delete_execute(renv, str_c(mailbox));
+ else
+ i_unreached();
+
+ return ret;
+}