blob: e0ebf88b6dbf6e8d06e5ba0f82fd2e0fe493f8cb [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 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700136 }
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800137 },
138 "state": {
139 "firmwareVersion": "string",
140 "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
141 "localDiscoveryEnabled": "boolean",
142 "localPairingEnabled": "boolean"
143 }
Vitaly Buka80d66532015-10-27 23:06:11 -0700144 })";
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800145 EXPECT_JSON_EQ(expected, *trait);
Vitaly Buka80d66532015-10-27 23:06:11 -0700146}
147
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700148TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700149 const Settings& settings = dev_reg_->GetSettings();
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700150
151 AddCommand(R"({
152 'name' : 'base.updateBaseConfiguration',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800153 'component': 'weave',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700154 'parameters': {
155 'localDiscoveryEnabled': false,
156 'localAnonymousAccessMaxRole': 'none',
157 'localPairingEnabled': false
158 }
159 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700160 EXPECT_EQ(AuthScope::kNone, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700161 EXPECT_FALSE(settings.local_discovery_enabled);
162 EXPECT_FALSE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700163
164 auto expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800165 'firmwareVersion': 'TEST_FIRMWARE',
166 'localAnonymousAccessMaxRole': 'none',
167 'localDiscoveryEnabled': false,
168 'localPairingEnabled': false
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700169 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700170 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700171
172 AddCommand(R"({
173 'name' : 'base.updateBaseConfiguration',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800174 'component': 'weave',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700175 'parameters': {
176 'localDiscoveryEnabled': true,
177 'localAnonymousAccessMaxRole': 'user',
178 'localPairingEnabled': true
179 }
180 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700181 EXPECT_EQ(AuthScope::kUser, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700182 EXPECT_TRUE(settings.local_discovery_enabled);
183 EXPECT_TRUE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700184 expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800185 'firmwareVersion': 'TEST_FIRMWARE',
186 'localAnonymousAccessMaxRole': 'user',
187 'localDiscoveryEnabled': true,
188 'localPairingEnabled': true
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700189 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700190 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka4c808b22015-08-02 13:44:52 -0700191
192 {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700193 Config::Transaction change{dev_reg_->GetMutableConfig()};
Vitaly Bukab624bc42015-09-29 19:13:55 -0700194 change.set_local_anonymous_access_role(AuthScope::kViewer);
Vitaly Buka4c808b22015-08-02 13:44:52 -0700195 }
196 expected = R"({
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800197 'firmwareVersion': 'TEST_FIRMWARE',
198 'localAnonymousAccessMaxRole': 'viewer',
199 'localDiscoveryEnabled': true,
200 'localPairingEnabled': true
Vitaly Buka4c808b22015-08-02 13:44:52 -0700201 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700202 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700203}
204
Vitaly Buka72410b22015-05-13 13:48:59 -0700205TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
Vitaly Buka72410b22015-05-13 13:48:59 -0700206 AddCommand(R"({
207 'name' : 'base.updateDeviceInfo',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800208 'component': 'weave',
Vitaly Buka72410b22015-05-13 13:48:59 -0700209 'parameters': {
210 'name': 'testName',
211 'description': 'testDescription',
212 'location': 'testLocation'
213 }
214 })");
215
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700216 const Settings& config = dev_reg_->GetSettings();
217 EXPECT_EQ("testName", config.name);
218 EXPECT_EQ("testDescription", config.description);
219 EXPECT_EQ("testLocation", config.location);
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700220
221 AddCommand(R"({
222 'name' : 'base.updateDeviceInfo',
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800223 'component': 'weave',
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700224 'parameters': {
225 'location': 'newLocation'
226 }
227 })");
228
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700229 EXPECT_EQ("testName", config.name);
230 EXPECT_EQ("testDescription", config.description);
231 EXPECT_EQ("newLocation", config.location);
Vitaly Buka72410b22015-05-13 13:48:59 -0700232}
233
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700234} // namespace weave