15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/sqlite/sqlite3.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/database/database_tracker.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/mock_special_storage_policy.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/common/database/database_identifier.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOrigin1Url[] = "http://origin1";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOrigin2Url[] = "http://protected_origin2";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestObserver : public webkit_database::DatabaseTracker::Observer {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver()
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : new_notification_received_(false),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        observe_size_changes_(true),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        observe_scheduled_deletions_(true) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver(bool observe_size_changes, bool observe_scheduled_deletions)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : new_notification_received_(false),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        observe_size_changes_(observe_size_changes),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        observe_scheduled_deletions_(observe_scheduled_deletions) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestObserver() {}
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnDatabaseSizeChanged(const std::string& origin_identifier,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     const base::string16& database_name,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int64 database_size) OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!observe_size_changes_)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_notification_received_ = true;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_identifier_ = origin_identifier;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    database_name_ = database_name;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    database_size_ = database_size;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDatabaseScheduledForDeletion(
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& origin_identifier,
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::string16& database_name) OVERRIDE {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!observe_scheduled_deletions_)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_notification_received_ = true;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_identifier_ = origin_identifier;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    database_name_ = database_name;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DidReceiveNewNotification() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool temp_new_notification_received = new_notification_received_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_notification_received_ = false;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return temp_new_notification_received;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string GetNotificationOriginIdentifier() {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return origin_identifier_;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 GetNotificationDatabaseName() { return database_name_; }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 GetNotificationDatabaseSize() { return database_size_; }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_notification_received_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool observe_size_changes_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool observe_scheduled_deletions_;
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string origin_identifier_;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 database_name_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 database_size_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckNotificationReceived(TestObserver* observer,
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               const std::string& expected_origin_identifier,
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const base::string16& expected_database_name,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int64 expected_database_size) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer->DidReceiveNewNotification());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_origin_identifier,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer->GetNotificationOriginIdentifier());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_database_name,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer->GetNotificationDatabaseName());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_database_size,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer->GetNotificationDatabaseSize());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestQuotaManagerProxy : public quota::QuotaManagerProxy {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestQuotaManagerProxy()
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : QuotaManagerProxy(NULL, NULL),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        registered_client_(NULL) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterClient(quota::QuotaClient* client) OVERRIDE {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(registered_client_);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registered_client_ = client;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyStorageAccessed(quota::QuotaClient::ID client_id,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& origin,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     quota::StorageType type) OVERRIDE {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::QuotaClient::kDatabase, client_id);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::kStorageTypeTemporary, type);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    accesses_[origin] += 1;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyStorageModified(quota::QuotaClient::ID client_id,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& origin,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     quota::StorageType type,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int64 delta) OVERRIDE {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::QuotaClient::kDatabase, client_id);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::kStorageTypeTemporary, type);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modifications_[origin].first += 1;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modifications_[origin].second += delta;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not needed for our tests.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NotifyOriginInUse(const GURL& origin) OVERRIDE {}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NotifyOriginNoLongerInUse(const GURL& origin) OVERRIDE {}
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUsageCacheEnabled(quota::QuotaClient::ID client_id,
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    const GURL& origin,
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    quota::StorageType type,
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    bool enabled) OVERRIDE {}
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void GetUsageAndQuota(
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::SequencedTaskRunner* original_task_runner,
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GURL& origin,
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      quota::StorageType type,
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GetUsageAndQuotaCallback& callback) OVERRIDE {}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimulateQuotaManagerDestroyed() {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (registered_client_) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registered_client_->OnQuotaManagerDestroyed();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registered_client_ = NULL;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasAccessNotified(const GURL& origin) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return accesses_[origin] != 0;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasModificationNotified(const GURL& origin, int64 amount) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return modifications_[origin].first != 0 &&
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           modifications_[origin].second == amount;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    accesses_.clear();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modifications_.clear();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota::QuotaClient* registered_client_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map from origin to count of access notifications.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<GURL, int> accesses_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map from origin to <count, sum of deltas>
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<GURL, std::pair<int, int64> > modifications_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestQuotaManagerProxy() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(registered_client_);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool EnsureFileOfSize(const base::FilePath& file_path, int64 length) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFileError error_code(base::PLATFORM_FILE_ERROR_FAILED);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFile file =
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::CreatePlatformFile(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file_path,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &error_code);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error_code != base::PLATFORM_FILE_OK)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::TruncatePlatformFile(file, length))
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_code = base::PLATFORM_FILE_ERROR_FAILED;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ClosePlatformFile(file);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error_code == base::PLATFORM_FILE_OK;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace webkit_database {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We declare a helper class, and make it a friend of DatabaseTracker using
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the FRIEND_TEST() macro, and we implement all tests we want to run as
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static methods of this class. Then we make our TEST() targets call these
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static functions. This allows us to run each test in normal mode and
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito mode without writing the same code twice.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DatabaseTracker_TestHelper_Test {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TestDeleteOpenDatabase(bool incognito_mode) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize the tracker database.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new quota::MockSpecialStoragePolicy;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    special_storage_policy->AddProtected(GURL(kOrigin2Url));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(),
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            incognito_mode,
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            special_storage_policy.get(),
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            NULL,
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            NULL));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create and open three databases.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = 0;
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin1 =
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin2 =
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB1 = ASCIIToUTF16("db1");
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB2 = ASCIIToUTF16("db2");
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB3 = ASCIIToUTF16("db3");
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription = ASCIIToUTF16("database_description");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin2, kDB3, kDescription, 0,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            tracker->GetOriginDirectory(kOrigin1)))));
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            tracker->GetOriginDirectory(kOrigin2)))));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, file_util::WriteFile(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, file_util::WriteFile(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, file_util::WriteFile(
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin2, kDB3), "aaa", 3));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin1, kDB1);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin2, kDB2);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin2, kDB3);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete db1. Should also delete origin1.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestObserver observer;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->AddObserver(&observer);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TestCompletionCallback callback;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = tracker->DeleteDatabase(kOrigin1, kDB1, callback.callback());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::ERR_IO_PENDING, result);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(callback.have_result());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(observer.DidReceiveNewNotification());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB1);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = callback.GetResult(result);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::OK, result);
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          tracker->DatabaseDirectory().AppendASCII(kOrigin1)));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Recreate db1.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(
268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            tracker->GetOriginDirectory(kOrigin1)))));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, file_util::WriteFile(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin1, kDB1);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup file modification times.  db1 and db2 are modified now, db3 three
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // days ago.
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::Time now = base::Time::Now();
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::TouchFile(tracker->GetFullDBFilePath(kOrigin1, kDB1),
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                now, now));
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::TouchFile(tracker->GetFullDBFilePath(kOrigin2, kDB2),
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                now, now));
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::Time three_days_ago = now - base::TimeDelta::FromDays(3);
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::TouchFile(tracker->GetFullDBFilePath(kOrigin2, kDB3),
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                three_days_ago, three_days_ago));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete databases modified since yesterday. db2 is whitelisted.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time yesterday = base::Time::Now();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    yesterday -= base::TimeDelta::FromDays(1);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = tracker->DeleteDataModifiedSince(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        yesterday, callback.callback());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::ERR_IO_PENDING, result);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(callback.have_result());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(observer.DidReceiveNewNotification());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB1);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin2, kDB2);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = callback.GetResult(result);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::OK, result);
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        tracker->DatabaseDirectory().AppendASCII(kOrigin1)));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2)));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB3)));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin2, kDB3);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->RemoveObserver(&observer);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TestDatabaseTracker(bool incognito_mode) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize the tracker database.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new quota::MockSpecialStoragePolicy;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    special_storage_policy->AddProtected(GURL(kOrigin2Url));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(),
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            incognito_mode,
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            special_storage_policy.get(),
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            NULL,
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            NULL));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add two observers.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestObserver observer1;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestObserver observer2;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->AddObserver(&observer1);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->AddObserver(&observer2);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Open three new databases.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = 0;
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin1 =
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin2 =
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB1 = ASCIIToUTF16("db1");
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB2 = ASCIIToUTF16("db2");
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB3 = ASCIIToUTF16("db3");
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription = ASCIIToUTF16("database_description");
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the info for kOrigin1 and kOrigin2
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DatabaseTracker::CachedOriginInfo* origin1_info =
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetCachedOriginInfo(kOrigin1);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DatabaseTracker::CachedOriginInfo* origin2_info =
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetCachedOriginInfo(kOrigin1);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(origin1_info);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(origin2_info);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, database_size);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, database_size);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, database_size);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Write some data to each file and check that the listeners are
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // called with the appropriate values.
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(
361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            tracker->GetOriginDirectory(kOrigin1)))));
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(
364424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        tracker->DatabaseDirectory().Append(base::FilePath::FromUTF16Unsafe(
365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            tracker->GetOriginDirectory(kOrigin2)))));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, file_util::WriteFile(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, file_util::WriteFile(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, file_util::WriteFile(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin1, kDB1);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin2, kDB2);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOrigin1, kDB3);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Close all databases
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB1);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin2, kDB2);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB3);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Open an existing database and check the reported size
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, database_size);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB1);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Remove an observer; this should clear all caches.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->RemoveObserver(&observer2);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Close the tracker database and clear all caches.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Then make sure that DatabaseOpened() still returns the correct result.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->CloseTrackerDatabaseAndClearCaches();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, database_size);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB1);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Remove all observers.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->RemoveObserver(&observer1);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trying to delete a database in use should fail
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->DeleteClosedDatabase(kOrigin1, kDB3));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(origin1_info);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, origin1_info->GetDatabaseSize(kDB3));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB3);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete a database and make sure the space used by that origin is updated
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->DeleteClosedDatabase(kOrigin1, kDB3));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(origin1_info);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get all data for all origins
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<OriginInfo> origins_info;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(size_t(2), origins_info.size());
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kOrigin1, origins_info[0].GetOriginIdentifier());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, origins_info[0].TotalSize());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, origins_info[0].GetDatabaseSize(kDB1));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kOrigin2, origins_info[1].GetOriginIdentifier());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, origins_info[1].TotalSize());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trying to delete an origin with databases in use should fail
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1, false));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(origin1_info);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOrigin1, kDB1);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete an origin that doesn't have any database in use
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1, false));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins_info.clear();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(size_t(1), origins_info.size());
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kOrigin2, origins_info[0].GetOriginIdentifier());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(origin1_info);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, origin1_info->TotalSize());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DatabaseTrackerQuotaIntegration() {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL kOrigin(kOrigin1Url);
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOriginId =
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(kOrigin);
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kName = ASCIIToUTF16("name");
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription = ASCIIToUTF16("description");
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize the tracker with a QuotaManagerProxy
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<TestQuotaManagerProxy> test_quota_proxy(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestQuotaManagerProxy);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(),
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            false /* incognito */,
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            NULL,
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            test_quota_proxy.get(),
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            NULL));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->registered_client_);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a database and modify it a couple of times, close it,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // then delete it. Observe the tracker notifies accordingly.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = 0;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath db_file(tracker->GetFullDBFilePath(kOriginId, kName));
487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(EnsureFileOfSize(db_file, 10));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOriginId, kName);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 10));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(EnsureFileOfSize(db_file, 100));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOriginId, kName);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 90));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOriginId, kName);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::OK, tracker->DeleteDatabase(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kOriginId, kName, net::CompletionCallback()));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a database and modify it, try to delete it while open,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // then close it (at which time deletion will actually occur).
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Observe the tracker notifies accordingly.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_file = tracker->GetFullDBFilePath(kOriginId, kName);
515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(EnsureFileOfSize(db_file, 100));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOriginId, kName);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::ERR_IO_PENDING,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracker->DeleteDatabase(kOriginId, kName,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      net::CompletionCallback()));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOriginId, kName);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a database and up the file size without telling
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the tracker about the modification, than simulate a
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a renderer crash.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Observe the tracker notifies accordingly.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->reset();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_file = tracker->GetFullDBFilePath(kOriginId, kName);
541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(EnsureFileOfSize(db_file, 100));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DatabaseConnections crashed_renderer_connections;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crashed_renderer_connections.AddConnection(kOriginId, kName);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->CloseDatabases(crashed_renderer_connections);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crashed_renderer_connections.RemoveAllConnections();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_quota_proxy->SimulateQuotaManagerDestroyed();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DatabaseTrackerClearSessionOnlyDatabasesOnExit() {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = 0;
5567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin1 =
5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin2 =
5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB1 = ASCIIToUTF16("db1");
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB2 = ASCIIToUTF16("db2");
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription = ASCIIToUTF16("database_description");
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize the tracker database.
565b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop message_loop;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath origin1_db_dir;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath origin2_db_dir;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new quota::MockSpecialStoragePolicy;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      special_storage_policy->AddSessionOnly(GURL(kOrigin2Url));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<DatabaseTracker> tracker(
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          new DatabaseTracker(temp_dir.path(),
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              false,
577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              special_storage_policy.get(),
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              NULL,
5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              base::MessageLoopProxy::current().get()));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Open two new databases.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &database_size);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0, database_size);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &database_size);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0, database_size);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Write some data to each file.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath db_file;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1);
592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(EnsureFileOfSize(db_file, 1));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2);
596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(EnsureFileOfSize(db_file, 2));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Store the origin database directories as long as they still exist.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB1).DirName();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin2_db_dir = tracker->GetFullDBFilePath(kOrigin2, kDB2).DirName();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseModified(kOrigin1, kDB1);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseModified(kOrigin2, kDB2);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Close all databases.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseClosed(kOrigin1, kDB1);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseClosed(kOrigin2, kDB2);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->Shutdown();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At this point, the database tracker should be gone. Create a new one.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(), false, NULL, NULL, NULL));
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get all data for all origins.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<OriginInfo> origins_info;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // kOrigin1 was not session-only, so it survived. kOrigin2 was session-only
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and it got deleted.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(size_t(1), origins_info.size());
6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kOrigin1, origins_info[0].GetOriginIdentifier());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
6257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB1)));
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(base::FilePath(), tracker->GetFullDBFilePath(kOrigin2, kDB2));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The origin directory of kOrigin1 remains, but the origin directory of
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // kOrigin2 is deleted.
6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::PathExists(origin1_db_dir));
6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(origin2_db_dir));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DatabaseTrackerSetForceKeepSessionState() {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = 0;
6367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin1 =
6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin1Url));
6387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOrigin2 =
6397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(GURL(kOrigin2Url));
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB1 = ASCIIToUTF16("db1");
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDB2 = ASCIIToUTF16("db2");
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription = ASCIIToUTF16("database_description");
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize the tracker database.
645b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop message_loop;
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath origin1_db_dir;
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath origin2_db_dir;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new quota::MockSpecialStoragePolicy;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      special_storage_policy->AddSessionOnly(GURL(kOrigin2Url));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<DatabaseTracker> tracker(
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          new DatabaseTracker(temp_dir.path(),
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              false,
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              special_storage_policy.get(),
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              NULL,
6597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              base::MessageLoopProxy::current().get()));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->SetForceKeepSessionState();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Open two new databases.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &database_size);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0, database_size);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &database_size);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0, database_size);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Write some data to each file.
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath db_file;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1);
673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(EnsureFileOfSize(db_file, 1));
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2);
677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_TRUE(base::CreateDirectory(db_file.DirName()));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(EnsureFileOfSize(db_file, 2));
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Store the origin database directories as long as they still exist.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB1).DirName();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin2_db_dir = tracker->GetFullDBFilePath(kOrigin2, kDB2).DirName();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseModified(kOrigin1, kDB1);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseModified(kOrigin2, kDB2);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Close all databases.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseClosed(kOrigin1, kDB1);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->DatabaseClosed(kOrigin2, kDB2);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker->Shutdown();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At this point, the database tracker should be gone. Create a new one.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(), false, NULL, NULL, NULL));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get all data for all origins.
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<OriginInfo> origins_info;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No origins were deleted.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(size_t(2), origins_info.size());
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB1)));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2)));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::PathExists(origin1_db_dir));
7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::PathExists(origin2_db_dir));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void EmptyDatabaseNameIsValid() {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL kOrigin(kOrigin1Url);
7147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOriginId =
7157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(kOrigin);
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kEmptyName;
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription(ASCIIToUTF16("description"));
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kChangedDescription(
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASCIIToUTF16("changed_description"));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize a tracker database, no need to put it on disk.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool kUseInMemoryTrackerDatabase = true;
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(), kUseInMemoryTrackerDatabase,
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            NULL, NULL, NULL));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Starts off with no databases.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<OriginInfo> infos;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(infos.empty());
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a db with an empty name.
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = -1;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kEmptyName, kDescription, 0,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, database_size);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseModified(kOriginId, kEmptyName);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, infos.size());
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDescription, infos[0].GetDatabaseDescription(kEmptyName));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kEmptyName).empty());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kEmptyName, kChangedDescription, 0,
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infos.clear();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, infos.size());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kChangedDescription, infos[0].GetDatabaseDescription(kEmptyName));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOriginId, kEmptyName);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOriginId, kEmptyName);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Deleting it should return to the initial state.
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kEmptyName,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               net::CompletionCallback()));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infos.clear();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(infos.empty());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void HandleSqliteError() {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL kOrigin(kOrigin1Url);
7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string kOriginId =
7647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        webkit_database::GetIdentifierFromOrigin(kOrigin);
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kName(ASCIIToUTF16("name"));
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16 kDescription(ASCIIToUTF16("description"));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize a tracker database, no need to put it on disk.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool kUseInMemoryTrackerDatabase = true;
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DatabaseTracker> tracker(
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DatabaseTracker(temp_dir.path(), kUseInMemoryTrackerDatabase,
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            NULL, NULL, NULL));
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup to observe OnScheduledForDelete notifications.
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestObserver observer(false, true);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->AddObserver(&observer);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify does no harm when there is no such database.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(observer.DidReceiveNewNotification());
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // --------------------------------------------------------
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a record of a database in the tracker db and create
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a spoof_db_file on disk in the expected location.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 database_size = 0;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath spoof_db_file = tracker->GetFullDBFilePath(kOriginId, kName);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(spoof_db_file.DirName()));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(EnsureFileOfSize(spoof_db_file, 1));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify does no harm with a non-error is reported.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->HandleSqliteError(kOriginId, kName, SQLITE_OK);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(observer.DidReceiveNewNotification());
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that with a connection open, the db is scheduled for deletion,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // but that the file still exists.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(observer.DidReceiveNewNotification());
8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::PathExists(spoof_db_file));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that once closed, the file is deleted and the record in the
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // tracker db is removed.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOriginId, kName);
8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(spoof_db_file));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // --------------------------------------------------------
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create another record of a database in the tracker db and create
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a spoof_db_file on disk in the expected location.
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &database_size);
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath spoof_db_file2 = tracker->GetFullDBFilePath(kOriginId, kName);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(spoof_db_file, spoof_db_file2);
822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(spoof_db_file2.DirName()));
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(EnsureFileOfSize(spoof_db_file2, 1));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that with no connection open, the db is deleted immediately.
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->DatabaseClosed(kOriginId, kName);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(observer.DidReceiveNewNotification());
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
8317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(spoof_db_file2));
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracker->RemoveObserver(&observer);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DeleteOpenDatabase) {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) {
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DatabaseTracker) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is no difference in behavior between incognito and not.
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DatabaseTrackerClearSessionOnlyDatabasesOnExit) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only works for regular mode.
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DatabaseTrackerClearSessionOnlyDatabasesOnExit();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, DatabaseTrackerSetForceKeepSessionState) {
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only works for regular mode.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::DatabaseTrackerSetForceKeepSessionState();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, EmptyDatabaseNameIsValid) {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::EmptyDatabaseNameIsValid();
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DatabaseTrackerTest, HandleSqliteError) {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseTracker_TestHelper_Test::HandleSqliteError();
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace webkit_database
878