diff options
author | Michal 'vorner' Vaner <michal.vaner@nic.cz> | 2013-02-20 11:16:28 +0100 |
---|---|---|
committer | Michal 'vorner' Vaner <michal.vaner@nic.cz> | 2013-02-20 12:29:02 +0100 |
commit | ce19b150c67834a91d7742f362a175904172a7d7 (patch) | |
tree | 93567778db90a72f058d86021ced90e7d12c77a9 /src/lib | |
parent | [2768] Interface of the ModuleCCSession::rpcCall (diff) | |
download | kea-ce19b150c67834a91d7742f362a175904172a7d7.tar.xz kea-ce19b150c67834a91d7742f362a175904172a7d7.zip |
[2768] Tests for the rpcCall method
They currently fail, as the method is empty. Provide at least an empty
implementation, to make it compile.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/config/ccsession.cc | 8 | ||||
-rw-r--r-- | src/lib/config/ccsession.h | 15 | ||||
-rw-r--r-- | src/lib/config/tests/ccsession_unittests.cc | 50 |
3 files changed, 73 insertions, 0 deletions
diff --git a/src/lib/config/ccsession.cc b/src/lib/config/ccsession.cc index 378f2b4186..162f01e09d 100644 --- a/src/lib/config/ccsession.cc +++ b/src/lib/config/ccsession.cc @@ -857,5 +857,13 @@ ModuleCCSession::cancelAsyncRecv(const AsyncRecvRequestID& id) { async_recv_requests_.erase(id); } +ConstElementPtr +ModuleCCSession::rpcCall(const std::string &, const std::string &, + const std::string &, const std::string &, + const ConstElementPtr &) +{ + return (ConstElementPtr()); +} + } } diff --git a/src/lib/config/ccsession.h b/src/lib/config/ccsession.h index b21fef20ee..c9a6ffe2b7 100644 --- a/src/lib/config/ccsession.h +++ b/src/lib/config/ccsession.h @@ -418,6 +418,21 @@ public: params = isc::data::ConstElementPtr()); + /// \brief Convenience version of rpcCall + /// + /// This is exactly the same as the previous version of rpcCall, except + /// that the instance and to parameters are at their default. This + /// allows to sending a command with parameters to a named module + /// without long typing of the parameters. + isc::data::ConstElementPtr rpcCall(const std::string& command, + const std::string& group, + const isc::data::ConstElementPtr& + params) + { + return rpcCall(command, group, isc::cc::CC_INSTANCE_WILDCARD, + isc::cc::CC_TO_WILDCARD, params); + } + /// \brief Forward declaration of internal data structure. /// /// This holds information about one asynchronous request to receive diff --git a/src/lib/config/tests/ccsession_unittests.cc b/src/lib/config/tests/ccsession_unittests.cc index 2a5e758755..824125b7c0 100644 --- a/src/lib/config/tests/ccsession_unittests.cc +++ b/src/lib/config/tests/ccsession_unittests.cc @@ -58,6 +58,26 @@ protected: // ok answer. session.getMessages()->add(createAnswer()); } + ConstElementPtr rpcCheck(const std::string& reply) { + ModuleCCSession mccs(ccspecfile("spec1.spec"), session, NULL, NULL, + false, false); + // Prepare the answer beforehand, it'll block until it gets one + const ConstElementPtr& reply_el(el(reply)); + session.getMessages()->add(reply_el); + const ConstElementPtr& result(mccs.rpcCall("test", "Spec2", + el("{\"param1\": \"Param 1\"," + "\"param2\": \"Param 2\"}"))); + const ConstElementPtr& request(el("[\"Spec2\", \"*\", {" + " \"command\": [\"test\", {" + " \"param1\": \"Param 1\"," + " \"param2\": \"Param 2\"" + "}]}, -1]")); + // The 0th one is from the initialization, to ConfigManager. + // our is the 1st. + EXPECT_TRUE(request->equals(*session.getMsgQueue()->get(1))) << + session.getMsgQueue()->get(1)->toWire(); + return (result); + } ~CCSessionTest() { isc::log::setRootLoggerName(root_name); } @@ -65,6 +85,36 @@ protected: const std::string root_name; }; +// Test we can send an RPC (command) and get an answer. The answer is success +// in this case. +TEST_F(CCSessionTest, rpcCallSuccess) { + const ConstElementPtr &result = + rpcCheck("{\"result\": [0, {\"Hello\": \"a\"}]}"); + EXPECT_TRUE(el("{\"Hello\": \"a\"}")->equals(*result)); +} + +// Test success of RPC, but the answer is empty (eg. a void function on the +// remote side). +TEST_F(CCSessionTest, rpcCallSuccessNone) { + EXPECT_FALSE(rpcCheck("{\"result\": [0]}")); +} + +// Test it successfully raises CCSessionError if the answer is malformed. +TEST_F(CCSessionTest, rpcCallMalformedAnswer) { + EXPECT_THROW(rpcCheck("[\"Nonsense\"]"), CCSessionError); +} + +// Test it raises exception when the remote side reports an error +TEST_F(CCSessionTest, rpcCallError) { + EXPECT_THROW(rpcCheck("{\"result\": [1, \"Error\"]}"), RPCError); +} + +// Test it raises exception when the remote side doesn't exist +TEST_F(CCSessionTest, rpcNoRecpt) { + EXPECT_THROW(rpcCheck("{\"result\": [-1, \"Error\"]}"), + RPCRecipientMissing); +} + TEST_F(CCSessionTest, createAnswer) { ConstElementPtr answer; answer = createAnswer(); |