process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
init_service_defaults(p);
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
assert(p.get_state() == service_state_t::STARTED);
assert(event_loop.active_timers.size() == 0);
+
+ sset.remove_service(&p);
}
// Unexpected termination
std::list<prelim_dep> depends;
process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
+ init_service_defaults(p);
+ sset.add_service(&p);
+
p.start(true);
sset.process_queues();
assert(p.get_state() == service_state_t::STOPPED);
assert(event_loop.active_timers.size() == 0);
+
+ sset.remove_service(&p);
}
// Termination via stop request
process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
init_service_defaults(p);
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
assert(p.get_state() == service_state_t::STOPPED);
assert(event_loop.active_timers.size() == 0);
+
+ sset.remove_service(&p);
}
// Time-out during start
command_offsets.emplace_back(0, command.length());
std::list<prelim_dep> depends;
- process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
+ process_service p {&sset, "testproc", std::move(command), command_offsets, depends};
init_service_defaults(p);
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
assert(p.get_state() == service_state_t::STOPPED);
assert(event_loop.active_timers.size() == 0);
+
+ sset.remove_service(&p);
+}
+
+// Test that a timeout doesn't stop a "waits for" dependent to fail to start
+void test_proc_start_timeout2()
+{
+ using namespace std;
+
+ service_set sset;
+
+ string command = "test-command";
+ list<pair<unsigned,unsigned>> command_offsets;
+ command_offsets.emplace_back(0, command.length());
+ std::list<prelim_dep> depends;
+
+ process_service p {&sset, "testproc", std::move(command), command_offsets, depends};
+ init_service_defaults(p);
+ sset.add_service(&p);
+
+ service_record ts {&sset, "test-service-1", service_type_t::INTERNAL, {{&p, dependency_type::WAITS_FOR}} };
+
+ ts.start(true);
+ sset.process_queues();
+
+ assert(p.get_state() == service_state_t::STARTING);
+ assert(ts.get_state() == service_state_t::STARTING);
+
+ p.timer_expired();
+ sset.process_queues();
+
+ assert(p.get_state() == service_state_t::STOPPING);
+
+ base_process_service_test::handle_exit(&p, 0);
+ sset.process_queues();
+
+ assert(p.get_state() == service_state_t::STOPPED);
+ assert(ts.get_state() == service_state_t::STARTED);
+ assert(event_loop.active_timers.size() == 0);
+
+ sset.remove_service(&p);
}
// Test stop timeout
process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
init_service_defaults(p);
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
sset.process_queues();
assert(p.get_state() == service_state_t::STOPPED);
+
// Note that timer is still active as we faked its expiry above
//assert(event_loop.active_timers.size() == 0);
event_loop.active_timers.clear();
+ sset.remove_service(&p);
}
// Smooth recovery
process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
init_service_defaults(p);
p.set_smooth_recovery(true);
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
assert(first_instance + 1 == bp_sys::last_forked_pid);
assert(p.get_state() == service_state_t::STARTED);
event_loop.active_timers.clear();
+
+ sset.remove_service(&p);
}
// Smooth recovery without restart delay
init_service_defaults(p);
p.set_smooth_recovery(true);
p.set_restart_delay(time_val(0, 0));
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
assert(first_instance + 1 == bp_sys::last_forked_pid);
assert(p.get_state() == service_state_t::STARTED);
assert(event_loop.active_timers.size() == 0);
+
+ sset.remove_service(&p);
}
// Test stop timeout
scripted_service p = scripted_service(&sset, "testscripted", std::move(command), command_offsets, depends);
init_service_defaults(p);
p.set_stop_command(stopcommand, command_offsets);
+ sset.add_service(&p);
p.start(true);
sset.process_queues();
sset.process_queues();
assert(p.get_state() == service_state_t::STOPPED);
+
event_loop.active_timers.clear();
+ sset.remove_service(&p);
}
RUN_TEST(test_proc_unexpected_term, " ");
RUN_TEST(test_term_via_stop, " ");
RUN_TEST(test_proc_start_timeout, " ");
+ RUN_TEST(test_proc_start_timeout2, " ");
RUN_TEST(test_proc_stop_timeout, " ");
RUN_TEST(test_proc_smooth_recovery1, "");
RUN_TEST(test_proc_smooth_recovery2, "");