class RpcTestOwned : public RpcTest {
public:
- void create_request(Json::Value &request, const string &method, int id = 1, bool owned = true) {
+ void create_request(Json::Value &request, const string &method, int id = 1, int port_id = 1, bool owned = true) {
RpcTest::create_request(request, method, id);
if (owned) {
- request["params"]["handler"] = m_ownership_handler;
+ request["params"]["port_id"] = port_id;
+ request["params"]["handler"] = m_ownership_handler[port_id];
}
}
virtual void SetUp() {
RpcTest::SetUp();
- take_ownership();
+
+ for (int i = 0 ; i < 4; i++) {
+ m_ownership_handler[i] = take_ownership(i);
+ }
}
- void take_ownership(void) {
+ string take_ownership(uint8_t port_id) {
Json::Value request;
Json::Value response;
RpcTest::create_request(request, "acquire", 1);
+ request["params"]["port_id"] = port_id;
request["params"]["user"] = "test";
request["params"]["force"] = true;
send_request(request, response);
EXPECT_TRUE(response["result"] != Json::nullValue);
- m_ownership_handler = response["result"].asString();
+ return response["result"].asString();
}
- void release_ownership() {
+ void release_ownership(uint8_t port_id) {
Json::Value request;
Json::Value response;
RpcTest::create_request(request, "release", 1);
+
request["params"]["handler"] = m_ownership_handler;
+ request["params"]["port_id"] = port_id;
send_request(request, response);
EXPECT_TRUE(response["result"] == "ACK");
}
- string m_ownership_handler;
+ string m_ownership_handler[4];
};
TEST_F(RpcTest, basic_rpc_negative_cases) {
/* no user before acquring */
create_request(request, "get_owner");
+ request["params"]["port_id"] = 1;
send_request(request, response);
EXPECT_TRUE(response["result"] != Json::nullValue);
/* soft acquire */
create_request(request, "acquire");
+ request["params"]["port_id"] = 1;
request["params"]["user"] = "itay";
request["params"]["force"] = false;
EXPECT_TRUE(response["result"] != Json::nullValue);
create_request(request, "get_owner");
+ request["params"]["port_id"] = 1;
send_request(request, response);
EXPECT_TRUE(response["result"] != Json::nullValue);
/* hard acquire */
create_request(request, "acquire");
+ request["params"]["port_id"] = 1;
request["params"]["user"] = "moshe";
request["params"]["force"] = false;
/* make sure */
create_request(request, "get_owner");
+ request["params"]["port_id"] = 1;
send_request(request, response);
EXPECT_TRUE(response["result"] != Json::nullValue);
/* release */
create_request(request, "release");
+ request["params"]["port_id"] = 1;
request["params"]["handler"] = handler;
send_request(request, response);
Json::Value response;
/* verify no such stream */
- create_request(request, "get_stream", 1);
+ create_request(request, "get_stream", 1, 1);
- request["params"]["port_id"] = 1;
request["params"]["stream_id"] = 5;
send_request(request, response);
EXPECT_EQ(response["error"]["code"], -32000);
/* add it */
- create_request(request, "add_stream", 1);
- request["params"]["port_id"] = 1;
+ create_request(request, "add_stream", 1, 1);
request["params"]["stream_id"] = 5;
Json::Value stream;
EXPECT_EQ(response["result"], "ACK");
/* get it */
- create_request(request, "get_stream", 1);
+ create_request(request, "get_stream", 1, 1);
- request["params"]["port_id"] = 1;
request["params"]["stream_id"] = 5;
send_request(request, response);
EXPECT_TRUE(compare_streams(stream, response["result"]["stream"]));
// remove it
- create_request(request, "remove_stream", 1);
+ create_request(request, "remove_stream", 1, 1);
- request["params"]["port_id"] = 1;
request["params"]["stream_id"] = 5;
send_request(request, response);
Json::Value response;
/* add stream 1 */
- create_request(request, "add_stream");
+ create_request(request, "add_stream", 1);
request["params"]["port_id"] = 1;
Json::Value stream;
Json::Value response;
/* add stream #1 */
- create_request(request, "add_stream");
- request["params"]["port_id"] = 1;
+ create_request(request, "add_stream", 1, 1);
request["params"]["stream_id"] = 5;
Json::Value stream;
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
- /* add stream #1 */
- create_request(request, "add_stream");
- request["params"]["port_id"] = 3;
+ /* add stream #1 */
+ create_request(request, "add_stream", 1, 3);
request["params"]["stream_id"] = 12;
request["params"]["stream"] = stream;
EXPECT_EQ(response["result"], "ACK");
/* start port 1 */
- create_request(request, "start_traffic");
- request["params"]["port_id"] = 1;
+ create_request(request, "start_traffic", 1, 1);
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
/* start port 3 */
- request["params"]["port_id"] = 3;
+ create_request(request, "start_traffic", 1, 3);
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
/* start not configured port */
-
- request["params"]["port_id"] = 2;
+ create_request(request, "start_traffic", 1, 2);
send_request(request, response);
EXPECT_EQ(response["error"]["code"], -32000);
/* stop port 1 */
- create_request(request, "stop_traffic");
- request["params"]["port_id"] = 1;
+ create_request(request, "stop_traffic", 1, 1);
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
/* stop port 3 */
- request["params"]["port_id"] = 3;
+ create_request(request, "stop_traffic", 1, 3);
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
/* start 1 again */
- create_request(request, "start_traffic");
- request["params"]["port_id"] = 1;
+ create_request(request, "start_traffic", 1, 1);
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
/* start 1 twice (error) */
+ create_request(request, "start_traffic", 1, 1);
send_request(request, response);
EXPECT_EQ(response["error"]["code"], -32000);
/* make sure you cannot release while traffic is active */
- //create_request(request, "release");
- //send_request(request, response);
- //EXPECT_EQ(response["error"]["code"], -32000);
+ create_request(request, "release", 1, 1);
+ send_request(request, response);
+ EXPECT_EQ(response["error"]["code"], -32000);
- /* done */
- create_request(request, "stop_traffic");
- request["params"]["port_id"] = 1;
+ /* stop traffic on port #1 */
+ create_request(request, "stop_traffic",1 ,1);
+ send_request(request, response);
+ EXPECT_EQ(response["result"], "ACK");
+
+ /* release */
+ create_request(request, "release", 1, 1);
send_request(request, response);
EXPECT_EQ(response["result"], "ACK");
}
section["ports"][i]["driver"] = driver;
section["ports"][i]["speed"] = speed;
+ section["ports"][i]["owner"] = port->get_owner();
+
switch (port->get_state()) {
case TrexStatelessPort::PORT_STATE_DOWN:
section["ports"][i]["status"] = "down";
TrexRpcCmdGetOwner::_run(const Json::Value ¶ms, Json::Value &result) {
Json::Value §ion = result["result"];
- section["owner"] = TrexRpcServer::get_owner();
+ uint8_t port_id = parse_port(params, result);
+
+ TrexStatelessPort *port = TrexStateless::get_instance().get_port_by_id(port_id);
+ section["owner"] = port->get_owner();
return (TREX_RPC_CMD_OK);
}
trex_rpc_cmd_rc_e
TrexRpcCmdAcquire::_run(const Json::Value ¶ms, Json::Value &result) {
+ uint8_t port_id = parse_port(params, result);
+
const string &new_owner = parse_string(params, "user", result);
bool force = parse_bool(params, "force", result);
/* if not free and not you and not force - fail */
- if ( (!TrexRpcServer::is_free_to_aquire()) && (TrexRpcServer::get_owner() != new_owner) && (!force)) {
- generate_execute_err(result, "device is already taken by '" + TrexRpcServer::get_owner() + "'");
+ TrexStatelessPort *port = TrexStateless::get_instance().get_port_by_id(port_id);
+
+ if ( (!port->is_free_to_aquire()) && (port->get_owner() != new_owner) && (!force)) {
+ generate_execute_err(result, "device is already taken by '" + port->get_owner() + "'");
}
- string handle = TrexRpcServer::set_owner(new_owner);
+ port->set_owner(new_owner);
- result["result"] = handle;
+ result["result"] = port->get_owner_handler();
return (TREX_RPC_CMD_OK);
}
trex_rpc_cmd_rc_e
TrexRpcCmdRelease::_run(const Json::Value ¶ms, Json::Value &result) {
- TrexRpcServer::clear_owner();
+ uint8_t port_id = parse_port(params, result);
+
+ TrexStatelessPort *port = TrexStateless::get_instance().get_port_by_id(port_id);
+
+ if (port->get_state() == TrexStatelessPort::PORT_STATE_TRANSMITTING) {
+ generate_execute_err(result, "cannot release a port during transmission");
+ }
+
+ port->clear_owner();
result["result"] = "ACK";