Mercurial > irccd
changeset 571:23fc81b1bd8f
Tests: add error code support in cmd-rule-* tests
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 29 Nov 2017 09:29:25 +0100 |
parents | 153e84e7b09b |
children | 17207a09a6b4 |
files | libirccd/irccd/command.cpp libirccd/irccd/command.hpp libirccdctl/irccd/ctl/controller.cpp tests/cmd-rule-add/main.cpp tests/cmd-rule-edit/main.cpp tests/cmd-rule-info/main.cpp tests/cmd-rule-move/main.cpp |
diffstat | 7 files changed, 294 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/libirccd/irccd/command.cpp Tue Nov 28 17:17:30 2017 +0100 +++ b/libirccd/irccd/command.cpp Wed Nov 29 09:29:25 2017 +0100 @@ -116,7 +116,7 @@ auto v = object[name]; if (!v.is_string()) - throw std::runtime_error("no action given"); + throw rule_error(rule_error::invalid_action); auto s = v.template get<std::string>(); if (s == "accept") @@ -124,7 +124,7 @@ if (s == "drop") return rule::action_type::drop; - throw std::runtime_error("unknown action '"s + s + "' given"); + throw rule_error(rule_error::invalid_action); }; return { @@ -137,6 +137,16 @@ }; } +unsigned get_rule_index(const nlohmann::json& json, const std::string& key = "index") +{ + auto index = json.find(key); + + if (index == json.end() || !index->is_number_integer() || index->get<int>() < 0) + throw rule_error(rule_error::invalid_index); + + return index->get<int>(); +} + } // !namespace plugin_config_command::plugin_config_command() @@ -516,7 +526,7 @@ }; // Create a copy to avoid incomplete edition in case of errors. - auto index = json_util::require_uint(args, "index"); + auto index = get_rule_index(args); auto rule = irccd.rules().require(index); updateset(rule.channels(), args, "channels"); @@ -535,7 +545,7 @@ else if (action->get<std::string>() == "drop") rule.set_action(rule::action_type::drop); else - throw rule_error(rule_error::error::invalid_action); + throw rule_error(rule_error::invalid_action); } // All done, sync the rule. @@ -568,7 +578,7 @@ void rule_info_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args) { - auto json = to_json(irccd.rules().require(json_util::require_uint(args, "index"))); + auto json = to_json(irccd.rules().require(get_rule_index(args))); json.push_back({"command", "rule-info"}); client.send(std::move(json)); @@ -597,8 +607,8 @@ void rule_move_command::exec(irccd& irccd, transport_client& client, const nlohmann::json& args) { - auto from = json_util::require_uint(args, "from"); - auto to = json_util::require_uint(args, "to"); + auto from = get_rule_index(args, "from"); + auto to = get_rule_index(args, "to"); /* * Examples of moves
--- a/libirccd/irccd/command.hpp Tue Nov 28 17:17:30 2017 +0100 +++ b/libirccd/irccd/command.hpp Wed Nov 29 09:29:25 2017 +0100 @@ -151,7 +151,7 @@ * * - plugin_error::already_exists * - plugin_error::not_found - * - pluign_error::exec_error + * - plugin_error::exec_error */ class plugin_load_command : public command { public: @@ -172,7 +172,7 @@ * Replies: * * - plugin_error::not_found - * - pluign_error::exec_error + * - plugin_error::exec_error */ class plugin_reload_command : public command { public: @@ -193,7 +193,7 @@ * Replies: * * - plugin_error::not_found - * - pluign_error::exec_error + * - plugin_error::exec_error */ class plugin_unload_command : public command { public: @@ -482,6 +482,11 @@ /** * \brief Implementation of rule-edit transport command. + * + * Replies: + * + * - rule_error::invalid_index + * - rule_error::invalid_action */ class rule_edit_command : public command { public: @@ -514,6 +519,10 @@ /** * \brief Implementation of rule-info transport command. + * + * Replies: + * + * - rule_error::invalid_index */ class rule_info_command : public command { public: @@ -530,6 +539,10 @@ /** * \brief Implementation of rule-remove transport command. + * + * Replies: + * + * - rule_error::invalid_index */ class rule_remove_command : public command { public: @@ -546,6 +559,10 @@ /** * \brief Implementation of rule-move transport command. + * + * Replies: + * + * - rule_error::invalid_index */ class rule_move_command : public command { public: @@ -562,6 +579,10 @@ /** * \brief Implementation of rule-add transport command. + * + * Replies: + * + * - rule_error::invalid_action */ class rule_add_command : public command { public:
--- a/libirccdctl/irccd/ctl/controller.cpp Tue Nov 28 17:17:30 2017 +0100 +++ b/libirccdctl/irccd/ctl/controller.cpp Wed Nov 29 09:29:25 2017 +0100 @@ -106,7 +106,7 @@ code = make_error_code(static_cast<server_error::error>(e)); else if (e >= 2000 && e < 3000) code = make_error_code(static_cast<plugin_error::error>(e)); - else if (e >= 4000 && e < 4000) + else if (e >= 4000 && e < 5000) code = make_error_code(static_cast<rule_error::error>(e)); handler(std::move(code), std::move(msg));
--- a/tests/cmd-rule-add/main.cpp Tue Nov 28 17:17:30 2017 +0100 +++ b/tests/cmd-rule-add/main.cpp Wed Nov 29 09:29:25 2017 +0100 @@ -177,6 +177,29 @@ } } +BOOST_AUTO_TEST_SUITE(errors) + +BOOST_AUTO_TEST_CASE(invalid_action) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-add" }, + { "action", "unknown" } + }); + ctl_->recv([&] (auto code, auto msg) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_action); +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE_END() } // !irccd
--- a/tests/cmd-rule-edit/main.cpp Tue Nov 28 17:17:30 2017 +0100 +++ b/tests/cmd-rule-edit/main.cpp Wed Nov 29 09:29:25 2017 +0100 @@ -542,6 +542,90 @@ BOOST_TEST(result["action"].get<std::string>() == "drop"); } +BOOST_AUTO_TEST_SUITE(errors) + +BOOST_AUTO_TEST_CASE(invalid_index_1) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-edit" }, + { "index", -100 }, + { "action", "drop" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_2) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-edit" }, + { "index", 100 }, + { "action", "drop" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_3) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-edit" }, + { "index", "notaint" }, + { "action", "drop" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_action) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-edit" }, + { "index", 0 }, + { "action", "unknown" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_action); +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE_END() } // !irccd
--- a/tests/cmd-rule-info/main.cpp Tue Nov 28 17:17:30 2017 +0100 +++ b/tests/cmd-rule-info/main.cpp Wed Nov 29 09:29:25 2017 +0100 @@ -91,27 +91,70 @@ BOOST_TEST(result["action"].get<std::string>() == "drop"); } -BOOST_AUTO_TEST_CASE(out_of_bounds) +BOOST_AUTO_TEST_SUITE(errors) + +BOOST_AUTO_TEST_CASE(invalid_index_1) { - nlohmann::json result; + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-info" }, + { "index", -100 }, + { "action", "drop" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_2) +{ + boost::system::error_code result; ctl_->send({ { "command", "rule-info" }, - { "index", 123 } + { "index", 100 }, + { "action", "drop" } }); - ctl_->recv([&] (auto, auto msg) { - result = msg; + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; }); - wait_for([&] () { - return result.is_object(); + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_3) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-info" }, + { "index", "notaint" }, + { "action", "drop" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; }); - // TODO: error code - BOOST_TEST(result.is_object()); - BOOST_TEST(result.count("error")); + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); } BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE_END() + } // !irccd
--- a/tests/cmd-rule-move/main.cpp Tue Nov 28 17:17:30 2017 +0100 +++ b/tests/cmd-rule-move/main.cpp Wed Nov 29 09:29:25 2017 +0100 @@ -362,28 +362,110 @@ } } -BOOST_AUTO_TEST_CASE(out_of_bounds) +BOOST_AUTO_TEST_SUITE(errors) + +BOOST_AUTO_TEST_CASE(invalid_index_1_from) { - nlohmann::json result; + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-move" }, + { "from", -100 }, + { "to", 0 } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_1_to) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-move" }, + { "from", 0 }, + { "to", -100 } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_2_from) +{ + boost::system::error_code result; ctl_->send({ { "command", "rule-move" }, - { "from", 1024 }, + { "from", 100 }, { "to", 0 } }); - ctl_->recv([&] (auto, auto msg) { - result = msg; + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; }); - wait_for([&] () { - return result.is_object(); + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_3_from) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-move" }, + { "from", "notaint" }, + { "to", 0 } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; }); - // TODO: error code - BOOST_TEST(result.is_object()); - BOOST_TEST(result.count("error")); + BOOST_ASSERT(result == rule_error::invalid_index); +} + +BOOST_AUTO_TEST_CASE(invalid_index_3_to) +{ + boost::system::error_code result; + + ctl_->send({ + { "command", "rule-move" }, + { "from", 0 }, + { "to", "notaint" } + }); + ctl_->recv([&] (auto code, auto) { + result = code; + }); + + wait_for([&] { + return result; + }); + + BOOST_ASSERT(result == rule_error::invalid_index); } BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE_END() + } // !irccd