Remove standard state definitions

They are not being validated and can be replaced by user.

BUG:25328223
Change-Id: If3afc7dac8d40a91ef98f40b89c481f59c2e5ddd
Reviewed-on: https://weave-review.googlesource.com/1423
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave/src/base_api_handler.cc b/libweave/src/base_api_handler.cc
index 52b5399..5cebb87 100644
--- a/libweave/src/base_api_handler.cc
+++ b/libweave/src/base_api_handler.cc
@@ -22,8 +22,15 @@
 BaseApiHandler::BaseApiHandler(DeviceRegistrationInfo* device_info,
                                Device* device)
     : device_info_{device_info}, device_{device} {
-  device_info_->GetMutableConfig()->AddOnChangedCallback(base::Bind(
-      &BaseApiHandler::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
+  device_->AddStateDefinitionsFromJson(R"({
+    "base": {
+      "firmwareVersion": "string",
+      "localDiscoveryEnabled": "boolean",
+      "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
+      "localPairingEnabled": "boolean"
+    }
+  })");
+  OnConfigChanged(device_->GetSettings());
 
   const auto& settings = device_info_->GetSettings();
   base::DictionaryValue state;
@@ -45,6 +52,9 @@
   device_->AddCommandHandler("base.updateDeviceInfo",
                              base::Bind(&BaseApiHandler::UpdateDeviceInfo,
                                         weak_ptr_factory_.GetWeakPtr()));
+
+  device_info_->GetMutableConfig()->AddOnChangedCallback(base::Bind(
+      &BaseApiHandler::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
 }
 
 void BaseApiHandler::UpdateBaseConfiguration(
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc
index 172c8f1..565c6aa 100644
--- a/libweave/src/base_api_handler_unittest.cc
+++ b/libweave/src/base_api_handler_unittest.cc
@@ -23,6 +23,7 @@
 using testing::Eq;
 using testing::Invoke;
 using testing::Return;
+using testing::ReturnRef;
 using testing::StrictMock;
 
 namespace weave {
@@ -37,8 +38,12 @@
     command_manager_->Startup();
 
     state_manager_ = std::make_shared<StateManager>(&mock_state_change_queue_);
-    state_manager_->Startup();
 
+    EXPECT_CALL(device_, AddStateDefinitionsFromJson(_))
+        .WillRepeatedly(Invoke([this](const std::string& json) {
+          EXPECT_TRUE(
+              state_manager_->LoadStateDefinitionFromJson(json, nullptr));
+        }));
     EXPECT_CALL(device_, SetStateProperties(_, _))
         .WillRepeatedly(
             Invoke(state_manager_.get(), &StateManager::SetProperties));
@@ -58,6 +63,10 @@
     dev_reg_.reset(new DeviceRegistrationInfo(command_manager_, state_manager_,
                                               std::move(config), nullptr,
                                               &http_client_, nullptr));
+
+    EXPECT_CALL(device_, GetSettings())
+        .WillRepeatedly(ReturnRef(dev_reg_->GetSettings()));
+
     handler_.reset(new BaseApiHandler{dev_reg_.get(), &device_});
   }
 
@@ -75,6 +84,17 @@
               command_manager_->FindCommand(id)->GetState());
   }
 
+  std::unique_ptr<base::DictionaryValue> GetBaseState() {
+    auto state = state_manager_->GetState();
+    std::set<std::string> result;
+    for (base::DictionaryValue::Iterator it{*state}; !it.IsAtEnd();
+         it.Advance()) {
+      if (it.key() != "base")
+        state->Remove(it.key(), nullptr);
+    }
+    return state;
+  }
+
   provider::test::MockConfigStore config_store_;
   StrictMock<provider::test::MockHttpClient> http_client_;
   std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
@@ -106,11 +126,10 @@
       'firmwareVersion': 'TEST_FIRMWARE',
       'localAnonymousAccessMaxRole': 'none',
       'localDiscoveryEnabled': false,
-      'localPairingEnabled': false,
-      'network': {}
+      'localPairingEnabled': false
     }
   })";
-  EXPECT_JSON_EQ(expected, *state_manager_->GetState());
+  EXPECT_JSON_EQ(expected, *GetBaseState());
 
   AddCommand(R"({
     'name' : 'base.updateBaseConfiguration',
@@ -128,11 +147,10 @@
       'firmwareVersion': 'TEST_FIRMWARE',
       'localAnonymousAccessMaxRole': 'user',
       'localDiscoveryEnabled': true,
-      'localPairingEnabled': true,
-      'network': {}
+      'localPairingEnabled': true
     }
   })";
-  EXPECT_JSON_EQ(expected, *state_manager_->GetState());
+  EXPECT_JSON_EQ(expected, *GetBaseState());
 
   {
     Config::Transaction change{dev_reg_->GetMutableConfig()};
@@ -143,11 +161,10 @@
       'firmwareVersion': 'TEST_FIRMWARE',
       'localAnonymousAccessMaxRole': 'viewer',
       'localDiscoveryEnabled': true,
-      'localPairingEnabled': true,
-      'network': {}
+      'localPairingEnabled': true
     }
   })";
-  EXPECT_JSON_EQ(expected, *state_manager_->GetState());
+  EXPECT_JSON_EQ(expected, *GetBaseState());
 }
 
 TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
diff --git a/libweave/src/commands/standard_definitions.cc b/libweave/src/commands/standard_definitions.cc
index b6f839a..4c20984 100644
--- a/libweave/src/commands/standard_definitions.cc
+++ b/libweave/src/commands/standard_definitions.cc
@@ -39,27 +39,4 @@
   }
 })";
 
-const char kStandardStateDefs[] = R"({
-  "base": {
-    "firmwareVersion": "string",
-    "localDiscoveryEnabled": "boolean",
-    "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
-    "localPairingEnabled": "boolean",
-    "network": {
-      "properties": {
-        "name": "string"
-      }
-    }
-  }
-})";
-
-const char kStandardStateDefaults[] = R"({
-  "base": {
-    "firmwareVersion": "unknown",
-    "localDiscoveryEnabled": false,
-    "localAnonymousAccessMaxRole": "none",
-    "localPairingEnabled": false
-  }
-})";
-
 }  // namespace weave
diff --git a/libweave/src/commands/standard_definitions.h b/libweave/src/commands/standard_definitions.h
index eeba38a..9c9f3e1 100644
--- a/libweave/src/commands/standard_definitions.h
+++ b/libweave/src/commands/standard_definitions.h
@@ -8,8 +8,6 @@
 namespace weave {
 
 extern const char kStandardCommandDefs[];
-extern const char kStandardStateDefs[];
-extern const char kStandardStateDefaults[];
 
 }  // namespace weave
 
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index a0c6199..1b21961 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -37,7 +37,6 @@
   command_manager_->Startup();
   state_change_queue_.reset(new StateChangeQueue(kMaxStateChangeQueueSize));
   state_manager_ = std::make_shared<StateManager>(state_change_queue_.get());
-  state_manager_->Startup();
 
   std::unique_ptr<Config> config{new Config{config_store}};
   config->Load();
diff --git a/libweave/src/states/state_manager.cc b/libweave/src/states/state_manager.cc
index e13babc..268dd04 100644
--- a/libweave/src/states/state_manager.cc
+++ b/libweave/src/states/state_manager.cc
@@ -28,19 +28,6 @@
   callback.Run();  // Force to read current state.
 }
 
-void StateManager::Startup() {
-  LOG(INFO) << "Initializing StateManager.";
-
-  // Load standard device state definition.
-  CHECK(LoadStandardStateDefinition(kStandardStateDefs, nullptr));
-
-  // Load standard device state defaults.
-  CHECK(SetPropertiesFromJson(kStandardStateDefaults, nullptr));
-
-  for (const auto& cb : on_changed_)
-    cb.Run();
-}
-
 std::unique_ptr<base::DictionaryValue> StateManager::GetState() const {
   std::unique_ptr<base::DictionaryValue> dict{new base::DictionaryValue};
   for (const auto& pair : packages_) {
@@ -164,20 +151,6 @@
   return true;
 }
 
-bool StateManager::LoadStandardStateDefinition(const std::string& json,
-                                               ErrorPtr* error) {
-  std::unique_ptr<const base::DictionaryValue> dict = LoadJsonDict(json, error);
-  if (!dict)
-    return false;
-  if (!LoadStateDefinition(*dict, error)) {
-    Error::AddToPrintf(
-        error, FROM_HERE, errors::kErrorDomain, errors::kSchemaError,
-        "Failed to load base state definition: '%s'", json.c_str());
-    return false;
-  }
-  return true;
-}
-
 bool StateManager::SetProperties(const base::DictionaryValue& dict,
                                  ErrorPtr* error) {
   base::Time timestamp = base::Time::Now();
diff --git a/libweave/src/states/state_manager.h b/libweave/src/states/state_manager.h
index b714c51..55faf76 100644
--- a/libweave/src/states/state_manager.h
+++ b/libweave/src/states/state_manager.h
@@ -45,10 +45,6 @@
                    ErrorPtr* error);
   std::unique_ptr<base::DictionaryValue> GetState() const;
 
-  // Initializes the state manager and load device state fragments.
-  // Called by Buffet daemon at startup.
-  void Startup();
-
   // Returns the recorded state changes since last time this method has been
   // called.
   std::pair<StateChangeQueueInterface::UpdateID, std::vector<StateChange>>
@@ -73,11 +69,6 @@
                         const base::Time& timestamp,
                         ErrorPtr* error);
 
-  // Loads the base device state fragment JSON. This state fragment
-  // defines the standard state properties from the 'base' package as defined
-  // by GCD specification.
-  bool LoadStandardStateDefinition(const std::string& json, ErrorPtr* error);
-
   // Finds a package by its name. Returns nullptr if not found.
   StatePackage* FindPackage(const std::string& package_name);
   const StatePackage* FindPackage(const std::string& package_name) const;
diff --git a/libweave/src/states/state_manager_unittest.cc b/libweave/src/states/state_manager_unittest.cc
index b62dc10..3f854fe 100644
--- a/libweave/src/states/state_manager_unittest.cc
+++ b/libweave/src/states/state_manager_unittest.cc
@@ -135,19 +135,34 @@
 TEST_F(StateManagerTest, Startup) {
   StateManager manager(&mock_state_change_queue_);
 
-  manager.Startup();
-  ASSERT_TRUE(manager.LoadStateDefinitionFromJson(
-      R"({"power": {"battery_level":"integer"}})", nullptr));
-  ASSERT_TRUE(manager.SetPropertiesFromJson(
-      R"({"power": {"battery_level":44}})", nullptr));
+  auto state_definition = R"({
+    "base": {
+      "firmwareVersion": "string",
+      "localDiscoveryEnabled": "boolean",
+      "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
+      "localPairingEnabled": "boolean"
+    },
+    "power": {"battery_level":"integer"}
+  })";
+  ASSERT_TRUE(manager.LoadStateDefinitionFromJson(state_definition, nullptr));
+
+  auto state_values = R"({
+    "base": {
+      "firmwareVersion": "unknown",
+      "localDiscoveryEnabled": false,
+      "localAnonymousAccessMaxRole": "none",
+      "localPairingEnabled": false
+    },
+    "power": {"battery_level":44}
+  })";
+  ASSERT_TRUE(manager.SetPropertiesFromJson(state_values, nullptr));
 
   auto expected = R"({
     'base': {
       'firmwareVersion': 'unknown',
       'localAnonymousAccessMaxRole': 'none',
       'localDiscoveryEnabled': false,
-      'localPairingEnabled': false,
-      'network': {}
+      'localPairingEnabled': false
     },
     'power': {
       'battery_level': 44