From 166f5bb0bead20e77756f6cf99f28195484cae62 Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Fri, 4 Oct 2024 14:26:46 +0300 Subject: [PATCH] [resourcemanager] Parse all node config JSON fields Signed-off-by: Mykhailo Lohvynenko --- src/resourcemanager/resourcemanager.cpp | 299 +++++++++++++++++++++++- src/resourcemanager/resourcemanager.hpp | 8 +- tests/resourcemanager/src/main.cpp | 244 +++++++++++++++++-- 3 files changed, 522 insertions(+), 29 deletions(-) diff --git a/src/resourcemanager/resourcemanager.cpp b/src/resourcemanager/resourcemanager.cpp index f109503d..ebf46092 100644 --- a/src/resourcemanager/resourcemanager.cpp +++ b/src/resourcemanager/resourcemanager.cpp @@ -16,21 +16,292 @@ namespace aos::zephyr::resourcemanager { * Static **********************************************************************************************************************/ +namespace { + +/** + * Device. + */ +struct Device { + const char* name; + const char* hostDevices[aos::cMaxNumHostDevices]; + size_t hostDevicesLen; + int sharedCount; + const char* groups[aos::cMaxNumGroups]; + size_t groupsLen; +}; + +/** + * FS mount. + */ +struct FSMount { + const char* destination; + const char* source; + const char* type; + const char* options[aos::cFSMountMaxNumOptions]; + size_t optionsLen; +}; + +/** + * Host. + */ +struct Host { + const char* ip; + const char* hostName; +}; + +/** + * Resource. + */ +struct Resource { + const char* name; + const char* groups[aos::cMaxNumGroups]; + size_t groupsLen; + FSMount mounts[aos::cMaxNumFSMounts]; + size_t mountsLen; + const char* env[aos::cMaxNumEnvVariables]; + size_t envLen; + Host hosts[aos::cMaxNumHosts]; + size_t hostsLen; +}; + /** * Node config. */ struct NodeConfig { - const char* version = ""; - const char* nodeType = ""; - uint32_t priority = 0; + // cppcheck-suppress unusedStructMember + const char* version; + // cppcheck-suppress unusedStructMember + const char* nodeType; + Device devices[aos::cMaxNumDevices]; + size_t devicesLen; + Resource resources[aos::cMaxNumNodeResources]; + size_t resourcesLen; + // cppcheck-suppress unusedStructMember + const char* labels[aos::cMaxNumNodeLabels]; + // cppcheck-suppress unusedStructMember + size_t labelsLen; + // cppcheck-suppress unusedStructMember + uint32_t priority; }; +} // namespace + +/** + * Device json object descriptor. + */ +static const struct json_obj_descr cDeviceDescr[] = { + JSON_OBJ_DESCR_PRIM(Device, name, JSON_TOK_STRING), + JSON_OBJ_DESCR_ARRAY(Device, hostDevices, aos::cMaxNumHostDevices, hostDevicesLen, JSON_TOK_STRING), + JSON_OBJ_DESCR_PRIM(Device, sharedCount, JSON_TOK_NUMBER), + JSON_OBJ_DESCR_ARRAY(Device, groups, aos::cMaxNumGroups, groupsLen, JSON_TOK_STRING), +}; + +/** + * FS mount json object descriptor. + */ +static const struct json_obj_descr cFSMountDescr[] = { + JSON_OBJ_DESCR_PRIM(FSMount, destination, JSON_TOK_STRING), + JSON_OBJ_DESCR_PRIM(FSMount, source, JSON_TOK_STRING), + JSON_OBJ_DESCR_PRIM(FSMount, type, JSON_TOK_STRING), + JSON_OBJ_DESCR_ARRAY(FSMount, options, aos::cFSMountMaxNumOptions, optionsLen, JSON_TOK_STRING), +}; + +/** + * Host json object descriptor. + */ +static const struct json_obj_descr cHostDescr[] = { + JSON_OBJ_DESCR_PRIM(Host, ip, JSON_TOK_STRING), + JSON_OBJ_DESCR_PRIM(Host, hostName, JSON_TOK_STRING), +}; + +/** + * Resource json object descriptor. + */ +static const struct json_obj_descr cResourceDescr[] = { + JSON_OBJ_DESCR_PRIM(Resource, name, JSON_TOK_STRING), + JSON_OBJ_DESCR_ARRAY(Resource, groups, aos::cMaxNumGroups, groupsLen, JSON_TOK_STRING), + JSON_OBJ_DESCR_OBJ_ARRAY( + Resource, mounts, aos::cMaxNumFSMounts, mountsLen, cFSMountDescr, ARRAY_SIZE(cFSMountDescr)), + JSON_OBJ_DESCR_ARRAY(Resource, env, aos::cMaxNumEnvVariables, envLen, JSON_TOK_STRING), + JSON_OBJ_DESCR_OBJ_ARRAY(Resource, hosts, aos::cMaxNumHosts, hostsLen, cHostDescr, ARRAY_SIZE(cHostDescr)), +}; + +/** + * Node config json object descriptor. + */ static const struct json_obj_descr cNodeConfigDescr[] = { JSON_OBJ_DESCR_PRIM(NodeConfig, version, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(NodeConfig, nodeType, JSON_TOK_STRING), + JSON_OBJ_DESCR_OBJ_ARRAY( + NodeConfig, devices, aos::cMaxNumDevices, devicesLen, cDeviceDescr, ARRAY_SIZE(cDeviceDescr)), + JSON_OBJ_DESCR_OBJ_ARRAY( + NodeConfig, resources, aos::cMaxNumNodeResources, resourcesLen, cResourceDescr, ARRAY_SIZE(cResourceDescr)), + JSON_OBJ_DESCR_ARRAY(NodeConfig, labels, aos::cMaxNumNodeLabels, labelsLen, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(NodeConfig, priority, JSON_TOK_NUMBER), }; +/*********************************************************************************************************************** + * Private + **********************************************************************************************************************/ + +static void FillJSONStruct(const Array& inDevices, NodeConfig& jsonNodeConfig) +{ + jsonNodeConfig.devicesLen = inDevices.Size(); + + for (size_t i = 0; i < inDevices.Size(); ++i) { + const auto& inDevice = inDevices[i]; + auto& jsonDevice = jsonNodeConfig.devices[i]; + + jsonDevice.name = inDevice.mName.CStr(); + jsonDevice.sharedCount = inDevice.mSharedCount; + jsonDevice.groupsLen = inDevice.mGroups.Size(); + jsonDevice.hostDevicesLen = inDevice.mHostDevices.Size(); + + for (size_t j = 0; j < inDevice.mGroups.Size(); ++j) { + jsonDevice.groups[j] = inDevice.mGroups[j].CStr(); + } + + for (size_t j = 0; j < inDevice.mHostDevices.Size(); ++j) { + jsonDevice.hostDevices[j] = inDevice.mHostDevices[j].CStr(); + } + } +} + +static void FillJSONStruct(const Array& inResources, NodeConfig& jsonNodeConfig) +{ + jsonNodeConfig.resourcesLen = inResources.Size(); + + for (size_t i = 0; i < inResources.Size(); ++i) { + const auto& inResource = inResources[i]; + auto& jsonResource = jsonNodeConfig.resources[i]; + + jsonResource.name = inResource.mName.CStr(); + jsonResource.groupsLen = inResource.mGroups.Size(); + + for (size_t j = 0; j < inResource.mGroups.Size(); ++j) { + jsonResource.groups[j] = inResource.mGroups[j].CStr(); + } + + jsonResource.mountsLen = inResource.mMounts.Size(); + + for (size_t j = 0; j < inResource.mMounts.Size(); ++j) { + const auto& inMount = inResource.mMounts[j]; + auto& outMount = jsonResource.mounts[j]; + + outMount.destination = inMount.mDestination.CStr(); + outMount.source = inMount.mSource.CStr(); + outMount.type = inMount.mType.CStr(); + outMount.optionsLen = inMount.mOptions.Size(); + + for (size_t k = 0; k < inMount.mOptions.Size(); ++k) { + outMount.options[k] = inMount.mOptions[k].CStr(); + } + } + + jsonResource.envLen = inResource.mEnv.Size(); + + for (size_t j = 0; j < inResource.mEnv.Size(); ++j) { + jsonResource.env[j] = inResource.mEnv[j].CStr(); + } + + jsonResource.hostsLen = inResource.mHosts.Size(); + + for (size_t j = 0; j < inResource.mHosts.Size(); ++j) { + const auto& inHost = inResource.mHosts[j]; + auto& outHost = jsonResource.hosts[j]; + + outHost.ip = inHost.mIP.CStr(); + outHost.hostName = inHost.mHostname.CStr(); + } + } +} + +static Error FillAosStruct(const NodeConfig& in, Array& outDevices) +{ + if (auto err = outDevices.Resize(in.devicesLen); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + for (size_t i = 0; i < in.devicesLen; ++i) { + const auto& inDeviceInfo = in.devices[i]; + DeviceInfo& outDeviceInfo = outDevices[i]; + + outDeviceInfo.mName = inDeviceInfo.name; + outDeviceInfo.mSharedCount = inDeviceInfo.sharedCount; + + for (size_t j = 0; j < inDeviceInfo.groupsLen; ++j) { + if (auto err = outDeviceInfo.mGroups.PushBack(inDeviceInfo.groups[j]); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } + + for (size_t j = 0; j < inDeviceInfo.hostDevicesLen; ++j) { + if (auto err = outDeviceInfo.mHostDevices.PushBack(inDeviceInfo.hostDevices[j]); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } + } + + return ErrorEnum::eNone; +} + +static Error FillAosStruct(const NodeConfig& in, Array& outResources) +{ + if (auto err = outResources.Resize(in.resourcesLen); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + for (size_t i = 0; i < in.resourcesLen; ++i) { + const auto& inResourceInfo = in.resources[i]; + ResourceInfo& outResourceInfo = outResources[i]; + + outResourceInfo.mName = inResourceInfo.name; + + for (size_t j = 0; j < inResourceInfo.groupsLen; ++j) { + if (auto err = outResourceInfo.mGroups.PushBack(inResourceInfo.groups[j]); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } + + if (auto err = outResourceInfo.mMounts.Resize(inResourceInfo.mountsLen); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + for (size_t j = 0; j < inResourceInfo.mountsLen; ++j) { + const auto& parsedMount = inResourceInfo.mounts[j]; + + aos::FileSystemMount& mount = outResourceInfo.mMounts[j]; + + mount.mDestination = parsedMount.destination; + mount.mType = parsedMount.type; + mount.mSource = parsedMount.source; + + for (size_t k = 0; k < parsedMount.optionsLen; ++k) { + if (auto err = mount.mOptions.PushBack(parsedMount.options[k]); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } + } + + for (size_t j = 0; j < inResourceInfo.envLen; ++j) { + if (auto err = outResourceInfo.mEnv.PushBack(inResourceInfo.env[j]); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } + + if (auto err = outResourceInfo.mHosts.Resize(inResourceInfo.hostsLen); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + for (size_t j = 0; j < inResourceInfo.hostsLen; ++j) { + outResourceInfo.mHosts[j].mIP = inResourceInfo.hosts[j].ip; + outResourceInfo.mHosts[j].mHostname = inResourceInfo.hosts[j].hostName; + } + } + + return ErrorEnum::eNone; +} + /*********************************************************************************************************************** * JSONProvider **********************************************************************************************************************/ @@ -48,6 +319,14 @@ Error JSONProvider::DumpNodeConfig(const sm::resourcemanager::NodeConfig& config jsonNodeConfig->nodeType = config.mNodeConfig.mNodeType.CStr(); jsonNodeConfig->priority = config.mNodeConfig.mPriority; + FillJSONStruct(config.mNodeConfig.mDevices, *jsonNodeConfig); + FillJSONStruct(config.mNodeConfig.mResources, *jsonNodeConfig); + + jsonNodeConfig->labelsLen = config.mNodeConfig.mLabels.Size(); + for (size_t i = 0; i < config.mNodeConfig.mLabels.Size(); ++i) { + jsonNodeConfig->labels[i] = config.mNodeConfig.mLabels[i].CStr(); + } + auto ret = json_obj_encode_buf( cNodeConfigDescr, ARRAY_SIZE(cNodeConfigDescr), jsonNodeConfig.Get(), json.Get(), json.MaxSize()); if (ret < 0) { @@ -81,6 +360,20 @@ Error JSONProvider::ParseNodeConfig(const String& json, sm::resourcemanager::Nod config.mNodeConfig.mNodeType = parsedNodeConfig->nodeType; config.mNodeConfig.mPriority = parsedNodeConfig->priority; + if (auto err = FillAosStruct(*parsedNodeConfig, config.mNodeConfig.mDevices); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + if (auto err = FillAosStruct(*parsedNodeConfig, config.mNodeConfig.mResources); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + for (size_t i = 0; i < parsedNodeConfig->labelsLen; ++i) { + if (auto err = config.mNodeConfig.mLabels.PushBack(parsedNodeConfig->labels[i]); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } + return ErrorEnum::eNone; } diff --git a/src/resourcemanager/resourcemanager.hpp b/src/resourcemanager/resourcemanager.hpp index 2159800c..f424ae69 100644 --- a/src/resourcemanager/resourcemanager.hpp +++ b/src/resourcemanager/resourcemanager.hpp @@ -39,11 +39,9 @@ class JSONProvider : public sm::resourcemanager::JSONProviderItf { Error ParseNodeConfig(const String& json, sm::resourcemanager::NodeConfig& config) const override; private: - static constexpr size_t cJsonMaxContentLen = 1024; - - mutable Mutex mMutex; - mutable StaticString mJSONBuffer; - mutable StaticAllocator mAllocator; + mutable Mutex mMutex; + mutable StaticString mJSONBuffer; + mutable StaticAllocator mAllocator; }; /** diff --git a/tests/resourcemanager/src/main.cpp b/tests/resourcemanager/src/main.cpp index 0a6d8598..65bdcd58 100644 --- a/tests/resourcemanager/src/main.cpp +++ b/tests/resourcemanager/src/main.cpp @@ -7,7 +7,6 @@ #include -#include #include #include @@ -22,42 +21,245 @@ using namespace aos::zephyr; * Consts **********************************************************************************************************************/ -static constexpr auto cTestNodeConfigJSON = R"({"nodeType":"mainType","priority":1,"version":"1.0.0"})"; +static constexpr auto cTestNodeConfigJSON = R"({ + "devices": [ + { + "groups": [ + "group1", + "group2" + ], + "hostDevices": [ + "hostDevice1", + "hostDevice2" + ], + "name": "device1", + "sharedCount": 1 + }, + { + "groups": [ + "group3", + "group4" + ], + "hostDevices": [ + "hostDevice3", + "hostDevice4" + ], + "name": "device2", + "sharedCount": 2 + } + ], + "resources": [ + { + "name": "resource1", + "groups": ["g1", "g2"], + "mounts": [ + { + "destination": "d1", + "type": "type1", + "source": "source1", + "options": ["option1", "option2"] + }, + { + "destination": "d2", + "type": "type2", + "source": "source2", + "options": ["option3", "option4"] + } + ], + "env": ["env1", "env2"], + "hosts": [ + { + "ip": "10.0.0.100", + "hostName": "host1" + }, + { + "ip": "10.0.0.101", + "hostName": "host2" + } + ] + }, + { + "name": "resource2", + "groups": ["g3", "g4"], + "mounts": [ + { + "destination": "d3", + "type": "type3", + "source": "source3", + "options": ["option5", "option6"] + }, + { + "destination": "d4", + "type": "type4", + "source": "source4", + "options": ["option7", "option8"] + } + ], + "env": ["env3", "env4"], + "hosts": [ + { + "ip": "10.0.0.102", + "hostName": "host3" + }, + { + "ip": "10.0.0.103", + "hostName": "host4" + } + ] + } + ], + "labels": [ + "mainNode" + ], + "nodeType": "mainType", + "priority": 1, + "version": "1.0.0" +} + +)"; + +/*********************************************************************************************************************** + * Static + **********************************************************************************************************************/ + +static aos::sm::resourcemanager::NodeConfig CreateNodeConfig() +{ + aos::sm::resourcemanager::NodeConfig nodeConfig; + + nodeConfig.mVersion = "1.0.0"; + nodeConfig.mNodeConfig.mPriority = 1; + nodeConfig.mNodeConfig.mNodeType = "mainType"; + + nodeConfig.mNodeConfig.mDevices.Resize(2); + + nodeConfig.mNodeConfig.mDevices[0].mName = "device1"; + nodeConfig.mNodeConfig.mDevices[0].mSharedCount = 1; + nodeConfig.mNodeConfig.mDevices[0].mGroups.PushBack("group1"); + nodeConfig.mNodeConfig.mDevices[0].mGroups.PushBack("group2"); + nodeConfig.mNodeConfig.mDevices[0].mHostDevices.PushBack("hostDevice1"); + nodeConfig.mNodeConfig.mDevices[0].mHostDevices.PushBack("hostDevice2"); + + nodeConfig.mNodeConfig.mDevices[1].mName = "device2"; + nodeConfig.mNodeConfig.mDevices[1].mSharedCount = 2; + nodeConfig.mNodeConfig.mDevices[1].mGroups.PushBack("group3"); + nodeConfig.mNodeConfig.mDevices[1].mGroups.PushBack("group4"); + nodeConfig.mNodeConfig.mDevices[1].mHostDevices.PushBack("hostDevice3"); + nodeConfig.mNodeConfig.mDevices[1].mHostDevices.PushBack("hostDevice4"); + + nodeConfig.mNodeConfig.mResources.Resize(2); + + nodeConfig.mNodeConfig.mResources[0].mName = "resource1"; + nodeConfig.mNodeConfig.mResources[0].mGroups.PushBack("g1"); + nodeConfig.mNodeConfig.mResources[0].mGroups.PushBack("g2"); + + nodeConfig.mNodeConfig.mResources[0].mMounts.Resize(2); + nodeConfig.mNodeConfig.mResources[0].mMounts[0].mDestination = "d1"; + nodeConfig.mNodeConfig.mResources[0].mMounts[0].mType = "type1"; + nodeConfig.mNodeConfig.mResources[0].mMounts[0].mSource = "source1"; + nodeConfig.mNodeConfig.mResources[0].mMounts[0].mOptions.PushBack("option1"); + nodeConfig.mNodeConfig.mResources[0].mMounts[0].mOptions.PushBack("option2"); + + nodeConfig.mNodeConfig.mResources[0].mMounts[1].mDestination = "d2"; + nodeConfig.mNodeConfig.mResources[0].mMounts[1].mType = "type2"; + nodeConfig.mNodeConfig.mResources[0].mMounts[1].mSource = "source2"; + nodeConfig.mNodeConfig.mResources[0].mMounts[1].mOptions.PushBack("option3"); + nodeConfig.mNodeConfig.mResources[0].mMounts[1].mOptions.PushBack("option4"); + + nodeConfig.mNodeConfig.mResources[0].mEnv.PushBack("env1"); + nodeConfig.mNodeConfig.mResources[0].mEnv.PushBack("env2"); + + nodeConfig.mNodeConfig.mResources[0].mHosts.Resize(2); + nodeConfig.mNodeConfig.mResources[0].mHosts[0].mIP = "10.0.0.100"; + nodeConfig.mNodeConfig.mResources[0].mHosts[0].mHostname = "host1"; + + nodeConfig.mNodeConfig.mResources[0].mHosts[1].mIP = "10.0.0.101"; + nodeConfig.mNodeConfig.mResources[0].mHosts[1].mHostname = "host2"; + + nodeConfig.mNodeConfig.mResources[1].mName = "resource2"; + nodeConfig.mNodeConfig.mResources[1].mGroups.PushBack("g3"); + nodeConfig.mNodeConfig.mResources[1].mGroups.PushBack("g4"); + + nodeConfig.mNodeConfig.mResources[1].mMounts.Resize(2); + nodeConfig.mNodeConfig.mResources[1].mMounts[0].mDestination = "d3"; + nodeConfig.mNodeConfig.mResources[1].mMounts[0].mType = "type3"; + nodeConfig.mNodeConfig.mResources[1].mMounts[0].mSource = "source3"; + nodeConfig.mNodeConfig.mResources[1].mMounts[0].mOptions.PushBack("option5"); + nodeConfig.mNodeConfig.mResources[1].mMounts[0].mOptions.PushBack("option6"); + + nodeConfig.mNodeConfig.mResources[1].mMounts[1].mDestination = "d4"; + nodeConfig.mNodeConfig.mResources[1].mMounts[1].mType = "type4"; + nodeConfig.mNodeConfig.mResources[1].mMounts[1].mSource = "source4"; + nodeConfig.mNodeConfig.mResources[1].mMounts[1].mOptions.PushBack("option7"); + nodeConfig.mNodeConfig.mResources[1].mMounts[1].mOptions.PushBack("option8"); + + nodeConfig.mNodeConfig.mResources[1].mEnv.PushBack("env3"); + nodeConfig.mNodeConfig.mResources[1].mEnv.PushBack("env4"); + + nodeConfig.mNodeConfig.mResources[1].mHosts.Resize(2); + nodeConfig.mNodeConfig.mResources[1].mHosts[0].mIP = "10.0.0.102"; + nodeConfig.mNodeConfig.mResources[1].mHosts[0].mHostname = "host3"; + nodeConfig.mNodeConfig.mResources[1].mHosts[1].mIP = "10.0.0.103"; + nodeConfig.mNodeConfig.mResources[1].mHosts[1].mHostname = "host4"; + + nodeConfig.mNodeConfig.mLabels.PushBack("mainNode"); + + return nodeConfig; +} + +static void CompareNodeConfig(const aos::sm::resourcemanager::NodeConfig& nodeConfig, + const aos::sm::resourcemanager::NodeConfig& expectedNodeConfig) +{ + zassert_equal(nodeConfig.mVersion, expectedNodeConfig.mVersion, "Version mismatch"); + zassert_equal(nodeConfig.mNodeConfig.mNodeType, expectedNodeConfig.mNodeConfig.mNodeType, "Node type mismatch"); + zassert_equal(nodeConfig.mNodeConfig.mPriority, expectedNodeConfig.mNodeConfig.mPriority, "Priority mismatch"); + + zassert_equal(nodeConfig.mNodeConfig.mDevices, expectedNodeConfig.mNodeConfig.mDevices, "Device info mismatch"); + zassert_equal(nodeConfig.mNodeConfig.mLabels, expectedNodeConfig.mNodeConfig.mLabels, "Node labels mismatch"); + + // Compare resources + + zassert_equal(nodeConfig.mNodeConfig.mResources.Size(), expectedNodeConfig.mNodeConfig.mResources.Size(), + "Resources size mismatch"); + + for (size_t i = 0; i < nodeConfig.mNodeConfig.mResources.Size(); ++i) { + const auto& resource = nodeConfig.mNodeConfig.mResources[i]; + const auto& expectedResource = expectedNodeConfig.mNodeConfig.mResources[i]; + + zassert_equal(resource.mName, expectedResource.mName, "Resource name mismatch"); + zassert_equal(resource.mGroups, expectedResource.mGroups, "Resource groups mismatch"); + zassert_equal(resource.mMounts, expectedResource.mMounts, "Resource mounts mismatch"); + zassert_equal(resource.mEnv, expectedResource.mEnv, "Resource envs mismatch"); + zassert_equal(resource.mHosts, expectedResource.mHosts, "Resource hosts mismatch"); + } +} /*********************************************************************************************************************** * Tests **********************************************************************************************************************/ -ZTEST_SUITE(resourcemanager, NULL, NULL, NULL, NULL, NULL); +ZTEST_SUITE( + resourcemanager, NULL, NULL, [](void*) { aos::Log::SetCallback(TestLogCallback); }, NULL, NULL); ZTEST(resourcemanager, test_JSONProviderParse) { - aos::Log::SetCallback(TestLogCallback); - aos::zephyr::resourcemanager::JSONProvider provider; - aos::sm::resourcemanager::NodeConfig nodeConfig; + aos::sm::resourcemanager::NodeConfig parsedNodeConfig; aos::String jsonStr(cTestNodeConfigJSON); - auto err = provider.ParseNodeConfig(jsonStr, nodeConfig); + auto err = provider.ParseNodeConfig(jsonStr, parsedNodeConfig); + + zassert_true(err.IsNone(), "Failed to parse node config: %s", utils::ErrorToCStr(err)); - zassert_true(err.IsNone(), "Failed to parse node config: %s", err.Message()); - zassert_equal(1, nodeConfig.mNodeConfig.mPriority, "Priority mismatch"); - zassert_equal(nodeConfig.mVersion, "1.0.0", "File content mismatch"); - zassert_equal(nodeConfig.mNodeConfig.mNodeType, "mainType", "Node type mismatch"); + CompareNodeConfig(parsedNodeConfig, CreateNodeConfig()); } ZTEST(resourcemanager, test_DumpNodeConfig) { - aos::Log::SetCallback(TestLogCallback); - aos::zephyr::resourcemanager::JSONProvider provider; - aos::sm::resourcemanager::NodeConfig nodeConfig; - nodeConfig.mNodeConfig.mPriority = 1; - nodeConfig.mVersion = "1.0.0"; - nodeConfig.mNodeConfig.mNodeType = "mainType"; + aos::sm::resourcemanager::NodeConfig nodeConfig = CreateNodeConfig(); - aos::StaticString<1024> jsonStr; - auto err = provider.DumpNodeConfig(nodeConfig, jsonStr); + aos::StaticString jsonStr; + auto err = provider.DumpNodeConfig(nodeConfig, jsonStr); zassert_true(err.IsNone(), "Failed to dump node config: %s", utils::ErrorToCStr(err)); zassert_false(jsonStr.IsEmpty(), "Empty json string"); @@ -66,6 +268,6 @@ ZTEST(resourcemanager, test_DumpNodeConfig) err = provider.ParseNodeConfig(jsonStr, parsedNodeConfig); zassert_true(err.IsNone(), "Failed to parse node config: %s", utils::ErrorToCStr(err)); - zassert_equal(nodeConfig.mNodeConfig, parsedNodeConfig.mNodeConfig, "Parsed node config mismatch"); - zassert_equal(nodeConfig.mVersion, parsedNodeConfig.mVersion, "Parsed unit config vendor version mismatch"); + + CompareNodeConfig(parsedNodeConfig, nodeConfig); }