1 #include "common/config.h"
2 #include "common/signal.h"
3 #include "global/signal_handler.h"
4 #include "common/debug.h"
5 #include "include/coredumpctl.h"
7 #include "gtest/gtest.h"
14 #include "include/assert.h"
16 #define dout_context g_ceph_context
17 static volatile sig_atomic_t got_sigusr1 = 0;
19 static void handle_sigusr1(int signo)
24 TEST(SignalApi, SimpleInstall)
26 install_sighandler(SIGPIPE, handle_sigusr1, 0);
29 TEST(SignalApi, SimpleInstallAndTest)
31 install_sighandler(SIGPIPE, handle_sigusr1, 0);
33 // SIGPIPE starts out blocked
34 int ret = kill(getpid(), SIGPIPE);
36 ASSERT_EQ(got_sigusr1, 0);
41 ret = sigsuspend(&mask);
45 // we should have gotten it
46 ASSERT_EQ(ret, EINTR);
47 ASSERT_EQ(got_sigusr1, 1);
50 TEST(SignalEffects, ErrnoTest1)
63 void testhandler(int signal)
73 assert(0 == "unexpected signal");
77 TEST(SignalHandler, Single)
80 init_async_signal_handler();
81 register_async_signal_handler(SIGUSR1, testhandler);
82 ASSERT_TRUE(usr1 == false);
84 int ret = kill(getpid(), SIGUSR1);
88 ASSERT_TRUE(usr1 == true);
90 unregister_async_signal_handler(SIGUSR1, testhandler);
91 shutdown_async_signal_handler();
94 TEST(SignalHandler, Multiple)
99 init_async_signal_handler();
100 register_async_signal_handler(SIGUSR1, testhandler);
101 register_async_signal_handler(SIGUSR2, testhandler);
102 ASSERT_TRUE(usr1 == false);
103 ASSERT_TRUE(usr2 == false);
105 ret = kill(getpid(), SIGUSR1);
107 ret = kill(getpid(), SIGUSR2);
111 ASSERT_TRUE(usr1 == true);
112 ASSERT_TRUE(usr2 == true);
114 unregister_async_signal_handler(SIGUSR1, testhandler);
115 unregister_async_signal_handler(SIGUSR2, testhandler);
116 shutdown_async_signal_handler();
119 TEST(SignalHandler, LogInternal)
121 g_ceph_context->_log->inject_segv();
123 PrCtl unset_dumpable;
124 ASSERT_DEATH(derr << "foo" << dendl, ".*");
126 g_ceph_context->_log->reset_segv();
131 TEST(SignalHandler, MultipleBigFd)
135 for (int i = 0; i < 1500; i++)
136 ::open(".", O_RDONLY);
139 init_async_signal_handler();
140 register_async_signal_handler(SIGUSR1, testhandler);
141 register_async_signal_handler(SIGUSR2, testhandler);
142 ASSERT_TRUE(usr1 == false);
143 ASSERT_TRUE(usr2 == false);
145 ret = kill(getpid(), SIGUSR1);
147 ret = kill(getpid(), SIGUSR2);
151 ASSERT_TRUE(usr1 == true);
152 ASSERT_TRUE(usr2 == true);
154 unregister_async_signal_handler(SIGUSR1, testhandler);
155 unregister_async_signal_handler(SIGUSR2, testhandler);
156 shutdown_async_signal_handler();