Add a new test.
authorDavin McCall <davmac@davmac.org>
Mon, 19 Feb 2018 10:39:24 +0000 (10:39 +0000)
committerDavin McCall <davmac@davmac.org>
Mon, 19 Feb 2018 10:46:14 +0000 (10:46 +0000)
src/service.cc
src/tests/tests.cc

index 1cbd5044911c6514eca84edf0cc9004c768088d5..363f096e76757492f85a9a64136e942199ac26f7 100644 (file)
@@ -445,6 +445,8 @@ void service_record::do_stop() noexcept
 {
     if (pinned_started) return;
 
+    // A service that does actually stop for any reason should have its explicit activation released, unless
+    // it will restart:
     if (start_explicit && ! do_auto_restart()) {
         start_explicit = false;
         release(false);
index 893522f6bfcaffd1ce2642de0d26b0cd3e2576a8..0fa576467e1abf74e35c9741a5bf69990141ec47 100644 (file)
@@ -182,8 +182,8 @@ void test5()
     assert(s1->get_state() == service_state_t::STARTED);
 }
 
-// Test 6: service pinned in start state is not stopped when its dependency stops.
-void test6()
+// Test that service pinned in start state is not stopped when its dependency stops.
+void test_pin1()
 {
     service_set sset;
 
@@ -224,6 +224,35 @@ void test6()
     assert(s1->get_state() == service_state_t::STOPPED);
 }
 
+// Test that service pinned started is released when stop issued and stops when unpinned
+void test_pin2()
+{
+    service_set sset;
+
+    service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {});
+    sset.add_service(s1);
+
+    // Pin s3:
+    s1->pin_start();
+
+    // Start the service:
+    sset.start_service(s1);
+
+    assert(s1->get_state() == service_state_t::STARTED);
+
+    // Issue stop:
+    s1->stop(true);
+    sset.process_queues();
+
+    // s3 should remain started:
+    assert(s1->get_state() == service_state_t::STARTED);
+
+    // If we now unpin, s1 should stop:
+    s1->unpin();
+    sset.process_queues();
+    assert(s1->get_state() == service_state_t::STOPPED);
+}
+
 // Test 7: stopping a soft dependency doesn't cause the dependent to stop.
 void test7()
 {
@@ -371,7 +400,8 @@ int main(int argc, char **argv)
     RUN_TEST(test3);
     RUN_TEST(test4);
     RUN_TEST(test5);
-    RUN_TEST(test6);
+    RUN_TEST(test_pin1);
+    RUN_TEST(test_pin2);
     RUN_TEST(test7);
     RUN_TEST(test8);
     RUN_TEST(test9);