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