Index: components/dom_distiller/core/dom_distiller_database_unittest.cc |
diff --git a/components/dom_distiller/core/dom_distiller_database_unittest.cc b/components/dom_distiller/core/dom_distiller_database_unittest.cc |
deleted file mode 100644 |
index 54c9043d440961f0ec561d976542481584eca0a6..0000000000000000000000000000000000000000 |
--- a/components/dom_distiller/core/dom_distiller_database_unittest.cc |
+++ /dev/null |
@@ -1,397 +0,0 @@ |
-// Copyright 2013 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/dom_distiller/core/dom_distiller_database.h" |
- |
-#include <map> |
- |
-#include "base/bind.h" |
-#include "base/file_util.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/run_loop.h" |
-#include "base/threading/thread.h" |
-#include "components/dom_distiller/core/article_entry.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using base::MessageLoop; |
-using base::ScopedTempDir; |
-using testing::Invoke; |
-using testing::Return; |
-using testing::_; |
- |
-namespace dom_distiller { |
- |
-namespace { |
- |
-typedef std::map<std::string, ArticleEntry> EntryMap; |
- |
-class MockDB : public DomDistillerDatabase::Database { |
- public: |
- MOCK_METHOD1(Init, bool(const base::FilePath&)); |
- MOCK_METHOD2(Save, bool(const EntryVector&, const EntryVector&)); |
- MOCK_METHOD1(Load, bool(EntryVector*)); |
- |
- MockDB() { |
- ON_CALL(*this, Init(_)).WillByDefault(Return(true)); |
- ON_CALL(*this, Save(_, _)).WillByDefault(Return(true)); |
- ON_CALL(*this, Load(_)).WillByDefault(Return(true)); |
- } |
- |
- bool LoadEntries(EntryVector* entries); |
-}; |
- |
-class MockDatabaseCaller { |
- public: |
- MOCK_METHOD1(InitCallback, void(bool)); |
- MOCK_METHOD1(SaveCallback, void(bool)); |
- void LoadCallback(bool success, scoped_ptr<EntryVector> entries) { |
- LoadCallback1(success, entries.get()); |
- } |
- MOCK_METHOD2(LoadCallback1, void(bool, EntryVector*)); |
-}; |
- |
-} // namespace |
- |
-EntryMap GetSmallModel() { |
- EntryMap model; |
- |
- model["key0"].set_entry_id("key0"); |
- model["key0"].add_pages()->set_url("http://foo.com/1"); |
- model["key0"].add_pages()->set_url("http://foo.com/2"); |
- model["key0"].add_pages()->set_url("http://foo.com/3"); |
- |
- model["key1"].set_entry_id("key1"); |
- model["key1"].add_pages()->set_url("http://bar.com/all"); |
- |
- model["key2"].set_entry_id("key2"); |
- model["key2"].add_pages()->set_url("http://baz.com/1"); |
- |
- return model; |
-} |
- |
-void ExpectEntryPointersEquals(EntryMap expected, const EntryVector& actual) { |
- EXPECT_EQ(expected.size(), actual.size()); |
- for (size_t i = 0; i < actual.size(); i++) { |
- EntryMap::iterator expected_it = |
- expected.find(std::string(actual[i].entry_id())); |
- EXPECT_TRUE(expected_it != expected.end()); |
- std::string serialized_expected = expected_it->second.SerializeAsString(); |
- std::string serialized_actual = actual[i].SerializeAsString(); |
- EXPECT_EQ(serialized_expected, serialized_actual); |
- expected.erase(expected_it); |
- } |
-} |
- |
-class DomDistillerDatabaseTest : public testing::Test { |
- public: |
- virtual void SetUp() { |
- main_loop_.reset(new MessageLoop()); |
- db_.reset(new DomDistillerDatabase(main_loop_->message_loop_proxy())); |
- } |
- |
- virtual void TearDown() { |
- db_.reset(); |
- base::RunLoop().RunUntilIdle(); |
- main_loop_.reset(); |
- } |
- |
- scoped_ptr<DomDistillerDatabase> db_; |
- scoped_ptr<MessageLoop> main_loop_; |
-}; |
- |
-// Test that DomDistillerDatabase calls Init on the underlying database and that |
-// the caller's InitCallback is called with the correct value. |
-TEST_F(DomDistillerDatabaseTest, TestDBInitSuccess) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- EXPECT_CALL(*mock_db, Init(path)).WillOnce(Return(true)); |
- |
- MockDatabaseCaller caller; |
- EXPECT_CALL(caller, InitCallback(true)); |
- |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(DomDistillerDatabaseTest, TestDBInitFailure) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- EXPECT_CALL(*mock_db, Init(path)).WillOnce(Return(false)); |
- |
- MockDatabaseCaller caller; |
- EXPECT_CALL(caller, InitCallback(false)); |
- |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-ACTION_P(AppendLoadEntries, model) { |
- EntryVector* output = arg0; |
- for (EntryMap::const_iterator it = model.begin(); it != model.end(); ++it) { |
- output->push_back(it->second); |
- } |
- return true; |
-} |
- |
-ACTION_P(VerifyLoadEntries, expected) { |
- EntryVector* actual = arg1; |
- ExpectEntryPointersEquals(expected, *actual); |
-} |
- |
-// Test that DomDistillerDatabase calls Load on the underlying database and that |
-// the caller's LoadCallback is called with the correct success value. Also |
-// confirms that on success, the expected entries are passed to the caller's |
-// LoadCallback. |
-TEST_F(DomDistillerDatabaseTest, TestDBLoadSuccess) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- MockDatabaseCaller caller; |
- EntryMap model = GetSmallModel(); |
- |
- EXPECT_CALL(*mock_db, Init(_)); |
- EXPECT_CALL(caller, InitCallback(_)); |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- EXPECT_CALL(*mock_db, Load(_)).WillOnce(AppendLoadEntries(model)); |
- EXPECT_CALL(caller, LoadCallback1(true, _)) |
- .WillOnce(VerifyLoadEntries(testing::ByRef(model))); |
- db_->LoadEntries( |
- base::Bind(&MockDatabaseCaller::LoadCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(DomDistillerDatabaseTest, TestDBLoadFailure) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- MockDatabaseCaller caller; |
- |
- EXPECT_CALL(*mock_db, Init(_)); |
- EXPECT_CALL(caller, InitCallback(_)); |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- EXPECT_CALL(*mock_db, Load(_)).WillOnce(Return(false)); |
- EXPECT_CALL(caller, LoadCallback1(false, _)); |
- db_->LoadEntries( |
- base::Bind(&MockDatabaseCaller::LoadCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-ACTION_P(VerifyUpdateEntries, expected) { |
- const EntryVector& actual = arg0; |
- ExpectEntryPointersEquals(expected, actual); |
- return true; |
-} |
- |
-// Test that DomDistillerDatabase calls Save on the underlying database with the |
-// correct entries to save and that the caller's SaveCallback is called with the |
-// correct success value. |
-TEST_F(DomDistillerDatabaseTest, TestDBSaveSuccess) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- MockDatabaseCaller caller; |
- EntryMap model = GetSmallModel(); |
- |
- EXPECT_CALL(*mock_db, Init(_)); |
- EXPECT_CALL(caller, InitCallback(_)); |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- scoped_ptr<EntryVector> entries(new EntryVector()); |
- for (EntryMap::iterator it = model.begin(); it != model.end(); ++it) { |
- entries->push_back(it->second); |
- } |
- scoped_ptr<EntryVector> entries_to_remove(new EntryVector()); |
- |
- EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(VerifyUpdateEntries(model)); |
- EXPECT_CALL(caller, SaveCallback(true)); |
- db_->UpdateEntries( |
- entries.Pass(), |
- entries_to_remove.Pass(), |
- base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(DomDistillerDatabaseTest, TestDBSaveFailure) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- MockDatabaseCaller caller; |
- scoped_ptr<EntryVector> entries(new EntryVector()); |
- scoped_ptr<EntryVector> entries_to_remove(new EntryVector()); |
- |
- EXPECT_CALL(*mock_db, Init(_)); |
- EXPECT_CALL(caller, InitCallback(_)); |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(Return(false)); |
- EXPECT_CALL(caller, SaveCallback(false)); |
- db_->UpdateEntries( |
- entries.Pass(), |
- entries_to_remove.Pass(), |
- base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-ACTION_P(VerifyRemoveEntries, expected) { |
- const EntryVector& actual = arg1; |
- ExpectEntryPointersEquals(expected, actual); |
- return true; |
-} |
- |
-// Test that DomDistillerDatabase calls Save on the underlying database with the |
-// correct entries to delete and that the caller's SaveCallback is called with |
-// the correct success value. |
-TEST_F(DomDistillerDatabaseTest, TestDBRemoveSuccess) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- MockDatabaseCaller caller; |
- EntryMap model = GetSmallModel(); |
- |
- EXPECT_CALL(*mock_db, Init(_)); |
- EXPECT_CALL(caller, InitCallback(_)); |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- scoped_ptr<EntryVector> entries(new EntryVector()); |
- scoped_ptr<EntryVector> entries_to_remove(new EntryVector()); |
- for (EntryMap::iterator it = model.begin(); it != model.end(); ++it) { |
- entries_to_remove->push_back(it->second); |
- } |
- |
- EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(VerifyRemoveEntries(model)); |
- EXPECT_CALL(caller, SaveCallback(true)); |
- db_->UpdateEntries( |
- entries.Pass(), |
- entries_to_remove.Pass(), |
- base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(DomDistillerDatabaseTest, TestDBRemoveFailure) { |
- base::FilePath path(FILE_PATH_LITERAL("/fake/path")); |
- |
- MockDB* mock_db = new MockDB(); |
- MockDatabaseCaller caller; |
- scoped_ptr<EntryVector> entries(new EntryVector()); |
- scoped_ptr<EntryVector> entries_to_remove(new EntryVector()); |
- |
- EXPECT_CALL(*mock_db, Init(_)); |
- EXPECT_CALL(caller, InitCallback(_)); |
- db_->InitWithDatabase( |
- scoped_ptr<DomDistillerDatabase::Database>(mock_db), |
- base::FilePath(path), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(Return(false)); |
- EXPECT_CALL(caller, SaveCallback(false)); |
- db_->UpdateEntries( |
- entries.Pass(), |
- entries_to_remove.Pass(), |
- base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller))); |
- |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
- |
-// This tests that normal usage of the real database does not cause any |
-// threading violations. |
-TEST(DomDistillerDatabaseThreadingTest, TestDBDestruction) { |
- base::MessageLoop main_loop; |
- |
- ScopedTempDir temp_dir; |
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
- |
- base::Thread db_thread("dbthread"); |
- ASSERT_TRUE(db_thread.Start()); |
- |
- scoped_ptr<DomDistillerDatabase> db( |
- new DomDistillerDatabase(db_thread.message_loop_proxy())); |
- |
- MockDatabaseCaller caller; |
- EXPECT_CALL(caller, InitCallback(_)); |
- db->Init( |
- temp_dir.path(), |
- base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller))); |
- |
- db.reset(); |
- |
- base::RunLoop run_loop; |
- db_thread.message_loop_proxy()->PostTaskAndReply( |
- FROM_HERE, base::Bind(base::DoNothing), run_loop.QuitClosure()); |
- run_loop.Run(); |
-} |
- |
-// Test that the LevelDB properly saves entries and that load returns the saved |
-// entries. If |close_after_save| is true, the database will be closed after |
-// saving and then re-opened to ensure that the data is properly persisted. |
-void TestLevelDBSaveAndLoad(bool close_after_save) { |
- ScopedTempDir temp_dir; |
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
- |
- EntryMap model = GetSmallModel(); |
- EntryVector save_entries; |
- EntryVector load_entries; |
- EntryVector remove_entries; |
- |
- for (EntryMap::iterator it = model.begin(); it != model.end(); ++it) { |
- save_entries.push_back(it->second); |
- } |
- |
- scoped_ptr<DomDistillerDatabase::LevelDB> db( |
- new DomDistillerDatabase::LevelDB()); |
- EXPECT_TRUE(db->Init(temp_dir.path())); |
- EXPECT_TRUE(db->Save(save_entries, remove_entries)); |
- |
- if (close_after_save) { |
- db.reset(new DomDistillerDatabase::LevelDB()); |
- EXPECT_TRUE(db->Init(temp_dir.path())); |
- } |
- |
- EXPECT_TRUE(db->Load(&load_entries)); |
- |
- ExpectEntryPointersEquals(model, load_entries); |
-} |
- |
-TEST(DomDistillerDatabaseLevelDBTest, TestDBSaveAndLoad) { |
- TestLevelDBSaveAndLoad(false); |
-} |
- |
-TEST(DomDistillerDatabaseLevelDBTest, TestDBCloseAndReopen) { |
- TestLevelDBSaveAndLoad(true); |
-} |
- |
-} // namespace dom_distiller |