|
@@ -391,6 +391,74 @@ void basic_test8()
|
|
|
assert(sset.count_active_services() == 0);
|
|
|
}
|
|
|
|
|
|
+// A hard dependent service which restarts due to a requested dependency restart should restart,
|
|
|
+// a soft dependent service should be left untouched.
|
|
|
+void basic_test9()
|
|
|
+{
|
|
|
+ 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}});
|
|
|
+ test_service *s3 = new test_service(&sset, "test-service-3", service_type_t::INTERNAL, {{s2, REG}});
|
|
|
+ test_service *s4 = new test_service(&sset, "test-service-4", service_type_t::INTERNAL, {{s1, MS}});
|
|
|
+ sset.add_service(s1);
|
|
|
+ sset.add_service(s2);
|
|
|
+ sset.add_service(s3);
|
|
|
+ sset.add_service(s4);
|
|
|
+
|
|
|
+ assert(sset.find_service("test-service-1") == s1);
|
|
|
+ assert(sset.find_service("test-service-2") == s2);
|
|
|
+ assert(sset.find_service("test-service-3") == s3);
|
|
|
+ assert(sset.find_service("test-service-4") == s4);
|
|
|
+
|
|
|
+ // Start all four services:
|
|
|
+ sset.start_service(s3);
|
|
|
+ sset.start_service(s4);
|
|
|
+
|
|
|
+ s1->started();
|
|
|
+ sset.process_queues();
|
|
|
+ s2->started();
|
|
|
+ sset.process_queues();
|
|
|
+ s3->started();
|
|
|
+ sset.process_queues();
|
|
|
+ s4->started();
|
|
|
+ sset.process_queues();
|
|
|
+
|
|
|
+ assert(s4->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s3->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s2->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s1->get_state() == service_state_t::STARTED);
|
|
|
+
|
|
|
+ // Now restart s1, which should also force s2 and s3 to restart.
|
|
|
+ // s2 (and therefore s1) should restart:
|
|
|
+ s1->restart();
|
|
|
+ sset.process_queues();
|
|
|
+
|
|
|
+ // s4 only has a milestone dependency, and should be left untouched.
|
|
|
+ assert(s4->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s3->get_state() == service_state_t::STARTING);
|
|
|
+ assert(s2->get_state() == service_state_t::STARTING);
|
|
|
+ assert(s1->get_state() == service_state_t::STARTING);
|
|
|
+
|
|
|
+ assert(s4->get_target_state() == service_state_t::STARTED);
|
|
|
+ assert(s3->get_target_state() == service_state_t::STARTED);
|
|
|
+ assert(s2->get_target_state() == service_state_t::STARTED);
|
|
|
+ assert(s1->get_target_state() == service_state_t::STARTED);
|
|
|
+
|
|
|
+ s1->started();
|
|
|
+ sset.process_queues();
|
|
|
+ s2->started();
|
|
|
+ sset.process_queues();
|
|
|
+ s3->started();
|
|
|
+ sset.process_queues();
|
|
|
+
|
|
|
+ assert(s4->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s3->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s2->get_state() == service_state_t::STARTED);
|
|
|
+ assert(s1->get_state() == service_state_t::STARTED);
|
|
|
+ assert(sset.count_active_services() == 4);
|
|
|
+}
|
|
|
+
|
|
|
// Test that service pinned in start state is not stopped when its dependency stops.
|
|
|
void test_pin1()
|
|
|
{
|
|
@@ -1573,6 +1641,7 @@ int main(int argc, char **argv)
|
|
|
RUN_TEST(basic_test6, " ");
|
|
|
RUN_TEST(basic_test7, " ");
|
|
|
RUN_TEST(basic_test8, " ");
|
|
|
+ RUN_TEST(basic_test9, " ");
|
|
|
RUN_TEST(test_pin1, " ");
|
|
|
RUN_TEST(test_pin2, " ");
|
|
|
RUN_TEST(test_pin3, " ");
|