From 14b9848638fdc3856f5f305e9c0a0625ee344fc4 Mon Sep 17 00:00:00 2001 From: Davin McCall Date: Tue, 20 Feb 2018 18:59:41 +0000 Subject: [PATCH] Add another test and a fix to make it pass. --- src/service.cc | 3 +++ src/tests/tests.cc | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/service.cc b/src/service.cc index aa4f0c0..1abe899 100644 --- a/src/service.cc +++ b/src/service.cc @@ -115,6 +115,9 @@ void service_record::require() noexcept prop_require = !prop_release; prop_release = false; services->add_prop_queue(this); + if (service_state != service_state_t::STARTING && service_state != service_state_t::STARTED) { + prop_start = true; + } } } diff --git a/src/tests/tests.cc b/src/tests/tests.cc index 9e049e0..4f04157 100644 --- a/src/tests/tests.cc +++ b/src/tests/tests.cc @@ -223,11 +223,53 @@ void test_pin1() 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); @@ -401,6 +443,7 @@ int main(int argc, char **argv) RUN_TEST(test5); RUN_TEST(test_pin1); RUN_TEST(test_pin2); + RUN_TEST(test_pin3); RUN_TEST(test7); RUN_TEST(test8); RUN_TEST(test9); -- 2.25.1