Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: components/offline_pages/offline_page_metadata_store_impl_unittest.cc

Issue 1160283003: [Offline] Creates metadata store interface for offline pages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@offline-pages-1
Patch Set: Adding BUILD.gn updates Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698