1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/autocomplete/history_quick_provider.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <algorithm> 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <functional> 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <set> 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string> 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <vector> 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/message_loop.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/utf_string_conversions.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autocomplete/autocomplete.h" 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/history/history.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/in_memory_url_index.h" 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/history/url_database.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/prefs/pref_service.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/pref_names.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h" 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process_test.h" 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/testing_profile.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing base::Time; 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing base::TimeDelta; 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct TestURLInfo { 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string url; 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string title; 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int visit_count; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int typed_count; 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int days_from_now; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} quick_test_db[] = { 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://www.google.com/", "Google", 3, 3, 0}, 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://slashdot.org/favorite_page.html", "Favorite page", 200, 100, 0}, 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://kerneltrap.org/not_very_popular.html", "Less popular", 4, 0, 0}, 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://freshmeat.net/unpopular.html", "Unpopular", 1, 1, 0}, 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://news.google.com/?ned=us&topic=n", "Google News - U.S.", 2, 2, 0}, 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://news.google.com/", "Google News", 1, 1, 0}, 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://foo.com/", "Dir", 5, 5, 0}, 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://foo.com/dir/", "Dir", 2, 1, 10}, 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://foo.com/dir/another/", "Dir", 5, 1, 0}, 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://foo.com/dir/another/again/", "Dir", 10, 0, 0}, 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://foo.com/dir/another/again/myfile.html", "File", 10, 2, 0}, 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://visitedest.com/y/a", "VA", 5, 1, 0}, 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://visitedest.com/y/b", "VB", 4, 1, 0}, 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://visitedest.com/x/c", "VC", 3, 1, 0}, 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://visitedest.com/x/d", "VD", 2, 1, 0}, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://visitedest.com/y/e", "VE", 1, 1, 0}, 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://typeredest.com/y/a", "TA", 3, 5, 0}, 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://typeredest.com/y/b", "TB", 3, 4, 0}, 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://typeredest.com/x/c", "TC", 3, 3, 0}, 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://typeredest.com/x/d", "TD", 3, 2, 0}, 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://typeredest.com/y/e", "TE", 3, 1, 0}, 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://daysagoest.com/y/a", "DA", 1, 1, 0}, 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://daysagoest.com/y/b", "DB", 1, 1, 1}, 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://daysagoest.com/x/c", "DC", 1, 1, 2}, 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://daysagoest.com/x/d", "DD", 1, 1, 3}, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://daysagoest.com/y/e", "DE", 1, 1, 4}, 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://abcdefghixyzjklmnopqrstuvw.com/a", "", 3, 1, 0}, 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"http://spaces.com/path%20with%20spaces/foo.html", "Spaces", 2, 2, 0}, 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://abcdefghijklxyzmnopqrstuvw.com/a", "", 3, 1, 0}, 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://abcdefxyzghijklmnopqrstuvw.com/a", "", 3, 1, 0}, 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://abcxyzdefghijklmnopqrstuvw.com/a", "", 3, 1, 0}, 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://xyzabcdefghijklmnopqrstuvw.com/a", "", 3, 1, 0}, 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen {"http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice", 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "Dogs & Cats & Mice", 1, 1, 0}, 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HistoryQuickProviderTest : public TestingBrowserProcessTest, 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public ACProviderListener { 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HistoryQuickProviderTest() 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ui_thread_(BrowserThread::UI, &message_loop_), 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_thread_(BrowserThread::FILE, &message_loop_) {} 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // ACProviderListener 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void OnProviderUpdate(bool updated_matches); 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected: 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void SetUp() { 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen profile_.reset(new TestingProfile()); 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick profile_->CreateHistoryService(true, false); 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick profile_->CreateBookmarkModel(true); 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick profile_->BlockUntilBookmarkModelLoaded(); 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick history_service_ = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(history_service_); 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen provider_ = new HistoryQuickProvider(this, profile_.get()); 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FillData(); 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void TearDown() { 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen provider_ = NULL; 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Fills test data into the history system. 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void FillData(); 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Runs an autocomplete query on |text| and checks to see that the returned 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // results' destination URLs match those provided. |expected_urls| does not 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // need to be in sorted order. 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void RunTest(const string16 text, 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<std::string> expected_urls, 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string expected_top_result); 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoopForUI message_loop_; 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread ui_thread_; 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread file_thread_; 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<TestingProfile> profile_; 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HistoryService* history_service_; 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ACMatches ac_matches_; // The resulting matches after running RunTest. 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<HistoryQuickProvider> provider_; 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid HistoryQuickProviderTest::OnProviderUpdate(bool updated_matches) { 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->Quit(); 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid HistoryQuickProviderTest::FillData() { 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick history::URLDatabase* db = history_service_->InMemoryDatabase(); 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(db != NULL); 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (size_t i = 0; i < arraysize(quick_test_db); ++i) { 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const TestURLInfo& cur = quick_test_db[i]; 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const GURL current_url(cur.url); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Time visit_time = Time::Now() - TimeDelta::FromDays(cur.days_from_now); 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick history::URLRow url_info(current_url); 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick url_info.set_title(UTF8ToUTF16(cur.title)); 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick url_info.set_visit_count(cur.visit_count); 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick url_info.set_typed_count(cur.typed_count); 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick url_info.set_last_visit(visit_time); 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick url_info.set_hidden(false); 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(db->AddURL(url_info)); 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick history_service_->AddPageWithDetails(current_url, UTF8ToUTF16(cur.title), 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cur.visit_count, cur.typed_count, 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick visit_time, false, 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick history::SOURCE_BROWSED); 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen history::InMemoryURLIndex* index = 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new history::InMemoryURLIndex(FilePath(FILE_PATH_LITERAL("/dummy"))); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PrefService* prefs = profile_->GetPrefs(); 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string languages(prefs->GetString(prefs::kAcceptLanguages)); 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick index->Init(db, languages); 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick provider_->SetIndexForTesting(index); 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SetShouldContain : public std::unary_function<const std::string&, 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set<std::string> > { 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit SetShouldContain(const ACMatches& matched_urls) { 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (ACMatches::const_iterator iter = matched_urls.begin(); 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick iter != matched_urls.end(); ++iter) 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick matches_.insert(iter->destination_url.spec()); 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void operator()(const std::string& expected) { 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, matches_.erase(expected)); 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set<std::string> LeftOvers() const { return matches_; } 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set<std::string> matches_; 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid HistoryQuickProviderTest::RunTest(const string16 text, 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<std::string> expected_urls, 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string expected_top_result) { 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::sort(expected_urls.begin(), expected_urls.end()); 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->RunAllPending(); 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutocompleteInput input(text, string16(), false, false, true, 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutocompleteInput::ALL_MATCHES); 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick provider_->Start(input, false); 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(provider_->done()); 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ac_matches_ = provider_->matches(); 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // We should have gotten back at most AutocompleteProvider::kMaxMatches. 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_LE(ac_matches_.size(), AutocompleteProvider::kMaxMatches); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If the number of expected and actual matches aren't equal then we need 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // test no further, but let's do anyway so that we know which URLs failed. 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected_urls.size(), ac_matches_.size()); 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Verify that all expected URLs were found and that all found URLs 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // were expected. 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set<std::string> leftovers = 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for_each(expected_urls.begin(), expected_urls.end(), 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetShouldContain(ac_matches_)).LeftOvers(); 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0U, leftovers.size()); 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // See if we got the expected top scorer. 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!ac_matches_.empty()) { 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::partial_sort(ac_matches_.begin(), ac_matches_.begin() + 1, 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ac_matches_.end(), AutocompleteMatch::MoreRelevant); 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected_top_result, ac_matches_[0].destination_url.spec()); 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 212731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(HistoryQuickProviderTest, SimpleSingleMatch) { 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 text(ASCIIToUTF16("slashdot")); 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string expected_url("http://slashdot.org/favorite_page.html"); 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<std::string> expected_urls; 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back(expected_url); 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunTest(text, expected_urls, expected_url); 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 220731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(HistoryQuickProviderTest, MultiMatch) { 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 text(ASCIIToUTF16("foo")); 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<std::string> expected_urls; 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Scores high because of typed_count. 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back("http://foo.com/"); 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Scores high because of visit count. 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back("http://foo.com/dir/another/"); 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Scores high because of high visit count. 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back("http://foo.com/dir/another/again/myfile.html"); 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunTest(text, expected_urls, "http://foo.com/"); 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 232731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(HistoryQuickProviderTest, StartRelativeMatch) { 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 text(ASCIIToUTF16("xyz")); 234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<std::string> expected_urls; 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back("http://xyzabcdefghijklmnopqrstuvw.com/a"); 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back("http://abcxyzdefghijklmnopqrstuvw.com/a"); 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_urls.push_back("http://abcdefxyzghijklmnopqrstuvw.com/a"); 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunTest(text, expected_urls, "http://xyzabcdefghijklmnopqrstuvw.com/a"); 239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(HistoryQuickProviderTest, VisitCountMatches) { 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 text(ASCIIToUTF16("visitedest")); 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> expected_urls; 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://visitedest.com/y/a"); 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://visitedest.com/y/b"); 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://visitedest.com/x/c"); 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RunTest(text, expected_urls, "http://visitedest.com/y/a"); 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(HistoryQuickProviderTest, TypedCountMatches) { 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 text(ASCIIToUTF16("typeredest")); 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> expected_urls; 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://typeredest.com/y/a"); 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://typeredest.com/y/b"); 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://typeredest.com/x/c"); 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RunTest(text, expected_urls, "http://typeredest.com/y/a"); 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(HistoryQuickProviderTest, DaysAgoMatches) { 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 text(ASCIIToUTF16("daysagoest")); 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<std::string> expected_urls; 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://daysagoest.com/y/a"); 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://daysagoest.com/y/b"); 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back("http://daysagoest.com/x/c"); 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RunTest(text, expected_urls, "http://daysagoest.com/y/a"); 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(HistoryQuickProviderTest, EncodingLimitMatch) { 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 text(ASCIIToUTF16("ice")); 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> expected_urls; 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string url( 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice"); 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_urls.push_back(url); 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RunTest(text, expected_urls, url); 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Verify that the matches' ACMatchClassifications offsets are in range. 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ACMatchClassifications content(ac_matches_[0].contents_class); 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The max offset accounts for 6 occurrences of '%20' plus the 'http://'. 278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const size_t max_offset = url.size() - ((6 * 2) + 7); 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (ACMatchClassifications::const_iterator citer = content.begin(); 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen citer != content.end(); ++citer) 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_LT(citer->offset, max_offset); 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ACMatchClassifications description(ac_matches_[0].description_class); 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string page_title("Dogs & Cats & Mice"); 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (ACMatchClassifications::const_iterator diter = description.begin(); 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen diter != description.end(); ++diter) 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_LT(diter->offset, page_title.size()); 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(HistoryQuickProviderTest, Spans) { 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Test SpansFromTermMatch 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::TermMatches matches_a; 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Simulates matches: '.xx.xxx..xx...xxxxx..' which will test no match at 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // either beginning or end as well as adjacent matches. 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_a.push_back(history::TermMatch(1, 1, 2)); 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_a.push_back(history::TermMatch(2, 4, 3)); 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_a.push_back(history::TermMatch(3, 9, 1)); 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_a.push_back(history::TermMatch(3, 10, 1)); 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_a.push_back(history::TermMatch(4, 14, 5)); 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ACMatchClassifications spans_a = 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HistoryQuickProvider::SpansFromTermMatch(matches_a, 20); 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ACMatch spans should be: 'NM-NM---N-M-N--M----N-' 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(9U, spans_a.size()); 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0U, spans_a[0].offset); 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::NONE, spans_a[0].style); 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(1U, spans_a[1].offset); 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::MATCH, spans_a[1].style); 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(3U, spans_a[2].offset); 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::NONE, spans_a[2].style); 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(4U, spans_a[3].offset); 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::MATCH, spans_a[3].style); 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(7U, spans_a[4].offset); 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::NONE, spans_a[4].style); 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(9U, spans_a[5].offset); 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::MATCH, spans_a[5].style); 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(11U, spans_a[6].offset); 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::NONE, spans_a[6].style); 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(14U, spans_a[7].offset); 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::MATCH, spans_a[7].style); 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(19U, spans_a[8].offset); 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::NONE, spans_a[8].style); 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Simulates matches: 'xx.xx' which will test matches at both beginning an 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // end. 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::TermMatches matches_b; 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_b.push_back(history::TermMatch(1, 0, 2)); 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen matches_b.push_back(history::TermMatch(2, 3, 2)); 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ACMatchClassifications spans_b = 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HistoryQuickProvider::SpansFromTermMatch(matches_b, 5); 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ACMatch spans should be: 'M-NM-' 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(3U, spans_b.size()); 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0U, spans_b[0].offset); 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::MATCH, spans_b[0].style); 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(2U, spans_b[1].offset); 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::NONE, spans_b[1].style); 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(3U, spans_b[2].offset); 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ACMatchClassification::MATCH, spans_b[2].style); 336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 337