From 2ce448e2a4f5c4cada1c94fcb60d2674365defd9 Mon Sep 17 00:00:00 2001 From: fengzero Date: Tue, 9 Nov 2021 09:43:45 +0000 Subject: [PATCH] add function test for group config api --- ft/Keyword/GrpConfig.py | 16 ++++ ft/Keyword/{NeuronLib.py => Neuron.py} | 2 +- ft/Keyword/{NodeLib.py => Node.py} | 6 +- ft/error.robot | 1 + ft/grp_config_api_test.robot | 90 ++++++++++++++++++++++ ft/{node_api.robot => node_api_test.robot} | 4 +- include/neu_errcodes.h | 1 + plugins/restful/group_config_handle.c | 62 +++++++++------ src/adapter/adapter.c | 25 ++---- src/core/neu_manager.c | 18 +++-- 10 files changed, 167 insertions(+), 58 deletions(-) create mode 100644 ft/Keyword/GrpConfig.py rename ft/Keyword/{NeuronLib.py => Neuron.py} (90%) rename ft/Keyword/{NodeLib.py => Node.py} (79%) create mode 100644 ft/grp_config_api_test.robot rename ft/{node_api.robot => node_api_test.robot} (98%) diff --git a/ft/Keyword/GrpConfig.py b/ft/Keyword/GrpConfig.py new file mode 100644 index 00000000..2c3de09e --- /dev/null +++ b/ft/Keyword/GrpConfig.py @@ -0,0 +1,16 @@ +class GrpConfig(object): + + def __init__(self): + pass + + def Get_Interval_In_Group_Config(self, gconfigs, gname): + for gconfig in gconfigs[0]: + if gconfig['name'] == gname: + return gconfig['interval'] + return 0 + + def Group_Config_Size(self, gconfigs): + size = 0 + for gconfig in gconfigs[0]: + size = size + 1 + return size diff --git a/ft/Keyword/NeuronLib.py b/ft/Keyword/Neuron.py similarity index 90% rename from ft/Keyword/NeuronLib.py rename to ft/Keyword/Neuron.py index 24a57989..727b7c5a 100644 --- a/ft/Keyword/NeuronLib.py +++ b/ft/Keyword/Neuron.py @@ -1,7 +1,7 @@ import subprocess -class NeuronLib(object): +class Neuron(object): process = 0 def __init__(self): diff --git a/ft/Keyword/NodeLib.py b/ft/Keyword/Node.py similarity index 79% rename from ft/Keyword/NodeLib.py rename to ft/Keyword/Node.py index 4137ee1a..211bce75 100644 --- a/ft/Keyword/NodeLib.py +++ b/ft/Keyword/Node.py @@ -1,8 +1,4 @@ -import json - - -class NodeLib(object): - process = 0 +class Node(object): def __init__(self): pass diff --git a/ft/error.robot b/ft/error.robot index 4f118f36..9dceda45 100644 --- a/ft/error.robot +++ b/ft/error.robot @@ -7,3 +7,4 @@ ${err_plugin_name_not_found} -2000 ${err_node_type_invalid} -2001 ${err_node_exist} -2002 ${err_node_not_exist} -2003 +${err_grpconfig_not_exist} -2004 diff --git a/ft/grp_config_api_test.robot b/ft/grp_config_api_test.robot new file mode 100644 index 00000000..7e5e3b1b --- /dev/null +++ b/ft/grp_config_api_test.robot @@ -0,0 +1,90 @@ +*** Settings *** +Library Keyword.Neuron.Neuron +Library Keyword.Node.Node +Library Keyword.GrpConfig.GrpConfig +Resource error.robot +Resource neuron.robot +Library REST http://127.0.0.1:7001 +Suite Setup Neuron Context Ready +Suite Teardown Stop Neuron + +*** Variables *** +${test_gconfig} "test_gconfig" + +*** Test Cases *** +Add group config under non-existent node, it should return failure + POST /api/v2/gconfig {"name": ${test_gconfig}, "node_id": 1234, "interval": 1000} + Integer response status 400 + Integer response body error ${err_node_not_exist} + +Add group config under existent node, it should return success + ${test_node_id} Get Test Node ID + POST /api/v2/gconfig {"name": ${test_gconfig}, "node_id": ${test_node_id}, "interval": 1000} + Integer response status 201 + +Delete a non-existent group config, it should return failure + ${test_node_id} Get Test Node ID + DELETE /api/v2/gconfig {"node_id": ${test_node_id}, "name": "xxxx"} + Integer response status 404 + Integer response body error ${err_grpconfig_not_exist} + +Delete a group config from non-existent node, it should return failure + DELETE /api/v2/gconfig {"node_id": 1234, "name": ${test_gconfig}} + Integer response status 404 + Integer response body error ${err_grpconfig_not_exist} + +Delete a group config, it should return success + ${test_node_id} Get Test Node ID + DELETE /api/v2/gconfig {"node_id": ${test_node_id}, "name": ${test_gconfig}} + Integer response status 200 + +Update a non-existent group config, it should return failure + ${test_node_id} Get Test Node ID + PUT /api/v2/gconfig {"node_id": ${test_node_id}, "name": "xxxx", "interval": 2000} + Integer response status 404 + Integer response body error ${err_grpconfig_not_exist} + +Update a group config from non-existent node, it should return failure + PUT /api/v2/gconfig {"node_id": 1234, "name": ${test_gconfig}, "interval": 2000} + Integer response status 404 + Integer response body error ${err_grpconfig_not_exist} + +Add a group config to the node, then get the group config from this node, it should return the group config + ${test_node_id} Get Test Node ID + POST /api/v2/gconfig {"name": ${test_gconfig}, "node_id": ${test_node_id}, "interval": 1000} + Integer response status 201 + GET /api/v2/gconfig?node_id=${test_node_id} + ${tmp} Array $.group_configs + ${size} Group Config Size ${tmp} + should be equal as integers ${size} 1 + ${interval} Get Interval In Group Config ${tmp} test_gconfig + should be equal as integers ${interval} 1000 + +Update the interval of the test group config, it should return success + ${test_node_id} Get Test Node ID + ${test_node_id} Get Test Node ID + PUT /api/v2/gconfig {"node_id": ${test_node_id}, "name": ${test_gconfig}, "interval": 2000} + Integer response status 200 + GET /api/v2/gconfig?node_id=${test_node_id} + ${tmp} Array $.group_configs + ${interval} Get Interval In Group Config ${tmp} test_gconfig + should be equal as integers ${interval} 2000 + + + +*** Keywords *** +Get Test Node ID + GET /api/v2/node?type=1 + Integer response status 200 + ${tmp} Array $.nodes + ${test_node_id} Get Node By Name ${tmp} test-node + [RETURN] ${test_node_id} +Add Test Node + POST /api/v2/node {"type": 1, "name": "test-node", "plugin_name": "modbus-tcp-plugin"} + Integer response status 201 + Integer response body error ${err_success} + ${test_node_id} Get Test Node ID + should not be equal ${test_node_id} 0 +Neuron Context Ready + Neuron Ready + Add Test Node \ No newline at end of file diff --git a/ft/node_api.robot b/ft/node_api_test.robot similarity index 98% rename from ft/node_api.robot rename to ft/node_api_test.robot index 8e5b181a..ebe3e05c 100644 --- a/ft/node_api.robot +++ b/ft/node_api_test.robot @@ -1,6 +1,6 @@ *** Settings *** -Library Keyword.NeuronLib.NeuronLib -Library Keyword.NodeLib.NodeLib +Library Keyword.Neuron.Neuron +Library Keyword.Node.Node Resource error.robot Resource neuron.robot Library REST http://127.0.0.1:7001 diff --git a/include/neu_errcodes.h b/include/neu_errcodes.h index f13309b4..8389b9dc 100644 --- a/include/neu_errcodes.h +++ b/include/neu_errcodes.h @@ -68,6 +68,7 @@ typedef enum { NEU_ERR_NODE_TYPE_INVALID = -2001, NEU_ERR_NODE_EXIST = -2002, NEU_ERR_NODE_NOT_EXIST = -2003, + NEU_ERR_GRP_CONFIG_NOT_EXIST = -2004, } neu_err_code_e; #ifdef __cplusplus diff --git a/plugins/restful/group_config_handle.c b/plugins/restful/group_config_handle.c index c1d9f39e..612762dc 100644 --- a/plugins/restful/group_config_handle.c +++ b/plugins/restful/group_config_handle.c @@ -36,17 +36,21 @@ void handle_add_group_config(nng_aio *aio) { neu_plugin_t *plugin = neu_rest_get_plugin(); - REST_PROCESS_HTTP_REQUEST( + REST_PROCESS_HTTP_REQUEST_WITH_ERROR( aio, neu_parse_add_group_config_req_t, neu_parse_decode_add_group_config, { neu_taggrp_config_t *gconfig = neu_taggrp_cfg_new(req->name); neu_taggrp_cfg_set_interval(gconfig, req->interval); - intptr_t err = + error.error = neu_system_add_group_config(plugin, req->node_id, gconfig); - if (err != 0) { - http_bad_request(aio, "{\"error\": 1}"); + + neu_json_encode_by_fn(&error, neu_parse_encode_error, + &result_error); + if (error.error != 0) { + http_bad_request(aio, result_error); + neu_taggrp_cfg_free(gconfig); } else { - http_ok(aio, "{\"error\": 0}"); + http_created(aio, result_error); } }) } @@ -55,17 +59,19 @@ void handle_del_group_config(nng_aio *aio) { neu_plugin_t *plugin = neu_rest_get_plugin(); - REST_PROCESS_HTTP_REQUEST( + REST_PROCESS_HTTP_REQUEST_WITH_ERROR( aio, neu_parse_del_group_config_req_t, neu_parse_decode_del_group_config, { neu_taggrp_config_t *config = neu_system_find_group_config(plugin, req->node_id, req->name); neu_datatag_table_t *table = neu_system_get_datatags_table(plugin, req->node_id); - intptr_t err = 0; if (config == NULL || table == NULL) { - http_not_found(aio, "{\"error\" : 1}"); + error.error = NEU_ERR_GRP_CONFIG_NOT_EXIST; + neu_json_encode_by_fn(&error, neu_parse_encode_error, + &result_error); + http_not_found(aio, result_error); } else { vector_t *ids = neu_taggrp_cfg_get_datatag_ids(config); @@ -76,12 +82,14 @@ void handle_del_group_config(nng_aio *aio) neu_datatag_tbl_remove(table, *id); } - err = neu_system_del_group_config(plugin, req->node_id, - req->name); - if (err != 0) { - http_bad_request(aio, "{\"error\": 1}"); + error.error = neu_system_del_group_config(plugin, req->node_id, + req->name); + neu_json_encode_by_fn(&error, neu_parse_encode_error, + &result_error); + if (error.error != 0) { + http_bad_request(aio, result_error); } else { - http_ok(aio, "{\"error\": 0}"); + http_ok(aio, result_error); } } }) @@ -91,22 +99,27 @@ void handle_update_group_config(nng_aio *aio) { neu_plugin_t *plugin = neu_rest_get_plugin(); - REST_PROCESS_HTTP_REQUEST( + REST_PROCESS_HTTP_REQUEST_WITH_ERROR( aio, neu_parse_update_group_config_req_t, neu_parse_decode_update_group_config, { neu_taggrp_config_t *config = neu_system_find_group_config(plugin, req->node_id, req->name); if (config == NULL) { - http_not_found(aio, "{\"error\": 1}"); + error.error = NEU_ERR_GRP_CONFIG_NOT_EXIST; + neu_json_encode_by_fn(&error, neu_parse_encode_error, + &result_error); + http_not_found(aio, result_error); } else { neu_taggrp_cfg_set_interval(config, req->interval); - intptr_t err = neu_system_update_group_config( + error.error = neu_system_update_group_config( plugin, req->node_id, config); - if (err != 0) { - http_bad_request(aio, "{\"error\": 1}"); + neu_json_encode_by_fn(&error, neu_parse_encode_error, + &result_error); + if (error.error != 0) { + http_bad_request(aio, result_error); } else { - http_ok(aio, "{\"error\": 0}"); + http_ok(aio, result_error); } } }) @@ -114,12 +127,15 @@ void handle_update_group_config(nng_aio *aio) void handle_get_group_config(nng_aio *aio) { - neu_plugin_t *plugin = neu_rest_get_plugin(); - char * result = NULL; - char * s_node_id = http_get_param(aio, "id"); + neu_plugin_t * plugin = neu_rest_get_plugin(); + char * result = NULL; + char * s_node_id = http_get_param(aio, "node_id"); + neu_parse_error_t error = { 0 }; if (s_node_id == NULL) { - http_bad_request(aio, "{\"error\": 1}"); + error.error = NEU_ERR_PARAM_IS_WRONG; + neu_json_encode_by_fn(&error, neu_parse_encode_error, &result); + http_bad_request(aio, result); return; } diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 6e60e982..6a1f94c2 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -527,28 +527,19 @@ static int adapter_command(neu_adapter_t *adapter, neu_request_t *cmd, } case NEU_REQRESP_ADD_GRP_CONFIG: { - ADAPTER_RESP_CODE(adapter, cmd, intptr_t, neu_cmd_add_grp_config_t, rv, - NEU_REQRESP_ERR_CODE, p_result, { - ret = NEU_ERR_SUCCESS; - rv = neu_manager_add_grp_config(adapter->manager, - req_cmd); - if (rv != 0) { - ret = NEU_ERR_FAILURE; - } - }); + ADAPTER_RESP_CODE( + adapter, cmd, intptr_t, neu_cmd_add_grp_config_t, rv, + NEU_REQRESP_ERR_CODE, p_result, + { ret = neu_manager_add_grp_config(adapter->manager, req_cmd); }); break; } case NEU_REQRESP_DEL_GRP_CONFIG: { ADAPTER_RESP_CODE(adapter, cmd, intptr_t, neu_cmd_del_grp_config_t, rv, NEU_REQRESP_ERR_CODE, p_result, { - ret = NEU_ERR_SUCCESS; - rv = neu_manager_del_grp_config( + ret = neu_manager_del_grp_config( adapter->manager, req_cmd->node_id, req_cmd->config_name); - if (rv != 0) { - ret = NEU_ERR_FAILURE; - } }); break; } @@ -556,12 +547,8 @@ static int adapter_command(neu_adapter_t *adapter, neu_request_t *cmd, case NEU_REQRESP_UPDATE_GRP_CONFIG: { ADAPTER_RESP_CODE(adapter, cmd, intptr_t, neu_cmd_update_grp_config_t, rv, NEU_REQRESP_ERR_CODE, p_result, { - ret = NEU_ERR_SUCCESS; - rv = neu_manager_update_grp_config( + ret = neu_manager_update_grp_config( adapter->manager, req_cmd); - if (rv != 0) { - ret = NEU_ERR_FAILURE; - } }); break; } diff --git a/src/core/neu_manager.c b/src/core/neu_manager.c index c1a8ae48..d246e23c 100644 --- a/src/core/neu_manager.c +++ b/src/core/neu_manager.c @@ -1587,7 +1587,7 @@ int neu_manager_add_grp_config(neu_manager_t * manager, reg_entity = find_reg_adapter_by_id(&manager->reg_adapters, adapter_id); if (reg_entity == NULL) { log_error("Can't find matched src registered adapter"); - rv = -1; + rv = NEU_ERR_NODE_NOT_EXIST; goto add_grp_config_exit; } @@ -1600,13 +1600,13 @@ add_grp_config_exit: int neu_manager_del_grp_config(neu_manager_t *manager, neu_node_id_t node_id, const char *config_name) { - int rv = 0; + int rv = NEU_ERR_SUCCESS; adapter_id_t adapter_id; adapter_reg_entity_t *reg_entity; if (manager == NULL || config_name == NULL) { log_error("Delete group config NULL manager or config_name"); - return -1; + return NEU_ERR_EINTERNAL; } nng_mtx_lock(manager->adapters_mtx); @@ -1614,7 +1614,7 @@ int neu_manager_del_grp_config(neu_manager_t *manager, neu_node_id_t node_id, reg_entity = find_reg_adapter_by_id(&manager->reg_adapters, adapter_id); if (reg_entity == NULL) { log_error("Can't find matched registered adapter"); - rv = -1; + rv = NEU_ERR_NODE_NOT_EXIST; goto del_grp_config_exit; } @@ -1622,6 +1622,7 @@ int neu_manager_del_grp_config(neu_manager_t *manager, neu_node_id_t node_id, config_name); if (rv != 0) { log_error("Failed to delete datatag group config: %s", config_name); + rv = NEU_ERR_EINTERNAL; } del_grp_config_exit: nng_mtx_unlock(manager->adapters_mtx); @@ -1631,18 +1632,18 @@ del_grp_config_exit: int neu_manager_update_grp_config(neu_manager_t * manager, neu_cmd_update_grp_config_t *cmd) { - int rv = 0; + int rv = NEU_ERR_SUCCESS; adapter_id_t adapter_id; adapter_reg_entity_t *reg_entity; if (manager == NULL || cmd == NULL) { log_error("Update group config with NULL manager or command"); - return -1; + return NEU_ERR_EINTERNAL; } if (cmd->grp_config == NULL) { log_error("group config is NULL"); - return -1; + return NEU_ERR_EINTERNAL; } nng_mtx_lock(manager->adapters_mtx); @@ -1650,7 +1651,7 @@ int neu_manager_update_grp_config(neu_manager_t * manager, reg_entity = find_reg_adapter_by_id(&manager->reg_adapters, adapter_id); if (reg_entity == NULL) { log_error("Can't find matched src or dst registered adapter"); - rv = -1; + rv = NEU_ERR_NODE_NOT_EXIST; goto update_grp_config_exit; } @@ -1660,6 +1661,7 @@ int neu_manager_update_grp_config(neu_manager_t * manager, log_error("Failed to update datatag group config: %s", neu_taggrp_cfg_get_name(cmd->grp_config)); neu_taggrp_cfg_free(cmd->grp_config); + rv = NEU_ERR_EINTERNAL; } update_grp_config_exit: