1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/session_storage_database.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/common/dom_storage/dom_storage_types.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/db.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/iterator.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/options.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionStorageDatabaseTest : public testing::Test {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStorageDatabaseTest();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SessionStorageDatabaseTest();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::string> DataMap;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsNamespaceKey(const std::string& key,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::string* namespace_id);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsNamespaceOriginKey(const std::string& key,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::string* namespace_id);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsMapRefCountKey(const std::string& key,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int64* map_id);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsMapValueKey(const std::string& key,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64* map_id);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetDatabase();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadData(DataMap* data) const;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckDatabaseConsistency() const;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckEmptyDatabase() const;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DumpData() const;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckAreaData(const std::string& namespace_id,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const GURL& origin,
51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                     const DOMStorageValuesMap& reference) const;
52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  void CompareValuesMaps(const DOMStorageValuesMap& map1,
53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                         const DOMStorageValuesMap& map2) const;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckNamespaceIds(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::set<std::string>& expected_namespace_ids) const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckOrigins(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& namespace_id,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::set<GURL>& expected_origins) const;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetMapForArea(const std::string& namespace_id,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GURL& origin) const;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 GetMapRefCount(const std::string& map_id) const;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SessionStorageDatabase> db_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test data.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kOrigin1;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kOrigin2;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kNamespace1;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kNamespace2;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kNamespaceClone;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kKey1;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kKey2;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kKey3;
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::NullableString16 kValue1;
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::NullableString16 kValue2;
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::NullableString16 kValue3;
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::NullableString16 kValue4;
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::NullableString16 kValueNull;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabaseTest);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStorageDatabaseTest::SessionStorageDatabaseTest()
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : kOrigin1("http://www.origin1.com"),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kOrigin2("http://www.origin2.com"),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kNamespace1("namespace1"),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNamespace2("namespace2"),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNamespaceClone("wascloned"),
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kKey1(base::ASCIIToUTF16("key1")),
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kKey2(base::ASCIIToUTF16("key2")),
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kKey3(base::ASCIIToUTF16("key3")),
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kValue1(base::ASCIIToUTF16("value1"), false),
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kValue2(base::ASCIIToUTF16("value2"), false),
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kValue3(base::ASCIIToUTF16("value3"), false),
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kValue4(base::ASCIIToUTF16("value4"), false) { }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStorageDatabaseTest::~SessionStorageDatabaseTest() { }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::SetUp() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetDatabase();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::ResetDatabase() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_ = new SessionStorageDatabase(temp_dir_.path());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->LazyOpen(true));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStorageDatabaseTest::IsNamespaceKey(const std::string& key,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                std::string* namespace_id) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string namespace_prefix = SessionStorageDatabase::NamespacePrefix();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key.find(namespace_prefix) != 0)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key == namespace_prefix)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t second_dash = key.find('-', namespace_prefix.length());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (second_dash != key.length() - 1)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key is of the form "namespace-<namespaceid>-".
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *namespace_id = key.substr(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      namespace_prefix.length(),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      second_dash - namespace_prefix.length());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStorageDatabaseTest::IsNamespaceOriginKey(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* namespace_id) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string namespace_prefix = SessionStorageDatabase::NamespacePrefix();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key.find(namespace_prefix) != 0)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t second_dash = key.find('-', namespace_prefix.length());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (second_dash == std::string::npos || second_dash == key.length() - 1)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key is of the form "namespace-<namespaceid>-<origin>", and the value
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is the map id.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *namespace_id = key.substr(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      namespace_prefix.length(),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      second_dash - namespace_prefix.length());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStorageDatabaseTest::IsMapRefCountKey(const std::string& key,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  int64* map_id) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string map_prefix = "map-";
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key.find(map_prefix) != 0)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t second_dash = key.find('-', map_prefix.length());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (second_dash != key.length() - 1)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key is of the form "map-<mapid>-" and the value is the ref count.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string map_id_str = key.substr(map_prefix.length(),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      second_dash - map_prefix.length());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool conversion_ok = base::StringToInt64(map_id_str, map_id);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(conversion_ok);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStorageDatabaseTest::IsMapValueKey(const std::string& key,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int64* map_id) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string map_prefix = "map-";
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key.find(map_prefix) != 0)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t second_dash = key.find('-', map_prefix.length());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (second_dash == std::string::npos || second_dash == key.length() - 1)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key is of the form "map-<mapid>-key".
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string map_id_str = key.substr(map_prefix.length(),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      second_dash - map_prefix.length());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool conversion_ok = base::StringToInt64(map_id_str, map_id);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(conversion_ok);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::ReadData(DataMap* data) const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  leveldb::DB* leveldb = db_->db_.get();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<leveldb::Iterator> it(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      leveldb->NewIterator(leveldb::ReadOptions()));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it->SeekToFirst(); it->Valid(); it->Next()) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*data)[it->key().ToString()] = it->value().ToString();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::CheckDatabaseConsistency() const {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataMap data;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadData(&data);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty db is ok.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.empty())
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For detecting rubbish keys.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t valid_keys = 0;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string next_map_id_key = SessionStorageDatabase::NextMapIdKey();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the namespace start key.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.find(SessionStorageDatabase::NamespacePrefix()) == data.end()) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If there is no namespace start key, the database may contain only counter
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // keys.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(it->first == next_map_id_key);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++valid_keys;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterate the "namespace-" keys.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> found_namespace_ids;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> namespaces_with_areas;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<int64, int64> expected_map_refcounts;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 max_map_id = -1;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string namespace_id;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsNamespaceKey(it->first, &namespace_id)) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_namespace_ids.insert(namespace_id);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++valid_keys;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IsNamespaceOriginKey(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        it->first, &namespace_id)) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check that the corresponding "namespace-<namespaceid>-" key exists. It
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // has been read by now, since the keys are stored in order.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(found_namespace_ids.find(namespace_id) !=
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  found_namespace_ids.end());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      namespaces_with_areas.insert(namespace_id);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 map_id;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool conversion_ok = base::StringToInt64(it->second, &map_id);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(conversion_ok);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_GE(map_id, 0);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++expected_map_refcounts[map_id];
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_map_id = std::max(map_id, max_map_id);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++valid_keys;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that there are no leftover "namespace-namespaceid-" keys without
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // associated areas.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(found_namespace_ids.size(), namespaces_with_areas.size());
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_map_id != -1) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The database contains maps.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(data.find(next_map_id_key) != data.end());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 next_map_id;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool conversion_ok =
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::StringToInt64(data[next_map_id_key], &next_map_id);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(conversion_ok);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_GT(next_map_id, max_map_id);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterate the "map-" keys.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<int64> found_map_ids;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 map_id;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsMapRefCountKey(it->first, &map_id)) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 ref_count;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool conversion_ok = base::StringToInt64(it->second, &ref_count);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(conversion_ok);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check that the map is not stale.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_GT(ref_count, 0);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(expected_map_refcounts.find(map_id) !=
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  expected_map_refcounts.end());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(expected_map_refcounts[map_id], ref_count);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Mark the map as existing.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_map_refcounts.erase(map_id);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_map_ids.insert(map_id);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++valid_keys;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IsMapValueKey(it->first, &map_id)) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(found_map_ids.find(map_id) != found_map_ids.end());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++valid_keys;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that all maps referred to exist.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(expected_map_refcounts.empty());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.find(next_map_id_key) != data.end())
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++valid_keys;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(data.size(), valid_keys);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::CheckEmptyDatabase() const {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataMap data;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadData(&data);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t valid_keys = 0;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.find(SessionStorageDatabase::NamespacePrefix()) != data.end())
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++valid_keys;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.find(SessionStorageDatabase::NextMapIdKey()) != data.end())
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++valid_keys;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(valid_keys, data.size());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::DumpData() const {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(WARNING) << "---- Session storage contents";
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<leveldb::Iterator> it(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db_->db_->NewIterator(leveldb::ReadOptions()));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it->SeekToFirst(); it->Valid(); it->Next()) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 dummy_map_id;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsMapValueKey(it->key().ToString(), &dummy_map_id)) {
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Convert the value back to base::string16.
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 value;
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      size_t len = it->value().size() / sizeof(base::char16);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value.resize(len);
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      value.assign(
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          reinterpret_cast<const base::char16*>(it->value().data()), len);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << it->key().ToString() << ": " << value;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << it->key().ToString() << ": " << it->value().ToString();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(WARNING) << "----";
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::CheckAreaData(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& namespace_id, const GURL& origin,
320bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const DOMStorageValuesMap& reference) const {
321bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap values;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_->ReadAreaValues(namespace_id, origin, &values);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompareValuesMaps(values, reference);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::CompareValuesMaps(
327bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const DOMStorageValuesMap& map1,
328bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const DOMStorageValuesMap& map2) const {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(map2.size(), map1.size());
330bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  for (DOMStorageValuesMap::const_iterator it = map1.begin();
331bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch       it != map1.end(); ++it) {
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 key = it->first;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(map2.find(key) != map2.end());
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::NullableString16 val1 = it->second;
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::NullableString16 val2 = map2.find(key)->second;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(val2.is_null(), val1.is_null());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(val2.string(), val1.string());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::CheckNamespaceIds(
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<std::string>& expected_namespace_ids) const {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::vector<GURL> > namespaces_and_origins;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->ReadNamespacesAndOrigins(&namespaces_and_origins));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_namespace_ids.size(), namespaces_and_origins.size());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::map<std::string, std::vector<GURL> >::const_iterator it =
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           namespaces_and_origins.begin();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != namespaces_and_origins.end(); ++it) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(expected_namespace_ids.find(it->first) !=
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                expected_namespace_ids.end());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStorageDatabaseTest::CheckOrigins(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& namespace_id,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<GURL>& expected_origins) const {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::vector<GURL> > namespaces_and_origins;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->ReadNamespacesAndOrigins(&namespaces_and_origins));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<GURL>& origins = namespaces_and_origins[namespace_id];
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_origins.size(), origins.size());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<GURL>::const_iterator it = origins.begin();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != origins.end(); ++it) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(expected_origins.find(*it) != expected_origins.end());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SessionStorageDatabaseTest::GetMapForArea(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& namespace_id, const GURL& origin) const {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exists;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string map_id;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->GetMapForArea(namespace_id, origin.spec(),
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 leveldb::ReadOptions(), &exists, &map_id));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(exists);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return map_id;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 SessionStorageDatabaseTest::GetMapRefCount(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& map_id) const {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ref_count;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->GetMapRefCount(map_id, &ref_count));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ref_count;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, EmptyDatabaseSanityCheck) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An empty database should be valid.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, WriteDataForOneOrigin) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track on what the values should look like.
391bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap reference;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
394bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    DOMStorageValuesMap changes;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes[kKey1] = kValue1;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes[kKey2] = kValue2;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes[kKey3] = kValue3;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference[kKey1] = kValue1;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference[kKey2] = kValue2;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference[kKey3] = kValue3;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, reference);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overwrite and delete values.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
408bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    DOMStorageValuesMap changes;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes[kKey1] = kValue4;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes[kKey3] = kValueNull;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference[kKey1] = kValue4;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference.erase(kKey3);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, reference);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear data before writing.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
420bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    DOMStorageValuesMap changes;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changes[kKey2] = kValue2;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference.erase(kKey1);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference[kKey2] = kValue2;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, true, changes));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, reference);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, WriteDataForTwoOrigins) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data.
432bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
438bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey1] = kValue4;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey2] = kValue1;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue2;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data1);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin2, data2);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, WriteDataForTwoNamespaces) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data.
451bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data11;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data11[kKey1] = kValue1;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data11[kKey2] = kValue2;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data11[kKey3] = kValue3;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data11));
456bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data12;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data12[kKey2] = kValue4;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data12[kKey3] = kValue3;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data12));
460bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data21;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data21[kKey1] = kValue2;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data21[kKey2] = kValue4;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin1, false, data21));
464bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data22;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data22[kKey2] = kValue1;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data22[kKey3] = kValue2;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data22));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data11);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin2, data12);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace2, kOrigin1, data21);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace2, kOrigin2, data22);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, ShallowCopy) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data for a namespace, for 2 origins.
477bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
482bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey1] = kValue2;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue1;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a shallow copy.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now both namespaces should have the same data.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data1);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin2, data2);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin1, data1);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin2, data2);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both the namespaces refer to the same maps.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(kNamespaceClone, kOrigin1));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(kNamespaceClone, kOrigin2));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1)));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2)));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, WriteIntoShallowCopy) {
504bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data into a shallow copy.
511bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap changes;
512bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap reference;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes[kKey1] = kValueNull;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes[kKey2] = kValue4;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes[kKey3] = kValue4;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reference[kKey2] = kValue4;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reference[kKey3] = kValue4;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     changes));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values in the original namespace were not changed.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data1);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But values in the copy were.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin1, reference);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The namespaces no longer refer to the same map.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(GetMapForArea(kNamespace1, kOrigin1),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(kNamespaceClone, kOrigin1));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1)));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespaceClone, kOrigin1)));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, ManyShallowCopies) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data for a namespace, for 2 origins.
535bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
540bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey1] = kValue2;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue1;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a two shallow copies.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string another_clone("another_cloned");
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, another_clone));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a shallow copy of a shallow copy.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string clone_of_clone("clone_of_clone");
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(another_clone, clone_of_clone));
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now all namespaces should have the same data.
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data1);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin1, data1);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(another_clone, kOrigin1, data1);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(clone_of_clone, kOrigin1, data1);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin2, data2);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin2, data2);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(another_clone, kOrigin2, data2);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(clone_of_clone, kOrigin2, data2);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All namespaces refer to the same maps.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(kNamespaceClone, kOrigin1));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(kNamespaceClone, kOrigin2));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(another_clone, kOrigin1));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(another_clone, kOrigin2));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(clone_of_clone, kOrigin1));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetMapForArea(clone_of_clone, kOrigin2));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the ref counts.
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1)));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2)));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DisassociateShallowCopy) {
585bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disassoaciate the shallow copy.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->DeleteArea(kNamespaceClone, kOrigin1));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now new data can be written to that map.
596bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap reference;
597bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap changes;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes[kKey1] = kValueNull;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes[kKey2] = kValue4;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes[kKey3] = kValue4;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reference[kKey2] = kValue4;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reference[kKey3] = kValue4;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     changes));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values in the original map were not changed.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data1);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But values in the disassociated map were.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin1, reference);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DeleteNamespace) {
614bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
619bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey2] = kValue4;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue3;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->DeleteNamespace(kNamespace1));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckEmptyDatabase();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DeleteNamespaceWithShallowCopy) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data for a namespace, for 2 origins.
630bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
635bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey1] = kValue2;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue1;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a shallow copy and delete the original namespace.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->DeleteNamespace(kNamespace1));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original namespace has no data.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
646bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  CheckAreaData(kNamespace1, kOrigin1, DOMStorageValuesMap());
647bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  CheckAreaData(kNamespace1, kOrigin2, DOMStorageValuesMap());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But the copy persists.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin1, data1);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin2, data2);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DeleteArea) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data for a namespace, for 2 origins.
655bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
660bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey1] = kValue2;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue1;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The data for the non-deleted origin persists.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin1, data1);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The data for the deleted origin is gone.
670bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  CheckAreaData(kNamespace1, kOrigin2, DOMStorageValuesMap());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DeleteAreaWithShallowCopy) {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data for a namespace, for 2 origins.
675bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
680bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey1] = kValue2;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data2[kKey3] = kValue1;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a shallow copy and delete an origin from the original namespace.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original namespace has data for only the non-deleted origin.
691bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  CheckAreaData(kNamespace1, kOrigin1, DOMStorageValuesMap());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespace1, kOrigin2, data2);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But the copy persists.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin1, data1);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckAreaData(kNamespaceClone, kOrigin2, data2);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, WriteRawBytes) {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write data which is not valid utf8 and contains null bytes.
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char raw_data[10] = {255, 0, 0, 0, 1, 2, 3, 4, 5, 0};
701bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap changes;
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 string_with_raw_data;
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  string_with_raw_data.assign(reinterpret_cast<base::char16*>(raw_data), 5);
7047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  changes[kKey1] = base::NullableString16(string_with_raw_data, false);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
707bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap values;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_->ReadAreaValues(kNamespace1, kOrigin1, &values);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char* data =
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const unsigned char*>(values[kKey1].string().data());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; ++i)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(raw_data[i], data[i]);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DeleteNamespaceConfusion) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Regression test for a bug where a namespace with id 10 prevented deleting
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the namespace with id 1.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
719bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges("foobar", kOrigin1, false, data1));
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges("foobarbaz", kOrigin1, false, data1));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the namespace with ID 1.
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(db_->DeleteNamespace("foobar"));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, ReadNamespaceIds) {
729bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected_namespace_ids;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_namespace_ids.insert(kNamespace1);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckNamespaceIds(expected_namespace_ids);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_namespace_ids.insert(kNamespaceClone);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckNamespaceIds(expected_namespace_ids);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->DeleteNamespace(kNamespace1));
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_namespace_ids.erase(kNamespace1);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckNamespaceIds(expected_namespace_ids);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, ReadNamespaceIdsInEmptyDatabase) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected_namespace_ids;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckNamespaceIds(expected_namespace_ids);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionStorageDatabaseTest, ReadOriginsInNamespace) {
756bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey1] = kValue1;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey2] = kValue2;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data1[kKey3] = kValue3;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> expected_origins1;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data1));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_origins1.insert(kOrigin1);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_origins1.insert(kOrigin2);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckOrigins(kNamespace1, expected_origins1);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> expected_origins2;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data1));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_origins2.insert(kOrigin2);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckOrigins(kNamespace2, expected_origins2);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckOrigins(kNamespaceClone, expected_origins1);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_origins1.erase(kOrigin2);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckOrigins(kNamespace1, expected_origins1);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDatabaseConsistency();
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SessionStorageDatabaseTest, DeleteAllOrigins) {
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Write data for a namespace, for 2 origins.
785bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data1;
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data1[kKey1] = kValue1;
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
788bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageValuesMap data2;
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data2[kKey1] = kValue2;
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1));
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2));
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that also the namespace start key was deleted.
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckDatabaseConsistency();
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
799bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace content
800