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