| Index: components/offline_pages/offline_page_metadata_store_impl_unittest.cc
|
| diff --git a/components/offline_pages/offline_page_metadata_store_impl_unittest.cc b/components/offline_pages/offline_page_metadata_store_impl_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..128fc36443029db6ebfdfccda7a5213ad7469385
|
| --- /dev/null
|
| +++ b/components/offline_pages/offline_page_metadata_store_impl_unittest.cc
|
| @@ -0,0 +1,345 @@
|
| +// Copyright 2015 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 "components/offline_pages/offline_page_metadata_store_impl.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/files/scoped_temp_dir.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "components/offline_pages/offline_page_item.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace offline_pages {
|
| +
|
| +namespace {
|
| +
|
| +const char kURL1[] = "https://example.com";
|
| +const char kTitle1[] = "Exmample site title";
|
| +const char kFilePath1[] = "/offline_pages/exmaple_com.mhtml";
|
| +int64 kFileSize1 = 234567;
|
| +
|
| +class OfflinePageMetadataStoreImplTest : public testing::Test {
|
| + public:
|
| + enum CalledCallback { NONE, LOAD, ADD, REMOVE, DESTROY };
|
| +
|
| + OfflinePageMetadataStoreImplTest();
|
| + ~OfflinePageMetadataStoreImplTest() override;
|
| +
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> BuildStore();
|
| + void PumpLoop();
|
| +
|
| + void LoadCallback(OfflinePageMetadataStore::Status status,
|
| + const std::vector<OfflinePageItem>& offline_pages);
|
| + void UpdateCallback(CalledCallback called_callback,
|
| + OfflinePageMetadataStore::Status status);
|
| +
|
| + void ClearResults();
|
| +
|
| + protected:
|
| + CalledCallback last_called_callback_;
|
| + OfflinePageMetadataStore::Status last_status_;
|
| + std::vector<OfflinePageItem> offline_pages_;
|
| +
|
| + base::ScopedTempDir temp_directory_;
|
| + base::MessageLoop message_loop_;
|
| + scoped_ptr<base::RunLoop> run_loop_;
|
| +};
|
| +
|
| +OfflinePageMetadataStoreImplTest::OfflinePageMetadataStoreImplTest()
|
| + : last_called_callback_(NONE),
|
| + last_status_(OfflinePageMetadataStore::STATUS_COUNT) {
|
| + EXPECT_TRUE(temp_directory_.CreateUniqueTempDir());
|
| + run_loop_.reset(new base::RunLoop());
|
| +}
|
| +
|
| +OfflinePageMetadataStoreImplTest::~OfflinePageMetadataStoreImplTest() {
|
| +}
|
| +
|
| +void OfflinePageMetadataStoreImplTest::PumpLoop() {
|
| + message_loop_.RunUntilIdle();
|
| +}
|
| +
|
| +scoped_ptr<OfflinePageMetadataStoreImpl>
|
| +OfflinePageMetadataStoreImplTest::BuildStore() {
|
| + return scoped_ptr<OfflinePageMetadataStoreImpl>(
|
| + new OfflinePageMetadataStoreImpl(temp_directory_.path(),
|
| + message_loop_.message_loop_proxy()));
|
| +}
|
| +
|
| +void OfflinePageMetadataStoreImplTest::LoadCallback(
|
| + OfflinePageMetadataStore::Status status,
|
| + const std::vector<OfflinePageItem>& offline_pages) {
|
| + last_called_callback_ = LOAD;
|
| + last_status_ = status;
|
| + offline_pages_.swap(const_cast<std::vector<OfflinePageItem>&>(offline_pages));
|
| + run_loop_->Quit();
|
| + run_loop_.reset(new base::RunLoop());
|
| +}
|
| +
|
| +void OfflinePageMetadataStoreImplTest::UpdateCallback(
|
| + CalledCallback called_callback,
|
| + OfflinePageMetadataStore::Status status) {
|
| + last_called_callback_ = called_callback;
|
| + last_status_ = status;
|
| + run_loop_->Quit();
|
| + run_loop_.reset(new base::RunLoop());
|
| +}
|
| +
|
| +void OfflinePageMetadataStoreImplTest::ClearResults() {
|
| + last_called_callback_ = NONE;
|
| + last_status_ = OfflinePageMetadataStore::STATUS_COUNT;
|
| + offline_pages_.clear();
|
| +}
|
| +
|
| +// Loads empty store and makes sure that there are no offline pages stored in
|
| +// it.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, LoadEmptyStore) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(0U, offline_pages_.size());
|
| +}
|
| +
|
| +// Adds metadata of an offline page into a store and then loads from the
|
| +// store to make sure the metadata is preserved.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, AddOfflinePageThenLoad) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| +
|
| + OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
|
| + kFileSize1);
|
| + store->AddOfflinePage(
|
| + offline_page,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + EXPECT_EQ(ADD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(1U, offline_pages_.size());
|
| + EXPECT_EQ(offline_page.url, offline_pages_[0].url);
|
| + EXPECT_EQ(offline_page.title, offline_pages_[0].title);
|
| + EXPECT_EQ(offline_page.version, offline_pages_[0].version);
|
| + EXPECT_EQ(offline_page.file_path, offline_pages_[0].file_path);
|
| + EXPECT_EQ(offline_page.file_size, offline_pages_[0].file_size);
|
| + EXPECT_EQ(offline_page.creation_time, offline_pages_[0].creation_time);
|
| + EXPECT_EQ(offline_page.last_access_time, offline_pages_[0].last_access_time);
|
| +}
|
| +
|
| +// Adds metadata of an offline page into a store and then opens the store
|
| +// again to make sure that stored metadata survives store restarts.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, AddOfflinePageRestartLoad) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| +
|
| + OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
|
| + kFileSize1);
|
| + store->AddOfflinePage(
|
| + offline_page,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + EXPECT_EQ(ADD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + // Restart the store.
|
| + ClearResults();
|
| + store = BuildStore().Pass();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(1U, offline_pages_.size());
|
| + EXPECT_EQ(offline_page.url, offline_pages_[0].url);
|
| + EXPECT_EQ(offline_page.title, offline_pages_[0].title);
|
| + EXPECT_EQ(offline_page.version, offline_pages_[0].version);
|
| + EXPECT_EQ(offline_page.file_path, offline_pages_[0].file_path);
|
| + EXPECT_EQ(offline_page.file_size, offline_pages_[0].file_size);
|
| + EXPECT_EQ(offline_page.creation_time, offline_pages_[0].creation_time);
|
| + EXPECT_EQ(offline_page.last_access_time, offline_pages_[0].last_access_time);
|
| +}
|
| +
|
| +// Adds metadata of an offline page into a store and then opens the store
|
| +// again to make sure that stored metadata survives store restarts.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, AddOfflinePageCloseLoad) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| +
|
| + OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
|
| + kFileSize1);
|
| + store->AddOfflinePage(
|
| + offline_page,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + EXPECT_EQ(ADD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->Close();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(1U, offline_pages_.size());
|
| + EXPECT_EQ(offline_page.url, offline_pages_[0].url);
|
| + EXPECT_EQ(offline_page.title, offline_pages_[0].title);
|
| + EXPECT_EQ(offline_page.version, offline_pages_[0].version);
|
| + EXPECT_EQ(offline_page.file_path, offline_pages_[0].file_path);
|
| + EXPECT_EQ(offline_page.file_size, offline_pages_[0].file_size);
|
| + EXPECT_EQ(offline_page.creation_time, offline_pages_[0].creation_time);
|
| + EXPECT_EQ(offline_page.last_access_time, offline_pages_[0].last_access_time);
|
| +}
|
| +
|
| +// Tests removing offline page metadata from the store, for which it first adds
|
| +// metadata of an offline page.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, RemoveOfflinePage) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| +
|
| + OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
|
| + kFileSize1);
|
| + store->AddOfflinePage(
|
| + offline_page,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + EXPECT_EQ(ADD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->RemoveOfflinePage(
|
| + offline_page.url,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), REMOVE));
|
| + PumpLoop();
|
| + EXPECT_EQ(REMOVE, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->Close();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(0U, offline_pages_.size());
|
| +}
|
| +
|
| +// Adds metadata of multiple offline pages into a store and removes some.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, AddRemoveMultipleOfflinePages) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| +
|
| + OfflinePageItem offline_page_1(GURL(kURL1), kTitle1,
|
| + base::FilePath(kFilePath1), kFileSize1);
|
| + OfflinePageItem offline_page_2(GURL("https://other.page.com"), "Other page",
|
| + base::FilePath("//other.page.com.mhtml"),
|
| + 12345, base::Time::Now());
|
| + store->AddOfflinePage(
|
| + offline_page_1,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + EXPECT_EQ(ADD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->AddOfflinePage(
|
| + offline_page_2,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + EXPECT_EQ(ADD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(2U, offline_pages_.size());
|
| +
|
| + store->RemoveOfflinePage(
|
| + offline_page_1.url,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), REMOVE));
|
| + PumpLoop();
|
| + EXPECT_EQ(REMOVE, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->Close();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_EQ(1U, offline_pages_.size());
|
| + EXPECT_EQ(offline_page_2.url, offline_pages_[0].url);
|
| + EXPECT_EQ(offline_page_2.title, offline_pages_[0].title);
|
| + EXPECT_EQ(offline_page_2.version, offline_pages_[0].version);
|
| + EXPECT_EQ(offline_page_2.file_path, offline_pages_[0].file_path);
|
| + EXPECT_EQ(offline_page_2.file_size, offline_pages_[0].file_size);
|
| + EXPECT_EQ(offline_page_2.creation_time, offline_pages_[0].creation_time);
|
| + EXPECT_EQ(offline_page_2.last_access_time,
|
| + offline_pages_[0].last_access_time);
|
| +}
|
| +
|
| +// Adds metadata of multiple offline pages into a store and removes some.
|
| +TEST_F(OfflinePageMetadataStoreImplTest, DestroyStore) {
|
| + scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
|
| +
|
| + OfflinePageItem offline_page_1(GURL(kURL1), kTitle1,
|
| + base::FilePath(kFilePath1), kFileSize1);
|
| + OfflinePageItem offline_page_2(GURL("https://other.page.com"), "Other page",
|
| + base::FilePath("//other.page.com.mhtml"),
|
| + 12345, base::Time::Now());
|
| + store->AddOfflinePage(
|
| + offline_page_1,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| + store->AddOfflinePage(
|
| + offline_page_2,
|
| + base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), ADD));
|
| + PumpLoop();
|
| +
|
| + ClearResults();
|
| + store->Destroy(base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
|
| + base::Unretained(this), DESTROY));
|
| + PumpLoop();
|
| + EXPECT_EQ(DESTROY, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| +
|
| + ClearResults();
|
| + store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
|
| + base::Unretained(this)));
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(LOAD, last_called_callback_);
|
| + EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
|
| + EXPECT_TRUE(offline_pages_.empty());
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace offline_pages
|
|
|