mirror of
https://github.com/emqx/neuron.git
synced 2026-10-27 12:28:44 +08:00
280 lines
9.3 KiB
C++
280 lines
9.3 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include "neuron.h"
|
|
|
|
#include "mqtt/schema.h"
|
|
|
|
int64_t global_timestamp = 0;
|
|
zlog_category_t *neuron = NULL;
|
|
|
|
TEST(validate_success, schema)
|
|
{
|
|
const char *schema =
|
|
"{\"timestamp\":\"${timestamp}\",\"node\":\"${node}\",\"group\":\"${"
|
|
"group}\",\"tags\":\"${tag_values}\",\"static\":\"${static_"
|
|
"tags}\",\"errors\":\"${tag_errors}\", \"xxxxx\":\"yyy\"}";
|
|
mqtt_schema_vt_t *vts;
|
|
size_t n_vts;
|
|
int ret = mqtt_schema_validate(schema, &vts, &n_vts);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_EQ(n_vts, 7);
|
|
|
|
EXPECT_STREQ(vts[0].name, "timestamp");
|
|
EXPECT_EQ(vts[0].vt, MQTT_SCHEMA_TIMESTAMP);
|
|
|
|
EXPECT_STREQ(vts[1].name, "node");
|
|
EXPECT_EQ(vts[1].vt, MQTT_SCHEMA_NODE_NAME);
|
|
|
|
EXPECT_STREQ(vts[2].name, "group");
|
|
EXPECT_EQ(vts[2].vt, MQTT_SCHEMA_GROUP_NAME);
|
|
|
|
EXPECT_STREQ(vts[3].name, "tags");
|
|
EXPECT_EQ(vts[3].vt, MQTT_SCHEMA_TAGVALUES);
|
|
|
|
EXPECT_STREQ(vts[4].name, "static");
|
|
EXPECT_EQ(vts[4].vt, MQTT_SCHEMA_STATIC_TAGS);
|
|
|
|
EXPECT_STREQ(vts[5].name, "errors");
|
|
EXPECT_EQ(vts[5].vt, MQTT_SCHEMA_TAG_ERRORS);
|
|
|
|
EXPECT_STREQ(vts[6].name, "xxxxx");
|
|
EXPECT_EQ(vts[6].vt, MQTT_SCHEMA_UD);
|
|
EXPECT_STREQ(vts[6].ud, "yyy");
|
|
|
|
free(vts);
|
|
}
|
|
|
|
TEST(validate_deep_success, schema)
|
|
{
|
|
const char *schema = "{\"timestamp\": \"${timestamp}\", \"object\": "
|
|
"{\"group\":\"${group}\", \"sub_object\": "
|
|
"{\"tags\":\"${tags}\", \"cus\":\"aabb\"}}}";
|
|
mqtt_schema_vt_t *vts;
|
|
size_t n_vts;
|
|
int ret = mqtt_schema_validate(schema, &vts, &n_vts);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_EQ(n_vts, 2);
|
|
|
|
EXPECT_STREQ(vts[0].name, "timestamp");
|
|
EXPECT_EQ(vts[0].vt, MQTT_SCHEMA_TIMESTAMP);
|
|
|
|
EXPECT_STREQ(vts[1].name, "object");
|
|
EXPECT_EQ(vts[1].vt, MQTT_SCHEMA_OBJECT);
|
|
EXPECT_EQ(vts[1].n_sub_vts, 2);
|
|
|
|
EXPECT_STREQ(vts[1].sub_vts[0].name, "group");
|
|
EXPECT_EQ(vts[1].sub_vts[0].vt, MQTT_SCHEMA_GROUP_NAME);
|
|
|
|
EXPECT_STREQ(vts[1].sub_vts[1].name, "sub_object");
|
|
EXPECT_EQ(vts[1].sub_vts[1].vt, MQTT_SCHEMA_OBJECT);
|
|
EXPECT_EQ(vts[1].sub_vts[1].n_sub_vts, 2);
|
|
|
|
EXPECT_STREQ(vts[1].sub_vts[1].sub_vts[0].name, "tags");
|
|
EXPECT_EQ(vts[1].sub_vts[1].sub_vts[0].vt, MQTT_SCHEMA_TAGS);
|
|
|
|
EXPECT_STREQ(vts[1].sub_vts[1].sub_vts[1].name, "cus");
|
|
EXPECT_EQ(vts[1].sub_vts[1].sub_vts[1].vt, MQTT_SCHEMA_UD);
|
|
|
|
for (size_t i = 0; i < n_vts; i++) {
|
|
if (vts[i].vt == MQTT_SCHEMA_OBJECT) {
|
|
for (size_t k = 0; k < vts[i].n_sub_vts; k++) {
|
|
if (vts[i].sub_vts[k].vt == MQTT_SCHEMA_OBJECT) {
|
|
free(vts[i].sub_vts[k].sub_vts);
|
|
}
|
|
}
|
|
free(vts[i].sub_vts);
|
|
}
|
|
}
|
|
|
|
free(vts);
|
|
}
|
|
|
|
TEST(validate_constants, schema)
|
|
{
|
|
const char *schema =
|
|
"{\"string\":\"value\",\"integer\":1234,\"float\":11.44,"
|
|
"\"boolean\":true,\"object\":{\"integer\":-42,\"float\":0.5,"
|
|
"\"boolean\":false}}";
|
|
mqtt_schema_vt_t *vts = NULL;
|
|
size_t n_vts;
|
|
int ret = mqtt_schema_validate(schema, &vts, &n_vts);
|
|
|
|
ASSERT_EQ(ret, 0);
|
|
ASSERT_EQ(n_vts, 5);
|
|
EXPECT_EQ(vts[0].jtype, NEU_JSON_STR);
|
|
EXPECT_STREQ(vts[0].ud, "value");
|
|
EXPECT_EQ(vts[1].jtype, NEU_JSON_INT);
|
|
EXPECT_EQ(vts[1].jvalue.val_int, 1234);
|
|
EXPECT_EQ(vts[2].jtype, NEU_JSON_DOUBLE);
|
|
EXPECT_EQ(vts[2].jvalue.val_double, 11.44);
|
|
EXPECT_EQ(vts[3].jtype, NEU_JSON_BOOL);
|
|
EXPECT_TRUE(vts[3].jvalue.val_bool);
|
|
|
|
ASSERT_EQ(vts[4].vt, MQTT_SCHEMA_OBJECT);
|
|
ASSERT_EQ(vts[4].n_sub_vts, 3);
|
|
EXPECT_EQ(vts[4].sub_vts[0].jvalue.val_int, -42);
|
|
EXPECT_EQ(vts[4].sub_vts[1].jvalue.val_double, 0.5);
|
|
EXPECT_FALSE(vts[4].sub_vts[2].jvalue.val_bool);
|
|
|
|
char * result = NULL;
|
|
neu_json_read_resp_t tags = { 0 };
|
|
ret = mqtt_schema_encode((char *) "driver", (char *) "group", &tags, vts,
|
|
n_vts, NULL, 0, &result);
|
|
ASSERT_EQ(ret, 0);
|
|
EXPECT_STREQ(result,
|
|
"{\"string\": \"value\", \"integer\": 1234, \"float\": "
|
|
"11.44, \"boolean\": true, \"object\": {\"integer\": -42, "
|
|
"\"float\": 0.5, \"boolean\": false}}");
|
|
|
|
free(result);
|
|
free(vts[4].sub_vts);
|
|
free(vts);
|
|
}
|
|
|
|
TEST(validate_failed, schema)
|
|
{
|
|
const char *schema =
|
|
"{\"timestamp\":\"${timestamp}\",\"node\":\"${node}\",\"group\":\"${"
|
|
"group}\",\"tags\":\"${tag_values1}\",\"static\":\"${static_"
|
|
"tags}\",\"errors\":\"${tag_errors}\", \"xxxxx\":\"yyy\"}";
|
|
mqtt_schema_vt_t *vts;
|
|
size_t n_vts;
|
|
int ret = mqtt_schema_validate(schema, &vts, &n_vts);
|
|
EXPECT_EQ(ret, -1);
|
|
}
|
|
|
|
TEST(validate_success, schema_static)
|
|
{
|
|
const char *static_tags =
|
|
"{\"static_tags\": {\"static_tag1\":\"string\", "
|
|
"\"static_tag2\": 1234,\"static_tag3\": 11.44, "
|
|
"\"static_tag4\": true, \"static_tag5\": "
|
|
"[1,3,4], \"static_tag6\": {\"sub\": 13}, \"static_tag7\": {\"sub1\": "
|
|
"{\"sub2\": \"string\"}} }}";
|
|
|
|
mqtt_static_vt_t *vts = NULL;
|
|
size_t n_vts;
|
|
|
|
int ret = mqtt_static_validate(static_tags, &vts, &n_vts);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_EQ(n_vts, 7);
|
|
|
|
EXPECT_STREQ(vts[0].name, "static_tag1");
|
|
EXPECT_EQ(vts[0].jtype, NEU_JSON_STR);
|
|
EXPECT_STREQ(vts[0].jvalue.val_str, "string");
|
|
|
|
EXPECT_STREQ(vts[1].name, "static_tag2");
|
|
EXPECT_EQ(vts[1].jtype, NEU_JSON_INT);
|
|
EXPECT_EQ(vts[1].jvalue.val_int, 1234);
|
|
|
|
EXPECT_STREQ(vts[2].name, "static_tag3");
|
|
EXPECT_EQ(vts[2].jtype, NEU_JSON_DOUBLE);
|
|
EXPECT_EQ(vts[2].jvalue.val_double, 11.44);
|
|
|
|
EXPECT_STREQ(vts[3].name, "static_tag4");
|
|
EXPECT_EQ(vts[3].jtype, NEU_JSON_BOOL);
|
|
EXPECT_EQ(vts[3].jvalue.val_bool, true);
|
|
|
|
EXPECT_STREQ(vts[4].name, "static_tag5");
|
|
EXPECT_EQ(vts[4].jtype, NEU_JSON_STR);
|
|
|
|
EXPECT_STREQ(vts[5].name, "static_tag6");
|
|
EXPECT_EQ(vts[5].jtype, NEU_JSON_STR);
|
|
|
|
EXPECT_STREQ(vts[6].name, "static_tag7");
|
|
EXPECT_EQ(vts[6].jtype, NEU_JSON_STR);
|
|
|
|
mqtt_static_free(vts, n_vts);
|
|
}
|
|
|
|
TEST(schema_encode_deep, schema_encode)
|
|
{
|
|
const char *schema = "{\"timestamp\": \"${timestamp}\", \"object\": "
|
|
"{\"group\":\"${group}\", \"sub_object\": "
|
|
"{\"node\":\"${node}\", \"cus\":\"aabb\"}}}";
|
|
mqtt_schema_vt_t *vts;
|
|
size_t n_vts;
|
|
int ret = mqtt_schema_validate(schema, &vts, &n_vts);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_EQ(n_vts, 2);
|
|
|
|
char * result = NULL;
|
|
neu_json_read_resp_t tags = { 0 };
|
|
ret = mqtt_schema_encode((char *) "driver", (char *) "group", &tags, vts,
|
|
n_vts, NULL, 0, &result);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_STREQ(result,
|
|
"{\"timestamp\": 0, \"object\": {\"group\": \"group\", "
|
|
"\"sub_object\": {\"node\": \"driver\", \"cus\": \"aabb\"}}}");
|
|
free(result);
|
|
|
|
for (size_t i = 0; i < n_vts; i++) {
|
|
if (vts[i].vt == MQTT_SCHEMA_OBJECT) {
|
|
for (size_t k = 0; k < vts[i].n_sub_vts; k++) {
|
|
if (vts[i].sub_vts[k].vt == MQTT_SCHEMA_OBJECT) {
|
|
free(vts[i].sub_vts[k].sub_vts);
|
|
}
|
|
}
|
|
free(vts[i].sub_vts);
|
|
}
|
|
}
|
|
|
|
free(vts);
|
|
}
|
|
|
|
TEST(schema_encode, schema_static)
|
|
{
|
|
const char *schema =
|
|
"{\"timestamp\":\"${timestamp}\",\"node\":\"${node}\",\"group\":\"${"
|
|
"group}\",\"tags\":\"${tag_values}\",\"static\":\"${static_"
|
|
"tags}\",\"errors\":\"${tag_errors}\", \"xxxxx\":\"yyy\"}";
|
|
mqtt_schema_vt_t *schema_vts;
|
|
size_t schema_n_vts;
|
|
int ret = mqtt_schema_validate(schema, &schema_vts, &schema_n_vts);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_EQ(schema_n_vts, 7);
|
|
|
|
const char *static_tags =
|
|
"{\"static_tags\": {\"static_tag1\":\"string\", "
|
|
"\"static_tag2\": 1234,\"static_tag3\": 11.44, "
|
|
"\"static_tag4\": true, \"static_tag5\": "
|
|
"[1,3,4], \"static_tag6\": {\"sub\": 13}, \"static_tag7\": {\"sub1\": "
|
|
"{\"sub2\": \"string\"}} }}";
|
|
|
|
mqtt_static_vt_t *vts = NULL;
|
|
size_t n_vts;
|
|
|
|
ret = mqtt_static_validate(static_tags, &vts, &n_vts);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_EQ(n_vts, 7);
|
|
|
|
char * result = NULL;
|
|
neu_json_read_resp_t tags = { 0 };
|
|
ret = mqtt_schema_encode((char *) "driver", (char *) "group", &tags,
|
|
schema_vts, schema_n_vts, vts, n_vts, &result);
|
|
EXPECT_EQ(ret, 0);
|
|
EXPECT_STREQ(
|
|
result,
|
|
"{\"timestamp\": 0, \"node\": \"driver\", \"group\": \"group\", "
|
|
"\"tags\": {}, \"static\": [{\"name\": \"static_tag1\", \"value\": "
|
|
"\"string\"}, {\"name\": \"static_tag2\", \"value\": 1234}, {\"name\": "
|
|
"\"static_tag3\", \"value\": 11.44}, {\"name\": \"static_tag4\", "
|
|
"\"value\": true}, {\"name\": \"static_tag5\", \"value\": \"[1, 3, "
|
|
"4]\"}, {\"name\": \"static_tag6\", \"value\": \"{\\\"sub\\\": 13}\"}, "
|
|
"{\"name\": \"static_tag7\", \"value\": \"{\\\"sub1\\\": "
|
|
"{\\\"sub2\\\": \\\"string\\\"}}\"}], \"errors\": [], \"xxxxx\": "
|
|
"\"yyy\"}");
|
|
|
|
mqtt_static_free(vts, n_vts);
|
|
free(schema_vts);
|
|
free(result);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
zlog_init("./config/dev.conf");
|
|
neuron = zlog_get_category("neuron");
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|