diff --git a/src/testsuite/cmd-test-result.c b/src/testsuite/cmd-test-result.c index 385dcd0833a9708c9eeaa794f9f5e93821ea6b8e..230aa62a5fe1bf8782f38fd4864c6c90a1e191ec 100644 --- a/src/testsuite/cmd-test-result.c +++ b/src/testsuite/cmd-test-result.c @@ -14,6 +14,7 @@ #include "testsuite-common.h" #include "testsuite-result.h" +#include "testsuite-message.h" #include "testsuite-smtp.h" /* diff --git a/src/testsuite/testsuite-message.c b/src/testsuite/testsuite-message.c index c0105a2d69c2d7bb293f66d55d01ef329aca8bc4..68e20ebe678d96de715c486c263ed5d7a4aec0df 100644 --- a/src/testsuite/testsuite-message.c +++ b/src/testsuite/testsuite-message.c @@ -8,6 +8,7 @@ #include "message-address.h" #include "mail-storage.h" #include "master-service.h" +#include "mail-raw.h" #include "sieve-common.h" #include "sieve-address.h" @@ -24,10 +25,16 @@ * Testsuite message environment */ +struct testsuite_message { + struct testsuite_message *next; + + struct mail_raw *mail_raw; +}; + struct sieve_message_data testsuite_msgdata; static struct smtp_params_rcpt testsuite_rcpt_params; -static struct mail *testsuite_mail; +static struct testsuite_message *testsuite_msg; static const char *_default_message_data = "From: sender@example.com\n" @@ -123,6 +130,68 @@ static void testsuite_message_set_data(struct mail *mail) testsuite_msgdata.envelope.rcpt_params = &testsuite_rcpt_params; } +static struct testsuite_message *testsuite_message_new(void) +{ + struct testsuite_message *msg; + + msg = i_new(struct testsuite_message, 1); + msg->next = testsuite_msg; + testsuite_msg = msg; + + return msg; +} + +static void testsuite_message_new_string(string_t *mail_str) +{ + struct mail_user *mail_raw_user = + sieve_tool_get_mail_raw_user(sieve_tool); + struct testsuite_message *msg; + + msg = testsuite_message_new(); + msg->mail_raw = mail_raw_open_data(mail_raw_user, mail_str); + + testsuite_message_set_data(msg->mail_raw->mail); +} + +static void testsuite_message_new_file(const char *mail_path) +{ + struct mail_user *mail_raw_user = + sieve_tool_get_mail_raw_user(sieve_tool); + struct testsuite_message *msg; + + msg = testsuite_message_new(); + msg->mail_raw = mail_raw_open_file(mail_raw_user, mail_path); + + testsuite_message_set_data(msg->mail_raw->mail); +} + +static void testsuite_message_free(bool all) +{ + struct testsuite_message *msg; + + if (testsuite_msg == NULL) + return; + + msg = (all ? testsuite_msg : testsuite_msg->next); + while (msg != NULL) { + struct testsuite_message *msg_next = msg->next; + + mail_raw_close(&msg->mail_raw); + i_free(msg); + + msg = msg_next; + } + if (all) + testsuite_msg = NULL; + else + testsuite_msg->next = NULL; +} + +void testsuite_message_flush(void) +{ + testsuite_message_free(FALSE); +} + void testsuite_message_init(void) { testsuite_msg_pool = pool_alloconly_create("testsuite_message", 6096); @@ -130,9 +199,7 @@ void testsuite_message_init(void) string_t *default_message = str_new(testsuite_msg_pool, 1024); str_append(default_message, _default_message_data); - testsuite_mail = - sieve_tool_open_data_as_mail(sieve_tool, default_message); - testsuite_message_set_data(testsuite_mail); + testsuite_message_new_string(default_message); } void testsuite_message_set_string(const struct sieve_runtime_env *renv, @@ -140,8 +207,7 @@ void testsuite_message_set_string(const struct sieve_runtime_env *renv, { sieve_message_context_reset(renv->msgctx); - testsuite_mail = sieve_tool_open_data_as_mail(sieve_tool, message); - testsuite_message_set_data(testsuite_mail); + testsuite_message_new_string(message); } void testsuite_message_set_file(const struct sieve_runtime_env *renv, @@ -149,8 +215,7 @@ void testsuite_message_set_file(const struct sieve_runtime_env *renv, { sieve_message_context_reset(renv->msgctx); - testsuite_mail = sieve_tool_open_file_as_mail(sieve_tool, file_path); - testsuite_message_set_data(testsuite_mail); + testsuite_message_new_file(file_path); } void testsuite_message_set_mail(const struct sieve_runtime_env *renv, @@ -163,6 +228,8 @@ void testsuite_message_set_mail(const struct sieve_runtime_env *renv, void testsuite_message_deinit(void) { + testsuite_message_free(TRUE); + i_free(testsuite_env_mail_from); i_free(testsuite_env_rcpt_to); i_free(testsuite_env_orig_rcpt_to); diff --git a/src/testsuite/testsuite-message.h b/src/testsuite/testsuite-message.h index 6c8a40034cdfd5ec3d002bf96c2cd67f8eba6554..2a4d3b47c7f80e43a2409a0709909da1d39e7836 100644 --- a/src/testsuite/testsuite-message.h +++ b/src/testsuite/testsuite-message.h @@ -12,6 +12,8 @@ extern struct sieve_message_data testsuite_msgdata; void testsuite_message_init(void); void testsuite_message_deinit(void); +void testsuite_message_flush(void); + void testsuite_message_set_string(const struct sieve_runtime_env *renv, string_t *message); void testsuite_message_set_file(const struct sieve_runtime_env *renv, diff --git a/src/testsuite/testsuite-result.c b/src/testsuite/testsuite-result.c index f1259cafa493247489df217378c2e30e7a68bbdb..b4e3a681011d176ca65f5673b388fe1ed315f432 100644 --- a/src/testsuite/testsuite-result.c +++ b/src/testsuite/testsuite-result.c @@ -54,6 +54,7 @@ void testsuite_result_reset(const struct sieve_runtime_env *renv) pool_unref(&testsuite_execute_pool); } + testsuite_message_flush(); i_zero(testsuite_execute_env.exec_status); testsuite_execute_pool = pool_alloconly_create("sieve execution", 4096); diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index 9552e71195f019ae33804e23822be80d447f3fd4..4cd4ba7228c92d1e15ef673f383f606946b2f11b 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -227,9 +227,9 @@ int main(int argc, char **argv) sieve_close(&sbin); /* De-initialize message environment */ + testsuite_result_deinit(); testsuite_message_deinit(); testsuite_mailstore_deinit(); - testsuite_result_deinit(); if (trace_log != NULL) sieve_trace_log_free(&trace_log);