#include "smtp-client-connection.h"
#include "smtp-client-transaction.h"
+#include <sys/signal.h>
#include <unistd.h>
#define CLIENT_PROGRESS_TIMEOUT 10
server_ssl_ctx = NULL;
+ test_subprocess_notify_signal_send_parent(SIGUSR1);
ioloop = io_loop_create();
data->server_test(data->index);
io_loop_destroy(&ioloop);
if (debug)
i_debug("PID=%s", my_pid);
+ test_subprocess_notify_signal_send_parent(SIGUSR1);
ioloop = io_loop_create();
dns_test();
io_loop_destroy(&ioloop);
/* Fork server */
fd_listen = fds[i];
+ test_subprocess_notify_signal_reset(SIGUSR1);
test_subprocess_fork(test_run_server, &data, FALSE);
+ test_subprocess_notify_signal_wait(
+ SIGUSR1, TEST_SIGNALS_DEFAULT_TIMEOUT_MS);
i_close_fd(&fd_listen);
}
}
/* Fork DNS service */
fd_listen = fd;
+ test_subprocess_notify_signal_reset(SIGUSR1);
test_subprocess_fork(test_run_dns, dns_test, FALSE);
+ test_subprocess_notify_signal_wait(SIGUSR1,
+ TEST_SIGNALS_DEFAULT_TIMEOUT_MS);
i_close_fd(&fd_listen);
}
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
if (debug)
i_debug("PID=%s", my_pid);
+ test_subprocess_notify_signal_send_parent(SIGUSR1);
ioloop = io_loop_create();
test_server_init(server_set);
io_loop_run(ioloop);
/* Fork server */
test_open_server_fd();
+ test_subprocess_notify_signal_reset(SIGUSR1);
test_subprocess_fork(test_run_server, &data, FALSE);
+ test_subprocess_notify_signal_wait(SIGUSR1, TEST_SIGNALS_DEFAULT_TIMEOUT_MS);
i_close_fd(&fd_listen);
/* Run client */
#include "smtp-reply-parser.h"
#include "smtp-server.h"
+#include <sys/signal.h>
#include <unistd.h>
#define VALGRIND_TIMEOUT_MULTIPLIER (ON_VALGRIND ? 5 : 1)
if (debug)
i_debug("PID=%s", my_pid);
- /* wait a little for server setup */
- i_sleep_msecs(100);
+ test_subprocess_notify_signal_reset(SIGUSR1);
+
+ /* signal server that we started */
+ test_subprocess_notify_signal_send_parent(SIGUSR1);
+
+ /* wait server to be ready */
+ test_subprocess_notify_signal_wait(SIGUSR1, TEST_SIGNALS_DEFAULT_TIMEOUT_MS);
ioloop = io_loop_create();
data->client_test(data->index);
i_zero(&server_callbacks);
server_pending = client_tests_count;
+
+ /* signal clients that server is ready */
+ test_subprocess_notify_signal_all(SIGUSR1);
ioloop = io_loop_create();
server_test(server_set);
io_loop_destroy(&ioloop);
data.client_test = client_test;
/* Fork client */
+ test_subprocess_notify_signal_reset(SIGUSR1);
test_subprocess_fork(test_run_client, &data, FALSE);
-
+ test_subprocess_notify_signal_wait(
+ SIGUSR1, TEST_SIGNALS_DEFAULT_TIMEOUT_MS);
}
/* Run server */
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/signal.h>
#include <fcntl.h>
#define SERVER_KILL_TIMEOUT_SECS 20
if (debug)
i_debug("PID=%s", my_pid);
+ test_subprocess_notify_signal_send_parent(SIGUSR1);
ioloop = io_loop_create();
data->server_test(data->index);
io_loop_destroy(&ioloop);
/* Fork server */
fd_listen = fds[i];
+ test_subprocess_notify_signal_reset(SIGUSR1);
test_subprocess_fork(test_run_server, &data, FALSE);
+ test_subprocess_notify_signal_wait(
+ SIGUSR1, TEST_SIGNALS_DEFAULT_TIMEOUT_MS);
i_close_fd(&fd_listen);
}
}
static struct event *test_subprocess_event = NULL;
static ARRAY(struct test_subprocess *) test_subprocesses = ARRAY_INIT;
static void (*test_subprocess_cleanup_callback)(void) = NULL;
+static void
+test_subprocess_notification_signal(const siginfo_t *si, void *context);
static void
test_subprocess_signal(const siginfo_t *si ATTR_UNUSED,
lib_signals_set_handler(SIGINT,
LIBSIG_FLAG_DELAYED | LIBSIG_FLAG_IOLOOP_AUTOMOVE,
test_subprocess_signal, NULL);
+ lib_signals_set_handler(SIGUSR1, LIBSIG_FLAG_RESTART,
+ test_subprocess_notification_signal, NULL);
ret = func(context);
void test_subprocess_notify_signal_send(int signo, pid_t pid)
{
if (kill(pid, signo) < 0)
- i_fatal("kill(%ld, SIGHUP) failed: %m", (long)pid);
+ i_fatal("kill(%ld, SIG %d) failed: %m", (long)pid, signo);
}
void test_subprocess_notify_signal_send_parent(int signo)
test_subprocess_notify_signal_send(signo, getppid());
}
+void test_subprocess_notify_signal_all(int signo)
+{
+ struct test_subprocess *subprocess;
+ array_foreach_elem(&test_subprocesses, subprocess)
+ test_subprocess_notify_signal_send(signo, subprocess->pid);
+}
+
void test_subprocess_notify_signal_reset(int signo)
{
i_assert(signo >= 0 &&
/* Send a notification signal (SIGHUP) to the given PID */
void test_subprocess_notify_signal_send(int signo, pid_t pid);
-/* Send a notificatino signal to the parent process. */
+/* Send a notification signal to the parent process. */
void test_subprocess_notify_signal_send_parent(int signo);
+/* Send a notification signal to all the subprocesses. */
+void test_subprocess_notify_signal_all(int signo);
/* Reset any previously sent notification signals. */
void test_subprocess_notify_signal_reset(int signo);
/* Wait until a notification signal is sent, or return immediately if it was