Add support for legacy state/commandDefs to ComponentManager
Added methods to convert legacy state/stateDefs/commandDefs to
the new trait definitions and components and functions to convert
the trait definitions/component tree back to old commandDefs and
state.
Change-Id: Ia03142c53d00bbc4f880389166982167e3c8b1e9
Reviewed-on: https://weave-review.googlesource.com/1787
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/component_manager_unittest.cc b/src/component_manager_unittest.cc
index dcefebd..8c9b386 100644
--- a/src/component_manager_unittest.cc
+++ b/src/component_manager_unittest.cc
@@ -1126,6 +1126,225 @@
EXPECT_EQ("", manager.FindComponentWithTrait("trait4"));
}
+TEST(ComponentManager, AddLegacyCommandAndStateDefinitions) {
+ ComponentManagerImpl manager;
+ const char kCommandDefs1[] = R"({
+ "package1": {
+ "command1": {
+ "minimalRole": "user",
+ "parameters": {"height": {"type": "integer"}}
+ },
+ "command2": {
+ "minimalRole": "owner",
+ "parameters": {}
+ }
+ },
+ "package2": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" }
+ }
+ })";
+ auto json = CreateDictionaryValue(kCommandDefs1);
+ EXPECT_TRUE(manager.AddLegacyCommandDefinitions(*json, nullptr));
+ const char kExpected1[] = R"({
+ "package1": {
+ "commands": {
+ "command1": {
+ "minimalRole": "user",
+ "parameters": {"height": {"type": "integer"}}
+ },
+ "command2": {
+ "minimalRole": "owner",
+ "parameters": {}
+ }
+ }
+ },
+ "package2": {
+ "commands": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" }
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(kExpected1, manager.GetTraits());
+ const char kExpectedComponents1[] = R"({
+ "__weave__": { "traits": ["package1", "package2"] }
+ })";
+ EXPECT_JSON_EQ(kExpectedComponents1, manager.GetComponents());
+
+ const char kCommandDefs2[] = R"({
+ "package2": {
+ "command3": { "minimalRole": "user" }
+ },
+ "package3": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" }
+ }
+ })";
+ json = CreateDictionaryValue(kCommandDefs2);
+ EXPECT_TRUE(manager.AddLegacyCommandDefinitions(*json, nullptr));
+ const char kExpected2[] = R"({
+ "package1": {
+ "commands": {
+ "command1": {
+ "minimalRole": "user",
+ "parameters": {"height": {"type": "integer"}}
+ },
+ "command2": {
+ "minimalRole": "owner",
+ "parameters": {}
+ }
+ }
+ },
+ "package2": {
+ "commands": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" },
+ "command3": { "minimalRole": "user" }
+ }
+ },
+ "package3": {
+ "commands": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" }
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(kExpected2, manager.GetTraits());
+ const char kExpectedComponents2[] = R"({
+ "__weave__": { "traits": ["package1", "package2", "package3"] }
+ })";
+ EXPECT_JSON_EQ(kExpectedComponents2, manager.GetComponents());
+
+ // Redefining existing commands.
+ EXPECT_FALSE(manager.AddLegacyCommandDefinitions(*json, nullptr));
+
+ const char kStateDefs1[] = R"({
+ "package1": {
+ "prop1": { "type": "string" },
+ "prop2": { "type": "string" }
+ },
+ "package4": {
+ "prop3": { "type": "string" },
+ "prop4": { "type": "string" }
+ }
+ })";
+ json = CreateDictionaryValue(kStateDefs1);
+ EXPECT_TRUE(manager.AddLegacyStateDefinitions(*json, nullptr));
+ const char kExpectedComponents3[] = R"({
+ "__weave__": { "traits": ["package1", "package2", "package3", "package4"] }
+ })";
+ EXPECT_JSON_EQ(kExpectedComponents3, manager.GetComponents());
+
+ const char kExpected3[] = R"({
+ "package1": {
+ "commands": {
+ "command1": {
+ "minimalRole": "user",
+ "parameters": {"height": {"type": "integer"}}
+ },
+ "command2": {
+ "minimalRole": "owner",
+ "parameters": {}
+ }
+ },
+ "state": {
+ "prop1": { "type": "string" },
+ "prop2": { "type": "string" }
+ }
+ },
+ "package2": {
+ "commands": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" },
+ "command3": { "minimalRole": "user" }
+ }
+ },
+ "package3": {
+ "commands": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" }
+ }
+ },
+ "package4": {
+ "state": {
+ "prop3": { "type": "string" },
+ "prop4": { "type": "string" }
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(kExpected3, manager.GetTraits());
+ const char kExpectedComponents4[] = R"({
+ "__weave__": { "traits": ["package1", "package2", "package3", "package4"] }
+ })";
+ EXPECT_JSON_EQ(kExpectedComponents4, manager.GetComponents());
+
+ // Redefining existing commands.
+ EXPECT_FALSE(manager.AddLegacyStateDefinitions(*json, nullptr));
+
+ const char kExpected4[] = R"({
+ "package1": {
+ "command1": {
+ "minimalRole": "user",
+ "parameters": {"height": {"type": "integer"}}
+ },
+ "command2": {
+ "minimalRole": "owner",
+ "parameters": {}
+ }
+ },
+ "package2": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" },
+ "command3": { "minimalRole": "user" }
+ },
+ "package3": {
+ "command1": { "minimalRole": "user" },
+ "command2": { "minimalRole": "owner" }
+ }
+ })";
+ EXPECT_JSON_EQ(kExpected4, manager.GetLegacyCommandDefinitions());
+}
+
+TEST(ComponentManager, GetLegacyState) {
+ ComponentManagerImpl manager;
+ const char kTraits[] = R"({
+ "trait1": {
+ "state": {
+ "prop1": { "type": "string" },
+ "prop2": { "type": "string" }
+ }
+ },
+ "trait2": {
+ "state": {
+ "prop3": { "type": "string" },
+ "prop4": { "type": "string" }
+ }
+ }
+ })";
+ auto traits = CreateDictionaryValue(kTraits);
+ ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
+ ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1"}, nullptr));
+ ASSERT_TRUE(manager.AddComponent("", "comp2", {"trait2"}, nullptr));
+
+ ASSERT_TRUE(manager.SetStatePropertiesFromJson(
+ "comp1", R"({"trait1": {"prop1": "foo", "prop2": "bar"}})", nullptr));
+ ASSERT_TRUE(manager.SetStatePropertiesFromJson(
+ "comp2", R"({"trait2": {"prop3": "baz", "prop4": "quux"}})", nullptr));
+
+ const char kExpected[] = R"({
+ "trait1": {
+ "prop1": "foo",
+ "prop2": "bar"
+ },
+ "trait2": {
+ "prop3": "baz",
+ "prop4": "quux"
+ }
+ })";
+ EXPECT_JSON_EQ(kExpected, manager.GetLegacyState());
+}
+
TEST(ComponentManager, TestMockComponentManager) {
// Check that all the virtual methods are mocked out.
MockComponentManager mock;