blob: bdb5b0c1f1617c991b050d81fe8c15dea7062fa2 [file] [log] [blame]
[email protected]e0ffc6f2012-04-28 07:04:361// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]615dedfc2009-11-02 21:41:562// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]615dedfc2009-11-02 21:41:565#include "base/file_util.h"
[email protected]57999812013-02-24 05:40:526#include "base/files/file_path.h"
[email protected]ea1a3f62012-11-16 20:34:237#include "base/files/scoped_temp_dir.h"
[email protected]3b63f8f42011-03-28 01:54:158#include "base/memory/scoped_ptr.h"
[email protected]c41ea852013-07-18 04:20:579#include "base/message_loop/message_loop.h"
[email protected]7ccb7072013-06-10 20:56:2810#include "base/message_loop/message_loop_proxy.h"
[email protected]800ad562011-07-08 08:00:5011#include "base/platform_file.h"
[email protected]906265872013-06-07 22:40:4512#include "base/strings/utf_string_conversions.h"
[email protected]0a8ebe12013-06-28 15:23:2313#include "base/time/time.h"
[email protected]ad74a592011-01-21 18:40:5514#include "net/base/net_errors.h"
[email protected]ec3d1452010-02-18 10:02:2615#include "net/base/test_completion_callback.h"
[email protected]615dedfc2009-11-02 21:41:5616#include "testing/gtest/include/gtest/gtest.h"
[email protected]1f1db252012-02-18 01:04:1417#include "third_party/sqlite/sqlite3.h"
[email protected]08b1f75f2013-05-22 22:02:3818#include "webkit/browser/database/database_tracker.h"
[email protected]7660ec92013-05-30 05:12:3919#include "webkit/browser/quota/mock_special_storage_policy.h"
20#include "webkit/browser/quota/quota_manager.h"
[email protected]2a9644c2013-06-19 06:19:3421#include "webkit/common/database/database_identifier.h"
[email protected]615dedfc2009-11-02 21:41:5622
[email protected]6c3bf032013-12-25 19:37:0323using base::ASCIIToWide;
24
[email protected]615dedfc2009-11-02 21:41:5625namespace {
26
[email protected]19eb80152011-02-26 00:28:4327const char kOrigin1Url[] = "http://origin1";
28const char kOrigin2Url[] = "http://protected_origin2";
29
[email protected]615dedfc2009-11-02 21:41:5630class TestObserver : public webkit_database::DatabaseTracker::Observer {
31 public:
[email protected]1f1db252012-02-18 01:04:1432 TestObserver()
33 : new_notification_received_(false),
34 observe_size_changes_(true),
35 observe_scheduled_deletions_(true) {
36 }
37 TestObserver(bool observe_size_changes, bool observe_scheduled_deletions)
38 : new_notification_received_(false),
39 observe_size_changes_(observe_size_changes),
40 observe_scheduled_deletions_(observe_scheduled_deletions) {
41 }
42
[email protected]615dedfc2009-11-02 21:41:5643 virtual ~TestObserver() {}
[email protected]5e301592013-06-18 06:36:0544 virtual void OnDatabaseSizeChanged(const std::string& origin_identifier,
[email protected]82758352013-03-29 19:21:3145 const base::string16& database_name,
[email protected]7fd8fa4f2013-02-07 05:43:5046 int64 database_size) OVERRIDE {
[email protected]1f1db252012-02-18 01:04:1447 if (!observe_size_changes_)
48 return;
[email protected]615dedfc2009-11-02 21:41:5649 new_notification_received_ = true;
50 origin_identifier_ = origin_identifier;
51 database_name_ = database_name;
52 database_size_ = database_size;
[email protected]615dedfc2009-11-02 21:41:5653 }
[email protected]7fd8fa4f2013-02-07 05:43:5054 virtual void OnDatabaseScheduledForDeletion(
[email protected]5e301592013-06-18 06:36:0555 const std::string& origin_identifier,
[email protected]82758352013-03-29 19:21:3156 const base::string16& database_name) OVERRIDE {
[email protected]1f1db252012-02-18 01:04:1457 if (!observe_scheduled_deletions_)
58 return;
[email protected]ec3d1452010-02-18 10:02:2659 new_notification_received_ = true;
60 origin_identifier_ = origin_identifier;
61 database_name_ = database_name;
[email protected]2b0ec8b2010-02-12 19:24:0462 }
[email protected]615dedfc2009-11-02 21:41:5663 bool DidReceiveNewNotification() {
64 bool temp_new_notification_received = new_notification_received_;
65 new_notification_received_ = false;
66 return temp_new_notification_received;
67 }
[email protected]5e301592013-06-18 06:36:0568 std::string GetNotificationOriginIdentifier() {
[email protected]82758352013-03-29 19:21:3169 return origin_identifier_;
70 }
71 base::string16 GetNotificationDatabaseName() { return database_name_; }
[email protected]615dedfc2009-11-02 21:41:5672 int64 GetNotificationDatabaseSize() { return database_size_; }
[email protected]615dedfc2009-11-02 21:41:5673
74 private:
75 bool new_notification_received_;
[email protected]1f1db252012-02-18 01:04:1476 bool observe_size_changes_;
77 bool observe_scheduled_deletions_;
[email protected]5e301592013-06-18 06:36:0578 std::string origin_identifier_;
[email protected]82758352013-03-29 19:21:3179 base::string16 database_name_;
[email protected]615dedfc2009-11-02 21:41:5680 int64 database_size_;
[email protected]615dedfc2009-11-02 21:41:5681};
82
83void CheckNotificationReceived(TestObserver* observer,
[email protected]5e301592013-06-18 06:36:0584 const std::string& expected_origin_identifier,
[email protected]82758352013-03-29 19:21:3185 const base::string16& expected_database_name,
[email protected]7c5f2ec2011-05-26 19:15:2686 int64 expected_database_size) {
[email protected]615dedfc2009-11-02 21:41:5687 EXPECT_TRUE(observer->DidReceiveNewNotification());
88 EXPECT_EQ(expected_origin_identifier,
89 observer->GetNotificationOriginIdentifier());
90 EXPECT_EQ(expected_database_name,
91 observer->GetNotificationDatabaseName());
92 EXPECT_EQ(expected_database_size,
93 observer->GetNotificationDatabaseSize());
[email protected]615dedfc2009-11-02 21:41:5694}
95
[email protected]eea70ad2011-05-15 00:24:1396class TestQuotaManagerProxy : public quota::QuotaManagerProxy {
97 public:
98 TestQuotaManagerProxy()
99 : QuotaManagerProxy(NULL, NULL),
100 registered_client_(NULL) {
101 }
102
[email protected]7fd8fa4f2013-02-07 05:43:50103 virtual void RegisterClient(quota::QuotaClient* client) OVERRIDE {
[email protected]eea70ad2011-05-15 00:24:13104 EXPECT_FALSE(registered_client_);
105 registered_client_ = client;
106 }
107
108 virtual void NotifyStorageAccessed(quota::QuotaClient::ID client_id,
109 const GURL& origin,
[email protected]7fd8fa4f2013-02-07 05:43:50110 quota::StorageType type) OVERRIDE {
[email protected]eea70ad2011-05-15 00:24:13111 EXPECT_EQ(quota::QuotaClient::kDatabase, client_id);
112 EXPECT_EQ(quota::kStorageTypeTemporary, type);
113 accesses_[origin] += 1;
114 }
115
116 virtual void NotifyStorageModified(quota::QuotaClient::ID client_id,
117 const GURL& origin,
118 quota::StorageType type,
[email protected]7fd8fa4f2013-02-07 05:43:50119 int64 delta) OVERRIDE {
[email protected]eea70ad2011-05-15 00:24:13120 EXPECT_EQ(quota::QuotaClient::kDatabase, client_id);
121 EXPECT_EQ(quota::kStorageTypeTemporary, type);
122 modifications_[origin].first += 1;
123 modifications_[origin].second += delta;
124 }
125
126 // Not needed for our tests.
[email protected]7fd8fa4f2013-02-07 05:43:50127 virtual void NotifyOriginInUse(const GURL& origin) OVERRIDE {}
128 virtual void NotifyOriginNoLongerInUse(const GURL& origin) OVERRIDE {}
[email protected]53d9e3952013-11-06 10:33:05129 virtual void SetUsageCacheEnabled(quota::QuotaClient::ID client_id,
130 const GURL& origin,
131 quota::StorageType type,
132 bool enabled) OVERRIDE {}
133 virtual void GetUsageAndQuota(
134 base::SequencedTaskRunner* original_task_runner,
135 const GURL& origin,
136 quota::StorageType type,
137 const GetUsageAndQuotaCallback& callback) OVERRIDE {}
[email protected]eea70ad2011-05-15 00:24:13138
139 void SimulateQuotaManagerDestroyed() {
140 if (registered_client_) {
141 registered_client_->OnQuotaManagerDestroyed();
142 registered_client_ = NULL;
143 }
144 }
145
146 bool WasAccessNotified(const GURL& origin) {
147 return accesses_[origin] != 0;
148 }
149
150 bool WasModificationNotified(const GURL& origin, int64 amount) {
151 return modifications_[origin].first != 0 &&
152 modifications_[origin].second == amount;
153 }
154
155 void reset() {
156 accesses_.clear();
157 modifications_.clear();
158 }
159
160 quota::QuotaClient* registered_client_;
161
162 // Map from origin to count of access notifications.
163 std::map<GURL, int> accesses_;
164
165 // Map from origin to <count, sum of deltas>
166 std::map<GURL, std::pair<int, int64> > modifications_;
[email protected]e0ffc6f2012-04-28 07:04:36167
168 protected:
169 virtual ~TestQuotaManagerProxy() {
170 EXPECT_FALSE(registered_client_);
171 }
[email protected]eea70ad2011-05-15 00:24:13172};
173
174
[email protected]a3ef4832013-02-02 05:12:33175bool EnsureFileOfSize(const base::FilePath& file_path, int64 length) {
[email protected]eea70ad2011-05-15 00:24:13176 base::PlatformFileError error_code(base::PLATFORM_FILE_ERROR_FAILED);
177 base::PlatformFile file =
178 base::CreatePlatformFile(
179 file_path,
180 base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE,
181 NULL,
182 &error_code);
183 if (error_code != base::PLATFORM_FILE_OK)
184 return false;
185 if (!base::TruncatePlatformFile(file, length))
186 error_code = base::PLATFORM_FILE_ERROR_FAILED;
187 base::ClosePlatformFile(file);
188 return error_code == base::PLATFORM_FILE_OK;
189}
190
[email protected]615dedfc2009-11-02 21:41:56191} // namespace
192
193namespace webkit_database {
194
[email protected]fe615f32010-06-13 09:08:41195// We declare a helper class, and make it a friend of DatabaseTracker using
196// the FRIEND_TEST() macro, and we implement all tests we want to run as
197// static methods of this class. Then we make our TEST() targets call these
198// static functions. This allows us to run each test in normal mode and
199// incognito mode without writing the same code twice.
200class DatabaseTracker_TestHelper_Test {
201 public:
202 static void TestDeleteOpenDatabase(bool incognito_mode) {
203 // Initialize the tracker database.
[email protected]ea1a3f62012-11-16 20:34:23204 base::ScopedTempDir temp_dir;
[email protected]8e43e072010-07-28 21:30:34205 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
[email protected]d0240442011-08-17 09:23:00206 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
207 new quota::MockSpecialStoragePolicy;
208 special_storage_policy->AddProtected(GURL(kOrigin2Url));
[email protected]fe615f32010-06-13 09:08:41209 scoped_refptr<DatabaseTracker> tracker(
[email protected]ff875be52013-06-02 23:47:38210 new DatabaseTracker(temp_dir.path(),
211 incognito_mode,
212 special_storage_policy.get(),
213 NULL,
214 NULL));
[email protected]fe615f32010-06-13 09:08:41215
216 // Create and open three databases.
217 int64 database_size = 0;
[email protected]5e301592013-06-18 06:36:05218 const std::string kOrigin1 =
[email protected]2a9644c2013-06-19 06:19:34219 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
[email protected]5e301592013-06-18 06:36:05220 const std::string kOrigin2 =
[email protected]2a9644c2013-06-19 06:19:34221 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
[email protected]82758352013-03-29 19:21:31222 const base::string16 kDB1 = ASCIIToUTF16("db1");
223 const base::string16 kDB2 = ASCIIToUTF16("db2");
224 const base::string16 kDB3 = ASCIIToUTF16("db3");
225 const base::string16 kDescription = ASCIIToUTF16("database_description");
[email protected]fe615f32010-06-13 09:08:41226
227 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26228 &database_size);
[email protected]fe615f32010-06-13 09:08:41229 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26230 &database_size);
[email protected]fe615f32010-06-13 09:08:41231 tracker->DatabaseOpened(kOrigin2, kDB3, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26232 &database_size);
[email protected]fe615f32010-06-13 09:08:41233
[email protected]426d1c92013-12-03 20:08:54234 EXPECT_TRUE(base::CreateDirectory(
[email protected]e434fe72013-08-25 16:18:40235 tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
236 tracker->GetOriginDirectory(kOrigin1)))));
[email protected]426d1c92013-12-03 20:08:54237 EXPECT_TRUE(base::CreateDirectory(
[email protected]e434fe72013-08-25 16:18:40238 tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
239 tracker->GetOriginDirectory(kOrigin2)))));
[email protected]fe615f32010-06-13 09:08:41240 EXPECT_EQ(1, file_util::WriteFile(
241 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1));
242 EXPECT_EQ(2, file_util::WriteFile(
243 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2));
244 EXPECT_EQ(3, file_util::WriteFile(
245 tracker->GetFullDBFilePath(kOrigin2, kDB3), "aaa", 3));
246 tracker->DatabaseModified(kOrigin1, kDB1);
247 tracker->DatabaseModified(kOrigin2, kDB2);
248 tracker->DatabaseModified(kOrigin2, kDB3);
249
250 // Delete db1. Should also delete origin1.
251 TestObserver observer;
252 tracker->AddObserver(&observer);
[email protected]00bbe1662011-12-22 02:25:21253 net::TestCompletionCallback callback;
254 int result = tracker->DeleteDatabase(kOrigin1, kDB1, callback.callback());
[email protected]fe615f32010-06-13 09:08:41255 EXPECT_EQ(net::ERR_IO_PENDING, result);
256 ASSERT_FALSE(callback.have_result());
257 EXPECT_TRUE(observer.DidReceiveNewNotification());
258 EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier());
259 EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName());
260 tracker->DatabaseClosed(kOrigin1, kDB1);
261 result = callback.GetResult(result);
262 EXPECT_EQ(net::OK, result);
[email protected]7567484142013-07-11 17:36:07263 EXPECT_FALSE(base::PathExists(
[email protected]5e301592013-06-18 06:36:05264 tracker->DatabaseDirectory().AppendASCII(kOrigin1)));
[email protected]fe615f32010-06-13 09:08:41265
266 // Recreate db1.
267 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26268 &database_size);
[email protected]426d1c92013-12-03 20:08:54269 EXPECT_TRUE(base::CreateDirectory(
[email protected]e434fe72013-08-25 16:18:40270 tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
271 tracker->GetOriginDirectory(kOrigin1)))));
[email protected]fe615f32010-06-13 09:08:41272 EXPECT_EQ(1, file_util::WriteFile(
273 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1));
274 tracker->DatabaseModified(kOrigin1, kDB1);
275
276 // Setup file modification times. db1 and db2 are modified now, db3 three
277 // days ago.
[email protected]c0d508162013-12-04 22:49:00278 base::Time now = base::Time::Now();
279 EXPECT_TRUE(base::TouchFile(tracker->GetFullDBFilePath(kOrigin1, kDB1),
280 now, now));
281 EXPECT_TRUE(base::TouchFile(tracker->GetFullDBFilePath(kOrigin2, kDB2),
282 now, now));
283 base::Time three_days_ago = now - base::TimeDelta::FromDays(3);
284 EXPECT_TRUE(base::TouchFile(tracker->GetFullDBFilePath(kOrigin2, kDB3),
285 three_days_ago, three_days_ago));
[email protected]fe615f32010-06-13 09:08:41286
[email protected]654512b2010-09-01 02:09:42287 // Delete databases modified since yesterday. db2 is whitelisted.
[email protected]fe615f32010-06-13 09:08:41288 base::Time yesterday = base::Time::Now();
289 yesterday -= base::TimeDelta::FromDays(1);
[email protected]654512b2010-09-01 02:09:42290 result = tracker->DeleteDataModifiedSince(
[email protected]00bbe1662011-12-22 02:25:21291 yesterday, callback.callback());
[email protected]fe615f32010-06-13 09:08:41292 EXPECT_EQ(net::ERR_IO_PENDING, result);
293 ASSERT_FALSE(callback.have_result());
294 EXPECT_TRUE(observer.DidReceiveNewNotification());
295 tracker->DatabaseClosed(kOrigin1, kDB1);
296 tracker->DatabaseClosed(kOrigin2, kDB2);
297 result = callback.GetResult(result);
298 EXPECT_EQ(net::OK, result);
[email protected]7567484142013-07-11 17:36:07299 EXPECT_FALSE(base::PathExists(
[email protected]5e301592013-06-18 06:36:05300 tracker->DatabaseDirectory().AppendASCII(kOrigin1)));
[email protected]654512b2010-09-01 02:09:42301 EXPECT_TRUE(
[email protected]7567484142013-07-11 17:36:07302 base::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2)));
[email protected]fe615f32010-06-13 09:08:41303 EXPECT_TRUE(
[email protected]7567484142013-07-11 17:36:07304 base::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB3)));
[email protected]fe615f32010-06-13 09:08:41305
306 tracker->DatabaseClosed(kOrigin2, kDB3);
307 tracker->RemoveObserver(&observer);
308 }
309
310 static void TestDatabaseTracker(bool incognito_mode) {
311 // Initialize the tracker database.
[email protected]ea1a3f62012-11-16 20:34:23312 base::ScopedTempDir temp_dir;
[email protected]8e43e072010-07-28 21:30:34313 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
[email protected]d0240442011-08-17 09:23:00314 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
315 new quota::MockSpecialStoragePolicy;
316 special_storage_policy->AddProtected(GURL(kOrigin2Url));
[email protected]fe615f32010-06-13 09:08:41317 scoped_refptr<DatabaseTracker> tracker(
[email protected]ff875be52013-06-02 23:47:38318 new DatabaseTracker(temp_dir.path(),
319 incognito_mode,
320 special_storage_policy.get(),
321 NULL,
322 NULL));
[email protected]fe615f32010-06-13 09:08:41323
324 // Add two observers.
325 TestObserver observer1;
326 TestObserver observer2;
327 tracker->AddObserver(&observer1);
328 tracker->AddObserver(&observer2);
329
330 // Open three new databases.
331 int64 database_size = 0;
[email protected]5e301592013-06-18 06:36:05332 const std::string kOrigin1 =
[email protected]2a9644c2013-06-19 06:19:34333 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
[email protected]5e301592013-06-18 06:36:05334 const std::string kOrigin2 =
[email protected]2a9644c2013-06-19 06:19:34335 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
[email protected]82758352013-03-29 19:21:31336 const base::string16 kDB1 = ASCIIToUTF16("db1");
337 const base::string16 kDB2 = ASCIIToUTF16("db2");
338 const base::string16 kDB3 = ASCIIToUTF16("db3");
339 const base::string16 kDescription = ASCIIToUTF16("database_description");
[email protected]fe615f32010-06-13 09:08:41340
[email protected]7c5f2ec2011-05-26 19:15:26341 // Get the info for kOrigin1 and kOrigin2
[email protected]fe615f32010-06-13 09:08:41342 DatabaseTracker::CachedOriginInfo* origin1_info =
343 tracker->GetCachedOriginInfo(kOrigin1);
344 DatabaseTracker::CachedOriginInfo* origin2_info =
345 tracker->GetCachedOriginInfo(kOrigin1);
346 EXPECT_TRUE(origin1_info);
347 EXPECT_TRUE(origin2_info);
[email protected]fe615f32010-06-13 09:08:41348
[email protected]fe615f32010-06-13 09:08:41349
350 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26351 &database_size);
[email protected]fe615f32010-06-13 09:08:41352 EXPECT_EQ(0, database_size);
[email protected]fe615f32010-06-13 09:08:41353 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26354 &database_size);
[email protected]fe615f32010-06-13 09:08:41355 EXPECT_EQ(0, database_size);
[email protected]fe615f32010-06-13 09:08:41356 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26357 &database_size);
[email protected]fe615f32010-06-13 09:08:41358 EXPECT_EQ(0, database_size);
[email protected]fe615f32010-06-13 09:08:41359
360 // Write some data to each file and check that the listeners are
361 // called with the appropriate values.
[email protected]426d1c92013-12-03 20:08:54362 EXPECT_TRUE(base::CreateDirectory(
[email protected]e434fe72013-08-25 16:18:40363 tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
364 tracker->GetOriginDirectory(kOrigin1)))));
[email protected]426d1c92013-12-03 20:08:54365 EXPECT_TRUE(base::CreateDirectory(
[email protected]e434fe72013-08-25 16:18:40366 tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
367 tracker->GetOriginDirectory(kOrigin2)))));
[email protected]fe615f32010-06-13 09:08:41368 EXPECT_EQ(1, file_util::WriteFile(
369 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1));
370 EXPECT_EQ(2, file_util::WriteFile(
371 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2));
372 EXPECT_EQ(4, file_util::WriteFile(
373 tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4));
374 tracker->DatabaseModified(kOrigin1, kDB1);
[email protected]7c5f2ec2011-05-26 19:15:26375 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1);
376 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1);
[email protected]fe615f32010-06-13 09:08:41377 tracker->DatabaseModified(kOrigin2, kDB2);
[email protected]7c5f2ec2011-05-26 19:15:26378 CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2);
379 CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2);
[email protected]fe615f32010-06-13 09:08:41380 tracker->DatabaseModified(kOrigin1, kDB3);
[email protected]7c5f2ec2011-05-26 19:15:26381 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4);
382 CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4);
[email protected]fe615f32010-06-13 09:08:41383
384 // Close all databases
385 tracker->DatabaseClosed(kOrigin1, kDB1);
386 tracker->DatabaseClosed(kOrigin2, kDB2);
387 tracker->DatabaseClosed(kOrigin1, kDB3);
388
389 // Open an existing database and check the reported size
390 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26391 &database_size);
[email protected]fe615f32010-06-13 09:08:41392 EXPECT_EQ(1, database_size);
[email protected]fe615f32010-06-13 09:08:41393 tracker->DatabaseClosed(kOrigin1, kDB1);
394
395 // Remove an observer; this should clear all caches.
396 tracker->RemoveObserver(&observer2);
397
[email protected]fe615f32010-06-13 09:08:41398 // Close the tracker database and clear all caches.
399 // Then make sure that DatabaseOpened() still returns the correct result.
400 tracker->CloseTrackerDatabaseAndClearCaches();
401 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26402 &database_size);
403 EXPECT_EQ(1, database_size);
[email protected]fe615f32010-06-13 09:08:41404 tracker->DatabaseClosed(kOrigin1, kDB1);
405
406 // Remove all observers.
407 tracker->RemoveObserver(&observer1);
408
409 // Trying to delete a database in use should fail
410 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26411 &database_size);
[email protected]fe615f32010-06-13 09:08:41412 EXPECT_FALSE(tracker->DeleteClosedDatabase(kOrigin1, kDB3));
413 origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
414 EXPECT_TRUE(origin1_info);
[email protected]7c5f2ec2011-05-26 19:15:26415 EXPECT_EQ(4, origin1_info->GetDatabaseSize(kDB3));
[email protected]fe615f32010-06-13 09:08:41416 tracker->DatabaseClosed(kOrigin1, kDB3);
417
418 // Delete a database and make sure the space used by that origin is updated
419 EXPECT_TRUE(tracker->DeleteClosedDatabase(kOrigin1, kDB3));
420 origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
421 EXPECT_TRUE(origin1_info);
[email protected]7c5f2ec2011-05-26 19:15:26422 EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1));
[email protected]fe615f32010-06-13 09:08:41423 EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3));
424
425 // Get all data for all origins
426 std::vector<OriginInfo> origins_info;
427 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
428 EXPECT_EQ(size_t(2), origins_info.size());
[email protected]5e301592013-06-18 06:36:05429 EXPECT_EQ(kOrigin1, origins_info[0].GetOriginIdentifier());
[email protected]7c5f2ec2011-05-26 19:15:26430 EXPECT_EQ(1, origins_info[0].TotalSize());
431 EXPECT_EQ(1, origins_info[0].GetDatabaseSize(kDB1));
[email protected]fe615f32010-06-13 09:08:41432 EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3));
433
[email protected]5e301592013-06-18 06:36:05434 EXPECT_EQ(kOrigin2, origins_info[1].GetOriginIdentifier());
[email protected]fe615f32010-06-13 09:08:41435 EXPECT_EQ(2, origins_info[1].TotalSize());
[email protected]fe615f32010-06-13 09:08:41436
437 // Trying to delete an origin with databases in use should fail
438 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26439 &database_size);
[email protected]800ad562011-07-08 08:00:50440 EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1, false));
[email protected]fe615f32010-06-13 09:08:41441 origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
442 EXPECT_TRUE(origin1_info);
[email protected]7c5f2ec2011-05-26 19:15:26443 EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1));
[email protected]fe615f32010-06-13 09:08:41444 tracker->DatabaseClosed(kOrigin1, kDB1);
445
446 // Delete an origin that doesn't have any database in use
[email protected]800ad562011-07-08 08:00:50447 EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1, false));
[email protected]fe615f32010-06-13 09:08:41448 origins_info.clear();
449 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
450 EXPECT_EQ(size_t(1), origins_info.size());
[email protected]5e301592013-06-18 06:36:05451 EXPECT_EQ(kOrigin2, origins_info[0].GetOriginIdentifier());
[email protected]fe615f32010-06-13 09:08:41452
453 origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
454 EXPECT_TRUE(origin1_info);
[email protected]fe615f32010-06-13 09:08:41455 EXPECT_EQ(0, origin1_info->TotalSize());
[email protected]fe615f32010-06-13 09:08:41456 }
[email protected]eea70ad2011-05-15 00:24:13457
458 static void DatabaseTrackerQuotaIntegration() {
459 const GURL kOrigin(kOrigin1Url);
[email protected]5e301592013-06-18 06:36:05460 const std::string kOriginId =
[email protected]2a9644c2013-06-19 06:19:34461 webkit_database::GetIdentifierFromOrigin(kOrigin);
[email protected]82758352013-03-29 19:21:31462 const base::string16 kName = ASCIIToUTF16("name");
463 const base::string16 kDescription = ASCIIToUTF16("description");
[email protected]eea70ad2011-05-15 00:24:13464
[email protected]ea1a3f62012-11-16 20:34:23465 base::ScopedTempDir temp_dir;
[email protected]eea70ad2011-05-15 00:24:13466 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
467
468 // Initialize the tracker with a QuotaManagerProxy
469 scoped_refptr<TestQuotaManagerProxy> test_quota_proxy(
470 new TestQuotaManagerProxy);
471 scoped_refptr<DatabaseTracker> tracker(
[email protected]ff875be52013-06-02 23:47:38472 new DatabaseTracker(temp_dir.path(),
473 false /* incognito */,
474 NULL,
475 test_quota_proxy.get(),
476 NULL));
[email protected]eea70ad2011-05-15 00:24:13477 EXPECT_TRUE(test_quota_proxy->registered_client_);
478
479 // Create a database and modify it a couple of times, close it,
480 // then delete it. Observe the tracker notifies accordingly.
481
482 int64 database_size = 0;
[email protected]eea70ad2011-05-15 00:24:13483 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26484 &database_size);
[email protected]eea70ad2011-05-15 00:24:13485 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
486 test_quota_proxy->reset();
487
[email protected]a3ef4832013-02-02 05:12:33488 base::FilePath db_file(tracker->GetFullDBFilePath(kOriginId, kName));
[email protected]426d1c92013-12-03 20:08:54489 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]eea70ad2011-05-15 00:24:13490 EXPECT_TRUE(EnsureFileOfSize(db_file, 10));
491 tracker->DatabaseModified(kOriginId, kName);
492 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 10));
493 test_quota_proxy->reset();
494
495 EXPECT_TRUE(EnsureFileOfSize(db_file, 100));
496 tracker->DatabaseModified(kOriginId, kName);
497 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 90));
498 test_quota_proxy->reset();
499
500 tracker->DatabaseClosed(kOriginId, kName);
[email protected]7c5f2ec2011-05-26 19:15:26501 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
[email protected]00bbe1662011-12-22 02:25:21502 EXPECT_EQ(net::OK, tracker->DeleteDatabase(
503 kOriginId, kName, net::CompletionCallback()));
[email protected]eea70ad2011-05-15 00:24:13504 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
[email protected]7c5f2ec2011-05-26 19:15:26505 test_quota_proxy->reset();
[email protected]eea70ad2011-05-15 00:24:13506
507 // Create a database and modify it, try to delete it while open,
508 // then close it (at which time deletion will actually occur).
509 // Observe the tracker notifies accordingly.
510
511 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26512 &database_size);
[email protected]eea70ad2011-05-15 00:24:13513 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
514 test_quota_proxy->reset();
515
516 db_file = tracker->GetFullDBFilePath(kOriginId, kName);
[email protected]426d1c92013-12-03 20:08:54517 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]eea70ad2011-05-15 00:24:13518 EXPECT_TRUE(EnsureFileOfSize(db_file, 100));
519 tracker->DatabaseModified(kOriginId, kName);
520 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
521 test_quota_proxy->reset();
522
523 EXPECT_EQ(net::ERR_IO_PENDING,
[email protected]00bbe1662011-12-22 02:25:21524 tracker->DeleteDatabase(kOriginId, kName,
525 net::CompletionCallback()));
[email protected]eea70ad2011-05-15 00:24:13526 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
527
528 tracker->DatabaseClosed(kOriginId, kName);
[email protected]7c5f2ec2011-05-26 19:15:26529 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
[email protected]eea70ad2011-05-15 00:24:13530 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
[email protected]7c5f2ec2011-05-26 19:15:26531 test_quota_proxy->reset();
[email protected]eea70ad2011-05-15 00:24:13532
533 // Create a database and up the file size without telling
534 // the tracker about the modification, than simulate a
535 // a renderer crash.
536 // Observe the tracker notifies accordingly.
537
538 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
[email protected]7c5f2ec2011-05-26 19:15:26539 &database_size);
[email protected]eea70ad2011-05-15 00:24:13540 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
541 test_quota_proxy->reset();
542 db_file = tracker->GetFullDBFilePath(kOriginId, kName);
[email protected]426d1c92013-12-03 20:08:54543 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]eea70ad2011-05-15 00:24:13544 EXPECT_TRUE(EnsureFileOfSize(db_file, 100));
545 DatabaseConnections crashed_renderer_connections;
546 crashed_renderer_connections.AddConnection(kOriginId, kName);
547 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
548 tracker->CloseDatabases(crashed_renderer_connections);
549 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
550
551 // Cleanup.
552 crashed_renderer_connections.RemoveAllConnections();
553 test_quota_proxy->SimulateQuotaManagerDestroyed();
554 }
[email protected]800ad562011-07-08 08:00:50555
[email protected]f5d75f72011-09-08 11:31:40556 static void DatabaseTrackerClearSessionOnlyDatabasesOnExit() {
557 int64 database_size = 0;
[email protected]5e301592013-06-18 06:36:05558 const std::string kOrigin1 =
[email protected]2a9644c2013-06-19 06:19:34559 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
[email protected]5e301592013-06-18 06:36:05560 const std::string kOrigin2 =
[email protected]2a9644c2013-06-19 06:19:34561 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
[email protected]82758352013-03-29 19:21:31562 const base::string16 kDB1 = ASCIIToUTF16("db1");
563 const base::string16 kDB2 = ASCIIToUTF16("db2");
564 const base::string16 kDescription = ASCIIToUTF16("database_description");
[email protected]f5d75f72011-09-08 11:31:40565
566 // Initialize the tracker database.
[email protected]4cc586b2013-05-07 12:43:32567 base::MessageLoop message_loop;
[email protected]ea1a3f62012-11-16 20:34:23568 base::ScopedTempDir temp_dir;
[email protected]f5d75f72011-09-08 11:31:40569 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
[email protected]a3ef4832013-02-02 05:12:33570 base::FilePath origin1_db_dir;
571 base::FilePath origin2_db_dir;
[email protected]f5d75f72011-09-08 11:31:40572 {
573 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
574 new quota::MockSpecialStoragePolicy;
575 special_storage_policy->AddSessionOnly(GURL(kOrigin2Url));
576 scoped_refptr<DatabaseTracker> tracker(
[email protected]ff875be52013-06-02 23:47:38577 new DatabaseTracker(temp_dir.path(),
578 false,
579 special_storage_policy.get(),
580 NULL,
[email protected]cadac622013-06-11 16:46:36581 base::MessageLoopProxy::current().get()));
[email protected]f5d75f72011-09-08 11:31:40582
583 // Open two new databases.
584 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
585 &database_size);
586 EXPECT_EQ(0, database_size);
587 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
588 &database_size);
589 EXPECT_EQ(0, database_size);
590
591 // Write some data to each file.
[email protected]a3ef4832013-02-02 05:12:33592 base::FilePath db_file;
[email protected]f5d75f72011-09-08 11:31:40593 db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1);
[email protected]426d1c92013-12-03 20:08:54594 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]f5d75f72011-09-08 11:31:40595 EXPECT_TRUE(EnsureFileOfSize(db_file, 1));
596
597 db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2);
[email protected]426d1c92013-12-03 20:08:54598 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]f5d75f72011-09-08 11:31:40599 EXPECT_TRUE(EnsureFileOfSize(db_file, 2));
600
601 // Store the origin database directories as long as they still exist.
602 origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB1).DirName();
603 origin2_db_dir = tracker->GetFullDBFilePath(kOrigin2, kDB2).DirName();
604
605 tracker->DatabaseModified(kOrigin1, kDB1);
606 tracker->DatabaseModified(kOrigin2, kDB2);
607
608 // Close all databases.
609 tracker->DatabaseClosed(kOrigin1, kDB1);
610 tracker->DatabaseClosed(kOrigin2, kDB2);
611
612 tracker->Shutdown();
613 }
614
615 // At this point, the database tracker should be gone. Create a new one.
616 scoped_refptr<DatabaseTracker> tracker(
[email protected]142dd752012-02-27 22:27:41617 new DatabaseTracker(temp_dir.path(), false, NULL, NULL, NULL));
[email protected]f5d75f72011-09-08 11:31:40618
619 // Get all data for all origins.
620 std::vector<OriginInfo> origins_info;
621 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
622 // kOrigin1 was not session-only, so it survived. kOrigin2 was session-only
623 // and it got deleted.
624 EXPECT_EQ(size_t(1), origins_info.size());
[email protected]5e301592013-06-18 06:36:05625 EXPECT_EQ(kOrigin1, origins_info[0].GetOriginIdentifier());
[email protected]f5d75f72011-09-08 11:31:40626 EXPECT_TRUE(
[email protected]7567484142013-07-11 17:36:07627 base::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB1)));
[email protected]a3ef4832013-02-02 05:12:33628 EXPECT_EQ(base::FilePath(), tracker->GetFullDBFilePath(kOrigin2, kDB2));
[email protected]f5d75f72011-09-08 11:31:40629
630 // The origin directory of kOrigin1 remains, but the origin directory of
631 // kOrigin2 is deleted.
[email protected]7567484142013-07-11 17:36:07632 EXPECT_TRUE(base::PathExists(origin1_db_dir));
633 EXPECT_FALSE(base::PathExists(origin2_db_dir));
[email protected]f5d75f72011-09-08 11:31:40634 }
635
[email protected]bf510ed2012-06-05 08:31:43636 static void DatabaseTrackerSetForceKeepSessionState() {
[email protected]e9005772011-12-08 10:44:03637 int64 database_size = 0;
[email protected]5e301592013-06-18 06:36:05638 const std::string kOrigin1 =
[email protected]2a9644c2013-06-19 06:19:34639 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
[email protected]5e301592013-06-18 06:36:05640 const std::string kOrigin2 =
[email protected]2a9644c2013-06-19 06:19:34641 webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
[email protected]82758352013-03-29 19:21:31642 const base::string16 kDB1 = ASCIIToUTF16("db1");
643 const base::string16 kDB2 = ASCIIToUTF16("db2");
644 const base::string16 kDescription = ASCIIToUTF16("database_description");
[email protected]e9005772011-12-08 10:44:03645
646 // Initialize the tracker database.
[email protected]4cc586b2013-05-07 12:43:32647 base::MessageLoop message_loop;
[email protected]ea1a3f62012-11-16 20:34:23648 base::ScopedTempDir temp_dir;
[email protected]e9005772011-12-08 10:44:03649 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
[email protected]a3ef4832013-02-02 05:12:33650 base::FilePath origin1_db_dir;
651 base::FilePath origin2_db_dir;
[email protected]e9005772011-12-08 10:44:03652 {
653 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
654 new quota::MockSpecialStoragePolicy;
655 special_storage_policy->AddSessionOnly(GURL(kOrigin2Url));
656 scoped_refptr<DatabaseTracker> tracker(
[email protected]ff875be52013-06-02 23:47:38657 new DatabaseTracker(temp_dir.path(),
658 false,
659 special_storage_policy.get(),
660 NULL,
[email protected]cadac622013-06-11 16:46:36661 base::MessageLoopProxy::current().get()));
[email protected]bf510ed2012-06-05 08:31:43662 tracker->SetForceKeepSessionState();
[email protected]e9005772011-12-08 10:44:03663
664 // Open two new databases.
665 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
666 &database_size);
667 EXPECT_EQ(0, database_size);
668 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
669 &database_size);
670 EXPECT_EQ(0, database_size);
671
672 // Write some data to each file.
[email protected]a3ef4832013-02-02 05:12:33673 base::FilePath db_file;
[email protected]e9005772011-12-08 10:44:03674 db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1);
[email protected]426d1c92013-12-03 20:08:54675 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]e9005772011-12-08 10:44:03676 EXPECT_TRUE(EnsureFileOfSize(db_file, 1));
677
678 db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2);
[email protected]426d1c92013-12-03 20:08:54679 EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
[email protected]e9005772011-12-08 10:44:03680 EXPECT_TRUE(EnsureFileOfSize(db_file, 2));
681
682 // Store the origin database directories as long as they still exist.
683 origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB1).DirName();
684 origin2_db_dir = tracker->GetFullDBFilePath(kOrigin2, kDB2).DirName();
685
686 tracker->DatabaseModified(kOrigin1, kDB1);
687 tracker->DatabaseModified(kOrigin2, kDB2);
688
689 // Close all databases.
690 tracker->DatabaseClosed(kOrigin1, kDB1);
691 tracker->DatabaseClosed(kOrigin2, kDB2);
692
693 tracker->Shutdown();
694 }
695
696 // At this point, the database tracker should be gone. Create a new one.
697 scoped_refptr<DatabaseTracker> tracker(
[email protected]142dd752012-02-27 22:27:41698 new DatabaseTracker(temp_dir.path(), false, NULL, NULL, NULL));
[email protected]e9005772011-12-08 10:44:03699
700 // Get all data for all origins.
701 std::vector<OriginInfo> origins_info;
702 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
703 // No origins were deleted.
704 EXPECT_EQ(size_t(2), origins_info.size());
705 EXPECT_TRUE(
[email protected]7567484142013-07-11 17:36:07706 base::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB1)));
[email protected]e9005772011-12-08 10:44:03707 EXPECT_TRUE(
[email protected]7567484142013-07-11 17:36:07708 base::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2)));
[email protected]e9005772011-12-08 10:44:03709
[email protected]7567484142013-07-11 17:36:07710 EXPECT_TRUE(base::PathExists(origin1_db_dir));
711 EXPECT_TRUE(base::PathExists(origin2_db_dir));
[email protected]e9005772011-12-08 10:44:03712 }
713
[email protected]e5a3cdc2011-08-26 19:49:53714 static void EmptyDatabaseNameIsValid() {
715 const GURL kOrigin(kOrigin1Url);
[email protected]5e301592013-06-18 06:36:05716 const std::string kOriginId =
[email protected]2a9644c2013-06-19 06:19:34717 webkit_database::GetIdentifierFromOrigin(kOrigin);
[email protected]82758352013-03-29 19:21:31718 const base::string16 kEmptyName;
719 const base::string16 kDescription(ASCIIToUTF16("description"));
720 const base::string16 kChangedDescription(
721 ASCIIToUTF16("changed_description"));
[email protected]e5a3cdc2011-08-26 19:49:53722
723 // Initialize a tracker database, no need to put it on disk.
724 const bool kUseInMemoryTrackerDatabase = true;
[email protected]ea1a3f62012-11-16 20:34:23725 base::ScopedTempDir temp_dir;
[email protected]e5a3cdc2011-08-26 19:49:53726 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
727 scoped_refptr<DatabaseTracker> tracker(
728 new DatabaseTracker(temp_dir.path(), kUseInMemoryTrackerDatabase,
[email protected]142dd752012-02-27 22:27:41729 NULL, NULL, NULL));
[email protected]e5a3cdc2011-08-26 19:49:53730
731 // Starts off with no databases.
732 std::vector<OriginInfo> infos;
733 EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
734 EXPECT_TRUE(infos.empty());
735
736 // Create a db with an empty name.
737 int64 database_size = -1;
738 tracker->DatabaseOpened(kOriginId, kEmptyName, kDescription, 0,
739 &database_size);
740 EXPECT_EQ(0, database_size);
741 tracker->DatabaseModified(kOriginId, kEmptyName);
742 EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
743 EXPECT_EQ(1u, infos.size());
744 EXPECT_EQ(kDescription, infos[0].GetDatabaseDescription(kEmptyName));
745 EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kEmptyName).empty());
746 tracker->DatabaseOpened(kOriginId, kEmptyName, kChangedDescription, 0,
747 &database_size);
748 infos.clear();
749 EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
750 EXPECT_EQ(1u, infos.size());
751 EXPECT_EQ(kChangedDescription, infos[0].GetDatabaseDescription(kEmptyName));
752 tracker->DatabaseClosed(kOriginId, kEmptyName);
753 tracker->DatabaseClosed(kOriginId, kEmptyName);
754
755 // Deleting it should return to the initial state.
[email protected]00bbe1662011-12-22 02:25:21756 EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kEmptyName,
757 net::CompletionCallback()));
[email protected]e5a3cdc2011-08-26 19:49:53758 infos.clear();
759 EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
760 EXPECT_TRUE(infos.empty());
761 }
[email protected]1f1db252012-02-18 01:04:14762
763 static void HandleSqliteError() {
764 const GURL kOrigin(kOrigin1Url);
[email protected]5e301592013-06-18 06:36:05765 const std::string kOriginId =
[email protected]2a9644c2013-06-19 06:19:34766 webkit_database::GetIdentifierFromOrigin(kOrigin);
[email protected]82758352013-03-29 19:21:31767 const base::string16 kName(ASCIIToUTF16("name"));
768 const base::string16 kDescription(ASCIIToUTF16("description"));
[email protected]1f1db252012-02-18 01:04:14769
770 // Initialize a tracker database, no need to put it on disk.
771 const bool kUseInMemoryTrackerDatabase = true;
[email protected]ea1a3f62012-11-16 20:34:23772 base::ScopedTempDir temp_dir;
[email protected]1f1db252012-02-18 01:04:14773 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
774 scoped_refptr<DatabaseTracker> tracker(
775 new DatabaseTracker(temp_dir.path(), kUseInMemoryTrackerDatabase,
[email protected]142dd752012-02-27 22:27:41776 NULL, NULL, NULL));
[email protected]1f1db252012-02-18 01:04:14777
778 // Setup to observe OnScheduledForDelete notifications.
779 TestObserver observer(false, true);
780 tracker->AddObserver(&observer);
781
782 // Verify does no harm when there is no such database.
783 tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
784 EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
785 EXPECT_FALSE(observer.DidReceiveNewNotification());
786
787 // --------------------------------------------------------
788 // Create a record of a database in the tracker db and create
789 // a spoof_db_file on disk in the expected location.
790 int64 database_size = 0;
791 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
792 &database_size);
[email protected]a3ef4832013-02-02 05:12:33793 base::FilePath spoof_db_file = tracker->GetFullDBFilePath(kOriginId, kName);
[email protected]1f1db252012-02-18 01:04:14794 EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
[email protected]426d1c92013-12-03 20:08:54795 EXPECT_TRUE(base::CreateDirectory(spoof_db_file.DirName()));
[email protected]1f1db252012-02-18 01:04:14796 EXPECT_TRUE(EnsureFileOfSize(spoof_db_file, 1));
797
798 // Verify does no harm with a non-error is reported.
799 tracker->HandleSqliteError(kOriginId, kName, SQLITE_OK);
800 EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
801 EXPECT_FALSE(observer.DidReceiveNewNotification());
802
803 // Verify that with a connection open, the db is scheduled for deletion,
804 // but that the file still exists.
805 tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
806 EXPECT_TRUE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
807 EXPECT_TRUE(observer.DidReceiveNewNotification());
[email protected]7567484142013-07-11 17:36:07808 EXPECT_TRUE(base::PathExists(spoof_db_file));
[email protected]1f1db252012-02-18 01:04:14809
810 // Verify that once closed, the file is deleted and the record in the
811 // tracker db is removed.
812 tracker->DatabaseClosed(kOriginId, kName);
[email protected]7567484142013-07-11 17:36:07813 EXPECT_FALSE(base::PathExists(spoof_db_file));
[email protected]1f1db252012-02-18 01:04:14814 EXPECT_TRUE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
815
816 // --------------------------------------------------------
817 // Create another record of a database in the tracker db and create
818 // a spoof_db_file on disk in the expected location.
819 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
820 &database_size);
[email protected]a3ef4832013-02-02 05:12:33821 base::FilePath spoof_db_file2 = tracker->GetFullDBFilePath(kOriginId, kName);
[email protected]1f1db252012-02-18 01:04:14822 EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
823 EXPECT_NE(spoof_db_file, spoof_db_file2);
[email protected]426d1c92013-12-03 20:08:54824 EXPECT_TRUE(base::CreateDirectory(spoof_db_file2.DirName()));
[email protected]1f1db252012-02-18 01:04:14825 EXPECT_TRUE(EnsureFileOfSize(spoof_db_file2, 1));
826
827 // Verify that with no connection open, the db is deleted immediately.
828 tracker->DatabaseClosed(kOriginId, kName);
829 tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
830 EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
831 EXPECT_FALSE(observer.DidReceiveNewNotification());
832 EXPECT_TRUE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
[email protected]7567484142013-07-11 17:36:07833 EXPECT_FALSE(base::PathExists(spoof_db_file2));
[email protected]1f1db252012-02-18 01:04:14834
835 tracker->RemoveObserver(&observer);
836 }
[email protected]fe615f32010-06-13 09:08:41837};
838
[email protected]ec3d1452010-02-18 10:02:26839TEST(DatabaseTrackerTest, DeleteOpenDatabase) {
[email protected]fe615f32010-06-13 09:08:41840 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false);
841}
[email protected]ec3d1452010-02-18 10:02:26842
[email protected]fe615f32010-06-13 09:08:41843TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) {
844 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true);
[email protected]ec3d1452010-02-18 10:02:26845}
846
[email protected]49cd5da2010-04-02 00:29:51847TEST(DatabaseTrackerTest, DatabaseTracker) {
[email protected]fe615f32010-06-13 09:08:41848 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false);
[email protected]615dedfc2009-11-02 21:41:56849}
850
[email protected]fe615f32010-06-13 09:08:41851TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) {
852 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true);
[email protected]49cd5da2010-04-02 00:29:51853}
854
[email protected]eea70ad2011-05-15 00:24:13855TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) {
856 // There is no difference in behavior between incognito and not.
857 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration();
858}
859
[email protected]f5d75f72011-09-08 11:31:40860TEST(DatabaseTrackerTest, DatabaseTrackerClearSessionOnlyDatabasesOnExit) {
861 // Only works for regular mode.
862 DatabaseTracker_TestHelper_Test::
863 DatabaseTrackerClearSessionOnlyDatabasesOnExit();
864}
865
[email protected]bf510ed2012-06-05 08:31:43866TEST(DatabaseTrackerTest, DatabaseTrackerSetForceKeepSessionState) {
[email protected]e9005772011-12-08 10:44:03867 // Only works for regular mode.
[email protected]bf510ed2012-06-05 08:31:43868 DatabaseTracker_TestHelper_Test::DatabaseTrackerSetForceKeepSessionState();
[email protected]e9005772011-12-08 10:44:03869}
870
[email protected]e5a3cdc2011-08-26 19:49:53871TEST(DatabaseTrackerTest, EmptyDatabaseNameIsValid) {
872 DatabaseTracker_TestHelper_Test::EmptyDatabaseNameIsValid();
873}
874
[email protected]1f1db252012-02-18 01:04:14875TEST(DatabaseTrackerTest, HandleSqliteError) {
876 DatabaseTracker_TestHelper_Test::HandleSqliteError();
877}
878
[email protected]615dedfc2009-11-02 21:41:56879} // namespace webkit_database