Index: components/omnibox/browser/history_quick_provider_unittest.cc |
diff --git a/chrome/browser/autocomplete/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc |
similarity index 86% |
rename from chrome/browser/autocomplete/history_quick_provider_unittest.cc |
rename to components/omnibox/browser/history_quick_provider_unittest.cc |
index 8054a2c1287cc6c2af437e9f0f57ce6eabbf513a..410004a448232baad2ddec3b76b6a3f8613a494f 100644 |
--- a/chrome/browser/autocomplete/history_quick_provider_unittest.cc |
+++ b/components/omnibox/browser/history_quick_provider_unittest.cc |
@@ -12,6 +12,7 @@ |
#include <string> |
#include <vector> |
+#include "base/files/scoped_temp_dir.h" |
#include "base/format_macros.h" |
#include "base/macros.h" |
#include "base/memory/scoped_ptr.h" |
@@ -19,32 +20,29 @@ |
#include "base/prefs/pref_service.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h" |
-#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" |
-#include "chrome/browser/autocomplete/in_memory_url_index_factory.h" |
-#include "chrome/browser/bookmarks/bookmark_model_factory.h" |
-#include "chrome/browser/history/history_service_factory.h" |
-#include "chrome/browser/search_engines/chrome_template_url_service_client.h" |
-#include "chrome/browser/search_engines/template_url_service_factory.h" |
-#include "chrome/test/base/testing_browser_process.h" |
-#include "chrome/test/base/testing_profile.h" |
+#include "base/test/sequenced_worker_pool_owner.h" |
+#include "components/bookmarks/browser/bookmark_model.h" |
#include "components/bookmarks/test/bookmark_test_helpers.h" |
+#include "components/bookmarks/test/test_bookmark_client.h" |
#include "components/history/core/browser/history_backend.h" |
#include "components/history/core/browser/history_database.h" |
+#include "components/history/core/browser/history_database_params.h" |
#include "components/history/core/browser/history_service.h" |
#include "components/history/core/browser/history_service_observer.h" |
#include "components/history/core/browser/url_database.h" |
+#include "components/history/core/test/test_history_database.h" |
#include "components/metrics/proto/omnibox_event.pb.h" |
#include "components/omnibox/browser/autocomplete_match.h" |
#include "components/omnibox/browser/autocomplete_result.h" |
+#include "components/omnibox/browser/history_index_restore_observer.h" |
#include "components/omnibox/browser/history_url_provider.h" |
#include "components/omnibox/browser/in_memory_url_index.h" |
+#include "components/omnibox/browser/mock_autocomplete_provider_client.h" |
+#include "components/omnibox/browser/test_scheme_classifier.h" |
#include "components/omnibox/browser/url_index_private_data.h" |
#include "components/search_engines/search_terms_data.h" |
#include "components/search_engines/template_url.h" |
#include "components/search_engines/template_url_service.h" |
-#include "content/public/test/test_browser_thread.h" |
-#include "content/public/test/test_utils.h" |
#include "sql/transaction.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -52,8 +50,6 @@ using base::ASCIIToUTF16; |
using base::Time; |
using base::TimeDelta; |
-using content::BrowserThread; |
- |
namespace { |
struct TestURLInfo { |
@@ -183,13 +179,75 @@ class GetURLTask : public history::HistoryDBTask { |
DISALLOW_COPY_AND_ASSIGN(GetURLTask); |
}; |
+class QuitTask : public history::HistoryDBTask { |
+ public: |
+ QuitTask() {} |
+ |
+ bool RunOnDBThread(history::HistoryBackend* backend, |
+ history::HistoryDatabase* db) override { |
+ return true; |
+ } |
+ |
+ void DoneRunOnMainThread() override { |
+ base::MessageLoop::current()->QuitWhenIdle(); |
+ } |
+ |
+ private: |
+ ~QuitTask() override {} |
+ |
+ DISALLOW_COPY_AND_ASSIGN(QuitTask); |
+}; |
+ |
+class FakeAutocompleteProviderClient : public MockAutocompleteProviderClient { |
+ public: |
+ FakeAutocompleteProviderClient() { |
+ bookmark_model_ = bookmark_client_.CreateModel(); |
+ set_template_url_service( |
+ make_scoped_ptr(new TemplateURLService(nullptr, 0))); |
+ } |
+ |
+ const AutocompleteSchemeClassifier& GetSchemeClassifier() const override { |
+ return scheme_classifier_; |
+ } |
+ |
+ const SearchTermsData& GetSearchTermsData() const override { |
+ return search_terms_data_; |
+ } |
+ |
+ history::HistoryService* GetHistoryService() override { |
+ return &history_service_; |
+ } |
+ |
+ bookmarks::BookmarkModel* GetBookmarkModel() override { |
+ return bookmark_model_.get(); |
+ } |
+ |
+ InMemoryURLIndex* GetInMemoryURLIndex() override { |
+ return in_memory_url_index_.get(); |
+ } |
+ |
+ std::string GetAcceptLanguages() const override { return "en,en-US,ko"; } |
+ |
+ void set_in_memory_url_index(scoped_ptr<InMemoryURLIndex> index) { |
+ in_memory_url_index_ = std::move(index); |
+ } |
+ |
+ private: |
+ bookmarks::TestBookmarkClient bookmark_client_; |
+ scoped_ptr<bookmarks::BookmarkModel> bookmark_model_; |
+ TestSchemeClassifier scheme_classifier_; |
+ SearchTermsData search_terms_data_; |
+ scoped_ptr<InMemoryURLIndex> in_memory_url_index_; |
+ history::HistoryService history_service_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeAutocompleteProviderClient); |
+}; |
+ |
} // namespace |
class HistoryQuickProviderTest : public testing::Test { |
public: |
- HistoryQuickProviderTest() |
- : ui_thread_(BrowserThread::UI, &message_loop_), |
- file_thread_(BrowserThread::FILE, &message_loop_) {} |
+ HistoryQuickProviderTest() : pool_owner_(3, "Background Pool") {} |
protected: |
class SetShouldContain : public std::unary_function<const std::string&, |
@@ -205,17 +263,6 @@ class HistoryQuickProviderTest : public testing::Test { |
std::set<std::string> matches_; |
}; |
- static scoped_ptr<KeyedService> CreateTemplateURLService( |
- content::BrowserContext* context) { |
- Profile* profile = static_cast<Profile*>(context); |
- return make_scoped_ptr(new TemplateURLService( |
- profile->GetPrefs(), make_scoped_ptr(new SearchTermsData), NULL, |
- scoped_ptr<TemplateURLServiceClient>(new ChromeTemplateURLServiceClient( |
- HistoryServiceFactory::GetForProfile( |
- profile, ServiceAccessType::EXPLICIT_ACCESS))), |
- NULL, NULL, base::Closure())); |
- } |
- |
void SetUp() override; |
void TearDown() override; |
@@ -249,20 +296,23 @@ class HistoryQuickProviderTest : public testing::Test { |
// > message_loop(). |
// Direct use of this object in tests is almost certainly not thread-safe. |
history::HistoryBackend* history_backend() { |
- return history_service_->history_backend_.get(); |
+ return client_->GetHistoryService()->history_backend_.get(); |
} |
// Call history_backend()->GetURL(url, NULL) on the history thread, returning |
// the result. |
bool GetURLProxy(const GURL& url); |
- base::MessageLoopForUI message_loop_; |
- content::TestBrowserThread ui_thread_; |
- content::TestBrowserThread file_thread_; |
+ // Helper functions to initialize the HistoryService. |
+ bool InitializeHistoryService(); |
+ void CreateInMemoryURLIndex(); |
+ void BlockUntilHistoryProcessesPendingRequests(); |
+ void BlockUntilHistoryIndexIsRefreshed(); |
- scoped_ptr<TestingProfile> profile_; |
- scoped_ptr<ChromeAutocompleteProviderClient> client_; |
- history::HistoryService* history_service_; |
+ base::MessageLoop message_loop_; |
+ base::SequencedWorkerPoolOwner pool_owner_; |
+ base::ScopedTempDir history_dir_; |
+ scoped_ptr<FakeAutocompleteProviderClient> client_; |
ACMatches ac_matches_; // The resulting matches after running RunTest. |
@@ -270,31 +320,27 @@ class HistoryQuickProviderTest : public testing::Test { |
}; |
void HistoryQuickProviderTest::SetUp() { |
- profile_.reset(new TestingProfile()); |
- client_.reset(new ChromeAutocompleteProviderClient(profile_.get())); |
- ASSERT_TRUE(profile_->CreateHistoryService(true, false)); |
- profile_->CreateBookmarkModel(true); |
- bookmarks::test::WaitForBookmarkModelToLoad( |
- BookmarkModelFactory::GetForProfile(profile_.get())); |
- profile_->BlockUntilHistoryIndexIsRefreshed(); |
+ client_.reset(new FakeAutocompleteProviderClient()); |
+ ASSERT_TRUE(InitializeHistoryService()); |
+ FillData(); |
+ |
+ // |FillData()| must be called before |CreateInMemoryURLIndex()|. This will |
+ // ensure that the index is properly populated with data from the database. |
+ CreateInMemoryURLIndex(); |
+ BlockUntilHistoryIndexIsRefreshed(); |
// History index refresh creates rebuilt tasks to run on history thread. |
// Block here to make sure that all of them are complete. |
- profile_->BlockUntilHistoryProcessesPendingRequests(); |
- history_service_ = HistoryServiceFactory::GetForProfile( |
- profile_.get(), ServiceAccessType::EXPLICIT_ACCESS); |
- EXPECT_TRUE(history_service_); |
+ BlockUntilHistoryProcessesPendingRequests(); |
+ |
provider_ = new HistoryQuickProvider(client_.get()); |
- TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
- profile_.get(), &HistoryQuickProviderTest::CreateTemplateURLService); |
- FillData(); |
- InMemoryURLIndex* index = |
- InMemoryURLIndexFactory::GetForProfile(profile_.get()); |
- EXPECT_TRUE(index); |
- index->RebuildFromHistory(history_backend()->db()); |
} |
void HistoryQuickProviderTest::TearDown() { |
provider_ = NULL; |
+ // The InMemoryURLIndex must be explicitly shut down or it will DCHECK() in |
+ // its destructor. |
+ client_->GetInMemoryURLIndex()->Shutdown(); |
+ client_->set_in_memory_url_index(nullptr); |
// History index rebuild task is created from main thread during SetUp, |
// performed on DB thread and must be deleted on main thread. |
// Run main loop to process delete task, to prevent leaks. |
@@ -391,7 +437,7 @@ void HistoryQuickProviderTest::RunTestWithCursor( |
AutocompleteInput input(text, cursor_position, std::string(), GURL(), |
metrics::OmniboxEventProto::INVALID_SPEC, |
prevent_inline_autocomplete, false, true, true, false, |
- ChromeAutocompleteSchemeClassifier(profile_.get())); |
+ TestSchemeClassifier()); |
provider_->Start(input, false); |
EXPECT_TRUE(provider_->done()); |
@@ -416,6 +462,7 @@ void HistoryQuickProviderTest::RunTestWithCursor( |
if (expected_urls.empty()) |
return; |
+ ASSERT_FALSE(ac_matches_.empty()); |
// Verify that we got the results in the order expected. |
int best_score = ac_matches_.begin()->relevance + 1; |
int i = 0; |
@@ -441,7 +488,7 @@ void HistoryQuickProviderTest::RunTestWithCursor( |
bool HistoryQuickProviderTest::GetURLProxy(const GURL& url) { |
base::CancelableTaskTracker task_tracker; |
bool result = false; |
- history_service_->ScheduleDBTask( |
+ client_->GetHistoryService()->ScheduleDBTask( |
scoped_ptr<history::HistoryDBTask>(new GetURLTask(url, &result)), |
&task_tracker); |
// Run the message loop until GetURLTask::DoneRunOnMainThread stops it. If |
@@ -450,6 +497,46 @@ bool HistoryQuickProviderTest::GetURLProxy(const GURL& url) { |
return result; |
} |
+bool HistoryQuickProviderTest::InitializeHistoryService() { |
+ if (!history_dir_.CreateUniqueTempDir() || |
+ !client_->GetHistoryService()->Init( |
+ false, client_->GetAcceptLanguages(), |
+ history::TestHistoryDatabaseParamsForPath(history_dir_.path()))) |
+ return false; |
+ |
+ BlockUntilHistoryProcessesPendingRequests(); |
+ return true; |
+} |
+ |
+void HistoryQuickProviderTest::CreateInMemoryURLIndex() { |
+ scoped_ptr<InMemoryURLIndex> in_memory_url_index(new InMemoryURLIndex( |
+ client_->GetBookmarkModel(), client_->GetHistoryService(), |
+ pool_owner_.pool().get(), history_dir_.path(), |
+ client_->GetAcceptLanguages(), SchemeSet())); |
+ in_memory_url_index->Init(); |
+ in_memory_url_index->RebuildFromHistory(history_backend()->db()); |
+ client_->set_in_memory_url_index(std::move(in_memory_url_index)); |
+} |
+ |
+void HistoryQuickProviderTest::BlockUntilHistoryProcessesPendingRequests() { |
+ base::CancelableTaskTracker tracker; |
+ client_->GetHistoryService()->ScheduleDBTask( |
+ scoped_ptr<history::HistoryDBTask>(new QuitTask()), &tracker); |
+ base::MessageLoop::current()->Run(); |
+} |
+ |
+void HistoryQuickProviderTest::BlockUntilHistoryIndexIsRefreshed() { |
+ InMemoryURLIndex* index = client_->GetInMemoryURLIndex(); |
+ if (!index || index->restored()) |
+ return; |
+ base::RunLoop run_loop; |
+ HistoryIndexRestoreObserver observer(run_loop.QuitClosure()); |
+ index->set_restore_cache_observer(&observer); |
+ run_loop.Run(); |
+ index->set_restore_cache_observer(nullptr); |
+ DCHECK(index->restored()); |
+} |
+ |
TEST_F(HistoryQuickProviderTest, SimpleSingleMatch) { |
std::vector<std::string> expected_urls; |
expected_urls.push_back("http://slashdot.org/favorite_page.html"); |
@@ -681,7 +768,7 @@ TEST_F(HistoryQuickProviderTest, DeleteMatch) { |
// InMemoryURLIndex) will drop any data they might have pertaining to the URL. |
// To ensure that the deletion has been propagated everywhere before we start |
// verifying post-deletion states, first wait until we see the notification. |
- WaitForURLsDeletedNotification(history_service_); |
+ WaitForURLsDeletedNotification(client_->GetHistoryService()); |
EXPECT_FALSE(GetURLProxy(test_url)); |
// Just to be on the safe side, explicitly verify that we have deleted enough |
@@ -796,8 +883,7 @@ TEST_F(HistoryQuickProviderTest, CullSearchResults) { |
data.SetShortName(ASCIIToUTF16("TestEngine")); |
data.SetKeyword(ASCIIToUTF16("TestEngine")); |
data.SetURL("http://testsearch.com/?q={searchTerms}"); |
- TemplateURLService* template_url_service = |
- TemplateURLServiceFactory::GetForProfile(profile_.get()); |
+ TemplateURLService* template_url_service = client_->GetTemplateURLService(); |
TemplateURL* template_url = new TemplateURL(data); |
template_url_service->Add(template_url); |
template_url_service->SetUserSelectedDefaultSearchProvider(template_url); |
@@ -817,10 +903,10 @@ TEST_F(HistoryQuickProviderTest, CullSearchResults) { |
} |
TEST_F(HistoryQuickProviderTest, DoesNotProvideMatchesOnFocus) { |
- AutocompleteInput input( |
- ASCIIToUTF16("popularsite"), base::string16::npos, std::string(), GURL(), |
- metrics::OmniboxEventProto::INVALID_SPEC, false, false, true, true, true, |
- ChromeAutocompleteSchemeClassifier(profile_.get())); |
+ AutocompleteInput input(ASCIIToUTF16("popularsite"), base::string16::npos, |
+ std::string(), GURL(), |
+ metrics::OmniboxEventProto::INVALID_SPEC, false, |
+ false, true, true, true, TestSchemeClassifier()); |
provider_->Start(input, false); |
EXPECT_TRUE(provider_->matches().empty()); |
} |