master_service_init_finish(master_service);
test_tmp_dir_init();
- test_subprocesses_init(FALSE);
+ test_subprocesses_init();
static void (*const test_functions[])(void) = {
test_imap_client_hibernate,
}
test_init();
+ event_set_forced_debug(test_event, debug);
test_set_cleanup_callback(main_cleanup);
- test_subprocesses_init(debug);
+ test_subprocesses_init();
ret = test_run(test_functions);
}
test_init();
+ event_set_forced_debug(test_event, debug);
test_set_cleanup_callback(main_cleanup);
- test_subprocesses_init(debug);
+ test_subprocesses_init();
ret = test_run(test_functions);
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
};
static bool debug = FALSE;
-static struct event *test_event, *client_event, *server_event;
+static struct event *common_event, *client_event, *server_event;
static bool small_socket_buffers = FALSE;
static const char *failure = NULL;
static struct timeout *to_continue = NULL;
/* Close the directory */
if (closedir(dirp) < 0)
- e_error(test_event, "test files: "
+ e_error(common_event, "test files: "
"failed to close directory %s: %m", path);
}
fd = open(path, O_RDONLY);
if (fd < 0) {
- e_debug(test_event, "test files: open(%s) failed: %m", path);
+ e_debug(common_event, "test files: open(%s) failed: %m", path);
switch (errno) {
case EFAULT:
i_set_failure_prefix("SERVER: ");
- e_debug(test_event, "PID=%s", my_pid);
+ e_debug(common_event, "PID=%s", my_pid);
ioloop_nested = NULL;
ioloop_nested_depth = 0;
test_server_deinit();
io_loop_destroy(&ioloop);
- e_debug(test_event, "Terminated");
+ e_debug(common_event, "Terminated");
i_close_fd(&fd_listen);
test_files_deinit();
i_set_failure_prefix("CLIENT: ");
- e_debug(test_event, "PID=%s", my_pid);
+ e_debug(common_event, "PID=%s", my_pid);
ioloop_nested = NULL;
ioloop_nested_depth = 0;
test_client_deinit();
io_loop_destroy(&ioloop);
- e_debug(test_event, "Terminated");
+ e_debug(common_event, "Terminated");
}
static void
static void main_init(void)
{
ssl_iostream_openssl_init();
- test_event = event_create(NULL);
- client_event = event_create(test_event);
+ common_event = test_event;
+ client_event = event_create(common_event);
event_set_append_log_prefix(client_event, "test client: ");
- server_event = event_create(test_event);
+ server_event = event_create(common_event);
event_set_append_log_prefix(server_event, "test server: ");
- event_set_forced_debug(server_event, debug);
}
static void main_deinit(void)
ssl_iostream_openssl_deinit();
event_unref(&client_event);
event_unref(&server_event);
- event_unref(&test_event);
+ common_event = NULL;
}
int main(int argc, char *argv[])
int ret;
lib_init();
- main_init();
while ((c = getopt(argc, argv, "DS")) > 0) {
switch (c) {
case 'D':
debug = TRUE;
- event_set_forced_debug(test_event, TRUE);
- event_set_forced_debug(client_event, TRUE);
- event_set_forced_debug(server_event, TRUE);
break;
case 'S':
small_socket_buffers = TRUE;
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
+ main_init();
/* listen on localhost */
i_zero(&bind_ip);
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
master_service_init_finish(master_service);
test_init();
+ event_set_forced_debug(test_event, debug);
test_set_cleanup_callback(main_cleanup);
- test_subprocesses_init(debug);
+ test_subprocesses_init();
ret = test_run(test_functions);
*/
/* common */
+static struct event *common_event;
static struct ip_addr bind_ip;
static in_port_t *bind_ports = 0;
static struct ioloop *ioloop;
static bool debug = FALSE;
-static struct event *test_event;
/* server */
+static struct event *server_event, *dns_event;
static struct io *io_listen;
static int fd_listen = -1;
static struct connection_list *server_conn_list;
static void (*test_server_input)(struct server_connection *conn);
/* client */
+static struct event *client_event;
static struct timeout *to_client_progress = NULL;
/*
while ((line = i_stream_read_next_line(conn->conn.input)) != NULL) {
if (str_begins_with(line, "VERSION"))
continue;
- e_debug(test_event, "DNS REQUEST: %s", line);
+ e_debug(dns_event, "DNS REQUEST: %s", line);
if (strcmp(line, "IP\thosta") == 0) {
o_stream_nsend_str(conn->conn.output,
if (lua_isinteger(script->L, -1)) {
ret = lua_tointeger(script->L, -1);
/* not guaranteed to fail, but it will happen often */
- e_debug(test_event, "http_request_post() returned %d", ret);
+ e_debug(client_event, "http_request_post() returned %d", ret);
test_assert(ret == 0);
}
struct dlua_script *script;
const char *error;
- if (event_want_debug(test_event))
+ if (event_want_debug(client_event))
test_expect_errors(4);
if (dlua_script_create_file(
TEST_LUA_SCRIPT_DIR "/test-lua-http-client.lua",
- &script, test_event, &error) < 0)
+ &script, client_event, &error) < 0)
i_fatal("dlua_script_create_file() failed: %s", error);
dlua_dovecot_register(script);
struct dlua_script *script;
const char *error;
- if (event_want_debug(test_event))
+ if (event_want_debug(client_event))
test_expect_errors(4);
if (dlua_script_create_file(
TEST_LUA_SCRIPT_DIR "/test-lua-http-client.lua",
- &script, test_event, &error) < 0)
+ &script, client_event, &error) < 0)
i_fatal("dlua_script_create_file() failed: %s", error);
dlua_dovecot_register(script);
test_begin("bad settings");
- if (event_want_debug(test_event))
+ if (event_want_debug(common_event))
test_expect_errors(4);
if (dlua_script_create_file(
TEST_LUA_SCRIPT_DIR "/test-lua-http-client.lua",
- &script, test_event, &error) < 0)
+ &script, common_event, &error) < 0)
i_fatal("dlua_script_create_file() failed: %s", error);
dlua_dovecot_register(script);
{
int fd = net_listen(&bind_ip, bind_port, 128);
- e_debug(test_event, "server listening on %u", *bind_port);
+ e_debug(common_event, "server listening on %u", *bind_port);
if (fd == -1) {
i_fatal("listen(%s:%u) failed: %m",
net_ip2addr(&bind_ip), *bind_port);
{
i_set_failure_prefix("SERVER[%u]: ", data->index + 1);
- e_debug(test_event, "PID=%s", my_pid);
+ e_debug(server_event, "PID=%s", my_pid);
server_ssl_ctx = NULL;
data->server_test(data->index);
io_loop_destroy(&ioloop);
- e_debug(test_event, "Terminated");
+ e_debug(server_event, "Terminated");
i_close_fd(&fd_listen);
i_free(bind_ports);
- event_unref(&test_event);
main_deinit();
master_service_deinit_forked(&master_service);
return 0;
i_set_failure_prefix("DNS: ");
- e_debug(test_event, "PID=%s", my_pid);
+ e_debug(dns_event, "PID=%s", my_pid);
test_subprocess_notify_signal_send_parent(SIGHUP);
ioloop = io_loop_create();
dns_test();
io_loop_destroy(&ioloop);
- e_debug(test_event, "Terminated");
+ e_debug(dns_event, "Terminated");
i_close_fd(&fd_listen);
i_free(bind_ports);
- event_unref(&test_event);
main_deinit();
master_service_deinit_forked(&master_service);
return 0;
{
i_set_failure_prefix("CLIENT: ");
- e_debug(test_event, "PID=%s", my_pid);
+ e_debug(client_event, "PID=%s", my_pid);
ioloop = io_loop_create();
test_client_run(client_test);
io_loop_destroy(&ioloop);
- e_debug(test_event, "Terminated");
+ e_debug(client_event, "Terminated");
}
static void
static void main_init(void)
{
ssl_iostream_openssl_init();
+
+ common_event = test_event;
+ client_event = event_create(common_event);
+ event_set_append_log_prefix(client_event, "test client: ");
+ server_event = event_create(common_event);
+ event_set_append_log_prefix(server_event, "test server: ");
+ dns_event = event_create(common_event);
+ event_set_append_log_prefix(dns_event, "test dns: ");
}
static void main_deinit(void)
{
ssl_iostream_context_cache_free();
ssl_iostream_openssl_deinit();
+
+ event_unref(&client_event);
+ event_unref(&server_event);
+ event_unref(&dns_event);
+ common_event = NULL;
}
int main(int argc, char *argv[])
if (master_service_settings_read_simple(master_service, &error) < 0)
i_fatal("Error reading configuration: %s", error);
- main_init();
-
master_service_init_finish(master_service);
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
+ main_init();
/* listen on localhost */
i_zero(&bind_ip);
bind_ip.family = AF_INET;
bind_ip.u.ip4.s_addr = htonl(INADDR_LOOPBACK);
- test_event = event_create(NULL);
- event_set_forced_debug(test_event, debug);
-
ret = test_run(test_functions);
- event_unref(&test_event);
-
main_deinit();
master_service_deinit(&master_service);
int ret;
i_set_info_handler(test_fail_callback);
lib_init();
+ test_init_no_event();
ret = run_tests();
lib_deinit();
return ret;
bool finished:1;
};
-struct event *test_event;
-
static void
test_create_channel_binding_data(struct test_sasl_context *tctx, const char *type)
{
}
}
- test_event = event_create(NULL);
+ test_init();
event_set_forced_debug(test_event, debug);
password_schemes_init();
dsasl_clients_init();
dsasl_clients_deinit();
password_schemes_deinit();
- event_unref(&test_event);
lib_signals_deinit();
lib_deinit();
return ret;
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
}
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
master_service_init_finish(master_service);
test_init();
- test_subprocesses_init(debug);
+ event_set_forced_debug(test_event, debug);
+ test_subprocesses_init();
/* listen on localhost */
i_zero(&bind_ip);
#include "message-size.h"
#include "test-mail-storage-common.h"
-static struct event *test_event;
-
static int
test_mail_save_trans(struct mailbox_transaction_context *trans,
struct istream *input)
MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME,
&argc, &argv, "");
- test_event = event_create(NULL);
if (null_strcmp(argv[1], "-D") == 0)
event_set_forced_debug(test_event, TRUE);
ret = test_run(tests);
- event_unref(&test_event);
master_service_deinit(&master_service);
return ret;
}
#define OUT_NAME_ALIGN 70
+struct event *test_event = NULL;
+
static char *test_prefix;
static bool test_success;
static bool test_running;
test_cleanup();
}
-void test_init(void)
+void test_init_no_event(void)
{
if (test_initialized)
return;
/* Don't set fatal handler until actually needed for fatal testing */
}
+void test_init(void)
+{
+ if (test_initialized)
+ return;
+
+ test_init_no_event();
+ test_event = event_create(NULL);
+ event_set_append_log_prefix(test_event, "test: ");
+}
+
void test_init_signals(void)
{
lib_signals_init();
test_subprocesses_deinit();
+ event_unref(&test_event);
+
if (test_deinit_lib)
lib_deinit();
if (test_deinit_lib_signals)
return failure_count == 0 ? 0 : 1;
}
+void test_forked_deinit(void)
+{
+ event_unref(&test_event);
+}
+
static void test_run_funcs(void (*const test_functions[])(void))
{
unsigned int i;
void test_forked_end(void)
{
+ test_forked_deinit();
+
i_set_error_handler(default_error_handler);
i_set_fatal_handler(default_fatal_handler);
void ATTR_NORETURN
test_exit(int status)
{
+ test_forked_deinit();
+
i_free_and_null(expected_error_str);
i_free_and_null(expected_fatal_str);
i_free_and_null(test_prefix);
# define ON_VALGRIND FALSE
#endif
+extern struct event *test_event;
+
struct istream *test_istream_create(const char *data);
struct istream *test_istream_create_data(const void *data, size_t size);
void test_istream_set_size(struct istream *input, uoff_t size);
ATTR_NULL(3);
void test_init(void);
+void test_init_no_event(void);
+void test_forked_deinit(void);
int test_run(void (*const test_functions[])(void)) ATTR_WARN_UNUSED_RESULT;
struct named_test {
volatile sig_atomic_t test_subprocess_child_mark = 0;
static volatile bool test_subprocess_notification_signal_received[SIGUSR1 + 1];
-static struct event *test_subprocess_event = NULL;
static ARRAY(struct test_subprocess *) test_subprocesses = ARRAY_INIT;
static void
test_subprocess_notification_signal(const siginfo_t *si, void *context);
/* Prevent race condition */
lib_signals_clear_handlers_and_ignore(SIGTERM);
- event_unref(&test_subprocess_event);
+ test_forked_deinit();
lib_signals_deinit();
if (!continue_test) {
WIFEXITED(status) && WEXITSTATUS(status) == 0);
if (WIFEXITED(status)) {
if (WEXITSTATUS(status) != 0) {
- e_warning(test_subprocess_event,
+ e_warning(test_event,
"Sub-process exited with status %d",
WEXITSTATUS(status));
}
} else if (WIFSIGNALED(status)) {
- e_warning(test_subprocess_event,
+ e_warning(test_event,
"Sub-process forcibly terminated with signal %d",
WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
- e_warning(test_subprocess_event,
+ e_warning(test_event,
"Sub-process stopped with signal %d",
WSTOPSIG(status));
} else {
- e_warning(test_subprocess_event,
+ e_warning(test_event,
"Sub-process terminated abnormally with status %d",
status);
}
test_assert(wret > 0 || errno == ECHILD);
if (wret < 0) {
if (errno == EINTR) {
- e_warning(test_subprocess_event,
+ e_warning(test_event,
"Wait for sub-processes timed out");
break;
}
i_assert(subps_left == 0);
break;
}
- e_warning(test_subprocess_event,
+ e_warning(test_event,
"Wait for sub-processes failed: %m");
break;
}
for (i = 0; i < subps_count; i++) {
if (subps[i] == NULL || subps[i]->pid != wret)
continue;
- e_debug(test_subprocess_event,
+ e_debug(test_event,
"Terminated sub-process [%u]", i);
i_free(subps[i]);
subps_left--;
if (subps[i] == NULL || subps[i]->pid == (pid_t)-1)
continue;
- e_debug(test_subprocess_event,
+ e_debug(test_event,
"Terminating sub-process [%u]", i);
if (kill(subps[i]->pid, SIGTERM) < 0) {
- e_error(test_subprocess_event,
+ e_error(test_event,
"Failed to kill sub-process [%u] with SIGTERM: "
"%m", i);
}
for (i = 0; i < subps_count; i++) {
if (subps[i] == NULL || subps[i]->pid == (pid_t)-1)
continue;
- e_warning(test_subprocess_event,
- "Forcibly killed sub-process [%u]", i);
+ e_warning(test_event, "Forcibly killed sub-process [%u]", i);
test_subprocess_kill_forced(subps[i]);
i_assert(subps_left > 0);
i_free(subps[i]);
test_subprocess_notification_signal_received[signo] = TRUE;
}
-void test_subprocesses_init(bool debug)
+void test_subprocesses_init(void)
{
test_init();
test_init_signals();
lib_signals_set_handler(SIGALRM, 0, test_subprocess_alarm, NULL);
i_array_init(&test_subprocesses, 8);
-
- test_subprocess_event = event_create(NULL);
- event_set_forced_debug(test_subprocess_event, debug);
- event_set_append_log_prefix(test_subprocess_event, "test: ");
}
void test_subprocesses_deinit(void)
test_subprocess_cleanup();
test_subprocess_free_all();
array_free(&test_subprocesses);
-
- event_unref(&test_subprocess_event);
}
If the timeout is reached, i_fatal() is called. */
void test_subprocess_notify_signal_wait(int signo, unsigned int timeout_msecs);
-void test_subprocesses_init(bool debug);
+void test_subprocesses_init(void);
#endif