1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/bind.h"
6#include "base/bind_helpers.h"
7#include "base/files/file_util.h"
8#include "base/strings/utf_string_conversions.h"
9#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
10#include "chrome/browser/browsing_data/browsing_data_helper_browsertest.h"
11#include "chrome/browser/profiles/profile.h"
12#include "chrome/browser/ui/browser.h"
13#include "chrome/test/base/in_process_browser_test.h"
14#include "chrome/test/base/ui_test_utils.h"
15#include "content/public/browser/storage_partition.h"
16#include "content/public/test/test_browser_thread.h"
17
18using content::BrowserContext;
19using content::BrowserThread;
20
21namespace {
22typedef BrowsingDataHelperCallback<BrowsingDataDatabaseHelper::DatabaseInfo>
23    TestCompletionCallback;
24
25const char kTestIdentifier1[] = "http_www.google.com_0";
26
27const char kTestIdentifierExtension[] =
28  "chrome-extension_behllobkkfkfnphdnhnkndlbkcpglgmj_0";
29
30class BrowsingDataDatabaseHelperTest : public InProcessBrowserTest {
31 public:
32  virtual void CreateDatabases() {
33    storage::DatabaseTracker* db_tracker =
34        BrowserContext::GetDefaultStoragePartition(browser()->profile())
35            ->GetDatabaseTracker();
36    base::string16 db_name = base::ASCIIToUTF16("db");
37    base::string16 description = base::ASCIIToUTF16("db_description");
38    int64 size;
39    db_tracker->DatabaseOpened(kTestIdentifier1, db_name, description,
40                               1, &size);
41    db_tracker->DatabaseClosed(kTestIdentifier1, db_name);
42    base::FilePath db_path1 =
43        db_tracker->GetFullDBFilePath(kTestIdentifier1, db_name);
44    base::CreateDirectory(db_path1.DirName());
45    ASSERT_EQ(0, base::WriteFile(db_path1, NULL, 0));
46    db_tracker->DatabaseOpened(kTestIdentifierExtension, db_name, description,
47                               1, &size);
48    db_tracker->DatabaseClosed(kTestIdentifierExtension, db_name);
49    base::FilePath db_path2 =
50        db_tracker->GetFullDBFilePath(kTestIdentifierExtension, db_name);
51    base::CreateDirectory(db_path2.DirName());
52    ASSERT_EQ(0, base::WriteFile(db_path2, NULL, 0));
53    std::vector<storage::OriginInfo> origins;
54    db_tracker->GetAllOriginsInfo(&origins);
55    ASSERT_EQ(2U, origins.size());
56  }
57};
58
59// Called back by BrowsingDataDatabaseHelper on the UI thread once the database
60// information has been retrieved.
61class StopTestOnCallback {
62 public:
63  explicit StopTestOnCallback(
64      BrowsingDataDatabaseHelper* database_helper)
65      : database_helper_(database_helper) {
66    DCHECK(database_helper_);
67  }
68
69  void Callback(const std::list<BrowsingDataDatabaseHelper::DatabaseInfo>&
70                database_info_list) {
71    DCHECK_CURRENTLY_ON(BrowserThread::UI);
72    ASSERT_EQ(1UL, database_info_list.size());
73    EXPECT_EQ(std::string(kTestIdentifier1),
74              database_info_list.begin()->identifier.ToString());
75    base::MessageLoop::current()->Quit();
76  }
77
78 private:
79  BrowsingDataDatabaseHelper* database_helper_;
80};
81
82// Flaky on Win/Mac/Linux: http://crbug.com/92460
83IN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, DISABLED_FetchData) {
84  CreateDatabases();
85  scoped_refptr<BrowsingDataDatabaseHelper> database_helper(
86      new BrowsingDataDatabaseHelper(browser()->profile()));
87  StopTestOnCallback stop_test_on_callback(database_helper.get());
88  database_helper->StartFetching(base::Bind(
89      &StopTestOnCallback::Callback, base::Unretained(&stop_test_on_callback)));
90  // Blocks until StopTestOnCallback::Callback is notified.
91  content::RunMessageLoop();
92}
93
94IN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, CannedAddDatabase) {
95  const GURL origin1("http://host1:1/");
96  const GURL origin2("http://host2:1/");
97  const char origin_str1[] = "http_host1_1";
98  const char origin_str2[] = "http_host2_1";
99  const char db1[] = "db1";
100  const char db2[] = "db2";
101  const char db3[] = "db3";
102
103  scoped_refptr<CannedBrowsingDataDatabaseHelper> helper(
104      new CannedBrowsingDataDatabaseHelper(browser()->profile()));
105  helper->AddDatabase(origin1, db1, std::string());
106  helper->AddDatabase(origin1, db2, std::string());
107  helper->AddDatabase(origin2, db3, std::string());
108
109  TestCompletionCallback callback;
110  helper->StartFetching(
111      base::Bind(&TestCompletionCallback::callback,
112                 base::Unretained(&callback)));
113
114  std::list<BrowsingDataDatabaseHelper::DatabaseInfo> result =
115      callback.result();
116
117  ASSERT_EQ(3u, result.size());
118  std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator info =
119      result.begin();
120  EXPECT_EQ(origin_str1, info->identifier.ToString());
121  EXPECT_STREQ(db1, info->database_name.c_str());
122  info++;
123  EXPECT_EQ(origin_str1, info->identifier.ToString());
124  EXPECT_STREQ(db2, info->database_name.c_str());
125  info++;
126  EXPECT_EQ(origin_str2, info->identifier.ToString());
127  EXPECT_STREQ(db3, info->database_name.c_str());
128}
129
130IN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, CannedUnique) {
131  const GURL origin("http://host1:1/");
132  const char origin_str[] = "http_host1_1";
133  const char db[] = "db1";
134
135  scoped_refptr<CannedBrowsingDataDatabaseHelper> helper(
136      new CannedBrowsingDataDatabaseHelper(browser()->profile()));
137  helper->AddDatabase(origin, db, std::string());
138  helper->AddDatabase(origin, db, std::string());
139
140  TestCompletionCallback callback;
141  helper->StartFetching(
142      base::Bind(&TestCompletionCallback::callback,
143                 base::Unretained(&callback)));
144
145  std::list<BrowsingDataDatabaseHelper::DatabaseInfo> result =
146      callback.result();
147
148  ASSERT_EQ(1u, result.size());
149  EXPECT_EQ(origin_str, result.begin()->identifier.ToString());
150  EXPECT_STREQ(db, result.begin()->database_name.c_str());
151}
152}  // namespace
153