]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/signals.cc
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/ceph_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 ceph_abort_msg("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();