blob: c7df9bb9a46518c4ab70c96dc0434cd431d09775 [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "buffet/base_api_handler.h"
#include <base/strings/string_number_conversions.h>
#include <base/values.h>
#include <chromeos/http/http_transport_fake.h>
#include <gtest/gtest.h>
#include "buffet/buffet_config.h"
#include "buffet/commands/command_manager.h"
#include "buffet/commands/unittest_utils.h"
#include "buffet/device_registration_info.h"
#include "buffet/states/mock_state_change_queue_interface.h"
#include "buffet/states/state_manager.h"
#include "buffet/storage_impls.h"
namespace buffet {
class BaseApiHandlerTest : public ::testing::Test {
protected:
void SetUp() override {
transport_ = std::make_shared<chromeos::http::fake::Transport>();
command_manager_ = std::make_shared<CommandManager>();
state_manager_ = std::make_shared<StateManager>(&mock_state_change_queue_);
auto state_definition = unittests::CreateDictionaryValue(R"({
'base': {
'firmwareVersion': 'string',
'localDiscoveryEnabled': 'boolean',
'localAnonymousAccessMaxRole': [ 'none', 'viewer', 'user' ],
'localPairingEnabled': 'boolean',
'network': {
'properties': {
'name': 'string'
}
}
}
})");
auto state_defaults = unittests::CreateDictionaryValue(R"({
'base': {
'firmwareVersion': '123123',
'localDiscoveryEnabled': false,
'localAnonymousAccessMaxRole': 'none',
'localPairingEnabled': false
}
})");
ASSERT_TRUE(state_manager_->LoadStateDefinition(*state_definition, "base",
nullptr));
ASSERT_TRUE(state_manager_->LoadStateDefaults(*state_defaults, nullptr));
dev_reg_.reset(new DeviceRegistrationInfo(
command_manager_, state_manager_,
std::unique_ptr<BuffetConfig>{new BuffetConfig{
std::unique_ptr<StorageInterface>{new MemStorage}}},
transport_, nullptr, true, nullptr));
handler_.reset(new BaseApiHandler{
dev_reg_->AsWeakPtr(), state_manager_, command_manager_});
}
void LoadCommands(const std::string& command_definitions) {
auto json = unittests::CreateDictionaryValue(command_definitions.c_str());
EXPECT_TRUE(command_manager_->LoadBaseCommands(*json, nullptr));
EXPECT_TRUE(command_manager_->LoadCommands(*json, "", nullptr));
}
void AddCommand(const std::string& command) {
auto command_instance = buffet::CommandInstance::FromJson(
unittests::CreateDictionaryValue(command.c_str()).get(),
commands::attributes::kCommand_Visibility_Local,
command_manager_->GetCommandDictionary(), nullptr, nullptr);
EXPECT_TRUE(!!command_instance);
std::string id{base::IntToString(++command_id_)};
command_instance->SetID(id);
command_manager_->AddCommand(std::move(command_instance));
EXPECT_EQ(CommandInstance::kStatusDone,
command_manager_->FindCommand(id)->GetStatus());
}
std::shared_ptr<chromeos::http::fake::Transport> transport_;
std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
std::shared_ptr<CommandManager> command_manager_;
testing::NiceMock<MockStateChangeQueueInterface> mock_state_change_queue_;
std::shared_ptr<StateManager> state_manager_;
std::unique_ptr<BaseApiHandler> handler_;
int command_id_{0};
};
TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
LoadCommands(R"({
'base': {
'updateBaseConfiguration': {
'parameters': {
'localDiscoveryEnabled': 'boolean',
'localAnonymousAccessMaxRole': [ 'none', 'viewer', 'user' ],
'localPairingEnabled': 'boolean'
},
'results': {}
}
}
})");
const BuffetConfig& config{dev_reg_->GetConfig()};
AddCommand(R"({
'name' : 'base.updateBaseConfiguration',
'parameters': {
'localDiscoveryEnabled': false,
'localAnonymousAccessMaxRole': 'none',
'localPairingEnabled': false
}
})");
EXPECT_EQ("none", config.local_anonymous_access_role());
EXPECT_FALSE(config.local_discovery_enabled());
EXPECT_FALSE(config.local_pairing_enabled());
auto expected = R"({
'base': {
'firmwareVersion': '123123',
'localAnonymousAccessMaxRole': 'none',
'localDiscoveryEnabled': false,
'localPairingEnabled': false,
'network': {}
}
})";
EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson(nullptr));
AddCommand(R"({
'name' : 'base.updateBaseConfiguration',
'parameters': {
'localDiscoveryEnabled': true,
'localAnonymousAccessMaxRole': 'user',
'localPairingEnabled': true
}
})");
EXPECT_EQ("user", config.local_anonymous_access_role());
EXPECT_TRUE(config.local_discovery_enabled());
EXPECT_TRUE(config.local_pairing_enabled());
expected = R"({
'base': {
'firmwareVersion': '123123',
'localAnonymousAccessMaxRole': 'user',
'localDiscoveryEnabled': true,
'localPairingEnabled': true,
'network': {}
}
})";
EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson(nullptr));
}
TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
LoadCommands(R"({
'base': {
'updateDeviceInfo': {
'parameters': {
'description': 'string',
'name': {
'type': 'string',
'minLength': 1
},
'location': 'string'
},
'results': {}
}
}
})");
AddCommand(R"({
'name' : 'base.updateDeviceInfo',
'parameters': {
'name': 'testName',
'description': 'testDescription',
'location': 'testLocation'
}
})");
const BuffetConfig& config{dev_reg_->GetConfig()};
EXPECT_EQ("testName", config.name());
EXPECT_EQ("testDescription", config.description());
EXPECT_EQ("testLocation", config.location());
}
} // namespace buffet