1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/value_store/value_store_unittest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/linked_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To save typing ValueStore::DEFAULTS everywhere.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the pretty-printed JSON for a value.
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string GetJSON(const base::Value& value) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONWriter::WriteWithOptions(&value,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::JSONWriter::OPTIONS_PRETTY_PRINT,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &json);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return json;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compares two possibly NULL values for equality, filling |error| with an
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriate error message if they're different.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ValuesEqual(const base::Value* expected,
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const base::Value* actual,
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 std::string* error) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (expected == actual) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (expected && !actual) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "Expected: " + GetJSON(*expected) + ", actual: NULL";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (actual && !expected) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = "Expected: NULL, actual: " + GetJSON(*actual);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!expected->Equals(actual)) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error =
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Expected: " + GetJSON(*expected) + ", actual: " + GetJSON(*actual);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns whether the read result of a storage operation has the expected
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testing::AssertionResult SettingsEq(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* _1, const char* _2,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue& expected,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStore::ReadResult actual_result) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (actual_result->HasError()) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return testing::AssertionFailure() <<
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        "Result has error: " << actual_result->error().message;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!ValuesEqual(&expected, &actual_result->settings(), &error)) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return testing::AssertionFailure() << error;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return testing::AssertionSuccess();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns whether the write result of a storage operation has the expected
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testing::AssertionResult ChangesEq(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* _1, const char* _2,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ValueStoreChangeList& expected,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStore::WriteResult actual_result) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (actual_result->HasError()) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return testing::AssertionFailure() <<
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        "Result has error: " << actual_result->error().message;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ValueStoreChangeList& actual = actual_result->changes();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (expected.size() != actual.size()) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return testing::AssertionFailure() <<
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Actual has wrong size, expecting " << expected.size() <<
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        " but was " << actual.size();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, linked_ptr<ValueStoreChange> > expected_as_map;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ValueStoreChangeList::const_iterator it = expected.begin();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it != expected.end(); ++it) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_as_map[it->key()] =
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        linked_ptr<ValueStoreChange>(new ValueStoreChange(*it));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> keys_seen;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ValueStoreChangeList::const_iterator it = actual.begin();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it != actual.end(); ++it) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (keys_seen.count(it->key())) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return testing::AssertionFailure() <<
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Multiple changes seen for key: " << it->key();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    keys_seen.insert(it->key());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!expected_as_map.count(it->key())) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return testing::AssertionFailure() <<
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Actual has unexpected change for key: " << it->key();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChange expected_change = *expected_as_map[it->key()];
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string error;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ValuesEqual(expected_change.new_value(), it->new_value(), &error)) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return testing::AssertionFailure() <<
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "New value for " << it->key() << " was unexpected: " << error;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ValuesEqual(expected_change.old_value(), it->old_value(), &error)) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return testing::AssertionFailure() <<
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Old value for " << it->key() << " was unexpected: " << error;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return testing::AssertionSuccess();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStoreTest::ValueStoreTest()
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : key1_("foo"),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key2_("bar"),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key3_("baz"),
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      empty_dict_(new base::DictionaryValue()),
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict1_(new base::DictionaryValue()),
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict3_(new base::DictionaryValue()),
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict12_(new base::DictionaryValue()),
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict123_(new base::DictionaryValue()),
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui_thread_(BrowserThread::UI, base::MessageLoop::current()),
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      file_thread_(BrowserThread::FILE, base::MessageLoop::current()) {
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  val1_.reset(new base::StringValue(key1_ + "Value"));
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  val2_.reset(new base::StringValue(key2_ + "Value"));
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  val3_.reset(new base::StringValue(key3_ + "Value"));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list1_.push_back(key1_);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list2_.push_back(key2_);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list3_.push_back(key3_);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list12_.push_back(key1_);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list12_.push_back(key2_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list13_.push_back(key1_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list13_.push_back(key3_);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list123_.push_back(key1_);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list123_.push_back(key2_);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list123_.push_back(key3_);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set1_.insert(list1_.begin(), list1_.end());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set2_.insert(list2_.begin(), list2_.end());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set3_.insert(list3_.begin(), list3_.end());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set12_.insert(list12_.begin(), list12_.end());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set13_.insert(list13_.begin(), list13_.end());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set123_.insert(list123_.begin(), list123_.end());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict1_->Set(key1_, val1_->DeepCopy());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict3_->Set(key3_, val3_->DeepCopy());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict12_->Set(key1_, val1_->DeepCopy());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict12_->Set(key2_, val2_->DeepCopy());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict123_->Set(key1_, val1_->DeepCopy());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict123_->Set(key2_, val2_->DeepCopy());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict123_->Set(key3_, val3_->DeepCopy());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStoreTest::~ValueStoreTest() {}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ValueStoreTest::SetUp() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.reset((GetParam())(temp_dir_.path().AppendASCII("dbName")));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(storage_.get());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ValueStoreTest::TearDown() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_.reset();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, GetWhenEmpty) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, GetWithSingleValue) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changes, storage_->Set(DEFAULTS, key1_, *val1_));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key2_));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list123_));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, GetWithMultipleValues) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy()));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, RemoveWhenEmpty) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(),
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      storage_->Remove(key1_));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, RemoveWithSingleValue) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, *dict1_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key2_));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list12_));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, RemoveWithMultipleValues) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, *dict123_);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key3_, val3_->DeepCopy(), NULL));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key3_));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list1_));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list12_));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list13_));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list1_));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list12_));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list13_));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, SetWhenOverwriting) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, key1_, *val2_);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange(key1_, val2_->DeepCopy(), val1_->DeepCopy()));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy()));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(key1_));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key3_));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list1_));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list12_));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict1_, storage_->Get(list13_));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get(list123_));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *dict12_, storage_->Get());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, ClearWhenEmpty) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, ClearWhenNotEmpty) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, *dict12_);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(key1_));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(empty_list_));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(list123_));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dots should be allowed in key names; they shouldn't be interpreted as
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indexing into a dictionary.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, DotsInKeyNames) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string dot_key("foo.bar");
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue dot_value("baz.qux");
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> dot_list;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dot_list.push_back(dot_key);
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue dot_dict;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dot_dict.SetWithoutPathExpansion(dot_key, dot_value.DeepCopy());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange(dot_key, NULL, dot_value.DeepCopy()));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changes, storage_->Set(DEFAULTS, dot_key, dot_value));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(ChangesEq,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ValueStoreChangeList(), storage_->Set(DEFAULTS, dot_key, dot_value));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get(dot_key));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange(dot_key, dot_value.DeepCopy(), NULL));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_key));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(ChangesEq,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ValueStoreChangeList(), storage_->Remove(dot_key));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange(dot_key, NULL, dot_value.DeepCopy()));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, dot_dict));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get(dot_list));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, dot_dict, storage_->Get());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange(dot_key, dot_value.DeepCopy(), NULL));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_list));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, DotsInKeyNamesWithDicts) {
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue outer_dict;
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* inner_dict = new base::DictionaryValue();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outer_dict.Set("foo", inner_dict);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inner_dict->SetString("bar", "baz");
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange("foo", NULL, inner_dict->DeepCopy()));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changes, storage_->Set(DEFAULTS, outer_dict));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, outer_dict, storage_->Get("foo"));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get("foo.bar"));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ValueStoreTest, ComplexChangedKeysScenarios) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test:
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   - Setting over missing/changed/same keys, combinations.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   - Removing over missing and present keys, combinations.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   - Clearing.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> complex_list;
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue complex_changed_dict;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage_->Set(DEFAULTS, key1_, *val1_);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_PRED_FORMAT2(ChangesEq,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ValueStoreChangeList(), storage_->Set(DEFAULTS, key1_, *val1_));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        key1_, val1_->DeepCopy(), val2_->DeepCopy()));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changes, storage_->Set(DEFAULTS, key1_, *val2_));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, val2_->DeepCopy(), NULL));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChangeList(), storage_->Remove(key1_));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changes, storage_->Set(DEFAULTS, key1_, *val1_));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy()));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChangeList(), storage_->Set(DEFAULTS, *dict12_));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key3_, NULL, val3_->DeepCopy()));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict123_));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue to_set;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set(key1_, val2_->DeepCopy());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set(key2_, val2_->DeepCopy());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("asdf", val1_->DeepCopy());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_set.Set("qwerty", val3_->DeepCopy());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange(key1_, val1_->DeepCopy(), val2_->DeepCopy()));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange("asdf", NULL, val1_->DeepCopy()));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange("qwerty", NULL, val3_->DeepCopy()));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, to_set));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key1_, val2_->DeepCopy(), NULL));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> to_remove;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_remove.push_back(key1_);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_remove.push_back("asdf");
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange("asdf", val1_->DeepCopy(), NULL));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(to_remove));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueStoreChangeList changes;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(ValueStoreChange(key3_, val3_->DeepCopy(), NULL));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes.push_back(
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ValueStoreChange("qwerty", val3_->DeepCopy(), NULL));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
482