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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/history_quick_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/format_macros.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autocomplete/history_url_provider.h"
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/history/history_backend.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/history/history_database.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_url_index.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/url_index_private_data.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/search_engines/chrome_template_url_service_client.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/history/core/browser/url_database.h"
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h"
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h"
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/omnibox/autocomplete_result.h"
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_terms_data.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/notification_service.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/test/test_utils.h"
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "sql/transaction.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestURLInfo {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int typed_count;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int days_from_now;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} quick_test_db[] = {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.google.com/", "Google", 3, 3, 0},
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://slashdot.org/favorite_page.html", "Favorite page", 200, 100, 0},
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://kerneltrap.org/not_very_popular.html", "Less popular", 4, 0, 0},
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://freshmeat.net/unpopular.html", "Unpopular", 1, 1, 0},
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://news.google.com/?ned=us&topic=n", "Google News - U.S.", 2, 2, 0},
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://news.google.com/", "Google News", 1, 1, 0},
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://foo.com/", "Dir", 200, 100, 0},
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://foo.com/dir/", "Dir", 2, 1, 10},
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://foo.com/dir/another/", "Dir", 10, 5, 0},
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://foo.com/dir/another/again/", "Dir", 5, 1, 0},
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://foo.com/dir/another/again/myfile.html", "File", 3, 1, 0},
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/y/a", "VA", 10, 1, 20},
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/y/b", "VB", 9, 1, 20},
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/x/c", "VC", 8, 1, 20},
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/x/d", "VD", 7, 1, 20},
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/y/e", "VE", 6, 1, 20},
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/y/a", "TA", 5, 5, 0},
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/y/b", "TB", 5, 4, 0},
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/x/c", "TC", 5, 3, 0},
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/x/d", "TD", 5, 2, 0},
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/y/e", "TE", 5, 1, 0},
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/y/a", "DA", 1, 1, 0},
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/y/b", "DB", 1, 1, 1},
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/x/c", "DC", 1, 1, 2},
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/x/d", "DD", 1, 1, 3},
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/y/e", "DE", 1, 1, 4},
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcdefghixyzjklmnopqrstuvw.com/a", "", 3, 1, 0},
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://spaces.com/path%20with%20spaces/foo.html", "Spaces", 2, 2, 0},
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcdefghijklxyzmnopqrstuvw.com/a", "", 3, 1, 0},
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcdefxyzghijklmnopqrstuvw.com/a", "", 3, 1, 0},
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcxyzdefghijklmnopqrstuvw.com/a", "", 3, 1, 0},
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://xyzabcdefghijklmnopqrstuvw.com/a", "", 3, 1, 0},
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice",
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "Dogs & Cats & Mice & Other Animals", 1, 1, 0},
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"https://monkeytrap.org/", "", 3, 1, 0},
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://popularsitewithpathonly.com/moo",
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   "popularsitewithpathonly.com/moo", 50, 50, 0},
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://popularsitewithroot.com/", "popularsitewithroot.com", 50, 50, 0},
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://testsearch.com/?q=thequery", "Test Search Engine", 10, 10, 0},
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://testsearch.com/", "Test Search Engine", 9, 9, 0},
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {"http://anotherengine.com/?q=thequery", "Another Search Engine", 8, 8, 0},
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The encoded stuff between /wiki/ and the # is 第二次世界大戦
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {"http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%B8%96%E7%95"
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu   "%8C%E5%A4%A7%E6%88%A6#.E3.83.B4.E3.82.A7.E3.83.AB.E3.82.B5.E3.82.A4.E3."
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu   "83.A6.E4.BD.93.E5.88.B6", "Title Unimportant", 2, 2, 0}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass HistoryQuickProviderTest : public testing::Test {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryQuickProviderTest()
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(BrowserThread::FILE, &message_loop_) {}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SetShouldContain : public std::unary_function<const std::string&,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      std::set<std::string> > {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit SetShouldContain(const ACMatches& matched_urls);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void operator()(const std::string& expected);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<std::string> LeftOvers() const { return matches_; }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<std::string> matches_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static KeyedService* CreateTemplateURLService(
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* context) {
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile = static_cast<Profile*>(context);
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return new TemplateURLService(
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile->GetPrefs(), make_scoped_ptr(new SearchTermsData), NULL,
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        scoped_ptr<TemplateURLServiceClient>(
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            new ChromeTemplateURLServiceClient(profile)),
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        NULL, NULL, base::Closure());
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetTestData(size_t* data_count, TestURLInfo** test_data);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills test data into the history system.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillData();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs an autocomplete query on |text| and checks to see that the returned
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results' destination URLs match those provided. |expected_urls| does not
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to be in sorted order.
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RunTest(const base::string16 text,
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               bool prevent_inline_autocomplete,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               std::vector<std::string> expected_urls,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool can_inline_top_result,
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               base::string16 expected_fill_into_edit,
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               base::string16 autocompletion);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // As above, simply with a cursor position specified.
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RunTestWithCursor(const base::string16 text,
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         const size_t cursor_position,
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         bool prevent_inline_autocomplete,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         std::vector<std::string> expected_urls,
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         bool can_inline_top_result,
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         base::string16 expected_fill_into_edit,
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         base::string16 autocompletion);
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  history::HistoryBackend* history_backend() {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return history_service_->history_backend_.get();
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history_service_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatches ac_matches_;  // The resulting matches after running RunTest.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HistoryQuickProvider> provider_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::SetUp() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.reset(new TestingProfile());
183bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  ASSERT_TRUE(profile_->CreateHistoryService(true, false));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->CreateBookmarkModel(true);
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  test::WaitForBookmarkModelToLoad(
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      BookmarkModelFactory::GetForProfile(profile_.get()));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->BlockUntilHistoryIndexIsRefreshed();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history_service_ =
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryServiceFactory::GetForProfile(profile_.get(),
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Profile::EXPLICIT_ACCESS);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(history_service_);
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  provider_ = new HistoryQuickProvider(profile_.get());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile_.get(), &HistoryQuickProviderTest::CreateTemplateURLService);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillData();
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider_->GetIndex()->RebuildFromHistory(history_backend()->db());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::TearDown() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = NULL;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::GetTestData(size_t* data_count,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           TestURLInfo** test_data) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_count);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(test_data);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *data_count = arraysize(quick_test_db);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *test_data = &quick_test_db[0];
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::FillData() {
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sql::Connection& db(history_backend()->db()->GetDB());
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(db.is_open());
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t data_count = 0;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLInfo* test_data = NULL;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetTestData(&data_count, &test_data);
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t visit_id = 1;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < data_count; ++i) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestURLInfo& cur(test_data[i]);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Time visit_time = Time::Now() - TimeDelta::FromDays(cur.days_from_now);
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    sql::Transaction transaction(&db);
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Add URL.
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    transaction.Begin();
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string sql_cmd_line = base::StringPrintf(
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "INSERT INTO \"urls\" VALUES(%" PRIuS ", \'%s\', \'%s\', %d, %d, %"
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        PRId64 ", 0, 0)",
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        i + 1, cur.url.c_str(), cur.title.c_str(), cur.visit_count,
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        cur.typed_count, visit_time.ToInternalValue());
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    sql::Statement sql_stmt(db.GetUniqueStatement(sql_cmd_line.c_str()));
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_TRUE(sql_stmt.Run());
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    transaction.Commit();
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Add visits.
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    for (int j = 0; j < cur.visit_count; ++j) {
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // Assume earlier visits are at one-day intervals.
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      visit_time -= TimeDelta::FromDays(1);
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      transaction.Begin();
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // Mark the most recent |cur.typed_count| visits as typed.
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string sql_cmd_line = base::StringPrintf(
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          "INSERT INTO \"visits\" VALUES(%" PRIuS ", %" PRIuS ", %" PRId64
243bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch          ", 0, %d, 0, 1)",
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          visit_id++, i + 1, visit_time.ToInternalValue(),
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (j < cur.typed_count) ? ui::PAGE_TRANSITION_TYPED :
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  ui::PAGE_TRANSITION_LINK);
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sql::Statement sql_stmt(db.GetUniqueStatement(sql_cmd_line.c_str()));
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_TRUE(sql_stmt.Run());
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      transaction.Commit();
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryQuickProviderTest::SetShouldContain::SetShouldContain(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matched_urls) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator iter = matched_urls.begin();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != matched_urls.end(); ++iter)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches_.insert(iter->destination_url.spec());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::SetShouldContain::operator()(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, matches_.erase(expected))
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Results did not contain '" << expected << "' but should have.";
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HistoryQuickProviderTest::RunTest(
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16 text,
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool prevent_inline_autocomplete,
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<std::string> expected_urls,
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool can_inline_top_result,
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::string16 expected_fill_into_edit,
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::string16 expected_autocompletion) {
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RunTestWithCursor(text, base::string16::npos, prevent_inline_autocomplete,
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    expected_urls, can_inline_top_result,
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    expected_fill_into_edit, expected_autocompletion);
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HistoryQuickProviderTest::RunTestWithCursor(
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16 text,
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const size_t cursor_position,
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool prevent_inline_autocomplete,
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<std::string> expected_urls,
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool can_inline_top_result,
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::string16 expected_fill_into_edit,
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::string16 expected_autocompletion) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE(text);  // Minimal hint to query being run.
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AutocompleteInput input(text, cursor_position, base::string16(),
2916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          GURL(), metrics::OmniboxEventProto::INVALID_SPEC,
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          prevent_inline_autocomplete, false, true, true,
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ChromeAutocompleteSchemeClassifier(profile_.get()));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->Start(input, false);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(provider_->done());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ac_matches_ = provider_->matches();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have gotten back at most AutocompleteProvider::kMaxMatches.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(ac_matches_.size(), AutocompleteProvider::kMaxMatches);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the number of expected and actual matches aren't equal then we need
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test no further, but let's do anyway so that we know which URLs failed.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_urls.size(), ac_matches_.size());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that all expected URLs were found and that all found URLs
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // were expected.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> leftovers =
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for_each(expected_urls.begin(), expected_urls.end(),
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               SetShouldContain(ac_matches_)).LeftOvers();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, leftovers.size()) << "There were " << leftovers.size()
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << " unexpected results, one of which was: '"
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << *(leftovers.begin()) << "'.";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (expected_urls.empty())
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that we got the results in the order expected.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int best_score = ac_matches_.begin()->relevance + 1;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = 0;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string>::const_iterator expected = expected_urls.begin();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator actual = ac_matches_.begin();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       actual != ac_matches_.end() && expected != expected_urls.end();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++actual, ++expected, ++i) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(*expected, actual->destination_url.spec())
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "For result #" << i << " we got '" << actual->destination_url.spec()
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "' but expected '" << *expected << "'.";
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(actual->relevance, best_score)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "At result #" << i << " (url=" << actual->destination_url.spec()
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "), we noticed scores are not monotonically decreasing.";
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    best_score = actual->relevance;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_EQ(can_inline_top_result, ac_matches_[0].allowed_to_be_default_match);
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (can_inline_top_result)
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_autocompletion, ac_matches_[0].inline_autocompletion);
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(expected_fill_into_edit, ac_matches_[0].fill_into_edit);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, SimpleSingleMatch) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://slashdot.org/favorite_page.html");
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot"), false, expected_urls, true,
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("slashdot.org/favorite_page.html"),
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  ASCIIToUTF16(".org/favorite_page.html"));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
348116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(HistoryQuickProviderTest, SingleMatchWithCursor) {
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<std::string> expected_urls;
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  expected_urls.push_back("http://slashdot.org/favorite_page.html");
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // With cursor after "slash", we should retrieve the desired result but it
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // should not be allowed to be the default match.
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RunTestWithCursor(ASCIIToUTF16("slashfavorite_page.html"), 5, false,
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    expected_urls, false,
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    ASCIIToUTF16("slashdot.org/favorite_page.html"),
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    base::string16());
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If the cursor is in the middle of a valid URL suggestion, it should be
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // allowed to be the default match.  The inline completion will be empty
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // though as no completion is necessary.
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RunTestWithCursor(ASCIIToUTF16("slashdot.org/favorite_page.html"), 5, false,
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    expected_urls, true,
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    ASCIIToUTF16("slashdot.org/favorite_page.html"),
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    base::string16());
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
366e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(HistoryQuickProviderTest, WordBoundariesWithPunctuationMatch) {
367e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  std::vector<std::string> expected_urls;
368e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  expected_urls.push_back("http://popularsitewithpathonly.com/moo");
369e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  RunTest(ASCIIToUTF16("/moo"), false, expected_urls, false,
370e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          ASCIIToUTF16("popularsitewithpathonly.com/moo"), base::string16());
371e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
372e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, MultiTermTitleMatch) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice");
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("mice other animals"), false, expected_urls, false,
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("cda.com/Dogs Cats Gorillas Sea Slugs and Mice"),
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, NonWordLastCharacterMatch) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_url("http://slashdot.org/favorite_page.html");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back(expected_url);
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot.org/"), false, expected_urls, true,
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("slashdot.org/favorite_page.html"),
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       ASCIIToUTF16("favorite_page.html"));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, MultiMatch) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of typed_count.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://foo.com/");
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of visit count.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://foo.com/dir/another/");
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of high visit count.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://foo.com/dir/another/again/");
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("foo"), false, expected_urls, true,
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("foo.com"), ASCIIToUTF16(".com"));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, StartRelativeMatch) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://xyzabcdefghijklmnopqrstuvw.com/a");
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("xyza"), false, expected_urls, true,
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("xyzabcdefghijklmnopqrstuvw.com/a"),
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              ASCIIToUTF16("bcdefghijklmnopqrstuvw.com/a"));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, EncodingMatch) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://spaces.com/path%20with%20spaces/foo.html");
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("path with spaces"), false, expected_urls, false,
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("spaces.com/path with spaces/foo.html"),
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HistoryQuickProviderTest, ContentsClass) {
4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::vector<std::string> expected_urls;
4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  expected_urls.push_back(
4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%B8%96%E7"
4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "%95%8C%E5%A4%A7%E6%88%A6#.E3.83.B4.E3.82.A7.E3.83.AB.E3.82.B5.E3.82."
4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "A4.E3.83.A6.E4.BD.93.E5.88.B6");
4255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunTest(base::UTF8ToUTF16("第二 e3"), false, expected_urls, false,
4265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::UTF8ToUTF16("ja.wikipedia.org/wiki/第二次世界大戦#.E3.83.B4.E3."
4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            "82.A7.E3.83.AB.E3.82.B5.E3.82.A4.E3.83.A6.E4.BD."
4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            "93.E5.88.B6"),
4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::string16());
4305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef NDEBUG
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ac_matches_[0].Validate();
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Verify that contents_class divides the string in the right places.
4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // [22, 24) is the "第二".  All the other pairs are the "e3".
4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ACMatchClassifications contents_class(ac_matches_[0].contents_class);
4365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  size_t expected_offsets[] = { 0, 22, 24, 31, 33, 40, 42, 49, 51, 58, 60, 67,
4375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                69, 76, 78 };
4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // ScoredHistoryMatch may not highlight all the occurrences of these terms
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // because it only highlights terms at word breaks, and it only stores word
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // breaks up to some specified number of characters (50 at the time of this
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // comment).  This test is written flexibly so it still will pass if we
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // increase that number in the future.  Regardless, we require the first
4435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // five offsets to be correct--in this example these cover at least one
4445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // occurrence of each term.
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_LE(contents_class.size(), arraysize(expected_offsets));
4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_GE(contents_class.size(), 5u);
4475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < contents_class.size(); ++i)
4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(expected_offsets[i], contents_class[i].offset);
4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, VisitCountMatches) {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://visitedest.com/y/a");
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://visitedest.com/y/b");
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://visitedest.com/x/c");
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("visitedest"), false, expected_urls, true,
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("visitedest.com/y/a"),
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com/y/a"));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, TypedCountMatches) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://typeredest.com/y/a");
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://typeredest.com/y/b");
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://typeredest.com/x/c");
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("typeredest"), false, expected_urls, true,
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("typeredest.com/y/a"),
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com/y/a"));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, DaysAgoMatches) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://daysagoest.com/y/a");
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://daysagoest.com/y/b");
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://daysagoest.com/x/c");
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("daysagoest"), false, expected_urls, true,
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("daysagoest.com/y/a"),
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com/y/a"));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, EncodingLimitMatch) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url(
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice");
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First check that a mid-word match yield no results.
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("ice"), false, expected_urls, false,
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("cda.com/Dogs Cats Gorillas Sea Slugs and Mice"),
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Then check that we get results when the match is at a word start
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that is present because of an encoded separate (%20 = space).
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back(url);
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("Mice"), false, expected_urls, false,
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("cda.com/Dogs Cats Gorillas Sea Slugs and Mice"),
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the matches' ACMatchClassifications offsets are in range.
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications content(ac_matches_[0].contents_class);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The max offset accounts for 6 occurrences of '%20' plus the 'http://'.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t max_offset = url.length() - ((6 * 2) + 7);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatchClassifications::const_iterator citer = content.begin();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       citer != content.end(); ++citer)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(citer->offset, max_offset);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications description(ac_matches_[0].description_class);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string page_title("Dogs & Cats & Mice & Other Animals");
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatchClassifications::const_iterator diter = description.begin();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       diter != description.end(); ++diter)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(diter->offset, page_title.length());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, Spans) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test SpansFromTermMatch
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TermMatches matches_a;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates matches: '.xx.xxx..xx...xxxxx..' which will test no match at
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // either beginning or end as well as adjacent matches.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(1, 1, 2));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(2, 4, 3));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(3, 9, 1));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(3, 10, 1));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(4, 14, 5));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_a =
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryQuickProvider::SpansFromTermMatch(matches_a, 20, false);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be: 'NM-NM---N-M-N--M----N-'
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(9U, spans_a.size());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_a[0].offset);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[0].style);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, spans_a[1].offset);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[1].style);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, spans_a[2].offset);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[2].style);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, spans_a[3].offset);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[3].style);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(7U, spans_a[4].offset);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[4].style);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_a[5].offset);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[5].style);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11U, spans_a[6].offset);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[6].style);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(14U, spans_a[7].offset);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[7].style);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(19U, spans_a[8].offset);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[8].style);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates matches: 'xx.xx' which will test matches at both beginning and
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // end.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TermMatches matches_b;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_b.push_back(history::TermMatch(1, 0, 2));
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_b.push_back(history::TermMatch(2, 3, 2));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_b =
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryQuickProvider::SpansFromTermMatch(matches_b, 5, true);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be: 'M-NM-'
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, spans_b.size());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_b[0].offset);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH | ACMatchClassification::URL,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_b[0].style);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_b[1].offset);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_b[1].style);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, spans_b[2].offset);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH | ACMatchClassification::URL,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_b[2].style);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, DeleteMatch) {
561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GURL test_url("http://slashdot.org/favorite_page.html");
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  expected_urls.push_back(test_url.spec());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill up ac_matches_; we don't really care about the test yet.
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot"), false, expected_urls, true,
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("slashdot.org/favorite_page.html"),
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  ASCIIToUTF16(".org/favorite_page.html"));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, ac_matches_.size());
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(history_backend()->GetURL(test_url, NULL));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->DeleteMatch(ac_matches_[0]);
571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Check that the underlying URL is deleted from the history DB (this implies
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // that all visits are gone as well). Also verify that a deletion notification
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // is sent, in response to which the secondary data stores (InMemoryDatabase,
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // InMemoryURLIndex) will drop any data they might have pertaining to the URL.
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // To ensure that the deletion has been propagated everywhere before we start
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // verifying post-deletion states, first wait until we see the notification.
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::WindowedNotificationObserver observer(
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        chrome::NOTIFICATION_HISTORY_URLS_DELETED,
580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        content::NotificationService::AllSources());
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  observer.Wait();
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(history_backend()->GetURL(test_url, NULL));
583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Just to be on the safe side, explicitly verify that we have deleted enough
585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // data so that we will not be serving the same result again.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.clear();
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot"), false, expected_urls, true,
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("NONE EXPECTED"), base::string16());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, PreventBeatingURLWhatYouTypedMatch) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.clear();
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://popularsitewithroot.com/");
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname (no path) that he/she has visited
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before, we should make sure that all HistoryQuickProvider results
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // have scores less than what HistoryURLProvider will assign the
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // URL-what-you-typed match.
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.com"), false, expected_urls, true,
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"), base::string16());
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForBestInlineableResult);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that if the user didn't quite enter the full hostname, this
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hostname would've normally scored above the URL-what-you-typed match.
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.c"), false, expected_urls, true,
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"),
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               ASCIIToUTF16("om"));
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(ac_matches_[0].relevance,
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.clear();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back("http://popularsitewithpathonly.com/moo");
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname of a host that he/she has visited
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but never visited the root page of, we should make sure that all
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // HistoryQuickProvider results have scores less than what the
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // HistoryURLProvider will assign the URL-what-you-typed match.
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com"), false, expected_urls,
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true,
621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithpathonly.com/moo"),
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ASCIIToUTF16("/moo"));
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
6247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            HistoryURLProvider::kScoreForUnvisitedIntranetResult);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the same thing happens if the user adds a / to end of the
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hostname.
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com/"), false, expected_urls,
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true, ASCIIToUTF16("popularsitewithpathonly.com/moo"),
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            ASCIIToUTF16("moo"));
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            HistoryURLProvider::kScoreForUnvisitedIntranetResult);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that if the user didn't quite enter the full hostname, this
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page would've normally scored above the URL-what-you-typed match.
636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.co"), false, expected_urls,
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true, ASCIIToUTF16("popularsitewithpathonly.com/moo"),
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          ASCIIToUTF16("m/moo"));
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(ac_matches_[0].relevance,
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname + path that he/she has not visited
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before (but visited other things on the host), we can allow
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // inline autocompletions.
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com/mo"), false, expected_urls,
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true,
647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithpathonly.com/moo"),
648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                        ASCIIToUTF16("o"));
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(ac_matches_[0].relevance,
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname + path that he/she has visited
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before, we should make sure that all HistoryQuickProvider results
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // have scores less than what the HistoryURLProvider will assign
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the URL-what-you-typed match.
656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com/moo"), false,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expected_urls, true,
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithpathonly.com/moo"), base::string16());
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForBestInlineableResult);
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, PreventInlineAutocomplete) {
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::vector<std::string> expected_urls;
665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  expected_urls.push_back("http://popularsitewithroot.com/");
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Check that the desired URL is normally allowed to be the default match
668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // against input that is a prefex of the URL.
669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithr"), false, expected_urls, true,
670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"),
671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          ASCIIToUTF16("oot.com"));
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Check that it's not allowed to be the default match if
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // prevent_inline_autocomplete is true.
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithr"), true, expected_urls, false,
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"),
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          ASCIIToUTF16("oot.com"));
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // But the exact hostname can still match even if prevent inline autocomplete
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // is true.  i.e., there's no autocompletion necessary; this is effectively
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // URL-what-you-typed.
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.com"), true, expected_urls, true,
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"), base::string16());
684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The above still holds even with an extra trailing slash.
686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.com/"), true, expected_urls, true,
687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"), base::string16());
688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryQuickProviderTest, CullSearchResults) {
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up a default search engine.
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURLData data;
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.SetKeyword(ASCIIToUTF16("TestEngine"));
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.SetURL("http://testsearch.com/?q={searchTerms}");
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURLService* template_url_service =
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(profile_.get());
697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL* template_url = new TemplateURL(data);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template_url_service->Add(template_url);
6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  template_url_service->SetUserSelectedDefaultSearchProvider(template_url);
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template_url_service->Load();
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A search results page should not be returned when typing a query.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> expected_urls;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back("http://anotherengine.com/?q=thequery");
705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("thequery"), false, expected_urls, false,
706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("anotherengine.com/?q=thequery"), base::string16());
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A search results page should not be returned when typing the engine URL.
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.clear();
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back("http://testsearch.com/");
711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("testsearch"), false, expected_urls, true,
712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("testsearch.com"),
713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com"));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HQPOrderingTest -------------------------------------------------------------
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLInfo ordering_test_db[] = {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/tlpd/korean/games/21648_bisu_vs_iris", "", 6, 3,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      256},
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.amazon.com/", "amazon.com: online shopping for electronics, "
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "apparel, computers, books, dvds & more", 20, 20, 10},
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/forum/viewmessage.php?topic_id=52045&"
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "currentpage=83", "google images", 6, 6, 0},
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.tempurpedic.com/", "tempur-pedic", 7, 7, 0},
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamfortress.com/", "", 5, 5, 6},
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.rottentomatoes.com/", "", 3, 3, 7},
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://music.google.com/music/listen?u=0#start_pl", "", 3, 3, 9},
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"https://www.emigrantdirect.com/", "high interest savings account, high "
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "yield savings - emigrantdirect", 5, 5, 3},
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://store.steampowered.com/", "", 6, 6, 1},
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://techmeme.com/", "techmeme", 111, 110, 4},
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/tlpd", "team liquid progaming database", 15, 15,
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2},
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://store.steampowered.com/", "the steam summer camp sale", 6, 6, 1},
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/tlpd/korean/players", "tlpd - bw korean - player "
7377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "index", 25, 7, 219},
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://slashdot.org/", "slashdot: news for nerds, stuff that matters", 3, 3,
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      6},
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://translate.google.com/", "google translate", 3, 3, 0},
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://arstechnica.com/", "ars technica", 3, 3, 3},
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.rottentomatoes.com/", "movies | movie trailers | reviews - "
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "rotten tomatoes", 3, 3, 7},
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/", "team liquid - starcraft 2 and brood war pro "
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "gaming news", 26, 25, 3},
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://metaleater.com/", "metaleater", 4, 3, 8},
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://half.com/", "half.com: textbooks , books , music , movies , games , "
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "video games", 4, 4, 6},
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://teamliquid.net/", "team liquid - starcraft 2 and brood war pro "
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "gaming news", 8, 5, 9},
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HQPOrderingTest : public HistoryQuickProviderTest {
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetTestData(size_t* data_count,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestURLInfo** test_data) OVERRIDE;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HQPOrderingTest::GetTestData(size_t* data_count, TestURLInfo** test_data) {
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_count);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(test_data);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *data_count = arraysize(ordering_test_db);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *test_data = &ordering_test_db[0];
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HQPOrderingTest, TEMatch) {
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://techmeme.com/");
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/");
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/tlpd");
771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("te"), false, expected_urls, true,
772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("techmeme.com"),
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            ASCIIToUTF16("chmeme.com"));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HQPOrderingTest, TEAMatch) {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/");
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/tlpd");
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/tlpd/korean/players");
781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("tea"), false, expected_urls, true,
782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("www.teamliquid.net"),
783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 ASCIIToUTF16("mliquid.net"));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785