172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_database_helper.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/browsing_data_helper_browsertest.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentypedef BrowsingDataHelperCallback<BrowsingDataDatabaseHelper::DatabaseInfo>
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TestCompletionCallback;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char kTestIdentifier1[] = "http_www.google.com_0";
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char kTestIdentifierExtension[] =
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "chrome-extension_behllobkkfkfnphdnhnkndlbkcpglgmj_0";
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowsingDataDatabaseHelperTest : public InProcessBrowserTest {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CreateDatabases() {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    webkit_database::DatabaseTracker* db_tracker =
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        testing_profile_.GetDatabaseTracker();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 db_name = ASCIIToUTF16("db");
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 description = ASCIIToUTF16("db_description");
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int64 size;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int64 available;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 identifier1(UTF8ToUTF16(kTestIdentifier1));
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    db_tracker->DatabaseOpened(identifier1, db_name, description, 1, &size,
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               &available);
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    db_tracker->DatabaseClosed(identifier1, db_name);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath db_path1 = db_tracker->GetFullDBFilePath(identifier1, db_name);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::CreateDirectory(db_path1.DirName());
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(0, file_util::WriteFile(db_path1, NULL, 0));
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 identifierExtension(UTF8ToUTF16(kTestIdentifierExtension));
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    db_tracker->DatabaseOpened(identifierExtension, db_name, description, 1,
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               &size, &available);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    db_tracker->DatabaseClosed(identifierExtension, db_name);
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath db_path2 =
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        db_tracker->GetFullDBFilePath(identifierExtension, db_name);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::CreateDirectory(db_path2.DirName());
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(0, file_util::WriteFile(db_path2, NULL, 0));
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<webkit_database::OriginInfo> origins;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    db_tracker->GetAllOriginsInfo(&origins);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(2U, origins.size());
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile testing_profile_;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called back by BrowsingDataDatabaseHelper on the UI thread once the database
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// information has been retrieved.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StopTestOnCallback {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit StopTestOnCallback(
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      BrowsingDataDatabaseHelper* database_helper)
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : database_helper_(database_helper) {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(database_helper_);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Callback(const std::vector<BrowsingDataDatabaseHelper::DatabaseInfo>&
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                database_info_list) {
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(1UL, database_info_list.size());
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(std::string(kTestIdentifier1),
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              database_info_list.at(0).origin_identifier);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->Quit();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowsingDataDatabaseHelper* database_helper_;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, FetchData) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateDatabases();
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowsingDataDatabaseHelper> database_helper(
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new BrowsingDataDatabaseHelper(&testing_profile_));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StopTestOnCallback stop_test_on_callback(database_helper);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  database_helper->StartFetching(
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(&stop_test_on_callback, &StopTestOnCallback::Callback));
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Blocks until StopTestOnCallback::Callback is notified.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunMessageLoop();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, CannedAddDatabase) {
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const GURL origin1("http://host1:1/");
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const GURL origin2("http://host2:1/");
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char origin_str1[] = "http_host1_1";
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char origin_str2[] = "http_host2_1";
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char db1[] = "db1";
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char db2[] = "db2";
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char db3[] = "db3";
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<CannedBrowsingDataDatabaseHelper> helper(
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new CannedBrowsingDataDatabaseHelper(&testing_profile_));
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->AddDatabase(origin1, db1, "");
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->AddDatabase(origin1, db2, "");
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->AddDatabase(origin2, db3, "");
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestCompletionCallback callback;
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->StartFetching(
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NewCallback(&callback, &TestCompletionCallback::callback));
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<BrowsingDataDatabaseHelper::DatabaseInfo> result =
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      callback.result();
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(3u, result.size());
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(origin_str1, result[0].origin_identifier.c_str());
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(db1, result[0].database_name.c_str());
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(origin_str1, result[1].origin_identifier.c_str());
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(db2, result[1].database_name.c_str());
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(origin_str2, result[2].origin_identifier.c_str());
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(db3, result[2].database_name.c_str());
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, CannedUnique) {
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const GURL origin("http://host1:1/");
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char origin_str[] = "http_host1_1";
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char db[] = "db1";
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<CannedBrowsingDataDatabaseHelper> helper(
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new CannedBrowsingDataDatabaseHelper(&testing_profile_));
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->AddDatabase(origin, db, "");
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->AddDatabase(origin, db, "");
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestCompletionCallback callback;
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  helper->StartFetching(
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NewCallback(&callback, &TestCompletionCallback::callback));
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<BrowsingDataDatabaseHelper::DatabaseInfo> result =
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      callback.result();
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(1u, result.size());
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(origin_str, result[0].origin_identifier.c_str());
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_STREQ(db, result[0].database_name.c_str());
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
143