Add iomux signal test
This commit is contained in:
@@ -1,41 +0,0 @@
|
|||||||
#include "ucore/iomux_signal.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
void sig_handler(struct IOMux *mux, int signo, void *cookie)
|
|
||||||
{
|
|
||||||
char sig_str[64];
|
|
||||||
snprintf(sig_str, sizeof sig_str, "Got signal %d\n", signo);
|
|
||||||
|
|
||||||
write(STDOUT_FILENO, sig_str, strlen(sig_str));
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
|
|
||||||
struct IOMux *mux = iomux_create(IOMUX_TYPE_EPOLL);
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = iomux_register_unixsignal(mux, SIGKILL, sig_handler, NULL);
|
|
||||||
assert(rc != 0);
|
|
||||||
rc = iomux_register_unixsignal(mux, SIGUSR1, sig_handler, NULL);
|
|
||||||
assert(rc == 0);
|
|
||||||
rc = iomux_unregister_unixsignal(mux, SIGINT);
|
|
||||||
assert(rc == 0);
|
|
||||||
rc = iomux_unregister_unixsignal(mux, SIGUSR1);
|
|
||||||
assert(rc == 0);
|
|
||||||
rc = iomux_register_unixsignal(mux, SIGINT, sig_handler, NULL);
|
|
||||||
assert(rc == 0);
|
|
||||||
rc = iomux_register_unixsignal(mux, SIGUSR1, sig_handler, NULL);
|
|
||||||
assert(rc == 0);
|
|
||||||
rc = iomux_register_unixsignal(mux, SIGUSR1, sig_handler, NULL);
|
|
||||||
assert(rc != 0);
|
|
||||||
|
|
||||||
iomux_run(mux);
|
|
||||||
iomux_delete(mux);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
#include <check.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "ucore/iomux_signal.h"
|
||||||
|
|
||||||
|
|
||||||
|
static enum IOMUX_TYPE g_iomux_type = IOMUX_TYPE_DEFAULT;
|
||||||
|
static int g_usr1_seen;
|
||||||
|
static int g_usr2_seen;
|
||||||
|
static void set_iomux_type_select(void)
|
||||||
|
{
|
||||||
|
g_iomux_type = IOMUX_TYPE_SELECT;
|
||||||
|
g_usr2_seen = g_usr1_seen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_iomux_type_epoll(void)
|
||||||
|
{
|
||||||
|
g_iomux_type = IOMUX_TYPE_EPOLL;
|
||||||
|
g_usr2_seen = g_usr1_seen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void usr1_handler(struct IOMux *mux, int signo, void *cookie)
|
||||||
|
{
|
||||||
|
ck_assert_int_eq(signo, SIGUSR1);
|
||||||
|
g_usr1_seen++;
|
||||||
|
raise(SIGUSR2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usr2_handler(struct IOMux *mux, int signo, void *cookie)
|
||||||
|
{
|
||||||
|
int *val = cookie;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
ck_assert_int_eq(signo, SIGUSR2);
|
||||||
|
ck_assert_int_eq(*val, 0x1234);
|
||||||
|
g_usr2_seen++;
|
||||||
|
|
||||||
|
rc = iomux_unregister_unixsignal(mux, SIGUSR2);
|
||||||
|
ck_assert_int_eq(rc, 0);
|
||||||
|
|
||||||
|
rc = iomux_unregister_unixsignal(mux, SIGUSR1);
|
||||||
|
ck_assert_int_eq(rc, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
START_TEST (test_iomux_signal_simple)
|
||||||
|
|
||||||
|
|
||||||
|
struct IOMux *mux = iomux_create(g_iomux_type);
|
||||||
|
int rc;
|
||||||
|
int cookie = 0x1234;
|
||||||
|
|
||||||
|
//can't handle SIGKILL
|
||||||
|
rc = iomux_register_unixsignal(mux, SIGKILL, usr1_handler, NULL);
|
||||||
|
ck_assert_int_ne(rc, 0);
|
||||||
|
|
||||||
|
rc = iomux_register_unixsignal(mux, SIGUSR1, usr1_handler, NULL);
|
||||||
|
ck_assert_int_eq(rc, 0);
|
||||||
|
|
||||||
|
//not priorly registred
|
||||||
|
rc = iomux_unregister_unixsignal(mux, SIGINT);
|
||||||
|
ck_assert_int_ne(rc, 0);
|
||||||
|
|
||||||
|
rc = iomux_unregister_unixsignal(mux, SIGUSR1);
|
||||||
|
ck_assert_int_eq(rc, 0);
|
||||||
|
|
||||||
|
rc = iomux_register_unixsignal(mux, SIGUSR1, usr1_handler, NULL);
|
||||||
|
ck_assert_int_eq(rc, 0);
|
||||||
|
|
||||||
|
rc = iomux_register_unixsignal(mux, SIGUSR2, usr2_handler, &cookie);
|
||||||
|
ck_assert_int_eq(rc, 0);
|
||||||
|
|
||||||
|
//already registred
|
||||||
|
rc = iomux_register_unixsignal(mux, SIGUSR1, usr1_handler, NULL);
|
||||||
|
ck_assert_int_ne(rc, 0);
|
||||||
|
|
||||||
|
raise(SIGUSR1);
|
||||||
|
iomux_run(mux);
|
||||||
|
|
||||||
|
|
||||||
|
iomux_delete(mux);
|
||||||
|
|
||||||
|
ck_assert_int_eq(g_usr1_seen, 1);
|
||||||
|
ck_assert_int_eq(g_usr2_seen, 1);
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
|
||||||
|
Suite *iomux_signal_suite(void)
|
||||||
|
{
|
||||||
|
Suite *s = suite_create("iomux_signal");
|
||||||
|
TCase *select_tc = tcase_create("iomux signal select tests");
|
||||||
|
TCase *epoll_tc = tcase_create("iomux signal epoll tests");
|
||||||
|
|
||||||
|
tcase_add_test(select_tc, test_iomux_signal_simple);
|
||||||
|
tcase_add_test(epoll_tc, test_iomux_signal_simple);
|
||||||
|
|
||||||
|
tcase_add_checked_fixture(select_tc, set_iomux_type_select, NULL);
|
||||||
|
|
||||||
|
tcase_add_checked_fixture(epoll_tc, set_iomux_type_epoll, NULL);
|
||||||
|
|
||||||
|
suite_add_tcase(s, select_tc);
|
||||||
|
suite_add_tcase(s, epoll_tc);
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
+4
-1
@@ -33,6 +33,7 @@ extern Suite *val_str_suite(void);
|
|||||||
extern Suite *ticket_lock_suite(void);
|
extern Suite *ticket_lock_suite(void);
|
||||||
extern Suite *restart_counter_suite(void);
|
extern Suite *restart_counter_suite(void);
|
||||||
extern Suite *iomux_suite(void);
|
extern Suite *iomux_suite(void);
|
||||||
|
extern Suite *iomux_signal_suite(void);
|
||||||
|
|
||||||
static suite_func suites[] = {
|
static suite_func suites[] = {
|
||||||
bitvec_suite,
|
bitvec_suite,
|
||||||
@@ -60,7 +61,9 @@ static suite_func suites[] = {
|
|||||||
val_str_suite,
|
val_str_suite,
|
||||||
ticket_lock_suite,
|
ticket_lock_suite,
|
||||||
restart_counter_suite,
|
restart_counter_suite,
|
||||||
iomux_suite
|
iomux_suite,
|
||||||
|
iomux_signal_suite
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user