history_quick_provider_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/autocomplete/autocomplete_match.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider_listener.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_result.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autocomplete/history_url_provider.h"
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/history/history_backend.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/history/history_database.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_url_index.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/url_database.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/url_index_private_data.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "sql/transaction.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestURLInfo {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int typed_count;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int days_from_now;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} quick_test_db[] = {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.google.com/", "Google", 3, 3, 0},
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://slashdot.org/favorite_page.html", "Favorite page", 200, 100, 0},
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://kerneltrap.org/not_very_popular.html", "Less popular", 4, 0, 0},
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://freshmeat.net/unpopular.html", "Unpopular", 1, 1, 0},
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://news.google.com/?ned=us&topic=n", "Google News - U.S.", 2, 2, 0},
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://news.google.com/", "Google News", 1, 1, 0},
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://foo.com/", "Dir", 200, 100, 0},
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://foo.com/dir/", "Dir", 2, 1, 10},
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://foo.com/dir/another/", "Dir", 10, 5, 0},
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://foo.com/dir/another/again/", "Dir", 5, 1, 0},
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://foo.com/dir/another/again/myfile.html", "File", 3, 1, 0},
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/y/a", "VA", 10, 1, 20},
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/y/b", "VB", 9, 1, 20},
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/x/c", "VC", 8, 1, 20},
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/x/d", "VD", 7, 1, 20},
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://visitedest.com/y/e", "VE", 6, 1, 20},
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/y/a", "TA", 5, 5, 0},
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/y/b", "TB", 5, 4, 0},
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/x/c", "TC", 5, 3, 0},
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/x/d", "TD", 5, 2, 0},
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"http://typeredest.com/y/e", "TE", 5, 1, 0},
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/y/a", "DA", 1, 1, 0},
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/y/b", "DB", 1, 1, 1},
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/x/c", "DC", 1, 1, 2},
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/x/d", "DD", 1, 1, 3},
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://daysagoest.com/y/e", "DE", 1, 1, 4},
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcdefghixyzjklmnopqrstuvw.com/a", "", 3, 1, 0},
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://spaces.com/path%20with%20spaces/foo.html", "Spaces", 2, 2, 0},
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcdefghijklxyzmnopqrstuvw.com/a", "", 3, 1, 0},
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcdefxyzghijklmnopqrstuvw.com/a", "", 3, 1, 0},
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://abcxyzdefghijklmnopqrstuvw.com/a", "", 3, 1, 0},
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://xyzabcdefghijklmnopqrstuvw.com/a", "", 3, 1, 0},
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice",
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "Dogs & Cats & Mice & Other Animals", 1, 1, 0},
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"https://monkeytrap.org/", "", 3, 1, 0},
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://popularsitewithpathonly.com/moo",
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   "popularsitewithpathonly.com/moo", 50, 50, 0},
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://popularsitewithroot.com/", "popularsitewithroot.com", 50, 50, 0},
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://testsearch.com/?q=thequery", "Test Search Engine", 10, 10, 0},
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {"http://testsearch.com/", "Test Search Engine", 9, 9, 0},
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {"http://anotherengine.com/?q=thequery", "Another Search Engine", 8, 8, 0},
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The encoded stuff between /wiki/ and the # is 第二次世界大戦
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {"http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%B8%96%E7%95"
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu   "%8C%E5%A4%A7%E6%88%A6#.E3.83.B4.E3.82.A7.E3.83.AB.E3.82.B5.E3.82.A4.E3."
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu   "83.A6.E4.BD.93.E5.88.B6", "Title Unimportant", 2, 2, 0}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryQuickProviderTest : public testing::Test,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 public AutocompleteProviderListener {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryQuickProviderTest()
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(BrowserThread::FILE, &message_loop_) {}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutocompleteProviderListener:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProviderUpdate(bool updated_matches) OVERRIDE {}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SetShouldContain : public std::unary_function<const std::string&,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      std::set<std::string> > {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit SetShouldContain(const ACMatches& matched_urls);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void operator()(const std::string& expected);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<std::string> LeftOvers() const { return matches_; }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<std::string> matches_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static KeyedService* CreateTemplateURLService(
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::BrowserContext* profile) {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new TemplateURLService(static_cast<Profile*>(profile));
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetTestData(size_t* data_count, TestURLInfo** test_data);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills test data into the history system.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillData();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs an autocomplete query on |text| and checks to see that the returned
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results' destination URLs match those provided. |expected_urls| does not
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to be in sorted order.
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RunTest(const base::string16 text,
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               bool prevent_inline_autocomplete,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               std::vector<std::string> expected_urls,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool can_inline_top_result,
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               base::string16 expected_fill_into_edit,
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               base::string16 autocompletion);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history_service_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatches ac_matches_;  // The resulting matches after running RunTest.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HistoryQuickProvider> provider_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::SetUp() {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.reset(new TestingProfile());
163bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  ASSERT_TRUE(profile_->CreateHistoryService(true, false));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->CreateBookmarkModel(true);
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  test::WaitForBookmarkModelToLoad(
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      BookmarkModelFactory::GetForProfile(profile_.get()));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->BlockUntilHistoryIndexIsRefreshed();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history_service_ =
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryServiceFactory::GetForProfile(profile_.get(),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Profile::EXPLICIT_ACCESS);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(history_service_);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = new HistoryQuickProvider(this, profile_.get());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile_.get(), &HistoryQuickProviderTest::CreateTemplateURLService);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillData();
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  provider_->GetIndex()->RebuildFromHistory(
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      history_service_->history_backend_->db());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::TearDown() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = NULL;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::GetTestData(size_t* data_count,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           TestURLInfo** test_data) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_count);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(test_data);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *data_count = arraysize(quick_test_db);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *test_data = &quick_test_db[0];
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::FillData() {
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sql::Connection& db(history_service_->history_backend_->db()->GetDB());
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(db.is_open());
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t data_count = 0;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLInfo* test_data = NULL;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetTestData(&data_count, &test_data);
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t visit_id = 1;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < data_count; ++i) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestURLInfo& cur(test_data[i]);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Time visit_time = Time::Now() - TimeDelta::FromDays(cur.days_from_now);
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    sql::Transaction transaction(&db);
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Add URL.
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    transaction.Begin();
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string sql_cmd_line = base::StringPrintf(
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "INSERT INTO \"urls\" VALUES(%" PRIuS ", \'%s\', \'%s\', %d, %d, %"
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        PRId64 ", 0, 0)",
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        i + 1, cur.url.c_str(), cur.title.c_str(), cur.visit_count,
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        cur.typed_count, visit_time.ToInternalValue());
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    sql::Statement sql_stmt(db.GetUniqueStatement(sql_cmd_line.c_str()));
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_TRUE(sql_stmt.Run());
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    transaction.Commit();
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Add visits.
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    for (int j = 0; j < cur.visit_count; ++j) {
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // Assume earlier visits are at one-day intervals.
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      visit_time -= TimeDelta::FromDays(1);
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      transaction.Begin();
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // Mark the most recent |cur.typed_count| visits as typed.
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string sql_cmd_line = base::StringPrintf(
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          "INSERT INTO \"visits\" VALUES(%" PRIuS ", %" PRIuS ", %" PRId64
224bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch          ", 0, %d, 0, 1)",
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          visit_id++, i + 1, visit_time.ToInternalValue(),
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          (j < cur.typed_count) ? content::PAGE_TRANSITION_TYPED :
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  content::PAGE_TRANSITION_LINK);
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sql::Statement sql_stmt(db.GetUniqueStatement(sql_cmd_line.c_str()));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_TRUE(sql_stmt.Run());
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      transaction.Commit();
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryQuickProviderTest::SetShouldContain::SetShouldContain(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matched_urls) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator iter = matched_urls.begin();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != matched_urls.end(); ++iter)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches_.insert(iter->destination_url.spec());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryQuickProviderTest::SetShouldContain::operator()(
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, matches_.erase(expected))
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Results did not contain '" << expected << "' but should have.";
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void HistoryQuickProviderTest::RunTest(const base::string16 text,
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       bool prevent_inline_autocomplete,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       std::vector<std::string> expected_urls,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool can_inline_top_result,
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       base::string16 expected_fill_into_edit,
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       base::string16 expected_autocompletion) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE(text);  // Minimal hint to query being run.
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AutocompleteInput input(text, base::string16::npos, base::string16(),
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          GURL(), AutocompleteInput::INVALID_SPEC,
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          prevent_inline_autocomplete, false, true, true);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->Start(input, false);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(provider_->done());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ac_matches_ = provider_->matches();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have gotten back at most AutocompleteProvider::kMaxMatches.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(ac_matches_.size(), AutocompleteProvider::kMaxMatches);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the number of expected and actual matches aren't equal then we need
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test no further, but let's do anyway so that we know which URLs failed.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_urls.size(), ac_matches_.size());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that all expected URLs were found and that all found URLs
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // were expected.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> leftovers =
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for_each(expected_urls.begin(), expected_urls.end(),
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               SetShouldContain(ac_matches_)).LeftOvers();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, leftovers.size()) << "There were " << leftovers.size()
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << " unexpected results, one of which was: '"
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << *(leftovers.begin()) << "'.";
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (expected_urls.empty())
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that we got the results in the order expected.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int best_score = ac_matches_.begin()->relevance + 1;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = 0;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string>::const_iterator expected = expected_urls.begin();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator actual = ac_matches_.begin();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       actual != ac_matches_.end() && expected != expected_urls.end();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++actual, ++expected, ++i) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(*expected, actual->destination_url.spec())
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "For result #" << i << " we got '" << actual->destination_url.spec()
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "' but expected '" << *expected << "'.";
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(actual->relevance, best_score)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "At result #" << i << " (url=" << actual->destination_url.spec()
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "), we noticed scores are not monotonically decreasing.";
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    best_score = actual->relevance;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_EQ(can_inline_top_result, ac_matches_[0].allowed_to_be_default_match);
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (can_inline_top_result)
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_autocompletion, ac_matches_[0].inline_autocompletion);
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(expected_fill_into_edit, ac_matches_[0].fill_into_edit);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, SimpleSingleMatch) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://slashdot.org/favorite_page.html");
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot"), false, expected_urls, true,
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("slashdot.org/favorite_page.html"),
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  ASCIIToUTF16(".org/favorite_page.html"));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(HistoryQuickProviderTest, WordBoundariesWithPunctuationMatch) {
316e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  std::vector<std::string> expected_urls;
317e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  expected_urls.push_back("http://popularsitewithpathonly.com/moo");
318e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  RunTest(ASCIIToUTF16("/moo"), false, expected_urls, false,
319e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          ASCIIToUTF16("popularsitewithpathonly.com/moo"), base::string16());
320e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
321e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, MultiTermTitleMatch) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back(
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice");
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("mice other animals"), false, expected_urls, false,
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("cda.com/Dogs Cats Gorillas Sea Slugs and Mice"),
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, NonWordLastCharacterMatch) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_url("http://slashdot.org/favorite_page.html");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back(expected_url);
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot.org/"), false, expected_urls, true,
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("slashdot.org/favorite_page.html"),
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       ASCIIToUTF16("favorite_page.html"));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, MultiMatch) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of typed_count.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://foo.com/");
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of visit count.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://foo.com/dir/another/");
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of high visit count.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://foo.com/dir/another/again/");
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("foo"), false, expected_urls, true,
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("foo.com"), ASCIIToUTF16(".com"));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, StartRelativeMatch) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://xyzabcdefghijklmnopqrstuvw.com/a");
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("xyza"), false, expected_urls, true,
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("xyzabcdefghijklmnopqrstuvw.com/a"),
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              ASCIIToUTF16("bcdefghijklmnopqrstuvw.com/a"));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, EncodingMatch) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://spaces.com/path%20with%20spaces/foo.html");
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("path with spaces"), false, expected_urls, false,
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("spaces.com/path with spaces/foo.html"),
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HistoryQuickProviderTest, ContentsClass) {
3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::vector<std::string> expected_urls;
3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  expected_urls.push_back(
3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%B8%96%E7"
3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "%95%8C%E5%A4%A7%E6%88%A6#.E3.83.B4.E3.82.A7.E3.83.AB.E3.82.B5.E3.82."
3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "A4.E3.83.A6.E4.BD.93.E5.88.B6");
3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunTest(base::UTF8ToUTF16("第二 e3"), false, expected_urls, false,
3755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::UTF8ToUTF16("ja.wikipedia.org/wiki/第二次世界大戦#.E3.83.B4.E3."
3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            "82.A7.E3.83.AB.E3.82.B5.E3.82.A4.E3.83.A6.E4.BD."
3775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            "93.E5.88.B6"),
3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::string16());
3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef NDEBUG
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ac_matches_[0].Validate();
3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif
3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Verify that contents_class divides the string in the right places.
3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // [22, 24) is the "第二".  All the other pairs are the "e3".
3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ACMatchClassifications contents_class(ac_matches_[0].contents_class);
3855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  size_t expected_offsets[] = { 0, 22, 24, 31, 33, 40, 42, 49, 51, 58, 60, 67,
3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                69, 76, 78 };
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // ScoredHistoryMatch may not highlight all the occurrences of these terms
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // because it only highlights terms at word breaks, and it only stores word
3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // breaks up to some specified number of characters (50 at the time of this
3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // comment).  This test is written flexibly so it still will pass if we
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // increase that number in the future.  Regardless, we require the first
3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // five offsets to be correct--in this example these cover at least one
3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // occurrence of each term.
3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_LE(contents_class.size(), arraysize(expected_offsets));
3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_GE(contents_class.size(), 5u);
3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < contents_class.size(); ++i)
3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(expected_offsets[i], contents_class[i].offset);
3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, VisitCountMatches) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://visitedest.com/y/a");
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://visitedest.com/y/b");
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://visitedest.com/x/c");
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("visitedest"), false, expected_urls, true,
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("visitedest.com/y/a"),
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com/y/a"));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, TypedCountMatches) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://typeredest.com/y/a");
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://typeredest.com/y/b");
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://typeredest.com/x/c");
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("typeredest"), false, expected_urls, true,
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("typeredest.com/y/a"),
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com/y/a"));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, DaysAgoMatches) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://daysagoest.com/y/a");
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://daysagoest.com/y/b");
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://daysagoest.com/x/c");
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("daysagoest"), false, expected_urls, true,
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("daysagoest.com/y/a"),
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com/y/a"));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, EncodingLimitMatch) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url(
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://cda.com/Dogs%20Cats%20Gorillas%20Sea%20Slugs%20and%20Mice");
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First check that a mid-word match yield no results.
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("ice"), false, expected_urls, false,
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("cda.com/Dogs Cats Gorillas Sea Slugs and Mice"),
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Then check that we get results when the match is at a word start
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that is present because of an encoded separate (%20 = space).
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back(url);
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("Mice"), false, expected_urls, false,
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("cda.com/Dogs Cats Gorillas Sea Slugs and Mice"),
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::string16());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the matches' ACMatchClassifications offsets are in range.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications content(ac_matches_[0].contents_class);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The max offset accounts for 6 occurrences of '%20' plus the 'http://'.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t max_offset = url.length() - ((6 * 2) + 7);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatchClassifications::const_iterator citer = content.begin();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       citer != content.end(); ++citer)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(citer->offset, max_offset);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications description(ac_matches_[0].description_class);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string page_title("Dogs & Cats & Mice & Other Animals");
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatchClassifications::const_iterator diter = description.begin();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       diter != description.end(); ++diter)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(diter->offset, page_title.length());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, Spans) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test SpansFromTermMatch
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TermMatches matches_a;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates matches: '.xx.xxx..xx...xxxxx..' which will test no match at
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // either beginning or end as well as adjacent matches.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(1, 1, 2));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(2, 4, 3));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(3, 9, 1));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(3, 10, 1));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_a.push_back(history::TermMatch(4, 14, 5));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_a =
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryQuickProvider::SpansFromTermMatch(matches_a, 20, false);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be: 'NM-NM---N-M-N--M----N-'
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(9U, spans_a.size());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_a[0].offset);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[0].style);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, spans_a[1].offset);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[1].style);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, spans_a[2].offset);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[2].style);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, spans_a[3].offset);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[3].style);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(7U, spans_a[4].offset);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[4].style);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_a[5].offset);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[5].style);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11U, spans_a[6].offset);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[6].style);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(14U, spans_a[7].offset);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[7].style);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(19U, spans_a[8].offset);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[8].style);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates matches: 'xx.xx' which will test matches at both beginning and
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // end.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TermMatches matches_b;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_b.push_back(history::TermMatch(1, 0, 2));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_b.push_back(history::TermMatch(2, 3, 2));
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_b =
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryQuickProvider::SpansFromTermMatch(matches_b, 5, true);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be: 'M-NM-'
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, spans_b.size());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_b[0].offset);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH | ACMatchClassification::URL,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_b[0].style);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_b[1].offset);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_b[1].style);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, spans_b[2].offset);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH | ACMatchClassification::URL,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_b[2].style);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, DeleteMatch) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://slashdot.org/favorite_page.html");
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill up ac_matches_; we don't really care about the test yet.
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot"), false, expected_urls, true,
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("slashdot.org/favorite_page.html"),
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  ASCIIToUTF16(".org/favorite_page.html"));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, ac_matches_.size());
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->DeleteMatch(ac_matches_[0]);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify it's no longer an indexed visit.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.clear();
520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("slashdot"), false, expected_urls, true,
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("NONE EXPECTED"), base::string16());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, PreventBeatingURLWhatYouTypedMatch) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.clear();
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://popularsitewithroot.com/");
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname (no path) that he/she has visited
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before, we should make sure that all HistoryQuickProvider results
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // have scores less than what HistoryURLProvider will assign the
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // URL-what-you-typed match.
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.com"), false, expected_urls, true,
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"), base::string16());
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForBestInlineableResult);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that if the user didn't quite enter the full hostname, this
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hostname would've normally scored above the URL-what-you-typed match.
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.c"), false, expected_urls, true,
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"),
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               ASCIIToUTF16("om"));
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(ac_matches_[0].relevance,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.clear();
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back("http://popularsitewithpathonly.com/moo");
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname of a host that he/she has visited
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but never visited the root page of, we should make sure that all
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // HistoryQuickProvider results have scores less than what the
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // HistoryURLProvider will assign the URL-what-you-typed match.
552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com"), false, expected_urls,
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true,
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithpathonly.com/moo"),
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ASCIIToUTF16("/moo"));
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            HistoryURLProvider::kScoreForUnvisitedIntranetResult);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the same thing happens if the user adds a / to end of the
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hostname.
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com/"), false, expected_urls,
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true, ASCIIToUTF16("popularsitewithpathonly.com/moo"),
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            ASCIIToUTF16("moo"));
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            HistoryURLProvider::kScoreForUnvisitedIntranetResult);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that if the user didn't quite enter the full hostname, this
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page would've normally scored above the URL-what-you-typed match.
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.co"), false, expected_urls,
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true, ASCIIToUTF16("popularsitewithpathonly.com/moo"),
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          ASCIIToUTF16("m/moo"));
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(ac_matches_[0].relevance,
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname + path that he/she has not visited
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before (but visited other things on the host), we can allow
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // inline autocompletions.
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com/mo"), false, expected_urls,
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          true,
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithpathonly.com/moo"),
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                        ASCIIToUTF16("o"));
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(ac_matches_[0].relevance,
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the user enters a hostname + path that he/she has visited
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before, we should make sure that all HistoryQuickProvider results
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // have scores less than what the HistoryURLProvider will assign
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the URL-what-you-typed match.
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithpathonly.com/moo"), false,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expected_urls, true,
591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithpathonly.com/moo"), base::string16());
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LT(ac_matches_[0].relevance,
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForBestInlineableResult);
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HistoryQuickProviderTest, PreventInlineAutocomplete) {
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::vector<std::string> expected_urls;
598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  expected_urls.push_back("http://popularsitewithroot.com/");
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Check that the desired URL is normally allowed to be the default match
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // against input that is a prefex of the URL.
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithr"), false, expected_urls, true,
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"),
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          ASCIIToUTF16("oot.com"));
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Check that it's not allowed to be the default match if
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // prevent_inline_autocomplete is true.
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithr"), true, expected_urls, false,
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"),
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          ASCIIToUTF16("oot.com"));
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // But the exact hostname can still match even if prevent inline autocomplete
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // is true.  i.e., there's no autocompletion necessary; this is effectively
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // URL-what-you-typed.
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.com"), true, expected_urls, true,
616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"), base::string16());
617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The above still holds even with an extra trailing slash.
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("popularsitewithroot.com/"), true, expected_urls, true,
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("popularsitewithroot.com"), base::string16());
621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryQuickProviderTest, CullSearchResults) {
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up a default search engine.
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURLData data;
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.SetKeyword(ASCIIToUTF16("TestEngine"));
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.SetURL("http://testsearch.com/?q={searchTerms}");
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURLService* template_url_service =
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(profile_.get());
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TemplateURL* template_url = new TemplateURL(profile_.get(), data);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template_url_service->Add(template_url);
6325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  template_url_service->SetUserSelectedDefaultSearchProvider(template_url);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template_url_service->Load();
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A search results page should not be returned when typing a query.
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> expected_urls;
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back("http://anotherengine.com/?q=thequery");
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("thequery"), false, expected_urls, false,
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("anotherengine.com/?q=thequery"), base::string16());
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A search results page should not be returned when typing the engine URL.
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.clear();
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_urls.push_back("http://testsearch.com/");
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("testsearch"), false, expected_urls, true,
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("testsearch.com"),
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ASCIIToUTF16(".com"));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HQPOrderingTest -------------------------------------------------------------
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLInfo ordering_test_db[] = {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/tlpd/korean/games/21648_bisu_vs_iris", "", 6, 3,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      256},
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.amazon.com/", "amazon.com: online shopping for electronics, "
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "apparel, computers, books, dvds & more", 20, 20, 10},
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/forum/viewmessage.php?topic_id=52045&"
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "currentpage=83", "google images", 6, 6, 0},
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.tempurpedic.com/", "tempur-pedic", 7, 7, 0},
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamfortress.com/", "", 5, 5, 6},
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.rottentomatoes.com/", "", 3, 3, 7},
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://music.google.com/music/listen?u=0#start_pl", "", 3, 3, 9},
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"https://www.emigrantdirect.com/", "high interest savings account, high "
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "yield savings - emigrantdirect", 5, 5, 3},
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://store.steampowered.com/", "", 6, 6, 1},
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://techmeme.com/", "techmeme", 111, 110, 4},
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/tlpd", "team liquid progaming database", 15, 15,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2},
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://store.steampowered.com/", "the steam summer camp sale", 6, 6, 1},
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/tlpd/korean/players", "tlpd - bw korean - player "
6707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "index", 25, 7, 219},
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://slashdot.org/", "slashdot: news for nerds, stuff that matters", 3, 3,
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      6},
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://translate.google.com/", "google translate", 3, 3, 0},
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://arstechnica.com/", "ars technica", 3, 3, 3},
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.rottentomatoes.com/", "movies | movie trailers | reviews - "
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "rotten tomatoes", 3, 3, 7},
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://www.teamliquid.net/", "team liquid - starcraft 2 and brood war pro "
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "gaming news", 26, 25, 3},
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://metaleater.com/", "metaleater", 4, 3, 8},
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://half.com/", "half.com: textbooks , books , music , movies , games , "
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "video games", 4, 4, 6},
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://teamliquid.net/", "team liquid - starcraft 2 and brood war pro "
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "gaming news", 8, 5, 9},
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HQPOrderingTest : public HistoryQuickProviderTest {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetTestData(size_t* data_count,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestURLInfo** test_data) OVERRIDE;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HQPOrderingTest::GetTestData(size_t* data_count, TestURLInfo** test_data) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_count);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(test_data);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *data_count = arraysize(ordering_test_db);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *test_data = &ordering_test_db[0];
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HQPOrderingTest, TEMatch) {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://techmeme.com/");
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/");
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/tlpd");
704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("te"), false, expected_urls, true,
705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("techmeme.com"),
706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            ASCIIToUTF16("chmeme.com"));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HQPOrderingTest, TEAMatch) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/");
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/tlpd");
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.teamliquid.net/tlpd/korean/players");
714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunTest(ASCIIToUTF16("tea"), false, expected_urls, true,
715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ASCIIToUTF16("www.teamliquid.net"),
716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 ASCIIToUTF16("mliquid.net"));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
718