Replace Get* methods returning unique_ptr with reference alternative Existing code created temporarily objects and returned them to the client. It was not efficient and error-prone as client code could retrieve pointers to internal objects without keeping unique_ptr alive. Change-Id: I9e17c8d9f66dfc9f52ce9ffc9a31992b16b00461 Reviewed-on: https://weave-review.googlesource.com/1672 Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/examples/daemon/ledflasher/ledflasher.cc b/examples/daemon/ledflasher/ledflasher.cc index 4733f18..9e4a9e1 100644 --- a/examples/daemon/ledflasher/ledflasher.cc +++ b/examples/daemon/ledflasher/ledflasher.cc
@@ -66,10 +66,10 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); int32_t led_index = 0; - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); bool cmd_value = false; - if (params->GetInteger("_led", &led_index) && - params->GetBoolean("_on", &cmd_value)) { + if (params.GetInteger("_led", &led_index) && + params.GetBoolean("_on", &cmd_value)) { // Display this command in terminal LOG(INFO) << cmd->GetName() << " _led: " << led_index << ", _on: " << (cmd_value ? "true" : "false"); @@ -96,9 +96,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); int32_t led_index = 0; - if (params->GetInteger("_led", &led_index)) { + if (params.GetInteger("_led", &led_index)) { LOG(INFO) << cmd->GetName() << " _led: " << led_index; led_index--; led_status_[led_index] = ~led_status_[led_index];
diff --git a/examples/daemon/light/light.cc b/examples/daemon/light/light.cc index 31e3a24..90680d2 100644 --- a/examples/daemon/light/light.cc +++ b/examples/daemon/light/light.cc
@@ -122,9 +122,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); int32_t brightness_value = 0; - if (params->GetInteger("brightness", &brightness_value)) { + if (params.GetInteger("brightness", &brightness_value)) { // Display this command in terminal. LOG(INFO) << cmd->GetName() << " brightness: " << brightness_value; @@ -146,9 +146,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); std::string requested_state; - if (params->GetString("state", &requested_state)) { + if (params.GetString("state", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; bool new_light_status = requested_state == "on"; @@ -172,9 +172,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); - base::DictionaryValue* colorXY = nullptr; - if (params->GetDictionary("_colorSetting", &colorXY)) { + const auto& params = cmd->GetParameters(); + const base::DictionaryValue* colorXY = nullptr; + if (params.GetDictionary("_colorSetting", &colorXY)) { bool updateState = false; double X = 0.0; double Y = 0.0;
diff --git a/examples/daemon/lock/lock.cc b/examples/daemon/lock/lock.cc index 860020c..10bea00 100644 --- a/examples/daemon/lock/lock.cc +++ b/examples/daemon/lock/lock.cc
@@ -72,9 +72,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); std::string requested_state; - if (params->GetString("lockedState", &requested_state)) { + if (params.GetString("lockedState", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; weave::lockstate::LockState new_lock_status;
diff --git a/examples/daemon/sample/sample.cc b/examples/daemon/sample/sample.cc index 2ad56e3..811e9fb 100644 --- a/examples/daemon/sample/sample.cc +++ b/examples/daemon/sample/sample.cc
@@ -69,9 +69,9 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); std::string name; - if (!params->GetString("_name", &name)) { + if (!params.GetString("_name", &name)) { weave::ErrorPtr error; weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", "Name is missing"); @@ -94,7 +94,7 @@ base::DictionaryValue state; state.SetInteger("_sample._ping_count", ++ping_count_); device_->SetStateProperties(state, nullptr); - LOG(INFO) << "New state: " << *device_->GetState(); + LOG(INFO) << "New state: " << device_->GetState(); base::DictionaryValue result; cmd->Complete(result, nullptr); @@ -108,9 +108,9 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); int seconds; - if (!params->GetInteger("_seconds", &seconds)) + if (!params.GetInteger("_seconds", &seconds)) seconds = 10; LOG(INFO) << "starting countdown"; @@ -123,9 +123,9 @@ return; if (seconds > 0) { - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); std::string todo; - params->GetString("_todo", &todo); + params.GetString("_todo", &todo); LOG(INFO) << "countdown tick: " << seconds << " seconds left"; base::DictionaryValue progress;
diff --git a/examples/daemon/speaker/speaker.cc b/examples/daemon/speaker/speaker.cc index 89595b0..cd7d62f 100644 --- a/examples/daemon/speaker/speaker.cc +++ b/examples/daemon/speaker/speaker.cc
@@ -72,10 +72,10 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); // Handle volume parameter int32_t volume_value = 0; - if (params->GetInteger("volume", &volume_value)) { + if (params.GetInteger("volume", &volume_value)) { // Display this command in terminal. LOG(INFO) << cmd->GetName() << " volume: " << volume_value; @@ -89,7 +89,7 @@ // Handle isMuted parameter bool isMuted_status = false; - if (params->GetBoolean("isMuted", &isMuted_status)) { + if (params.GetBoolean("isMuted", &isMuted_status)) { // Display this command in terminal. LOG(INFO) << cmd->GetName() << " is " << (isMuted_status ? "muted" : "not muted"); @@ -111,9 +111,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); - auto params = cmd->GetParameters(); + const auto& params = cmd->GetParameters(); std::string requested_state; - if (params->GetString("state", &requested_state)) { + if (params.GetString("state", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; bool new_speaker_status = requested_state == "on";
diff --git a/include/weave/command.h b/include/weave/command.h index 59a9305..08ea782 100644 --- a/include/weave/command.h +++ b/include/weave/command.h
@@ -40,13 +40,13 @@ virtual Command::Origin GetOrigin() const = 0; // Returns the command parameters. - virtual std::unique_ptr<base::DictionaryValue> GetParameters() const = 0; + virtual const base::DictionaryValue& GetParameters() const = 0; // Returns the command progress. - virtual std::unique_ptr<base::DictionaryValue> GetProgress() const = 0; + virtual const base::DictionaryValue& GetProgress() const = 0; // Returns the command results. - virtual std::unique_ptr<base::DictionaryValue> GetResults() const = 0; + virtual const base::DictionaryValue& GetResults() const = 0; // Returns the command error. virtual const Error* GetError() const = 0;
diff --git a/include/weave/device.h b/include/weave/device.h index 19012b5..cbcc193 100644 --- a/include/weave/device.h +++ b/include/weave/device.h
@@ -96,7 +96,7 @@ // 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( + virtual const base::Value* GetStateProperty( const std::string& name) const = 0; // Sets value of the single property. @@ -106,7 +106,7 @@ ErrorPtr* error) = 0; // Returns aggregated state properties across all registered packages. - virtual std::unique_ptr<base::DictionaryValue> GetState() const = 0; + virtual const base::DictionaryValue& GetState() const = 0; // Returns current state of GCD connection. virtual GcdState GetGcdState() const = 0;
diff --git a/include/weave/test/mock_command.h b/include/weave/test/mock_command.h index 2b1080e..fe1a02a 100644 --- a/include/weave/test/mock_command.h +++ b/include/weave/test/mock_command.h
@@ -25,9 +25,9 @@ MOCK_CONST_METHOD0(GetCategory, const std::string&()); MOCK_CONST_METHOD0(GetState, Command::State()); MOCK_CONST_METHOD0(GetOrigin, Command::Origin()); - MOCK_CONST_METHOD0(MockGetParameters, const std::string&()); - MOCK_CONST_METHOD0(MockGetProgress, const std::string&()); - MOCK_CONST_METHOD0(MockGetResults, const std::string&()); + MOCK_CONST_METHOD0(GetParameters, const base::DictionaryValue&()); + MOCK_CONST_METHOD0(GetProgress, const base::DictionaryValue&()); + MOCK_CONST_METHOD0(GetResults, const base::DictionaryValue&()); MOCK_CONST_METHOD0(GetError, const Error*()); MOCK_METHOD2(SetProgress, bool(const base::DictionaryValue&, ErrorPtr*)); MOCK_METHOD2(Complete, bool(const base::DictionaryValue&, ErrorPtr*)); @@ -35,10 +35,6 @@ MOCK_METHOD2(SetError, bool(const Error*, ErrorPtr*)); MOCK_METHOD2(Abort, bool(const Error*, ErrorPtr*)); MOCK_METHOD1(Cancel, bool(ErrorPtr*)); - - std::unique_ptr<base::DictionaryValue> GetParameters() const override; - std::unique_ptr<base::DictionaryValue> GetProgress() const override; - std::unique_ptr<base::DictionaryValue> GetResults() const override; }; } // namespace test
diff --git a/include/weave/test/mock_device.h b/include/weave/test/mock_device.h index f751f97..e5063e7 100644 --- a/include/weave/test/mock_device.h +++ b/include/weave/test/mock_device.h
@@ -34,13 +34,13 @@ MOCK_METHOD2(SetStatePropertiesFromJson, bool(const std::string&, ErrorPtr*)); MOCK_METHOD2(SetStateProperties, bool(const base::DictionaryValue&, ErrorPtr*)); - MOCK_CONST_METHOD1(MockGetStateProperty, - base::Value*(const std::string& name)); + MOCK_CONST_METHOD1(GetStateProperty, + const base::Value*(const std::string& name)); MOCK_METHOD3(SetStateProperty, bool(const std::string& name, const base::Value& value, ErrorPtr* error)); - MOCK_CONST_METHOD0(MockGetState, base::DictionaryValue*()); + MOCK_CONST_METHOD0(GetState, const base::DictionaryValue&()); MOCK_CONST_METHOD0(GetGcdState, GcdState()); MOCK_METHOD1(AddGcdStateChangedCallback, void(const GcdStateChangedCallback& callback)); @@ -50,15 +50,6 @@ MOCK_METHOD2(AddPairingChangedCallbacks, void(const PairingBeginCallback& begin_callback, const PairingEndCallback& end_callback)); - - // Gmock 1.7.0 does not work with unuque_ptr as return value. - std::unique_ptr<base::Value> GetStateProperty( - const std::string& name) const override { - return std::unique_ptr<base::Value>(MockGetStateProperty(name)); - } - std::unique_ptr<base::DictionaryValue> GetState() const override { - return std::unique_ptr<base::DictionaryValue>(MockGetState()); - } }; } // namespace test
diff --git a/libweave.gypi b/libweave.gypi index 24d6995..a02f082 100644 --- a/libweave.gypi +++ b/libweave.gypi
@@ -54,7 +54,6 @@ 'weave_test_sources': [ 'src/test/fake_stream.cc', 'src/test/fake_task_runner.cc', - 'src/test/mock_command.cc', 'src/test/unittest_utils.cc', ], 'weave_unittest_sources': [
diff --git a/src/base_api_handler.cc b/src/base_api_handler.cc index 3d22a10..1423dd1 100644 --- a/src/base_api_handler.cc +++ b/src/base_api_handler.cc
@@ -99,10 +99,10 @@ bool discovery_enabled{settings.local_discovery_enabled}; bool pairing_enabled{settings.local_pairing_enabled}; - auto parameters = command->GetParameters(); - parameters->GetString("localAnonymousAccessMaxRole", &anonymous_access_role); - parameters->GetBoolean("localDiscoveryEnabled", &discovery_enabled); - parameters->GetBoolean("localPairingEnabled", &pairing_enabled); + const auto& parameters = command->GetParameters(); + parameters.GetString("localAnonymousAccessMaxRole", &anonymous_access_role); + parameters.GetBoolean("localDiscoveryEnabled", &discovery_enabled); + parameters.GetBoolean("localPairingEnabled", &pairing_enabled); AuthScope auth_scope{AuthScope::kNone}; if (!StringToEnum(anonymous_access_role, &auth_scope)) { @@ -144,10 +144,10 @@ std::string description{settings.description}; std::string location{settings.location}; - auto parameters = command->GetParameters(); - parameters->GetString("name", &name); - parameters->GetString("description", &description); - parameters->GetString("location", &location); + const auto& parameters = command->GetParameters(); + parameters.GetString("name", &name); + parameters.GetString("description", &description); + parameters.GetString("location", &location); device_info_->UpdateDeviceInfo(name, description, location); command->Complete({}, nullptr);
diff --git a/src/base_api_handler_unittest.cc b/src/base_api_handler_unittest.cc index 357385d..15a575a 100644 --- a/src/base_api_handler_unittest.cc +++ b/src/base_api_handler_unittest.cc
@@ -84,7 +84,8 @@ } std::unique_ptr<base::DictionaryValue> GetBaseState() { - auto state = state_manager_->GetState(); + std::unique_ptr<base::DictionaryValue> state{ + state_manager_->GetState().DeepCopy()}; std::set<std::string> result; for (base::DictionaryValue::Iterator it{*state}; !it.IsAtEnd(); it.Advance()) {
diff --git a/src/commands/cloud_command_proxy.cc b/src/commands/cloud_command_proxy.cc index 91db18c..3d472c7 100644 --- a/src/commands/cloud_command_proxy.cc +++ b/src/commands/cloud_command_proxy.cc
@@ -43,7 +43,7 @@ void CloudCommandProxy::OnResultsChanged() { std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue}; patch->Set(commands::attributes::kCommand_Results, - command_instance_->GetResults().release()); + command_instance_->GetResults().CreateDeepCopy()); QueueCommandUpdate(std::move(patch)); } @@ -57,7 +57,7 @@ void CloudCommandProxy::OnProgressChanged() { std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue}; patch->Set(commands::attributes::kCommand_Progress, - command_instance_->GetProgress().release()); + command_instance_->GetProgress().CreateDeepCopy()); QueueCommandUpdate(std::move(patch)); }
diff --git a/src/commands/command_instance.cc b/src/commands/command_instance.cc index aa71b0e..8328299 100644 --- a/src/commands/command_instance.cc +++ b/src/commands/command_instance.cc
@@ -94,16 +94,16 @@ return origin_; } -std::unique_ptr<base::DictionaryValue> CommandInstance::GetParameters() const { - return std::unique_ptr<base::DictionaryValue>(parameters_.DeepCopy()); +const base::DictionaryValue& CommandInstance::GetParameters() const { + return parameters_; } -std::unique_ptr<base::DictionaryValue> CommandInstance::GetProgress() const { - return std::unique_ptr<base::DictionaryValue>(progress_.DeepCopy()); +const base::DictionaryValue& CommandInstance::GetProgress() const { + return progress_; } -std::unique_ptr<base::DictionaryValue> CommandInstance::GetResults() const { - return std::unique_ptr<base::DictionaryValue>(results_.DeepCopy()); +const base::DictionaryValue& CommandInstance::GetResults() const { + return results_; } const Error* CommandInstance::GetError() const {
diff --git a/src/commands/command_instance.h b/src/commands/command_instance.h index e7a6eca..60620a1 100644 --- a/src/commands/command_instance.h +++ b/src/commands/command_instance.h
@@ -54,9 +54,9 @@ const std::string& GetName() const override; Command::State GetState() const override; Command::Origin GetOrigin() const override; - std::unique_ptr<base::DictionaryValue> GetParameters() const override; - std::unique_ptr<base::DictionaryValue> GetProgress() const override; - std::unique_ptr<base::DictionaryValue> GetResults() const override; + const base::DictionaryValue& GetParameters() const override; + const base::DictionaryValue& GetProgress() const override; + const base::DictionaryValue& GetResults() const override; const Error* GetError() const override; bool SetProgress(const base::DictionaryValue& progress, ErrorPtr* error) override;
diff --git a/src/commands/command_instance_unittest.cc b/src/commands/command_instance_unittest.cc index 1d32cd9..fb8fe84 100644 --- a/src/commands/command_instance_unittest.cc +++ b/src/commands/command_instance_unittest.cc
@@ -82,8 +82,8 @@ EXPECT_EQ("robot.speak", instance.GetName()); EXPECT_EQ(Command::Origin::kCloud, instance.GetOrigin()); EXPECT_JSON_EQ("{'phrase': 'iPityDaFool', 'volume': 5}", - *instance.GetParameters()); - EXPECT_JSON_EQ("{'foo': 239}", *instance.GetResults()); + instance.GetParameters()); + EXPECT_JSON_EQ("{'foo': 239}", instance.GetResults()); CommandInstance instance2{"base.reboot", Command::Origin::kLocal, @@ -118,7 +118,7 @@ EXPECT_EQ("abcd", instance->GetID()); EXPECT_EQ("robot.jump", instance->GetName()); EXPECT_JSON_EQ("{'height': 53, '_jumpType': '_withKick'}", - *instance->GetParameters()); + instance->GetParameters()); } TEST_F(CommandInstanceTest, FromJson_ParamsOmitted) { @@ -126,7 +126,7 @@ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud, dict_, nullptr, nullptr); EXPECT_EQ("base.reboot", instance->GetName()); - EXPECT_JSON_EQ("{}", *instance->GetParameters()); + EXPECT_JSON_EQ("{}", instance->GetParameters()); } TEST_F(CommandInstanceTest, FromJson_NotObject) {
diff --git a/src/device_manager.cc b/src/device_manager.cc index c0b8e9a..52b2882 100644 --- a/src/device_manager.cc +++ b/src/device_manager.cc
@@ -134,7 +134,7 @@ return state_manager_->SetProperties(dict, error); } -std::unique_ptr<base::Value> DeviceManager::GetStateProperty( +const base::Value* DeviceManager::GetStateProperty( const std::string& name) const { return state_manager_->GetProperty(name); } @@ -145,7 +145,7 @@ return state_manager_->SetProperty(name, value, error); } -std::unique_ptr<base::DictionaryValue> DeviceManager::GetState() const { +const base::DictionaryValue& DeviceManager::GetState() const { return state_manager_->GetState(); }
diff --git a/src/device_manager.h b/src/device_manager.h index ccf8778..6c3df05 100644 --- a/src/device_manager.h +++ b/src/device_manager.h
@@ -52,12 +52,11 @@ ErrorPtr* error) override; bool SetStateProperties(const base::DictionaryValue& dict, ErrorPtr* error) override; - std::unique_ptr<base::Value> GetStateProperty( - const std::string& name) const override; + const base::Value* GetStateProperty(const std::string& name) const override; bool SetStateProperty(const std::string& name, const base::Value& value, ErrorPtr* error) override; - std::unique_ptr<base::DictionaryValue> GetState() const override; + const base::DictionaryValue& GetState() const override; void Register(const std::string& ticket_id, const DoneCallback& callback) override; GcdState GetGcdState() const override;
diff --git a/src/device_registration_info.cc b/src/device_registration_info.cc index 5c8625a..0c914b7 100644 --- a/src/device_registration_info.cc +++ b/src/device_registration_info.cc
@@ -485,8 +485,7 @@ if (!commands) return nullptr; - std::unique_ptr<base::DictionaryValue> state = state_manager_->GetState(); - CHECK(state); + const base::DictionaryValue& state = state_manager_->GetState(); std::unique_ptr<base::DictionaryValue> resource{new base::DictionaryValue}; if (!GetSettings().cloud_id.empty()) @@ -507,7 +506,7 @@ } resource->Set("channel", channel.release()); resource->Set("commandDefs", commands.release()); - resource->Set("state", state.release()); + resource->Set("state", state.DeepCopy()); return resource; }
diff --git a/src/privet/cloud_delegate.cc b/src/privet/cloud_delegate.cc index efb69bd..c771366 100644 --- a/src/privet/cloud_delegate.cc +++ b/src/privet/cloud_delegate.cc
@@ -243,9 +243,8 @@ void OnStateChanged() { state_.Clear(); - auto state = state_manager_->GetState(); - CHECK(state); - state_.MergeDictionary(state.get()); + const auto& state = state_manager_->GetState(); + state_.MergeDictionary(&state); NotifyOnStateChanged(); }
diff --git a/src/states/state_manager.cc b/src/states/state_manager.cc index b1e70a3..b170b86 100644 --- a/src/states/state_manager.cc +++ b/src/states/state_manager.cc
@@ -27,14 +27,17 @@ callback.Run(); // Force to read current state. } -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(); - CHECK(pkg_value); - dict->SetWithoutPathExpansion(pair.first, pkg_value.release()); +const base::DictionaryValue& StateManager::GetState() const { + if (!cached_dict_valid_) { + cached_dict_.Clear(); + for (const auto& pair : packages_) { + cached_dict_.SetWithoutPathExpansion( + pair.first, pair.second->GetValuesAsJson().DeepCopy()); + } + cached_dict_valid_ = true; } - return dict; + + return cached_dict_; } bool StateManager::SetProperty(const std::string& name, @@ -46,8 +49,7 @@ return result; } -std::unique_ptr<base::Value> StateManager::GetProperty( - const std::string& name) const { +const base::Value* StateManager::GetProperty(const std::string& name) const { auto parts = SplitAtFirst(name, ".", true); const std::string& package_name = parts.first; const std::string& property_name = parts.second; @@ -93,6 +95,8 @@ if (!package->SetPropertyValue(property_name, value, error)) return false; + cached_dict_valid_ = false; + std::unique_ptr<base::DictionaryValue> prop_set{new base::DictionaryValue}; prop_set->Set(full_property_name, value.DeepCopy()); state_change_queue_->NotifyPropertiesUpdated(timestamp, std::move(prop_set));
diff --git a/src/states/state_manager.h b/src/states/state_manager.h index 55faf76..c48a57c 100644 --- a/src/states/state_manager.h +++ b/src/states/state_manager.h
@@ -39,11 +39,11 @@ bool LoadStateDefinitionFromJson(const std::string& json, ErrorPtr* error); bool SetProperties(const base::DictionaryValue& dict, ErrorPtr* error); bool SetPropertiesFromJson(const std::string& json, ErrorPtr* error); - std::unique_ptr<base::Value> GetProperty(const std::string& name) const; + const base::Value* GetProperty(const std::string& name) const; bool SetProperty(const std::string& name, const base::Value& value, ErrorPtr* error); - std::unique_ptr<base::DictionaryValue> GetState() const; + const base::DictionaryValue& GetState() const; // Returns the recorded state changes since last time this method has been // called. @@ -80,6 +80,9 @@ std::vector<base::Closure> on_changed_; + mutable base::DictionaryValue cached_dict_; + mutable bool cached_dict_valid_ = false; + DISALLOW_COPY_AND_ASSIGN(StateManager); };
diff --git a/src/states/state_manager_unittest.cc b/src/states/state_manager_unittest.cc index f655e84..6899646 100644 --- a/src/states/state_manager_unittest.cc +++ b/src/states/state_manager_unittest.cc
@@ -109,7 +109,7 @@ }, 'device': {} })"; - EXPECT_JSON_EQ(expected, *mgr_->GetState()); + EXPECT_JSON_EQ(expected, mgr_->GetState()); } TEST_F(StateManagerTest, LoadStateDefinition) { @@ -128,7 +128,7 @@ 'power': {}, 'device': {} })"; - EXPECT_JSON_EQ(expected, *mgr_->GetState()); + EXPECT_JSON_EQ(expected, mgr_->GetState()); } TEST_F(StateManagerTest, Startup) { @@ -170,7 +170,7 @@ 'battery_level': 44 } })"; - EXPECT_JSON_EQ(expected, *manager.GetState()); + EXPECT_JSON_EQ(expected, manager.GetState()); } TEST_F(StateManagerTest, SetPropertyValue) { @@ -189,7 +189,7 @@ 'state_property': 'Test Value' } })"; - EXPECT_JSON_EQ(expected, *mgr_->GetState()); + EXPECT_JSON_EQ(expected, mgr_->GetState()); } TEST_F(StateManagerTest, SetPropertyValue_Error_NoName) { @@ -227,7 +227,7 @@ ASSERT_TRUE(SetPropertyValue("device.state_property", base::StringValue{"Test Value"}, nullptr)); std::vector<StateChange> expected_state; - const std::string expected_val = + const std::string expected_val = "{'device': {'state_property': 'Test Value'}}"; expected_state.emplace_back( timestamp_, @@ -259,7 +259,7 @@ }, 'device': {} })"; - EXPECT_JSON_EQ(expected, *mgr_->GetState()); + EXPECT_JSON_EQ(expected, mgr_->GetState()); } TEST_F(StateManagerTest, GetProperty) {
diff --git a/src/states/state_package.cc b/src/states/state_package.cc index 55650b6..b0ea199 100644 --- a/src/states/state_package.cc +++ b/src/states/state_package.cc
@@ -39,11 +39,11 @@ return true; } -std::unique_ptr<base::DictionaryValue> StatePackage::GetValuesAsJson() const { - return std::unique_ptr<base::DictionaryValue>(values_.DeepCopy()); +const base::DictionaryValue& StatePackage::GetValuesAsJson() const { + return values_; } -std::unique_ptr<base::Value> StatePackage::GetPropertyValue( +const base::Value* StatePackage::GetPropertyValue( const std::string& property_name, ErrorPtr* error) const { const base::Value* value = nullptr; @@ -55,7 +55,7 @@ return nullptr; } - return std::unique_ptr<base::Value>(value->DeepCopy()); + return value; } bool StatePackage::SetPropertyValue(const std::string& property_name,
diff --git a/src/states/state_package.h b/src/states/state_package.h index 7632145..4092948 100644 --- a/src/states/state_package.h +++ b/src/states/state_package.h
@@ -43,13 +43,12 @@ // "message": "Printer low on cyan ink" // } // } - std::unique_ptr<base::DictionaryValue> GetValuesAsJson() const; + const base::DictionaryValue& GetValuesAsJson() const; // Gets the value for a specific state property. |property_name| must not // include the package name as part of the property name. - std::unique_ptr<base::Value> GetPropertyValue( - const std::string& property_name, - ErrorPtr* error) const; + const base::Value* GetPropertyValue(const std::string& property_name, + ErrorPtr* error) const; // Sets the value for a specific state property. |property_name| must not // include the package name as part of the property name. bool SetPropertyValue(const std::string& property_name,
diff --git a/src/states/state_package_unittest.cc b/src/states/state_package_unittest.cc index c116b37..d09625a 100644 --- a/src/states/state_package_unittest.cc +++ b/src/states/state_package_unittest.cc
@@ -131,7 +131,7 @@ })"; EXPECT_JSON_EQ(expected, GetTypes(package)); - EXPECT_JSON_EQ("{}", *package.GetValuesAsJson()); + EXPECT_JSON_EQ("{}", package.GetValuesAsJson()); } TEST(StatePackage, AddValuesFromJson_OnEmpty) { @@ -148,7 +148,7 @@ 'iso': 200, 'light': true })"; - EXPECT_JSON_EQ(expected, *package.GetValuesAsJson()); + EXPECT_JSON_EQ(expected, package.GetValuesAsJson()); } TEST_F(StatePackageTest, AddSchemaFromJson_AddMore) { @@ -200,7 +200,7 @@ 'iso': 200, 'light': true })"; - EXPECT_JSON_EQ(expected, *package_->GetValuesAsJson()); + EXPECT_JSON_EQ(expected, package_->GetValuesAsJson()); } TEST_F(StatePackageTest, AddValuesFromJson_AddMore) { @@ -222,7 +222,7 @@ 'iso': 200, 'light': true })"; - EXPECT_JSON_EQ(expected, *package_->GetValuesAsJson()); + EXPECT_JSON_EQ(expected, package_->GetValuesAsJson()); } TEST_F(StatePackageTest, AddSchemaFromJson_Error_Redefined) { @@ -283,7 +283,7 @@ 'iso': 200, 'light': true })"; - EXPECT_JSON_EQ(expected, *package_->GetValuesAsJson()); + EXPECT_JSON_EQ(expected, package_->GetValuesAsJson()); } } // namespace weave
diff --git a/src/test/mock_command.cc b/src/test/mock_command.cc deleted file mode 100644 index 65c2bab..0000000 --- a/src/test/mock_command.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2015 The Weave Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <weave/test/mock_command.h> - -#include <memory> -#include <string> - -#include <base/values.h> -#include <weave/test/unittest_utils.h> - -namespace weave { -namespace test { - -std::unique_ptr<base::DictionaryValue> MockCommand::GetParameters() const { - return CreateDictionaryValue(MockGetParameters()); -} - -std::unique_ptr<base::DictionaryValue> MockCommand::GetProgress() const { - return CreateDictionaryValue(MockGetProgress()); -} - -std::unique_ptr<base::DictionaryValue> MockCommand::GetResults() const { - return CreateDictionaryValue(MockGetResults()); -} - -} // namespace test -} // namespace weave