Index: components/omnibox/browser/autocomplete_provider_unittest.cc |
diff --git a/chrome/browser/autocomplete/autocomplete_provider_unittest.cc b/components/omnibox/browser/autocomplete_provider_unittest.cc |
similarity index 80% |
rename from chrome/browser/autocomplete/autocomplete_provider_unittest.cc |
rename to components/omnibox/browser/autocomplete_provider_unittest.cc |
index 3c876a2adcc19879021a5786e22cb09d44bf4cbb..edf06f64fbb12197bcd4fd35bcff42f621003d99 100644 |
--- a/chrome/browser/autocomplete/autocomplete_provider_unittest.cc |
+++ b/components/omnibox/browser/autocomplete_provider_unittest.cc |
@@ -8,32 +8,25 @@ |
#include "base/command_line.h" |
#include "base/location.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop/message_loop.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/string16.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/thread_task_runner_handle.h" |
-#include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h" |
-#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" |
-#include "chrome/browser/chrome_notification_types.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 "components/metrics/proto/omnibox_event.pb.h" |
#include "components/omnibox/browser/autocomplete_controller.h" |
#include "components/omnibox/browser/autocomplete_input.h" |
#include "components/omnibox/browser/autocomplete_match.h" |
#include "components/omnibox/browser/autocomplete_provider_listener.h" |
#include "components/omnibox/browser/keyword_provider.h" |
+#include "components/omnibox/browser/mock_autocomplete_provider_client.h" |
#include "components/omnibox/browser/search_provider.h" |
#include "components/search_engines/search_engines_switches.h" |
#include "components/search_engines/template_url.h" |
#include "components/search_engines/template_url_service.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/test/test_browser_thread_bundle.h" |
+#include "components/search_engines/template_url_service_client.h" |
#include "testing/gtest/include/gtest/gtest.h" |
static std::ostream& operator<<(std::ostream& os, |
@@ -42,24 +35,64 @@ static std::ostream& operator<<(std::ostream& os, |
} |
namespace { |
+ |
const size_t kResultsPerProvider = 3; |
const char kTestTemplateURLKeyword[] = "t"; |
-} |
+ |
+class TestingSchemeClassifier : public AutocompleteSchemeClassifier { |
+ public: |
+ TestingSchemeClassifier() {} |
+ |
+ metrics::OmniboxInputType::Type GetInputTypeForScheme( |
+ const std::string& scheme) const override { |
+ return net::URLRequest::IsHandledProtocol(scheme) |
+ ? metrics::OmniboxInputType::URL |
+ : metrics::OmniboxInputType::INVALID; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TestingSchemeClassifier); |
+}; |
+ |
+// AutocompleteProviderClient implementation that calls the specified closure |
+// when the result is ready. |
+class AutocompleteProviderClientWithClosure |
+ : public MockAutocompleteProviderClient { |
+ public: |
+ AutocompleteProviderClientWithClosure() {} |
+ |
+ void set_closure(const base::Closure& closure) { closure_ = closure; } |
+ |
+ private: |
+ void OnAutocompleteControllerResultReady( |
+ AutocompleteController* controller) override { |
+ if (!closure_.is_null()) |
+ closure_.Run(); |
+ if (base::MessageLoop::current()->is_running()) |
+ base::MessageLoop::current()->QuitWhenIdle(); |
+ } |
+ |
+ base::Closure closure_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AutocompleteProviderClientWithClosure); |
+}; |
+ |
+} // namespace |
// Autocomplete provider that provides known results. Note that this is |
// refcounted so that it can also be a task on the message loop. |
class TestProvider : public AutocompleteProvider { |
public: |
- TestProvider(int relevance, const base::string16& prefix, |
- Profile* profile, |
- const base::string16 match_keyword) |
+ TestProvider(int relevance, |
+ const base::string16& prefix, |
+ const base::string16 match_keyword, |
+ AutocompleteProviderClient* client) |
: AutocompleteProvider(AutocompleteProvider::TYPE_SEARCH), |
- listener_(NULL), |
- profile_(profile), |
+ listener_(nullptr), |
relevance_(relevance), |
prefix_(prefix), |
- match_keyword_(match_keyword) { |
- } |
+ match_keyword_(match_keyword), |
+ client_(client) {} |
void Start(const AutocompleteInput& input, bool minimal_changes) override; |
@@ -80,10 +113,12 @@ class TestProvider : public AutocompleteProvider { |
const TemplateURLRef::SearchTermsArgs& search_terms_args); |
AutocompleteProviderListener* listener_; |
- Profile* profile_; |
int relevance_; |
const base::string16 prefix_; |
const base::string16 match_keyword_; |
+ AutocompleteProviderClient* client_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestProvider); |
}; |
void TestProvider::Start(const AutocompleteInput& input, bool minimal_changes) { |
@@ -115,7 +150,6 @@ void TestProvider::Start(const AutocompleteInput& input, bool minimal_changes) { |
} |
void TestProvider::Run() { |
- DCHECK_GT(kResultsPerProvider, 0U); |
AddResults(1, kResultsPerProvider); |
done_ = true; |
DCHECK(listener_); |
@@ -123,11 +157,9 @@ void TestProvider::Run() { |
} |
void TestProvider::AddResults(int start_at, int num) { |
- AddResultsWithSearchTermsArgs(start_at, |
- num, |
- AutocompleteMatchType::URL_WHAT_YOU_TYPED, |
- TemplateURLRef::SearchTermsArgs( |
- base::string16())); |
+ AddResultsWithSearchTermsArgs( |
+ start_at, num, AutocompleteMatchType::URL_WHAT_YOU_TYPED, |
+ TemplateURLRef::SearchTermsArgs(base::string16())); |
} |
void TestProvider::AddResultsWithSearchTermsArgs( |
@@ -152,17 +184,19 @@ void TestProvider::AddResultsWithSearchTermsArgs( |
new TemplateURLRef::SearchTermsArgs(search_terms_args)); |
if (!match_keyword_.empty()) { |
match.keyword = match_keyword_; |
- TemplateURLService* service = |
- TemplateURLServiceFactory::GetForProfile(profile_); |
- ASSERT_TRUE(match.GetTemplateURL(service, false) != NULL); |
+ ASSERT_NE(nullptr, |
+ match.GetTemplateURL(client_->GetTemplateURLService(), false)); |
} |
matches_.push_back(match); |
} |
} |
-class AutocompleteProviderTest : public testing::Test, |
- public content::NotificationObserver { |
+class AutocompleteProviderTest : public testing::Test { |
+ public: |
+ AutocompleteProviderTest(); |
+ ~AutocompleteProviderTest() override; |
+ |
protected: |
struct KeywordTestData { |
const base::string16 fill_into_edit; |
@@ -175,8 +209,7 @@ class AutocompleteProviderTest : public testing::Test, |
const std::string expected_aqs; |
}; |
- protected: |
- // Registers a test TemplateURL under the given keyword. |
+ // Registers a test TemplateURL under the given keyword. |
void RegisterTemplateURL(const base::string16 keyword, |
const std::string& template_url); |
@@ -202,7 +235,7 @@ class AutocompleteProviderTest : public testing::Test, |
const AssistedQueryStatsTestData* aqs_test_data, |
size_t size); |
- void RunQuery(const base::string16 query); |
+ void RunQuery(const std::string& query, bool allow_exact_keyword_match); |
void ResetControllerWithKeywordAndSearchProviders(); |
void ResetControllerWithKeywordProvider(); |
@@ -229,31 +262,42 @@ class AutocompleteProviderTest : public testing::Test, |
AutocompleteResult result_; |
private: |
- // content::NotificationObserver: |
- void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) override; |
- |
- content::TestBrowserThreadBundle thread_bundle_; |
- content::NotificationRegistrar registrar_; |
- TestingProfile profile_; |
+ // Resets the controller with the given |type|. |type| is a bitmap containing |
+ // AutocompleteProvider::Type values that will (potentially, depending on |
+ // platform, flags, etc.) be instantiated. |
+ void ResetControllerWithType(int type); |
+ |
+ base::MessageLoop message_loop_; |
scoped_ptr<AutocompleteController> controller_; |
+ // Owned by |controller_|. |
+ AutocompleteProviderClientWithClosure* client_; |
+ // Used to ensure that |client_| ownership has been passed to |controller_| |
+ // exactly once. |
+ bool client_owned_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AutocompleteProviderTest); |
}; |
+AutocompleteProviderTest::AutocompleteProviderTest() |
+ : client_(new AutocompleteProviderClientWithClosure()), |
+ client_owned_(false) { |
+ client_->set_template_url_service( |
+ make_scoped_ptr(new TemplateURLService(nullptr, 0))); |
+} |
+ |
+AutocompleteProviderTest::~AutocompleteProviderTest() { |
+ EXPECT_TRUE(client_owned_); |
+} |
+ |
void AutocompleteProviderTest::RegisterTemplateURL( |
const base::string16 keyword, |
const std::string& template_url) { |
- if (TemplateURLServiceFactory::GetForProfile(&profile_) == NULL) { |
- TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
- &profile_, &TemplateURLServiceFactory::BuildInstanceFor); |
- } |
TemplateURLData data; |
data.SetURL(template_url); |
data.SetShortName(keyword); |
data.SetKeyword(keyword); |
TemplateURL* default_t_url = new TemplateURL(data); |
- TemplateURLService* turl_model = |
- TemplateURLServiceFactory::GetForProfile(&profile_); |
+ TemplateURLService* turl_model = client_->GetTemplateURLService(); |
turl_model->Add(default_t_url); |
turl_model->SetUserSelectedDefaultSearchProvider(default_t_url); |
turl_model->Load(); |
@@ -281,26 +325,20 @@ void AutocompleteProviderTest::ResetControllerWithTestProviders( |
AutocompleteController::Providers providers; |
// Construct two new providers, with either the same or different prefixes. |
- TestProvider* provider1 = new TestProvider( |
- kResultsPerProvider, |
- base::ASCIIToUTF16("http://a"), |
- &profile_, |
- base::ASCIIToUTF16(kTestTemplateURLKeyword)); |
+ TestProvider* provider1 = |
+ new TestProvider(kResultsPerProvider, base::ASCIIToUTF16("http://a"), |
+ base::ASCIIToUTF16(kTestTemplateURLKeyword), client_); |
providers.push_back(provider1); |
TestProvider* provider2 = new TestProvider( |
kResultsPerProvider * 2, |
- same_destinations ? base::ASCIIToUTF16("http://a") |
- : base::ASCIIToUTF16("http://b"), |
- &profile_, |
- base::string16()); |
+ base::ASCIIToUTF16(same_destinations ? "http://a" : "http://b"), |
+ base::string16(), client_); |
providers.push_back(provider2); |
// Reset the controller to contain our new providers. |
- controller_.reset(new AutocompleteController( |
+ ResetControllerWithType(0); |
- make_scoped_ptr(new ChromeAutocompleteProviderClient(&profile_)), NULL, |
- 0)); |
// We're going to swap the providers vector, but the old vector should be |
// empty so no elements need to be freed at this point. |
EXPECT_TRUE(controller_->providers_.empty()); |
@@ -308,11 +346,8 @@ void AutocompleteProviderTest::ResetControllerWithTestProviders( |
provider1->set_listener(controller_.get()); |
provider2->set_listener(controller_.get()); |
- // The providers don't complete synchronously, so listen for "result updated" |
- // notifications. |
- registrar_.Add(this, |
- chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY, |
- content::Source<AutocompleteController>(controller_.get())); |
+ client_->set_closure(base::Bind(&AutocompleteProviderTest::CopyResults, |
+ base::Unretained(this))); |
if (provider1_ptr) |
*provider1_ptr = provider1; |
@@ -320,19 +355,14 @@ void AutocompleteProviderTest::ResetControllerWithTestProviders( |
*provider2_ptr = provider2; |
} |
-void AutocompleteProviderTest:: |
- ResetControllerWithKeywordAndSearchProviders() { |
- TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
- &profile_, &TemplateURLServiceFactory::BuildInstanceFor); |
- |
+void AutocompleteProviderTest::ResetControllerWithKeywordAndSearchProviders() { |
// Reset the default TemplateURL. |
TemplateURLData data; |
data.SetShortName(base::ASCIIToUTF16("default")); |
data.SetKeyword(base::ASCIIToUTF16("default")); |
data.SetURL("http://defaultturl/{searchTerms}"); |
TemplateURL* default_t_url = new TemplateURL(data); |
- TemplateURLService* turl_model = |
- TemplateURLServiceFactory::GetForProfile(&profile_); |
+ TemplateURLService* turl_model = client_->GetTemplateURLService(); |
turl_model->Add(default_t_url); |
turl_model->SetUserSelectedDefaultSearchProvider(default_t_url); |
TemplateURLID default_provider_id = default_t_url->id(); |
@@ -347,18 +377,12 @@ void AutocompleteProviderTest:: |
turl_model->Add(keyword_t_url); |
ASSERT_NE(0, keyword_t_url->id()); |
- controller_.reset(new AutocompleteController( |
- |
- make_scoped_ptr(new ChromeAutocompleteProviderClient(&profile_)), NULL, |
- AutocompleteProvider::TYPE_KEYWORD | AutocompleteProvider::TYPE_SEARCH)); |
+ ResetControllerWithType(AutocompleteProvider::TYPE_KEYWORD | |
+ AutocompleteProvider::TYPE_SEARCH); |
} |
void AutocompleteProviderTest::ResetControllerWithKeywordProvider() { |
- TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
- &profile_, &TemplateURLServiceFactory::BuildInstanceFor); |
- |
- TemplateURLService* turl_model = |
- TemplateURLServiceFactory::GetForProfile(&profile_); |
+ TemplateURLService* turl_model = client_->GetTemplateURLService(); |
// Create a TemplateURL for KeywordProvider. |
TemplateURLData data; |
@@ -386,13 +410,18 @@ void AutocompleteProviderTest::ResetControllerWithKeywordProvider() { |
turl_model->Add(keyword_t_url); |
ASSERT_NE(0, keyword_t_url->id()); |
- controller_.reset(new AutocompleteController( |
- make_scoped_ptr(new ChromeAutocompleteProviderClient(&profile_)), NULL, |
- AutocompleteProvider::TYPE_KEYWORD)); |
+ ResetControllerWithType(AutocompleteProvider::TYPE_KEYWORD); |
+} |
+ |
+void AutocompleteProviderTest::ResetControllerWithType(int type) { |
+ EXPECT_FALSE(client_owned_); |
+ controller_.reset( |
+ new AutocompleteController(make_scoped_ptr(client_), nullptr, type)); |
+ client_owned_ = true; |
} |
void AutocompleteProviderTest::RunTest() { |
- RunQuery(base::ASCIIToUTF16("a")); |
+ RunQuery("a", true); |
} |
void AutocompleteProviderTest::RunKeywordTest(const base::string16& input, |
@@ -412,17 +441,15 @@ void AutocompleteProviderTest::RunKeywordTest(const base::string16& input, |
controller_->input_ = AutocompleteInput( |
input, base::string16::npos, std::string(), GURL(), |
metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, |
- false, true, true, true, false, |
- ChromeAutocompleteSchemeClassifier(&profile_)); |
+ false, true, true, true, false, TestingSchemeClassifier()); |
AutocompleteResult result; |
result.AppendMatches(controller_->input_, matches); |
controller_->UpdateAssociatedKeywords(&result); |
- |
for (size_t j = 0; j < result.size(); ++j) { |
EXPECT_EQ(match_data[j].expected_associated_keyword, |
- result.match_at(j)->associated_keyword.get() ? |
- result.match_at(j)->associated_keyword->keyword : |
- base::string16()); |
+ result.match_at(j)->associated_keyword.get() |
+ ? result.match_at(j)->associated_keyword->keyword |
+ : base::string16()); |
} |
} |
@@ -433,7 +460,7 @@ void AutocompleteProviderTest::RunAssistedQueryStatsTest( |
const size_t kMaxRelevance = 1000; |
ACMatches matches; |
for (size_t i = 0; i < size; ++i) { |
- AutocompleteMatch match(NULL, kMaxRelevance - i, false, |
+ AutocompleteMatch match(nullptr, kMaxRelevance - i, false, |
aqs_test_data[i].match_type); |
match.allowed_to_be_default_match = true; |
match.keyword = base::ASCIIToUTF16(kTestTemplateURLKeyword); |
@@ -454,12 +481,13 @@ void AutocompleteProviderTest::RunAssistedQueryStatsTest( |
} |
} |
-void AutocompleteProviderTest::RunQuery(const base::string16 query) { |
+void AutocompleteProviderTest::RunQuery(const std::string& query, |
+ bool allow_exact_keyword_match) { |
result_.Reset(); |
controller_->Start(AutocompleteInput( |
- query, base::string16::npos, std::string(), GURL(), |
- metrics::OmniboxEventProto::INVALID_SPEC, true, false, true, true, false, |
- ChromeAutocompleteSchemeClassifier(&profile_))); |
+ base::ASCIIToUTF16(query), base::string16::npos, std::string(), GURL(), |
+ metrics::OmniboxEventProto::INVALID_SPEC, true, false, |
+ allow_exact_keyword_match, true, false, TestingSchemeClassifier())); |
if (!controller_->done()) |
// The message loop will terminate when all autocomplete input has been |
@@ -475,18 +503,13 @@ void AutocompleteProviderTest::RunExactKeymatchTest( |
// |allow_exact_keyword_match| is true. Regardless, the match should |
// be from SearchProvider. (It provides all verbatim search matches, |
// keyword or not.) |
- controller_->Start(AutocompleteInput( |
- base::ASCIIToUTF16("k test"), base::string16::npos, std::string(), GURL(), |
- metrics::OmniboxEventProto::INVALID_SPEC, true, false, |
- allow_exact_keyword_match, false, false, |
- ChromeAutocompleteSchemeClassifier(&profile_))); |
- EXPECT_TRUE(controller_->done()); |
+ RunQuery("k test", allow_exact_keyword_match); |
EXPECT_EQ(AutocompleteProvider::TYPE_SEARCH, |
- controller_->result().default_match()->provider->type()); |
- EXPECT_EQ(allow_exact_keyword_match ? |
- AutocompleteMatchType::SEARCH_OTHER_ENGINE : |
- AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, |
- controller_->result().default_match()->type); |
+ controller_->result().default_match()->provider->type()); |
+ EXPECT_EQ(allow_exact_keyword_match |
+ ? AutocompleteMatchType::SEARCH_OTHER_ENGINE |
+ : AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, |
+ controller_->result().default_match()->type); |
} |
void AutocompleteProviderTest::CopyResults() { |
@@ -501,20 +524,10 @@ GURL AutocompleteProviderTest::GetDestinationURL( |
return match.destination_url; |
} |
-void AutocompleteProviderTest::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (controller_->done()) { |
- CopyResults(); |
- base::MessageLoop::current()->QuitWhenIdle(); |
- } |
-} |
- |
// Tests that the default selection is set properly when updating results. |
TEST_F(AutocompleteProviderTest, Query) { |
- TestProvider* provider1 = NULL; |
- TestProvider* provider2 = NULL; |
+ TestProvider* provider1 = nullptr; |
+ TestProvider* provider2 = nullptr; |
ResetControllerWithTestProviders(false, &provider1, &provider2); |
RunTest(); |
@@ -527,7 +540,7 @@ TEST_F(AutocompleteProviderTest, Query) { |
// Tests assisted query stats. |
TEST_F(AutocompleteProviderTest, AssistedQueryStats) { |
- ResetControllerWithTestProviders(false, NULL, NULL); |
+ ResetControllerWithTestProviders(false, nullptr, nullptr); |
RunTest(); |
ASSERT_EQ(kResultsPerProvider * 2, result_.size()); |
@@ -546,8 +559,8 @@ TEST_F(AutocompleteProviderTest, AssistedQueryStats) { |
} |
TEST_F(AutocompleteProviderTest, RemoveDuplicates) { |
- TestProvider* provider1 = NULL; |
- TestProvider* provider2 = NULL; |
+ TestProvider* provider1 = nullptr; |
+ TestProvider* provider2 = nullptr; |
ResetControllerWithTestProviders(true, &provider1, &provider2); |
RunTest(); |
@@ -658,7 +671,7 @@ TEST_F(AutocompleteProviderTest, ExactMatchKeywords) { |
} |
TEST_F(AutocompleteProviderTest, UpdateAssistedQueryStats) { |
- ResetControllerWithTestProviders(false, NULL, NULL); |
+ ResetControllerWithTestProviders(false, nullptr, nullptr); |
{ |
AssistedQueryStatsTestData test_data[] = { |
@@ -707,7 +720,7 @@ TEST_F(AutocompleteProviderTest, GetDestinationURL) { |
// For the destination URL to have aqs parameters for query formulation time |
// and the field trial triggered bit, many conditions need to be satisfied. |
- AutocompleteMatch match(NULL, 1100, false, |
+ AutocompleteMatch match(nullptr, 1100, false, |
AutocompleteMatchType::SEARCH_SUGGEST); |
GURL url(GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456))); |
EXPECT_TRUE(url.path().empty()); |