Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: webkit/dom_storage/session_storage_database_unittest.cc

Issue 9963107: Persist sessionStorage on disk. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Code review. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 5
6 #include "webkit/dom_storage/session_storage_database.h" 6 #include "webkit/dom_storage/session_storage_database.h"
7 7
8 #include <algorithm> 8 #include <algorithm>
9 #include <map> 9 #include <map>
10 #include <string> 10 #include <string>
(...skipping 16 matching lines...) Expand all
27 public: 27 public:
28 SessionStorageDatabaseTest(); 28 SessionStorageDatabaseTest();
29 virtual ~SessionStorageDatabaseTest(); 29 virtual ~SessionStorageDatabaseTest();
30 virtual void SetUp() OVERRIDE; 30 virtual void SetUp() OVERRIDE;
31 31
32 protected: 32 protected:
33 typedef std::map<std::string, std::string> DataMap; 33 typedef std::map<std::string, std::string> DataMap;
34 34
35 // Helpers. 35 // Helpers.
36 static bool IsNamespaceKey(const std::string& key, 36 static bool IsNamespaceKey(const std::string& key,
37 int64* namespace_id); 37 std::string* namespace_id);
38 static bool IsNamespaceOriginKey(const std::string& key, 38 static bool IsNamespaceOriginKey(const std::string& key,
39 int64* namespace_id); 39 std::string* namespace_id);
40 static bool IsMapRefCountKey(const std::string& key, 40 static bool IsMapRefCountKey(const std::string& key,
41 int64* map_id); 41 int64* map_id);
42 static bool IsMapValueKey(const std::string& key, 42 static bool IsMapValueKey(const std::string& key,
43 int64* map_id); 43 int64* map_id);
44 void ResetDatabase(); 44 void ResetDatabase();
45 void ReadData(DataMap* data) const; 45 void ReadData(DataMap* data) const;
46 void CheckDatabaseConsistency() const; 46 void CheckDatabaseConsistency() const;
47 void CheckEmptyDatabase() const; 47 void CheckEmptyDatabase() const;
48 void DumpData() const; 48 void DumpData() const;
49 void CheckAreaData(int64 namespace_id, 49 void CheckAreaData(const std::string& namespace_id,
50 const GURL& origin, 50 const GURL& origin,
51 const ValuesMap& reference) const; 51 const ValuesMap& reference) const;
52 void CompareValuesMaps(const ValuesMap& map1, const ValuesMap& map2) const; 52 void CompareValuesMaps(const ValuesMap& map1, const ValuesMap& map2) const;
53 std::string GetMapForArea(int64 namespace_id, 53 std::string GetMapForArea(const std::string& namespace_id,
54 const GURL& origin) const; 54 const GURL& origin) const;
55 int64 GetMapRefCount(const std::string& map_id) const; 55 int64 GetMapRefCount(const std::string& map_id) const;
56 int64 NextNamespaceId() const;
57 56
58 ScopedTempDir temp_dir_; 57 ScopedTempDir temp_dir_;
59 scoped_refptr<SessionStorageDatabase> db_; 58 scoped_refptr<SessionStorageDatabase> db_;
60 59
61 // Test data. 60 // Test data.
62 const GURL kOrigin1; 61 const GURL kOrigin1;
63 const GURL kOrigin2; 62 const GURL kOrigin2;
63 const std::string kNamespace1;
64 const std::string kNamespace2;
65 const std::string kNamespaceClone;
64 const string16 kKey1; 66 const string16 kKey1;
65 const string16 kKey2; 67 const string16 kKey2;
66 const string16 kKey3; 68 const string16 kKey3;
67 const NullableString16 kValue1; 69 const NullableString16 kValue1;
68 const NullableString16 kValue2; 70 const NullableString16 kValue2;
69 const NullableString16 kValue3; 71 const NullableString16 kValue3;
70 const NullableString16 kValue4; 72 const NullableString16 kValue4;
71 const NullableString16 kValueNull; 73 const NullableString16 kValueNull;
72 74
73 DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabaseTest); 75 DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabaseTest);
74 }; 76 };
75 77
76 SessionStorageDatabaseTest::SessionStorageDatabaseTest() 78 SessionStorageDatabaseTest::SessionStorageDatabaseTest()
77 : kOrigin1("http://www.origin1.com"), 79 : kOrigin1("http://www.origin1.com"),
78 kOrigin2("http://www.origin2.com"), 80 kOrigin2("http://www.origin2.com"),
81 kNamespace1("1"),
82 kNamespace2("namespace2"),
83 kNamespaceClone("wascloned"),
79 kKey1(ASCIIToUTF16("key1")), 84 kKey1(ASCIIToUTF16("key1")),
80 kKey2(ASCIIToUTF16("key2")), 85 kKey2(ASCIIToUTF16("key2")),
81 kKey3(ASCIIToUTF16("key3")), 86 kKey3(ASCIIToUTF16("key3")),
82 kValue1(NullableString16(ASCIIToUTF16("value1"), false)), 87 kValue1(NullableString16(ASCIIToUTF16("value1"), false)),
83 kValue2(NullableString16(ASCIIToUTF16("value2"), false)), 88 kValue2(NullableString16(ASCIIToUTF16("value2"), false)),
84 kValue3(NullableString16(ASCIIToUTF16("value3"), false)), 89 kValue3(NullableString16(ASCIIToUTF16("value3"), false)),
85 kValue4(NullableString16(ASCIIToUTF16("value4"), false)), 90 kValue4(NullableString16(ASCIIToUTF16("value4"), false)),
86 kValueNull(NullableString16(true)) { } 91 kValueNull(NullableString16(true)) { }
87 92
88 SessionStorageDatabaseTest::~SessionStorageDatabaseTest() { } 93 SessionStorageDatabaseTest::~SessionStorageDatabaseTest() { }
89 94
90 void SessionStorageDatabaseTest::SetUp() { 95 void SessionStorageDatabaseTest::SetUp() {
91 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 96 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
92 ResetDatabase(); 97 ResetDatabase();
93 } 98 }
94 99
95 void SessionStorageDatabaseTest::ResetDatabase() { 100 void SessionStorageDatabaseTest::ResetDatabase() {
96 db_ = new SessionStorageDatabase(temp_dir_.path()); 101 db_ = new SessionStorageDatabase(temp_dir_.path());
97 ASSERT_TRUE(db_->LazyOpen(true)); 102 ASSERT_TRUE(db_->LazyOpen(true));
98 } 103 }
99 104
100 // static 105 // static
101 bool SessionStorageDatabaseTest::IsNamespaceKey(const std::string& key, 106 bool SessionStorageDatabaseTest::IsNamespaceKey(const std::string& key,
102 int64* namespace_id) { 107 std::string* namespace_id) {
103 std::string namespace_prefix = SessionStorageDatabase::NamespacePrefix(); 108 std::string namespace_prefix = SessionStorageDatabase::NamespacePrefix();
104 if (key.find(namespace_prefix) != 0) 109 if (key.find(namespace_prefix) != 0)
105 return false; 110 return false;
106 if (key == namespace_prefix) 111 if (key == namespace_prefix)
107 return false; 112 return false;
108 113
109 size_t second_dash = key.find('-', namespace_prefix.length()); 114 size_t second_dash = key.find('-', namespace_prefix.length());
110 if (second_dash != key.length() - 1) 115 if (second_dash != key.length() - 1)
111 return false; 116 return false;
112 117
113 // Key is of the form "namespace-<namespaceid>-". 118 // Key is of the form "namespace-<namespaceid>-".
114 std::string namespace_id_str = key.substr( 119 *namespace_id = key.substr(
115 namespace_prefix.length(), 120 namespace_prefix.length(),
116 second_dash - namespace_prefix.length()); 121 second_dash - namespace_prefix.length());
117 bool conversion_ok = base::StringToInt64(namespace_id_str, namespace_id);
118 EXPECT_TRUE(conversion_ok);
119 return true; 122 return true;
120 } 123 }
121 124
122 // static 125 // static
123 bool SessionStorageDatabaseTest::IsNamespaceOriginKey(const std::string& key, 126 bool SessionStorageDatabaseTest::IsNamespaceOriginKey(
124 int64* namespace_id) { 127 const std::string& key,
128 std::string* namespace_id) {
125 std::string namespace_prefix = SessionStorageDatabase::NamespacePrefix(); 129 std::string namespace_prefix = SessionStorageDatabase::NamespacePrefix();
126 if (key.find(namespace_prefix) != 0) 130 if (key.find(namespace_prefix) != 0)
127 return false; 131 return false;
128 size_t second_dash = key.find('-', namespace_prefix.length()); 132 size_t second_dash = key.find('-', namespace_prefix.length());
129 if (second_dash == std::string::npos || second_dash == key.length() - 1) 133 if (second_dash == std::string::npos || second_dash == key.length() - 1)
130 return false; 134 return false;
131 135
132 // Key is of the form "namespace-<namespaceid>-<origin>", and the value 136 // Key is of the form "namespace-<namespaceid>-<origin>", and the value
133 // is the map id. 137 // is the map id.
134 std::string namespace_id_str = key.substr( 138 *namespace_id = key.substr(
135 namespace_prefix.length(), 139 namespace_prefix.length(),
136 second_dash - namespace_prefix.length()); 140 second_dash - namespace_prefix.length());
137 bool conversion_ok = base::StringToInt64(namespace_id_str, namespace_id);
138 EXPECT_TRUE(conversion_ok);
139 return true; 141 return true;
140 } 142 }
141 143
142 // static 144 // static
143 bool SessionStorageDatabaseTest::IsMapRefCountKey(const std::string& key, 145 bool SessionStorageDatabaseTest::IsMapRefCountKey(const std::string& key,
144 int64* map_id) { 146 int64* map_id) {
145 std::string map_prefix = "map-"; 147 std::string map_prefix = "map-";
146 if (key.find(map_prefix) != 0) 148 if (key.find(map_prefix) != 0)
147 return false; 149 return false;
148 size_t second_dash = key.find('-', map_prefix.length()); 150 size_t second_dash = key.find('-', map_prefix.length());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 void SessionStorageDatabaseTest::CheckDatabaseConsistency() const { 187 void SessionStorageDatabaseTest::CheckDatabaseConsistency() const {
186 DataMap data; 188 DataMap data;
187 ReadData(&data); 189 ReadData(&data);
188 // Empty db is ok. 190 // Empty db is ok.
189 if (data.empty()) 191 if (data.empty())
190 return; 192 return;
191 193
192 // For detecting rubbish keys. 194 // For detecting rubbish keys.
193 size_t valid_keys = 0; 195 size_t valid_keys = 0;
194 196
195 std::string next_namespace_id_key =
196 SessionStorageDatabase::NextNamespaceIdKey();
197 std::string next_map_id_key = SessionStorageDatabase::NextMapIdKey(); 197 std::string next_map_id_key = SessionStorageDatabase::NextMapIdKey();
198 // Check the namespace start key. 198 // Check the namespace start key.
199 if (data.find(SessionStorageDatabase::NamespacePrefix()) == data.end()) { 199 if (data.find(SessionStorageDatabase::NamespacePrefix()) == data.end()) {
200 // If there is no namespace start key, the database may contain only counter 200 // If there is no namespace start key, the database may contain only counter
201 // keys. 201 // keys.
202 for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) { 202 for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) {
203 ASSERT_TRUE(it->first == next_namespace_id_key || 203 ASSERT_TRUE(it->first == next_map_id_key);
204 it->first == next_map_id_key);
205 } 204 }
206 return; 205 return;
207 } 206 }
208 ++valid_keys; 207 ++valid_keys;
209 208
210 // Iterate the "namespace-" keys. 209 // Iterate the "namespace-" keys.
211 std::set<int64> found_namespace_ids; 210 std::set<std::string> found_namespace_ids;
212 int64 max_namespace_id = -1;
213 std::map<int64, int64> expected_map_refcounts; 211 std::map<int64, int64> expected_map_refcounts;
214 int64 max_map_id = -1; 212 int64 max_map_id = -1;
215 213
216 for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) { 214 for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) {
217 int64 namespace_id; 215 std::string namespace_id;
218 std::string origin; 216 std::string origin;
219 if (IsNamespaceKey(it->first, &namespace_id)) { 217 if (IsNamespaceKey(it->first, &namespace_id)) {
220 ASSERT_GT(namespace_id, 0);
221 found_namespace_ids.insert(namespace_id); 218 found_namespace_ids.insert(namespace_id);
222 max_namespace_id = std::max(namespace_id, max_namespace_id);
223 ++valid_keys; 219 ++valid_keys;
224 } else if (IsNamespaceOriginKey( 220 } else if (IsNamespaceOriginKey(
225 it->first, &namespace_id)) { 221 it->first, &namespace_id)) {
226 // Check that the corresponding "namespace-<namespaceid>" key exists. It 222 // Check that the corresponding "namespace-<namespaceid>-" key exists. It
227 // has been read by now, since the keys are stored in order. 223 // has been read by now, since the keys are stored in order.
228 ASSERT_TRUE(found_namespace_ids.find(namespace_id) != 224 ASSERT_TRUE(found_namespace_ids.find(namespace_id) !=
229 found_namespace_ids.end()); 225 found_namespace_ids.end());
230 int64 map_id; 226 int64 map_id;
231 bool conversion_ok = base::StringToInt64(it->second, &map_id); 227 bool conversion_ok = base::StringToInt64(it->second, &map_id);
232 ASSERT_TRUE(conversion_ok); 228 ASSERT_TRUE(conversion_ok);
233 ASSERT_GE(map_id, 0); 229 ASSERT_GE(map_id, 0);
234 ++expected_map_refcounts[map_id]; 230 ++expected_map_refcounts[map_id];
235 max_map_id = std::max(map_id, max_map_id); 231 max_map_id = std::max(map_id, max_map_id);
236 ++valid_keys; 232 ++valid_keys;
237 } 233 }
238 } 234 }
239 if (max_namespace_id != -1) {
240 // The database contains namespaces.
241 ASSERT_TRUE(data.find(next_namespace_id_key) != data.end());
242 int64 next_namespace_id;
243 bool conversion_ok =
244 base::StringToInt64(data[next_namespace_id_key], &next_namespace_id);
245 ASSERT_TRUE(conversion_ok);
246 ASSERT_GT(next_namespace_id, max_namespace_id);
247 }
248 if (max_map_id != -1) { 235 if (max_map_id != -1) {
249 // The database contains maps. 236 // The database contains maps.
250 ASSERT_TRUE(data.find(next_map_id_key) != data.end()); 237 ASSERT_TRUE(data.find(next_map_id_key) != data.end());
251 int64 next_map_id; 238 int64 next_map_id;
252 bool conversion_ok = 239 bool conversion_ok =
253 base::StringToInt64(data[next_map_id_key], &next_map_id); 240 base::StringToInt64(data[next_map_id_key], &next_map_id);
254 ASSERT_TRUE(conversion_ok); 241 ASSERT_TRUE(conversion_ok);
255 ASSERT_GT(next_map_id, max_map_id); 242 ASSERT_GT(next_map_id, max_map_id);
256 } 243 }
257 244
(...skipping 15 matching lines...) Expand all
273 found_map_ids.insert(map_id); 260 found_map_ids.insert(map_id);
274 ++valid_keys; 261 ++valid_keys;
275 } else if (IsMapValueKey(it->first, &map_id)) { 262 } else if (IsMapValueKey(it->first, &map_id)) {
276 ASSERT_TRUE(found_map_ids.find(map_id) != found_map_ids.end()); 263 ASSERT_TRUE(found_map_ids.find(map_id) != found_map_ids.end());
277 ++valid_keys; 264 ++valid_keys;
278 } 265 }
279 } 266 }
280 // Check that all maps referred to exist. 267 // Check that all maps referred to exist.
281 ASSERT_TRUE(expected_map_refcounts.empty()); 268 ASSERT_TRUE(expected_map_refcounts.empty());
282 269
283 // Count valid keys.
284 if (data.find(next_namespace_id_key) != data.end())
285 ++valid_keys;
286
287 if (data.find(next_map_id_key) != data.end()) 270 if (data.find(next_map_id_key) != data.end())
288 ++valid_keys; 271 ++valid_keys;
289 272
290 ASSERT_EQ(data.size(), valid_keys); 273 ASSERT_EQ(data.size(), valid_keys);
291 } 274 }
292 275
293 void SessionStorageDatabaseTest::CheckEmptyDatabase() const { 276 void SessionStorageDatabaseTest::CheckEmptyDatabase() const {
294 DataMap data; 277 DataMap data;
295 ReadData(&data); 278 ReadData(&data);
296 size_t valid_keys = 0; 279 size_t valid_keys = 0;
297 if (data.find(SessionStorageDatabase::NamespacePrefix()) != data.end()) 280 if (data.find(SessionStorageDatabase::NamespacePrefix()) != data.end())
298 ++valid_keys; 281 ++valid_keys;
299 if (data.find(SessionStorageDatabase::NextNamespaceIdKey()) != data.end())
300 ++valid_keys;
301 if (data.find(SessionStorageDatabase::NextMapIdKey()) != data.end()) 282 if (data.find(SessionStorageDatabase::NextMapIdKey()) != data.end())
302 ++valid_keys; 283 ++valid_keys;
303 EXPECT_EQ(valid_keys, data.size()); 284 EXPECT_EQ(valid_keys, data.size());
304 } 285 }
305 286
306 void SessionStorageDatabaseTest::DumpData() const { 287 void SessionStorageDatabaseTest::DumpData() const {
307 LOG(WARNING) << "---- Session storage contents"; 288 LOG(WARNING) << "---- Session storage contents";
308 scoped_ptr<leveldb::Iterator> it( 289 scoped_ptr<leveldb::Iterator> it(
309 db_->db_->NewIterator(leveldb::ReadOptions())); 290 db_->db_->NewIterator(leveldb::ReadOptions()));
310 for (it->SeekToFirst(); it->Valid(); it->Next()) { 291 for (it->SeekToFirst(); it->Valid(); it->Next()) {
311 int64 dummy_map_id; 292 int64 dummy_map_id;
312 if (IsMapValueKey(it->key().ToString(), &dummy_map_id)) { 293 if (IsMapValueKey(it->key().ToString(), &dummy_map_id)) {
313 // Convert the value back to string16. 294 // Convert the value back to string16.
314 string16 value; 295 string16 value;
315 size_t len = it->value().size() / sizeof(char16); 296 size_t len = it->value().size() / sizeof(char16);
316 value.resize(len); 297 value.resize(len);
317 value.assign(reinterpret_cast<const char16*>(it->value().data()), len); 298 value.assign(reinterpret_cast<const char16*>(it->value().data()), len);
318 LOG(WARNING) << it->key().ToString() << ": " << value; 299 LOG(WARNING) << it->key().ToString() << ": " << value;
319 } else { 300 } else {
320 LOG(WARNING) << it->key().ToString() << ": " << it->value().ToString(); 301 LOG(WARNING) << it->key().ToString() << ": " << it->value().ToString();
321 } 302 }
322 } 303 }
323 LOG(WARNING) << "----"; 304 LOG(WARNING) << "----";
324 } 305 }
325 306
326 void SessionStorageDatabaseTest::CheckAreaData( 307 void SessionStorageDatabaseTest::CheckAreaData(
327 int64 namespace_id, const GURL& origin, const ValuesMap& reference) const { 308 const std::string& namespace_id, const GURL& origin,
309 const ValuesMap& reference) const {
328 ValuesMap values; 310 ValuesMap values;
329 db_->ReadAreaValues(namespace_id, origin, &values); 311 db_->ReadAreaValues(namespace_id, origin, &values);
330 CompareValuesMaps(values, reference); 312 CompareValuesMaps(values, reference);
331 } 313 }
332 314
333 void SessionStorageDatabaseTest::CompareValuesMaps( 315 void SessionStorageDatabaseTest::CompareValuesMaps(
334 const ValuesMap& map1, 316 const ValuesMap& map1,
335 const ValuesMap& map2) const { 317 const ValuesMap& map2) const {
336 ASSERT_EQ(map2.size(), map1.size()); 318 ASSERT_EQ(map2.size(), map1.size());
337 for (ValuesMap::const_iterator it = map1.begin(); it != map1.end(); ++it) { 319 for (ValuesMap::const_iterator it = map1.begin(); it != map1.end(); ++it) {
338 string16 key = it->first; 320 string16 key = it->first;
339 ASSERT_TRUE(map2.find(key) != map2.end()); 321 ASSERT_TRUE(map2.find(key) != map2.end());
340 NullableString16 val1 = it->second; 322 NullableString16 val1 = it->second;
341 NullableString16 val2 = map2.find(key)->second; 323 NullableString16 val2 = map2.find(key)->second;
342 EXPECT_EQ(val2.is_null(), val1.is_null()); 324 EXPECT_EQ(val2.is_null(), val1.is_null());
343 EXPECT_EQ(val2.string(), val1.string()); 325 EXPECT_EQ(val2.string(), val1.string());
344 } 326 }
345 } 327 }
346 328
347 std::string SessionStorageDatabaseTest::GetMapForArea( 329 std::string SessionStorageDatabaseTest::GetMapForArea(
348 int64 namespace_id, const GURL& origin) const { 330 const std::string& namespace_id, const GURL& origin) const {
349 bool exists; 331 bool exists;
350 std::string map_id; 332 std::string map_id;
351 EXPECT_TRUE(db_->GetMapForArea(namespace_id, origin, 333 EXPECT_TRUE(db_->GetMapForArea(namespace_id, origin.spec(),
352 &exists, &map_id)); 334 &exists, &map_id));
353 EXPECT_TRUE(exists); 335 EXPECT_TRUE(exists);
354 return map_id; 336 return map_id;
355 } 337 }
356 338
357 int64 SessionStorageDatabaseTest::GetMapRefCount( 339 int64 SessionStorageDatabaseTest::GetMapRefCount(
358 const std::string& map_id) const { 340 const std::string& map_id) const {
359 int64 ref_count; 341 int64 ref_count;
360 EXPECT_TRUE(db_->GetMapRefCount(map_id, &ref_count)); 342 EXPECT_TRUE(db_->GetMapRefCount(map_id, &ref_count));
361 return ref_count; 343 return ref_count;
362 } 344 }
363 345
364 int64 SessionStorageDatabaseTest::NextNamespaceId() const {
365 int64 next_namespace_id;
366 EXPECT_TRUE(db_->GetNextNamespaceId(&next_namespace_id));
367 return next_namespace_id;
368 }
369
370 TEST_F(SessionStorageDatabaseTest, EmptyDatabaseSanityCheck) { 346 TEST_F(SessionStorageDatabaseTest, EmptyDatabaseSanityCheck) {
371 // An empty database should be valid. 347 // An empty database should be valid.
372 CheckDatabaseConsistency(); 348 CheckDatabaseConsistency();
373 } 349 }
374 350
375 TEST_F(SessionStorageDatabaseTest, WriteDataForOneOrigin) { 351 TEST_F(SessionStorageDatabaseTest, WriteDataForOneOrigin) {
376 // Keep track on what the values should look like. 352 // Keep track on what the values should look like.
377 ValuesMap reference; 353 ValuesMap reference;
378 // Write data. 354 // Write data.
379 { 355 {
380 ValuesMap changes; 356 ValuesMap changes;
381 changes[kKey1] = kValue1; 357 changes[kKey1] = kValue1;
382 changes[kKey2] = kValue2; 358 changes[kKey2] = kValue2;
383 changes[kKey3] = kValue3; 359 changes[kKey3] = kValue3;
384 reference[kKey1] = kValue1; 360 reference[kKey1] = kValue1;
385 reference[kKey2] = kValue2; 361 reference[kKey2] = kValue2;
386 reference[kKey3] = kValue3; 362 reference[kKey3] = kValue3;
387 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, changes)); 363 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
388 } 364 }
389 CheckDatabaseConsistency(); 365 CheckDatabaseConsistency();
390 CheckAreaData(1, kOrigin1, reference); 366 CheckAreaData(kNamespace1, kOrigin1, reference);
391 367
392 // Overwrite and delete values. 368 // Overwrite and delete values.
393 { 369 {
394 ValuesMap changes; 370 ValuesMap changes;
395 changes[kKey1] = kValue4; 371 changes[kKey1] = kValue4;
396 changes[kKey3] = kValueNull; 372 changes[kKey3] = kValueNull;
397 reference[kKey1] = kValue4; 373 reference[kKey1] = kValue4;
398 reference.erase(kKey3); 374 reference.erase(kKey3);
399 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, changes)); 375 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
400 } 376 }
401 CheckDatabaseConsistency(); 377 CheckDatabaseConsistency();
402 CheckAreaData(1, kOrigin1, reference); 378 CheckAreaData(kNamespace1, kOrigin1, reference);
403 379
404 // Clear data before writing. 380 // Clear data before writing.
405 { 381 {
406 ValuesMap changes; 382 ValuesMap changes;
407 changes[kKey2] = kValue2; 383 changes[kKey2] = kValue2;
408 reference.erase(kKey1); 384 reference.erase(kKey1);
409 reference[kKey2] = kValue2; 385 reference[kKey2] = kValue2;
410 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, true, changes)); 386 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, true, changes));
411 } 387 }
412 CheckDatabaseConsistency(); 388 CheckDatabaseConsistency();
413 CheckAreaData(1, kOrigin1, reference); 389 CheckAreaData(kNamespace1, kOrigin1, reference);
414 } 390 }
415 391
416 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoOrigins) { 392 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoOrigins) {
417 // Write data. 393 // Write data.
418 ValuesMap data1; 394 ValuesMap data1;
419 data1[kKey1] = kValue1; 395 data1[kKey1] = kValue1;
420 data1[kKey2] = kValue2; 396 data1[kKey2] = kValue2;
421 data1[kKey3] = kValue3; 397 data1[kKey3] = kValue3;
422 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 398 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
423 399
424 ValuesMap data2; 400 ValuesMap data2;
425 data2[kKey1] = kValue4; 401 data2[kKey1] = kValue4;
426 data2[kKey2] = kValue1; 402 data2[kKey2] = kValue1;
427 data2[kKey3] = kValue2; 403 data2[kKey3] = kValue2;
428 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 404 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
429 405
430 CheckDatabaseConsistency(); 406 CheckDatabaseConsistency();
431 CheckAreaData(1, kOrigin1, data1); 407 CheckAreaData(kNamespace1, kOrigin1, data1);
432 CheckAreaData(1, kOrigin2, data2); 408 CheckAreaData(kNamespace1, kOrigin2, data2);
433 } 409 }
434 410
435 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoNamespaces) { 411 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoNamespaces) {
436 // Write data. 412 // Write data.
437 ValuesMap data11; 413 ValuesMap data11;
438 data11[kKey1] = kValue1; 414 data11[kKey1] = kValue1;
439 data11[kKey2] = kValue2; 415 data11[kKey2] = kValue2;
440 data11[kKey3] = kValue3; 416 data11[kKey3] = kValue3;
441 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data11)); 417 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data11));
442 ValuesMap data12; 418 ValuesMap data12;
443 data12[kKey2] = kValue4; 419 data12[kKey2] = kValue4;
444 data12[kKey3] = kValue3; 420 data12[kKey3] = kValue3;
445 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data12)); 421 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data12));
446 ValuesMap data21; 422 ValuesMap data21;
447 data21[kKey1] = kValue2; 423 data21[kKey1] = kValue2;
448 data21[kKey2] = kValue4; 424 data21[kKey2] = kValue4;
449 EXPECT_TRUE(db_->CommitAreaChanges(2, kOrigin1, false, data21)); 425 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin1, false, data21));
450 ValuesMap data22; 426 ValuesMap data22;
451 data22[kKey2] = kValue1; 427 data22[kKey2] = kValue1;
452 data22[kKey3] = kValue2; 428 data22[kKey3] = kValue2;
453 EXPECT_TRUE(db_->CommitAreaChanges(2, kOrigin2, false, data22)); 429 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data22));
454 CheckDatabaseConsistency(); 430 CheckDatabaseConsistency();
455 CheckAreaData(1, kOrigin1, data11); 431 CheckAreaData(kNamespace1, kOrigin1, data11);
456 CheckAreaData(1, kOrigin2, data12); 432 CheckAreaData(kNamespace1, kOrigin2, data12);
457 CheckAreaData(2, kOrigin1, data21); 433 CheckAreaData(kNamespace2, kOrigin1, data21);
458 CheckAreaData(2, kOrigin2, data22); 434 CheckAreaData(kNamespace2, kOrigin2, data22);
459 } 435 }
460 436
461 TEST_F(SessionStorageDatabaseTest, ShallowCopy) { 437 TEST_F(SessionStorageDatabaseTest, ShallowCopy) {
462 // Write data for a namespace, for 2 origins. 438 // Write data for a namespace, for 2 origins.
463 ValuesMap data1; 439 ValuesMap data1;
464 data1[kKey1] = kValue1; 440 data1[kKey1] = kValue1;
465 data1[kKey2] = kValue2; 441 data1[kKey2] = kValue2;
466 data1[kKey3] = kValue3; 442 data1[kKey3] = kValue3;
467 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 443 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
468 ValuesMap data2; 444 ValuesMap data2;
469 data2[kKey1] = kValue2; 445 data2[kKey1] = kValue2;
470 data2[kKey3] = kValue1; 446 data2[kKey3] = kValue1;
471 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 447 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
472 // Make a shallow copy. 448 // Make a shallow copy.
473 EXPECT_TRUE(db_->CloneNamespace(1, 5)); 449 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
474 // Now both namespaces should have the same data. 450 // Now both namespaces should have the same data.
475 CheckDatabaseConsistency(); 451 CheckDatabaseConsistency();
476 CheckAreaData(1, kOrigin1, data1); 452 CheckAreaData(kNamespace1, kOrigin1, data1);
477 CheckAreaData(1, kOrigin2, data2); 453 CheckAreaData(kNamespace1, kOrigin2, data2);
478 CheckAreaData(5, kOrigin1, data1); 454 CheckAreaData(kNamespaceClone, kOrigin1, data1);
479 CheckAreaData(5, kOrigin2, data2); 455 CheckAreaData(kNamespaceClone, kOrigin2, data2);
480 // Both the namespaces refer to the same maps. 456 // Both the namespaces refer to the same maps.
481 EXPECT_EQ(GetMapForArea(1, kOrigin1), GetMapForArea(5, kOrigin1)); 457 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
482 EXPECT_EQ(GetMapForArea(1, kOrigin2), GetMapForArea(5, kOrigin2)); 458 GetMapForArea(kNamespaceClone, kOrigin1));
483 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(1, kOrigin1))); 459 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
484 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(1, kOrigin2))); 460 GetMapForArea(kNamespaceClone, kOrigin2));
461 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1)));
462 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2)));
485 } 463 }
486 464
487 TEST_F(SessionStorageDatabaseTest, WriteIntoShallowCopy) { 465 TEST_F(SessionStorageDatabaseTest, WriteIntoShallowCopy) {
488 ValuesMap data1; 466 ValuesMap data1;
489 data1[kKey1] = kValue1; 467 data1[kKey1] = kValue1;
490 data1[kKey2] = kValue2; 468 data1[kKey2] = kValue2;
491 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 469 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
492 EXPECT_TRUE(db_->CloneNamespace(1, 5)); 470 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
493 471
494 // Write data into a shallow copy. 472 // Write data into a shallow copy.
495 ValuesMap changes; 473 ValuesMap changes;
496 ValuesMap reference; 474 ValuesMap reference;
497 changes[kKey1] = kValueNull; 475 changes[kKey1] = kValueNull;
498 changes[kKey2] = kValue4; 476 changes[kKey2] = kValue4;
499 changes[kKey3] = kValue4; 477 changes[kKey3] = kValue4;
500 reference[kKey2] = kValue4; 478 reference[kKey2] = kValue4;
501 reference[kKey3] = kValue4; 479 reference[kKey3] = kValue4;
502 EXPECT_TRUE(db_->CommitAreaChanges(5, kOrigin1, false, changes)); 480 EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false,
481 changes));
503 482
504 // Values in the original namespace were not changed. 483 // Values in the original namespace were not changed.
505 CheckAreaData(1, kOrigin1, data1); 484 CheckAreaData(kNamespace1, kOrigin1, data1);
506 // But values in the copy were. 485 // But values in the copy were.
507 CheckAreaData(5, kOrigin1, reference); 486 CheckAreaData(kNamespaceClone, kOrigin1, reference);
508 487
509 // The namespaces no longer refer to the same map. 488 // The namespaces no longer refer to the same map.
510 EXPECT_NE(GetMapForArea(1, kOrigin1), GetMapForArea(5, kOrigin1)); 489 EXPECT_NE(GetMapForArea(kNamespace1, kOrigin1),
511 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(1, kOrigin1))); 490 GetMapForArea(kNamespaceClone, kOrigin1));
512 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(5, kOrigin1))); 491 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1)));
492 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespaceClone, kOrigin1)));
513 } 493 }
514 494
515 TEST_F(SessionStorageDatabaseTest, ManyShallowCopies) { 495 TEST_F(SessionStorageDatabaseTest, ManyShallowCopies) {
516 // Write data for a namespace, for 2 origins. 496 // Write data for a namespace, for 2 origins.
517 ValuesMap data1; 497 ValuesMap data1;
518 data1[kKey1] = kValue1; 498 data1[kKey1] = kValue1;
519 data1[kKey2] = kValue2; 499 data1[kKey2] = kValue2;
520 data1[kKey3] = kValue3; 500 data1[kKey3] = kValue3;
521 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 501 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
522 ValuesMap data2; 502 ValuesMap data2;
523 data2[kKey1] = kValue2; 503 data2[kKey1] = kValue2;
524 data2[kKey3] = kValue1; 504 data2[kKey3] = kValue1;
525 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 505 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
526 506
527 // Make a two shallow copies. 507 // Make a two shallow copies.
528 EXPECT_TRUE(db_->CloneNamespace(1, 5)); 508 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
529 EXPECT_TRUE(db_->CloneNamespace(1, 6)); 509 std::string another_clone("another_cloned");
510 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, another_clone));
530 511
531 // Make a shallow copy of a shallow copy. 512 // Make a shallow copy of a shallow copy.
532 EXPECT_TRUE(db_->CloneNamespace(6, 7)); 513 std::string clone_of_clone("clone_of_clone");
514 EXPECT_TRUE(db_->CloneNamespace(another_clone, clone_of_clone));
533 515
534 // Now all namespaces should have the same data. 516 // Now all namespaces should have the same data.
535 CheckDatabaseConsistency(); 517 CheckDatabaseConsistency();
536 CheckAreaData(1, kOrigin1, data1); 518 CheckAreaData(kNamespace1, kOrigin1, data1);
537 CheckAreaData(5, kOrigin1, data1); 519 CheckAreaData(kNamespaceClone, kOrigin1, data1);
538 CheckAreaData(6, kOrigin1, data1); 520 CheckAreaData(another_clone, kOrigin1, data1);
539 CheckAreaData(7, kOrigin1, data1); 521 CheckAreaData(clone_of_clone, kOrigin1, data1);
540 CheckAreaData(1, kOrigin2, data2); 522 CheckAreaData(kNamespace1, kOrigin2, data2);
541 CheckAreaData(5, kOrigin2, data2); 523 CheckAreaData(kNamespaceClone, kOrigin2, data2);
542 CheckAreaData(6, kOrigin2, data2); 524 CheckAreaData(another_clone, kOrigin2, data2);
543 CheckAreaData(7, kOrigin2, data2); 525 CheckAreaData(clone_of_clone, kOrigin2, data2);
544 526
545 // All namespaces refer to the same maps. 527 // All namespaces refer to the same maps.
546 EXPECT_EQ(GetMapForArea(1, kOrigin1), GetMapForArea(5, kOrigin1)); 528 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
547 EXPECT_EQ(GetMapForArea(1, kOrigin2), GetMapForArea(5, kOrigin2)); 529 GetMapForArea(kNamespaceClone, kOrigin1));
548 EXPECT_EQ(GetMapForArea(1, kOrigin1), GetMapForArea(6, kOrigin1)); 530 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
549 EXPECT_EQ(GetMapForArea(1, kOrigin2), GetMapForArea(6, kOrigin2)); 531 GetMapForArea(kNamespaceClone, kOrigin2));
550 EXPECT_EQ(GetMapForArea(1, kOrigin1), GetMapForArea(7, kOrigin1)); 532 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
551 EXPECT_EQ(GetMapForArea(1, kOrigin2), GetMapForArea(7, kOrigin2)); 533 GetMapForArea(another_clone, kOrigin1));
534 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
535 GetMapForArea(another_clone, kOrigin2));
536 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1),
537 GetMapForArea(clone_of_clone, kOrigin1));
538 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2),
539 GetMapForArea(clone_of_clone, kOrigin2));
552 540
553 // Check the ref counts. 541 // Check the ref counts.
554 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(1, kOrigin1))); 542 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1)));
555 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(1, kOrigin2))); 543 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2)));
556 } 544 }
557 545
558 TEST_F(SessionStorageDatabaseTest, DisassociateShallowCopy) { 546 TEST_F(SessionStorageDatabaseTest, DisassociateShallowCopy) {
559 ValuesMap data1; 547 ValuesMap data1;
560 data1[kKey1] = kValue1; 548 data1[kKey1] = kValue1;
561 data1[kKey2] = kValue2; 549 data1[kKey2] = kValue2;
562 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 550 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
563 EXPECT_TRUE(db_->CloneNamespace(1, 5)); 551 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
564 552
565 // Disassoaciate the shallow copy. 553 // Disassoaciate the shallow copy.
566 EXPECT_TRUE(db_->DeleteArea(5, kOrigin1)); 554 EXPECT_TRUE(db_->DeleteArea(kNamespaceClone, kOrigin1));
567 CheckDatabaseConsistency(); 555 CheckDatabaseConsistency();
568 556
569 // Now new data can be written to that map. 557 // Now new data can be written to that map.
570 ValuesMap reference; 558 ValuesMap reference;
571 ValuesMap changes; 559 ValuesMap changes;
572 changes[kKey1] = kValueNull; 560 changes[kKey1] = kValueNull;
573 changes[kKey2] = kValue4; 561 changes[kKey2] = kValue4;
574 changes[kKey3] = kValue4; 562 changes[kKey3] = kValue4;
575 reference[kKey2] = kValue4; 563 reference[kKey2] = kValue4;
576 reference[kKey3] = kValue4; 564 reference[kKey3] = kValue4;
577 EXPECT_TRUE(db_->CommitAreaChanges(5, kOrigin1, false, changes)); 565 EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false,
566 changes));
578 567
579 // Values in the original map were not changed. 568 // Values in the original map were not changed.
580 CheckAreaData(1, kOrigin1, data1); 569 CheckAreaData(kNamespace1, kOrigin1, data1);
581 570
582 // But values in the disassociated map were. 571 // But values in the disassociated map were.
583 CheckAreaData(5, kOrigin1, reference); 572 CheckAreaData(kNamespaceClone, kOrigin1, reference);
584 } 573 }
585 574
586 TEST_F(SessionStorageDatabaseTest, DeleteNamespace) { 575 TEST_F(SessionStorageDatabaseTest, DeleteNamespace) {
587 ValuesMap data1; 576 ValuesMap data1;
588 data1[kKey1] = kValue1; 577 data1[kKey1] = kValue1;
589 data1[kKey2] = kValue2; 578 data1[kKey2] = kValue2;
590 data1[kKey3] = kValue3; 579 data1[kKey3] = kValue3;
591 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 580 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
592 ValuesMap data2; 581 ValuesMap data2;
593 data2[kKey2] = kValue4; 582 data2[kKey2] = kValue4;
594 data2[kKey3] = kValue3; 583 data2[kKey3] = kValue3;
595 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 584 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
596 EXPECT_TRUE(db_->DeleteNamespace(1)); 585 EXPECT_TRUE(db_->DeleteNamespace(kNamespace1));
597 CheckDatabaseConsistency(); 586 CheckDatabaseConsistency();
598 CheckEmptyDatabase(); 587 CheckEmptyDatabase();
599 } 588 }
600 589
601 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceWithShallowCopy) { 590 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceWithShallowCopy) {
602 // Write data for a namespace, for 2 origins. 591 // Write data for a namespace, for 2 origins.
603 ValuesMap data1; 592 ValuesMap data1;
604 data1[kKey1] = kValue1; 593 data1[kKey1] = kValue1;
605 data1[kKey2] = kValue2; 594 data1[kKey2] = kValue2;
606 data1[kKey3] = kValue3; 595 data1[kKey3] = kValue3;
607 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 596 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
608 ValuesMap data2; 597 ValuesMap data2;
609 data2[kKey1] = kValue2; 598 data2[kKey1] = kValue2;
610 data2[kKey3] = kValue1; 599 data2[kKey3] = kValue1;
611 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 600 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
612 601
613 // Make a shallow copy and delete the original namespace. 602 // Make a shallow copy and delete the original namespace.
614 EXPECT_TRUE(db_->CloneNamespace(1, 5));; 603 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
615 EXPECT_TRUE(db_->DeleteNamespace(1)); 604 EXPECT_TRUE(db_->DeleteNamespace(kNamespace1));
616 605
617 // The original namespace has no data. 606 // The original namespace has no data.
618 CheckDatabaseConsistency(); 607 CheckDatabaseConsistency();
619 CheckAreaData(1, kOrigin1, ValuesMap()); 608 CheckAreaData(kNamespace1, kOrigin1, ValuesMap());
620 CheckAreaData(1, kOrigin2, ValuesMap()); 609 CheckAreaData(kNamespace1, kOrigin2, ValuesMap());
621 // But the copy persists. 610 // But the copy persists.
622 CheckAreaData(5, kOrigin1, data1); 611 CheckAreaData(kNamespaceClone, kOrigin1, data1);
623 CheckAreaData(5, kOrigin2, data2); 612 CheckAreaData(kNamespaceClone, kOrigin2, data2);
624 } 613 }
625 614
626 TEST_F(SessionStorageDatabaseTest, DeleteArea) { 615 TEST_F(SessionStorageDatabaseTest, DeleteArea) {
627 // Write data for a namespace, for 2 origins. 616 // Write data for a namespace, for 2 origins.
628 ValuesMap data1; 617 ValuesMap data1;
629 data1[kKey1] = kValue1; 618 data1[kKey1] = kValue1;
630 data1[kKey2] = kValue2; 619 data1[kKey2] = kValue2;
631 data1[kKey3] = kValue3; 620 data1[kKey3] = kValue3;
632 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 621 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
633 ValuesMap data2; 622 ValuesMap data2;
634 data2[kKey1] = kValue2; 623 data2[kKey1] = kValue2;
635 data2[kKey3] = kValue1; 624 data2[kKey3] = kValue1;
636 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 625 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
637 626
638 EXPECT_TRUE(db_->DeleteArea(1, kOrigin2)); 627 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2));
639 CheckDatabaseConsistency(); 628 CheckDatabaseConsistency();
640 // The data for the non-deleted origin persists. 629 // The data for the non-deleted origin persists.
641 CheckAreaData(1, kOrigin1, data1); 630 CheckAreaData(kNamespace1, kOrigin1, data1);
642 // The data for the deleted origin is gone. 631 // The data for the deleted origin is gone.
643 CheckAreaData(1, kOrigin2, ValuesMap()); 632 CheckAreaData(kNamespace1, kOrigin2, ValuesMap());
644 } 633 }
645 634
646 TEST_F(SessionStorageDatabaseTest, DeleteAreaWithShallowCopy) { 635 TEST_F(SessionStorageDatabaseTest, DeleteAreaWithShallowCopy) {
647 // Write data for a namespace, for 2 origins. 636 // Write data for a namespace, for 2 origins.
648 ValuesMap data1; 637 ValuesMap data1;
649 data1[kKey1] = kValue1; 638 data1[kKey1] = kValue1;
650 data1[kKey2] = kValue2; 639 data1[kKey2] = kValue2;
651 data1[kKey3] = kValue3; 640 data1[kKey3] = kValue3;
652 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1)); 641 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
653 ValuesMap data2; 642 ValuesMap data2;
654 data2[kKey1] = kValue2; 643 data2[kKey1] = kValue2;
655 data2[kKey3] = kValue1; 644 data2[kKey3] = kValue1;
656 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin2, false, data2)); 645 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
657 646
658 // Make a shallow copy and delete an origin from the original namespace. 647 // Make a shallow copy and delete an origin from the original namespace.
659 EXPECT_TRUE(db_->CloneNamespace(1, 5)); 648 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
660 EXPECT_TRUE(db_->DeleteArea(1, kOrigin1)); 649 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1));
661 CheckDatabaseConsistency(); 650 CheckDatabaseConsistency();
662 651
663 // The original namespace has data for only the non-deleted origin. 652 // The original namespace has data for only the non-deleted origin.
664 CheckAreaData(1, kOrigin1, ValuesMap()); 653 CheckAreaData(kNamespace1, kOrigin1, ValuesMap());
665 CheckAreaData(1, kOrigin2, data2); 654 CheckAreaData(kNamespace1, kOrigin2, data2);
666 // But the copy persists. 655 // But the copy persists.
667 CheckAreaData(5, kOrigin1, data1); 656 CheckAreaData(kNamespaceClone, kOrigin1, data1);
668 CheckAreaData(5, kOrigin2, data2); 657 CheckAreaData(kNamespaceClone, kOrigin2, data2);
669 } 658 }
670 659
671 TEST_F(SessionStorageDatabaseTest, WriteRawBytes) { 660 TEST_F(SessionStorageDatabaseTest, WriteRawBytes) {
672 // Write data which is not valid utf8 and contains null bytes. 661 // Write data which is not valid utf8 and contains null bytes.
673 unsigned char raw_data[10] = {255, 0, 0, 0, 1, 2, 3, 4, 5, 0}; 662 unsigned char raw_data[10] = {255, 0, 0, 0, 1, 2, 3, 4, 5, 0};
674 ValuesMap changes; 663 ValuesMap changes;
675 string16 string_with_raw_data; 664 string16 string_with_raw_data;
676 string_with_raw_data.assign(reinterpret_cast<char16*>(raw_data), 5); 665 string_with_raw_data.assign(reinterpret_cast<char16*>(raw_data), 5);
677 changes[kKey1] = NullableString16(string_with_raw_data, false); 666 changes[kKey1] = NullableString16(string_with_raw_data, false);
678 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, changes)); 667 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
679 CheckDatabaseConsistency(); 668 CheckDatabaseConsistency();
680 ValuesMap values; 669 ValuesMap values;
681 db_->ReadAreaValues(1, kOrigin1, &values); 670 db_->ReadAreaValues(kNamespace1, kOrigin1, &values);
682 const unsigned char* data = 671 const unsigned char* data =
683 reinterpret_cast<const unsigned char*>(values[kKey1].string().data()); 672 reinterpret_cast<const unsigned char*>(values[kKey1].string().data());
684 for (int i = 0; i < 10; ++i) 673 for (int i = 0; i < 10; ++i)
685 EXPECT_EQ(raw_data[i], data[i]); 674 EXPECT_EQ(raw_data[i], data[i]);
686 } 675 }
687 676
688 TEST_F(SessionStorageDatabaseTest, NextNamespaceId) {
689 // Create namespaces, check the next namespace id.
690 ValuesMap data1;
691 data1[kKey1] = kValue1;
692 data1[kKey2] = kValue2;
693 ASSERT_TRUE(db_->CommitAreaChanges(10, kOrigin1, false, data1));
694 EXPECT_EQ(10 + 1, NextNamespaceId());
695 ASSERT_TRUE(db_->CommitAreaChanges(343, kOrigin1, false, data1));
696 EXPECT_EQ(343 + 1, NextNamespaceId());
697 ASSERT_TRUE(db_->CommitAreaChanges(99, kOrigin1, false, data1));
698 EXPECT_EQ(343 + 1, NextNamespaceId());
699
700 // Close the database and recreate it.
701 ResetDatabase();
702
703 // The next namespace id is persisted.
704 EXPECT_EQ(344, NextNamespaceId());
705
706 // Create more namespaces.
707 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1));
708 EXPECT_EQ(344 + 1 + 1, NextNamespaceId());
709
710 EXPECT_TRUE(db_->CommitAreaChanges(959, kOrigin1, false, data1));
711 EXPECT_EQ(344 + 959 + 1, NextNamespaceId());
712 }
713
714 TEST_F(SessionStorageDatabaseTest, NamespaceOffset) {
715 // Create a namespace with id 1.
716 ValuesMap data1;
717 data1[kKey1] = kValue1;
718 data1[kKey2] = kValue2;
719 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1));
720
721 // Close the database and recreate it.
722 ResetDatabase();
723
724 // Create another namespace with id 1.
725 ValuesMap data2;
726 data2[kKey1] = kValue3;
727 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data2));
728
729 // Now the values for namespace 1 are the new ones.
730 CheckAreaData(1, kOrigin1, data2);
731
732 // The values for the old namespace 1 are still accessible via id -1.
733 CheckAreaData(-1, kOrigin1, data1);
734 }
735
736 TEST_F(SessionStorageDatabaseTest, NamespaceOffsetCloneNamespace) {
737 // Create a namespace with id 1.
738 ValuesMap data1;
739 data1[kKey1] = kValue1;
740 data1[kKey2] = kValue2;
741 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1));
742
743 // Close the database and recreate it.
744 ResetDatabase();
745
746 // Create another namespace with id 1.
747 ValuesMap data2;
748 data2[kKey1] = kValue3;
749 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data2));
750
751 // Make a shallow copy of the newly created namespace.
752 EXPECT_TRUE(db_->CloneNamespace(1, 20));
753
754 // The clone contains values from the newly created namespace.
755 CheckAreaData(20, kOrigin1, data2);
756 CheckAreaData(1, kOrigin1, data2);
757
758 // The values for the old namespace 1 are still accessible via id -1.
759 CheckAreaData(-1, kOrigin1, data1);
760
761 // Close the database and recreate it.
762 ResetDatabase();
763
764 // The namespace and the clone are still accessible.
765 CheckAreaData(-1, kOrigin1, data2);
766 CheckAreaData(-20, kOrigin1, data2);
767 CheckAreaData(-22, kOrigin1, data1);
768 }
769
770 TEST_F(SessionStorageDatabaseTest, NamespaceOffsetWriteIntoShallowCopy) {
771 // Create a namespace with id 1.
772 ValuesMap data1;
773 data1[kKey1] = kValue1;
774 data1[kKey2] = kValue2;
775 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1));
776
777 // Close the database and recreate it.
778 ResetDatabase();
779
780 // Create another namespace with id 1.
781 ValuesMap data2;
782 data2[kKey1] = kValue3;
783 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data2));
784
785 // Make a shallow copy of the newly created namespace.
786 EXPECT_TRUE(db_->CloneNamespace(1, 20));
787
788 // Now the values can be altered and a deep copy will be made.
789 ValuesMap data3;
790 data3[kKey1] = kValue2;
791 EXPECT_TRUE(db_->CommitAreaChanges(20, kOrigin1, false, data3));
792
793 CheckAreaData(20, kOrigin1, data3);
794 CheckAreaData(1, kOrigin1, data2);
795
796 // The values for the old namespace 1 are still accessible via id -1.
797 CheckAreaData(-1, kOrigin1, data1);
798
799 // Close the database and recreate it.
800 ResetDatabase();
801
802 // The namespace and the deep copy are still accessible.
803 CheckAreaData(-1, kOrigin1, data3);
804 CheckAreaData(-20, kOrigin1, data2);
805 CheckAreaData(-22, kOrigin1, data1);
806 }
807
808 TEST_F(SessionStorageDatabaseTest, NamespaceOffsetDeleteArea) {
809 // Create a namespace with id 1.
810 ValuesMap data1;
811 data1[kKey1] = kValue1;
812 data1[kKey2] = kValue2;
813 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1));
814
815 // Close the database and recreate it.
816 ResetDatabase();
817
818 // Create another namespace with id 1.
819 ValuesMap data2;
820 data2[kKey1] = kValue3;
821 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data2));
822
823 // Delete kOrigin1 from the newly created namespace.
824 EXPECT_TRUE(db_->DeleteArea(1, kOrigin1));
825
826 // Namespace 1 is empty.
827 CheckAreaData(1, kOrigin1, ValuesMap());
828
829 // The values for the old namespace 1 are still accessible via id -1.
830 CheckAreaData(-1, kOrigin1, data1);
831 }
832
833 TEST_F(SessionStorageDatabaseTest, NamespaceOffsetDeleteNamespace) {
834 // Create a namespace with id 1.
835 ValuesMap data1;
836 data1[kKey1] = kValue1;
837 data1[kKey2] = kValue2;
838 ASSERT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data1));
839
840 // Close the database and recreate it.
841 ResetDatabase();
842
843 // Create another namespace with id 1.
844 ValuesMap data2;
845 data2[kKey1] = kValue3;
846 EXPECT_TRUE(db_->CommitAreaChanges(1, kOrigin1, false, data2));
847
848 // Delete the newly created namespace.
849 EXPECT_TRUE(db_->DeleteNamespace(1));
850
851 // Namespace 1 is empty.
852 CheckAreaData(1, kOrigin1, ValuesMap());
853
854 // The values for the old namespace 1 are still accessible via id -1.
855 CheckAreaData(-1, kOrigin1, data1);
856 }
857
858 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceConfusion) { 677 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceConfusion) {
859 // Regression test for a bug where a namespace with id 10 prevented deleting 678 // Regression test for a bug where a namespace with id 10 prevented deleting
860 // the namespace with id 1. 679 // the namespace with id 1.
861 680
862 // Create namespace with IDs 0 to 10. The real IDs in the DB will correspond
863 // to these IDs.
864 ValuesMap data1; 681 ValuesMap data1;
865 data1[kKey1] = kValue1; 682 data1[kKey1] = kValue1;
866 for (int i = 0; i <= 10; ++i) 683 ASSERT_TRUE(db_->CommitAreaChanges("foobar", kOrigin1, false, data1));
867 ASSERT_TRUE(db_->CommitAreaChanges(i, kOrigin1, false, data1)); 684 ASSERT_TRUE(db_->CommitAreaChanges("foobarbaz", kOrigin1, false, data1));
868 685
869 // Delete the namespace with ID 1. 686 // Delete the namespace with ID 1.
870 EXPECT_TRUE(db_->DeleteNamespace(1)); 687 EXPECT_TRUE(db_->DeleteNamespace("foobar"));
871 } 688 }
872 689
873 } // namespace dom_storage 690 } // namespace dom_storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698