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

Unified Diff: chrome/browser/history/in_memory_url_index_unittest.cc

Issue 9030031: Move InMemoryURLIndex Caching Operations to FILE Thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Missed a private data swap. Try to fix update phase failure. Created 8 years, 11 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: chrome/browser/history/in_memory_url_index_unittest.cc
===================================================================
--- chrome/browser/history/in_memory_url_index_unittest.cc (revision 117518)
+++ chrome/browser/history/in_memory_url_index_unittest.cc (working copy)
@@ -6,7 +6,9 @@
#include "base/file_path.h"
#include "base/file_util.h"
+#include "base/message_loop.h"
#include "base/path_service.h"
+#include "base/scoped_temp_dir.h"
#include "base/string16.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
@@ -14,10 +16,15 @@
#include "chrome/browser/history/in_memory_database.h"
#include "chrome/browser/history/in_memory_url_index.h"
#include "chrome/browser/history/in_memory_url_index_types.h"
+#include "chrome/browser/history/url_index_private_data.h"
#include "chrome/common/chrome_paths.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/test/test_browser_thread.h"
#include "sql/transaction.h"
#include "testing/gtest/include/gtest/gtest.h"
+using content::BrowserThread;
+
// The test version of the history url database table ('url') is contained in
// a database file created from a text file('url_history_provider_test.db.txt').
// The only difference between this table and a live 'urls' table from a
@@ -31,6 +38,51 @@
namespace history {
+// -----------------------------------------------------------------------------
+
+// Observer class so the unit tests can wait while the cache is being saved.
+class CacheFileSaverObserver : public InMemoryURLIndex::SaveCacheObserver {
+ public:
+ explicit CacheFileSaverObserver(MessageLoop* loop)
Peter Kasting 2012/01/14 00:12:49 Nit: I know it's just a test file, but I'd prefer
mrossetti 2012/03/03 05:05:56 Will do in the next CL.
+ : loop_(loop),
+ succeeded_(false) {
+ DCHECK(loop);
+ }
+
+ virtual void OnCacheSaveFinished() OVERRIDE {
+ succeeded_ = true;
+ loop_->Quit();
+ }
+ virtual void OnCacheSaveFailed() OVERRIDE { loop_->Quit(); }
+
+ private:
+ MessageLoop* loop_;
+ bool succeeded_;
+ DISALLOW_COPY_AND_ASSIGN(CacheFileSaverObserver);
+};
+
+// Observer class so the unit tests can wait while the cache is being restored.
+class CacheFileReaderObserver : public InMemoryURLIndex::RestoreCacheObserver {
+ public:
+ explicit CacheFileReaderObserver(MessageLoop* loop)
+ : loop_(loop),
+ succeeded_(false) {
+ DCHECK(loop);
+ }
+
+ virtual void OnCacheRestoreFinished(bool succeeded) OVERRIDE {
+ succeeded_ = succeeded;
+ loop_->Quit();
+ }
+
+ private:
+ MessageLoop* loop_;
+ bool succeeded_;
+ DISALLOW_COPY_AND_ASSIGN(CacheFileReaderObserver);
+};
+
+// -----------------------------------------------------------------------------
+
class InMemoryURLIndexTest : public testing::Test,
public InMemoryDatabase {
public:
@@ -62,10 +114,13 @@
void CheckTerm(const URLIndexPrivateData::SearchTermCacheMap& cache,
string16 term) const;
- scoped_ptr<InMemoryURLIndex> url_index_;
+ scoped_ptr<TestingProfile> profile_;
+ scoped_refptr<InMemoryURLIndex> url_index_;
};
void InMemoryURLIndexTest::SetUp() {
+ profile_.reset(new TestingProfile());
+
// Create and populate a working copy of the URL history database.
FilePath history_proto_path;
PathService::Get(chrome::DIR_TEST_DATA, &history_proto_path);
@@ -195,11 +250,6 @@
return FILE_PATH_LITERAL("url_history_provider_test_limited.db.txt");
}
-TEST_F(InMemoryURLIndexTest, Construction) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- EXPECT_TRUE(url_index_.get());
-}
-
TEST_F(LimitedInMemoryURLIndexTest, Initialization) {
// Verify that the database contains the expected number of items, which
// is the pre-filtered count, i.e. all of the items.
@@ -208,8 +258,9 @@
uint64 row_count = 0;
while (statement.Step()) ++row_count;
EXPECT_EQ(1U, row_count);
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
URLIndexPrivateData& private_data(*(url_index_->private_data_));
// history_info_map_ should have the same number of items as were filtered.
@@ -218,9 +269,17 @@
EXPECT_EQ(17U, private_data.word_map_.size());
}
+//------------------------------------------------------------------------------
+
+TEST_F(InMemoryURLIndexTest, Construction) {
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ EXPECT_TRUE(url_index_.get());
+}
+
TEST_F(InMemoryURLIndexTest, Retrieval) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
// The term will be lowercased by the search.
// See if a very specific term gives a single result.
@@ -268,8 +327,9 @@
}
TEST_F(InMemoryURLIndexTest, ProperStringMatching) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
// Search for the following with the expected results:
// "atdmt view" - found
@@ -285,14 +345,15 @@
}
TEST_F(InMemoryURLIndexTest, HugeResultSet) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
// Create a huge set of qualifying history items.
for (URLID row_id = 5000; row_id < 6000; ++row_id) {
URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), row_id);
new_row.set_last_visit(base::Time::Now());
- url_index_->UpdateURL(row_id, new_row);
+ url_index_->UpdateURL(new_row);
}
ScoredHistoryMatches matches =
@@ -307,8 +368,9 @@
}
TEST_F(InMemoryURLIndexTest, TitleSearch) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
// Signal if someone has changed the test DB.
EXPECT_EQ(27U, url_index_->private_data_->history_info_map_.size());
@@ -327,8 +389,9 @@
}
TEST_F(InMemoryURLIndexTest, TitleChange) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
// Verify current title terms retrieves desired item.
string16 original_terms =
@@ -354,7 +417,7 @@
// Update the row.
old_row.set_title(ASCIIToUTF16("Does eat oats and little lambs eat ivy"));
- url_index_->UpdateURL(expected_id, old_row);
+ url_index_->UpdateURL(old_row);
// Verify we get the row using the new terms but not the original terms.
matches = url_index_->HistoryItemsForTerms(new_terms);
@@ -365,8 +428,9 @@
}
TEST_F(InMemoryURLIndexTest, NonUniqueTermCharacterSets) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
// The presence of duplicate characters should succeed. Exercise by cycling
// through a string with several duplicate characters.
@@ -401,8 +465,9 @@
typedef URLIndexPrivateData::SearchTermCacheMap::iterator CacheIter;
typedef URLIndexPrivateData::SearchTermCacheItem CacheItem;
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
URLIndexPrivateData::SearchTermCacheMap& cache(
url_index_->private_data_->search_term_cache_);
@@ -489,8 +554,8 @@
}
TEST_F(InMemoryURLIndexTest, AddNewRows) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
// Verify that the row we're going to add does not already exist.
URLID new_row_id = 87654321;
@@ -501,29 +566,35 @@
// Add a new row.
URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), new_row_id);
+ new_row.set_title(ASCIIToUTF16("Timothy Little and His Amazing Dog Boo"));
new_row.set_last_visit(base::Time::Now());
- url_index_->UpdateURL(new_row_id, new_row);
+ url_index_->UpdateURL(new_row);
// Verify that we can retrieve it.
EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(
ASCIIToUTF16("brokeandalone")).size());
+ // Verify that we can retrieve it by title.
+ EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(
+ ASCIIToUTF16("Timothy Little")).size());
+
// Add it again just to be sure that is harmless.
- url_index_->UpdateURL(new_row_id, new_row);
+ url_index_->UpdateURL(new_row);
EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(
ASCIIToUTF16("brokeandalone")).size());
}
TEST_F(InMemoryURLIndexTest, DeleteRows) {
- url_index_.reset(new InMemoryURLIndex(FilePath()));
- url_index_->Init(this, "en,ja,hi,zh");
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
+ url_index_->Init("en,ja,hi,zh");
+ url_index_->RebuildFromHistory(this);
ScoredHistoryMatches matches =
url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport"));
ASSERT_EQ(1U, matches.size());
// Determine the row id for that result, delete that id, then search again.
- url_index_->DeleteURL(matches[0].url_info.id());
+ url_index_->DeleteURL(matches[0].url_info.url());
EXPECT_TRUE(url_index_->HistoryItemsForTerms(
ASCIIToUTF16("DrudgeReport")).empty());
}
@@ -601,7 +672,7 @@
{ "xmpp:node@example.com", false },
{ "xmpp://guest@example.com", false },
};
- url_index_.reset(new InMemoryURLIndex(FilePath()));
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
URLIndexPrivateData& private_data(*(url_index_->private_data_.get()));
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
GURL url(data[i].url_spec);
@@ -611,8 +682,8 @@
}
TEST_F(InMemoryURLIndexTest, CacheFilePath) {
- url_index_.reset(new InMemoryURLIndex(FilePath(FILE_PATH_LITERAL(
- "/flammmy/frammy/"))));
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath(FILE_PATH_LITERAL(
+ "/flammmy/frammy/")));
FilePath full_file_path;
url_index_->GetCacheFilePath(&full_file_path);
std::vector<FilePath::StringType> expected_parts;
@@ -629,23 +700,20 @@
}
TEST_F(InMemoryURLIndexTest, CacheSaveRestore) {
+ MessageLoop message_loop;
+ content::TestBrowserThread fake_ui_thread(BrowserThread::UI, &message_loop);
+ content::TestBrowserThread fake_file_thread(BrowserThread::FILE,
+ &message_loop);
+
// Save the cache to a protobuf, restore it, and compare the results.
- url_index_.reset(new InMemoryURLIndex(FilePath()));
+ url_index_ = new InMemoryURLIndex(profile_.get(), FilePath());
InMemoryURLIndex& url_index(*(url_index_.get()));
- url_index.Init(this, "en,ja,hi,zh");
- in_memory_url_index::InMemoryURLIndexCacheItem index_cache;
- URLIndexPrivateData& private_data(*(url_index_->private_data_.get()));
- private_data.SavePrivateData(&index_cache);
+ url_index.Init("en,ja,hi,zh");
+ url_index.RebuildFromHistory(this);
- // Capture our private data so we can later compare for equality.
- String16Vector word_list(private_data.word_list_);
- WordMap word_map(private_data.word_map_);
- CharWordIDMap char_word_map(private_data.char_word_map_);
- WordIDHistoryMap word_id_history_map(private_data.word_id_history_map_);
- HistoryIDWordMap history_id_word_map(private_data.history_id_word_map_);
- HistoryInfoMap history_info_map(private_data.history_info_map_);
+ URLIndexPrivateData& private_data(*(url_index_->private_data_));
- // Prove that there is really something there.
+ // Ensure that there is really something there to be saved.
EXPECT_FALSE(private_data.word_list_.empty());
// available_words_ will already be empty since we have freshly built the
// data set for this test.
@@ -656,8 +724,22 @@
EXPECT_FALSE(private_data.history_id_word_map_.empty());
EXPECT_FALSE(private_data.history_info_map_.empty());
- // Clear and then prove it's clear.
- private_data.Clear();
+ // Capture the current private data for later comparison to restored data.
+ URLIndexPrivateData old_data(*(url_index_->private_data_));
+
+ // Save then restore our private data.
+ ScopedTempDir temp_directory;
+ ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
+ FilePath temp_file;
+ ASSERT_TRUE(file_util::CreateTemporaryFileInDir(temp_directory.path(),
+ &temp_file));
+ CacheFileSaverObserver save_observer(&message_loop);
+ url_index_->set_save_cache_observer(&save_observer);
+ url_index.DoSaveToCacheFile(temp_file);
+ message_loop.Run();
+
+ // Clear and then prove it's clear before restoring.
+ url_index.ClearPrivateData();
EXPECT_TRUE(private_data.word_list_.empty());
EXPECT_TRUE(private_data.available_words_.empty());
EXPECT_TRUE(private_data.word_map_.empty());
@@ -666,35 +748,41 @@
EXPECT_TRUE(private_data.history_id_word_map_.empty());
EXPECT_TRUE(private_data.history_info_map_.empty());
- // Restore the cache.
- EXPECT_TRUE(private_data.RestorePrivateData(index_cache));
+ CacheFileReaderObserver read_observer(&message_loop);
+ url_index_->set_restore_cache_observer(&read_observer);
+ url_index.DoRestoreFromCacheFile(temp_file);
+ message_loop.Run();
- // Compare the restored and captured for equality.
- EXPECT_EQ(word_list.size(), private_data.word_list_.size());
- EXPECT_EQ(word_map.size(), private_data.word_map_.size());
- EXPECT_EQ(char_word_map.size(), private_data.char_word_map_.size());
- EXPECT_EQ(word_id_history_map.size(),
- private_data.word_id_history_map_.size());
- EXPECT_EQ(history_id_word_map.size(),
- private_data.history_id_word_map_.size());
- EXPECT_EQ(history_info_map.size(), private_data.history_info_map_.size());
+ URLIndexPrivateData& new_data(*(url_index_->private_data_));
+
+ // Compare the captured and restored for equality.
+ EXPECT_EQ(old_data.word_list_.size(), new_data.word_list_.size());
+ EXPECT_EQ(old_data.word_map_.size(), new_data.word_map_.size());
+ EXPECT_EQ(old_data.char_word_map_.size(), new_data.char_word_map_.size());
+ EXPECT_EQ(old_data.word_id_history_map_.size(),
+ new_data.word_id_history_map_.size());
+ EXPECT_EQ(old_data.history_id_word_map_.size(),
+ new_data.history_id_word_map_.size());
+ EXPECT_EQ(old_data.history_info_map_.size(),
+ new_data.history_info_map_.size());
// WordList must be index-by-index equal.
- size_t count = word_list.size();
+ size_t count = old_data.word_list_.size();
for (size_t i = 0; i < count; ++i)
- EXPECT_EQ(word_list[i], private_data.word_list_[i]);
+ EXPECT_EQ(old_data.word_list_[i], new_data.word_list_[i]);
- ExpectMapOfContainersIdentical(char_word_map,
- private_data.char_word_map_);
- ExpectMapOfContainersIdentical(word_id_history_map,
- private_data.word_id_history_map_);
- ExpectMapOfContainersIdentical(history_id_word_map,
- private_data.history_id_word_map_);
+ ExpectMapOfContainersIdentical(old_data.char_word_map_,
+ new_data.char_word_map_);
+ ExpectMapOfContainersIdentical(old_data.word_id_history_map_,
+ new_data.word_id_history_map_);
+ ExpectMapOfContainersIdentical(old_data.history_id_word_map_,
+ new_data.history_id_word_map_);
- for (HistoryInfoMap::const_iterator expected = history_info_map.begin();
- expected != history_info_map.end(); ++expected) {
+ for (HistoryInfoMap::const_iterator expected =
+ old_data.history_info_map_.begin();
+ expected != old_data.history_info_map_.end(); ++expected) {
HistoryInfoMap::const_iterator actual =
- private_data.history_info_map_.find(expected->first);
- ASSERT_FALSE(private_data.history_info_map_.end() == actual);
+ new_data.history_info_map_.find(expected->first);
+ ASSERT_FALSE(new_data.history_info_map_.end() == actual);
const URLRow& expected_row(expected->second);
const URLRow& actual_row(actual->second);
EXPECT_EQ(expected_row.visit_count(), actual_row.visit_count());

Powered by Google App Engine
This is Rietveld 408576698