Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 1 | // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "buffet/buffet_config.h" |
| 6 | |
| 7 | #include <base/bind.h> |
| 8 | #include <gmock/gmock.h> |
| 9 | #include <gtest/gtest.h> |
| 10 | |
| 11 | #include "buffet/commands/unittest_utils.h" |
| 12 | #include "buffet/storage_impls.h" |
| 13 | |
| 14 | using testing::_; |
| 15 | |
| 16 | namespace buffet { |
| 17 | |
| 18 | class BuffetConfigTest : public ::testing::Test { |
| 19 | protected: |
| 20 | void SetUp() override { |
| 21 | EXPECT_CALL(*this, OnConfigChanged(_)) |
| 22 | .Times(1); // Called from AddOnChangedCallback |
| 23 | |
| 24 | std::unique_ptr<StorageInterface> storage{new MemStorage}; |
| 25 | storage_ = storage.get(); |
| 26 | config_.reset(new BuffetConfig{std::move(storage)}); |
| 27 | |
| 28 | config_->AddOnChangedCallback( |
| 29 | base::Bind(&BuffetConfigTest::OnConfigChanged, base::Unretained(this))); |
| 30 | } |
| 31 | |
| 32 | MOCK_METHOD1(OnConfigChanged, void(const BuffetConfig&)); |
| 33 | |
| 34 | StorageInterface* storage_{nullptr}; |
| 35 | std::unique_ptr<BuffetConfig> config_; |
| 36 | const BuffetConfig default_{nullptr}; |
| 37 | }; |
| 38 | |
| 39 | TEST_F(BuffetConfigTest, NoStorage) { |
| 40 | BuffetConfig config{nullptr}; |
| 41 | BuffetConfig::Transaction change{&config}; |
| 42 | change.Commit(); |
| 43 | } |
| 44 | |
| 45 | TEST_F(BuffetConfigTest, Defaults) { |
| 46 | EXPECT_EQ("58855907228.apps.googleusercontent.com", config_->client_id()); |
| 47 | EXPECT_EQ("eHSAREAHrIqPsHBxCE9zPPBi", config_->client_secret()); |
| 48 | EXPECT_EQ("AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA", config_->api_key()); |
| 49 | EXPECT_EQ("https://accounts.google.com/o/oauth2/", config_->oauth_url()); |
| 50 | EXPECT_EQ("https://www.googleapis.com/clouddevices/v1/", |
| 51 | config_->service_url()); |
| 52 | EXPECT_EQ("Chromium", config_->oem_name()); |
| 53 | EXPECT_EQ("Brillo", config_->model_name()); |
| 54 | EXPECT_EQ("AAAAA", config_->model_id()); |
| 55 | EXPECT_EQ("vendor", config_->device_kind()); |
| 56 | EXPECT_EQ(7000, config_->polling_period_ms()); |
| 57 | EXPECT_EQ("Developer device", config_->name()); |
| 58 | EXPECT_EQ("", config_->description()); |
| 59 | EXPECT_EQ("", config_->location()); |
| 60 | EXPECT_EQ("viewer", config_->local_anonymous_access_role()); |
| 61 | EXPECT_TRUE(config_->local_pairing_enabled()); |
| 62 | EXPECT_TRUE(config_->local_discovery_enabled()); |
| 63 | EXPECT_EQ("", config_->device_id()); |
| 64 | EXPECT_EQ("", config_->refresh_token()); |
| 65 | EXPECT_EQ("", config_->robot_account()); |
| 66 | } |
| 67 | |
| 68 | TEST_F(BuffetConfigTest, LoadConfig) { |
| 69 | chromeos::KeyValueStore config_store; |
| 70 | config_store.SetString("client_id", "conf_client_id"); |
| 71 | config_store.SetString("client_secret", "conf_client_secret"); |
| 72 | config_store.SetString("api_key", "conf_api_key"); |
| 73 | config_store.SetString("oauth_url", "conf_oauth_url"); |
| 74 | config_store.SetString("service_url", "conf_service_url"); |
| 75 | config_store.SetString("oem_name", "conf_oem_name"); |
| 76 | config_store.SetString("model_name", "conf_model_name"); |
| 77 | config_store.SetString("model_id", "ABCDE"); |
| 78 | config_store.SetString("polling_period_ms", "12345"); |
| 79 | config_store.SetString("name", "conf_name"); |
| 80 | config_store.SetString("description", "conf_description"); |
| 81 | config_store.SetString("location", "conf_location"); |
| 82 | config_store.SetString("local_anonymous_access_role", "user"); |
| 83 | config_store.SetBoolean("local_pairing_enabled", false); |
| 84 | config_store.SetBoolean("local_discovery_enabled", false); |
| 85 | |
| 86 | // Following will be ignored. |
| 87 | config_store.SetString("device_kind", "conf_device_kind"); |
| 88 | config_store.SetString("device_id", "conf_device_id"); |
| 89 | config_store.SetString("refresh_token", "conf_refresh_token"); |
| 90 | config_store.SetString("robot_account", "conf_robot_account"); |
| 91 | |
| 92 | EXPECT_CALL(*this, OnConfigChanged(_)).Times(1); |
| 93 | config_->Load(config_store); |
| 94 | |
| 95 | EXPECT_EQ("conf_client_id", config_->client_id()); |
| 96 | EXPECT_EQ("conf_client_secret", config_->client_secret()); |
| 97 | EXPECT_EQ("conf_api_key", config_->api_key()); |
| 98 | EXPECT_EQ("conf_oauth_url", config_->oauth_url()); |
| 99 | EXPECT_EQ("conf_service_url", config_->service_url()); |
| 100 | EXPECT_EQ("conf_oem_name", config_->oem_name()); |
| 101 | EXPECT_EQ("conf_model_name", config_->model_name()); |
| 102 | EXPECT_EQ("ABCDE", config_->model_id()); |
| 103 | EXPECT_EQ("developmentBoard", config_->device_kind()); |
| 104 | EXPECT_EQ(12345, config_->polling_period_ms()); |
| 105 | EXPECT_EQ("conf_name", config_->name()); |
| 106 | EXPECT_EQ("conf_description", config_->description()); |
| 107 | EXPECT_EQ("conf_location", config_->location()); |
| 108 | EXPECT_EQ("user", config_->local_anonymous_access_role()); |
| 109 | EXPECT_FALSE(config_->local_pairing_enabled()); |
| 110 | EXPECT_FALSE(config_->local_discovery_enabled()); |
| 111 | |
| 112 | // Not from config. |
| 113 | EXPECT_EQ(default_.device_id(), config_->device_id()); |
| 114 | EXPECT_EQ(default_.refresh_token(), config_->refresh_token()); |
| 115 | EXPECT_EQ(default_.robot_account(), config_->robot_account()); |
| 116 | |
| 117 | // Nothing should be saved yet. |
| 118 | EXPECT_JSON_EQ("{}", *storage_->Load()); |
| 119 | |
| 120 | BuffetConfig::Transaction change{config_.get()}; |
| 121 | EXPECT_CALL(*this, OnConfigChanged(_)).Times(1); |
| 122 | change.Commit(); |
| 123 | |
| 124 | auto expected = R"({ |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 125 | 'api_key': 'conf_api_key', |
| 126 | 'client_id': 'conf_client_id', |
| 127 | 'client_secret': 'conf_client_secret', |
| 128 | 'description': 'conf_description', |
| 129 | 'device_id': '', |
| 130 | 'local_anonymous_access_role': 'user', |
| 131 | 'local_discovery_enabled': false, |
| 132 | 'local_pairing_enabled': false, |
| 133 | 'location': 'conf_location', |
| 134 | 'name': 'conf_name', |
| 135 | 'oauth_url': 'conf_oauth_url', |
| 136 | 'refresh_token': '', |
| 137 | 'robot_account': '', |
| 138 | 'service_url': 'conf_service_url' |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 139 | })"; |
| 140 | EXPECT_JSON_EQ(expected, *storage_->Load()); |
| 141 | } |
| 142 | |
| 143 | TEST_F(BuffetConfigTest, LoadState) { |
| 144 | auto state = R"({ |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 145 | 'api_key': 'state_api_key', |
| 146 | 'client_id': 'state_client_id', |
| 147 | 'client_secret': 'state_client_secret', |
| 148 | 'description': 'state_description', |
| 149 | 'device_id': 'state_device_id', |
| 150 | 'local_anonymous_access_role': 'user', |
| 151 | 'local_discovery_enabled': false, |
| 152 | 'local_pairing_enabled': false, |
| 153 | 'location': 'state_location', |
| 154 | 'name': 'state_name', |
| 155 | 'oauth_url': 'state_oauth_url', |
| 156 | 'refresh_token': 'state_refresh_token', |
| 157 | 'robot_account': 'state_robot_account', |
| 158 | 'service_url': 'state_service_url' |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 159 | })"; |
| 160 | storage_->Save(*buffet::unittests::CreateDictionaryValue(state)); |
| 161 | |
| 162 | chromeos::KeyValueStore config_store; |
| 163 | EXPECT_CALL(*this, OnConfigChanged(_)).Times(1); |
| 164 | config_->Load(config_store); |
| 165 | |
| 166 | // Clear storage. |
| 167 | storage_->Save(base::DictionaryValue()); |
| 168 | |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 169 | EXPECT_EQ("state_client_id", config_->client_id()); |
| 170 | EXPECT_EQ("state_client_secret", config_->client_secret()); |
| 171 | EXPECT_EQ("state_api_key", config_->api_key()); |
| 172 | EXPECT_EQ("state_oauth_url", config_->oauth_url()); |
| 173 | EXPECT_EQ("state_service_url", config_->service_url()); |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 174 | EXPECT_EQ(default_.oem_name(), config_->oem_name()); |
| 175 | EXPECT_EQ(default_.model_name(), config_->model_name()); |
| 176 | EXPECT_EQ(default_.model_id(), config_->model_id()); |
| 177 | EXPECT_EQ(default_.device_kind(), config_->device_kind()); |
| 178 | EXPECT_EQ(default_.polling_period_ms(), config_->polling_period_ms()); |
| 179 | EXPECT_EQ("state_name", config_->name()); |
| 180 | EXPECT_EQ("state_description", config_->description()); |
| 181 | EXPECT_EQ("state_location", config_->location()); |
| 182 | EXPECT_EQ("user", config_->local_anonymous_access_role()); |
| 183 | EXPECT_FALSE(config_->local_pairing_enabled()); |
| 184 | EXPECT_FALSE(config_->local_discovery_enabled()); |
| 185 | EXPECT_EQ("state_device_id", config_->device_id()); |
| 186 | EXPECT_EQ("state_refresh_token", config_->refresh_token()); |
| 187 | EXPECT_EQ("state_robot_account", config_->robot_account()); |
| 188 | |
| 189 | // Nothing should be saved yet. |
| 190 | EXPECT_JSON_EQ("{}", *storage_->Load()); |
| 191 | |
| 192 | BuffetConfig::Transaction change{config_.get()}; |
| 193 | EXPECT_CALL(*this, OnConfigChanged(_)).Times(1); |
| 194 | change.Commit(); |
| 195 | |
| 196 | EXPECT_JSON_EQ(state, *storage_->Load()); |
| 197 | } |
| 198 | |
| 199 | TEST_F(BuffetConfigTest, Setters) { |
| 200 | BuffetConfig::Transaction change{config_.get()}; |
| 201 | |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 202 | change.set_client_id("set_client_id"); |
| 203 | EXPECT_EQ("set_client_id", config_->client_id()); |
| 204 | |
| 205 | change.set_client_secret("set_client_secret"); |
| 206 | EXPECT_EQ("set_client_secret", config_->client_secret()); |
| 207 | |
| 208 | change.set_api_key("set_api_key"); |
| 209 | EXPECT_EQ("set_api_key", config_->api_key()); |
| 210 | |
| 211 | change.set_oauth_url("set_oauth_url"); |
| 212 | EXPECT_EQ("set_oauth_url", config_->oauth_url()); |
| 213 | |
| 214 | change.set_service_url("set_service_url"); |
| 215 | EXPECT_EQ("set_service_url", config_->service_url()); |
| 216 | |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 217 | change.set_name("set_name"); |
| 218 | EXPECT_EQ("set_name", config_->name()); |
| 219 | |
| 220 | change.set_description("set_description"); |
| 221 | EXPECT_EQ("set_description", config_->description()); |
| 222 | |
| 223 | change.set_location("set_location"); |
| 224 | EXPECT_EQ("set_location", config_->location()); |
| 225 | |
| 226 | change.set_local_anonymous_access_role("viewer"); |
| 227 | EXPECT_EQ("viewer", config_->local_anonymous_access_role()); |
| 228 | |
| 229 | change.set_local_anonymous_access_role("none"); |
| 230 | EXPECT_EQ("none", config_->local_anonymous_access_role()); |
| 231 | |
| 232 | change.set_local_anonymous_access_role("user"); |
| 233 | EXPECT_EQ("user", config_->local_anonymous_access_role()); |
| 234 | |
| 235 | change.set_local_discovery_enabled(false); |
| 236 | EXPECT_FALSE(config_->local_discovery_enabled()); |
| 237 | |
| 238 | change.set_local_pairing_enabled(false); |
| 239 | EXPECT_FALSE(config_->local_pairing_enabled()); |
| 240 | |
| 241 | change.set_local_discovery_enabled(true); |
| 242 | EXPECT_TRUE(config_->local_discovery_enabled()); |
| 243 | |
| 244 | change.set_local_pairing_enabled(true); |
| 245 | EXPECT_TRUE(config_->local_pairing_enabled()); |
| 246 | |
| 247 | change.set_device_id("set_id"); |
| 248 | EXPECT_EQ("set_id", config_->device_id()); |
| 249 | |
| 250 | change.set_refresh_token("set_token"); |
| 251 | EXPECT_EQ("set_token", config_->refresh_token()); |
| 252 | |
| 253 | change.set_robot_account("set_account"); |
| 254 | EXPECT_EQ("set_account", config_->robot_account()); |
| 255 | |
| 256 | EXPECT_CALL(*this, OnConfigChanged(_)).Times(1); |
| 257 | change.Commit(); |
| 258 | |
| 259 | auto expected = R"({ |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 260 | 'api_key': 'set_api_key', |
| 261 | 'client_id': 'set_client_id', |
| 262 | 'client_secret': 'set_client_secret', |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 263 | 'description': 'set_description', |
| 264 | 'device_id': 'set_id', |
| 265 | 'local_anonymous_access_role': 'user', |
| 266 | 'local_discovery_enabled': true, |
| 267 | 'local_pairing_enabled': true, |
| 268 | 'location': 'set_location', |
| 269 | 'name': 'set_name', |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 270 | 'oauth_url': 'set_oauth_url', |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 271 | 'refresh_token': 'set_token', |
Vitaly Buka | ff81db6 | 2015-05-14 21:25:45 -0700 | [diff] [blame] | 272 | 'robot_account': 'set_account', |
| 273 | 'service_url': 'set_service_url' |
Vitaly Buka | ee7a3af | 2015-05-14 16:57:23 -0700 | [diff] [blame] | 274 | })"; |
| 275 | EXPECT_JSON_EQ(expected, *storage_->Load()); |
| 276 | } |
| 277 | } // namespace buffet |