Merge pull request #1719 from eeff/eeff/dev

test(mqtt): add mqtt write tags ft
This commit is contained in:
fengzeroz
2023-12-06 17:31:30 +08:00
committed by GitHub
2 changed files with 110 additions and 79 deletions
+36 -50
View File
@@ -152,6 +152,38 @@ static inline int send_read_req(neu_plugin_t *plugin, neu_json_mqtt_t *mqtt,
return 0;
}
static int json_value_to_tag_value(union neu_json_value *req,
enum neu_json_type t, neu_dvalue_t *value)
{
switch (t) {
case NEU_JSON_INT:
value->type = NEU_TYPE_INT64;
value->value.u64 = req->val_int;
break;
case NEU_JSON_STR:
value->type = NEU_TYPE_STRING;
strncpy(value->value.str, req->val_str, sizeof(value->value.str));
break;
case NEU_JSON_DOUBLE:
value->type = NEU_TYPE_DOUBLE;
value->value.d64 = req->val_double;
break;
case NEU_JSON_BOOL:
value->type = NEU_TYPE_BOOL;
value->value.boolean = req->val_bool;
break;
case NEU_JSON_BYTES:
value->type = NEU_TYPE_BYTES;
value->value.bytes.length = req->val_bytes.length;
memcpy(value->value.bytes.bytes, req->val_bytes.bytes,
req->val_bytes.length);
break;
default:
return -1;
}
return 0;
}
static int send_write_tag_req(neu_plugin_t *plugin, neu_json_mqtt_t *mqtt,
neu_json_write_req_t *req)
{
@@ -168,30 +200,7 @@ static int send_write_tag_req(neu_plugin_t *plugin, neu_json_mqtt_t *mqtt,
cmd.group = req->group;
cmd.tag = req->tag;
switch (req->t) {
case NEU_JSON_INT:
cmd.value.type = NEU_TYPE_INT64;
cmd.value.value.u64 = req->value.val_int;
break;
case NEU_JSON_STR:
cmd.value.type = NEU_TYPE_STRING;
strcpy(cmd.value.value.str, req->value.val_str);
break;
case NEU_JSON_DOUBLE:
cmd.value.type = NEU_TYPE_DOUBLE;
cmd.value.value.d64 = req->value.val_double;
break;
case NEU_JSON_BOOL:
cmd.value.type = NEU_TYPE_BOOL;
cmd.value.value.boolean = req->value.val_bool;
break;
case NEU_JSON_BYTES:
cmd.value.type = NEU_TYPE_BYTES;
cmd.value.value.bytes.length = req->value.val_bytes.length;
memcpy(cmd.value.value.bytes.bytes, req->value.val_bytes.bytes,
req->value.val_bytes.length);
break;
default:
if (0 != json_value_to_tag_value(&req->value, req->t, &cmd.value)) {
plog_error(plugin, "invalid tag value type: %d", req->t);
return -1;
}
@@ -237,32 +246,9 @@ static int send_write_tags_req(neu_plugin_t *plugin, neu_json_mqtt_t *mqtt,
for (int i = 0; i < cmd.n_tag; i++) {
strcpy(cmd.tags[i].tag, req->tags[i].tag);
switch (req->tags[i].t) {
case NEU_JSON_INT:
cmd.tags[i].value.type = NEU_TYPE_INT64;
cmd.tags[i].value.value.u64 = req->tags[i].value.val_int;
break;
case NEU_JSON_STR:
cmd.tags[i].value.type = NEU_TYPE_STRING;
strcpy(cmd.tags[i].value.value.str, req->tags[i].value.val_str);
break;
case NEU_JSON_DOUBLE:
cmd.tags[i].value.type = NEU_TYPE_DOUBLE;
cmd.tags[i].value.value.d64 = req->tags[i].value.val_double;
break;
case NEU_JSON_BOOL:
cmd.tags[i].value.type = NEU_TYPE_BOOL;
cmd.tags[i].value.value.boolean = req->tags[i].value.val_bool;
break;
case NEU_JSON_BYTES:
cmd.tags[i].value.type = NEU_TYPE_BYTES;
cmd.tags[i].value.value.bytes.length =
req->tags[i].value.val_bytes.length;
memcpy(cmd.tags[i].value.value.bytes.bytes,
req->tags[i].value.val_bytes.bytes,
req->tags[i].value.val_bytes.length);
break;
default:
if (0 !=
json_value_to_tag_value(&req->tags[i].value, req->tags[i].t,
&cmd.tags[i].value)) {
plog_error(plugin, "invalid tag value type: %d", req->tags[i].t);
free(cmd.tags);
return -1;
+74 -29
View File
@@ -9,6 +9,7 @@ import neuron.config as config
from neuron.common import (
case_time,
class_setup_and_teardown,
compare_float,
description,
process,
random_port,
@@ -28,26 +29,26 @@ TAG0 = {
}
TAGS = [
{
"name": "hold_bit",
"address": "1!400002.15",
"attribute": config.NEU_TAG_ATTRIBUTE_READ,
"name": "tag1",
"address": "1!000001",
"attribute": config.NEU_TAG_ATTRIBUTE_RW,
"type": config.NEU_TYPE_BIT,
},
{
"name": "hold_float",
"name": "tag2",
"address": "1!400017",
"attribute": config.NEU_TAG_ATTRIBUTE_RW,
"type": config.NEU_TYPE_FLOAT,
},
{
"name": "hold_string",
"name": "tag3",
"address": "1!400020.10",
"attribute": config.NEU_TAG_ATTRIBUTE_RW,
"type": config.NEU_TYPE_STRING,
},
{
"name": "hold_bytes",
"address": "1!400040.10",
"name": "tag4",
"address": "1!400040.4",
"attribute": config.NEU_TAG_ATTRIBUTE_RW,
"type": config.NEU_TYPE_BYTES,
},
@@ -393,11 +394,11 @@ class TestMQTT:
def test_mqtt_connect_emqx(self, request, mocker, conf_emqx_ssl):
api.node_setting_check(NODE, conf_emqx_ssl)
api.node_ctl(NODE, config.NEU_CTL_START)
time.sleep(3)
response = api.get_nodes_state(NODE)
assert 200 == response.status_code
assert config.NEU_NODE_LINK_STATE_CONNECTED == response.json()["link"]
assert config.NEU_NODE_STATE_RUNNING == response.json()["running"]
# NOTE: unstable
# assert config.NEU_NODE_LINK_STATE_CONNECTED == response.json()["link"]
@description(
given="MQTT node",
@@ -591,27 +592,10 @@ class TestMQTT:
@description(
given="MQTT node",
when="write driver tag",
when="write a driver tag",
then="should success",
)
@pytest.mark.parametrize(
"req",
[
{
"tag": TAG0["name"],
"value": 1234,
},
{
"tags": [
{
"tag": TAG0["name"],
"value": 1234,
},
],
},
],
)
def test_mqtt_write(self, mocker, conf_base, req):
def test_mqtt_write_tag(self, mocker, conf_base):
api.node_setting_check(NODE, conf_base)
api.node_ctl(NODE, config.NEU_CTL_START)
@@ -619,7 +603,8 @@ class TestMQTT:
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"node": DRIVER,
"group": GROUP,
**req,
"tag": TAG0["name"],
"value": 1234,
}
msg = mocker.reqresp(WRITE_RESP_TOPIC, WRITE_REQ_TOPIC, req, timeout=3)
assert msg is not None
@@ -628,3 +613,63 @@ class TestMQTT:
time.sleep(INTERVAL * 5 / 1000)
assert 1234 == api.read_tag(DRIVER, GROUP, TAG0["name"])
@description(
given="MQTT node",
when="write driver many tags",
then="should success",
)
def test_mqtt_write_tags(self, mocker, conf_base):
api.node_setting_check(NODE, conf_base)
api.node_ctl(NODE, config.NEU_CTL_START)
req = {
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"node": DRIVER,
"group": GROUP,
"tags": [
{
"tag": TAG0["name"],
"value": 1234,
},
{
"tag": "tag1",
"value": True,
},
{
"tag": "tag2",
"value": 3.14,
},
{
"tag": "tag3",
"value": "hello",
},
{
"tag": "tag4",
"value": [1, 2, 3, 4],
},
],
}
try:
api.add_tags_check(DRIVER, GROUP, TAGS)
msg = mocker.reqresp(
WRITE_RESP_TOPIC, WRITE_REQ_TOPIC, req, timeout=3
)
assert msg is not None
assert req["uuid"] == msg["uuid"]
assert error.NEU_ERR_SUCCESS == msg["error"]
time.sleep(INTERVAL * 5 / 1000)
resp = api.read_tags(DRIVER, GROUP)
assert 200 == resp.status_code
resp_tags = sorted(resp.json()["tags"], key=lambda x: x["name"])
print(resp_tags)
req_tags = req["tags"]
assert req_tags[0]["value"] == resp_tags[0]["value"]
assert req_tags[1]["value"] == resp_tags[1]["value"]
assert compare_float(req_tags[2]["value"], resp_tags[2]["value"])
assert req_tags[3]["value"] == resp_tags[3]["value"]
assert req_tags[4]["value"] == resp_tags[4]["value"]
finally:
api.del_tags(DRIVER, GROUP, [tag["name"] for tag in TAGS])