blob: 6f8460bfced639ef622ad36010fd8efb8eff1a31 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka72410b22015-05-13 13:48:59 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Stefan Sauer2d16dfa2015-09-25 17:08:35 +02005#include "src/base_api_handler.h"
Vitaly Buka72410b22015-05-13 13:48:59 -07006
7#include <base/strings/string_number_conversions.h>
Vitaly Bukaece713e2015-12-09 10:59:33 -08008#include <base/time/default_clock.h>
Vitaly Buka72410b22015-05-13 13:48:59 -07009#include <base/values.h>
Vitaly Buka72410b22015-05-13 13:48:59 -070010#include <gtest/gtest.h>
Vitaly Buka1e363672015-09-25 14:01:16 -070011#include <weave/provider/test/mock_config_store.h>
12#include <weave/provider/test/mock_http_client.h>
Vitaly Buka266e88b2015-10-06 11:33:00 -070013#include <weave/test/mock_device.h>
Alex Vakulenko8a05beb2015-11-24 17:13:20 -080014#include <weave/test/unittest_utils.h>
Vitaly Buka72410b22015-05-13 13:48:59 -070015
Alex Vakulenkod91d6252015-12-05 17:14:39 -080016#include "src/component_manager_impl.h"
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020017#include "src/config.h"
18#include "src/device_registration_info.h"
Vitaly Buka72410b22015-05-13 13:48:59 -070019
Vitaly Buka6b61e572015-08-05 23:16:13 -070020using testing::_;
Vitaly Buka695a5fb2015-10-06 16:26:08 -070021using testing::AnyOf;
22using testing::Eq;
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070023using testing::Invoke;
Vitaly Buka6b61e572015-08-05 23:16:13 -070024using testing::Return;
Vitaly Buka68af3872015-10-27 16:19:00 -070025using testing::ReturnRef;
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070026using testing::StrictMock;
Vitaly Buka6b61e572015-08-05 23:16:13 -070027
Vitaly Bukab6f015a2015-07-09 14:59:23 -070028namespace weave {
Vitaly Buka72410b22015-05-13 13:48:59 -070029
30class BaseApiHandlerTest : public ::testing::Test {
31 protected:
32 void SetUp() override {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080033 EXPECT_CALL(device_, AddTraitDefinitionsFromJson(_))
Vitaly Buka68af3872015-10-27 16:19:00 -070034 .WillRepeatedly(Invoke([this](const std::string& json) {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080035 EXPECT_TRUE(component_manager_.LoadTraits(json, nullptr));
Vitaly Buka68af3872015-10-27 16:19:00 -070036 }));
Alex Vakulenkod91d6252015-12-05 17:14:39 -080037 EXPECT_CALL(device_, SetStateProperties(_, _, _))
Vitaly Buka34668e72015-12-15 14:46:47 -080038 .WillRepeatedly(
39 Invoke(&component_manager_, &ComponentManager::SetStateProperties));
Alex Vakulenkod91d6252015-12-05 17:14:39 -080040 EXPECT_CALL(device_, SetStateProperty(_, _, _, _))
Vitaly Buka34668e72015-12-15 14:46:47 -080041 .WillRepeatedly(
42 Invoke(&component_manager_, &ComponentManager::SetStateProperty));
Alex Vakulenkod91d6252015-12-05 17:14:39 -080043 EXPECT_CALL(device_, AddComponent(_, _, _))
44 .WillRepeatedly(Invoke([this](const std::string& name,
45 const std::vector<std::string>& traits,
46 ErrorPtr* error) {
47 return component_manager_.AddComponent("", name, traits, error);
Vitaly Buka3110deb2015-10-06 19:54:09 -070048 }));
49
Vitaly Buka34668e72015-12-15 14:46:47 -080050 EXPECT_CALL(device_,
51 AddCommandHandler(_, AnyOf("base.updateBaseConfiguration",
52 "base.updateDeviceInfo"),
53 _))
54 .WillRepeatedly(
55 Invoke(&component_manager_, &ComponentManager::AddCommandHandler));
Vitaly Buka266e88b2015-10-06 11:33:00 -070056
Vitaly Buka666b43e2015-12-08 16:35:47 -080057 config_.Load();
58 dev_reg_.reset(new DeviceRegistrationInfo(&config_, &component_manager_,
59 nullptr, &http_client_, nullptr,
60 nullptr));
Vitaly Buka68af3872015-10-27 16:19:00 -070061
62 EXPECT_CALL(device_, GetSettings())
63 .WillRepeatedly(ReturnRef(dev_reg_->GetSettings()));
64
Vitaly Buka266e88b2015-10-06 11:33:00 -070065 handler_.reset(new BaseApiHandler{dev_reg_.get(), &device_});
Vitaly Buka72410b22015-05-13 13:48:59 -070066 }
67
Vitaly Buka72410b22015-05-13 13:48:59 -070068 void AddCommand(const std::string& command) {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080069 std::string id;
70 auto command_instance = component_manager_.ParseCommandInstance(
71 *test::CreateDictionaryValue(command.c_str()), Command::Origin::kLocal,
72 UserRole::kOwner, &id, nullptr);
73 ASSERT_NE(nullptr, command_instance.get());
74 component_manager_.AddCommand(std::move(command_instance));
Vitaly Buka0209da42015-10-08 00:07:18 -070075 EXPECT_EQ(Command::State::kDone,
Alex Vakulenkod91d6252015-12-05 17:14:39 -080076 component_manager_.FindCommand(id)->GetState());
Vitaly Buka72410b22015-05-13 13:48:59 -070077 }
78
Vitaly Buka68af3872015-10-27 16:19:00 -070079 std::unique_ptr<base::DictionaryValue> GetBaseState() {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080080 std::unique_ptr<base::DictionaryValue> state;
81 std::string path = component_manager_.FindComponentWithTrait("base");
82 EXPECT_FALSE(path.empty());
83 const auto* component = component_manager_.FindComponent(path, nullptr);
84 CHECK(component);
85 const base::DictionaryValue* base_state = nullptr;
86 if (component->GetDictionary("state.base", &base_state))
87 state.reset(base_state->DeepCopy());
88 else
89 state.reset(new base::DictionaryValue);
Vitaly Buka68af3872015-10-27 16:19:00 -070090 return state;
91 }
92
Vitaly Buka1e363672015-09-25 14:01:16 -070093 provider::test::MockConfigStore config_store_;
Vitaly Buka666b43e2015-12-08 16:35:47 -080094 Config config_{&config_store_};
Vitaly Buka1e363672015-09-25 14:01:16 -070095 StrictMock<provider::test::MockHttpClient> http_client_;
Vitaly Buka72410b22015-05-13 13:48:59 -070096 std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
Alex Vakulenkod91d6252015-12-05 17:14:39 -080097 ComponentManagerImpl component_manager_;
Vitaly Buka72410b22015-05-13 13:48:59 -070098 std::unique_ptr<BaseApiHandler> handler_;
Vitaly Buka266e88b2015-10-06 11:33:00 -070099 StrictMock<test::MockDevice> device_;
Vitaly Buka72410b22015-05-13 13:48:59 -0700100};
101
Vitaly Buka80d66532015-10-27 23:06:11 -0700102TEST_F(BaseApiHandlerTest, Initialization) {
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800103 const base::DictionaryValue* trait = nullptr;
104 ASSERT_TRUE(component_manager_.GetTraits().GetDictionary("base", &trait));
Vitaly Buka80d66532015-10-27 23:06:11 -0700105
106 auto expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800107 "commands": {
Vitaly Buka80d66532015-10-27 23:06:11 -0700108 "updateBaseConfiguration": {
Alex Vakulenko7e894da2015-11-23 11:47:49 -0800109 "minimalRole": "manager",
110 "parameters": {
111 "localAnonymousAccessMaxRole": {
112 "enum": [ "none", "viewer", "user" ],
113 "type": "string"
114 },
115 "localDiscoveryEnabled": {
116 "type": "boolean"
117 },
118 "localPairingEnabled": {
119 "type": "boolean"
120 }
121 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700122 },
123 "updateDeviceInfo": {
Alex Vakulenko7e894da2015-11-23 11:47:49 -0800124 "minimalRole": "manager",
125 "parameters": {
126 "description": {
127 "type": "string"
128 },
129 "location": {
130 "type": "string"
131 },
132 "name": {
133 "type": "string"
134 }
135 }
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -0800136 },
137 "reboot": {
138 "minimalRole": "user",
139 "parameters": {},
140 "errors": ["notEnoughBattery"]
141 },
142 "identify": {
143 "minimalRole": "user",
144 "parameters": {}
Vitaly Buka80d66532015-10-27 23:06:11 -0700145 }
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800146 },
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -0800147 "state": {
148 "firmwareVersion": {
149 "type": "string",
150 "isRequired": true
151 },
152 "localDiscoveryEnabled": {
153 "type": "boolean",
154 "isRequired": true
155 },
156 "localAnonymousAccessMaxRole": {
157 "type": "string",
158 "enum": [ "none", "viewer", "user" ],
159 "isRequired": true
160 },
161 "localPairingEnabled": {
162 "type": "boolean",
163 "isRequired": true
164 },
165 "connectionStatus": {
166 "type": "string"
167 },
168 "network": {
169 "type": "object",
170 "additionalProperties": false,
171 "properties": {
172 "name": { "type": "string" }
173 }
174 }
175 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700176 })";
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800177 EXPECT_JSON_EQ(expected, *trait);
Vitaly Buka80d66532015-10-27 23:06:11 -0700178}
179
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700180TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700181 const Settings& settings = dev_reg_->GetSettings();
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700182
183 AddCommand(R"({
184 'name' : 'base.updateBaseConfiguration',
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -0800185 'component': 'base',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700186 'parameters': {
187 'localDiscoveryEnabled': false,
188 'localAnonymousAccessMaxRole': 'none',
189 'localPairingEnabled': false
190 }
191 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700192 EXPECT_EQ(AuthScope::kNone, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700193 EXPECT_FALSE(settings.local_discovery_enabled);
194 EXPECT_FALSE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700195
196 auto expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800197 'firmwareVersion': 'TEST_FIRMWARE',
198 'localAnonymousAccessMaxRole': 'none',
199 'localDiscoveryEnabled': false,
200 'localPairingEnabled': false
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700201 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700202 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700203
204 AddCommand(R"({
205 'name' : 'base.updateBaseConfiguration',
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -0800206 'component': 'base',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700207 'parameters': {
208 'localDiscoveryEnabled': true,
209 'localAnonymousAccessMaxRole': 'user',
210 'localPairingEnabled': true
211 }
212 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700213 EXPECT_EQ(AuthScope::kUser, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700214 EXPECT_TRUE(settings.local_discovery_enabled);
215 EXPECT_TRUE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700216 expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800217 'firmwareVersion': 'TEST_FIRMWARE',
218 'localAnonymousAccessMaxRole': 'user',
219 'localDiscoveryEnabled': true,
220 'localPairingEnabled': true
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700221 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700222 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka4c808b22015-08-02 13:44:52 -0700223
224 {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700225 Config::Transaction change{dev_reg_->GetMutableConfig()};
Vitaly Bukab624bc42015-09-29 19:13:55 -0700226 change.set_local_anonymous_access_role(AuthScope::kViewer);
Vitaly Buka4c808b22015-08-02 13:44:52 -0700227 }
228 expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800229 'firmwareVersion': 'TEST_FIRMWARE',
230 'localAnonymousAccessMaxRole': 'viewer',
231 'localDiscoveryEnabled': true,
232 'localPairingEnabled': true
Vitaly Buka4c808b22015-08-02 13:44:52 -0700233 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700234 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700235}
236
Vitaly Buka72410b22015-05-13 13:48:59 -0700237TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
Vitaly Buka72410b22015-05-13 13:48:59 -0700238 AddCommand(R"({
239 'name' : 'base.updateDeviceInfo',
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -0800240 'component': 'base',
Vitaly Buka72410b22015-05-13 13:48:59 -0700241 'parameters': {
242 'name': 'testName',
243 'description': 'testDescription',
244 'location': 'testLocation'
245 }
246 })");
247
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700248 const Settings& config = dev_reg_->GetSettings();
249 EXPECT_EQ("testName", config.name);
250 EXPECT_EQ("testDescription", config.description);
251 EXPECT_EQ("testLocation", config.location);
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700252
253 AddCommand(R"({
254 'name' : 'base.updateDeviceInfo',
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -0800255 'component': 'base',
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700256 'parameters': {
257 'location': 'newLocation'
258 }
259 })");
260
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700261 EXPECT_EQ("testName", config.name);
262 EXPECT_EQ("testDescription", config.description);
263 EXPECT_EQ("newLocation", config.location);
Vitaly Buka72410b22015-05-13 13:48:59 -0700264}
265
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700266} // namespace weave