diff options
-rw-r--r-- | src/gtest/rpc_test.cpp | 28 | ||||
-rw-r--r-- | src/rpc-server/include/trex_rpc_commands.h | 81 | ||||
-rw-r--r-- | src/rpc-server/src/trex_rpc_commands.cpp | 29 | ||||
-rw-r--r-- | src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp | 7 |
4 files changed, 135 insertions, 10 deletions
diff --git a/src/gtest/rpc_test.cpp b/src/gtest/rpc_test.cpp index f80ebd5d..d8fc5389 100644 --- a/src/gtest/rpc_test.cpp +++ b/src/gtest/rpc_test.cpp @@ -75,28 +75,36 @@ TEST_F(RpcTest, basic_rpc_test) { resp_str = send_msg(req_str); EXPECT_TRUE(reader.parse(resp_str, response, false)); - EXPECT_TRUE(response["jsonrpc"] == "2.0"); - EXPECT_TRUE(response["id"] == Json::Value::null); - EXPECT_TRUE(response["error"]["code"] == -32700); + EXPECT_EQ(response["jsonrpc"], "2.0"); + EXPECT_EQ(response["id"], Json::Value::null); + EXPECT_EQ(response["error"]["code"], -32700); // check bad version req_str = "{\"jsonrpc\": \"1.5\", \"method\": \"foobar\", \"id\": \"1\"}"; resp_str = send_msg(req_str); EXPECT_TRUE(reader.parse(resp_str, response, false)); - EXPECT_TRUE(response["jsonrpc"] == "2.0"); - EXPECT_TRUE(response["id"] == "1"); - EXPECT_TRUE(response["error"]["code"] == -32600); + EXPECT_EQ(response["jsonrpc"], "2.0"); + EXPECT_EQ(response["id"], "1"); + EXPECT_EQ(response["error"]["code"], -32600); // no method name present - req_str = "{\"jsonrpc\": \"1.5\", \"id\": 482}"; + req_str = "{\"jsonrpc\": \"2.0\", \"id\": 482}"; resp_str = send_msg(req_str); EXPECT_TRUE(reader.parse(resp_str, response, false)); - EXPECT_TRUE(response["jsonrpc"] == "2.0"); - EXPECT_TRUE(response["id"] == 482); - EXPECT_TRUE(response["error"]["code"] == -32600); + EXPECT_EQ(response["jsonrpc"], "2.0"); + EXPECT_EQ(response["id"], 482); + EXPECT_EQ(response["error"]["code"], -32600); + /* method does not exist */ + req_str = "{\"jsonrpc\": \"2.0\", \"method\": \"jfgldjlfds\", \"id\": 482}"; + resp_str = send_msg(req_str); + + EXPECT_TRUE(reader.parse(resp_str, response, false)); + EXPECT_EQ(response["jsonrpc"], "2.0"); + EXPECT_EQ(response["id"], 482); + EXPECT_EQ(response["error"]["code"], -32601); } TEST_F(RpcTest, batch_rpc_test) { diff --git a/src/rpc-server/include/trex_rpc_commands.h b/src/rpc-server/include/trex_rpc_commands.h new file mode 100644 index 00000000..4a445dac --- /dev/null +++ b/src/rpc-server/include/trex_rpc_commands.h @@ -0,0 +1,81 @@ +/* + Itay Marom + Cisco Systems, Inc. +*/ + +/* +Copyright (c) 2015-2015 Cisco Systems, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef __TREX_RPC_COMMANDS_H__ +#define __TREX_RPC_COMMANDS_H__ + +#include <unordered_map> +#include <string> +#include <vector> + +/** + * interface for RPC command + * + * @author imarom (13-Aug-15) + */ +class TrexRpcCommand { +public: + TrexRpcCommand(const std::string &method_name, const std::vector<std::string> ¶ms); + + /** + * implemented by the derived class + * + * @author imarom (13-Aug-15) + */ + virtual void run() = 0; + +protected: + std::vector<std::string> params; +}; + +/** + * holds all the commands registered + * + * @author imarom (13-Aug-15) + */ +class TrexRpcCommandsTable { + +public: + + static TrexRpcCommandsTable& get_instance() { + static TrexRpcCommandsTable instance; + return instance; + } + + void register_command(const TrexRpcCommand &command); + + TrexRpcCommand * lookup(const std::string &method_name); + +private: + TrexRpcCommandsTable(); + + /* c++ 2011 style singleton */ + TrexRpcCommandsTable(TrexRpcCommandsTable const&) = delete; + void operator=(TrexRpcCommandsTable const&) = delete; + + /** + * holds all the registered RPC commands + * + */ + std::unordered_map<std::string, TrexRpcCommand *> m_rpc_cmd_table; +}; + +#endif /* __TREX_RPC_COMMANDS_H__ */ diff --git a/src/rpc-server/src/trex_rpc_commands.cpp b/src/rpc-server/src/trex_rpc_commands.cpp new file mode 100644 index 00000000..d7a1646a --- /dev/null +++ b/src/rpc-server/src/trex_rpc_commands.cpp @@ -0,0 +1,29 @@ +/* + Itay Marom + Cisco Systems, Inc. +*/ + +/* +Copyright (c) 2015-2015 Cisco Systems, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +#include <trex_rpc_commands.h> + +TrexRpcCommandsTable::TrexRpcCommandsTable() { + +} + +TrexRpcCommand * TrexRpcCommandsTable::lookup(const std::string &method_name) { + return m_rpc_cmd_table[method_name]; +} diff --git a/src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp b/src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp index f28bcbd8..0e649ac5 100644 --- a/src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp +++ b/src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp @@ -20,6 +20,7 @@ limitations under the License. */ #include <trex_rpc_exception_api.h> #include <trex_rpc_jsonrpc_v2.h> +#include <trex_rpc_commands.h> #include <json/json.h> @@ -131,6 +132,12 @@ void TrexJsonRpcV2Parser::parse_single_request(Json::Value &request, return; } + TrexRpcCommand * rpc_cmd = TrexRpcCommandsTable::get_instance().lookup(method_name); + if (!rpc_cmd) { + commands.push_back(new JsonRpcError(msg_id, JSONRPC_V2_ERR_METHOD_NOT_FOUND, "Method not registered")); + return; + } + /* TODO - add commands */ } |