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