Mercurial > irccd
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();