assert(s1->get_state() == service_state_t::STOPPED);
}
-// Test that service pinned started is released when stop issued and stops when unpinned
+// Test that STOPPING dependency of pinned service returns to STARTED when the pinned service has
+// a start issued.
void test_pin2()
{
service_set sset;
+ service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {});
+ service_record *s2 = new service_record(&sset, "test-service-2", service_type_t::INTERNAL, {{s1, REG}});
+ service_record *s3 = new service_record(&sset, "test-service-3", service_type_t::INTERNAL, {{s2, REG}});
+ s2->set_auto_restart(true);
+ sset.add_service(s1);
+ sset.add_service(s2);
+ sset.add_service(s3);
+
+ // Pin s3:
+ s3->pin_start();
+
+ // Start all three services:
+ sset.start_service(s3);
+
+ assert(s3->get_state() == service_state_t::STARTED);
+ assert(s2->get_state() == service_state_t::STARTED);
+ assert(s1->get_state() == service_state_t::STARTED);
+
+ // Issue stop to s3:
+ s3->stop(true);
+ sset.process_queues();
+
+ // s3 should remain started due to pin, but s1 and s2 are released and go STOPPING:
+ assert(s3->get_state() == service_state_t::STARTED);
+ assert(s2->get_state() == service_state_t::STOPPING);
+ assert(s1->get_state() == service_state_t::STOPPING);
+
+ // If we now issue start, STOPPING should revert to STARTED:
+ s3->start(true);
+ sset.process_queues();
+
+ assert(s3->get_state() == service_state_t::STARTED);
+ assert(s2->get_state() == service_state_t::STARTED);
+ assert(s1->get_state() == service_state_t::STARTED);
+}
+
+// Test that service pinned started is released when stop issued and stops when unpinned
+void test_pin3()
+{
+ service_set sset;
+
service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {});
sset.add_service(s1);
RUN_TEST(test5);
RUN_TEST(test_pin1);
RUN_TEST(test_pin2);
+ RUN_TEST(test_pin3);
RUN_TEST(test7);
RUN_TEST(test8);
RUN_TEST(test9);