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