- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / webdata / keyword_table_unittest.cc
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 <string>
6 #include <vector>
7
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"
19
20 using base::Time;
21 using base::TimeDelta;
22
23 class KeywordTableTest : public testing::Test {
24  public:
25   KeywordTableTest() {}
26   virtual ~KeywordTableTest() {}
27
28  protected:
29   virtual void SetUp() {
30     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
31     file_ = temp_dir_.path().AppendASCII("TestWebDatabase");
32
33     table_.reset(new KeywordTable);
34     db_.reset(new WebDatabase);
35     db_->AddTable(table_.get());
36     ASSERT_EQ(sql::INIT_OK, db_->Init(file_));
37   }
38
39   base::FilePath file_;
40   base::ScopedTempDir temp_dir_;
41   scoped_ptr<KeywordTable> table_;
42   scoped_ptr<WebDatabase> db_;
43
44  private:
45   DISALLOW_COPY_AND_ASSIGN(KeywordTableTest);
46 };
47
48
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");
61   keyword.id = 1;
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));
68
69   KeywordTable::Keywords keywords;
70   EXPECT_TRUE(table_->GetKeywords(&keywords));
71   EXPECT_EQ(1U, keywords.size());
72   const TemplateURLData& restored_keyword = keywords.front();
73
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);
95
96   EXPECT_TRUE(table_->RemoveKeyword(restored_keyword.id));
97
98   KeywordTable::Keywords empty_keywords;
99   EXPECT_TRUE(table_->GetKeywords(&empty_keywords));
100   EXPECT_EQ(0U, empty_keywords.size());
101 }
102
103 TEST_F(KeywordTableTest, KeywordMisc) {
104   EXPECT_EQ(kInvalidTemplateURLID, table_->GetDefaultSearchProviderID());
105   EXPECT_EQ(0, table_->GetBuiltinKeywordVersion());
106
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");
118   keyword.id = 10;
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));
125
126   EXPECT_TRUE(table_->SetDefaultSearchProviderID(10));
127   EXPECT_TRUE(table_->SetBuiltinKeywordVersion(11));
128
129   EXPECT_EQ(10, table_->GetDefaultSearchProviderID());
130   EXPECT_EQ(11, table_->GetBuiltinKeywordVersion());
131 }
132
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;
144   keyword.id = 1;
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));
152
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");
159   keyword.id = 2;
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));
165
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[]";
171
172   std::string contents;
173   EXPECT_TRUE(table_->GetTableContents("keywords",
174       WebDatabase::kCurrentVersionNumber, &contents));
175   EXPECT_EQ(kTestContents, contents);
176 }
177
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;
187   keyword.id = 2;
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));
199
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");
204   keyword.id = 1;
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));
214
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";
221
222   std::string contents;
223   EXPECT_TRUE(table_->GetTableContents("keywords",
224       WebDatabase::kCurrentVersionNumber, &contents));
225   EXPECT_EQ(kTestContents, contents);
226 }
227
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;
237   keyword.id = 1;
238   EXPECT_TRUE(table_->AddKeyword(keyword));
239
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));
246
247   KeywordTable::Keywords keywords;
248   EXPECT_TRUE(table_->GetKeywords(&keywords));
249   EXPECT_EQ(1U, keywords.size());
250   const TemplateURLData& restored_keyword = keywords.front();
251
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);
265 }
266
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;
273   keyword.id = -100;
274   EXPECT_TRUE(table_->AddKeyword(keyword));
275
276   KeywordTable::Keywords keywords;
277   EXPECT_TRUE(table_->GetKeywords(&keywords));
278   EXPECT_EQ(1U, keywords.size());
279   const TemplateURLData& restored_keyword = keywords.front();
280
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);
287 }
288
289 TEST_F(KeywordTableTest, SanitizeURLs) {
290   TemplateURLData keyword;
291   keyword.short_name = ASCIIToUTF16("legit");
292   keyword.SetKeyword(ASCIIToUTF16("legit"));
293   keyword.SetURL("http://url/");
294   keyword.id = 1000;
295   EXPECT_TRUE(table_->AddKeyword(keyword));
296
297   keyword.short_name = ASCIIToUTF16("bogus");
298   keyword.SetKeyword(ASCIIToUTF16("bogus"));
299   keyword.id = 2000;
300   EXPECT_TRUE(table_->AddKeyword(keyword));
301
302   KeywordTable::Keywords keywords;
303   EXPECT_TRUE(table_->GetKeywords(&keywords));
304   EXPECT_EQ(2U, keywords.size());
305   keywords.clear();
306
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());
314
315   // GetKeywords() should erase the entry with the empty URL field.
316   EXPECT_TRUE(table_->GetKeywords(&keywords));
317   EXPECT_EQ(1U, keywords.size());
318 }