From ccf3c957d554a7e8ab029d5f25beee075f504174 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 20 Nov 2014 00:53:41 +0100 Subject: [PATCH] testsuite: Created tests for the Sieve servermetadata extension. --- src/testsuite/cmd-test-imap-metadata.c | 150 ++++++++++++++++++++--- src/testsuite/testsuite-mailstore.c | 1 + tests/extensions/metadata/execute.svtest | 64 +++++++++- 3 files changed, 191 insertions(+), 24 deletions(-) diff --git a/src/testsuite/cmd-test-imap-metadata.c b/src/testsuite/cmd-test-imap-metadata.c index 0868c1dff..71658ad89 100644 --- a/src/testsuite/cmd-test-imap-metadata.c +++ b/src/testsuite/cmd-test-imap-metadata.c @@ -17,6 +17,9 @@ * Commands */ +static bool cmd_test_imap_metadata_registered + (struct sieve_validator *valdtr, const struct sieve_extension *ext, + struct sieve_command_registration *cmd_reg); static bool cmd_test_imap_metadata_validate (struct sieve_validator *valdtr, struct sieve_command *cmd); static bool cmd_test_imap_metadata_generate @@ -32,14 +35,30 @@ static bool cmd_test_imap_metadata_generate const struct sieve_command_def cmd_test_imap_metadata_set = { "test_imap_metadata_set", SCT_COMMAND, - 3, 0, FALSE, FALSE, - NULL, NULL, + 2, 0, FALSE, FALSE, + cmd_test_imap_metadata_registered, + NULL, cmd_test_imap_metadata_validate, NULL, cmd_test_imap_metadata_generate, NULL }; +/* + * Command tags + */ + +static bool cmd_test_imap_metadata_validate_mailbox_tag + (struct sieve_validator *valdtr, struct sieve_ast_argument **arg, + struct sieve_command *cmd); + +static const struct sieve_argument_def test_imap_metadata_mailbox_tag = { + "mailbox", + NULL, + cmd_test_imap_metadata_validate_mailbox_tag, + NULL, NULL, NULL +}; + /* * Operations */ @@ -59,23 +78,61 @@ const struct sieve_operation_def test_imap_metadata_set_operation = { cmd_test_imap_metadata_operation_execute }; +/* Codes for optional arguments */ + +enum cmd_vacation_optional { + OPT_END, + OPT_MAILBOX +}; + /* - * Validation + * Tag validation */ -static bool cmd_test_imap_metadata_validate -(struct sieve_validator *valdtr, struct sieve_command *cmd) +static bool cmd_test_imap_metadata_validate_mailbox_tag +(struct sieve_validator *valdtr, struct sieve_ast_argument **arg, + struct sieve_command *cmd) { - struct sieve_ast_argument *arg = cmd->first_positional; + struct sieve_ast_argument *tag = *arg; - if ( !sieve_validate_positional_argument - (valdtr, cmd, arg, "mailbox", 1, SAAT_STRING) ) - return FALSE; + /* Delete this tag */ + *arg = sieve_ast_arguments_detach(*arg, 1); - if (!sieve_validator_argument_activate(valdtr, cmd, arg, FALSE)) + /* Check syntax: + * :mailbox string + */ + if ( !sieve_validate_tag_parameter + (valdtr, cmd, tag, *arg, NULL, 0, SAAT_STRING, FALSE) ) { return FALSE; + } - arg = sieve_ast_argument_next(arg); + /* Skip parameter */ + *arg = sieve_ast_argument_next(*arg); + return TRUE; +} + +/* + * Command registration + */ + +static bool cmd_test_imap_metadata_registered +(struct sieve_validator *valdtr, const struct sieve_extension *ext, + struct sieve_command_registration *cmd_reg) +{ + sieve_validator_register_tag + (valdtr, cmd_reg, ext, &test_imap_metadata_mailbox_tag, OPT_MAILBOX); + return TRUE; +} + + +/* + * Validation + */ + +static bool cmd_test_imap_metadata_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, "annotation", 2, SAAT_STRING) ) @@ -122,13 +179,36 @@ static bool cmd_test_imap_metadata_generate static bool cmd_test_imap_metadata_operation_dump (const struct sieve_dumptime_env *denv, sieve_size_t *address) { - sieve_code_dumpf(denv, "%s:", sieve_operation_mnemonic(denv->oprtn)); + int opt_code = 0; + sieve_code_dumpf(denv, "%s:", sieve_operation_mnemonic(denv->oprtn)); sieve_code_descend(denv); - return (sieve_opr_string_dump(denv, address, "mailbox") && - sieve_opr_string_dump(denv, address, "annotation") && - sieve_opr_string_dump(denv, address, "value")); + /* Dump optional operands */ + + for (;;) { + int opt; + bool opok = TRUE; + + if ( (opt=sieve_opr_optional_dump(denv, address, &opt_code)) < 0 ) + return FALSE; + + if ( opt == 0 ) break; + + switch ( opt_code ) { + case OPT_MAILBOX: + opok = sieve_opr_string_dump(denv, address, "mailbox"); + break; + default: + return FALSE; + } + + if ( !opok ) return FALSE; + } + + return + ( sieve_opr_string_dump(denv, address, "annotation") && + sieve_opr_string_dump(denv, address, "value") ); } /* @@ -139,6 +219,7 @@ static int cmd_test_imap_metadata_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { const struct sieve_operation *oprtn = renv->oprtn; + int opt_code = 0; string_t *mailbox = NULL, *annotation = NULL, *value = NULL; int ret; @@ -146,9 +227,30 @@ static int cmd_test_imap_metadata_operation_execute * Read operands */ - if ( (ret=sieve_opr_string_read - (renv, address, "mailbox", &mailbox)) <= 0 ) - return ret; + /* Optional operands */ + + for (;;) { + int opt; + + if ( (opt=sieve_opr_optional_read(renv, address, &opt_code)) < 0 ) + return SIEVE_EXEC_BIN_CORRUPT; + + if ( opt == 0 ) break; + + switch ( opt_code ) { + case OPT_MAILBOX: + ret = sieve_opr_string_read(renv, address, "mailbox", &mailbox); + break; + default: + sieve_runtime_trace_error(renv, "unknown optional operand"); + ret = SIEVE_EXEC_BIN_CORRUPT; + } + + if ( ret <= 0 ) return ret; + } + + /* Fixed operands */ + if ( (ret=sieve_opr_string_read (renv, address, "annotation", &annotation)) <= 0 ) return ret; @@ -164,11 +266,19 @@ static int cmd_test_imap_metadata_operation_execute if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "testsuite/test_imap_metadata_set command"); sieve_runtime_trace_descend(renv); - sieve_runtime_trace(renv, 0, "set annotation `%s'", str_c(mailbox)); + if (mailbox == NULL) { + sieve_runtime_trace(renv, 0, + "set server annotation `%s'", str_c(annotation)); + } else { + sieve_runtime_trace(renv, 0, + "set annotation `%s' for mailbox `%s'", + str_c(annotation), str_c(mailbox)); + } } if (testsuite_mailstore_set_imap_metadata - (str_c(mailbox), str_c(annotation), str_c(value)) < 0) + (( mailbox == NULL ? NULL : str_c(mailbox) ), + str_c(annotation), str_c(value)) < 0) return SIEVE_EXEC_FAILURE; } diff --git a/src/testsuite/testsuite-mailstore.c b/src/testsuite/testsuite-mailstore.c index a3dc27961..75b22cdc1 100644 --- a/src/testsuite/testsuite-mailstore.c +++ b/src/testsuite/testsuite-mailstore.c @@ -256,6 +256,7 @@ int testsuite_mailstore_set_imap_metadata box = mailbox_alloc(ns->list, mailbox, 0); imtrans = imap_metadata_transaction_begin(box); } else { + box = NULL; imtrans = imap_metadata_transaction_begin_server (testsuite_mailstore_user); } diff --git a/tests/extensions/metadata/execute.svtest b/tests/extensions/metadata/execute.svtest index 799a730c4..0a218092a 100644 --- a/tests/extensions/metadata/execute.svtest +++ b/tests/extensions/metadata/execute.svtest @@ -1,5 +1,6 @@ require "vnd.dovecot.testsuite"; require "mboxmetadata"; +require "servermetadata"; require "fileinto"; test "MetadataExists - None exist" { @@ -8,8 +9,8 @@ test "MetadataExists - None exist" { } } -test_imap_metadata_set "INBOX" "/private/frop" "FROP!"; -test_imap_metadata_set "INBOX" "/private/friep" "FRIEP!"; +test_imap_metadata_set :mailbox "INBOX" "/private/frop" "FROP!"; +test_imap_metadata_set :mailbox "INBOX" "/private/friep" "FRIEP!"; test "MetadataExists - Not all exist" { if metadataexists "INBOX" @@ -18,8 +19,8 @@ test "MetadataExists - Not all exist" { } } -test_imap_metadata_set "INBOX" "/private/friep" "FRIEP!"; -test_imap_metadata_set "INBOX" "/private/frml" "FRML!"; +test_imap_metadata_set :mailbox "INBOX" "/private/friep" "FRIEP!"; +test_imap_metadata_set :mailbox "INBOX" "/private/frml" "FRML!"; test "MetadataExists - One exists" { if not metadataexists "INBOX" ["/private/frop"] { @@ -56,3 +57,58 @@ test "Metadata" { test_fail "unexpected match for /private/frml"; } } + +test "ServermetadataExists - None exist" { + if servermetadataexists "/private/frop" { + test_fail "servermetadataexists confirms existence of unknown annotation"; + } +} + +test_imap_metadata_set "/private/frop" "FROP!"; +test_imap_metadata_set "/private/friep" "FRIEP!"; + +test "ServermetadataExists - Not all exist" { + if servermetadataexists + ["/private/frop", "/private/friep", "/private/frml"] { + test_fail "metadataexists confirms existence of unknown annotation"; + } +} + +test_imap_metadata_set "/private/friep" "FRIEP!"; +test_imap_metadata_set "/private/frml" "FRML!"; + +test "ServermetadataExists - One exists" { + if not servermetadataexists ["/private/frop"] { + test_fail "servermetadataexists fails to recognize annotation"; + } +} + +test "ServermetadataExists - All exist" { + if not servermetadataexists + ["/private/frop", "/private/friep", "/private/frml"] { + test_fail "metadataexists fails to recognize annotations"; + } +} + +test "Servermetadata" { + if not servermetadata :is "/private/frop" "FROP!" { + test_fail "invalid servermetadata value for /private/frop"; + } + if servermetadata :is "/private/frop" "Hutsefluts" { + test_fail "unexpected match for /private/frop"; + } + + if not servermetadata :is "/private/friep" "FRIEP!" { + test_fail "invalid servermetadata value for /private/friep"; + } + if servermetadata :is "/private/friep" "Hutsefluts" { + test_fail "unexpected match for /private/friep"; + } + + if not servermetadata :is "/private/frml" "FRML!" { + test_fail "invalid servermetadata value for /private/frml"; + } + if servermetadata :is "/private/frml" "Hutsefluts" { + test_fail "unexpected match for /private/frml"; + } +} -- GitLab