// s3 should remain started due to pin:
assert(s3->get_state() == service_state_t::STARTED);
assert(s2->get_state() == service_state_t::STOPPING);
- assert(s1->get_state() == service_state_t::STOPPING);
+ assert(s1->get_state() == service_state_t::STARTED);
// If we now unpin, s3 should stop:
s3->unpin();
assert(s1->get_state() == service_state_t::STOPPED);
}
-// Test that STOPPING dependency of pinned service returns to STARTED when the pinned service has
-// a start issued.
+// Test that issuing a stop to a pinned-started service does not stop the service or its dependencies.
void test_pin2()
{
service_set sset;
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();
-
+ // s3 should remain started due to pin, s1 and s2 not released:
assert(s3->get_state() == service_state_t::STARTED);
assert(s2->get_state() == service_state_t::STARTED);
assert(s1->get_state() == service_state_t::STARTED);
// 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);
+ assert(s1->get_state() == service_state_t::STARTED);
// If we now issue start, s2 still needs to stop (due to force stop):
s3->start(true);
service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {});
sset.add_service(s1);
- // Pin s3:
+ // Pin s1:
s1->pin_start();
// Start the service:
assert(s1->get_state() == service_state_t::STARTED);
- // Issue stop:
+ // Issue forced stop:
s1->stop(true);
+ s1->forced_stop();
sset.process_queues();
// s3 should remain started:
assert(sset.count_active_services() == 0);
}
+// Tests for "restart" functionality.
+void test13()
+{
+ 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, WAITS}});
+ test_service *s3 = new test_service(&sset, "test-service-3", service_type_t::INTERNAL, {{s2, REG}});
+
+ sset.add_service(s1);
+ sset.add_service(s2);
+ sset.add_service(s3);
+
+ // Start all services via s3
+ sset.start_service(s3);
+ s1->started();
+ sset.process_queues();
+ s2->started();
+ sset.process_queues();
+ s3->started();
+ 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);
+
+ s1->restart();
+ s1->forced_stop();
+ 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::STARTING);
+
+ s1->started();
+ 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);
+}
+
+// Make sure a service only restarts once (i.e. restart flag doesn't get stuck)
+void test14()
+{
+ 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, WAITS}});
+
+ sset.add_service(s1);
+ sset.add_service(s2);
+
+ // Start all services via s3
+ 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);
+
+ s1->restart();
+ s1->forced_stop();
+ sset.process_queues();
+
+ assert(s2->get_state() == service_state_t::STARTED);
+ assert(s1->get_state() == service_state_t::STARTING);
+
+ s1->started();
+ sset.process_queues();
+
+ assert(s2->get_state() == service_state_t::STARTED);
+ assert(s1->get_state() == service_state_t::STARTED);
+
+ // Ok, we restarted s1. Now stop it:
+
+ s1->stop(true);
+ sset.process_queues();
+
+ assert(s2->get_state() == service_state_t::STARTED);
+ assert(s1->get_state() == service_state_t::STOPPED); // didn't restart
+}
+
#define RUN_TEST(name, spacing) \
std::cout << #name "..." spacing << std::flush; \
RUN_TEST(test10, " ");
RUN_TEST(test11, " ");
RUN_TEST(test12, " ");
+ RUN_TEST(test13, " ");
+ RUN_TEST(test14, " ");
}