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.
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/path_service.h"
10 #include "base/stl_util.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "base/time/time.h"
14 #include "chrome/browser/search_engines/template_url.h"
15 #include "chrome/browser/webdata/keyword_table.h"
16 #include "components/webdata/common/web_database.h"
17 #include "sql/statement.h"
18 #include "testing/gtest/include/gtest/gtest.h"
21 using base::TimeDelta;
23 class KeywordTableTest : public testing::Test {
26 virtual ~KeywordTableTest() {}
29 virtual void SetUp() {
30 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
31 file_ = temp_dir_.path().AppendASCII("TestWebDatabase");
33 table_.reset(new KeywordTable);
34 db_.reset(new WebDatabase);
35 db_->AddTable(table_.get());
36 ASSERT_EQ(sql::INIT_OK, db_->Init(file_));
40 base::ScopedTempDir temp_dir_;
41 scoped_ptr<KeywordTable> table_;
42 scoped_ptr<WebDatabase> db_;
45 DISALLOW_COPY_AND_ASSIGN(KeywordTableTest);
49 TEST_F(KeywordTableTest, Keywords) {
50 TemplateURLData keyword;
51 keyword.short_name = ASCIIToUTF16("short_name");
52 keyword.SetKeyword(ASCIIToUTF16("keyword"));
53 keyword.SetURL("http://url/");
54 keyword.instant_url = "http://instant/";
55 keyword.favicon_url = GURL("http://favicon.url/");
56 keyword.originating_url = GURL("http://google.com/");
57 keyword.show_in_default_list = true;
58 keyword.safe_for_autoreplace = true;
59 keyword.input_encodings.push_back("UTF-8");
60 keyword.input_encodings.push_back("UTF-16");
62 keyword.date_created = Time::Now();
63 keyword.last_modified = keyword.date_created + TimeDelta::FromSeconds(10);
64 keyword.created_by_policy = true;
65 keyword.usage_count = 32;
66 keyword.prepopulate_id = 10;
67 EXPECT_TRUE(table_->AddKeyword(keyword));
69 KeywordTable::Keywords keywords;
70 EXPECT_TRUE(table_->GetKeywords(&keywords));
71 EXPECT_EQ(1U, keywords.size());
72 const TemplateURLData& restored_keyword = keywords.front();
74 EXPECT_EQ(keyword.short_name, restored_keyword.short_name);
75 EXPECT_EQ(keyword.keyword(), restored_keyword.keyword());
76 EXPECT_EQ(keyword.url(), restored_keyword.url());
77 EXPECT_EQ(keyword.suggestions_url, restored_keyword.suggestions_url);
78 EXPECT_EQ(keyword.instant_url, restored_keyword.instant_url);
79 EXPECT_EQ(keyword.favicon_url, restored_keyword.favicon_url);
80 EXPECT_EQ(keyword.originating_url, restored_keyword.originating_url);
81 EXPECT_EQ(keyword.show_in_default_list,
82 restored_keyword.show_in_default_list);
83 EXPECT_EQ(keyword.safe_for_autoreplace,
84 restored_keyword.safe_for_autoreplace);
85 EXPECT_EQ(keyword.input_encodings, restored_keyword.input_encodings);
86 EXPECT_EQ(keyword.id, restored_keyword.id);
87 // The database stores time only at the resolution of a second.
88 EXPECT_EQ(keyword.date_created.ToTimeT(),
89 restored_keyword.date_created.ToTimeT());
90 EXPECT_EQ(keyword.last_modified.ToTimeT(),
91 restored_keyword.last_modified.ToTimeT());
92 EXPECT_EQ(keyword.created_by_policy, restored_keyword.created_by_policy);
93 EXPECT_EQ(keyword.usage_count, restored_keyword.usage_count);
94 EXPECT_EQ(keyword.prepopulate_id, restored_keyword.prepopulate_id);
96 EXPECT_TRUE(table_->RemoveKeyword(restored_keyword.id));
98 KeywordTable::Keywords empty_keywords;
99 EXPECT_TRUE(table_->GetKeywords(&empty_keywords));
100 EXPECT_EQ(0U, empty_keywords.size());
103 TEST_F(KeywordTableTest, KeywordMisc) {
104 EXPECT_EQ(kInvalidTemplateURLID, table_->GetDefaultSearchProviderID());
105 EXPECT_EQ(0, table_->GetBuiltinKeywordVersion());
107 TemplateURLData keyword;
108 keyword.short_name = ASCIIToUTF16("short_name");
109 keyword.SetKeyword(ASCIIToUTF16("keyword"));
110 keyword.SetURL("http://url/");
111 keyword.instant_url = "http://instant/";
112 keyword.favicon_url = GURL("http://favicon.url/");
113 keyword.originating_url = GURL("http://google.com/");
114 keyword.show_in_default_list = true;
115 keyword.safe_for_autoreplace = true;
116 keyword.input_encodings.push_back("UTF-8");
117 keyword.input_encodings.push_back("UTF-16");
119 keyword.date_created = Time::Now();
120 keyword.last_modified = keyword.date_created + TimeDelta::FromSeconds(10);
121 keyword.created_by_policy = true;
122 keyword.usage_count = 32;
123 keyword.prepopulate_id = 10;
124 EXPECT_TRUE(table_->AddKeyword(keyword));
126 EXPECT_TRUE(table_->SetDefaultSearchProviderID(10));
127 EXPECT_TRUE(table_->SetBuiltinKeywordVersion(11));
129 EXPECT_EQ(10, table_->GetDefaultSearchProviderID());
130 EXPECT_EQ(11, table_->GetBuiltinKeywordVersion());
133 TEST_F(KeywordTableTest, GetTableContents) {
134 TemplateURLData keyword;
135 keyword.short_name = ASCIIToUTF16("short_name");
136 keyword.SetKeyword(ASCIIToUTF16("keyword"));
137 keyword.SetURL("http://url/");
138 keyword.suggestions_url = "url2";
139 keyword.image_url = "http://image-search-url/";
140 keyword.new_tab_url = "http://new-tab-url/";
141 keyword.favicon_url = GURL("http://favicon.url/");
142 keyword.show_in_default_list = true;
143 keyword.safe_for_autoreplace = true;
145 keyword.date_created = base::Time::UnixEpoch();
146 keyword.last_modified = base::Time::UnixEpoch();
147 keyword.sync_guid = "1234-5678-90AB-CDEF";
148 keyword.alternate_urls.push_back("a_url1");
149 keyword.alternate_urls.push_back("a_url2");
150 keyword.search_terms_replacement_key = "espv";
151 EXPECT_TRUE(table_->AddKeyword(keyword));
153 keyword.SetKeyword(ASCIIToUTF16("url"));
154 keyword.instant_url = "http://instant2/";
155 keyword.image_url.clear();
156 keyword.new_tab_url.clear();
157 keyword.originating_url = GURL("http://originating.url/");
158 keyword.input_encodings.push_back("Shift_JIS");
160 keyword.prepopulate_id = 5;
161 keyword.sync_guid = "FEDC-BA09-8765-4321";
162 keyword.alternate_urls.clear();
163 keyword.search_terms_replacement_key.clear();
164 EXPECT_TRUE(table_->AddKeyword(keyword));
166 const char kTestContents[] = "1short_namekeywordhttp://favicon.url/"
167 "http://url/1001url20001234-5678-90AB-CDEF[\"a_url1\",\"a_url2\"]espv"
168 "http://image-search-url/http://new-tab-url/2short_nameurl"
169 "http://favicon.url/http://url/1http://originating.url/00Shift_JIS1url250"
170 "http://instant2/0FEDC-BA09-8765-4321[]";
172 std::string contents;
173 EXPECT_TRUE(table_->GetTableContents("keywords",
174 WebDatabase::kCurrentVersionNumber, &contents));
175 EXPECT_EQ(kTestContents, contents);
178 TEST_F(KeywordTableTest, GetTableContentsOrdering) {
179 TemplateURLData keyword;
180 keyword.short_name = ASCIIToUTF16("short_name");
181 keyword.SetKeyword(ASCIIToUTF16("keyword"));
182 keyword.SetURL("http://url/");
183 keyword.suggestions_url = "url2";
184 keyword.favicon_url = GURL("http://favicon.url/");
185 keyword.show_in_default_list = true;
186 keyword.safe_for_autoreplace = true;
188 keyword.date_created = base::Time::UnixEpoch();
189 keyword.last_modified = base::Time::UnixEpoch();
190 keyword.sync_guid = "1234-5678-90AB-CDEF";
191 keyword.alternate_urls.push_back("a_url1");
192 keyword.alternate_urls.push_back("a_url2");
193 keyword.search_terms_replacement_key = "espv";
194 keyword.image_url = "http://image-search-url/";
195 keyword.search_url_post_params = "ie=utf-8,oe=utf-8";
196 keyword.image_url_post_params = "name=1,value=2";
197 keyword.new_tab_url = "http://new-tab-url";
198 EXPECT_TRUE(table_->AddKeyword(keyword));
200 keyword.SetKeyword(ASCIIToUTF16("url"));
201 keyword.instant_url = "http://instant2/";
202 keyword.originating_url = GURL("http://originating.url/");
203 keyword.input_encodings.push_back("Shift_JIS");
205 keyword.prepopulate_id = 5;
206 keyword.sync_guid = "FEDC-BA09-8765-4321";
207 keyword.alternate_urls.clear();
208 keyword.search_terms_replacement_key.clear();
209 keyword.image_url.clear();
210 keyword.search_url_post_params.clear();
211 keyword.image_url_post_params.clear();
212 keyword.new_tab_url.clear();
213 EXPECT_TRUE(table_->AddKeyword(keyword));
215 const char kTestContents[] = "1short_nameurlhttp://favicon.url/"
216 "http://url/1http://originating.url/00Shift_JIS1url250http://instant2/"
217 "0FEDC-BA09-8765-4321[]2short_namekeywordhttp://favicon.url/http://url/"
218 "1001url20001234-5678-90AB-CDEF[\"a_url1\",\"a_url2\"]espv"
219 "http://image-search-url/ie=utf-8,oe=utf-8name=1,value=2"
220 "http://new-tab-url";
222 std::string contents;
223 EXPECT_TRUE(table_->GetTableContents("keywords",
224 WebDatabase::kCurrentVersionNumber, &contents));
225 EXPECT_EQ(kTestContents, contents);
228 TEST_F(KeywordTableTest, UpdateKeyword) {
229 TemplateURLData keyword;
230 keyword.short_name = ASCIIToUTF16("short_name");
231 keyword.SetKeyword(ASCIIToUTF16("keyword"));
232 keyword.SetURL("http://url/");
233 keyword.suggestions_url = "url2";
234 keyword.favicon_url = GURL("http://favicon.url/");
235 keyword.show_in_default_list = true;
236 keyword.safe_for_autoreplace = true;
238 EXPECT_TRUE(table_->AddKeyword(keyword));
240 keyword.SetKeyword(ASCIIToUTF16("url"));
241 keyword.instant_url = "http://instant2/";
242 keyword.originating_url = GURL("http://originating.url/");
243 keyword.input_encodings.push_back("Shift_JIS");
244 keyword.prepopulate_id = 5;
245 EXPECT_TRUE(table_->UpdateKeyword(keyword));
247 KeywordTable::Keywords keywords;
248 EXPECT_TRUE(table_->GetKeywords(&keywords));
249 EXPECT_EQ(1U, keywords.size());
250 const TemplateURLData& restored_keyword = keywords.front();
252 EXPECT_EQ(keyword.short_name, restored_keyword.short_name);
253 EXPECT_EQ(keyword.keyword(), restored_keyword.keyword());
254 EXPECT_EQ(keyword.suggestions_url, restored_keyword.suggestions_url);
255 EXPECT_EQ(keyword.instant_url, restored_keyword.instant_url);
256 EXPECT_EQ(keyword.favicon_url, restored_keyword.favicon_url);
257 EXPECT_EQ(keyword.originating_url, restored_keyword.originating_url);
258 EXPECT_EQ(keyword.show_in_default_list,
259 restored_keyword.show_in_default_list);
260 EXPECT_EQ(keyword.safe_for_autoreplace,
261 restored_keyword.safe_for_autoreplace);
262 EXPECT_EQ(keyword.input_encodings, restored_keyword.input_encodings);
263 EXPECT_EQ(keyword.id, restored_keyword.id);
264 EXPECT_EQ(keyword.prepopulate_id, restored_keyword.prepopulate_id);
267 TEST_F(KeywordTableTest, KeywordWithNoFavicon) {
268 TemplateURLData keyword;
269 keyword.short_name = ASCIIToUTF16("short_name");
270 keyword.SetKeyword(ASCIIToUTF16("keyword"));
271 keyword.SetURL("http://url/");
272 keyword.safe_for_autoreplace = true;
274 EXPECT_TRUE(table_->AddKeyword(keyword));
276 KeywordTable::Keywords keywords;
277 EXPECT_TRUE(table_->GetKeywords(&keywords));
278 EXPECT_EQ(1U, keywords.size());
279 const TemplateURLData& restored_keyword = keywords.front();
281 EXPECT_EQ(keyword.short_name, restored_keyword.short_name);
282 EXPECT_EQ(keyword.keyword(), restored_keyword.keyword());
283 EXPECT_EQ(keyword.favicon_url, restored_keyword.favicon_url);
284 EXPECT_EQ(keyword.safe_for_autoreplace,
285 restored_keyword.safe_for_autoreplace);
286 EXPECT_EQ(keyword.id, restored_keyword.id);
289 TEST_F(KeywordTableTest, SanitizeURLs) {
290 TemplateURLData keyword;
291 keyword.short_name = ASCIIToUTF16("legit");
292 keyword.SetKeyword(ASCIIToUTF16("legit"));
293 keyword.SetURL("http://url/");
295 EXPECT_TRUE(table_->AddKeyword(keyword));
297 keyword.short_name = ASCIIToUTF16("bogus");
298 keyword.SetKeyword(ASCIIToUTF16("bogus"));
300 EXPECT_TRUE(table_->AddKeyword(keyword));
302 KeywordTable::Keywords keywords;
303 EXPECT_TRUE(table_->GetKeywords(&keywords));
304 EXPECT_EQ(2U, keywords.size());
307 // Erase the URL field for the second keyword to simulate having bogus data
308 // previously saved into the database.
309 sql::Statement s(table_->db_->GetUniqueStatement(
310 "UPDATE keywords SET url=? WHERE id=?"));
311 s.BindString16(0, string16());
312 s.BindInt64(1, 2000);
313 EXPECT_TRUE(s.Run());
315 // GetKeywords() should erase the entry with the empty URL field.
316 EXPECT_TRUE(table_->GetKeywords(&keywords));
317 EXPECT_EQ(1U, keywords.size());