Vitaly Buka | 4615e0d | 2015-10-14 15:35:12 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Weave Authors. All rights reserved. |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Stefan Sauer | 2d16dfa | 2015-09-25 17:08:35 +0200 | [diff] [blame] | 5 | #include "src/states/state_manager.h" |
Alex Deymo | f6cbe32 | 2014-11-10 19:55:35 -0800 | [diff] [blame] | 6 | |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 7 | #include <cstdlib> // for abs(). |
| 8 | #include <vector> |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 9 | |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 10 | #include <base/bind.h> |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 11 | #include <base/values.h> |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 12 | #include <gmock/gmock.h> |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 13 | #include <gtest/gtest.h> |
Vitaly Buka | 1e36367 | 2015-09-25 14:01:16 -0700 | [diff] [blame] | 14 | #include <weave/provider/test/mock_config_store.h> |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 15 | |
Stefan Sauer | 2d16dfa | 2015-09-25 17:08:35 +0200 | [diff] [blame] | 16 | #include "src/commands/schema_constants.h" |
| 17 | #include "src/commands/unittest_utils.h" |
| 18 | #include "src/states/error_codes.h" |
| 19 | #include "src/states/mock_state_change_queue_interface.h" |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 20 | |
Vitaly Buka | b6f015a | 2015-07-09 14:59:23 -0700 | [diff] [blame] | 21 | namespace weave { |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 22 | |
Vitaly Buka | 32005de | 2015-05-01 12:33:31 -0700 | [diff] [blame] | 23 | using testing::_; |
| 24 | using testing::Return; |
Vitaly Buka | 0f6b2ec | 2015-08-20 15:35:19 -0700 | [diff] [blame] | 25 | using test::CreateDictionaryValue; |
Vitaly Buka | 32005de | 2015-05-01 12:33:31 -0700 | [diff] [blame] | 26 | |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 27 | namespace { |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 28 | |
| 29 | const char kBaseDefinition[] = R"({ |
| 30 | "base": { |
| 31 | "manufacturer":"string", |
| 32 | "serialNumber":"string" |
| 33 | }, |
| 34 | "device": { |
| 35 | "state_property":"string" |
| 36 | } |
| 37 | })"; |
| 38 | |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 39 | std::unique_ptr<base::DictionaryValue> GetTestSchema() { |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 40 | return CreateDictionaryValue(kBaseDefinition); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 41 | } |
| 42 | |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 43 | const char kBaseDefaults[] = R"({ |
| 44 | "base": { |
| 45 | "manufacturer":"Test Factory", |
| 46 | "serialNumber":"Test Model" |
| 47 | } |
| 48 | })"; |
| 49 | |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 50 | std::unique_ptr<base::DictionaryValue> GetTestValues() { |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 51 | return CreateDictionaryValue(kBaseDefaults); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 52 | } |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 53 | |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 54 | } // anonymous namespace |
| 55 | |
| 56 | class StateManagerTest : public ::testing::Test { |
| 57 | public: |
| 58 | void SetUp() override { |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 59 | // Initial expectations. |
| 60 | EXPECT_CALL(mock_state_change_queue_, IsEmpty()).Times(0); |
Alex Vakulenko | ff73cf2 | 2014-10-29 09:53:52 -0700 | [diff] [blame] | 61 | EXPECT_CALL(mock_state_change_queue_, NotifyPropertiesUpdated(_, _)) |
Vitaly Buka | 0ac6ca6 | 2015-10-06 19:16:29 -0700 | [diff] [blame] | 62 | .WillRepeatedly(Return(true)); |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 63 | EXPECT_CALL(mock_state_change_queue_, GetAndClearRecordedStateChanges()) |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 64 | .Times(0); |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 65 | mgr_.reset(new StateManager(&mock_state_change_queue_)); |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 66 | |
Vitaly Buka | 0ac6ca6 | 2015-10-06 19:16:29 -0700 | [diff] [blame] | 67 | EXPECT_CALL(*this, OnStateChanged()).Times(2); |
Vitaly Buka | 4c98135 | 2015-10-01 23:04:24 -0700 | [diff] [blame] | 68 | mgr_->AddChangedCallback( |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 69 | base::Bind(&StateManagerTest::OnStateChanged, base::Unretained(this))); |
| 70 | |
Vitaly Buka | 64b4f06 | 2015-09-30 20:46:23 -0700 | [diff] [blame] | 71 | LoadStateDefinition(GetTestSchema().get(), nullptr); |
Vitaly Buka | 216e86d | 2015-10-06 20:23:02 -0700 | [diff] [blame] | 72 | ASSERT_TRUE(mgr_->SetProperties(*GetTestValues().get(), nullptr)); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 73 | } |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 74 | void TearDown() override { mgr_.reset(); } |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 75 | |
| 76 | void LoadStateDefinition(const base::DictionaryValue* json, |
Vitaly Buka | 0801a1f | 2015-08-14 10:03:46 -0700 | [diff] [blame] | 77 | ErrorPtr* error) { |
Vitaly Buka | 64b4f06 | 2015-09-30 20:46:23 -0700 | [diff] [blame] | 78 | ASSERT_TRUE(mgr_->LoadStateDefinition(*json, error)); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 79 | } |
| 80 | |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 81 | bool SetPropertyValue(const std::string& name, |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 82 | const base::Value& value, |
Vitaly Buka | 0801a1f | 2015-08-14 10:03:46 -0700 | [diff] [blame] | 83 | ErrorPtr* error) { |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 84 | return mgr_->SetPropertyValue(name, value, timestamp_, error); |
| 85 | } |
| 86 | |
| 87 | MOCK_CONST_METHOD0(OnStateChanged, void()); |
| 88 | |
| 89 | base::Time timestamp_{base::Time::Now()}; |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 90 | std::unique_ptr<StateManager> mgr_; |
Vitaly Buka | 6b61e57 | 2015-08-05 23:16:13 -0700 | [diff] [blame] | 91 | testing::StrictMock<MockStateChangeQueueInterface> mock_state_change_queue_; |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 92 | }; |
| 93 | |
| 94 | TEST(StateManager, Empty) { |
Vitaly Buka | 6b61e57 | 2015-08-05 23:16:13 -0700 | [diff] [blame] | 95 | testing::StrictMock<MockStateChangeQueueInterface> mock_state_change_queue; |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 96 | StateManager manager(&mock_state_change_queue); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 97 | } |
| 98 | |
| 99 | TEST_F(StateManagerTest, Initialized) { |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 100 | auto expected = R"({ |
| 101 | 'base': { |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 102 | 'manufacturer': 'Test Factory', |
| 103 | 'serialNumber': 'Test Model' |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 104 | }, |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 105 | 'device': { |
| 106 | 'state_property': '' |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 107 | } |
| 108 | })"; |
Vitaly Buka | 95d6256 | 2015-10-01 22:05:27 -0700 | [diff] [blame] | 109 | EXPECT_JSON_EQ(expected, *mgr_->GetState()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | TEST_F(StateManagerTest, LoadStateDefinition) { |
| 113 | auto dict = CreateDictionaryValue(R"({ |
| 114 | 'power': { |
| 115 | 'battery_level':'integer' |
| 116 | } |
| 117 | })"); |
Vitaly Buka | 64b4f06 | 2015-09-30 20:46:23 -0700 | [diff] [blame] | 118 | LoadStateDefinition(dict.get(), nullptr); |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 119 | |
| 120 | auto expected = R"({ |
| 121 | 'base': { |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 122 | 'manufacturer': 'Test Factory', |
| 123 | 'serialNumber': 'Test Model' |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 124 | }, |
| 125 | 'power': { |
| 126 | 'battery_level': 0 |
| 127 | }, |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 128 | 'device': { |
| 129 | 'state_property': '' |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 130 | } |
| 131 | })"; |
Vitaly Buka | 95d6256 | 2015-10-01 22:05:27 -0700 | [diff] [blame] | 132 | EXPECT_JSON_EQ(expected, *mgr_->GetState()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 133 | } |
| 134 | |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 135 | TEST_F(StateManagerTest, Startup) { |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 136 | StateManager manager(&mock_state_change_queue_); |
| 137 | |
Vitaly Buka | 68af387 | 2015-10-27 16:19:00 -0700 | [diff] [blame] | 138 | auto state_definition = R"({ |
| 139 | "base": { |
| 140 | "firmwareVersion": "string", |
| 141 | "localDiscoveryEnabled": "boolean", |
| 142 | "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ], |
| 143 | "localPairingEnabled": "boolean" |
| 144 | }, |
| 145 | "power": {"battery_level":"integer"} |
| 146 | })"; |
| 147 | ASSERT_TRUE(manager.LoadStateDefinitionFromJson(state_definition, nullptr)); |
| 148 | |
| 149 | auto state_values = R"({ |
| 150 | "base": { |
| 151 | "firmwareVersion": "unknown", |
| 152 | "localDiscoveryEnabled": false, |
| 153 | "localAnonymousAccessMaxRole": "none", |
| 154 | "localPairingEnabled": false |
| 155 | }, |
| 156 | "power": {"battery_level":44} |
| 157 | })"; |
| 158 | ASSERT_TRUE(manager.SetPropertiesFromJson(state_values, nullptr)); |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 159 | |
| 160 | auto expected = R"({ |
| 161 | 'base': { |
Vitaly Buka | e5b2041 | 2015-09-30 15:41:28 -0700 | [diff] [blame] | 162 | 'firmwareVersion': 'unknown', |
| 163 | 'localAnonymousAccessMaxRole': 'none', |
| 164 | 'localDiscoveryEnabled': false, |
Vitaly Buka | 68af387 | 2015-10-27 16:19:00 -0700 | [diff] [blame] | 165 | 'localPairingEnabled': false |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 166 | }, |
| 167 | 'power': { |
| 168 | 'battery_level': 44 |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 169 | } |
| 170 | })"; |
Vitaly Buka | 95d6256 | 2015-10-01 22:05:27 -0700 | [diff] [blame] | 171 | EXPECT_JSON_EQ(expected, *manager.GetState()); |
Vitaly Buka | e0425e4 | 2015-08-18 15:50:24 -0700 | [diff] [blame] | 172 | } |
| 173 | |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 174 | TEST_F(StateManagerTest, SetPropertyValue) { |
Vitaly Buka | 774cdf5 | 2015-07-21 13:55:00 -0700 | [diff] [blame] | 175 | ValueMap expected_prop_set{ |
Vitaly Buka | 0f6b2ec | 2015-08-20 15:35:19 -0700 | [diff] [blame] | 176 | {"device.state_property", test::make_string_prop_value("Test Value")}, |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 177 | }; |
| 178 | EXPECT_CALL(mock_state_change_queue_, |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 179 | NotifyPropertiesUpdated(timestamp_, expected_prop_set)) |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 180 | .WillOnce(Return(true)); |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 181 | ASSERT_TRUE(SetPropertyValue("device.state_property", |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 182 | base::StringValue{"Test Value"}, nullptr)); |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 183 | auto expected = R"({ |
| 184 | 'base': { |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 185 | 'manufacturer': 'Test Factory', |
| 186 | 'serialNumber': 'Test Model' |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 187 | }, |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 188 | 'device': { |
| 189 | 'state_property': 'Test Value' |
Vitaly Buka | 7c82d29 | 2015-05-03 18:08:12 -0700 | [diff] [blame] | 190 | } |
| 191 | })"; |
Vitaly Buka | 95d6256 | 2015-10-01 22:05:27 -0700 | [diff] [blame] | 192 | EXPECT_JSON_EQ(expected, *mgr_->GetState()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 193 | } |
| 194 | |
| 195 | TEST_F(StateManagerTest, SetPropertyValue_Error_NoName) { |
Vitaly Buka | 0801a1f | 2015-08-14 10:03:46 -0700 | [diff] [blame] | 196 | ErrorPtr error; |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 197 | ASSERT_FALSE(SetPropertyValue("", base::FundamentalValue{0}, &error)); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 198 | EXPECT_EQ(errors::state::kDomain, error->GetDomain()); |
| 199 | EXPECT_EQ(errors::state::kPropertyNameMissing, error->GetCode()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 200 | } |
| 201 | |
| 202 | TEST_F(StateManagerTest, SetPropertyValue_Error_NoPackage) { |
Vitaly Buka | 0801a1f | 2015-08-14 10:03:46 -0700 | [diff] [blame] | 203 | ErrorPtr error; |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 204 | ASSERT_FALSE( |
| 205 | SetPropertyValue("state_property", base::FundamentalValue{0}, &error)); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 206 | EXPECT_EQ(errors::state::kDomain, error->GetDomain()); |
| 207 | EXPECT_EQ(errors::state::kPackageNameMissing, error->GetCode()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 208 | } |
| 209 | |
| 210 | TEST_F(StateManagerTest, SetPropertyValue_Error_UnknownPackage) { |
Vitaly Buka | 0801a1f | 2015-08-14 10:03:46 -0700 | [diff] [blame] | 211 | ErrorPtr error; |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 212 | ASSERT_FALSE( |
| 213 | SetPropertyValue("power.level", base::FundamentalValue{0}, &error)); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 214 | EXPECT_EQ(errors::state::kDomain, error->GetDomain()); |
| 215 | EXPECT_EQ(errors::state::kPropertyNotDefined, error->GetCode()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 216 | } |
| 217 | |
| 218 | TEST_F(StateManagerTest, SetPropertyValue_Error_UnknownProperty) { |
Vitaly Buka | 0801a1f | 2015-08-14 10:03:46 -0700 | [diff] [blame] | 219 | ErrorPtr error; |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 220 | ASSERT_FALSE( |
| 221 | SetPropertyValue("base.level", base::FundamentalValue{0}, &error)); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 222 | EXPECT_EQ(errors::state::kDomain, error->GetDomain()); |
| 223 | EXPECT_EQ(errors::state::kPropertyNotDefined, error->GetCode()); |
Alex Vakulenko | 07216fe | 2014-09-19 15:31:09 -0700 | [diff] [blame] | 224 | } |
| 225 | |
Alex Vakulenko | ff73cf2 | 2014-10-29 09:53:52 -0700 | [diff] [blame] | 226 | TEST_F(StateManagerTest, GetAndClearRecordedStateChanges) { |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 227 | EXPECT_CALL(mock_state_change_queue_, NotifyPropertiesUpdated(timestamp_, _)) |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 228 | .WillOnce(Return(true)); |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 229 | ASSERT_TRUE(SetPropertyValue("device.state_property", |
Vitaly Buka | e527a64 | 2015-07-28 21:39:45 -0700 | [diff] [blame] | 230 | base::StringValue{"Test Value"}, nullptr)); |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 231 | std::vector<StateChange> expected_val; |
Alex Vakulenko | ff73cf2 | 2014-10-29 09:53:52 -0700 | [diff] [blame] | 232 | expected_val.emplace_back( |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 233 | timestamp_, ValueMap{{"device.state_property", |
Vitaly Buka | 0f6b2ec | 2015-08-20 15:35:19 -0700 | [diff] [blame] | 234 | test::make_string_prop_value("Test Value")}}); |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 235 | EXPECT_CALL(mock_state_change_queue_, GetAndClearRecordedStateChanges()) |
| 236 | .WillOnce(Return(expected_val)); |
Vitaly Buka | 6b61e57 | 2015-08-05 23:16:13 -0700 | [diff] [blame] | 237 | EXPECT_CALL(mock_state_change_queue_, GetLastStateChangeId()) |
| 238 | .WillOnce(Return(0)); |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 239 | auto changes = mgr_->GetAndClearRecordedStateChanges(); |
Alex Vakulenko | be4254b | 2015-06-26 11:34:03 -0700 | [diff] [blame] | 240 | ASSERT_EQ(1, changes.second.size()); |
| 241 | EXPECT_EQ(expected_val.back().timestamp, changes.second.back().timestamp); |
Alex Vakulenko | ff73cf2 | 2014-10-29 09:53:52 -0700 | [diff] [blame] | 242 | EXPECT_EQ(expected_val.back().changed_properties, |
Alex Vakulenko | be4254b | 2015-06-26 11:34:03 -0700 | [diff] [blame] | 243 | changes.second.back().changed_properties); |
Alex Vakulenko | 57123b2 | 2014-10-28 13:50:16 -0700 | [diff] [blame] | 244 | } |
| 245 | |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 246 | TEST_F(StateManagerTest, SetProperties) { |
Vitaly Buka | 774cdf5 | 2015-07-21 13:55:00 -0700 | [diff] [blame] | 247 | ValueMap expected_prop_set{ |
Vitaly Buka | 0f6b2ec | 2015-08-20 15:35:19 -0700 | [diff] [blame] | 248 | {"base.manufacturer", test::make_string_prop_value("No Name")}, |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 249 | }; |
| 250 | EXPECT_CALL(mock_state_change_queue_, |
| 251 | NotifyPropertiesUpdated(_, expected_prop_set)) |
| 252 | .WillOnce(Return(true)); |
| 253 | |
| 254 | EXPECT_CALL(*this, OnStateChanged()).Times(1); |
| 255 | ASSERT_TRUE(mgr_->SetProperties( |
Vitaly Buka | 216e86d | 2015-10-06 20:23:02 -0700 | [diff] [blame] | 256 | *CreateDictionaryValue("{'base':{'manufacturer':'No Name'}}"), nullptr)); |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 257 | |
| 258 | auto expected = R"({ |
| 259 | 'base': { |
| 260 | 'manufacturer': 'No Name', |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 261 | 'serialNumber': 'Test Model' |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 262 | }, |
Vitaly Buka | 9df6c10 | 2015-07-28 15:43:17 -0700 | [diff] [blame] | 263 | 'device': { |
| 264 | 'state_property': '' |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 265 | } |
| 266 | })"; |
Vitaly Buka | 95d6256 | 2015-10-01 22:05:27 -0700 | [diff] [blame] | 267 | EXPECT_JSON_EQ(expected, *mgr_->GetState()); |
| 268 | } |
| 269 | |
| 270 | TEST_F(StateManagerTest, GetProperty) { |
Vitaly Buka | 4c98135 | 2015-10-01 23:04:24 -0700 | [diff] [blame] | 271 | EXPECT_JSON_EQ("'Test Model'", *mgr_->GetProperty("base.serialNumber")); |
| 272 | EXPECT_JSON_EQ("''", *mgr_->GetProperty("device.state_property")); |
| 273 | EXPECT_EQ(nullptr, mgr_->GetProperty("device.unknown")); |
| 274 | EXPECT_EQ(nullptr, mgr_->GetProperty("unknown.state_property")); |
Vitaly Buka | 247620b | 2015-05-26 15:42:20 -0700 | [diff] [blame] | 275 | } |
| 276 | |
Vitaly Buka | b6f015a | 2015-07-09 14:59:23 -0700 | [diff] [blame] | 277 | } // namespace weave |