blob: a025e44875b534b57a02784e5af99750d34a4430 [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>
Vitaly Buka72410b22015-05-13 13:48:59 -070013
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020014#include "src/commands/command_manager.h"
15#include "src/commands/unittest_utils.h"
16#include "src/config.h"
17#include "src/device_registration_info.h"
18#include "src/states/mock_state_change_queue_interface.h"
19#include "src/states/state_manager.h"
Vitaly Buka72410b22015-05-13 13:48:59 -070020
Vitaly Buka6b61e572015-08-05 23:16:13 -070021using testing::_;
Vitaly Buka695a5fb2015-10-06 16:26:08 -070022using testing::AnyOf;
23using testing::Eq;
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070024using testing::Invoke;
Vitaly Buka6b61e572015-08-05 23:16:13 -070025using testing::Return;
Vitaly Buka68af3872015-10-27 16:19:00 -070026using testing::ReturnRef;
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070027using testing::StrictMock;
Vitaly Buka6b61e572015-08-05 23:16:13 -070028
Vitaly Bukab6f015a2015-07-09 14:59:23 -070029namespace weave {
Vitaly Buka72410b22015-05-13 13:48:59 -070030
31class BaseApiHandlerTest : public ::testing::Test {
32 protected:
33 void SetUp() override {
Vitaly Buka6b61e572015-08-05 23:16:13 -070034 EXPECT_CALL(mock_state_change_queue_, NotifyPropertiesUpdated(_, _))
35 .WillRepeatedly(Return(true));
36
Vitaly Buka72410b22015-05-13 13:48:59 -070037 command_manager_ = std::make_shared<CommandManager>();
Vitaly Buka3110deb2015-10-06 19:54:09 -070038
Vitaly Buka72410b22015-05-13 13:48:59 -070039 state_manager_ = std::make_shared<StateManager>(&mock_state_change_queue_);
Vitaly Buka266e88b2015-10-06 11:33:00 -070040
Vitaly Buka68af3872015-10-27 16:19:00 -070041 EXPECT_CALL(device_, AddStateDefinitionsFromJson(_))
42 .WillRepeatedly(Invoke([this](const std::string& json) {
43 EXPECT_TRUE(
44 state_manager_->LoadStateDefinitionFromJson(json, nullptr));
45 }));
Vitaly Buka266e88b2015-10-06 11:33:00 -070046 EXPECT_CALL(device_, SetStateProperties(_, _))
47 .WillRepeatedly(
48 Invoke(state_manager_.get(), &StateManager::SetProperties));
Vitaly Buka3110deb2015-10-06 19:54:09 -070049 EXPECT_CALL(device_, AddCommandDefinitionsFromJson(_))
50 .WillRepeatedly(Invoke([this](const std::string& json) {
51 EXPECT_TRUE(command_manager_->LoadCommands(json, nullptr));
52 }));
53
Vitaly Buka695a5fb2015-10-06 16:26:08 -070054 EXPECT_CALL(device_, AddCommandHandler(AnyOf("base.updateBaseConfiguration",
55 "base.updateDeviceInfo"),
56 _))
57 .WillRepeatedly(
58 Invoke(command_manager_.get(), &CommandManager::AddCommandHandler));
Vitaly Buka266e88b2015-10-06 11:33:00 -070059
Vitaly Buka9acf8aa2015-08-16 01:55:41 -070060 std::unique_ptr<Config> config{new Config{&config_store_}};
61 config->Load();
62 dev_reg_.reset(new DeviceRegistrationInfo(command_manager_, state_manager_,
Vitaly Buka41a90d62015-09-29 16:58:39 -070063 std::move(config), nullptr,
Vitaly Buka1e363672015-09-25 14:01:16 -070064 &http_client_, nullptr));
Vitaly Buka68af3872015-10-27 16:19:00 -070065
66 EXPECT_CALL(device_, GetSettings())
67 .WillRepeatedly(ReturnRef(dev_reg_->GetSettings()));
68
Vitaly Buka266e88b2015-10-06 11:33:00 -070069 handler_.reset(new BaseApiHandler{dev_reg_.get(), &device_});
Vitaly Buka72410b22015-05-13 13:48:59 -070070 }
71
Vitaly Buka72410b22015-05-13 13:48:59 -070072 void AddCommand(const std::string& command) {
Vitaly Bukab6f015a2015-07-09 14:59:23 -070073 auto command_instance = CommandInstance::FromJson(
Vitaly Buka0f6b2ec2015-08-20 15:35:19 -070074 test::CreateDictionaryValue(command.c_str()).get(),
Vitaly Buka0209da42015-10-08 00:07:18 -070075 Command::Origin::kLocal, command_manager_->GetCommandDictionary(),
Vitaly Buka15f59092015-07-24 16:54:32 -070076 nullptr, nullptr);
Vitaly Buka72410b22015-05-13 13:48:59 -070077 EXPECT_TRUE(!!command_instance);
78
79 std::string id{base::IntToString(++command_id_)};
80 command_instance->SetID(id);
81 command_manager_->AddCommand(std::move(command_instance));
Vitaly Buka0209da42015-10-08 00:07:18 -070082 EXPECT_EQ(Command::State::kDone,
83 command_manager_->FindCommand(id)->GetState());
Vitaly Buka72410b22015-05-13 13:48:59 -070084 }
85
Vitaly Buka68af3872015-10-27 16:19:00 -070086 std::unique_ptr<base::DictionaryValue> GetBaseState() {
87 auto state = state_manager_->GetState();
88 std::set<std::string> result;
89 for (base::DictionaryValue::Iterator it{*state}; !it.IsAtEnd();
90 it.Advance()) {
91 if (it.key() != "base")
92 state->Remove(it.key(), nullptr);
93 }
94 return state;
95 }
96
Vitaly Buka1e363672015-09-25 14:01:16 -070097 provider::test::MockConfigStore config_store_;
98 StrictMock<provider::test::MockHttpClient> http_client_;
Vitaly Buka72410b22015-05-13 13:48:59 -070099 std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
100 std::shared_ptr<CommandManager> command_manager_;
Vitaly Buka6b61e572015-08-05 23:16:13 -0700101 testing::StrictMock<MockStateChangeQueueInterface> mock_state_change_queue_;
Vitaly Buka72410b22015-05-13 13:48:59 -0700102 std::shared_ptr<StateManager> state_manager_;
103 std::unique_ptr<BaseApiHandler> handler_;
Vitaly Buka266e88b2015-10-06 11:33:00 -0700104 StrictMock<test::MockDevice> device_;
Vitaly Buka72410b22015-05-13 13:48:59 -0700105 int command_id_{0};
106};
107
Vitaly Buka80d66532015-10-27 23:06:11 -0700108TEST_F(BaseApiHandlerTest, Initialization) {
109 auto command_defs =
110 command_manager_->GetCommandDictionary().GetCommandsAsJson(
111 [](const CommandDefinition* def) { return true; }, true, nullptr);
112
113 auto expected = R"({
114 "base": {
115 "updateBaseConfiguration": {
116 "minimalRole": "manager",
117 "parameters": {
118 "localAnonymousAccessMaxRole": {
119 "enum": [ "none", "viewer", "user" ],
120 "type": "string"
121 },
122 "localDiscoveryEnabled": {
123 "type": "boolean"
124 },
125 "localPairingEnabled": {
126 "type": "boolean"
127 }
128 }
129 },
130 "updateDeviceInfo": {
131 "minimalRole": "manager",
132 "parameters": {
133 "description": {
134 "type": "string"
135 },
136 "location": {
137 "type": "string"
138 },
139 "name": {
140 "type": "string"
141 }
142 }
143 }
144 }
145 })";
146 EXPECT_JSON_EQ(expected, *command_defs);
147}
148
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700149TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700150 const Settings& settings = dev_reg_->GetSettings();
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700151
152 AddCommand(R"({
153 'name' : 'base.updateBaseConfiguration',
154 '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"({
165 'base': {
Vitaly Bukaa05eadb2015-09-29 16:38:24 -0700166 'firmwareVersion': 'TEST_FIRMWARE',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700167 'localAnonymousAccessMaxRole': 'none',
168 'localDiscoveryEnabled': false,
Vitaly Buka68af3872015-10-27 16:19:00 -0700169 'localPairingEnabled': false
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700170 }
171 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700172 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700173
174 AddCommand(R"({
175 'name' : 'base.updateBaseConfiguration',
176 'parameters': {
177 'localDiscoveryEnabled': true,
178 'localAnonymousAccessMaxRole': 'user',
179 'localPairingEnabled': true
180 }
181 })");
Vitaly Bukab624bc42015-09-29 19:13:55 -0700182 EXPECT_EQ(AuthScope::kUser, settings.local_anonymous_access_role);
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700183 EXPECT_TRUE(settings.local_discovery_enabled);
184 EXPECT_TRUE(settings.local_pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700185 expected = R"({
186 'base': {
Vitaly Bukaa05eadb2015-09-29 16:38:24 -0700187 'firmwareVersion': 'TEST_FIRMWARE',
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700188 'localAnonymousAccessMaxRole': 'user',
189 'localDiscoveryEnabled': true,
Vitaly Buka68af3872015-10-27 16:19:00 -0700190 'localPairingEnabled': true
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700191 }
192 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700193 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka4c808b22015-08-02 13:44:52 -0700194
195 {
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700196 Config::Transaction change{dev_reg_->GetMutableConfig()};
Vitaly Bukab624bc42015-09-29 19:13:55 -0700197 change.set_local_anonymous_access_role(AuthScope::kViewer);
Vitaly Buka4c808b22015-08-02 13:44:52 -0700198 }
199 expected = R"({
200 'base': {
Vitaly Bukaa05eadb2015-09-29 16:38:24 -0700201 'firmwareVersion': 'TEST_FIRMWARE',
Vitaly Buka4c808b22015-08-02 13:44:52 -0700202 'localAnonymousAccessMaxRole': 'viewer',
203 'localDiscoveryEnabled': true,
Vitaly Buka68af3872015-10-27 16:19:00 -0700204 'localPairingEnabled': true
Vitaly Buka4c808b22015-08-02 13:44:52 -0700205 }
206 })";
Vitaly Buka68af3872015-10-27 16:19:00 -0700207 EXPECT_JSON_EQ(expected, *GetBaseState());
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700208}
209
Vitaly Buka72410b22015-05-13 13:48:59 -0700210TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
Vitaly Buka72410b22015-05-13 13:48:59 -0700211 AddCommand(R"({
212 'name' : 'base.updateDeviceInfo',
213 'parameters': {
214 'name': 'testName',
215 'description': 'testDescription',
216 'location': 'testLocation'
217 }
218 })");
219
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700220 const Settings& config = dev_reg_->GetSettings();
221 EXPECT_EQ("testName", config.name);
222 EXPECT_EQ("testDescription", config.description);
223 EXPECT_EQ("testLocation", config.location);
Alex Vakulenko7e8df462015-07-07 10:59:20 -0700224
225 AddCommand(R"({
226 'name' : 'base.updateDeviceInfo',
227 'parameters': {
228 'location': 'newLocation'
229 }
230 })");
231
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700232 EXPECT_EQ("testName", config.name);
233 EXPECT_EQ("testDescription", config.description);
234 EXPECT_EQ("newLocation", config.location);
Vitaly Buka72410b22015-05-13 13:48:59 -0700235}
236
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700237} // namespace weave