Add another test and a fix to make it pass.
authorDavin McCall <davmac@davmac.org>
Tue, 20 Feb 2018 18:59:41 +0000 (18:59 +0000)
committerDavin McCall <davmac@davmac.org>
Tue, 20 Feb 2018 19:01:18 +0000 (19:01 +0000)
src/service.cc
src/tests/tests.cc

index aa4f0c0f2d6467b80e774b4458fc3ab487ee6595..1abe899f9068a66414bb557e992136197640f961 100644 (file)
@@ -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;
+        }
     }
 }
 
index 9e049e0a3c9daf335a6864956d64bf48eefa258d..4f04157060c20fe6adae87184a820bda5793853a 100644 (file)
@@ -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);