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/stl_util.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h"
13 #include "components/search_engines/keyword_table.h"
14 #include "components/search_engines/template_url_data.h"
15 #include "components/webdata/common/web_database.h"
16 #include "sql/statement.h"
17 #include "testing/gtest/include/gtest/gtest.h"
19 using base::ASCIIToUTF16
;
21 using base::TimeDelta
;
23 class KeywordTableTest
: public testing::Test
{
26 ~KeywordTableTest() override
{}
29 void SetUp() override
{
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_
));
39 void AddKeyword(const TemplateURLData
& keyword
) const {
40 EXPECT_TRUE(table_
->AddKeyword(keyword
));
43 TemplateURLData
CreateAndAddKeyword() const {
44 TemplateURLData keyword
;
45 keyword
.SetShortName(ASCIIToUTF16("short_name"));
46 keyword
.SetKeyword(ASCIIToUTF16("keyword"));
47 keyword
.SetURL("http://url/");
48 keyword
.suggestions_url
= "url2";
49 keyword
.instant_url
= "http://instant/";
50 keyword
.image_url
= "http://image-search-url/";
51 keyword
.new_tab_url
= "http://new-tab-url/";
52 keyword
.search_url_post_params
= "ie=utf-8,oe=utf-8";
53 keyword
.image_url_post_params
= "name=1,value=2";
54 keyword
.favicon_url
= GURL("http://favicon.url/");
55 keyword
.originating_url
= GURL("http://google.com/");
56 keyword
.show_in_default_list
= true;
57 keyword
.safe_for_autoreplace
= true;
58 keyword
.input_encodings
.push_back("UTF-8");
59 keyword
.input_encodings
.push_back("UTF-16");
61 keyword
.date_created
= base::Time::UnixEpoch();
62 keyword
.last_modified
= base::Time::UnixEpoch();
63 keyword
.created_by_policy
= true;
64 keyword
.usage_count
= 32;
65 keyword
.prepopulate_id
= 10;
66 keyword
.sync_guid
= "1234-5678-90AB-CDEF";
67 keyword
.alternate_urls
.push_back("a_url1");
68 keyword
.alternate_urls
.push_back("a_url2");
69 keyword
.search_terms_replacement_key
= "espv";
74 void RemoveKeyword(TemplateURLID id
) const {
75 EXPECT_TRUE(table_
->RemoveKeyword(id
));
78 void UpdateKeyword(const TemplateURLData
& keyword
) const {
79 EXPECT_TRUE(table_
->UpdateKeyword(keyword
));
82 KeywordTable::Keywords
GetKeywords() const {
83 KeywordTable::Keywords keywords
;
84 EXPECT_TRUE(table_
->GetKeywords(&keywords
));
88 void KeywordMiscTest() const {
89 EXPECT_EQ(kInvalidTemplateURLID
, table_
->GetDefaultSearchProviderID());
90 EXPECT_EQ(0, table_
->GetBuiltinKeywordVersion());
92 EXPECT_TRUE(table_
->SetDefaultSearchProviderID(10));
93 EXPECT_TRUE(table_
->SetBuiltinKeywordVersion(11));
95 EXPECT_EQ(10, table_
->GetDefaultSearchProviderID());
96 EXPECT_EQ(11, table_
->GetBuiltinKeywordVersion());
99 void GetStatement(const char* sql
, sql::Statement
* statement
) const {
100 statement
->Assign(table_
->db_
->GetUniqueStatement(sql
));
104 base::FilePath file_
;
105 base::ScopedTempDir temp_dir_
;
106 scoped_ptr
<KeywordTable
> table_
;
107 scoped_ptr
<WebDatabase
> db_
;
109 DISALLOW_COPY_AND_ASSIGN(KeywordTableTest
);
113 TEST_F(KeywordTableTest
, Keywords
) {
114 TemplateURLData
keyword(CreateAndAddKeyword());
116 KeywordTable::Keywords
keywords(GetKeywords());
117 EXPECT_EQ(1U, keywords
.size());
118 const TemplateURLData
& restored_keyword
= keywords
.front();
120 EXPECT_EQ(keyword
.short_name(), restored_keyword
.short_name());
121 EXPECT_EQ(keyword
.keyword(), restored_keyword
.keyword());
122 EXPECT_EQ(keyword
.url(), restored_keyword
.url());
123 EXPECT_EQ(keyword
.suggestions_url
, restored_keyword
.suggestions_url
);
124 EXPECT_EQ(keyword
.instant_url
, restored_keyword
.instant_url
);
125 EXPECT_EQ(keyword
.favicon_url
, restored_keyword
.favicon_url
);
126 EXPECT_EQ(keyword
.originating_url
, restored_keyword
.originating_url
);
127 EXPECT_EQ(keyword
.show_in_default_list
,
128 restored_keyword
.show_in_default_list
);
129 EXPECT_EQ(keyword
.safe_for_autoreplace
,
130 restored_keyword
.safe_for_autoreplace
);
131 EXPECT_EQ(keyword
.input_encodings
, restored_keyword
.input_encodings
);
132 EXPECT_EQ(keyword
.id
, restored_keyword
.id
);
133 // The database stores time only at the resolution of a second.
134 EXPECT_EQ(keyword
.date_created
.ToTimeT(),
135 restored_keyword
.date_created
.ToTimeT());
136 EXPECT_EQ(keyword
.last_modified
.ToTimeT(),
137 restored_keyword
.last_modified
.ToTimeT());
138 EXPECT_EQ(keyword
.created_by_policy
, restored_keyword
.created_by_policy
);
139 EXPECT_EQ(keyword
.usage_count
, restored_keyword
.usage_count
);
140 EXPECT_EQ(keyword
.prepopulate_id
, restored_keyword
.prepopulate_id
);
142 RemoveKeyword(restored_keyword
.id
);
144 EXPECT_EQ(0U, GetKeywords().size());
147 TEST_F(KeywordTableTest
, KeywordMisc
) {
151 TEST_F(KeywordTableTest
, UpdateKeyword
) {
152 TemplateURLData
keyword(CreateAndAddKeyword());
154 keyword
.SetKeyword(ASCIIToUTF16("url"));
155 keyword
.instant_url
= "http://instant2/";
156 keyword
.originating_url
= GURL("http://originating.url/");
157 keyword
.input_encodings
.push_back("Shift_JIS");
158 keyword
.prepopulate_id
= 5;
159 UpdateKeyword(keyword
);
161 KeywordTable::Keywords
keywords(GetKeywords());
162 EXPECT_EQ(1U, keywords
.size());
163 const TemplateURLData
& restored_keyword
= keywords
.front();
165 EXPECT_EQ(keyword
.short_name(), restored_keyword
.short_name());
166 EXPECT_EQ(keyword
.keyword(), restored_keyword
.keyword());
167 EXPECT_EQ(keyword
.suggestions_url
, restored_keyword
.suggestions_url
);
168 EXPECT_EQ(keyword
.instant_url
, restored_keyword
.instant_url
);
169 EXPECT_EQ(keyword
.favicon_url
, restored_keyword
.favicon_url
);
170 EXPECT_EQ(keyword
.originating_url
, restored_keyword
.originating_url
);
171 EXPECT_EQ(keyword
.show_in_default_list
,
172 restored_keyword
.show_in_default_list
);
173 EXPECT_EQ(keyword
.safe_for_autoreplace
,
174 restored_keyword
.safe_for_autoreplace
);
175 EXPECT_EQ(keyword
.input_encodings
, restored_keyword
.input_encodings
);
176 EXPECT_EQ(keyword
.id
, restored_keyword
.id
);
177 EXPECT_EQ(keyword
.prepopulate_id
, restored_keyword
.prepopulate_id
);
180 TEST_F(KeywordTableTest
, KeywordWithNoFavicon
) {
181 TemplateURLData keyword
;
182 keyword
.SetShortName(ASCIIToUTF16("short_name"));
183 keyword
.SetKeyword(ASCIIToUTF16("keyword"));
184 keyword
.SetURL("http://url/");
185 keyword
.safe_for_autoreplace
= true;
189 KeywordTable::Keywords
keywords(GetKeywords());
190 EXPECT_EQ(1U, keywords
.size());
191 const TemplateURLData
& restored_keyword
= keywords
.front();
193 EXPECT_EQ(keyword
.short_name(), restored_keyword
.short_name());
194 EXPECT_EQ(keyword
.keyword(), restored_keyword
.keyword());
195 EXPECT_EQ(keyword
.favicon_url
, restored_keyword
.favicon_url
);
196 EXPECT_EQ(keyword
.safe_for_autoreplace
,
197 restored_keyword
.safe_for_autoreplace
);
198 EXPECT_EQ(keyword
.id
, restored_keyword
.id
);
201 TEST_F(KeywordTableTest
, SanitizeURLs
) {
202 TemplateURLData keyword
;
203 keyword
.SetShortName(ASCIIToUTF16("legit"));
204 keyword
.SetKeyword(ASCIIToUTF16("legit"));
205 keyword
.SetURL("http://url/");
209 keyword
.SetShortName(ASCIIToUTF16("bogus"));
210 keyword
.SetKeyword(ASCIIToUTF16("bogus"));
214 EXPECT_EQ(2U, GetKeywords().size());
216 // Erase the URL field for the second keyword to simulate having bogus data
217 // previously saved into the database.
219 GetStatement("UPDATE keywords SET url=? WHERE id=?", &s
);
220 s
.BindString16(0, base::string16());
221 s
.BindInt64(1, 2000);
222 EXPECT_TRUE(s
.Run());
224 // GetKeywords() should erase the entry with the empty URL field.
225 EXPECT_EQ(1U, GetKeywords().size());
228 TEST_F(KeywordTableTest
, SanitizeShortName
) {
229 TemplateURLData keyword
;
231 keyword
.SetShortName(ASCIIToUTF16("legit name"));
232 keyword
.SetKeyword(ASCIIToUTF16("legit"));
233 keyword
.SetURL("http://url/");
236 KeywordTable::Keywords
keywords(GetKeywords());
237 EXPECT_EQ(1U, keywords
.size());
238 const TemplateURLData
& keyword_from_database
= keywords
.front();
239 EXPECT_EQ(keyword
.id
, keyword_from_database
.id
);
240 EXPECT_EQ(ASCIIToUTF16("legit name"), keyword_from_database
.short_name());
241 RemoveKeyword(keyword
.id
);
245 keyword
.SetShortName(ASCIIToUTF16("\t\tbogus \tname \n"));
246 keyword
.SetKeyword(ASCIIToUTF16("bogus"));
249 KeywordTable::Keywords
keywords(GetKeywords());
250 EXPECT_EQ(1U, keywords
.size());
251 const TemplateURLData
& keyword_from_database
= keywords
.front();
252 EXPECT_EQ(keyword
.id
, keyword_from_database
.id
);
253 EXPECT_EQ(ASCIIToUTF16("bogus name"), keyword_from_database
.short_name());
254 RemoveKeyword(keyword
.id
);