| // 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 |