initial code repo
[stor4nfv.git] / src / ceph / src / test / signals.cc
diff --git a/src/ceph/src/test/signals.cc b/src/ceph/src/test/signals.cc
new file mode 100644 (file)
index 0000000..e4b1b17
--- /dev/null
@@ -0,0 +1,158 @@
+#include "common/config.h"
+#include "common/signal.h"
+#include "global/signal_handler.h"
+#include "common/debug.h"
+#include "include/coredumpctl.h"
+
+#include "gtest/gtest.h"
+
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "include/assert.h"
+
+#define dout_context g_ceph_context
+static volatile sig_atomic_t got_sigusr1 = 0;
+
+static void handle_sigusr1(int signo)
+{
+  got_sigusr1 = 1;
+}
+
+TEST(SignalApi, SimpleInstall)
+{
+  install_sighandler(SIGPIPE, handle_sigusr1, 0);
+}
+
+TEST(SignalApi, SimpleInstallAndTest)
+{
+  install_sighandler(SIGPIPE, handle_sigusr1, 0);
+
+  // SIGPIPE starts out blocked
+  int ret = kill(getpid(), SIGPIPE);
+  ASSERT_EQ(ret, 0);
+  ASSERT_EQ(got_sigusr1, 0);
+
+  // handle SIGPIPE
+  sigset_t mask;
+  sigemptyset(&mask);
+  ret = sigsuspend(&mask);
+  if (ret == -1)
+    ret = errno;
+
+  // we should have gotten it
+  ASSERT_EQ(ret, EINTR);
+  ASSERT_EQ(got_sigusr1, 1);
+}
+
+TEST(SignalEffects, ErrnoTest1)
+{
+}
+
+bool usr1 = false;
+bool usr2 = false;
+
+void reset()
+{
+  usr1 = false;
+  usr2 = false;
+}
+
+void testhandler(int signal)
+{
+  switch (signal) {
+  case SIGUSR1:
+    usr1 = true;
+    break;
+  case SIGUSR2:
+    usr2 = true;
+    break;
+  default:
+    assert(0 == "unexpected signal");
+  }
+}
+
+TEST(SignalHandler, Single)
+{
+  reset();
+  init_async_signal_handler();
+  register_async_signal_handler(SIGUSR1, testhandler);
+  ASSERT_TRUE(usr1 == false);
+
+  int ret = kill(getpid(), SIGUSR1);
+  ASSERT_EQ(ret, 0);
+
+  sleep(1);
+  ASSERT_TRUE(usr1 == true);
+
+  unregister_async_signal_handler(SIGUSR1, testhandler);
+  shutdown_async_signal_handler();
+}
+
+TEST(SignalHandler, Multiple)
+{
+  int ret;
+
+  reset();
+  init_async_signal_handler();
+  register_async_signal_handler(SIGUSR1, testhandler);
+  register_async_signal_handler(SIGUSR2, testhandler);
+  ASSERT_TRUE(usr1 == false);
+  ASSERT_TRUE(usr2 == false);
+
+  ret = kill(getpid(), SIGUSR1);
+  ASSERT_EQ(ret, 0);
+  ret = kill(getpid(), SIGUSR2);
+  ASSERT_EQ(ret, 0);
+
+  sleep(1);
+  ASSERT_TRUE(usr1 == true);
+  ASSERT_TRUE(usr2 == true);
+
+  unregister_async_signal_handler(SIGUSR1, testhandler);
+  unregister_async_signal_handler(SIGUSR2, testhandler);
+  shutdown_async_signal_handler();
+}
+
+TEST(SignalHandler, LogInternal)
+{
+  g_ceph_context->_log->inject_segv();
+  {
+    PrCtl unset_dumpable;
+    ASSERT_DEATH(derr << "foo" << dendl, ".*");
+  }
+  g_ceph_context->_log->reset_segv();
+}
+
+
+/*
+TEST(SignalHandler, MultipleBigFd)
+{
+  int ret;
+
+  for (int i = 0; i < 1500; i++)
+    ::open(".", O_RDONLY);
+
+  reset();
+  init_async_signal_handler();
+  register_async_signal_handler(SIGUSR1, testhandler);
+  register_async_signal_handler(SIGUSR2, testhandler);
+  ASSERT_TRUE(usr1 == false);
+  ASSERT_TRUE(usr2 == false);
+
+  ret = kill(getpid(), SIGUSR1);
+  ASSERT_EQ(ret, 0);
+  ret = kill(getpid(), SIGUSR2);
+  ASSERT_EQ(ret, 0);
+
+  sleep(1);
+  ASSERT_TRUE(usr1 == true);
+  ASSERT_TRUE(usr2 == true);
+
+  unregister_async_signal_handler(SIGUSR1, testhandler);
+  unregister_async_signal_handler(SIGUSR2, testhandler);
+  shutdown_async_signal_handler();
+}
+*/