some files added
authorimarom <[email protected]>
Thu, 13 Aug 2015 13:28:21 +0000 (16:28 +0300)
committerimarom <[email protected]>
Thu, 13 Aug 2015 13:28:21 +0000 (16:28 +0300)
src/gtest/rpc_test.cpp
src/rpc-server/include/trex_rpc_commands.h [new file with mode: 0644]
src/rpc-server/src/trex_rpc_commands.cpp [new file with mode: 0644]
src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp

index f80ebd5..d8fc538 100644 (file)
@@ -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 (file)
index 0000000..4a445da
--- /dev/null
@@ -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> &params);
+
+    /**
+     * 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 (file)
index 0000000..d7a1646
--- /dev/null
@@ -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];
+}
index f28bcbd..0e649ac 100644 (file)
@@ -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 */
 }