Re-work state propogation/transition logic.
[oweals/dinit.git] / src / tests / tests.cc
index dd1510d5d66c3930bfcc6e2dc2e4b86bc9c9b0f5..a0f45bcfd7aada537f0dbf1d02b180733d3cb521 100644 (file)
@@ -213,7 +213,7 @@ void test_pin1()
     // 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();
@@ -223,8 +223,7 @@ void test_pin1()
     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;
@@ -251,15 +250,7 @@ void test_pin2()
     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);
@@ -297,7 +288,7 @@ void test_pin3()
     // 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);
@@ -323,7 +314,7 @@ void test_pin4()
     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:
@@ -331,8 +322,9 @@ void test_pin4()
 
     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:
@@ -552,6 +544,91 @@ void test12()
     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; \
@@ -575,4 +652,6 @@ int main(int argc, char **argv)
     RUN_TEST(test10, "                    ");
     RUN_TEST(test11, "                    ");
     RUN_TEST(test12, "                    ");
+    RUN_TEST(test13, "                    ");
+    RUN_TEST(test14, "                    ");
 }