OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |