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/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper_browsertest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef BrowsingDataHelperCallback<BrowsingDataDatabaseHelper::DatabaseInfo>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestIdentifier1[] = "http_www.google.com_0";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestIdentifierExtension[] =
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "chrome-extension_behllobkkfkfnphdnhnkndlbkcpglgmj_0";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowsingDataDatabaseHelperTest : public InProcessBrowserTest {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateDatabases() {
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::DatabaseTracker* db_tracker =
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        BrowserContext::GetDefaultStoragePartition(browser()->profile())
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            ->GetDatabaseTracker();
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 db_name = base::ASCIIToUTF16("db");
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 description = base::ASCIIToUTF16("db_description");
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 size;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    db_tracker->DatabaseOpened(kTestIdentifier1, db_name, description,
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               1, &size);
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    db_tracker->DatabaseClosed(kTestIdentifier1, db_name);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath db_path1 =
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        db_tracker->GetFullDBFilePath(kTestIdentifier1, db_name);
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::CreateDirectory(db_path1.DirName());
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(0, base::WriteFile(db_path1, NULL, 0));
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    db_tracker->DatabaseOpened(kTestIdentifierExtension, db_name, description,
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               1, &size);
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    db_tracker->DatabaseClosed(kTestIdentifierExtension, db_name);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath db_path2 =
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        db_tracker->GetFullDBFilePath(kTestIdentifierExtension, db_name);
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::CreateDirectory(db_path2.DirName());
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(0, base::WriteFile(db_path2, NULL, 0));
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::vector<storage::OriginInfo> origins;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_tracker->GetAllOriginsInfo(&origins);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2U, origins.size());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called back by BrowsingDataDatabaseHelper on the UI thread once the database
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// information has been retrieved.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StopTestOnCallback {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit StopTestOnCallback(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowsingDataDatabaseHelper* database_helper)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : database_helper_(database_helper) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(database_helper_);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Callback(const std::list<BrowsingDataDatabaseHelper::DatabaseInfo>&
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                database_info_list) {
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK_CURRENTLY_ON(BrowserThread::UI);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1UL, database_info_list.size());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(kTestIdentifier1),
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              database_info_list.begin()->identifier.ToString());
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowsingDataDatabaseHelper* database_helper_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky on Win/Mac/Linux: http://crbug.com/92460
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, DISABLED_FetchData) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateDatabases();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BrowsingDataDatabaseHelper> database_helper(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new BrowsingDataDatabaseHelper(browser()->profile()));
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StopTestOnCallback stop_test_on_callback(database_helper.get());
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  database_helper->StartFetching(base::Bind(
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &StopTestOnCallback::Callback, base::Unretained(&stop_test_on_callback)));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blocks until StopTestOnCallback::Callback is notified.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunMessageLoop();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, CannedAddDatabase) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL origin1("http://host1:1/");
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL origin2("http://host2:1/");
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char origin_str1[] = "http_host1_1";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char origin_str2[] = "http_host2_1";
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char db1[] = "db1";
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char db2[] = "db2";
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char db3[] = "db3";
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataDatabaseHelper> helper(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataDatabaseHelper(browser()->profile()));
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->AddDatabase(origin1, db1, std::string());
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->AddDatabase(origin1, db2, std::string());
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->AddDatabase(origin2, db3, std::string());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->StartFetching(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TestCompletionCallback::callback,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<BrowsingDataDatabaseHelper::DatabaseInfo> result =
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.result();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, result.size());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator info =
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.begin();
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(origin_str1, info->identifier.ToString());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(db1, info->database_name.c_str());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info++;
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(origin_str1, info->identifier.ToString());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(db2, info->database_name.c_str());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info++;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(origin_str2, info->identifier.ToString());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(db3, info->database_name.c_str());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowsingDataDatabaseHelperTest, CannedUnique) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL origin("http://host1:1/");
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char origin_str[] = "http_host1_1";
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char db[] = "db1";
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataDatabaseHelper> helper(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataDatabaseHelper(browser()->profile()));
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->AddDatabase(origin, db, std::string());
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->AddDatabase(origin, db, std::string());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->StartFetching(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TestCompletionCallback::callback,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<BrowsingDataDatabaseHelper::DatabaseInfo> result =
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.result();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, result.size());
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(origin_str, result.begin()->identifier.ToString());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(db, result.begin()->database_name.c_str());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
153