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" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_database::DatabaseTracker* db_tracker = 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(browser()->profile())-> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDatabaseTracker(); 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 db_name = ASCIIToUTF16("db"); 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 description = 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()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, file_util::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()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, file_util::WriteFile(db_path2, NULL, 0)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<webkit_database::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) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(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