Add weave::State::SetStateProperty and weave::State::GetStateProperty BUG:24267885 Change-Id: Ibbeae3b852fec7cebdd8e3c0de05921fc2036c68 Reviewed-on: https://weave-review.googlesource.com/1222 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/examples/ubuntu/main.cc b/libweave/examples/ubuntu/main.cc index 43c13ec..ef5f4e6 100644 --- a/libweave/examples/ubuntu/main.cc +++ b/libweave/examples/ubuntu/main.cc
@@ -54,8 +54,7 @@ ++counter_); device_->GetState()->SetProperties(state, nullptr); - LOG(INFO) << "New state: " - << *device_->GetState()->GetStateValuesAsJson(); + LOG(INFO) << "New state: " << *device_->GetState()->GetState(); cmd->Done(); } else {
diff --git a/libweave/include/weave/state.h b/libweave/include/weave/state.h index f1f57e6..211838f 100644 --- a/libweave/include/weave/state.h +++ b/libweave/include/weave/state.h
@@ -15,14 +15,23 @@ // Sets callback which is called when stat is changed. virtual void AddOnChangedCallback(const base::Closure& callback) = 0; - // Updates a multiple property values. + // Returns value of the single property. + // |name| is full property name, including package name. e.g. "base.network". + virtual std::unique_ptr<base::Value> GetStateProperty( + const std::string& name) = 0; + + // Sets value of the single property. + // |name| is full property name, including package name. e.g. "base.network". + virtual bool SetStateProperty(const std::string& name, + const base::Value& value, + ErrorPtr* error) = 0; + + // Updates multiple property values. virtual bool SetProperties(const base::DictionaryValue& property_set, ErrorPtr* error) = 0; - // Returns aggregated state properties across all registered packages as - // a JSON object that can be used to send the device state to the GCD server. - virtual std::unique_ptr<base::DictionaryValue> GetStateValuesAsJson() - const = 0; + // Returns aggregated state properties across all registered packages. + virtual std::unique_ptr<base::DictionaryValue> GetState() const = 0; protected: virtual ~State() = default;
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc index 1dc843d..1f1fc75 100644 --- a/libweave/src/base_api_handler_unittest.cc +++ b/libweave/src/base_api_handler_unittest.cc
@@ -132,7 +132,7 @@ 'network': {} } })"; - EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *state_manager_->GetState()); AddCommand(R"({ 'name' : 'base.updateBaseConfiguration', @@ -154,7 +154,7 @@ 'network': {} } })"; - EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *state_manager_->GetState()); { Config::Transaction change{dev_reg_->GetMutableConfig()}; @@ -169,7 +169,7 @@ 'network': {} } })"; - EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *state_manager_->GetState()); } TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc index 610871f..f93c652 100644 --- a/libweave/src/device_registration_info.cc +++ b/libweave/src/device_registration_info.cc
@@ -485,8 +485,7 @@ if (!commands) return nullptr; - std::unique_ptr<base::DictionaryValue> state = - state_manager_->GetStateValuesAsJson(); + std::unique_ptr<base::DictionaryValue> state = state_manager_->GetState(); CHECK(state); std::unique_ptr<base::DictionaryValue> resource{new base::DictionaryValue};
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc index 2a60de0..f6a1558 100644 --- a/libweave/src/privet/cloud_delegate.cc +++ b/libweave/src/privet/cloud_delegate.cc
@@ -254,7 +254,7 @@ void OnStateChanged() { state_.Clear(); - auto state = state_manager_->GetStateValuesAsJson(); + auto state = state_manager_->GetState(); CHECK(state); state_.MergeDictionary(state.get()); NotifyOnStateChanged();
diff --git a/libweave/src/states/state_manager.cc b/libweave/src/states/state_manager.cc index a04b3e9..1f17307 100644 --- a/libweave/src/states/state_manager.cc +++ b/libweave/src/states/state_manager.cc
@@ -75,8 +75,7 @@ cb.Run(); } -std::unique_ptr<base::DictionaryValue> StateManager::GetStateValuesAsJson() - const { +std::unique_ptr<base::DictionaryValue> StateManager::GetState() const { std::unique_ptr<base::DictionaryValue> dict{new base::DictionaryValue}; for (const auto& pair : packages_) { auto pkg_value = pair.second->GetValuesAsJson(); @@ -103,6 +102,27 @@ return all_success; } +bool StateManager::SetStateProperty(const std::string& name, + const base::Value& value, + ErrorPtr* error) { + return SetPropertyValue(name, value, base::Time::Now(), error); +} + +std::unique_ptr<base::Value> StateManager::GetStateProperty( + const std::string& name) { + auto parts = SplitAtFirst(name, ".", true); + const std::string& package_name = parts.first; + const std::string& property_name = parts.second; + if (package_name.empty() || property_name.empty()) + return nullptr; + + StatePackage* package = FindPackage(package_name); + if (!package) + return nullptr; + + return package->GetPropertyValue(property_name, nullptr); +} + bool StateManager::SetPropertyValue(const std::string& full_property_name, const base::Value& value, const base::Time& timestamp,
diff --git a/libweave/src/states/state_manager.h b/libweave/src/states/state_manager.h index 88e28c0..bfa43e7 100644 --- a/libweave/src/states/state_manager.h +++ b/libweave/src/states/state_manager.h
@@ -43,7 +43,12 @@ void AddOnChangedCallback(const base::Closure& callback) override; bool SetProperties(const base::DictionaryValue& property_set, ErrorPtr* error) override; - std::unique_ptr<base::DictionaryValue> GetStateValuesAsJson() const override; + std::unique_ptr<base::Value> GetStateProperty( + const std::string& name) override; + bool SetStateProperty(const std::string& name, + const base::Value& value, + ErrorPtr* error) override; + std::unique_ptr<base::DictionaryValue> GetState() const override; // Initializes the state manager and load device state fragments. // Called by Buffet daemon at startup.
diff --git a/libweave/src/states/state_manager_unittest.cc b/libweave/src/states/state_manager_unittest.cc index 8d07e65..d02b57f 100644 --- a/libweave/src/states/state_manager_unittest.cc +++ b/libweave/src/states/state_manager_unittest.cc
@@ -109,7 +109,7 @@ 'state_property': '' } })"; - EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *mgr_->GetState()); } TEST_F(StateManagerTest, LoadStateDefinition) { @@ -134,7 +134,7 @@ 'state_property': '' } })"; - EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *mgr_->GetState()); } TEST_F(StateManagerTest, Startup) { @@ -163,7 +163,7 @@ 'battery_level': 44 } })"; - EXPECT_JSON_EQ(expected, *manager.GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *manager.GetState()); } TEST_F(StateManagerTest, SetPropertyValue) { @@ -184,7 +184,7 @@ 'state_property': 'Test Value' } })"; - EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *mgr_->GetState()); } TEST_F(StateManagerTest, SetPropertyValue_Error_NoName) { @@ -259,7 +259,14 @@ 'state_property': '' } })"; - EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson()); + EXPECT_JSON_EQ(expected, *mgr_->GetState()); +} + +TEST_F(StateManagerTest, GetProperty) { + EXPECT_JSON_EQ("'Test Model'", *mgr_->GetStateProperty("base.serialNumber")); + EXPECT_JSON_EQ("''", *mgr_->GetStateProperty("device.state_property")); + EXPECT_EQ(nullptr, mgr_->GetStateProperty("device.unknown")); + EXPECT_EQ(nullptr, mgr_->GetStateProperty("unknown.state_property")); } } // namespace weave