buffet: Parse buffet config and load/save state
State is loaded and saved as black box string.
BUG=brillo:1257,brillo:1253
TEST=`FEATURES=test emerge-gizmo libweave buffet`
Change-Id: I21d2b26cf90a046cdba505ab0f265a29f53f9a2b
Reviewed-on: https://chromium-review.googlesource.com/293917
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/libweave/src/buffet_config.cc b/libweave/src/buffet_config.cc
deleted file mode 100644
index 3f5bd8a..0000000
--- a/libweave/src/buffet_config.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-// 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 "libweave/src/buffet_config.h"
-
-#include <set>
-
-#include <base/files/file_util.h>
-#include <base/logging.h>
-#include <base/strings/string_number_conversions.h>
-#include <weave/enum_to_string.h>
-
-#include "libweave/src/storage_impls.h"
-#include "libweave/src/storage_interface.h"
-#include "libweave/src/string_utils.h"
-
-namespace {
-
-bool IsValidAccessRole(const std::string& role) {
- return role == "none" || role == "viewer" || role == "user";
-}
-
-bool StringToTimeDelta(const std::string& value, base::TimeDelta* delta) {
- uint64_t ms{0};
- if (!base::StringToUint64(value, &ms))
- return false;
- *delta = base::TimeDelta::FromMilliseconds(ms);
- return true;
-}
-
-} // namespace
-
-namespace weave {
-
-namespace config_keys {
-
-const char kClientId[] = "client_id";
-const char kClientSecret[] = "client_secret";
-const char kApiKey[] = "api_key";
-const char kOAuthURL[] = "oauth_url";
-const char kServiceURL[] = "service_url";
-const char kName[] = "name";
-const char kDescription[] = "description";
-const char kLocation[] = "location";
-const char kLocalAnonymousAccessRole[] = "local_anonymous_access_role";
-const char kLocalDiscoveryEnabled[] = "local_discovery_enabled";
-const char kLocalPairingEnabled[] = "local_pairing_enabled";
-const char kOemName[] = "oem_name";
-const char kModelName[] = "model_name";
-const char kModelId[] = "model_id";
-const char kPollingPeriodMs[] = "polling_period_ms";
-const char kBackupPollingPeriodMs[] = "backup_polling_period_ms";
-const char kRefreshToken[] = "refresh_token";
-const char kDeviceId[] = "device_id";
-const char kRobotAccount[] = "robot_account";
-const char kWifiAutoSetupEnabled[] = "wifi_auto_setup_enabled";
-const char kBleSetupEnabled[] = "ble_setup_enabled";
-const char kEmbeddedCode[] = "embedded_code";
-const char kPairingModes[] = "pairing_modes";
-const char kLastConfiguredSsid[] = "last_configured_ssid";
-
-} // namespace config_keys
-
-Settings BuffetConfig::CreateDefaultSettings() {
- Settings result;
- result.client_id = "58855907228.apps.googleusercontent.com";
- result.client_secret = "eHSAREAHrIqPsHBxCE9zPPBi";
- result.api_key = "AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA";
- result.oauth_url = "https://accounts.google.com/o/oauth2/";
- result.service_url = "https://www.googleapis.com/clouddevices/v1/";
- result.name = "Developer device";
- result.local_anonymous_access_role = "viewer";
- result.local_discovery_enabled = true;
- result.local_pairing_enabled = true;
- result.oem_name = "Chromium";
- result.model_name = "Brillo";
- result.model_id = "AAAAA";
- result.polling_period = base::TimeDelta::FromSeconds(7);
- result.backup_polling_period = base::TimeDelta::FromMinutes(30);
- result.wifi_auto_setup_enabled = true;
- result.ble_setup_enabled = false;
- result.pairing_modes.emplace(PairingType::kPinCode);
- return result;
-}
-
-BuffetConfig::BuffetConfig(std::unique_ptr<StorageInterface> storage)
- : storage_{std::move(storage)} {
-}
-
-BuffetConfig::BuffetConfig(const base::FilePath& state_path)
- : BuffetConfig{
- std::unique_ptr<StorageInterface>{new FileStorage{state_path}}} {
-}
-
-void BuffetConfig::AddOnChangedCallback(const OnChangedCallback& callback) {
- on_changed_.push_back(callback);
- // Force to read current state.
- callback.Run(settings_);
-}
-
-const Settings& BuffetConfig::GetSettings() const {
- return settings_;
-}
-
-void BuffetConfig::Load(const base::FilePath& config_path) {
- chromeos::KeyValueStore store;
- if (base::PathExists(config_path)) {
- CHECK(store.Load(config_path)) << "Unable to read or parse config file at"
- << config_path.value();
- }
- Load(store);
-}
-
-void BuffetConfig::Load(const chromeos::KeyValueStore& store) {
- Transaction change{this};
- change.save_ = false;
-
- store.GetString(config_keys::kClientId, &settings_.client_id);
- CHECK(!settings_.client_id.empty());
-
- store.GetString(config_keys::kClientSecret, &settings_.client_secret);
- CHECK(!settings_.client_secret.empty());
-
- store.GetString(config_keys::kApiKey, &settings_.api_key);
- CHECK(!settings_.api_key.empty());
-
- store.GetString(config_keys::kOAuthURL, &settings_.oauth_url);
- CHECK(!settings_.oauth_url.empty());
-
- store.GetString(config_keys::kServiceURL, &settings_.service_url);
- CHECK(!settings_.service_url.empty());
-
- store.GetString(config_keys::kOemName, &settings_.oem_name);
- CHECK(!settings_.oem_name.empty());
-
- store.GetString(config_keys::kModelName, &settings_.model_name);
- CHECK(!settings_.model_name.empty());
-
- store.GetString(config_keys::kModelId, &settings_.model_id);
- CHECK(!settings_.model_id.empty());
-
- std::string polling_period_str;
- if (store.GetString(config_keys::kPollingPeriodMs, &polling_period_str))
- CHECK(StringToTimeDelta(polling_period_str, &settings_.polling_period));
-
- if (store.GetString(config_keys::kBackupPollingPeriodMs, &polling_period_str))
- CHECK(StringToTimeDelta(polling_period_str,
- &settings_.backup_polling_period));
-
- store.GetBoolean(config_keys::kWifiAutoSetupEnabled,
- &settings_.wifi_auto_setup_enabled);
-
- store.GetBoolean(config_keys::kBleSetupEnabled,
- &settings_.ble_setup_enabled);
-
- store.GetString(config_keys::kEmbeddedCode, &settings_.embedded_code);
-
- std::string modes_str;
- if (store.GetString(config_keys::kPairingModes, &modes_str)) {
- std::set<PairingType> pairing_modes;
- for (const std::string& mode : Split(modes_str, ",", true, true)) {
- PairingType pairing_mode;
- CHECK(StringToEnum(mode, &pairing_mode));
- pairing_modes.insert(pairing_mode);
- }
- settings_.pairing_modes = std::move(pairing_modes);
- }
-
- // Empty name set by user or server is allowed, still we expect some
- // meaningfull config value.
- store.GetString(config_keys::kName, &settings_.name);
- CHECK(!settings_.name.empty());
-
- store.GetString(config_keys::kDescription, &settings_.description);
- store.GetString(config_keys::kLocation, &settings_.location);
-
- store.GetString(config_keys::kLocalAnonymousAccessRole,
- &settings_.local_anonymous_access_role);
- CHECK(IsValidAccessRole(settings_.local_anonymous_access_role))
- << "Invalid role: " << settings_.local_anonymous_access_role;
-
- store.GetBoolean(config_keys::kLocalDiscoveryEnabled,
- &settings_.local_discovery_enabled);
- store.GetBoolean(config_keys::kLocalPairingEnabled,
- &settings_.local_pairing_enabled);
-
- change.LoadState();
-}
-
-void BuffetConfig::Transaction::LoadState() {
- if (!config_->storage_)
- return;
- auto value = config_->storage_->Load();
- const base::DictionaryValue* dict = nullptr;
- if (!value || !value->GetAsDictionary(&dict))
- return;
-
- std::string tmp;
- bool tmp_bool{false};
-
- if (dict->GetString(config_keys::kClientId, &tmp))
- set_client_id(tmp);
-
- if (dict->GetString(config_keys::kClientSecret, &tmp))
- set_client_secret(tmp);
-
- if (dict->GetString(config_keys::kApiKey, &tmp))
- set_api_key(tmp);
-
- if (dict->GetString(config_keys::kOAuthURL, &tmp))
- set_oauth_url(tmp);
-
- if (dict->GetString(config_keys::kServiceURL, &tmp))
- set_service_url(tmp);
-
- if (dict->GetString(config_keys::kName, &tmp))
- set_name(tmp);
-
- if (dict->GetString(config_keys::kDescription, &tmp))
- set_description(tmp);
-
- if (dict->GetString(config_keys::kLocation, &tmp))
- set_location(tmp);
-
- if (dict->GetString(config_keys::kLocalAnonymousAccessRole, &tmp))
- set_local_anonymous_access_role(tmp);
-
- if (dict->GetBoolean(config_keys::kLocalDiscoveryEnabled, &tmp_bool))
- set_local_discovery_enabled(tmp_bool);
-
- if (dict->GetBoolean(config_keys::kLocalPairingEnabled, &tmp_bool))
- set_local_pairing_enabled(tmp_bool);
-
- if (dict->GetString(config_keys::kRefreshToken, &tmp))
- set_refresh_token(tmp);
-
- if (dict->GetString(config_keys::kRobotAccount, &tmp))
- set_robot_account(tmp);
-
- if (dict->GetString(config_keys::kLastConfiguredSsid, &tmp))
- set_last_configured_ssid(tmp);
-
- if (dict->GetString(config_keys::kDeviceId, &tmp))
- set_device_id(tmp);
-}
-
-bool BuffetConfig::Save() {
- if (!storage_)
- return false;
- base::DictionaryValue dict;
- dict.SetString(config_keys::kClientId, settings_.client_id);
- dict.SetString(config_keys::kClientSecret, settings_.client_secret);
- dict.SetString(config_keys::kApiKey, settings_.api_key);
- dict.SetString(config_keys::kOAuthURL, settings_.oauth_url);
- dict.SetString(config_keys::kServiceURL, settings_.service_url);
- dict.SetString(config_keys::kRefreshToken, settings_.refresh_token);
- dict.SetString(config_keys::kDeviceId, settings_.device_id);
- dict.SetString(config_keys::kRobotAccount, settings_.robot_account);
- dict.SetString(config_keys::kLastConfiguredSsid,
- settings_.last_configured_ssid);
- dict.SetString(config_keys::kName, settings_.name);
- dict.SetString(config_keys::kDescription, settings_.description);
- dict.SetString(config_keys::kLocation, settings_.location);
- dict.SetString(config_keys::kLocalAnonymousAccessRole,
- settings_.local_anonymous_access_role);
- dict.SetBoolean(config_keys::kLocalDiscoveryEnabled,
- settings_.local_discovery_enabled);
- dict.SetBoolean(config_keys::kLocalPairingEnabled,
- settings_.local_pairing_enabled);
-
- return storage_->Save(dict);
-}
-
-BuffetConfig::Transaction::~Transaction() {
- Commit();
-}
-
-bool BuffetConfig::Transaction::set_local_anonymous_access_role(
- const std::string& role) {
- if (!IsValidAccessRole(role)) {
- LOG(ERROR) << "Invalid role: " << role;
- return false;
- }
- settings_->local_anonymous_access_role = role;
- return true;
-}
-
-void BuffetConfig::Transaction::Commit() {
- if (!config_)
- return;
- if (save_)
- config_->Save();
- for (const auto& cb : config_->on_changed_)
- cb.Run(*settings_);
- config_ = nullptr;
-}
-
-} // namespace weave
diff --git a/libweave/src/buffet_config.h b/libweave/src/buffet_config.h
deleted file mode 100644
index f8a387f..0000000
--- a/libweave/src/buffet_config.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// 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.
-
-#ifndef LIBWEAVE_SRC_BUFFET_CONFIG_H_
-#define LIBWEAVE_SRC_BUFFET_CONFIG_H_
-
-#include <set>
-#include <string>
-#include <vector>
-
-#include <base/callback.h>
-#include <base/files/file_path.h>
-#include <weave/error.h>
-#include <chromeos/key_value_store.h>
-#include <weave/config.h>
-
-#include "libweave/src/privet/security_delegate.h"
-
-namespace weave {
-
-class StorageInterface;
-
-// Handles reading buffet config and state files.
-class BuffetConfig final : public Config {
- public:
- using OnChangedCallback = base::Callback<void(const Settings&)>;
- ~BuffetConfig() override = default;
-
- explicit BuffetConfig(std::unique_ptr<StorageInterface> storage);
-
- explicit BuffetConfig(const base::FilePath& state_path);
-
- // Config overrides.
- void AddOnChangedCallback(const OnChangedCallback& callback) override;
- const Settings& GetSettings() const override;
-
- void Load(const base::FilePath& config_path);
- void Load(const chromeos::KeyValueStore& store);
-
- // Allows editing of config. Makes sure that callbacks were called and changes
- // were saved.
- // User can commit changes by calling Commit method or by destroying the
- // object.
- class Transaction final {
- public:
- explicit Transaction(BuffetConfig* config)
- : config_(config), settings_(&config->settings_) {
- CHECK(config_);
- }
-
- ~Transaction();
-
- void set_client_id(const std::string& id) { settings_->client_id = id; }
- void set_client_secret(const std::string& secret) {
- settings_->client_secret = secret;
- }
- void set_api_key(const std::string& key) { settings_->api_key = key; }
- void set_oauth_url(const std::string& url) { settings_->oauth_url = url; }
- void set_service_url(const std::string& url) {
- settings_->service_url = url;
- }
- void set_name(const std::string& name) { settings_->name = name; }
- void set_description(const std::string& description) {
- settings_->description = description;
- }
- void set_location(const std::string& location) {
- settings_->location = location;
- }
- bool set_local_anonymous_access_role(const std::string& role);
- void set_local_discovery_enabled(bool enabled) {
- settings_->local_discovery_enabled = enabled;
- }
- void set_local_pairing_enabled(bool enabled) {
- settings_->local_pairing_enabled = enabled;
- }
- void set_device_id(const std::string& id) { settings_->device_id = id; }
- void set_refresh_token(const std::string& token) {
- settings_->refresh_token = token;
- }
- void set_robot_account(const std::string& account) {
- settings_->robot_account = account;
- }
- void set_last_configured_ssid(const std::string& ssid) {
- settings_->last_configured_ssid = ssid;
- }
-
- void Commit();
-
- private:
- friend class BuffetConfig;
- void LoadState();
- BuffetConfig* config_;
- Settings* settings_;
- bool save_{true};
- };
-
- const std::string& client_id() const { return settings_.client_id; }
- const std::string& client_secret() const { return settings_.client_secret; }
- const std::string& api_key() const { return settings_.api_key; }
- const std::string& oauth_url() const { return settings_.oauth_url; }
- const std::string& service_url() const { return settings_.service_url; }
- const std::string& oem_name() const { return settings_.oem_name; }
- const std::string& model_name() const { return settings_.model_name; }
- const std::string& model_id() const { return settings_.model_id; }
- base::TimeDelta polling_period() const { return settings_.polling_period; }
- base::TimeDelta backup_polling_period() const {
- return settings_.backup_polling_period;
- }
-
- bool wifi_auto_setup_enabled() const {
- return settings_.wifi_auto_setup_enabled;
- }
- bool ble_setup_enabled() const {
- return settings_.ble_setup_enabled;
- }
- const std::set<PairingType>& pairing_modes() const {
- return settings_.pairing_modes;
- }
- const std::string& embedded_code() const { return settings_.embedded_code; }
-
- const std::string& name() const { return settings_.name; }
- const std::string& description() const { return settings_.description; }
- const std::string& location() const { return settings_.location; }
- const std::string& local_anonymous_access_role() const {
- return settings_.local_anonymous_access_role;
- }
- bool local_pairing_enabled() const { return settings_.local_pairing_enabled; }
- bool local_discovery_enabled() const {
- return settings_.local_discovery_enabled;
- }
-
- const std::string& device_id() const { return settings_.device_id; }
- const std::string& refresh_token() const { return settings_.refresh_token; }
- const std::string& robot_account() const { return settings_.robot_account; }
- const std::string& last_configured_ssid() const {
- return settings_.last_configured_ssid;
- }
-
- private:
- bool Save();
- static Settings CreateDefaultSettings();
-
- Settings settings_ = CreateDefaultSettings();
-
- // Serialization interface to save and load buffet state.
- std::unique_ptr<StorageInterface> storage_;
-
- std::vector<OnChangedCallback> on_changed_;
-
- DISALLOW_COPY_AND_ASSIGN(BuffetConfig);
-};
-
-} // namespace weave
-
-#endif // LIBWEAVE_SRC_BUFFET_CONFIG_H_
diff --git a/libweave/src/buffet_config_unittest.cc b/libweave/src/buffet_config_unittest.cc
deleted file mode 100644
index 38bb5b8..0000000
--- a/libweave/src/buffet_config_unittest.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-// Copyright 2014 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 "libweave/src/buffet_config.h"
-
-#include <set>
-
-#include <base/bind.h>
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include "libweave/src/commands/unittest_utils.h"
-#include "libweave/src/storage_impls.h"
-
-using testing::_;
-
-namespace weave {
-
-class BuffetConfigTest : public ::testing::Test {
- protected:
- void SetUp() override {
- EXPECT_CALL(*this, OnConfigChanged(_))
- .Times(1); // Called from AddOnChangedCallback
-
- std::unique_ptr<StorageInterface> storage{new MemStorage};
- storage_ = storage.get();
- config_.reset(new BuffetConfig{std::move(storage)});
-
- config_->AddOnChangedCallback(
- base::Bind(&BuffetConfigTest::OnConfigChanged, base::Unretained(this)));
- }
-
- MOCK_METHOD1(OnConfigChanged, void(const Settings&));
-
- StorageInterface* storage_{nullptr};
- std::unique_ptr<BuffetConfig> config_;
- const BuffetConfig default_{nullptr};
-};
-
-TEST_F(BuffetConfigTest, NoStorage) {
- BuffetConfig config{nullptr};
- BuffetConfig::Transaction change{&config};
- change.Commit();
-}
-
-TEST_F(BuffetConfigTest, Defaults) {
- EXPECT_EQ("58855907228.apps.googleusercontent.com", config_->client_id());
- EXPECT_EQ("eHSAREAHrIqPsHBxCE9zPPBi", config_->client_secret());
- EXPECT_EQ("AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA", config_->api_key());
- EXPECT_EQ("https://accounts.google.com/o/oauth2/", config_->oauth_url());
- EXPECT_EQ("https://www.googleapis.com/clouddevices/v1/",
- config_->service_url());
- EXPECT_EQ("Chromium", config_->oem_name());
- EXPECT_EQ("Brillo", config_->model_name());
- EXPECT_EQ("AAAAA", config_->model_id());
- EXPECT_EQ(base::TimeDelta::FromSeconds(7), config_->polling_period());
- EXPECT_EQ(base::TimeDelta::FromMinutes(30), config_->backup_polling_period());
- EXPECT_TRUE(config_->wifi_auto_setup_enabled());
- EXPECT_FALSE(config_->ble_setup_enabled());
- EXPECT_EQ(std::set<PairingType>{PairingType::kPinCode},
- config_->pairing_modes());
- EXPECT_EQ("", config_->embedded_code());
- EXPECT_EQ("Developer device", config_->name());
- EXPECT_EQ("", config_->description());
- EXPECT_EQ("", config_->location());
- EXPECT_EQ("viewer", config_->local_anonymous_access_role());
- EXPECT_TRUE(config_->local_pairing_enabled());
- EXPECT_TRUE(config_->local_discovery_enabled());
- EXPECT_EQ("", config_->device_id());
- EXPECT_EQ("", config_->refresh_token());
- EXPECT_EQ("", config_->robot_account());
- EXPECT_EQ("", config_->last_configured_ssid());
-}
-
-TEST_F(BuffetConfigTest, LoadConfig) {
- chromeos::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,ultrasound32,audible32");
- config_store.SetString("embedded_code", "1234");
- 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");
-
- EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
- config_->Load(config_store);
-
- EXPECT_EQ("conf_client_id", config_->client_id());
- EXPECT_EQ("conf_client_secret", config_->client_secret());
- EXPECT_EQ("conf_api_key", config_->api_key());
- EXPECT_EQ("conf_oauth_url", config_->oauth_url());
- EXPECT_EQ("conf_service_url", config_->service_url());
- EXPECT_EQ("conf_oem_name", config_->oem_name());
- EXPECT_EQ("conf_model_name", config_->model_name());
- EXPECT_EQ("ABCDE", config_->model_id());
- EXPECT_EQ(base::TimeDelta::FromMilliseconds(12345),
- config_->polling_period());
- EXPECT_EQ(base::TimeDelta::FromMilliseconds(6589),
- config_->backup_polling_period());
- EXPECT_FALSE(config_->wifi_auto_setup_enabled());
- EXPECT_TRUE(config_->ble_setup_enabled());
- std::set<PairingType> pairing_types{
- PairingType::kPinCode, PairingType::kEmbeddedCode,
- PairingType::kUltrasound32, PairingType::kAudible32};
- EXPECT_EQ(pairing_types, config_->pairing_modes());
- EXPECT_EQ("1234", config_->embedded_code());
- EXPECT_EQ("conf_name", config_->name());
- EXPECT_EQ("conf_description", config_->description());
- EXPECT_EQ("conf_location", config_->location());
- EXPECT_EQ("user", config_->local_anonymous_access_role());
- EXPECT_FALSE(config_->local_pairing_enabled());
- EXPECT_FALSE(config_->local_discovery_enabled());
-
- // Not from config.
- EXPECT_EQ(default_.device_id(), config_->device_id());
- EXPECT_EQ(default_.refresh_token(), config_->refresh_token());
- EXPECT_EQ(default_.robot_account(), config_->robot_account());
- EXPECT_EQ(default_.last_configured_ssid(), config_->last_configured_ssid());
-
- // Nothing should be saved yet.
- EXPECT_JSON_EQ("{}", *storage_->Load());
-
- BuffetConfig::Transaction change{config_.get()};
- EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
- change.Commit();
-
- auto expected = R"({
- 'api_key': 'conf_api_key',
- 'client_id': 'conf_client_id',
- 'client_secret': 'conf_client_secret',
- 'description': 'conf_description',
- 'device_id': '',
- 'local_anonymous_access_role': 'user',
- 'local_discovery_enabled': false,
- 'local_pairing_enabled': false,
- 'location': 'conf_location',
- 'name': 'conf_name',
- 'oauth_url': 'conf_oauth_url',
- 'refresh_token': '',
- 'robot_account': '',
- 'last_configured_ssid': '',
- 'service_url': 'conf_service_url'
- })";
- EXPECT_JSON_EQ(expected, *storage_->Load());
-}
-
-TEST_F(BuffetConfigTest, LoadState) {
- auto state = R"({
- 'api_key': 'state_api_key',
- 'client_id': 'state_client_id',
- 'client_secret': 'state_client_secret',
- 'description': 'state_description',
- 'device_id': 'state_device_id',
- 'local_anonymous_access_role': 'user',
- 'local_discovery_enabled': false,
- 'local_pairing_enabled': false,
- 'location': 'state_location',
- 'name': 'state_name',
- 'oauth_url': 'state_oauth_url',
- 'refresh_token': 'state_refresh_token',
- 'robot_account': 'state_robot_account',
- 'last_configured_ssid': 'state_last_configured_ssid',
- 'service_url': 'state_service_url'
- })";
- storage_->Save(*unittests::CreateDictionaryValue(state));
-
- chromeos::KeyValueStore config_store;
- EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
- config_->Load(config_store);
-
- // Clear storage.
- storage_->Save(base::DictionaryValue());
-
- EXPECT_EQ("state_client_id", config_->client_id());
- EXPECT_EQ("state_client_secret", config_->client_secret());
- EXPECT_EQ("state_api_key", config_->api_key());
- EXPECT_EQ("state_oauth_url", config_->oauth_url());
- EXPECT_EQ("state_service_url", config_->service_url());
- EXPECT_EQ(default_.oem_name(), config_->oem_name());
- EXPECT_EQ(default_.model_name(), config_->model_name());
- EXPECT_EQ(default_.model_id(), config_->model_id());
- EXPECT_EQ(default_.polling_period(), config_->polling_period());
- EXPECT_EQ(default_.backup_polling_period(), config_->backup_polling_period());
- EXPECT_EQ(default_.wifi_auto_setup_enabled(),
- config_->wifi_auto_setup_enabled());
- EXPECT_EQ(default_.ble_setup_enabled(),
- config_->ble_setup_enabled());
- EXPECT_EQ(default_.pairing_modes(), config_->pairing_modes());
- EXPECT_EQ(default_.embedded_code(), config_->embedded_code());
- EXPECT_EQ("state_name", config_->name());
- EXPECT_EQ("state_description", config_->description());
- EXPECT_EQ("state_location", config_->location());
- EXPECT_EQ("user", config_->local_anonymous_access_role());
- EXPECT_FALSE(config_->local_pairing_enabled());
- EXPECT_FALSE(config_->local_discovery_enabled());
- EXPECT_EQ("state_device_id", config_->device_id());
- EXPECT_EQ("state_refresh_token", config_->refresh_token());
- EXPECT_EQ("state_robot_account", config_->robot_account());
- EXPECT_EQ("state_last_configured_ssid", config_->last_configured_ssid());
-
- // Nothing should be saved yet.
- EXPECT_JSON_EQ("{}", *storage_->Load());
-
- BuffetConfig::Transaction change{config_.get()};
- EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
- change.Commit();
-
- EXPECT_JSON_EQ(state, *storage_->Load());
-}
-
-TEST_F(BuffetConfigTest, Setters) {
- BuffetConfig::Transaction change{config_.get()};
-
- change.set_client_id("set_client_id");
- EXPECT_EQ("set_client_id", config_->client_id());
-
- change.set_client_secret("set_client_secret");
- EXPECT_EQ("set_client_secret", config_->client_secret());
-
- change.set_api_key("set_api_key");
- EXPECT_EQ("set_api_key", config_->api_key());
-
- change.set_oauth_url("set_oauth_url");
- EXPECT_EQ("set_oauth_url", config_->oauth_url());
-
- change.set_service_url("set_service_url");
- EXPECT_EQ("set_service_url", config_->service_url());
-
- change.set_name("set_name");
- EXPECT_EQ("set_name", config_->name());
-
- change.set_description("set_description");
- EXPECT_EQ("set_description", config_->description());
-
- change.set_location("set_location");
- EXPECT_EQ("set_location", config_->location());
-
- change.set_local_anonymous_access_role("viewer");
- EXPECT_EQ("viewer", config_->local_anonymous_access_role());
-
- change.set_local_anonymous_access_role("none");
- EXPECT_EQ("none", config_->local_anonymous_access_role());
-
- change.set_local_anonymous_access_role("user");
- EXPECT_EQ("user", config_->local_anonymous_access_role());
-
- change.set_local_discovery_enabled(false);
- EXPECT_FALSE(config_->local_discovery_enabled());
-
- change.set_local_pairing_enabled(false);
- EXPECT_FALSE(config_->local_pairing_enabled());
-
- change.set_local_discovery_enabled(true);
- EXPECT_TRUE(config_->local_discovery_enabled());
-
- change.set_local_pairing_enabled(true);
- EXPECT_TRUE(config_->local_pairing_enabled());
-
- change.set_device_id("set_id");
- EXPECT_EQ("set_id", config_->device_id());
-
- change.set_refresh_token("set_token");
- EXPECT_EQ("set_token", config_->refresh_token());
-
- change.set_robot_account("set_account");
- EXPECT_EQ("set_account", config_->robot_account());
-
- change.set_last_configured_ssid("set_last_configured_ssid");
- EXPECT_EQ("set_last_configured_ssid", config_->last_configured_ssid());
-
- EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
- change.Commit();
-
- auto expected = R"({
- 'api_key': 'set_api_key',
- 'client_id': 'set_client_id',
- 'client_secret': 'set_client_secret',
- 'description': 'set_description',
- 'device_id': 'set_id',
- 'local_anonymous_access_role': 'user',
- 'local_discovery_enabled': true,
- 'local_pairing_enabled': true,
- 'location': 'set_location',
- 'name': 'set_name',
- 'oauth_url': 'set_oauth_url',
- 'refresh_token': 'set_token',
- 'robot_account': 'set_account',
- 'last_configured_ssid': 'set_last_configured_ssid',
- 'service_url': 'set_service_url'
- })";
- EXPECT_JSON_EQ(expected, *storage_->Load());
-}
-} // namespace weave