Browse Source

Test for correct shutdown ordering

Davin McCall 1 year ago
parent
commit
dde78709b0
1 changed files with 42 additions and 0 deletions
  1. 42 0
      src/tests/tests.cc

+ 42 - 0
src/tests/tests.cc

@@ -459,6 +459,47 @@ void basic_test9()
     assert(sset.count_active_services() == 4);
 }
 
+// Test services stop in reverse dependency order
+void basic_test10()
+{
+    service_set sset;
+
+    test_service *s1 = new test_service(&sset, "test-service-1", service_type_t::INTERNAL, {});
+    test_service *s2 = new test_service(&sset, "test-service-2", service_type_t::INTERNAL, {{s1, REG}});
+    s2->auto_stop = false;
+    sset.add_service(s1);
+    sset.add_service(s2);
+
+    assert(sset.find_service("test-service-1") == s1);
+    assert(sset.find_service("test-service-2") == s2);
+
+    // Start two services:
+    sset.start_service(s2);
+
+    s1->started();
+    sset.process_queues();
+    s2->started();
+    sset.process_queues();
+
+    assert(s2->get_state() == service_state_t::STARTED);
+    assert(s1->get_state() == service_state_t::STARTED);
+
+    // Issue stop (without forced bring down) to both s1 and s2:
+    s1->stop(false);
+    s2->stop(false);
+    sset.process_queues();
+
+    assert(s1->get_state() == service_state_t::STOPPING);
+    assert(s2->get_state() == service_state_t::STOPPING);
+
+    s2->stopped();
+    sset.process_queues();
+
+    assert(s1->get_state() == service_state_t::STOPPED);
+    assert(s2->get_state() == service_state_t::STOPPED);
+    assert(sset.count_active_services() == 0);
+}
+
 // Test that service pinned in start state is not stopped when its dependency stops.
 void test_pin1()
 {
@@ -1827,6 +1868,7 @@ int main(int argc, char **argv)
     RUN_TEST(basic_test7, "               ");
     RUN_TEST(basic_test8, "               ");
     RUN_TEST(basic_test9, "               ");
+    RUN_TEST(basic_test10, "              ");
     RUN_TEST(test_pin1, "                 ");
     RUN_TEST(test_pin2, "                 ");
     RUN_TEST(test_pin3, "                 ");