blob: ca4762674c8a0ee41d61248cd0e5b62844b40374 [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>
8#include <base/values.h>
Vitaly Buka72410b22015-05-13 13:48:59 -07009#include <gtest/gtest.h>
Vitaly Buka1e363672015-09-25 14:01:16 -070010#include <weave/provider/test/mock_config_store.h>
11#include <weave/provider/test/mock_http_client.h>
Vitaly Buka266e88b2015-10-06 11:33:00 -070012#include <weave/test/mock_device.h>
Alex Vakulenko8a05beb2015-11-24 17:13:20 -080013#include <weave/test/unittest_utils.h>
Vitaly Buka72410b22015-05-13 13:48:59 -070014
Alex Vakulenkod91d6252015-12-05 17:14:39 -080015#include "src/component_manager_impl.h"
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020016#include "src/config.h"
17#include "src/device_registration_info.h"
Vitaly Buka72410b22015-05-13 13:48:59 -070018
Vitaly Buka6b61e572015-08-05 23:16:13 -070019using testing::_;
Vitaly Buka695a5fb2015-10-06 16:26:08 -070020using testing::AnyOf;
21using testing::Eq;
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070022using testing::Invoke;
Vitaly Buka6b61e572015-08-05 23:16:13 -070023using testing::Return;
Vitaly Buka68af3872015-10-27 16:19:00 -070024using testing::ReturnRef;
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070025using testing::StrictMock;
Vitaly Buka6b61e572015-08-05 23:16:13 -070026
Vitaly Bukab6f015a2015-07-09 14:59:23 -070027namespace weave {
Vitaly Buka72410b22015-05-13 13:48:59 -070028
29class BaseApiHandlerTest : public ::testing::Test {
30 protected:
31 void SetUp() override {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080032 EXPECT_CALL(device_, AddTraitDefinitionsFromJson(_))
Vitaly Buka68af3872015-10-27 16:19:00 -070033 .WillRepeatedly(Invoke([this](const std::string& json) {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080034 EXPECT_TRUE(component_manager_.LoadTraits(json, nullptr));
Vitaly Buka68af3872015-10-27 16:19:00 -070035 }));
Alex Vakulenkod91d6252015-12-05 17:14:39 -080036 EXPECT_CALL(device_, SetStateProperties(_, _, _))
37 .WillRepeatedly(Invoke(&component_manager_,
38 &ComponentManager::SetStateProperties));
39 EXPECT_CALL(device_, SetStateProperty(_, _, _, _))
40 .WillRepeatedly(Invoke(&component_manager_,
41 &ComponentManager::SetStateProperty));
42 EXPECT_CALL(device_, AddComponent(_, _, _))
43 .WillRepeatedly(Invoke([this](const std::string& name,
44 const std::vector<std::string>& traits,
45 ErrorPtr* error) {
46 return component_manager_.AddComponent("", name, traits, error);
Vitaly Buka3110deb2015-10-06 19:54:09 -070047 }));
48
Alex Vakulenkod91d6252015-12-05 17:14:39 -080049 EXPECT_CALL(device_, AddCommandHandler(_,
50 AnyOf("base.updateBaseConfiguration",
Vitaly Buka695a5fb2015-10-06 16:26:08 -070051 "base.updateDeviceInfo"),
52 _))
Alex Vakulenkod91d6252015-12-05 17:14:39 -080053 .WillRepeatedly(Invoke(&component_manager_,
54 &ComponentManager::AddCommandHandler));
Vitaly Buka266e88b2015-10-06 11:33:00 -070055
Vitaly Buka666b43e2015-12-08 16:35:47 -080056 config_.Load();
57 dev_reg_.reset(new DeviceRegistrationInfo(&config_, &component_manager_,
58 nullptr, &http_client_, nullptr,
59 nullptr));
Vitaly Buka68af3872015-10-27 16:19:00 -070060
61 EXPECT_CALL(device_, GetSettings())
62 .WillRepeatedly(ReturnRef(dev_reg_->GetSettings()));
63
Vitaly Buka266e88b2015-10-06 11:33:00 -070064 handler_.reset(new BaseApiHandler{dev_reg_.get(), &device_});
Vitaly Buka72410b22015-05-13 13:48:59 -070065 }
66
Vitaly Buka72410b22015-05-13 13:48:59 -070067 void AddCommand(const std::string& command) {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080068 std::string id;
69 auto command_instance = component_manager_.ParseCommandInstance(
70 *test::CreateDictionaryValue(command.c_str()), Command::Origin::kLocal,
71 UserRole::kOwner, &id, nullptr);
72 ASSERT_NE(nullptr, command_instance.get());
73 component_manager_.AddCommand(std::move(command_instance));
Vitaly Buka0209da42015-10-08 00:07:18 -070074 EXPECT_EQ(Command::State::kDone,
Alex Vakulenkod91d6252015-12-05 17:14:39 -080075 component_manager_.FindCommand(id)->GetState());
Vitaly Buka72410b22015-05-13 13:48:59 -070076 }
77
Vitaly Buka68af3872015-10-27 16:19:00 -070078 std::unique_ptr<base::DictionaryValue> GetBaseState() {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080079 std::unique_ptr<base::DictionaryValue> state;
80 std::string path = component_manager_.FindComponentWithTrait("base");
81 EXPECT_FALSE(path.empty());
82 const auto* component = component_manager_.FindComponent(path, nullptr);
83 CHECK(component);
84 const base::DictionaryValue* base_state = nullptr;
85 if (component->GetDictionary("state.base", &base_state))
86 state.reset(base_state->DeepCopy());
87 else
88 state.reset(new base::DictionaryValue);
Vitaly Buka68af3872015-10-27 16:19:00 -070089 return state;
90 }
91
Vitaly Buka1e363672015-09-25 14:01:16 -070092 provider::test::MockConfigStore config_store_;
Vitaly Buka666b43e2015-12-08 16:35:47 -080093 Config config_{&config_store_};
Vitaly Buka1e363672015-09-25 14:01:16 -070094 StrictMock<provider::test::MockHttpClient> http_client_;
Vitaly Buka72410b22015-05-13 13:48:59 -070095 std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
Alex Vakulenkod91d6252015-12-05 17:14:39 -080096 ComponentManagerImpl component_manager_;
Vitaly Buka72410b22015-05-13 13:48:59 -070097 std::unique_ptr<BaseApiHandler> handler_;
Vitaly Buka266e88b2015-10-06 11:33:00 -070098 StrictMock<test::MockDevice> device_;
Vitaly Buka72410b22015-05-13 13:48:59 -070099};
100
Vitaly Buka80d66532015-10-27 23:06:11 -0700101TEST_F(BaseApiHandlerTest, Initialization) {
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800102 const base::DictionaryValue* trait = nullptr;
103 ASSERT_TRUE(component_manager_.GetTraits().GetDictionary("base", &trait));
Vitaly Buka80d66532015-10-27 23:06:11 -0700104
105 auto expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800106 "commands": {
Vitaly Buka80d66532015-10-27 23:06:11 -0700107 "updateBaseConfiguration": {
Alex Vakulenko7e894da2015-11-23 11:47:49 -0800108 "minimalRole": "manager",
109 "parameters": {
110 "localAnonymousAccessMaxRole": {
111 "enum": [ "none", "viewer", "user" ],
112 "type": "string"
113 },
114 "localDiscoveryEnabled": {
115 "type": "boolean"
116 },
117 "localPairingEnabled": {
118 "type": "boolean"
119 }
120 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700121 },
122 "updateDeviceInfo": {
Alex Vakulenko7e894da2015-11-23 11:47:49 -0800123 "minimalRole": "manager",
124 "parameters": {
125 "description": {
126 "type": "string"
127 },
128 "location": {
129 "type": "string"
130 },
131 "name": {
132 "type": "string"
133 }
134 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700135 }
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800136 },
137 "state": {
138 "firmwareVersion": "string",
139 "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
140 "localDiscoveryEnabled": "boolean",
141 "localPairingEnabled": "boolean"
142 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700143 })";
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800144 EXPECT_JSON_EQ(expected, *trait);
Vitaly Buka80d66532015-10-27 23:06:11 -0700145}
146
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700147TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700148 const Settings& settings = dev_reg_->GetSettings();
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700149
150 AddCommand(R"({
151 'name' : 'base.updateBaseConfiguration',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800152 'component': 'weave',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700153 'parameters': {
154 'localDiscoveryEnabled': false,
155 'localAnonymousAccessMaxRole': 'none',
156 'localPairingEnabled': false
157 }
158 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700159 EXPECT_EQ(AuthScope::kNone, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700160 EXPECT_FALSE(settings.local_discovery_enabled);
161 EXPECT_FALSE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700162
163 auto expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800164 'firmwareVersion': 'TEST_FIRMWARE',
165 'localAnonymousAccessMaxRole': 'none',
166 'localDiscoveryEnabled': false,
167 'localPairingEnabled': false
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700168 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700169 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700170
171 AddCommand(R"({
172 'name' : 'base.updateBaseConfiguration',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800173 'component': 'weave',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700174 'parameters': {
175 'localDiscoveryEnabled': true,
176 'localAnonymousAccessMaxRole': 'user',
177 'localPairingEnabled': true
178 }
179 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700180 EXPECT_EQ(AuthScope::kUser, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700181 EXPECT_TRUE(settings.local_discovery_enabled);
182 EXPECT_TRUE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700183 expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800184 'firmwareVersion': 'TEST_FIRMWARE',
185 'localAnonymousAccessMaxRole': 'user',
186 'localDiscoveryEnabled': true,
187 'localPairingEnabled': true
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700188 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700189 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka4c808b22015-08-02 13:44:52 -0700190
191 {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700192 Config::Transaction change{dev_reg_->GetMutableConfig()};
Vitaly Bukab624bc42015-09-29 19:13:55 -0700193 change.set_local_anonymous_access_role(AuthScope::kViewer);
Vitaly Buka4c808b22015-08-02 13:44:52 -0700194 }
195 expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800196 'firmwareVersion': 'TEST_FIRMWARE',
197 'localAnonymousAccessMaxRole': 'viewer',
198 'localDiscoveryEnabled': true,
199 'localPairingEnabled': true
Vitaly Buka4c808b22015-08-02 13:44:52 -0700200 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700201 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700202}
203
Vitaly Buka72410b22015-05-13 13:48:59 -0700204TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
Vitaly Buka72410b22015-05-13 13:48:59 -0700205 AddCommand(R"({
206 'name' : 'base.updateDeviceInfo',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800207 'component': 'weave',
Vitaly Buka72410b22015-05-13 13:48:59 -0700208 'parameters': {
209 'name': 'testName',
210 'description': 'testDescription',
211 'location': 'testLocation'
212 }
213 })");
214
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700215 const Settings& config = dev_reg_->GetSettings();
216 EXPECT_EQ("testName", config.name);
217 EXPECT_EQ("testDescription", config.description);
218 EXPECT_EQ("testLocation", config.location);
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700219
220 AddCommand(R"({
221 'name' : 'base.updateDeviceInfo',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800222 'component': 'weave',
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700223 'parameters': {
224 'location': 'newLocation'
225 }
226 })");
227
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700228 EXPECT_EQ("testName", config.name);
229 EXPECT_EQ("testDescription", config.description);
230 EXPECT_EQ("newLocation", config.location);
Vitaly Buka72410b22015-05-13 13:48:59 -0700231}
232
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700233} // namespace weave