just a few enums
authorimarom <[email protected]>
Thu, 13 Aug 2015 06:13:37 +0000 (09:13 +0300)
committerimarom <[email protected]>
Thu, 13 Aug 2015 06:13:37 +0000 (09:13 +0300)
src/gtest/rpc_test.cpp
src/rpc-server/src/trex_rpc_jsonrpc_v2.cpp
src/rpc-server/src/trex_rpc_req_resp.cpp

index 59b4b18..f1510ef 100644 (file)
@@ -26,29 +26,80 @@ limitations under the License.
 #include <json/json.h>
 #include <sstream>
 
+using namespace std;
+
 class RpcTest : public testing::Test {
 
     virtual void SetUp() {
+        m_rpc = new TrexRpcServerArray(TrexRpcServerArray::RPC_PROT_TCP, 5050);
+        m_rpc->start();
+
+        m_context = zmq_ctx_new ();
+        m_socket = zmq_socket (m_context, ZMQ_REQ);
+        zmq_connect (m_socket, "tcp://localhost:5050");
     }
 
     virtual void TearDown() {
+        m_rpc->stop();
+
+        delete m_rpc;
+        zmq_close(m_socket);
+        zmq_term(m_context);
     }
+
+public:
+    string send_msg(const string &msg) {
+        char buffer[512];
+
+        zmq_send (m_socket, msg.c_str(), msg.size(), 0);
+        int len = zmq_recv(m_socket, buffer, sizeof(buffer), 0);
+
+        return string(buffer, len);
+    }
+
+    TrexRpcServerArray *m_rpc;
+    void *m_context;
+    void *m_socket;
 };
 
 TEST_F(RpcTest, basic_rpc_test) {
-    TrexRpcServerArray rpc(TrexRpcServerArray::RPC_PROT_TCP, 5050);
-    rpc.start();
+    Json::Value request;
+    Json::Value response;
+    Json::Reader reader;
 
-    sleep(1);
+    string req_str;
+    string resp_str;
+
+    // check bad JSON format
+    req_str = "bad format message";
+    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);
+
+    // check bad version
+    req_str = "{\"jsonrpc\": \"1.5\", \"method\": \"foobar\", \"id\": \"1\"}";
+    resp_str = send_msg(req_str);
 
-    printf ("Connecting to hello world server\85\n");
-    void *context = zmq_ctx_new ();
-    void *requester = zmq_socket (context, ZMQ_REQ);
-    zmq_connect (requester, "tcp://localhost:5050");
+    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);
 
+    // no method name present
+    req_str = "{\"jsonrpc\": \"1.5\", \"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);
+
+    #if 0
+    
     
-    char buffer[250];
-    Json::Value request;
 
     int id = 1;
     request["jsonrpc"] = "2.0";
@@ -61,16 +112,16 @@ TEST_F(RpcTest, basic_rpc_test) {
     for (int request_nbr = 0; request_nbr != 1; request_nbr++) {
         //request["id"] = "itay_id";
 
-        std::stringstream ss;
+        stringstream ss;
         ss << request;
 
-        std::cout << "Sending : '" << ss.str() << "'\n";
+        cout << "Sending : '" << ss.str() << "'\n";
         
         zmq_send (requester, ss.str().c_str(), ss.str().size(), 0);
 
         int len = zmq_recv (requester, buffer, 250, 0);
-        std::string resp(buffer, buffer + len);
-        std::cout << "Got: " << resp << "\n";
+        string resp(buffer, buffer + len);
+        cout << "Got: " << resp << "\n";
     }
     zmq_close (requester);
     zmq_ctx_destroy (context);
@@ -78,5 +129,6 @@ TEST_F(RpcTest, basic_rpc_test) {
     sleep(1);
 
     rpc.stop();
+    #endif
 }
 
index d489555..2083ab2 100644 (file)
@@ -25,6 +25,17 @@ limitations under the License.
 
 #include <iostream>
 
+/**
+ * error as described in the RFC
+ */
+enum {
+    JSONRPC_V2_ERR_PARSE              = -32700,
+    JSONRPC_V2_ERR_INVALID_REQ        = -32600,
+    JSONRPC_V2_ERR_METHOD_NOT_FOUND   = -32601,
+    JSONRPC_V2_ERR_INVALID_PARAMS     = -32602,
+    JSONRPC_V2_ERR_INTERNAL_ERROR     = -32603
+};
+
 /* dummy command */
 class DumymCommand : public TrexJsonRpcV2Command {
 public:
@@ -56,7 +67,6 @@ public:
 
         /* encode to string */
         response = writer.write(response_json);
-        
     }
 
 private:
@@ -77,24 +87,22 @@ TrexJsonRpcV2Command * TrexJsonRpcV2Parser::parse() {
     /* basic JSON parsing */
     bool rc = reader.parse(m_msg, request, false);
     if (!rc) {
-        return new JsonRpcError(Json::Value::null, -32700, "Bad JSON Format");
+        return new JsonRpcError(Json::Value::null, JSONRPC_V2_ERR_PARSE, "Bad JSON Format");
     }
 
     Json::Value msg_id = request["id"];
 
     /* check version */
     if (request["jsonrpc"] != "2.0") {
-        return new JsonRpcError(msg_id, -32600, "Invalid JSONRPC Version");
+        return new JsonRpcError(msg_id, JSONRPC_V2_ERR_INVALID_REQ, "Invalid JSONRPC Version");
     }
 
     /* check method name */
     std::string method_name = request["method"].asString();
     if (method_name == "") {
-        return new JsonRpcError(msg_id, -32600, "Missing Method Name");
+        return new JsonRpcError(msg_id, JSONRPC_V2_ERR_INVALID_REQ, "Missing Method Name");
     }
 
-    std::cout << "method name: " << method_name << "\n";
-
     TrexJsonRpcV2Command *command = new DumymCommand();
 
     return (command);
index 5c28d90..b423c8e 100644 (file)
@@ -57,8 +57,6 @@ void TrexRpcServerReqRes::_rpc_thread_cb() {
         throw TrexRpcException("Unable to start ZMQ server at: " + ss.str());
     }
 
-    printf("listening on %s\n", ss.str().c_str());
-
     /* server main loop */
     while (m_is_running) {
         int msg_size = zmq_recv (m_socket, m_msg_buffer, sizeof(m_msg_buffer), 0);
@@ -89,9 +87,6 @@ void TrexRpcServerReqRes::_stop_rpc_thread() {
 void TrexRpcServerReqRes::handle_request(const std::string &request) {
     std::string   response;
 
-    /* debug */
-    std::cout << request << std::endl;
-
     TrexJsonRpcV2Parser rpc_request(request);
 
     TrexJsonRpcV2Command *rpc_command = rpc_request.parse();