Add process service stop timeout test.
authorDavin McCall <davmac@davmac.org>
Tue, 16 Jan 2018 09:13:33 +0000 (09:13 +0000)
committerDavin McCall <davmac@davmac.org>
Tue, 16 Jan 2018 09:13:33 +0000 (09:13 +0000)
src/tests/proctests.cc
src/tests/test-bpsys.cc
src/tests/test-includes/baseproc-sys.h

index 7dc4cb3a5ddc1a602ee7acf213cb8eea6eca4629..f193dbed9eec068bdd27ac34dd63cea190a633b0 100644 (file)
@@ -18,6 +18,7 @@ class base_process_service_test
     public:
     static void exec_succeeded(base_process_service *bsp)
     {
+        bsp->waiting_for_execstat = false;
         bsp->exec_succeeded();
     }
 
@@ -27,6 +28,11 @@ class base_process_service_test
     }
 };
 
+namespace bp_sys {
+    // last signal sent:
+    extern int last_sig_sent;
+}
+
 // Regular service start
 void test_proc_service_start()
 {
@@ -139,6 +145,48 @@ void test_proc_start_timeout()
     assert(p.get_state() == service_state_t::STOPPED);
 }
 
+// Test stop timeout
+void test_proc_stop_timeout()
+{
+    using namespace std;
+
+    service_set sset;
+
+    string command = "test-command";
+    list<pair<unsigned,unsigned>> command_offsets;
+    command_offsets.emplace_back(0, command.length());
+    std::list<prelim_dep> depends;
+
+    process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
+    p.start(true);
+    sset.process_queues();
+
+    assert(p.get_state() == service_state_t::STARTING);
+
+    base_process_service_test::exec_succeeded(&p);
+    sset.process_queues();
+
+    assert(p.get_state() == service_state_t::STARTED);
+
+    p.stop(true);
+    sset.process_queues();
+
+    assert(p.get_state() == service_state_t::STOPPING);
+    assert(bp_sys::last_sig_sent == SIGTERM);
+
+    p.timer_expired();
+    sset.process_queues();
+
+    // kill signal (SIGKILL) should have been sent; process not dead until it's dead, however
+    assert(p.get_state() == service_state_t::STOPPING);
+    assert(bp_sys::last_sig_sent == SIGKILL);
+
+    base_process_service_test::handle_exit(&p, 0);
+    sset.process_queues();
+
+    assert(p.get_state() == service_state_t::STOPPED);
+}
+
 // Smooth recovery
 void test_proc_smooth_recovery()
 {
@@ -180,5 +228,6 @@ int main(int argc, char **argv)
     RUN_TEST(test_proc_unexpected_term, " ");
     RUN_TEST(test_term_via_stop, "        ");
     RUN_TEST(test_proc_start_timeout, "   ");
+    RUN_TEST(test_proc_stop_timeout, "    ");
     RUN_TEST(test_proc_smooth_recovery, " ");
 }
index a244f8ca8730624764d9c5d3541f35b0c3767ae7..a117d3ae0fa45a18900e8117dee5d2fec21697de 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "baseproc-sys.h"
 
-std::vector<bool> usedfds = {true, true, true};
+static std::vector<bool> usedfds = {true, true, true};
 
 // Allocate a file descriptor
 static int allocfd()
@@ -22,6 +22,8 @@ static int allocfd()
 
 namespace bp_sys {
 
+int last_sig_sent = -1; // last signal number sent, accessible for tests.
+
 int pipe2(int fds[2], int flags)
 {
     fds[0] = allocfd();
@@ -37,4 +39,10 @@ int close(int fd)
     return 0;
 }
 
+int kill(pid_t pid, int sig)
+{
+    last_sig_sent = sig;
+    return 0;
+}
+
 }
index 5df5b7e982cec10e9d043cf9cf5807632a600e0c..638b7c2f06b291f2d74bfca6e78add2366c6c913 100644 (file)
@@ -7,6 +7,7 @@ namespace bp_sys {
 
 int pipe2(int pipefd[2], int flags);
 int close(int fd);
+int kill(pid_t pid, int sig);
 
 inline int fcntl(int fd, int cmd, ...)
 {
@@ -14,12 +15,6 @@ inline int fcntl(int fd, int cmd, ...)
     return 0;
 }
 
-inline int kill(pid_t pid, int sig)
-{
-    // No proper mock implemented yet, just return success for now:
-    return 0;
-}
-
 inline pid_t getpgid(pid_t pid)
 {
     return pid;