160 lines
6.2 KiB
C++
160 lines
6.2 KiB
C++
// Copyright 2015 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "buffet/buffet_config.h"
|
|
|
|
#include <set>
|
|
|
|
#include <base/bind.h>
|
|
#include <brillo/data_encoding.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
namespace buffet {
|
|
|
|
TEST(BuffetConfigTest, LoadConfig) {
|
|
brillo::KeyValueStore config_store;
|
|
config_store.SetString("client_id", "conf_client_id");
|
|
config_store.SetString("client_secret", "conf_client_secret");
|
|
config_store.SetString("api_key", "conf_api_key");
|
|
config_store.SetString("oauth_url", "conf_oauth_url");
|
|
config_store.SetString("service_url", "conf_service_url");
|
|
config_store.SetString("oem_name", "conf_oem_name");
|
|
config_store.SetString("model_name", "conf_model_name");
|
|
config_store.SetString("model_id", "ABCDE");
|
|
config_store.SetString("polling_period_ms", "12345");
|
|
config_store.SetString("backup_polling_period_ms", "6589");
|
|
config_store.SetBoolean("wifi_auto_setup_enabled", false);
|
|
config_store.SetBoolean("ble_setup_enabled", true);
|
|
config_store.SetString("pairing_modes", "pinCode,embeddedCode");
|
|
config_store.SetString("embedded_code", "567");
|
|
config_store.SetString("name", "conf_name");
|
|
config_store.SetString("description", "conf_description");
|
|
config_store.SetString("location", "conf_location");
|
|
config_store.SetString("local_anonymous_access_role", "user");
|
|
config_store.SetBoolean("local_pairing_enabled", false);
|
|
config_store.SetBoolean("local_discovery_enabled", false);
|
|
|
|
// Following will be ignored.
|
|
config_store.SetString("device_kind", "conf_device_kind");
|
|
config_store.SetString("device_id", "conf_device_id");
|
|
config_store.SetString("refresh_token", "conf_refresh_token");
|
|
config_store.SetString("robot_account", "conf_robot_account");
|
|
config_store.SetString("last_configured_ssid", "conf_last_configured_ssid");
|
|
|
|
weave::Settings settings;
|
|
BuffetConfig config{{}};
|
|
EXPECT_TRUE(config.LoadDefaults(config_store, &settings));
|
|
|
|
EXPECT_EQ("conf_client_id", settings.client_id);
|
|
EXPECT_EQ("conf_client_secret", settings.client_secret);
|
|
EXPECT_EQ("conf_api_key", settings.api_key);
|
|
EXPECT_EQ("conf_oauth_url", settings.oauth_url);
|
|
EXPECT_EQ("conf_service_url", settings.service_url);
|
|
EXPECT_EQ("conf_oem_name", settings.oem_name);
|
|
EXPECT_EQ("conf_model_name", settings.model_name);
|
|
EXPECT_EQ("ABCDE", settings.model_id);
|
|
EXPECT_FALSE(settings.wifi_auto_setup_enabled);
|
|
std::set<weave::PairingType> pairing_types{weave::PairingType::kPinCode,
|
|
weave::PairingType::kEmbeddedCode};
|
|
EXPECT_EQ(pairing_types, settings.pairing_modes);
|
|
EXPECT_EQ("567", settings.embedded_code);
|
|
EXPECT_EQ("conf_name", settings.name);
|
|
EXPECT_EQ("conf_description", settings.description);
|
|
EXPECT_EQ("conf_location", settings.location);
|
|
EXPECT_EQ(weave::AuthScope::kUser, settings.local_anonymous_access_role);
|
|
EXPECT_FALSE(settings.local_pairing_enabled);
|
|
EXPECT_FALSE(settings.local_discovery_enabled);
|
|
}
|
|
|
|
class BuffetConfigTestWithFakes : public testing::Test,
|
|
public BuffetConfig::FileIO,
|
|
public Encryptor {
|
|
public:
|
|
void SetUp() {
|
|
BuffetConfig::Options config_options;
|
|
config_options.settings = base::FilePath{"settings_file"};
|
|
config_.reset(new BuffetConfig{config_options});
|
|
config_->SetEncryptor(this);
|
|
config_->SetFileIO(this);
|
|
};
|
|
|
|
// buffet::Encryptor methods.
|
|
bool EncryptWithAuthentication(const std::string& plaintext,
|
|
std::string* ciphertext) override {
|
|
*ciphertext = brillo::data_encoding::Base64Encode(plaintext);
|
|
return encryptor_result_;
|
|
};
|
|
bool DecryptWithAuthentication(const std::string& ciphertext,
|
|
std::string* plaintext) override {
|
|
return encryptor_result_ &&
|
|
brillo::data_encoding::Base64Decode(ciphertext, plaintext);
|
|
};
|
|
|
|
// buffet::BuffetConfig::FileIO methods.
|
|
bool ReadFile(const base::FilePath& path, std::string* content) override {
|
|
if (fake_file_content_.count(path.value()) == 0) {
|
|
return false;
|
|
}
|
|
*content = fake_file_content_[path.value()];
|
|
return io_result_;
|
|
};
|
|
bool WriteFile(const base::FilePath& path,
|
|
const std::string& content) override {
|
|
if (io_result_) {
|
|
fake_file_content_[path.value()] = content;
|
|
}
|
|
return io_result_;
|
|
};
|
|
|
|
protected:
|
|
std::map<std::string, std::string> fake_file_content_;
|
|
bool encryptor_result_ = true;
|
|
bool io_result_ = true;
|
|
std::unique_ptr<BuffetConfig> config_;
|
|
};
|
|
|
|
TEST_F(BuffetConfigTestWithFakes, EncryptionEnabled) {
|
|
config_->SaveSettings("config", "test", {});
|
|
ASSERT_NE("test", fake_file_content_["settings_file.config"]);
|
|
ASSERT_EQ("test", config_->LoadSettings("config"));
|
|
}
|
|
|
|
TEST_F(BuffetConfigTestWithFakes, EncryptionFailure) {
|
|
config_->SaveSettings("config", "test", {});
|
|
ASSERT_FALSE(fake_file_content_["settings_file.config"].empty());
|
|
encryptor_result_ = false;
|
|
config_->SaveSettings("config", "test2", {});
|
|
// Encryption fails -> file cleared.
|
|
ASSERT_TRUE(fake_file_content_["settings_file.config"].empty());
|
|
}
|
|
|
|
TEST_F(BuffetConfigTestWithFakes, DecryptionFailure) {
|
|
config_->SaveSettings("config", "test", {});
|
|
ASSERT_FALSE(fake_file_content_["settings_file.config"].empty());
|
|
encryptor_result_ = false;
|
|
// Decryption fails -> empty settings loaded.
|
|
ASSERT_TRUE(config_->LoadSettings("config").empty());
|
|
}
|
|
|
|
TEST_F(BuffetConfigTestWithFakes, SettingsIOFailure) {
|
|
config_->SaveSettings("config", "test", {});
|
|
std::string original = fake_file_content_["settings_file.config"];
|
|
ASSERT_FALSE(original.empty());
|
|
io_result_ = false;
|
|
ASSERT_TRUE(config_->LoadSettings("config").empty());
|
|
config_->SaveSettings("config2", "test", {});
|
|
ASSERT_EQ(original, fake_file_content_["settings_file.config"]);
|
|
}
|
|
|
|
} // namespace buffet
|