Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: chrome/browser/history/top_sites_database_unittest.cc

Issue 560543002: [Top Sites] Encoding redirects field in TopSitesDatabase, and adding validations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Setting database to v4, adding migration code. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/history/top_sites_database.cc ('k') | chrome/test/data/History/TopSites.v3.sql » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <map> 5 #include "chrome/browser/history/top_sites_database.h"
6 6
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/files/scoped_temp_dir.h" 8 #include "base/files/scoped_temp_dir.h"
9 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/history/history_types.h" 11 #include "chrome/browser/history/history_types.h"
12 #include "chrome/browser/history/top_sites_database.h"
13 #include "chrome/common/chrome_paths.h" 12 #include "chrome/common/chrome_paths.h"
14 #include "chrome/tools/profiles/thumbnail-inl.h" 13 #include "chrome/tools/profiles/thumbnail-inl.h"
15 #include "sql/connection.h" 14 #include "sql/connection.h"
16 #include "sql/recovery.h" 15 #include "sql/recovery.h"
17 #include "sql/test/scoped_error_ignorer.h" 16 #include "sql/test/scoped_error_ignorer.h"
18 #include "sql/test/test_helpers.h" 17 #include "sql/test/test_helpers.h"
19 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
20 #include "third_party/sqlite/sqlite3.h" 19 #include "third_party/sqlite/sqlite3.h"
21 #include "url/gurl.h" 20 #include "url/gurl.h"
22 21
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 namespace history { 73 namespace history {
75 74
76 class TopSitesDatabaseTest : public testing::Test { 75 class TopSitesDatabaseTest : public testing::Test {
77 protected: 76 protected:
78 virtual void SetUp() { 77 virtual void SetUp() {
79 // Get a temporary directory for the test DB files. 78 // Get a temporary directory for the test DB files.
80 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 79 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
81 file_name_ = temp_dir_.path().AppendASCII("TestTopSites.db"); 80 file_name_ = temp_dir_.path().AppendASCII("TestTopSites.db");
82 } 81 }
83 82
83 // The only difference between v3 and v4 is how redirects URLs are stored, so
84 // most of the tests should be common.
85 void DatabaseTest3And4Common();
86 void RecoveryTest3And4Common();
87
84 base::ScopedTempDir temp_dir_; 88 base::ScopedTempDir temp_dir_;
85 base::FilePath file_name_; 89 base::FilePath file_name_;
86 }; 90 };
87 91
88 // Version 1 is deprecated, the resulting schema should be current, 92 // Version 1 is deprecated, the resulting schema should be current,
89 // with no data. 93 // with no data.
90 TEST_F(TopSitesDatabaseTest, Version1) { 94 TEST_F(TopSitesDatabaseTest, Version1) {
91 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v1.sql")); 95 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v1.sql"));
92 96
93 TopSitesDatabase db; 97 TopSitesDatabase db;
(...skipping 22 matching lines...) Expand all
116 thumbnails[urls[0].url].thumbnail->size()); 120 thumbnails[urls[0].url].thumbnail->size());
117 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(), 121 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(),
118 kGoogleThumbnail, sizeof(kGoogleThumbnail) - 1)); 122 kGoogleThumbnail, sizeof(kGoogleThumbnail) - 1));
119 123
120 ASSERT_TRUE(db.RemoveURL(urls[1])); 124 ASSERT_TRUE(db.RemoveURL(urls[1]));
121 db.GetPageThumbnails(&urls, &thumbnails); 125 db.GetPageThumbnails(&urls, &thumbnails);
122 ASSERT_EQ(2u, urls.size()); 126 ASSERT_EQ(2u, urls.size());
123 ASSERT_EQ(2u, thumbnails.size()); 127 ASSERT_EQ(2u, thumbnails.size());
124 } 128 }
125 129
126 TEST_F(TopSitesDatabaseTest, Version3) { 130 void TopSitesDatabaseTest::DatabaseTest3And4Common() {
127 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
128
129 TopSitesDatabase db; 131 TopSitesDatabase db;
130 ASSERT_TRUE(db.Init(file_name_)); 132 ASSERT_TRUE(db.Init(file_name_));
131
132 VerifyTablesAndColumns(db.db_.get()); 133 VerifyTablesAndColumns(db.db_.get());
133 134
134 // Basic operational check. 135 // Basic read operational check.
135 MostVisitedURLList urls; 136 MostVisitedURLList urls;
136 std::map<GURL, Images> thumbnails; 137 std::map<GURL, Images> thumbnails;
137 db.GetPageThumbnails(&urls, &thumbnails); 138 db.GetPageThumbnails(&urls, &thumbnails);
138 ASSERT_EQ(3u, urls.size()); 139 ASSERT_EQ(3u, urls.size());
139 ASSERT_EQ(3u, thumbnails.size()); 140 ASSERT_EQ(3u, thumbnails.size());
140 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank. 141 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank.
142 EXPECT_EQ(kUrl1, urls[1].url);
143 EXPECT_EQ(kUrl2, urls[2].url);
144 EXPECT_EQ(2u, urls[0].redirects.size());
145 EXPECT_EQ(1u, urls[1].redirects.size());
146 EXPECT_EQ(1u, urls[2].redirects.size());
147
141 // kGoogleThumbnail includes nul terminator. 148 // kGoogleThumbnail includes nul terminator.
142 ASSERT_EQ(sizeof(kGoogleThumbnail) - 1, 149 ASSERT_EQ(sizeof(kGoogleThumbnail) - 1,
143 thumbnails[urls[0].url].thumbnail->size()); 150 thumbnails[urls[0].url].thumbnail->size());
144 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(), 151 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(),
145 kGoogleThumbnail, sizeof(kGoogleThumbnail) - 1)); 152 kGoogleThumbnail, sizeof(kGoogleThumbnail) - 1));
146 153
154 // Basic write operational check.
147 ASSERT_TRUE(db.RemoveURL(urls[1])); 155 ASSERT_TRUE(db.RemoveURL(urls[1]));
148 db.GetPageThumbnails(&urls, &thumbnails); 156 db.GetPageThumbnails(&urls, &thumbnails);
149 ASSERT_EQ(2u, urls.size()); 157 ASSERT_EQ(2u, urls.size());
150 ASSERT_EQ(2u, thumbnails.size()); 158 ASSERT_EQ(2u, thumbnails.size());
151 } 159 }
152 160
161 TEST_F(TopSitesDatabaseTest, Version3) {
162 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
163 DatabaseTest3And4Common();
164 }
165
166 TEST_F(TopSitesDatabaseTest, Version4) {
167 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v4.sql"));
168 DatabaseTest3And4Common();
169 }
170
171 // Verify that database is unusable at the SQLite level.
172 void RecoveryTestVerifyDatabaseIsUnusable(const base::FilePath& file_name) {
173 sql::ScopedErrorIgnorer ignore_errors;
174 ignore_errors.IgnoreError(SQLITE_CORRUPT);
175 sql::Connection raw_db;
176 EXPECT_TRUE(raw_db.Open(file_name));
177 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
178 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
179 }
180
153 // Version 1 is deprecated, the resulting schema should be current, 181 // Version 1 is deprecated, the resulting schema should be current,
154 // with no data. 182 // with no data.
155 TEST_F(TopSitesDatabaseTest, Recovery1) { 183 TEST_F(TopSitesDatabaseTest, Recovery1) {
156 // Recovery module only supports some platforms at this time. 184 // Recovery module only supports some platforms at this time.
157 if (!sql::Recovery::FullRecoverySupported()) 185 if (!sql::Recovery::FullRecoverySupported())
158 return; 186 return;
159 187
160 // Create an example database. 188 // Create an example database.
161 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v1.sql")); 189 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v1.sql"));
162 190
163 // Corrupt the database by adjusting the header size. 191 // Corrupt the database by adjusting the header size.
164 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); 192 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
165 193
166 // Database is unusable at the SQLite level. 194 RecoveryTestVerifyDatabaseIsUnusable(file_name_);
167 {
168 sql::ScopedErrorIgnorer ignore_errors;
169 ignore_errors.IgnoreError(SQLITE_CORRUPT);
170 sql::Connection raw_db;
171 EXPECT_TRUE(raw_db.Open(file_name_));
172 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
173 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
174 }
175 195
176 // Corruption should be detected and recovered during Init(). 196 // Corruption should be detected and recovered during Init().
177 { 197 {
178 sql::ScopedErrorIgnorer ignore_errors; 198 sql::ScopedErrorIgnorer ignore_errors;
179 ignore_errors.IgnoreError(SQLITE_CORRUPT); 199 ignore_errors.IgnoreError(SQLITE_CORRUPT);
180 200
181 TopSitesDatabase db; 201 TopSitesDatabase db;
182 ASSERT_TRUE(db.Init(file_name_)); 202 ASSERT_TRUE(db.Init(file_name_));
183 VerifyTablesAndColumns(db.db_.get()); 203 VerifyTablesAndColumns(db.db_.get());
184 VerifyDatabaseEmpty(db.db_.get()); 204 VerifyDatabaseEmpty(db.db_.get());
185 205
186 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 206 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
187 } 207 }
188 } 208 }
189 209
190 TEST_F(TopSitesDatabaseTest, Recovery2) { 210 TEST_F(TopSitesDatabaseTest, Recovery2) {
191 // Recovery module only supports some platforms at this time. 211 // Recovery module only supports some platforms at this time.
192 if (!sql::Recovery::FullRecoverySupported()) 212 if (!sql::Recovery::FullRecoverySupported())
193 return; 213 return;
194 214
195 // Create an example database. 215 // Create an example database.
196 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v2.sql")); 216 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v2.sql"));
197 217
198 // Corrupt the database by adjusting the header. 218 // Corrupt the database by adjusting the header.
199 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); 219 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
200 220
201 // Database is unusable at the SQLite level. 221 RecoveryTestVerifyDatabaseIsUnusable(file_name_);
202 {
203 sql::ScopedErrorIgnorer ignore_errors;
204 ignore_errors.IgnoreError(SQLITE_CORRUPT);
205 sql::Connection raw_db;
206 EXPECT_TRUE(raw_db.Open(file_name_));
207 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
208 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
209 }
210 222
211 // Corruption should be detected and recovered during Init(). After recovery, 223 // Corruption should be detected and recovered during Init(). After recovery,
212 // the Version2 checks should work. 224 // the Version2 checks should work.
213 { 225 {
214 sql::ScopedErrorIgnorer ignore_errors; 226 sql::ScopedErrorIgnorer ignore_errors;
215 ignore_errors.IgnoreError(SQLITE_CORRUPT); 227 ignore_errors.IgnoreError(SQLITE_CORRUPT);
216 228
217 TopSitesDatabase db; 229 TopSitesDatabase db;
218 ASSERT_TRUE(db.Init(file_name_)); 230 ASSERT_TRUE(db.Init(file_name_));
219
220 VerifyTablesAndColumns(db.db_.get()); 231 VerifyTablesAndColumns(db.db_.get());
221 232
222 // Basic operational check. 233 // Basic operational check.
223 MostVisitedURLList urls; 234 MostVisitedURLList urls;
224 std::map<GURL, Images> thumbnails; 235 std::map<GURL, Images> thumbnails;
225 db.GetPageThumbnails(&urls, &thumbnails); 236 db.GetPageThumbnails(&urls, &thumbnails);
226 ASSERT_EQ(3u, urls.size()); 237 ASSERT_EQ(3u, urls.size());
227 ASSERT_EQ(3u, thumbnails.size()); 238 ASSERT_EQ(3u, thumbnails.size());
228 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank. 239 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank.
229 // kGoogleThumbnail includes nul terminator. 240 // kGoogleThumbnail includes nul terminator.
230 ASSERT_EQ(sizeof(kGoogleThumbnail) - 1, 241 ASSERT_EQ(sizeof(kGoogleThumbnail) - 1,
231 thumbnails[urls[0].url].thumbnail->size()); 242 thumbnails[urls[0].url].thumbnail->size());
232 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(), 243 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(),
233 kGoogleThumbnail, sizeof(kGoogleThumbnail) - 1)); 244 kGoogleThumbnail, sizeof(kGoogleThumbnail) - 1));
234 245
235 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 246 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
236 } 247 }
237 } 248 }
238 249
239 TEST_F(TopSitesDatabaseTest, Recovery3) { 250 void TopSitesDatabaseTest::RecoveryTest3And4Common() {
240 // Recovery module only supports some platforms at this time.
241 if (!sql::Recovery::FullRecoverySupported())
242 return;
243
244 // Create an example database.
245 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
246
247 // Corrupt the database by adjusting the header. 251 // Corrupt the database by adjusting the header.
248 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); 252 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
249 253
250 // Database is unusable at the SQLite level. 254 RecoveryTestVerifyDatabaseIsUnusable(file_name_);
251 {
252 sql::ScopedErrorIgnorer ignore_errors;
253 ignore_errors.IgnoreError(SQLITE_CORRUPT);
254 sql::Connection raw_db;
255 EXPECT_TRUE(raw_db.Open(file_name_));
256 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
257 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
258 }
259 255
260 // Corruption should be detected and recovered during Init(). 256 // Corruption should be detected and recovered during Init().
261 { 257 {
262 sql::ScopedErrorIgnorer ignore_errors; 258 sql::ScopedErrorIgnorer ignore_errors;
263 ignore_errors.IgnoreError(SQLITE_CORRUPT); 259 ignore_errors.IgnoreError(SQLITE_CORRUPT);
264 260
265 TopSitesDatabase db; 261 TopSitesDatabase db;
266 ASSERT_TRUE(db.Init(file_name_)); 262 ASSERT_TRUE(db.Init(file_name_));
267 263
264 // Basic operational check.
268 MostVisitedURLList urls; 265 MostVisitedURLList urls;
269 std::map<GURL, Images> thumbnails; 266 std::map<GURL, Images> thumbnails;
270 db.GetPageThumbnails(&urls, &thumbnails); 267 db.GetPageThumbnails(&urls, &thumbnails);
271 ASSERT_EQ(3u, urls.size()); 268 ASSERT_EQ(3u, urls.size());
272 ASSERT_EQ(3u, thumbnails.size()); 269 ASSERT_EQ(3u, thumbnails.size());
273 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank. 270 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank.
274 // kGoogleThumbnail includes nul terminator. 271 // kGoogleThumbnail includes nul terminator.
275 ASSERT_EQ(sizeof(kGoogleThumbnail) - 1, 272 ASSERT_EQ(sizeof(kGoogleThumbnail) - 1,
276 thumbnails[urls[0].url].thumbnail->size()); 273 thumbnails[urls[0].url].thumbnail->size());
277 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(), 274 EXPECT_TRUE(!memcmp(thumbnails[urls[0].url].thumbnail->front(),
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 MostVisitedURLList urls; 342 MostVisitedURLList urls;
346 std::map<GURL, Images> thumbnails; 343 std::map<GURL, Images> thumbnails;
347 db.GetPageThumbnails(&urls, &thumbnails); 344 db.GetPageThumbnails(&urls, &thumbnails);
348 ASSERT_EQ(2u, urls.size()); 345 ASSERT_EQ(2u, urls.size());
349 ASSERT_EQ(2u, thumbnails.size()); 346 ASSERT_EQ(2u, thumbnails.size());
350 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank. 347 EXPECT_EQ(kUrl0, urls[0].url); // [0] because of url_rank.
351 EXPECT_EQ(kUrl2, urls[1].url); // [1] because of url_rank. 348 EXPECT_EQ(kUrl2, urls[1].url); // [1] because of url_rank.
352 } 349 }
353 } 350 }
354 351
352 TEST_F(TopSitesDatabaseTest, Recovery3) {
353 // Recovery module only supports some platforms at this time.
354 if (!sql::Recovery::FullRecoverySupported())
355 return;
356
357 // Create an example database.
358 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
359
360 RecoveryTest3And4Common();
361 }
362
363 TEST_F(TopSitesDatabaseTest, Recovery4) {
364 // Recovery module only supports some platforms at this time.
365 if (!sql::Recovery::FullRecoverySupported())
366 return;
367
368 // Create an example database.
369 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v4.sql"));
370
371 RecoveryTest3And4Common();
372 }
373
355 TEST_F(TopSitesDatabaseTest, AddRemoveEditThumbnails) { 374 TEST_F(TopSitesDatabaseTest, AddRemoveEditThumbnails) {
356 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql")); 375 ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
357 376
358 TopSitesDatabase db; 377 TopSitesDatabase db;
359 ASSERT_TRUE(db.Init(file_name_)); 378 ASSERT_TRUE(db.Init(file_name_));
360 379
361 // Add a new URL, not forced, rank = 1. 380 // Add a new URL, not forced, rank = 1.
362 GURL mapsUrl = GURL("http://maps.google.com/"); 381 GURL mapsUrl = GURL("http://maps.google.com/");
363 MostVisitedURL url1(mapsUrl, base::ASCIIToUTF16("Google Maps")); 382 MostVisitedURL url1(mapsUrl, base::ASCIIToUTF16("Google Maps"));
364 db.SetPageThumbnail(url1, 1, Images()); 383 db.SetPageThumbnail(url1, 1, Images());
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 // Remove a forced URL. 488 // Remove a forced URL.
470 db.RemoveURL(url2); 489 db.RemoveURL(url2);
471 490
472 db.GetPageThumbnails(&urls, &thumbnails); 491 db.GetPageThumbnails(&urls, &thumbnails);
473 ASSERT_EQ(4u, urls.size()); 492 ASSERT_EQ(4u, urls.size());
474 ASSERT_EQ(4u, thumbnails.size()); 493 ASSERT_EQ(4u, thumbnails.size());
475 EXPECT_EQ(mapsUrl, urls[0].url); 494 EXPECT_EQ(mapsUrl, urls[0].url);
476 EXPECT_EQ(kUrl0, urls[1].url); 495 EXPECT_EQ(kUrl0, urls[1].url);
477 } 496 }
478 497
498 TEST_F(TopSitesDatabaseTest, EncodeCSVString) {
499 std::vector<std::string> empty_list;
500 EXPECT_EQ("", TopSitesDatabase::EncodeCSVString(empty_list));
501
502 std::vector<std::string> empty_string_list;
503 empty_string_list.push_back("");
504 EXPECT_EQ("\"\"", TopSitesDatabase::EncodeCSVString(empty_string_list));
505 empty_string_list.push_back("");
506 EXPECT_EQ("\"\",\"\"", TopSitesDatabase::EncodeCSVString(empty_string_list));
507
508 // "\n" is treated like any other character.
509 std::vector<std::string> single_list;
510 single_list.push_back("abczABCZ-123 !@#$%^&*(),.'\"\n\r_");
511 EXPECT_EQ("\"abczABCZ-123 !@#$%^&*(),.'\"\"\n\r_\"",
512 TopSitesDatabase::EncodeCSVString(single_list));
513
514 std::vector<std::string> double_list;
515 double_list.push_back(" a \"string\", this is ");
516 double_list.push_back("http://www.test.com:80/path?query#ref");
517 EXPECT_EQ("\" a \"\"string\"\", this is \","
518 "\"http://www.test.com:80/path?query#ref\"",
519 TopSitesDatabase::EncodeCSVString(double_list));
520
521 std::vector<std::string> multi_list;
522 multi_list.push_back("test");
523 multi_list.push_back("");
524 multi_list.push_back(",");
525 multi_list.push_back("http://www.google.com");
526 multi_list.push_back(" ");
527 multi_list.push_back("\r\n");
528 multi_list.push_back("\"");
529 multi_list.push_back("\"quote\"");
530 multi_list.push_back("data:text/plain,this text has space");
531 EXPECT_EQ("\"test\",\"\",\",\",\"http://www.google.com\","
532 "\" \",\"\r\n\",\"\"\"\",\"\"\"quote\"\"\","
533 "\"data:text/plain,this text has space\"",
534 TopSitesDatabase::EncodeCSVString(multi_list));
535 }
536
537 TEST_F(TopSitesDatabaseTest, DecodeCSVStringSucceed) {
538 std::vector<std::string> res;
539 res.push_back("this gets overwritten");
540
541 EXPECT_TRUE(TopSitesDatabase::DecodeCSVString("", &res));
542 EXPECT_TRUE(res.empty());
543
544 EXPECT_TRUE(TopSitesDatabase::DecodeCSVString("\"\"", &res));
545 EXPECT_EQ(1U, res.size());
546 EXPECT_EQ("", res[0]);
547
548 EXPECT_TRUE(TopSitesDatabase::DecodeCSVString("\"\",\"\"", &res));
549 EXPECT_EQ(2U, res.size());
550 EXPECT_EQ("", res[0]);
551 EXPECT_EQ("", res[1]);
552
553 // "\n" is treated like any other character.
554 EXPECT_TRUE(TopSitesDatabase::DecodeCSVString(
555 "\"abczABCZ-123 !@#$%^&*(),.'\"\"\n\r_\"", &res));
556 EXPECT_EQ(1U, res.size());
557 EXPECT_EQ("abczABCZ-123 !@#$%^&*(),.'\"\n\r_", res[0]);
558
559 EXPECT_TRUE(TopSitesDatabase::DecodeCSVString(
560 "\" a \"\"string\"\", this is \","
561 "\"http://www.test.com:80/path?query#ref\"", &res));
562 EXPECT_EQ(2U, res.size());
563 EXPECT_EQ(" a \"string\", this is ", res[0]);
564 EXPECT_EQ("http://www.test.com:80/path?query#ref", res[1]);
565
566 EXPECT_TRUE(TopSitesDatabase::DecodeCSVString(
567 "\"test\",\"\",\",\",\"http://www.google.com\","
568 "\" \",\"\r\n\",\"\"\"\",\"\"\"quote\"\"\","
569 "\"data:text/plain,this text has space\"", &res));
570 EXPECT_EQ(9U, res.size());
571 EXPECT_EQ("test", res[0]);
572 EXPECT_EQ("", res[1]);
573 EXPECT_EQ(",", res[2]);
574 EXPECT_EQ("http://www.google.com", res[3]);
575 EXPECT_EQ(" ", res[4]);
576 EXPECT_EQ("\r\n", res[5]);
577 EXPECT_EQ("\"", res[6]);
578 EXPECT_EQ("\"quote\"", res[7]);
579 EXPECT_EQ("data:text/plain,this text has space", res[8]);
580 }
581
582 TEST_F(TopSitesDatabaseTest, DecodeCSVStringFail) {
583 std::vector<std::string> dummy;
584 dummy.push_back("Can't touch this");
585 // Missing quotes.
586 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("test", &dummy));
587 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("test,blah", &dummy));
588 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"test\",blah", &dummy));
589 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"test", &dummy));
590 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("test\"", &dummy));
591 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"\"\"", &dummy));
592 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"\",\"\"\"", &dummy));
593 // Misplaced comma.
594 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString(",\"A\"", &dummy));
595 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"A\",", &dummy));
596 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"A\",,\"B\"", &dummy));
597 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"A\",\"B\",\"C\",", &dummy));
598 // Garbage after quote.
599 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"test\"a\"", &dummy));
600 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"\"test\"", &dummy));
601 // We're strict with trailing white spaces.
602 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"no\", \"space\"", &dummy));
603 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"no\" ,\"space\"", &dummy));
604 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString(" \"bad\"", &dummy));
605 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"bad\" ", &dummy));
606 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString("\"bad\"\n", &dummy));
607 // Other.
608 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString(",", &dummy));
609 EXPECT_FALSE(TopSitesDatabase::DecodeCSVString(",,,,,,", &dummy));
610 // Verify |dummy| is not touched.
611 EXPECT_EQ(1U, dummy.size());
612 EXPECT_EQ("Can't touch this", dummy[0]);
613 }
614
615 TEST_F(TopSitesDatabaseTest, EncodeRedirects) {
616 RedirectList redirects1;
617 EXPECT_EQ("", TopSitesDatabase::EncodeRedirects(redirects1));
618 redirects1.push_back(GURL("http://www.google.com"));
619 EXPECT_EQ("\"http://www.google.com/\"",
620 TopSitesDatabase::EncodeRedirects(redirects1));
621 redirects1.push_back(GURL("https://www.youtube.ca/"));
622 EXPECT_EQ("\"http://www.google.com/\",\"https://www.youtube.ca/\"",
623 TopSitesDatabase::EncodeRedirects(redirects1));
624 redirects1.push_back(GURL("http://www.test.org:137/path?query#ref"));
625 EXPECT_EQ("\"http://www.google.com/\",\"https://www.youtube.ca/\","
626 "\"http://www.test.org:137/path?query#ref\"",
627 TopSitesDatabase::EncodeRedirects(redirects1));
628
629 RedirectList redirects2;
630 redirects2.push_back(GURL("http://www.google.com"));
631 // Adding invalid URL.
632 redirects2.push_back(GURL("this is not valid URL"));
633 // Adding data URL.
634 redirects2.push_back(GURL("data:text/plain,\"this has space\""));
635 // Invalid URL should be ignored.
636 EXPECT_EQ("\"http://www.google.com/\","
637 "\"data:text/plain,\"\"this has space\"\"\"",
638 TopSitesDatabase::EncodeRedirects(redirects2));
639 }
640
641 TEST_F(TopSitesDatabaseTest, DecodeRedirects) {
642 RedirectList redirects1;
643 TopSitesDatabase::DecodeRedirects("", &redirects1);
644 EXPECT_EQ(0u, redirects1.size());
645
646 RedirectList redirects2;
647 TopSitesDatabase::DecodeRedirects(
648 "\"http://www.google.com/\",\"https://www.youtube.ca/\","
649 "\"http://www.test.org:137/path?query#ref\"", &redirects2);
650 EXPECT_EQ(3U, redirects2.size());
651 EXPECT_EQ(GURL("http://www.google.com"), redirects2[0]);
652 EXPECT_EQ(GURL("https://www.youtube.ca/"), redirects2[1]);
653 EXPECT_EQ(GURL("http://www.test.org:137/path?query#ref"), redirects2[2]);
654
655 RedirectList redirects3;
656 TopSitesDatabase::DecodeRedirects(
657 "\"http://www.google.com\","
658 "\"this is not valid URL\",\"\","
659 "\"data:text/plain,\"\"this has space\"\"\"", &redirects3);
660 EXPECT_EQ(2U, redirects3.size());
661 EXPECT_EQ(GURL("http://www.google.com"), redirects3[0]);
662 EXPECT_EQ(GURL("data:text/plain,\"this has space\""), redirects3[1]);
663 }
664
665 // Fallback case when redirects are not stored as CSV strings.
666 TEST_F(TopSitesDatabaseTest, DecodeRedirectsFallback) {
667 RedirectList redirects1;
668 TopSitesDatabase::DecodeRedirects("http://www.chromium.org", &redirects1);
669 EXPECT_EQ(1u, redirects1.size());
670 EXPECT_EQ(GURL("http://www.chromium.org"), redirects1[0]);
671
672 // Valid case, note multiple spaces.
673 RedirectList redirects2;
674 TopSitesDatabase::DecodeRedirects(
675 " http://www.google.com https://www.youtube.ca"
676 " http://www.test.org:80/path?query#ref ",
677 &redirects2);
678 EXPECT_EQ(3u, redirects2.size());
679 EXPECT_EQ(GURL("http://www.google.com"), redirects2[0]);
680 EXPECT_EQ(GURL("https://www.youtube.ca"), redirects2[1]);
681 EXPECT_EQ(GURL("http://www.test.org:80/path?query#ref"), redirects2[2]);
682
683 // This might appear in old database, and should be ignored.
684 RedirectList redirects3;
685 TopSitesDatabase::DecodeRedirects("data:text/plain,this text has space",
686 &redirects3);
687 EXPECT_EQ(1u, redirects3.size());
688 EXPECT_EQ(GURL("data:text/plain,this"), redirects3[0]);
689
690 // Unfortunate case that creates dubious results.
691 RedirectList redirects4;
692 TopSitesDatabase::DecodeRedirects("Data:text/plain,this http://a has space",
693 &redirects4);
694 EXPECT_EQ(2u, redirects4.size());
695 EXPECT_EQ(GURL("Data:text/plain,this"), redirects4[0]);
696 EXPECT_EQ(GURL("http://a"), redirects4[1]);
697 }
698
479 } // namespace history 699 } // namespace history
OLDNEW
« no previous file with comments | « chrome/browser/history/top_sites_database.cc ('k') | chrome/test/data/History/TopSites.v3.sql » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698