changeset 821:6532414a9cbd

tests: fix various errors
author David Demelier <markand@malikania.fr>
date Fri, 30 Nov 2018 21:57:36 +0100
parents 9109f19987fb
children 5120b9793d1f
files libirccd-daemon/irccd/daemon/server_service.cpp libirccd-test/irccd/test/cli_fixture.cpp libirccd-test/irccd/test/command_fixture.cpp libirccd-test/irccd/test/command_fixture.hpp tests/src/irccdctl/cli-server-info/main.cpp
diffstat 5 files changed, 73 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/libirccd-daemon/irccd/daemon/server_service.cpp	Thu Nov 29 21:28:48 2018 +0100
+++ b/libirccd-daemon/irccd/daemon/server_service.cpp	Fri Nov 30 21:57:36 2018 +0100
@@ -522,11 +522,12 @@
 
 void server_service::disconnect(const std::shared_ptr<server>& server)
 {
-	if (server->get_state() != server::state::disconnected) {
-		server->disconnect();
-		servers_.erase(std::find(servers_.begin(), servers_.end(), server), servers_.end());
-		dispatcher{bot_}(disconnect_event{server});
-	}
+	if (server->get_state() == server::state::disconnected)
+		return;
+
+	server->disconnect();
+	servers_.erase(std::find(servers_.begin(), servers_.end(), server), servers_.end());
+	dispatcher{bot_}(disconnect_event{server});
 }
 
 void server_service::reconnect(const std::shared_ptr<server>& server)
@@ -606,12 +607,7 @@
 
 void server_service::reconnect(std::string_view id)
 {
-	const auto save = get(id);
-
-	if (!save)
-		return;
-
-	reconnect(save);
+	reconnect(require(id));
 }
 
 void server_service::reconnect()
@@ -642,8 +638,8 @@
 void server_service::clear() noexcept
 {
 	/*
-	 * Copy the array, because disconnect() interrupted signals may remove the
-	 * server from the array.
+	 * Copy the array, because disconnect() interrupts signals and may
+	 * remove the server from the array.
 	 */
 	const auto save = servers_;
 
--- a/libirccd-test/irccd/test/cli_fixture.cpp	Thu Nov 29 21:28:48 2018 +0100
+++ b/libirccd-test/irccd/test/cli_fixture.cpp	Fri Nov 30 21:57:36 2018 +0100
@@ -70,7 +70,6 @@
 	bot_.servers().add(server_);
 	bot_.transports().add(std::make_unique<transport_server>(std::move(acceptor)));
 	bot_.plugins().add_loader(std::make_unique<test_plugin_loader>());
-	server_->disconnect();
 	server_->clear();
 }
 
--- a/libirccd-test/irccd/test/command_fixture.cpp	Thu Nov 29 21:28:48 2018 +0100
+++ b/libirccd-test/irccd/test/command_fixture.cpp	Fri Nov 30 21:57:36 2018 +0100
@@ -26,38 +26,70 @@
 #include "command_fixture.hpp"
 
 using boost::asio::ip::tcp;
+using boost::asio::deadline_timer;
+
+using boost::posix_time::seconds;
 
 using irccd::daemon::command;
 using irccd::daemon::transport_server;
 
 namespace irccd::test {
 
-template <typename Condition>
-void command_fixture::wait_for(Condition&& cond)
+auto command_fixture::recv(deadline_timer& timer) -> result
+{
+	result r;
+
+	ctl_->recv([&] (auto code, auto message) {
+		r.first = message;
+		r.second = code;
+	});
+
+	while (!r.first.is_object() && !r.second) {
+		ctx_.poll();
+		ctx_.reset();
+	}
+
+	timer.cancel();
+
+	return r;
+}
+
+auto command_fixture::wait_command(const std::string& cmd) -> result
 {
-	ctx_.reset();
+	result r;
+	deadline_timer timer(bot_.get_service());
+
+	timer.expires_from_now(seconds(30));
+	timer.async_wait([] (auto code) {
+		if (code != boost::asio::error::operation_aborted)
+			throw std::runtime_error("operation timed out");
+	});
+
+	for (;;) {
+		r = recv(timer);
 
-	while (!cond())
+		if (r.second)
+			break;
+		if (r.first.is_object() &&
+		    r.first["command"].is_string() &&
+		    r.first["command"].get<std::string>() == cmd)
+			break;
+
 		ctx_.poll();
+		ctx_.reset();
+	}
+
+	return r;
 }
 
 auto command_fixture::request(nlohmann::json json) -> result
 {
-	result r;
-
-	ctl_->send(std::move(json), [] (auto code) {
+	ctl_->send(json, [] (auto code) {
 		if (code)
 			throw std::system_error(std::move(code));
 	});
-	ctl_->recv([&] (auto code, auto message) {
-		r.first = message;
-		r.second = code;
-	});
-	wait_for([&] {
-		return r.second || r.first.is_object();
-	});
 
-	return r;
+	return wait_command(json["command"].get<std::string>());
 }
 
 command_fixture::command_fixture()
--- a/libirccd-test/irccd/test/command_fixture.hpp	Thu Nov 29 21:28:48 2018 +0100
+++ b/libirccd-test/irccd/test/command_fixture.hpp	Fri Nov 30 21:57:36 2018 +0100
@@ -43,10 +43,6 @@
  * and added to the respective services.
  */
 class command_fixture : public irccd_fixture {
-private:
-	template <typename Condition>
-	void wait_for(Condition&&);
-
 protected:
 	/**
 	 * \brief Result for request function.
@@ -54,6 +50,22 @@
 	using result = std::pair<nlohmann::json, std::error_code>;
 
 	/**
+	 * Block for the next message.
+	 *
+	 * \param timer the timer to cancel on completion
+	 * \return the next message
+	 */
+	auto recv(boost::asio::deadline_timer& timer) -> result;
+
+	/**
+	 * Block for the next command with a maximum timeout.
+	 *
+	 * \return the result
+	 * \throw std::runtime_error after 30 seconds
+	 */
+	auto wait_command(const std::string& cmd) -> result;
+
+	/**
 	 * \brief Irccd controller
 	 */
 	std::unique_ptr<ctl::controller> ctl_;
--- a/tests/src/irccdctl/cli-server-info/main.cpp	Thu Nov 29 21:28:48 2018 +0100
+++ b/tests/src/irccdctl/cli-server-info/main.cpp	Fri Nov 30 21:57:36 2018 +0100
@@ -39,6 +39,7 @@
 
 BOOST_AUTO_TEST_CASE(output)
 {
+	server_->disconnect();
 	server_->set_username("francis");
 	server_->set_nickname("francis");
 	start();