Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/value_store/value_store_unittest.h" | 5 #include "extensions/browser/value_store/value_store_unittest.h" |
| 6 | 6 |
| 7 #include <utility> | |
| 8 | |
| 7 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 8 #include "base/memory/linked_ptr.h" | 10 #include "base/memory/linked_ptr.h" |
| 9 #include "base/values.h" | 11 #include "base/values.h" |
| 10 | 12 |
| 11 using content::BrowserThread; | 13 using content::BrowserThread; |
| 12 | 14 |
| 13 namespace { | 15 namespace { |
| 14 | 16 |
| 15 // To save typing ValueStore::DEFAULTS everywhere. | 17 // To save typing ValueStore::DEFAULTS everywhere. |
| 16 const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS; | 18 const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 list123_.push_back(key2_); | 151 list123_.push_back(key2_); |
| 150 list123_.push_back(key3_); | 152 list123_.push_back(key3_); |
| 151 | 153 |
| 152 set1_.insert(list1_.begin(), list1_.end()); | 154 set1_.insert(list1_.begin(), list1_.end()); |
| 153 set2_.insert(list2_.begin(), list2_.end()); | 155 set2_.insert(list2_.begin(), list2_.end()); |
| 154 set3_.insert(list3_.begin(), list3_.end()); | 156 set3_.insert(list3_.begin(), list3_.end()); |
| 155 set12_.insert(list12_.begin(), list12_.end()); | 157 set12_.insert(list12_.begin(), list12_.end()); |
| 156 set13_.insert(list13_.begin(), list13_.end()); | 158 set13_.insert(list13_.begin(), list13_.end()); |
| 157 set123_.insert(list123_.begin(), list123_.end()); | 159 set123_.insert(list123_.begin(), list123_.end()); |
| 158 | 160 |
| 159 dict1_->Set(key1_, val1_->DeepCopy()); | 161 dict1_->Set(key1_, val1_->CreateDeepCopy()); |
| 160 dict3_->Set(key3_, val3_->DeepCopy()); | 162 dict3_->Set(key3_, val3_->CreateDeepCopy()); |
| 161 dict12_->Set(key1_, val1_->DeepCopy()); | 163 dict12_->Set(key1_, val1_->CreateDeepCopy()); |
| 162 dict12_->Set(key2_, val2_->DeepCopy()); | 164 dict12_->Set(key2_, val2_->CreateDeepCopy()); |
| 163 dict123_->Set(key1_, val1_->DeepCopy()); | 165 dict123_->Set(key1_, val1_->CreateDeepCopy()); |
| 164 dict123_->Set(key2_, val2_->DeepCopy()); | 166 dict123_->Set(key2_, val2_->CreateDeepCopy()); |
| 165 dict123_->Set(key3_, val3_->DeepCopy()); | 167 dict123_->Set(key3_, val3_->CreateDeepCopy()); |
| 166 } | 168 } |
| 167 | 169 |
| 168 ValueStoreTest::~ValueStoreTest() {} | 170 ValueStoreTest::~ValueStoreTest() {} |
| 169 | 171 |
| 170 void ValueStoreTest::SetUp() { | 172 void ValueStoreTest::SetUp() { |
| 171 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 173 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 172 storage_.reset((GetParam())(temp_dir_.path().AppendASCII("dbName"))); | 174 storage_.reset((GetParam())(temp_dir_.path().AppendASCII("dbName"))); |
| 173 ASSERT_TRUE(storage_.get()); | 175 ASSERT_TRUE(storage_.get()); |
| 174 } | 176 } |
| 175 | 177 |
| 176 void ValueStoreTest::TearDown() { | 178 void ValueStoreTest::TearDown() { |
| 177 storage_.reset(); | 179 storage_.reset(); |
| 178 } | 180 } |
| 179 | 181 |
| 180 TEST_P(ValueStoreTest, GetWhenEmpty) { | 182 TEST_P(ValueStoreTest, GetWhenEmpty) { |
| 181 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); | 183 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); |
| 182 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 184 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 183 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); | 185 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); |
| 184 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 186 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 185 } | 187 } |
| 186 | 188 |
| 187 TEST_P(ValueStoreTest, GetWithSingleValue) { | 189 TEST_P(ValueStoreTest, GetWithSingleValue) { |
| 188 { | 190 { |
| 189 ValueStoreChangeList changes; | 191 ValueStoreChangeList changes; |
| 190 changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy())); | 192 changes.push_back( |
| 193 ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy())); | |
| 191 EXPECT_PRED_FORMAT2(ChangesEq, | 194 EXPECT_PRED_FORMAT2(ChangesEq, |
| 192 changes, storage_->Set(DEFAULTS, key1_, *val1_)); | 195 changes, storage_->Set(DEFAULTS, key1_, *val1_)); |
| 193 } | 196 } |
| 194 | 197 |
| 195 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); | 198 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); |
| 196 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key2_)); | 199 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key2_)); |
| 197 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); | 200 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); |
| 198 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 201 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 199 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list123_)); | 202 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list123_)); |
| 200 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get()); | 203 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get()); |
| 201 } | 204 } |
| 202 | 205 |
| 203 TEST_P(ValueStoreTest, GetWithMultipleValues) { | 206 TEST_P(ValueStoreTest, GetWithMultipleValues) { |
| 204 { | 207 { |
| 205 ValueStoreChangeList changes; | 208 ValueStoreChangeList changes; |
| 206 changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy())); | 209 changes.push_back( |
| 207 changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy())); | 210 ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy())); |
| 211 changes.push_back( | |
| 212 ValueStoreChange(key2_, nullptr, val2_->CreateDeepCopy())); | |
| 208 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_)); | 213 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_)); |
| 209 } | 214 } |
| 210 | 215 |
| 211 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); | 216 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); |
| 212 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); | 217 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); |
| 213 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 218 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 214 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_)); | 219 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_)); |
| 215 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get()); | 220 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get()); |
| 216 } | 221 } |
| 217 | 222 |
| 218 TEST_P(ValueStoreTest, RemoveWhenEmpty) { | 223 TEST_P(ValueStoreTest, RemoveWhenEmpty) { |
| 219 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), | 224 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), |
| 220 storage_->Remove(key1_)); | 225 storage_->Remove(key1_)); |
| 221 | 226 |
| 222 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); | 227 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); |
| 223 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_)); | 228 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_)); |
| 224 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 229 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 225 } | 230 } |
| 226 | 231 |
| 227 TEST_P(ValueStoreTest, RemoveWithSingleValue) { | 232 TEST_P(ValueStoreTest, RemoveWithSingleValue) { |
| 228 storage_->Set(DEFAULTS, *dict1_); | 233 storage_->Set(DEFAULTS, *dict1_); |
| 229 { | 234 { |
| 230 ValueStoreChangeList changes; | 235 ValueStoreChangeList changes; |
| 231 changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL)); | 236 changes.push_back( |
| 237 ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr)); | |
| 232 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_)); | 238 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_)); |
| 233 } | 239 } |
| 234 | 240 |
| 235 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); | 241 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); |
| 236 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key2_)); | 242 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key2_)); |
| 237 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_)); | 243 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_)); |
| 238 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list12_)); | 244 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list12_)); |
| 239 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 245 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 240 } | 246 } |
| 241 | 247 |
| 242 TEST_P(ValueStoreTest, RemoveWithMultipleValues) { | 248 TEST_P(ValueStoreTest, RemoveWithMultipleValues) { |
| 243 storage_->Set(DEFAULTS, *dict123_); | 249 storage_->Set(DEFAULTS, *dict123_); |
| 244 { | 250 { |
| 245 ValueStoreChangeList changes; | 251 ValueStoreChangeList changes; |
| 246 changes.push_back(ValueStoreChange(key3_, val3_->DeepCopy(), NULL)); | 252 changes.push_back( |
| 253 ValueStoreChange(key3_, val3_->CreateDeepCopy(), nullptr)); | |
| 247 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key3_)); | 254 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key3_)); |
| 248 } | 255 } |
| 249 | 256 |
| 250 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); | 257 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); |
| 251 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); | 258 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); |
| 252 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 259 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 253 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list1_)); | 260 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list1_)); |
| 254 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list12_)); | 261 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list12_)); |
| 255 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list13_)); | 262 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list13_)); |
| 256 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_)); | 263 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_)); |
| 257 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get()); | 264 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get()); |
| 258 | 265 |
| 259 { | 266 { |
| 260 ValueStoreChangeList changes; | 267 ValueStoreChangeList changes; |
| 261 changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL)); | 268 changes.push_back( |
| 262 changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL)); | 269 ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr)); |
| 270 changes.push_back( | |
| 271 ValueStoreChange(key2_, val2_->CreateDeepCopy(), nullptr)); | |
| 263 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_)); | 272 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_)); |
| 264 } | 273 } |
| 265 | 274 |
| 266 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); | 275 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); |
| 267 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); | 276 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); |
| 268 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 277 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 269 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_)); | 278 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_)); |
| 270 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list12_)); | 279 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list12_)); |
| 271 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list13_)); | 280 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list13_)); |
| 272 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); | 281 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); |
| 273 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 282 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 274 } | 283 } |
| 275 | 284 |
| 276 TEST_P(ValueStoreTest, SetWhenOverwriting) { | 285 TEST_P(ValueStoreTest, SetWhenOverwriting) { |
| 277 storage_->Set(DEFAULTS, key1_, *val2_); | 286 storage_->Set(DEFAULTS, key1_, *val2_); |
| 278 { | 287 { |
| 279 ValueStoreChangeList changes; | 288 ValueStoreChangeList changes; |
| 289 changes.push_back(ValueStoreChange(key1_, val2_->CreateDeepCopy(), | |
| 290 val1_->CreateDeepCopy())); | |
| 280 changes.push_back( | 291 changes.push_back( |
| 281 ValueStoreChange(key1_, val2_->DeepCopy(), val1_->DeepCopy())); | 292 ValueStoreChange(key2_, nullptr, val2_->CreateDeepCopy())); |
| 282 changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy())); | |
| 283 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_)); | 293 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_)); |
| 284 } | 294 } |
| 285 | 295 |
| 286 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); | 296 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_)); |
| 287 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); | 297 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_)); |
| 288 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 298 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 289 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list1_)); | 299 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list1_)); |
| 290 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list12_)); | 300 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list12_)); |
| 291 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list13_)); | 301 EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list13_)); |
| 292 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_)); | 302 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_)); |
| 293 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get()); | 303 EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get()); |
| 294 } | 304 } |
| 295 | 305 |
| 296 TEST_P(ValueStoreTest, ClearWhenEmpty) { | 306 TEST_P(ValueStoreTest, ClearWhenEmpty) { |
| 297 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear()); | 307 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear()); |
| 298 | 308 |
| 299 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); | 309 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); |
| 300 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 310 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 301 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); | 311 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); |
| 302 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 312 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 303 } | 313 } |
| 304 | 314 |
| 305 TEST_P(ValueStoreTest, ClearWhenNotEmpty) { | 315 TEST_P(ValueStoreTest, ClearWhenNotEmpty) { |
| 306 storage_->Set(DEFAULTS, *dict12_); | 316 storage_->Set(DEFAULTS, *dict12_); |
| 307 { | 317 { |
| 308 ValueStoreChangeList changes; | 318 ValueStoreChangeList changes; |
| 309 changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL)); | 319 changes.push_back( |
| 310 changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL)); | 320 ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr)); |
| 321 changes.push_back( | |
| 322 ValueStoreChange(key2_, val2_->CreateDeepCopy(), nullptr)); | |
| 311 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear()); | 323 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear()); |
| 312 } | 324 } |
| 313 | 325 |
| 314 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); | 326 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_)); |
| 315 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); | 327 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_)); |
| 316 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); | 328 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_)); |
| 317 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 329 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 318 } | 330 } |
| 319 | 331 |
| 320 // Dots should be allowed in key names; they shouldn't be interpreted as | 332 // Dots should be allowed in key names; they shouldn't be interpreted as |
| 321 // indexing into a dictionary. | 333 // indexing into a dictionary. |
| 322 TEST_P(ValueStoreTest, DotsInKeyNames) { | 334 TEST_P(ValueStoreTest, DotsInKeyNames) { |
| 323 std::string dot_key("foo.bar"); | 335 std::string dot_key("foo.bar"); |
| 324 base::StringValue dot_value("baz.qux"); | 336 base::StringValue dot_value("baz.qux"); |
| 325 std::vector<std::string> dot_list; | 337 std::vector<std::string> dot_list; |
| 326 dot_list.push_back(dot_key); | 338 dot_list.push_back(dot_key); |
| 327 base::DictionaryValue dot_dict; | 339 base::DictionaryValue dot_dict; |
| 328 dot_dict.SetWithoutPathExpansion(dot_key, dot_value.DeepCopy()); | 340 dot_dict.SetWithoutPathExpansion(dot_key, dot_value.CreateDeepCopy()); |
| 329 | 341 |
| 330 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key)); | 342 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key)); |
| 331 | 343 |
| 332 { | 344 { |
| 333 ValueStoreChangeList changes; | 345 ValueStoreChangeList changes; |
| 334 changes.push_back( | 346 changes.push_back( |
| 335 ValueStoreChange(dot_key, NULL, dot_value.DeepCopy())); | 347 ValueStoreChange(dot_key, nullptr, dot_value.CreateDeepCopy())); |
| 336 EXPECT_PRED_FORMAT2(ChangesEq, | 348 EXPECT_PRED_FORMAT2(ChangesEq, |
| 337 changes, storage_->Set(DEFAULTS, dot_key, dot_value)); | 349 changes, storage_->Set(DEFAULTS, dot_key, dot_value)); |
| 338 } | 350 } |
| 339 EXPECT_PRED_FORMAT2(ChangesEq, | 351 EXPECT_PRED_FORMAT2(ChangesEq, |
| 340 ValueStoreChangeList(), storage_->Set(DEFAULTS, dot_key, dot_value)); | 352 ValueStoreChangeList(), storage_->Set(DEFAULTS, dot_key, dot_value)); |
| 341 | 353 |
| 342 EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get(dot_key)); | 354 EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get(dot_key)); |
| 343 | 355 |
| 344 { | 356 { |
| 345 ValueStoreChangeList changes; | 357 ValueStoreChangeList changes; |
| 346 changes.push_back( | 358 changes.push_back( |
| 347 ValueStoreChange(dot_key, dot_value.DeepCopy(), NULL)); | 359 ValueStoreChange(dot_key, dot_value.CreateDeepCopy(), nullptr)); |
| 348 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_key)); | 360 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_key)); |
| 349 } | 361 } |
| 350 EXPECT_PRED_FORMAT2(ChangesEq, | 362 EXPECT_PRED_FORMAT2(ChangesEq, |
| 351 ValueStoreChangeList(), storage_->Remove(dot_key)); | 363 ValueStoreChangeList(), storage_->Remove(dot_key)); |
| 352 { | 364 { |
| 353 ValueStoreChangeList changes; | 365 ValueStoreChangeList changes; |
| 354 changes.push_back( | 366 changes.push_back( |
| 355 ValueStoreChange(dot_key, NULL, dot_value.DeepCopy())); | 367 ValueStoreChange(dot_key, nullptr, dot_value.CreateDeepCopy())); |
| 356 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, dot_dict)); | 368 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, dot_dict)); |
| 357 } | 369 } |
| 358 | 370 |
| 359 EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get(dot_list)); | 371 EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get(dot_list)); |
| 360 EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get()); | 372 EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get()); |
| 361 | 373 |
| 362 { | 374 { |
| 363 ValueStoreChangeList changes; | 375 ValueStoreChangeList changes; |
| 364 changes.push_back( | 376 changes.push_back( |
| 365 ValueStoreChange(dot_key, dot_value.DeepCopy(), NULL)); | 377 ValueStoreChange(dot_key, dot_value.CreateDeepCopy(), nullptr)); |
| 366 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_list)); | 378 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_list)); |
| 367 } | 379 } |
| 368 | 380 |
| 369 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key)); | 381 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key)); |
| 370 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); | 382 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get()); |
| 371 } | 383 } |
| 372 | 384 |
| 373 TEST_P(ValueStoreTest, DotsInKeyNamesWithDicts) { | 385 TEST_P(ValueStoreTest, DotsInKeyNamesWithDicts) { |
| 374 base::DictionaryValue outer_dict; | 386 base::DictionaryValue outer_dict; |
| 375 base::DictionaryValue* inner_dict = new base::DictionaryValue(); | 387 std::unique_ptr<base::DictionaryValue> inner_dict( |
| 376 outer_dict.Set("foo", inner_dict); | 388 new base::DictionaryValue()); |
| 389 outer_dict.Set("foo", std::move(inner_dict)); | |
| 377 inner_dict->SetString("bar", "baz"); | 390 inner_dict->SetString("bar", "baz"); |
|
Devlin
2016/05/03 16:55:05
UAF (was already a conceptual problem, but now thi
dcheng
2016/05/03 17:16:26
Done. This was "safe" before but is now unsafe.
| |
| 378 | 391 |
| 379 { | 392 { |
| 380 ValueStoreChangeList changes; | 393 ValueStoreChangeList changes; |
| 381 changes.push_back( | 394 changes.push_back( |
| 382 ValueStoreChange("foo", NULL, inner_dict->DeepCopy())); | 395 ValueStoreChange("foo", nullptr, inner_dict->CreateDeepCopy())); |
| 383 EXPECT_PRED_FORMAT2(ChangesEq, | 396 EXPECT_PRED_FORMAT2(ChangesEq, |
| 384 changes, storage_->Set(DEFAULTS, outer_dict)); | 397 changes, storage_->Set(DEFAULTS, outer_dict)); |
| 385 } | 398 } |
| 386 | 399 |
| 387 EXPECT_PRED_FORMAT2(SettingsEq, outer_dict, storage_->Get("foo")); | 400 EXPECT_PRED_FORMAT2(SettingsEq, outer_dict, storage_->Get("foo")); |
| 388 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get("foo.bar")); | 401 EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get("foo.bar")); |
| 389 } | 402 } |
| 390 | 403 |
| 391 TEST_P(ValueStoreTest, ComplexChangedKeysScenarios) { | 404 TEST_P(ValueStoreTest, ComplexChangedKeysScenarios) { |
| 392 // Test: | 405 // Test: |
| 393 // - Setting over missing/changed/same keys, combinations. | 406 // - Setting over missing/changed/same keys, combinations. |
| 394 // - Removing over missing and present keys, combinations. | 407 // - Removing over missing and present keys, combinations. |
| 395 // - Clearing. | 408 // - Clearing. |
| 396 std::vector<std::string> complex_list; | 409 std::vector<std::string> complex_list; |
| 397 base::DictionaryValue complex_changed_dict; | 410 base::DictionaryValue complex_changed_dict; |
| 398 | 411 |
| 399 storage_->Set(DEFAULTS, key1_, *val1_); | 412 storage_->Set(DEFAULTS, key1_, *val1_); |
| 400 EXPECT_PRED_FORMAT2(ChangesEq, | 413 EXPECT_PRED_FORMAT2(ChangesEq, |
| 401 ValueStoreChangeList(), storage_->Set(DEFAULTS, key1_, *val1_)); | 414 ValueStoreChangeList(), storage_->Set(DEFAULTS, key1_, *val1_)); |
| 402 { | 415 { |
| 403 ValueStoreChangeList changes; | 416 ValueStoreChangeList changes; |
| 404 changes.push_back(ValueStoreChange( | 417 changes.push_back(ValueStoreChange(key1_, val1_->CreateDeepCopy(), |
| 405 key1_, val1_->DeepCopy(), val2_->DeepCopy())); | 418 val2_->CreateDeepCopy())); |
| 406 EXPECT_PRED_FORMAT2(ChangesEq, | 419 EXPECT_PRED_FORMAT2(ChangesEq, |
| 407 changes, storage_->Set(DEFAULTS, key1_, *val2_)); | 420 changes, storage_->Set(DEFAULTS, key1_, *val2_)); |
| 408 } | 421 } |
| 409 { | 422 { |
| 410 ValueStoreChangeList changes; | 423 ValueStoreChangeList changes; |
| 411 changes.push_back(ValueStoreChange(key1_, val2_->DeepCopy(), NULL)); | 424 changes.push_back( |
| 425 ValueStoreChange(key1_, val2_->CreateDeepCopy(), nullptr)); | |
| 412 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_)); | 426 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_)); |
| 413 EXPECT_PRED_FORMAT2(ChangesEq, | 427 EXPECT_PRED_FORMAT2(ChangesEq, |
| 414 ValueStoreChangeList(), storage_->Remove(key1_)); | 428 ValueStoreChangeList(), storage_->Remove(key1_)); |
| 415 } | 429 } |
| 416 { | 430 { |
| 417 ValueStoreChangeList changes; | 431 ValueStoreChangeList changes; |
| 418 changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy())); | 432 changes.push_back( |
| 433 ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy())); | |
| 419 EXPECT_PRED_FORMAT2(ChangesEq, | 434 EXPECT_PRED_FORMAT2(ChangesEq, |
| 420 changes, storage_->Set(DEFAULTS, key1_, *val1_)); | 435 changes, storage_->Set(DEFAULTS, key1_, *val1_)); |
| 421 } | 436 } |
| 422 { | 437 { |
| 423 ValueStoreChangeList changes; | 438 ValueStoreChangeList changes; |
| 424 changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL)); | 439 changes.push_back( |
| 440 ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr)); | |
| 425 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear()); | 441 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear()); |
| 426 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear()); | 442 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear()); |
| 427 } | 443 } |
| 428 | 444 |
| 429 { | 445 { |
| 430 ValueStoreChangeList changes; | 446 ValueStoreChangeList changes; |
| 431 changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy())); | 447 changes.push_back( |
| 432 changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy())); | 448 ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy())); |
| 449 changes.push_back( | |
| 450 ValueStoreChange(key2_, nullptr, val2_->CreateDeepCopy())); | |
| 433 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_)); | 451 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_)); |
| 434 EXPECT_PRED_FORMAT2(ChangesEq, | 452 EXPECT_PRED_FORMAT2(ChangesEq, |
| 435 ValueStoreChangeList(), storage_->Set(DEFAULTS, *dict12_)); | 453 ValueStoreChangeList(), storage_->Set(DEFAULTS, *dict12_)); |
| 436 } | 454 } |
| 437 { | 455 { |
| 438 ValueStoreChangeList changes; | 456 ValueStoreChangeList changes; |
| 439 changes.push_back(ValueStoreChange(key3_, NULL, val3_->DeepCopy())); | 457 changes.push_back( |
| 458 ValueStoreChange(key3_, nullptr, val3_->CreateDeepCopy())); | |
| 440 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict123_)); | 459 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict123_)); |
| 441 } | 460 } |
| 442 { | 461 { |
| 443 base::DictionaryValue to_set; | 462 base::DictionaryValue to_set; |
| 444 to_set.Set(key1_, val2_->DeepCopy()); | 463 to_set.Set(key1_, val2_->CreateDeepCopy()); |
| 445 to_set.Set(key2_, val2_->DeepCopy()); | 464 to_set.Set(key2_, val2_->CreateDeepCopy()); |
| 446 to_set.Set("asdf", val1_->DeepCopy()); | 465 to_set.Set("asdf", val1_->CreateDeepCopy()); |
| 447 to_set.Set("qwerty", val3_->DeepCopy()); | 466 to_set.Set("qwerty", val3_->CreateDeepCopy()); |
| 448 | 467 |
| 449 ValueStoreChangeList changes; | 468 ValueStoreChangeList changes; |
| 469 changes.push_back(ValueStoreChange(key1_, val1_->CreateDeepCopy(), | |
| 470 val2_->CreateDeepCopy())); | |
| 450 changes.push_back( | 471 changes.push_back( |
| 451 ValueStoreChange(key1_, val1_->DeepCopy(), val2_->DeepCopy())); | 472 ValueStoreChange("asdf", nullptr, val1_->CreateDeepCopy())); |
| 452 changes.push_back(ValueStoreChange("asdf", NULL, val1_->DeepCopy())); | |
| 453 changes.push_back( | 473 changes.push_back( |
| 454 ValueStoreChange("qwerty", NULL, val3_->DeepCopy())); | 474 ValueStoreChange("qwerty", nullptr, val3_->CreateDeepCopy())); |
| 455 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, to_set)); | 475 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, to_set)); |
| 456 } | 476 } |
| 457 { | 477 { |
| 458 ValueStoreChangeList changes; | 478 ValueStoreChangeList changes; |
| 459 changes.push_back(ValueStoreChange(key1_, val2_->DeepCopy(), NULL)); | 479 changes.push_back( |
| 460 changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL)); | 480 ValueStoreChange(key1_, val2_->CreateDeepCopy(), nullptr)); |
| 481 changes.push_back( | |
| 482 ValueStoreChange(key2_, val2_->CreateDeepCopy(), nullptr)); | |
| 461 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_)); | 483 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_)); |
| 462 } | 484 } |
| 463 { | 485 { |
| 464 std::vector<std::string> to_remove; | 486 std::vector<std::string> to_remove; |
| 465 to_remove.push_back(key1_); | 487 to_remove.push_back(key1_); |
| 466 to_remove.push_back("asdf"); | 488 to_remove.push_back("asdf"); |
| 467 | 489 |
| 468 ValueStoreChangeList changes; | 490 ValueStoreChangeList changes; |
| 469 changes.push_back(ValueStoreChange("asdf", val1_->DeepCopy(), NULL)); | 491 changes.push_back( |
| 492 ValueStoreChange("asdf", val1_->CreateDeepCopy(), nullptr)); | |
| 470 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(to_remove)); | 493 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(to_remove)); |
| 471 } | 494 } |
| 472 { | 495 { |
| 473 ValueStoreChangeList changes; | 496 ValueStoreChangeList changes; |
| 474 changes.push_back(ValueStoreChange(key3_, val3_->DeepCopy(), NULL)); | |
| 475 changes.push_back( | 497 changes.push_back( |
| 476 ValueStoreChange("qwerty", val3_->DeepCopy(), NULL)); | 498 ValueStoreChange(key3_, val3_->CreateDeepCopy(), nullptr)); |
| 499 changes.push_back( | |
| 500 ValueStoreChange("qwerty", val3_->CreateDeepCopy(), nullptr)); | |
| 477 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear()); | 501 EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear()); |
| 478 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear()); | 502 EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear()); |
| 479 } | 503 } |
| 480 } | 504 } |
| OLD | NEW |