15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h" 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider_listener.h" 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/omnibox/keyword_provider.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/omnibox/search_provider.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_switches.h" 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h" 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static std::ostream& operator<<(std::ostream& os, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutocompleteResult::const_iterator& it) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return os << static_cast<const AutocompleteMatch*>(&(*it)); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kResultsPerProvider = 3; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestTemplateURLKeyword[] = "t"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocomplete provider that provides known results. Note that this is 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// refcounted so that it can also be a task on the message loop. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestProvider : public AutocompleteProvider { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestProvider(int relevance, const base::string16& prefix, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 match_keyword) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : AutocompleteProvider(AutocompleteProvider::TYPE_SEARCH), 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch listener_(NULL), 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_(profile), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relevance_(relevance), 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix_(prefix), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_keyword_(match_keyword) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start(const AutocompleteInput& input, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool minimal_changes) OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_listener(AutocompleteProviderListener* listener) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_ = listener; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestProvider() {} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddResults(int start_at, int num); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddResultsWithSearchTermsArgs( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_at, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch::Type type, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TemplateURLRef::SearchTermsArgs& search_terms_args); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AutocompleteProviderListener* listener_; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile* profile_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int relevance_; 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 prefix_; 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 match_keyword_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::Start(const AutocompleteInput& input, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool minimal_changes) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (minimal_changes) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches_.clear(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate 4 results synchronously, the rest later. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResults(0, 1); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResultsWithSearchTermsArgs( 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1, 1, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("echo"))); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResultsWithSearchTermsArgs( 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2, 1, AutocompleteMatchType::NAVSUGGEST, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("nav"))); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResultsWithSearchTermsArgs( 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3, 1, AutocompleteMatchType::SEARCH_SUGGEST, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query"))); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (input.want_asynchronous_matches()) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = false; 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FROM_HERE, base::Bind(&TestProvider::Run, this)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::Run() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(kResultsPerProvider, 0U); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResults(1, kResultsPerProvider); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = true; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(listener_); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->OnProviderUpdate(true); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::AddResults(int start_at, int num) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResultsWithSearchTermsArgs(start_at, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num, 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutocompleteMatchType::URL_WHAT_YOU_TYPED, 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TemplateURLRef::SearchTermsArgs( 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16())); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::AddResultsWithSearchTermsArgs( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_at, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch::Type type, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TemplateURLRef::SearchTermsArgs& search_terms_args) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = start_at; i < num; i++) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch match(this, relevance_ - i, false, type); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.fill_into_edit = prefix_ + base::UTF8ToUTF16(base::IntToString(i)); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.destination_url = GURL(base::UTF16ToUTF8(match.fill_into_edit)); 138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch match.allowed_to_be_default_match = true; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.contents = match.fill_into_edit; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.contents_class.push_back( 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatchClassification(0, ACMatchClassification::NONE)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.description = match.fill_into_edit; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.description_class.push_back( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatchClassification(0, ACMatchClassification::NONE)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.search_terms_args.reset( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TemplateURLRef::SearchTermsArgs(search_terms_args)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!match_keyword_.empty()) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.keyword = match_keyword_; 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TemplateURLService* service = 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TemplateURLServiceFactory::GetForProfile(profile_); 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(match.GetTemplateURL(service, false) != NULL); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches_.push_back(match); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutocompleteProviderTest : public testing::Test, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct KeywordTestData { 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 fill_into_edit; 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 keyword; 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::string16 expected_associated_keyword; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AssistedQueryStatsTestData { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutocompleteMatch::Type match_type; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string expected_aqs; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers a test TemplateURL under the given keyword. 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RegisterTemplateURL(const base::string16 keyword, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& template_url); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resets |controller_| with two TestProviders. |provider1_ptr| and 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |provider2_ptr| are updated to point to the new providers if non-NULL. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetControllerWithTestProviders(bool same_destinations, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider** provider1_ptr, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider** provider2_ptr); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs a query on the input "a", and makes sure both providers' input is 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly collected. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunTest(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Constructs an AutocompleteResult from |match_data|, sets the |controller_| 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to pretend it was running against input |input|, calls the |controller_|'s 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // UpdateAssociatedKeywords, and checks that the matches have associated 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // keywords as expected. 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunKeywordTest(const base::string16& input, 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const KeywordTestData* match_data, 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t size); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunAssistedQueryStatsTest( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AssistedQueryStatsTestData* aqs_test_data, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RunQuery(const base::string16 query); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetControllerWithKeywordAndSearchProviders(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetControllerWithKeywordProvider(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunExactKeymatchTest(bool allow_exact_keyword_match); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CopyResults(); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns match.destination_url as it would be set by 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // AutocompleteController::UpdateMatchDestinationURL(). 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL GetDestinationURL(AutocompleteMatch match, 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::TimeDelta query_formulation_time) const; 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult result_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AutocompleteController> controller_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // content::NotificationObserver: 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile profile_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RegisterTemplateURL( 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 keyword, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& template_url) { 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (TemplateURLServiceFactory::GetForProfile(&profile_) == NULL) { 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &profile_, &TemplateURLServiceFactory::BuildInstanceFor); 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLData data; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.SetURL(template_url); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.SetKeyword(keyword); 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* default_t_url = new TemplateURL(data); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLService* turl_model = 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(&profile_); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) turl_model->Add(default_t_url); 2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu turl_model->SetUserSelectedDefaultSearchProvider(default_t_url); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) turl_model->Load(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLID default_provider_id = default_t_url->id(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, default_provider_id); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::ResetControllerWithTestProviders( 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool same_destinations, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider** provider1_ptr, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider** provider2_ptr) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: Move it outside this method, after refactoring the existing 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unit tests. Specifically: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (1) Make sure that AutocompleteMatch.keyword is set iff there is 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a corresponding call to RegisterTemplateURL; otherwise the 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // controller flow will crash; this practically means that 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RunTests/ResetControllerXXX/RegisterTemplateURL should 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be coordinated with each other. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (2) Inject test arguments rather than rely on the hardcoded values, e.g. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't rely on kResultsPerProvided and default relevance ordering 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (B > A). 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RegisterTemplateURL(base::ASCIIToUTF16(kTestTemplateURLKeyword), 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://aqs/{searchTerms}/{google:assistedQueryStats}"); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AutocompleteController::Providers providers; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct two new providers, with either the same or different prefixes. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider* provider1 = new TestProvider( 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kResultsPerProvider, 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("http://a"), 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_, 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(kTestTemplateURLKeyword)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) providers.push_back(provider1); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider* provider2 = new TestProvider( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kResultsPerProvider * 2, 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) same_destinations ? base::ASCIIToUTF16("http://a") 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : base::ASCIIToUTF16("http://b"), 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_, 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) providers.push_back(provider2); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the controller to contain our new providers. 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch controller_.reset(new AutocompleteController( 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &profile_, TemplateURLServiceFactory::GetForProfile(&profile_), NULL, 0)); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We're going to swap the providers vector, but the old vector should be 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // empty so no elements need to be freed at this point. 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller_->providers_.empty()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->providers_.swap(providers); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider1->set_listener(controller_.get()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider2->set_listener(controller_.get()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The providers don't complete synchronously, so listen for "result updated" 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<AutocompleteController>(controller_.get())); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (provider1_ptr) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *provider1_ptr = provider1; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (provider2_ptr) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *provider2_ptr = provider2; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest:: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithKeywordAndSearchProviders() { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_, &TemplateURLServiceFactory::BuildInstanceFor); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the default TemplateURL. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLData data; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.SetURL("http://defaultturl/{searchTerms}"); 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* default_t_url = new TemplateURL(data); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLService* turl_model = 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(&profile_); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) turl_model->Add(default_t_url); 3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu turl_model->SetUserSelectedDefaultSearchProvider(default_t_url); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLID default_provider_id = default_t_url->id(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, default_provider_id); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another TemplateURL for KeywordProvider. 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TemplateURLData data2; 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data2.short_name = base::ASCIIToUTF16("k"); 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data2.SetKeyword(base::ASCIIToUTF16("k")); 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data2.SetURL("http://keyword/{searchTerms}"); 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* keyword_t_url = new TemplateURL(data2); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) turl_model->Add(keyword_t_url); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, keyword_t_url->id()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.reset(new AutocompleteController( 330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &profile_, TemplateURLServiceFactory::GetForProfile(&profile_), NULL, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_KEYWORD | AutocompleteProvider::TYPE_SEARCH)); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::ResetControllerWithKeywordProvider() { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_, &TemplateURLServiceFactory::BuildInstanceFor); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLService* turl_model = 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(&profile_); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a TemplateURL for KeywordProvider. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLData data; 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.short_name = base::ASCIIToUTF16("foo.com"); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetKeyword(base::ASCIIToUTF16("foo.com")); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.SetURL("http://foo.com/{searchTerms}"); 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* keyword_t_url = new TemplateURL(data); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) turl_model->Add(keyword_t_url); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, keyword_t_url->id()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Make a TemplateURL for KeywordProvider that a shorter version of the 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // first. 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) data.short_name = base::ASCIIToUTF16("f"); 3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) data.SetKeyword(base::ASCIIToUTF16("f")); 3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) data.SetURL("http://f.com/{searchTerms}"); 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keyword_t_url = new TemplateURL(data); 3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) turl_model->Add(keyword_t_url); 3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_NE(0, keyword_t_url->id()); 3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another TemplateURL for KeywordProvider. 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.short_name = base::ASCIIToUTF16("bar.com"); 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetKeyword(base::ASCIIToUTF16("bar.com")); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.SetURL("http://bar.com/{searchTerms}"); 363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) keyword_t_url = new TemplateURL(data); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) turl_model->Add(keyword_t_url); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, keyword_t_url->id()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.reset(new AutocompleteController( 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &profile_, TemplateURLServiceFactory::GetForProfile(&profile_), NULL, 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AutocompleteProvider::TYPE_KEYWORD)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RunTest() { 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunQuery(base::ASCIIToUTF16("a")); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AutocompleteProviderTest::RunKeywordTest(const base::string16& input, 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const KeywordTestData* match_data, 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t size) { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches matches; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch match; 382c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch match.relevance = 1000; // Arbitrary non-zero value. 383c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch match.allowed_to_be_default_match = true; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.fill_into_edit = match_data[i].fill_into_edit; 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci match.transition = ui::PAGE_TRANSITION_KEYWORD; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.keyword = match_data[i].keyword; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches.push_back(match); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult result; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.AppendMatches(matches); 3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) controller_->input_ = AutocompleteInput( 3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) input, base::string16::npos, base::string16(), GURL(), 3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, 3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false, true, true, true, ChromeAutocompleteSchemeClassifier(&profile_)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->UpdateAssociatedKeywords(&result); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < result.size(); ++j) { 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(match_data[j].expected_associated_keyword, 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.match_at(j)->associated_keyword.get() ? 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.match_at(j)->associated_keyword->keyword : 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::string16()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RunAssistedQueryStatsTest( 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AssistedQueryStatsTestData* aqs_test_data, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare input. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kMaxRelevance = 1000; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches matches; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch match(NULL, kMaxRelevance - i, false, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aqs_test_data[i].match_type); 415c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch match.allowed_to_be_default_match = true; 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.keyword = base::ASCIIToUTF16(kTestTemplateURLKeyword); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.search_terms_args.reset( 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new TemplateURLRef::SearchTermsArgs(base::string16())); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches.push_back(match); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_.Reset(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_.AppendMatches(matches); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update AQS. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->UpdateAssistedQueryStats(&result_); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify data. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(aqs_test_data[i].expected_aqs, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_.match_at(i)->search_terms_args->assisted_query_stats); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutocompleteProviderTest::RunQuery(const base::string16 query) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_.Reset(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->Start(AutocompleteInput( 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) query, base::string16::npos, base::string16(), GURL(), 438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch metrics::OmniboxEventProto::INVALID_SPEC, true, false, true, true, 439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChromeAutocompleteSchemeClassifier(&profile_))); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!controller_->done()) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The message loop will terminate when all autocomplete input has been 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // collected. 44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RunExactKeymatchTest( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_exact_keyword_match) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the controller input which exactly matches the keyword provider we 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created in ResetControllerWithKeywordAndSearchProviders(). The default 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // match should thus be a search-other-engine match iff 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |allow_exact_keyword_match| is true. Regardless, the match should 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be from SearchProvider. (It provides all verbatim search matches, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keyword or not.) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->Start(AutocompleteInput( 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("k test"), base::string16::npos, base::string16(), 4576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL(), metrics::OmniboxEventProto::INVALID_SPEC, true, false, 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allow_exact_keyword_match, false, 459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChromeAutocompleteSchemeClassifier(&profile_))); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(controller_->done()); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(AutocompleteProvider::TYPE_SEARCH, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->result().default_match()->provider->type()); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(allow_exact_keyword_match ? 46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutocompleteMatchType::SEARCH_OTHER_ENGINE : 46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->result().default_match()->type); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutocompleteProviderTest::CopyResults() { 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result_.CopyFrom(controller_->result()); 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GURL AutocompleteProviderTest::GetDestinationURL( 474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AutocompleteMatch match, 475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::TimeDelta query_formulation_time) const { 4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) controller_->UpdateMatchDestinationURLWithQueryFormulationTime( 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) query_formulation_time, &match); 478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return match.destination_url; 479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::Observe( 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller_->done()) { 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CopyResults(); 48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the default selection is set properly when updating results. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, Query) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider* provider1 = NULL; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider* provider2 = NULL; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithTestProviders(false, &provider1, &provider2); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the default match gets set to the highest relevance match. The 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // highest relevance matches should come from the second provider. 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(kResultsPerProvider * 2, result_.size()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(result_.end(), result_.default_match()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(provider2, result_.default_match()->provider); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests assisted query stats. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, AssistedQueryStats) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithTestProviders(false, NULL, NULL); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(kResultsPerProvider * 2, result_.size()); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, check the results from the second provider, as they should not have 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // assisted query stats set. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kResultsPerProvider; ++i) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_.match_at(i)->search_terms_args->assisted_query_stats.empty()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first provider has a test keyword, so AQS should be non-empty. 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = kResultsPerProvider; i < kResultsPerProvider * 2; ++i) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE( 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_.match_at(i)->search_terms_args->assisted_query_stats.empty()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, RemoveDuplicates) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider* provider1 = NULL; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProvider* provider2 = NULL; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithTestProviders(true, &provider1, &provider2); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all the first provider's results were eliminated by the second 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provider's. 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResultsPerProvider, result_.size()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (AutocompleteResult::const_iterator i(result_.begin()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != result_.end(); ++i) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(provider2, i->provider); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, AllowExactKeywordMatch) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithKeywordAndSearchProviders(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunExactKeymatchTest(true); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunExactKeymatchTest(false); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Ensures matches from (only) the default search provider respect any extra 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// query params set on the command line. 547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(AutocompleteProviderTest, ExtraQueryParams) { 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetControllerWithKeywordAndSearchProviders(); 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CommandLine::ForCurrentProcess()->AppendSwitchASCII( 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kExtraSearchQueryParams, "a=b"); 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RunExactKeymatchTest(true); 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CopyResults(); 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(2U, result_.size()); 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("http://keyword/test", 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result_.match_at(0)->destination_url.possibly_invalid_spec()); 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("http://defaultturl/k%20test?a=b", 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result_.match_at(1)->destination_url.possibly_invalid_spec()); 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that redundant associated keywords are removed. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, RedundantKeywordsIgnoredInResult) { 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithKeywordProvider(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeywordTestData duplicate_url[] = { 5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("fo"), base::string16(), base::string16() }, 5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), 5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ASCIIToUTF16("foo.com") }, 5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), base::string16() } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("Duplicate url"); 5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunKeywordTest(base::ASCIIToUTF16("fo"), duplicate_url, 5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ARRAYSIZE_UNSAFE(duplicate_url)); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeywordTestData keyword_match[] = { 5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::ASCIIToUTF16("foo.com"), 5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::string16() }, 5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), base::string16() } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("Duplicate url with keyword match"); 5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunKeywordTest(base::ASCIIToUTF16("fo"), keyword_match, 5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ARRAYSIZE_UNSAFE(keyword_match)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeywordTestData multiple_keyword[] = { 5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("fo"), base::string16(), base::string16() }, 5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), 5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ASCIIToUTF16("foo.com") }, 5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), base::string16() }, 5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("bar.com"), base::string16(), 5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ASCIIToUTF16("bar.com") }, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("Duplicate url with multiple keywords"); 6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunKeywordTest(base::ASCIIToUTF16("fo"), multiple_keyword, 6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ARRAYSIZE_UNSAFE(multiple_keyword)); 6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that exact match keywords trump keywords associated with 6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the match. 6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AutocompleteProviderTest, ExactMatchKeywords) { 6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResetControllerWithKeywordProvider(); 6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) KeywordTestData keyword_match[] = { 6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), 6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ASCIIToUTF16("foo.com") } 6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("keyword match as usual"); 6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunKeywordTest(base::ASCIIToUTF16("fo"), keyword_match, 6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ARRAYSIZE_UNSAFE(keyword_match)); 6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The same result set with an input of "f" (versus "fo") should get 6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // a different associated keyword because "f" is an exact match for 6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // a keyword and that should trump the keyword normally associated with 6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // this match. 6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) KeywordTestData keyword_match[] = { 6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { base::ASCIIToUTF16("foo.com"), base::string16(), 6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ASCIIToUTF16("f") } 6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("keyword exact match"); 6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunKeywordTest(base::ASCIIToUTF16("f"), keyword_match, 6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ARRAYSIZE_UNSAFE(keyword_match)); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, UpdateAssistedQueryStats) { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetControllerWithTestProviders(false, NULL, NULL); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssistedQueryStatsTestData test_data[] = { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MSVC doesn't support zero-length arrays, so supply some dummy data. 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "" } 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("No matches"); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: We pass 0 here to ignore the dummy data above. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAssistedQueryStatsTest(test_data, 0); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssistedQueryStatsTestData test_data[] = { 6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) { AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "chrome..69i57" } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("One match"); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAssistedQueryStatsTest(test_data, ARRAYSIZE_UNSAFE(test_data)); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssistedQueryStatsTestData test_data[] = { 66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, 6617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "chrome..69i57j69i58j5l2j0l3j69i59" }, 66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::URL_WHAT_YOU_TYPED, 6637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "chrome..69i57j69i58j5l2j0l3j69i59" }, 66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::NAVSUGGEST, 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.2.69i57j69i58j5l2j0l3j69i59" }, 66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::NAVSUGGEST, 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.3.69i57j69i58j5l2j0l3j69i59" }, 66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::SEARCH_SUGGEST, 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.4.69i57j69i58j5l2j0l3j69i59" }, 67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::SEARCH_SUGGEST, 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.5.69i57j69i58j5l2j0l3j69i59" }, 67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::SEARCH_SUGGEST, 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.6.69i57j69i58j5l2j0l3j69i59" }, 67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { AutocompleteMatchType::SEARCH_HISTORY, 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.7.69i57j69i58j5l2j0l3j69i59" }, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("Multiple matches"); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAssistedQueryStatsTest(test_data, ARRAYSIZE_UNSAFE(test_data)); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutocompleteProviderTest, GetDestinationURL) { 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetControllerWithKeywordAndSearchProviders(); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For the destination URL to have aqs parameters for query formulation time 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and the field trial triggered bit, many conditions need to be satisfied. 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutocompleteMatch match(NULL, 1100, false, 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutocompleteMatchType::SEARCH_SUGGEST); 689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL url(GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456))); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(url.path().empty()); 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The protocol needs to be https. 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RegisterTemplateURL(base::ASCIIToUTF16(kTestTemplateURLKeyword), 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "https://aqs/{searchTerms}/{google:assistedQueryStats}"); 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(url.path().empty()); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There needs to be a keyword provider. 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.keyword = base::ASCIIToUTF16(kTestTemplateURLKeyword); 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(url.path().empty()); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // search_terms_args needs to be set. 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) match.search_terms_args.reset( 705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new TemplateURLRef::SearchTermsArgs(base::string16())); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(url.path().empty()); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // assisted_query_stats needs to have been previously set. 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) match.search_terms_args->assisted_query_stats = 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome.0.69i57j69i58j5l2j0l3j69i59"; 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j0j0&", url.path()); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test field trial triggered bit set. 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->search_provider_->field_trial_triggered_in_session_ = true; 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->search_provider_->field_trial_triggered_in_session()); 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j1j0&", url.path()); 721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Test page classification set. 7236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) controller_->input_.current_page_classification_ = 7246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) metrics::OmniboxEventProto::OTHER; 725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch controller_->search_provider_->field_trial_triggered_in_session_ = false; 726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE( 727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch controller_->search_provider_->field_trial_triggered_in_session()); 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j0j4&", url.path()); 730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Test page classification and field trial triggered set. 732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch controller_->search_provider_->field_trial_triggered_in_session_ = true; 733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE( 734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch controller_->search_provider_->field_trial_triggered_in_session()); 735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)); 736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j1j4&", url.path()); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 738