blob: d964bb0246c3977263a42ec2523becf74ba00692 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/browsing_data/site_data_size_collector.h"
#include "base/files/file_util.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "chrome/browser/browsing_data/mock_browsing_data_appcache_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_cache_storage_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_cookie_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_database_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_file_system_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_flash_lso_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_indexed_db_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_local_storage_helper.h"
#include "chrome/browser/browsing_data/mock_browsing_data_service_worker_helper.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/common/content_constants.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char kCookieFileData[] = "cookie_file_data";
const base::FilePath::CharType kFlashDataFilename0[] =
FILE_PATH_LITERAL("flash_data_filename_0");
const base::FilePath::CharType kFlashDataFilename1[] =
FILE_PATH_LITERAL("flash_data_filename_1");
const char kFlashData0[] = "flash_data_zero";
const char kFlashData1[] = "flash_data_one";
class SiteDataSizeCollectorTest : public testing::Test {
public:
~SiteDataSizeCollectorTest() override {
profile_.reset();
base::RunLoop().RunUntilIdle();
}
void SetUp() override {
profile_.reset(new TestingProfile());
mock_browsing_data_cookie_helper_ =
new MockBrowsingDataCookieHelper(profile_.get());
mock_browsing_data_database_helper_ =
new MockBrowsingDataDatabaseHelper(profile_.get());
mock_browsing_data_local_storage_helper_ =
new MockBrowsingDataLocalStorageHelper(profile_.get());
mock_browsing_data_appcache_helper_ =
new MockBrowsingDataAppCacheHelper(profile_.get());
mock_browsing_data_indexed_db_helper_ =
new MockBrowsingDataIndexedDBHelper(profile_.get());
mock_browsing_data_file_system_helper_ =
new MockBrowsingDataFileSystemHelper(profile_.get());
mock_browsing_data_service_worker_helper_ =
new MockBrowsingDataServiceWorkerHelper(profile_.get());
mock_browsing_data_cache_storage_helper_ =
new MockBrowsingDataCacheStorageHelper(profile_.get());
mock_browsing_data_flash_lso_helper_ =
new MockBrowsingDataFlashLSOHelper(profile_.get());
base::WriteFile(profile_->GetPath().Append(chrome::kCookieFilename),
kCookieFileData, base::size(kCookieFileData));
const base::FilePath flash_data_dir = profile_->GetPath().Append(
content::kPepperDataDirname);
base::CreateDirectory(flash_data_dir);
base::WriteFile(flash_data_dir.Append(kFlashDataFilename0), kFlashData0,
base::size(kFlashData0));
base::WriteFile(flash_data_dir.Append(kFlashDataFilename1), kFlashData1,
base::size(kFlashData1));
fetched_size_ = -1;
}
void TearDown() override {
mock_browsing_data_service_worker_helper_ = nullptr;
mock_browsing_data_cache_storage_helper_ = nullptr;
mock_browsing_data_file_system_helper_ = nullptr;
mock_browsing_data_indexed_db_helper_ = nullptr;
mock_browsing_data_appcache_helper_ = nullptr;
mock_browsing_data_session_storage_helper_ = nullptr;
mock_browsing_data_local_storage_helper_ = nullptr;
mock_browsing_data_database_helper_ = nullptr;
mock_browsing_data_flash_lso_helper_ = nullptr;
base::RunLoop().RunUntilIdle();
}
void FetchCallback(int64_t size) {
fetched_size_ = size;
}
protected:
int64_t fetched_size_;
content::TestBrowserThreadBundle thread_bundle_;
std::unique_ptr<TestingProfile> profile_;
scoped_refptr<MockBrowsingDataCookieHelper>
mock_browsing_data_cookie_helper_;
scoped_refptr<MockBrowsingDataDatabaseHelper>
mock_browsing_data_database_helper_;
scoped_refptr<MockBrowsingDataLocalStorageHelper>
mock_browsing_data_local_storage_helper_;
scoped_refptr<MockBrowsingDataLocalStorageHelper>
mock_browsing_data_session_storage_helper_;
scoped_refptr<MockBrowsingDataAppCacheHelper>
mock_browsing_data_appcache_helper_;
scoped_refptr<MockBrowsingDataIndexedDBHelper>
mock_browsing_data_indexed_db_helper_;
scoped_refptr<MockBrowsingDataFileSystemHelper>
mock_browsing_data_file_system_helper_;
scoped_refptr<MockBrowsingDataServiceWorkerHelper>
mock_browsing_data_service_worker_helper_;
scoped_refptr<MockBrowsingDataCacheStorageHelper>
mock_browsing_data_cache_storage_helper_;
scoped_refptr<MockBrowsingDataFlashLSOHelper>
mock_browsing_data_flash_lso_helper_;
};
TEST_F(SiteDataSizeCollectorTest, FetchCookie) {
SiteDataSizeCollector collector(
profile_->GetPath(), mock_browsing_data_cookie_helper_.get(), nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
// AddCookieSample() actually doesn't write the cookie to the file, only
// triggers the condition to take the file into account.
mock_browsing_data_cookie_helper_->AddCookieSamples(
GURL("http://foo1"), "A=1");
mock_browsing_data_cookie_helper_->Notify();
// Wait until reading files on blocking pool finishes.
base::RunLoop().RunUntilIdle();
EXPECT_EQ(static_cast<int64_t>(base::size(kCookieFileData)), fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchCookieWithoutEntry) {
SiteDataSizeCollector collector(
profile_->GetPath(), mock_browsing_data_cookie_helper_.get(), nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
// Fetched size should be 0 if there are no cookies.
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_cookie_helper_->Notify();
EXPECT_EQ(0, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchDatabase) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, mock_browsing_data_database_helper_.get(),
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_database_helper_->AddDatabaseSamples();
mock_browsing_data_database_helper_->Notify();
EXPECT_EQ(3, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchLocalStorage) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr,
mock_browsing_data_local_storage_helper_.get(), nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_local_storage_helper_->AddLocalStorageSamples();
mock_browsing_data_local_storage_helper_->Notify();
EXPECT_EQ(3, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchAppCache) {
SiteDataSizeCollector collector(profile_->GetPath(), nullptr, nullptr,
nullptr,
mock_browsing_data_appcache_helper_.get(),
nullptr, nullptr, nullptr, nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_appcache_helper_->AddAppCacheSamples();
mock_browsing_data_appcache_helper_->Notify();
EXPECT_EQ(6, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchIndexedDB) {
SiteDataSizeCollector collector(profile_->GetPath(), nullptr, nullptr,
nullptr, nullptr,
mock_browsing_data_indexed_db_helper_.get(),
nullptr, nullptr, nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_indexed_db_helper_->AddIndexedDBSamples();
mock_browsing_data_indexed_db_helper_->Notify();
EXPECT_EQ(3, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchFileSystem) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr, nullptr, nullptr, nullptr,
mock_browsing_data_file_system_helper_.get(), nullptr, nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_file_system_helper_->AddFileSystemSamples();
mock_browsing_data_file_system_helper_->Notify();
EXPECT_EQ(14, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchServiceWorker) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
mock_browsing_data_service_worker_helper_.get(),
nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_service_worker_helper_->AddServiceWorkerSamples();
mock_browsing_data_service_worker_helper_->Notify();
EXPECT_EQ(3, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchCacheStorage) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, mock_browsing_data_cache_storage_helper_.get(), nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_cache_storage_helper_->AddCacheStorageSamples();
mock_browsing_data_cache_storage_helper_->Notify();
EXPECT_EQ(3, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchFlashLSO) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, mock_browsing_data_flash_lso_helper_.get());
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
// AddFlashLSODomain() actually doesn't write flash data to the file, only
// triggers the condition to take the file into account.
mock_browsing_data_flash_lso_helper_->AddFlashLSODomain("example.com");
mock_browsing_data_flash_lso_helper_->Notify();
// Wait until reading files on blocking pool finishes.
base::RunLoop().RunUntilIdle();
EXPECT_EQ(
static_cast<int64_t>(base::size(kFlashData0) + base::size(kFlashData1)),
fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchFlashLSOWithoutEntry) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, mock_browsing_data_flash_lso_helper_.get());
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_flash_lso_helper_->Notify();
EXPECT_EQ(0, fetched_size_);
}
TEST_F(SiteDataSizeCollectorTest, FetchMultiple) {
SiteDataSizeCollector collector(
profile_->GetPath(), nullptr, nullptr, nullptr, nullptr,
mock_browsing_data_indexed_db_helper_.get(), nullptr,
mock_browsing_data_service_worker_helper_.get(), nullptr, nullptr);
collector.Fetch(base::Bind(&SiteDataSizeCollectorTest::FetchCallback,
base::Unretained(this)));
mock_browsing_data_indexed_db_helper_->AddIndexedDBSamples();
mock_browsing_data_indexed_db_helper_->Notify();
// The callback for Fetch() shouldn't be called at this point.
EXPECT_EQ(-1, fetched_size_);
mock_browsing_data_service_worker_helper_->AddServiceWorkerSamples();
mock_browsing_data_service_worker_helper_->Notify();
EXPECT_EQ(3 + 3, fetched_size_);
}
} // namespace