1cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Copyright 2015 The Android Open Source Project 2cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// 3cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Licensed under the Apache License, Version 2.0 (the "License"); 4cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// you may not use this file except in compliance with the License. 5cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// You may obtain a copy of the License at 6cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// 7cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// http://www.apache.org/licenses/LICENSE-2.0 8cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// 9cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Unless required by applicable law or agreed to in writing, software 10cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// distributed under the License is distributed on an "AS IS" BASIS, 11cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// See the License for the specific language governing permissions and 13cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// limitations under the License. 141175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 151175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include "buffet/buffet_config.h" 161175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 171175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <set> 181175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 191175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/bind.h> 204170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/data_encoding.h> 211175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <gtest/gtest.h> 221175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 231175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukanamespace buffet { 241175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 251175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly BukaTEST(BuffetConfigTest, LoadConfig) { 264170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko brillo::KeyValueStore config_store; 271175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("client_id", "conf_client_id"); 281175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("client_secret", "conf_client_secret"); 291175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("api_key", "conf_api_key"); 301175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("oauth_url", "conf_oauth_url"); 311175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("service_url", "conf_service_url"); 321175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("oem_name", "conf_oem_name"); 331175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("model_name", "conf_model_name"); 341175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("model_id", "ABCDE"); 351175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("polling_period_ms", "12345"); 361175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("backup_polling_period_ms", "6589"); 371175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetBoolean("wifi_auto_setup_enabled", false); 381175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetBoolean("ble_setup_enabled", true); 390022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko config_store.SetString("pairing_modes", "pinCode,embeddedCode"); 401175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("embedded_code", "567"); 411175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("name", "conf_name"); 421175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("description", "conf_description"); 431175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("location", "conf_location"); 441175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("local_anonymous_access_role", "user"); 451175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetBoolean("local_pairing_enabled", false); 461175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetBoolean("local_discovery_enabled", false); 471175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 481175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka // Following will be ignored. 491175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("device_kind", "conf_device_kind"); 501175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("device_id", "conf_device_id"); 511175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("refresh_token", "conf_refresh_token"); 521175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("robot_account", "conf_robot_account"); 531175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka config_store.SetString("last_configured_ssid", "conf_last_configured_ssid"); 541175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 551175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka weave::Settings settings; 56becd461462f428f136cd5368c664a951935222e9Vitaly Buka BuffetConfig config{{}}; 571175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_TRUE(config.LoadDefaults(config_store, &settings)); 581175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 591175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_client_id", settings.client_id); 601175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_client_secret", settings.client_secret); 611175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_api_key", settings.api_key); 621175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_oauth_url", settings.oauth_url); 631175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_service_url", settings.service_url); 641175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_oem_name", settings.oem_name); 651175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_model_name", settings.model_name); 661175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("ABCDE", settings.model_id); 671175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_FALSE(settings.wifi_auto_setup_enabled); 680022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko std::set<weave::PairingType> pairing_types{weave::PairingType::kPinCode, 690022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko weave::PairingType::kEmbeddedCode}; 701175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ(pairing_types, settings.pairing_modes); 711175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("567", settings.embedded_code); 721175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_name", settings.name); 731175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_description", settings.description); 741175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_EQ("conf_location", settings.location); 750022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko EXPECT_EQ(weave::AuthScope::kUser, settings.local_anonymous_access_role); 761175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_FALSE(settings.local_pairing_enabled); 771175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka EXPECT_FALSE(settings.local_discovery_enabled); 781175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka} 791175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka 80df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenkoclass BuffetConfigTestWithFakes : public testing::Test, 81df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko public BuffetConfig::FileIO, 82df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko public Encryptor { 83df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko public: 84df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko void SetUp() { 85df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko BuffetConfig::Options config_options; 86df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko config_options.settings = base::FilePath{"settings_file"}; 87df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko config_.reset(new BuffetConfig{config_options}); 88df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko config_->SetEncryptor(this); 89df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko config_->SetFileIO(this); 90df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko }; 91df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 92df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko // buffet::Encryptor methods. 93df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko bool EncryptWithAuthentication(const std::string& plaintext, 94df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko std::string* ciphertext) override { 954170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko *ciphertext = brillo::data_encoding::Base64Encode(plaintext); 96df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko return encryptor_result_; 97df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko }; 98df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko bool DecryptWithAuthentication(const std::string& ciphertext, 99df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko std::string* plaintext) override { 100df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko return encryptor_result_ && 1014170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko brillo::data_encoding::Base64Decode(ciphertext, plaintext); 102df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko }; 103df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 104df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko // buffet::BuffetConfig::FileIO methods. 105df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko bool ReadFile(const base::FilePath& path, std::string* content) override { 106df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko if (fake_file_content_.count(path.value()) == 0) { 107df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko return false; 108df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko } 109df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko *content = fake_file_content_[path.value()]; 110df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko return io_result_; 111df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko }; 112df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko bool WriteFile(const base::FilePath& path, 113df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko const std::string& content) override { 114df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko if (io_result_) { 115df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko fake_file_content_[path.value()] = content; 116df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko } 117df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko return io_result_; 118df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko }; 119df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 120df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko protected: 121df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko std::map<std::string, std::string> fake_file_content_; 122df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko bool encryptor_result_ = true; 123df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko bool io_result_ = true; 124df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko std::unique_ptr<BuffetConfig> config_; 125df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko}; 126df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 127df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex VakulenkoTEST_F(BuffetConfigTestWithFakes, EncryptionEnabled) { 128e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka config_->SaveSettings("config", "test", {}); 129e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_NE("test", fake_file_content_["settings_file.config"]); 130e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_EQ("test", config_->LoadSettings("config")); 131df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko} 132df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 133df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex VakulenkoTEST_F(BuffetConfigTestWithFakes, EncryptionFailure) { 134e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka config_->SaveSettings("config", "test", {}); 135e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_FALSE(fake_file_content_["settings_file.config"].empty()); 136df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko encryptor_result_ = false; 137e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka config_->SaveSettings("config", "test2", {}); 138df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko // Encryption fails -> file cleared. 139e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_TRUE(fake_file_content_["settings_file.config"].empty()); 140df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko} 141df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 142df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex VakulenkoTEST_F(BuffetConfigTestWithFakes, DecryptionFailure) { 143e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka config_->SaveSettings("config", "test", {}); 144e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_FALSE(fake_file_content_["settings_file.config"].empty()); 145df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko encryptor_result_ = false; 146df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko // Decryption fails -> empty settings loaded. 147e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_TRUE(config_->LoadSettings("config").empty()); 148df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko} 149df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 150df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex VakulenkoTEST_F(BuffetConfigTestWithFakes, SettingsIOFailure) { 151e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka config_->SaveSettings("config", "test", {}); 152e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka std::string original = fake_file_content_["settings_file.config"]; 153df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko ASSERT_FALSE(original.empty()); 154df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko io_result_ = false; 155e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_TRUE(config_->LoadSettings("config").empty()); 156e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka config_->SaveSettings("config2", "test", {}); 157e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka ASSERT_EQ(original, fake_file_content_["settings_file.config"]); 158df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko} 159df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko 1601175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka} // namespace buffet 161