123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/autocomplete/shortcuts_backend.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/message_loop/message_loop.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/path_service.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/stringprintf.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/autocomplete/shortcuts_backend_factory.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/history/shortcuts_database.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/search_engines/template_url_service_factory.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/test/base/ui_test_utils.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/test/test_browser_thread.h"
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "sql/statement.h"
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// ShortcutsBackendTest -------------------------------------------------------
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ShortcutsBackendTest : public testing::Test,
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             public ShortcutsBackend::ShortcutsBackendObserver {
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ShortcutsBackendTest();
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::Shortcut::MatchCore MatchCoreForTesting(
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& url,
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& contents_class = std::string(),
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& description_class = std::string(),
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    AutocompleteMatch::Type type = AutocompleteMatchType::URL_WHAT_YOU_TYPED);
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SetSearchProvider();
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void SetUp();
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void TearDown();
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void OnShortcutsLoaded() OVERRIDE;
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void OnShortcutsChanged() OVERRIDE;
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ShortcutsBackend::ShortcutMap& shortcuts_map() const {
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return backend_->shortcuts_map();
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool changed_notified() const { return changed_notified_; }
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void set_changed_notified(bool changed_notified) {
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      changed_notified_ = changed_notified;
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void InitBackend();
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool AddShortcut(const history::ShortcutsDatabase::Shortcut& shortcut);
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool UpdateShortcut(const history::ShortcutsDatabase::Shortcut& shortcut);
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool DeleteShortcutsWithURL(const GURL& url);
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool DeleteShortcutsWithIDs(
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const history::ShortcutsDatabase::ShortcutIDs& deleted_ids);
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protected:
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TestingProfile profile_;
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<ShortcutsBackend> backend_;
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::MessageLoopForUI ui_message_loop_;
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::TestBrowserThread ui_thread_;
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::TestBrowserThread db_thread_;
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool load_notified_;
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool changed_notified_;
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShortcutsBackendTest);
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ShortcutsBackendTest::ShortcutsBackendTest()
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    : ui_thread_(content::BrowserThread::UI, &ui_message_loop_),
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      db_thread_(content::BrowserThread::DB),
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      load_notified_(false),
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      changed_notified_(false) {
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)history::ShortcutsDatabase::Shortcut::MatchCore
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ShortcutsBackendTest::MatchCoreForTesting(
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& url,
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& contents_class,
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& description_class,
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    AutocompleteMatch::Type type) {
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  AutocompleteMatch match(NULL, 0, 0, type);
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  match.destination_url = GURL(url);
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  match.contents = base::ASCIIToUTF16("test");
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  match.contents_class =
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      AutocompleteMatch::ClassificationsFromString(contents_class);
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  match.description_class =
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      AutocompleteMatch::ClassificationsFromString(description_class);
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.search_terms_args.reset(
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new TemplateURLRef::SearchTermsArgs(match.contents));
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return ShortcutsBackend::MatchToMatchCore(match, &profile_);
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ShortcutsBackendTest::SetSearchProvider() {
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TemplateURLService* template_url_service =
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      TemplateURLServiceFactory::GetForProfile(&profile_);
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TemplateURLData data;
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  data.SetURL("http://foo.com/search?bar={searchTerms}");
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  data.SetKeyword(base::UTF8ToUTF16("foo"));
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL* template_url = new TemplateURL(data);
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Takes ownership of |template_url|.
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  template_url_service->Add(template_url);
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  template_url_service->SetUserSelectedDefaultSearchProvider(template_url);
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShortcutsBackendTest::SetUp() {
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  db_thread_.Start();
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ShortcutsBackendFactory::GetInstance()->SetTestingFactoryAndUse(
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      &profile_, &ShortcutsBackendFactory::BuildProfileForTesting);
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  backend_ = ShortcutsBackendFactory::GetForProfile(&profile_);
11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(backend_.get());
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  backend_->AddObserver(this);
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TemplateURLService* template_url_service =
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      TemplateURLServiceFactory::GetForProfile(&profile_);
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui_test_utils::WaitForTemplateURLServiceToLoad(template_url_service);
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShortcutsBackendTest::TearDown() {
12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  backend_->RemoveObserver(this);
12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  db_thread_.Stop();
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShortcutsBackendTest::OnShortcutsLoaded() {
13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  load_notified_ = true;
13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::MessageLoop::current()->Quit();
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShortcutsBackendTest::OnShortcutsChanged() {
13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  changed_notified_ = true;
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShortcutsBackendTest::InitBackend() {
14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ShortcutsBackend* backend =
14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      ShortcutsBackendFactory::GetForProfile(&profile_).get();
14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(backend);
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_FALSE(load_notified_);
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_FALSE(backend_->initialized());
14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::MessageLoop::current()->Run();
14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(load_notified_);
14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(backend_->initialized());
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool ShortcutsBackendTest::AddShortcut(
15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const history::ShortcutsDatabase::Shortcut& shortcut) {
15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return backend_->AddShortcut(shortcut);
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool ShortcutsBackendTest::UpdateShortcut(
15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const history::ShortcutsDatabase::Shortcut& shortcut) {
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return backend_->UpdateShortcut(shortcut);
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool ShortcutsBackendTest::DeleteShortcutsWithURL(const GURL& url) {
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return backend_->DeleteShortcutsWithURL(url);
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool ShortcutsBackendTest::DeleteShortcutsWithIDs(
16723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const history::ShortcutsDatabase::ShortcutIDs& deleted_ids) {
16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return backend_->DeleteShortcutsWithIDs(deleted_ids);
16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Actual tests ---------------------------------------------------------------
17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Verifies that creating MatchCores strips classifications and sanitizes match
17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// types.
17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(ShortcutsBackendTest, SanitizeMatchCore) {
17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  struct {
17823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    std::string input_contents_class;
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    std::string input_description_class;
18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    AutocompleteMatch::Type input_type;
18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    std::string output_contents_class;
18223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    std::string output_description_class;
18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    AutocompleteMatch::Type output_type;
18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  } cases[] = {
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1,4,0", "0,3,4,1",  AutocompleteMatchType::URL_WHAT_YOU_TYPED,
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "0,1,4,0", "0,1",      AutocompleteMatchType::HISTORY_URL },
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,3,5,1", "0,2,5,0",  AutocompleteMatchType::NAVSUGGEST,
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "0,1",     "0,0",      AutocompleteMatchType::HISTORY_URL },
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1",     "0,0,11,2,15,0",
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "0,1",     "0,0",      AutocompleteMatchType::SEARCH_HISTORY },
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1",     "0,0",      AutocompleteMatchType::SEARCH_SUGGEST,
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "0,1",     "0,0",      AutocompleteMatchType::SEARCH_HISTORY },
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1",     "0,0",      AutocompleteMatchType::SEARCH_SUGGEST_ENTITY,
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "",        "",         AutocompleteMatchType::SEARCH_HISTORY },
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1",     "0,0",      AutocompleteMatchType::SEARCH_SUGGEST_INFINITE,
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "",        "",         AutocompleteMatchType::SEARCH_HISTORY },
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1",     "0,0",      AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED,
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "",        "",         AutocompleteMatchType::SEARCH_HISTORY },
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { "0,1",     "0,0",      AutocompleteMatchType::SEARCH_SUGGEST_PROFILE,
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "",        "",         AutocompleteMatchType::SEARCH_HISTORY },
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "0,1",     "0,0",      AutocompleteMatchType::SEARCH_SUGGEST_ANSWER,
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "",        "",         AutocompleteMatchType::SEARCH_HISTORY },
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    history::ShortcutsDatabase::Shortcut::MatchCore match_core(
20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        MatchCoreForTesting(std::string(), cases[i].input_contents_class,
20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                            cases[i].input_description_class,
21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                            cases[i].input_type));
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_EQ(cases[i].output_contents_class, match_core.contents_class)
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        << ":i:" << i << ":type:" << cases[i].input_type;
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_EQ(cases[i].output_description_class, match_core.description_class)
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        << ":i:" << i << ":type:" << cases[i].input_type;
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_EQ(cases[i].output_type, match_core.type)
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        << ":i:" << i << ":type:" << cases[i].input_type;
21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
21823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
220effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(ShortcutsBackendTest, EntitySuggestionTest) {
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SetSearchProvider();
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AutocompleteMatch match;
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.fill_into_edit = base::UTF8ToUTF16("franklin d roosevelt");
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.type = AutocompleteMatchType::SEARCH_SUGGEST_ENTITY;
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.contents = base::UTF8ToUTF16("roosevelt");
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.contents_class =
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AutocompleteMatch::ClassificationsFromString("0,0,5,2");
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.description = base::UTF8ToUTF16("Franklin D. Roosevelt");
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.description_class = AutocompleteMatch::ClassificationsFromString("0,4");
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.destination_url = GURL(
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "http://www.foo.com/search?bar=franklin+d+roosevelt&gs_ssp=1234");
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.keyword = base::UTF8ToUTF16("foo");
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  match.search_terms_args.reset(
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new TemplateURLRef::SearchTermsArgs(match.fill_into_edit));
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  history::ShortcutsDatabase::Shortcut::MatchCore match_core =
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ShortcutsBackend::MatchToMatchCore(match, &profile_);
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ("http://foo.com/search?bar=franklin+d+roosevelt",
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            match_core.destination_url.spec());
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(match.fill_into_edit, match_core.contents);
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ("0,0", match_core.contents_class);
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(base::string16(), match_core.description);
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(match_core.description_class.empty());
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
24723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(ShortcutsBackendTest, AddAndUpdateShortcut) {
24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  InitBackend();
24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(changed_notified());
25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
25123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::Shortcut shortcut(
25223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "BD85DBA2-8C29-49F9-84AE-48E1E90880DF", base::ASCIIToUTF16("goog"),
25323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MatchCoreForTesting("http://www.google.com"), base::Time::Now(), 100);
25423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(AddShortcut(shortcut));
25523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(changed_notified());
25623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ShortcutsBackend::ShortcutMap::const_iterator shortcut_iter(
25723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      shortcuts_map().find(shortcut.text));
25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(shortcut_iter != shortcuts_map().end());
25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut.id, shortcut_iter->second.id);
26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut.match_core.contents,
26123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            shortcut_iter->second.match_core.contents);
26223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
26323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  set_changed_notified(false);
26423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  shortcut.match_core.contents = base::ASCIIToUTF16("Google Web Search");
26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(UpdateShortcut(shortcut));
26623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(changed_notified());
26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  shortcut_iter = shortcuts_map().find(shortcut.text);
26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(shortcut_iter != shortcuts_map().end());
26923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut.id, shortcut_iter->second.id);
27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut.match_core.contents,
27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            shortcut_iter->second.match_core.contents);
27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(ShortcutsBackendTest, DeleteShortcuts) {
27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  InitBackend();
27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::Shortcut shortcut1(
27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "BD85DBA2-8C29-49F9-84AE-48E1E90880DF", base::ASCIIToUTF16("goog"),
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MatchCoreForTesting("http://www.google.com"), base::Time::Now(), 100);
27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(AddShortcut(shortcut1));
28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
28123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::Shortcut shortcut2(
28223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "BD85DBA2-8C29-49F9-84AE-48E1E90880E0", base::ASCIIToUTF16("gle"),
28323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MatchCoreForTesting("http://www.google.com"), base::Time::Now(), 100);
28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(AddShortcut(shortcut2));
28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
28623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::Shortcut shortcut3(
28723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "BD85DBA2-8C29-49F9-84AE-48E1E90880E1", base::ASCIIToUTF16("sp"),
28823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MatchCoreForTesting("http://www.sport.com"), base::Time::Now(), 10);
28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(AddShortcut(shortcut3));
29023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
29123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::Shortcut shortcut4(
29223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "BD85DBA2-8C29-49F9-84AE-48E1E90880E2", base::ASCIIToUTF16("mov"),
29323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MatchCoreForTesting("http://www.film.com"), base::Time::Now(), 10);
29423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(AddShortcut(shortcut4));
29523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
29623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(4U, shortcuts_map().size());
29723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut1.id, shortcuts_map().find(shortcut1.text)->second.id);
29823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut2.id, shortcuts_map().find(shortcut2.text)->second.id);
29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut3.id, shortcuts_map().find(shortcut3.text)->second.id);
30023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut4.id, shortcuts_map().find(shortcut4.text)->second.id);
30123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
30223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(DeleteShortcutsWithURL(shortcut1.match_core.destination_url));
30323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
30423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(2U, shortcuts_map().size());
30523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(0U, shortcuts_map().count(shortcut1.text));
30623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(0U, shortcuts_map().count(shortcut2.text));
30723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ShortcutsBackend::ShortcutMap::const_iterator shortcut3_iter(
30823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      shortcuts_map().find(shortcut3.text));
30923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(shortcut3_iter != shortcuts_map().end());
31023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut3.id, shortcut3_iter->second.id);
31123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ShortcutsBackend::ShortcutMap::const_iterator shortcut4_iter(
31223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      shortcuts_map().find(shortcut4.text));
31323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(shortcut4_iter != shortcuts_map().end());
31423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(shortcut4.id, shortcut4_iter->second.id);
31523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
31623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  history::ShortcutsDatabase::ShortcutIDs deleted_ids;
31723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  deleted_ids.push_back(shortcut3.id);
31823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  deleted_ids.push_back(shortcut4.id);
31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(DeleteShortcutsWithIDs(deleted_ids));
32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
32123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(0U, shortcuts_map().size());
32223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
323