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;