| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/omnibox/browser/shortcuts_backend.h" | |
| 6 | |
| 7 #include <stddef.h> | |
| 8 | |
| 9 #include "base/files/scoped_temp_dir.h" | |
| 10 #include "base/macros.h" | |
| 11 #include "base/message_loop/message_loop.h" | |
| 12 #include "base/strings/stringprintf.h" | |
| 13 #include "base/strings/utf_string_conversions.h" | |
| 14 #include "chrome/browser/autocomplete/shortcuts_backend_factory.h" | |
| 15 #include "chrome/browser/search_engines/template_url_service_factory.h" | |
| 16 #include "chrome/browser/search_engines/ui_thread_search_terms_data.h" | |
| 17 #include "chrome/test/base/search_test_utils.h" | |
| 18 #include "chrome/test/base/testing_profile.h" | |
| 19 #include "components/omnibox/browser/shortcuts_database.h" | |
| 20 #include "components/search_engines/template_url_service.h" | |
| 21 #include "content/public/test/test_browser_thread.h" | |
| 22 | |
| 23 #include "testing/gtest/include/gtest/gtest.h" | |
| 24 | |
| 25 | |
| 26 // ShortcutsBackendTest ------------------------------------------------------- | |
| 27 | |
| 28 class ShortcutsBackendTest : public testing::Test, | |
| 29 public ShortcutsBackend::ShortcutsBackendObserver { | |
| 30 public: | |
| 31 ShortcutsBackendTest(); | |
| 32 | |
| 33 ShortcutsDatabase::Shortcut::MatchCore MatchCoreForTesting( | |
| 34 const std::string& url, | |
| 35 const std::string& contents_class = std::string(), | |
| 36 const std::string& description_class = std::string(), | |
| 37 AutocompleteMatch::Type type = AutocompleteMatchType::URL_WHAT_YOU_TYPED); | |
| 38 void SetSearchProvider(); | |
| 39 | |
| 40 void SetUp() override; | |
| 41 void TearDown() override; | |
| 42 | |
| 43 void OnShortcutsLoaded() override; | |
| 44 void OnShortcutsChanged() override; | |
| 45 | |
| 46 const ShortcutsBackend::ShortcutMap& shortcuts_map() const { | |
| 47 return backend_->shortcuts_map(); | |
| 48 } | |
| 49 bool changed_notified() const { return changed_notified_; } | |
| 50 void set_changed_notified(bool changed_notified) { | |
| 51 changed_notified_ = changed_notified; | |
| 52 } | |
| 53 | |
| 54 void InitBackend(); | |
| 55 bool AddShortcut(const ShortcutsDatabase::Shortcut& shortcut); | |
| 56 bool UpdateShortcut(const ShortcutsDatabase::Shortcut& shortcut); | |
| 57 bool DeleteShortcutsWithURL(const GURL& url); | |
| 58 bool DeleteShortcutsWithIDs( | |
| 59 const ShortcutsDatabase::ShortcutIDs& deleted_ids); | |
| 60 | |
| 61 private: | |
| 62 base::MessageLoopForUI ui_message_loop_; | |
| 63 content::TestBrowserThread ui_thread_; | |
| 64 content::TestBrowserThread db_thread_; | |
| 65 | |
| 66 protected: | |
| 67 TestingProfile profile_; | |
| 68 UIThreadSearchTermsData search_terms_data_; | |
| 69 | |
| 70 private: | |
| 71 scoped_refptr<ShortcutsBackend> backend_; | |
| 72 | |
| 73 bool load_notified_; | |
| 74 bool changed_notified_; | |
| 75 | |
| 76 DISALLOW_COPY_AND_ASSIGN(ShortcutsBackendTest); | |
| 77 }; | |
| 78 | |
| 79 ShortcutsBackendTest::ShortcutsBackendTest() | |
| 80 : ui_thread_(content::BrowserThread::UI, &ui_message_loop_), | |
| 81 db_thread_(content::BrowserThread::DB), | |
| 82 search_terms_data_(&profile_), | |
| 83 load_notified_(false), | |
| 84 changed_notified_(false) { | |
| 85 } | |
| 86 | |
| 87 ShortcutsDatabase::Shortcut::MatchCore | |
| 88 ShortcutsBackendTest::MatchCoreForTesting(const std::string& url, | |
| 89 const std::string& contents_class, | |
| 90 const std::string& description_class, | |
| 91 AutocompleteMatch::Type type) { | |
| 92 AutocompleteMatch match(NULL, 0, 0, type); | |
| 93 match.destination_url = GURL(url); | |
| 94 match.contents = base::ASCIIToUTF16("test"); | |
| 95 match.contents_class = | |
| 96 AutocompleteMatch::ClassificationsFromString(contents_class); | |
| 97 match.description_class = | |
| 98 AutocompleteMatch::ClassificationsFromString(description_class); | |
| 99 match.search_terms_args.reset( | |
| 100 new TemplateURLRef::SearchTermsArgs(match.contents)); | |
| 101 return ShortcutsBackend::MatchToMatchCore( | |
| 102 match, TemplateURLServiceFactory::GetForProfile(&profile_), | |
| 103 &search_terms_data_); | |
| 104 } | |
| 105 | |
| 106 void ShortcutsBackendTest::SetSearchProvider() { | |
| 107 TemplateURLService* template_url_service = | |
| 108 TemplateURLServiceFactory::GetForProfile(&profile_); | |
| 109 TemplateURLData data; | |
| 110 data.SetURL("http://foo.com/search?bar={searchTerms}"); | |
| 111 data.SetShortName(base::UTF8ToUTF16("foo")); | |
| 112 data.SetKeyword(base::UTF8ToUTF16("foo")); | |
| 113 | |
| 114 TemplateURL* template_url = new TemplateURL(data); | |
| 115 // Takes ownership of |template_url|. | |
| 116 template_url_service->Add(template_url); | |
| 117 template_url_service->SetUserSelectedDefaultSearchProvider(template_url); | |
| 118 } | |
| 119 | |
| 120 void ShortcutsBackendTest::SetUp() { | |
| 121 db_thread_.Start(); | |
| 122 ShortcutsBackendFactory::GetInstance()->SetTestingFactoryAndUse( | |
| 123 &profile_, &ShortcutsBackendFactory::BuildProfileForTesting); | |
| 124 backend_ = ShortcutsBackendFactory::GetForProfile(&profile_); | |
| 125 ASSERT_TRUE(backend_.get()); | |
| 126 backend_->AddObserver(this); | |
| 127 | |
| 128 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( | |
| 129 &profile_, &TemplateURLServiceFactory::BuildInstanceFor); | |
| 130 TemplateURLService* template_url_service = | |
| 131 TemplateURLServiceFactory::GetForProfile(&profile_); | |
| 132 search_test_utils::WaitForTemplateURLServiceToLoad(template_url_service); | |
| 133 } | |
| 134 | |
| 135 void ShortcutsBackendTest::TearDown() { | |
| 136 backend_->RemoveObserver(this); | |
| 137 db_thread_.Stop(); | |
| 138 } | |
| 139 | |
| 140 void ShortcutsBackendTest::OnShortcutsLoaded() { | |
| 141 load_notified_ = true; | |
| 142 base::MessageLoop::current()->QuitWhenIdle(); | |
| 143 } | |
| 144 | |
| 145 void ShortcutsBackendTest::OnShortcutsChanged() { | |
| 146 changed_notified_ = true; | |
| 147 } | |
| 148 | |
| 149 void ShortcutsBackendTest::InitBackend() { | |
| 150 ShortcutsBackend* backend = | |
| 151 ShortcutsBackendFactory::GetForProfile(&profile_).get(); | |
| 152 ASSERT_TRUE(backend); | |
| 153 ASSERT_FALSE(load_notified_); | |
| 154 ASSERT_FALSE(backend_->initialized()); | |
| 155 base::MessageLoop::current()->Run(); | |
| 156 EXPECT_TRUE(load_notified_); | |
| 157 EXPECT_TRUE(backend_->initialized()); | |
| 158 } | |
| 159 | |
| 160 bool ShortcutsBackendTest::AddShortcut( | |
| 161 const ShortcutsDatabase::Shortcut& shortcut) { | |
| 162 return backend_->AddShortcut(shortcut); | |
| 163 } | |
| 164 | |
| 165 bool ShortcutsBackendTest::UpdateShortcut( | |
| 166 const ShortcutsDatabase::Shortcut& shortcut) { | |
| 167 return backend_->UpdateShortcut(shortcut); | |
| 168 } | |
| 169 | |
| 170 bool ShortcutsBackendTest::DeleteShortcutsWithURL(const GURL& url) { | |
| 171 return backend_->DeleteShortcutsWithURL(url); | |
| 172 } | |
| 173 | |
| 174 bool ShortcutsBackendTest::DeleteShortcutsWithIDs( | |
| 175 const ShortcutsDatabase::ShortcutIDs& deleted_ids) { | |
| 176 return backend_->DeleteShortcutsWithIDs(deleted_ids); | |
| 177 } | |
| 178 | |
| 179 | |
| 180 // Actual tests --------------------------------------------------------------- | |
| 181 | |
| 182 // Verifies that creating MatchCores strips classifications and sanitizes match | |
| 183 // types. | |
| 184 TEST_F(ShortcutsBackendTest, SanitizeMatchCore) { | |
| 185 struct { | |
| 186 std::string input_contents_class; | |
| 187 std::string input_description_class; | |
| 188 AutocompleteMatch::Type input_type; | |
| 189 std::string output_contents_class; | |
| 190 std::string output_description_class; | |
| 191 AutocompleteMatch::Type output_type; | |
| 192 } cases[] = { | |
| 193 { "0,1,4,0", "0,3,4,1", AutocompleteMatchType::URL_WHAT_YOU_TYPED, | |
| 194 "0,1,4,0", "0,1", AutocompleteMatchType::HISTORY_URL }, | |
| 195 { "0,3,5,1", "0,2,5,0", AutocompleteMatchType::NAVSUGGEST, | |
| 196 "0,1", "0,0", AutocompleteMatchType::HISTORY_URL }, | |
| 197 { "0,1", "0,0,11,2,15,0", | |
| 198 AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, | |
| 199 "0,1", "0,0", AutocompleteMatchType::SEARCH_HISTORY }, | |
| 200 { "0,1", "0,0", AutocompleteMatchType::SEARCH_SUGGEST, | |
| 201 "0,1", "0,0", AutocompleteMatchType::SEARCH_HISTORY }, | |
| 202 { "0,1", "0,0", AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, | |
| 203 "", "", AutocompleteMatchType::SEARCH_HISTORY }, | |
| 204 { "0,1", "0,0", AutocompleteMatchType::SEARCH_SUGGEST_TAIL, | |
| 205 "", "", AutocompleteMatchType::SEARCH_HISTORY }, | |
| 206 { "0,1", "0,0", AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED, | |
| 207 "", "", AutocompleteMatchType::SEARCH_HISTORY }, | |
| 208 { "0,1", "0,0", AutocompleteMatchType::SEARCH_SUGGEST_PROFILE, | |
| 209 "", "", AutocompleteMatchType::SEARCH_HISTORY }, | |
| 210 }; | |
| 211 | |
| 212 for (size_t i = 0; i < arraysize(cases); ++i) { | |
| 213 ShortcutsDatabase::Shortcut::MatchCore match_core(MatchCoreForTesting( | |
| 214 std::string(), cases[i].input_contents_class, | |
| 215 cases[i].input_description_class, cases[i].input_type)); | |
| 216 EXPECT_EQ(cases[i].output_contents_class, match_core.contents_class) | |
| 217 << ":i:" << i << ":type:" << cases[i].input_type; | |
| 218 EXPECT_EQ(cases[i].output_description_class, match_core.description_class) | |
| 219 << ":i:" << i << ":type:" << cases[i].input_type; | |
| 220 EXPECT_EQ(cases[i].output_type, match_core.type) | |
| 221 << ":i:" << i << ":type:" << cases[i].input_type; | |
| 222 } | |
| 223 } | |
| 224 | |
| 225 TEST_F(ShortcutsBackendTest, EntitySuggestionTest) { | |
| 226 SetSearchProvider(); | |
| 227 AutocompleteMatch match; | |
| 228 match.fill_into_edit = base::UTF8ToUTF16("franklin d roosevelt"); | |
| 229 match.type = AutocompleteMatchType::SEARCH_SUGGEST_ENTITY; | |
| 230 match.contents = base::UTF8ToUTF16("roosevelt"); | |
| 231 match.contents_class = | |
| 232 AutocompleteMatch::ClassificationsFromString("0,0,5,2"); | |
| 233 match.description = base::UTF8ToUTF16("Franklin D. Roosevelt"); | |
| 234 match.description_class = AutocompleteMatch::ClassificationsFromString("0,4"); | |
| 235 match.destination_url = GURL( | |
| 236 "http://www.foo.com/search?bar=franklin+d+roosevelt&gs_ssp=1234"); | |
| 237 match.keyword = base::UTF8ToUTF16("foo"); | |
| 238 match.search_terms_args.reset( | |
| 239 new TemplateURLRef::SearchTermsArgs(match.fill_into_edit)); | |
| 240 | |
| 241 ShortcutsDatabase::Shortcut::MatchCore match_core = | |
| 242 ShortcutsBackend::MatchToMatchCore( | |
| 243 match, TemplateURLServiceFactory::GetForProfile(&profile_), | |
| 244 &search_terms_data_); | |
| 245 EXPECT_EQ("http://foo.com/search?bar=franklin+d+roosevelt", | |
| 246 match_core.destination_url.spec()); | |
| 247 EXPECT_EQ(match.fill_into_edit, match_core.contents); | |
| 248 EXPECT_EQ("0,0", match_core.contents_class); | |
| 249 EXPECT_EQ(base::string16(), match_core.description); | |
| 250 EXPECT_TRUE(match_core.description_class.empty()); | |
| 251 } | |
| 252 | |
| 253 TEST_F(ShortcutsBackendTest, AddAndUpdateShortcut) { | |
| 254 InitBackend(); | |
| 255 EXPECT_FALSE(changed_notified()); | |
| 256 | |
| 257 ShortcutsDatabase::Shortcut shortcut( | |
| 258 "BD85DBA2-8C29-49F9-84AE-48E1E90880DF", base::ASCIIToUTF16("goog"), | |
| 259 MatchCoreForTesting("http://www.google.com"), base::Time::Now(), 100); | |
| 260 EXPECT_TRUE(AddShortcut(shortcut)); | |
| 261 EXPECT_TRUE(changed_notified()); | |
| 262 ShortcutsBackend::ShortcutMap::const_iterator shortcut_iter( | |
| 263 shortcuts_map().find(shortcut.text)); | |
| 264 ASSERT_TRUE(shortcut_iter != shortcuts_map().end()); | |
| 265 EXPECT_EQ(shortcut.id, shortcut_iter->second.id); | |
| 266 EXPECT_EQ(shortcut.match_core.contents, | |
| 267 shortcut_iter->second.match_core.contents); | |
| 268 | |
| 269 set_changed_notified(false); | |
| 270 shortcut.match_core.contents = base::ASCIIToUTF16("Google Web Search"); | |
| 271 EXPECT_TRUE(UpdateShortcut(shortcut)); | |
| 272 EXPECT_TRUE(changed_notified()); | |
| 273 shortcut_iter = shortcuts_map().find(shortcut.text); | |
| 274 ASSERT_TRUE(shortcut_iter != shortcuts_map().end()); | |
| 275 EXPECT_EQ(shortcut.id, shortcut_iter->second.id); | |
| 276 EXPECT_EQ(shortcut.match_core.contents, | |
| 277 shortcut_iter->second.match_core.contents); | |
| 278 } | |
| 279 | |
| 280 TEST_F(ShortcutsBackendTest, DeleteShortcuts) { | |
| 281 InitBackend(); | |
| 282 ShortcutsDatabase::Shortcut shortcut1( | |
| 283 "BD85DBA2-8C29-49F9-84AE-48E1E90880DF", base::ASCIIToUTF16("goog"), | |
| 284 MatchCoreForTesting("http://www.google.com"), base::Time::Now(), 100); | |
| 285 EXPECT_TRUE(AddShortcut(shortcut1)); | |
| 286 | |
| 287 ShortcutsDatabase::Shortcut shortcut2( | |
| 288 "BD85DBA2-8C29-49F9-84AE-48E1E90880E0", base::ASCIIToUTF16("gle"), | |
| 289 MatchCoreForTesting("http://www.google.com"), base::Time::Now(), 100); | |
| 290 EXPECT_TRUE(AddShortcut(shortcut2)); | |
| 291 | |
| 292 ShortcutsDatabase::Shortcut shortcut3( | |
| 293 "BD85DBA2-8C29-49F9-84AE-48E1E90880E1", base::ASCIIToUTF16("sp"), | |
| 294 MatchCoreForTesting("http://www.sport.com"), base::Time::Now(), 10); | |
| 295 EXPECT_TRUE(AddShortcut(shortcut3)); | |
| 296 | |
| 297 ShortcutsDatabase::Shortcut shortcut4( | |
| 298 "BD85DBA2-8C29-49F9-84AE-48E1E90880E2", base::ASCIIToUTF16("mov"), | |
| 299 MatchCoreForTesting("http://www.film.com"), base::Time::Now(), 10); | |
| 300 EXPECT_TRUE(AddShortcut(shortcut4)); | |
| 301 | |
| 302 ASSERT_EQ(4U, shortcuts_map().size()); | |
| 303 EXPECT_EQ(shortcut1.id, shortcuts_map().find(shortcut1.text)->second.id); | |
| 304 EXPECT_EQ(shortcut2.id, shortcuts_map().find(shortcut2.text)->second.id); | |
| 305 EXPECT_EQ(shortcut3.id, shortcuts_map().find(shortcut3.text)->second.id); | |
| 306 EXPECT_EQ(shortcut4.id, shortcuts_map().find(shortcut4.text)->second.id); | |
| 307 | |
| 308 EXPECT_TRUE(DeleteShortcutsWithURL(shortcut1.match_core.destination_url)); | |
| 309 | |
| 310 ASSERT_EQ(2U, shortcuts_map().size()); | |
| 311 EXPECT_EQ(0U, shortcuts_map().count(shortcut1.text)); | |
| 312 EXPECT_EQ(0U, shortcuts_map().count(shortcut2.text)); | |
| 313 const ShortcutsBackend::ShortcutMap::const_iterator shortcut3_iter( | |
| 314 shortcuts_map().find(shortcut3.text)); | |
| 315 ASSERT_TRUE(shortcut3_iter != shortcuts_map().end()); | |
| 316 EXPECT_EQ(shortcut3.id, shortcut3_iter->second.id); | |
| 317 const ShortcutsBackend::ShortcutMap::const_iterator shortcut4_iter( | |
| 318 shortcuts_map().find(shortcut4.text)); | |
| 319 ASSERT_TRUE(shortcut4_iter != shortcuts_map().end()); | |
| 320 EXPECT_EQ(shortcut4.id, shortcut4_iter->second.id); | |
| 321 | |
| 322 ShortcutsDatabase::ShortcutIDs deleted_ids; | |
| 323 deleted_ids.push_back(shortcut3.id); | |
| 324 deleted_ids.push_back(shortcut4.id); | |
| 325 EXPECT_TRUE(DeleteShortcutsWithIDs(deleted_ids)); | |
| 326 | |
| 327 ASSERT_EQ(0U, shortcuts_map().size()); | |
| 328 } | |
| OLD | NEW |