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 7 #include "base/files/file_util.h" 8 #include "base/files/scoped_temp_dir.h" 9 #include "base/guid.h" 10 #include "base/message_loop/message_loop.h" 11 #include "base/path_service.h" 12 #include "base/stl_util.h" 13 #include "base/strings/string16.h" 14 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_util.h" 16 #include "base/strings/utf_string_conversions.h" 17 #include "base/time/time.h" 18 #include "base/values.h" 19 #include "components/autofill/core/browser/autofill_country.h" 20 #include "components/autofill/core/browser/autofill_profile.h" 21 #include "components/autofill/core/browser/autofill_type.h" 22 #include "components/autofill/core/browser/credit_card.h" 23 #include "components/autofill/core/browser/webdata/autofill_change.h" 24 #include "components/autofill/core/browser/webdata/autofill_entry.h" 25 #include "components/autofill/core/browser/webdata/autofill_table.h" 26 #include "components/password_manager/core/browser/webdata/logins_table.h" 27 #include "components/search_engines/keyword_table.h" 28 #include "components/signin/core/browser/webdata/token_service_table.h" 29 #include "components/webdata/common/web_database.h" 30 #include "sql/statement.h" 31 #include "testing/gtest/include/gtest/gtest.h" 32 33 using autofill::AutofillProfile; 34 using autofill::AutofillTable; 35 using autofill::CreditCard; 36 using base::ASCIIToUTF16; 37 using base::Time; 38 39 namespace { 40 41 void AutofillProfile31FromStatement(const sql::Statement& s, 42 AutofillProfile* profile, 43 base::string16* label, 44 int* unique_id, 45 int64* date_modified) { 46 DCHECK(profile); 47 DCHECK(label); 48 DCHECK(unique_id); 49 DCHECK(date_modified); 50 *label = s.ColumnString16(0); 51 *unique_id = s.ColumnInt(1); 52 profile->SetRawInfo(autofill::NAME_FIRST, s.ColumnString16(2)); 53 profile->SetRawInfo(autofill::NAME_MIDDLE, s.ColumnString16(3)); 54 profile->SetRawInfo(autofill::NAME_LAST, s.ColumnString16(4)); 55 profile->SetRawInfo(autofill::EMAIL_ADDRESS, s.ColumnString16(5)); 56 profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(6)); 57 profile->SetRawInfo(autofill::ADDRESS_HOME_LINE1, s.ColumnString16(7)); 58 profile->SetRawInfo(autofill::ADDRESS_HOME_LINE2, s.ColumnString16(8)); 59 profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(9)); 60 profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(10)); 61 profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(11)); 62 profile->SetInfo( 63 autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY), 64 s.ColumnString16(12), "en-US"); 65 profile->SetRawInfo(autofill::PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(13)); 66 *date_modified = s.ColumnInt64(15); 67 profile->set_guid(s.ColumnString(16)); 68 EXPECT_TRUE(base::IsValidGUID(profile->guid())); 69 } 70 71 void AutofillProfile33FromStatement(const sql::Statement& s, 72 AutofillProfile* profile, 73 int64* date_modified) { 74 DCHECK(profile); 75 DCHECK(date_modified); 76 profile->set_guid(s.ColumnString(0)); 77 EXPECT_TRUE(base::IsValidGUID(profile->guid())); 78 profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(1)); 79 profile->SetRawInfo(autofill::ADDRESS_HOME_STREET_ADDRESS, 80 s.ColumnString16(2)); 81 profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(3)); 82 profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(4)); 83 profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(5)); 84 profile->SetInfo( 85 autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY), 86 s.ColumnString16(6), "en-US"); 87 *date_modified = s.ColumnInt64(7); 88 } 89 90 void CreditCard31FromStatement(const sql::Statement& s, 91 CreditCard* credit_card, 92 base::string16* label, 93 int* unique_id, 94 std::string* encrypted_number, 95 int64* date_modified) { 96 DCHECK(credit_card); 97 DCHECK(label); 98 DCHECK(unique_id); 99 DCHECK(encrypted_number); 100 DCHECK(date_modified); 101 *label = s.ColumnString16(0); 102 *unique_id = s.ColumnInt(1); 103 credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(2)); 104 credit_card->SetRawInfo(autofill::CREDIT_CARD_TYPE, s.ColumnString16(3)); 105 credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(5)); 106 credit_card->SetRawInfo( 107 autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(6)); 108 int encrypted_number_len = s.ColumnByteLength(10); 109 if (encrypted_number_len) { 110 encrypted_number->resize(encrypted_number_len); 111 memcpy(&(*encrypted_number)[0], s.ColumnBlob(10), encrypted_number_len); 112 } 113 *date_modified = s.ColumnInt64(12); 114 credit_card->set_guid(s.ColumnString(13)); 115 EXPECT_TRUE(base::IsValidGUID(credit_card->guid())); 116 } 117 118 void CreditCard32FromStatement(const sql::Statement& s, 119 CreditCard* credit_card, 120 std::string* encrypted_number, 121 int64* date_modified) { 122 DCHECK(credit_card); 123 DCHECK(encrypted_number); 124 DCHECK(date_modified); 125 credit_card->set_guid(s.ColumnString(0)); 126 EXPECT_TRUE(base::IsValidGUID(credit_card->guid())); 127 credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(1)); 128 credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(2)); 129 credit_card->SetRawInfo( 130 autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(3)); 131 int encrypted_number_len = s.ColumnByteLength(4); 132 if (encrypted_number_len) { 133 encrypted_number->resize(encrypted_number_len); 134 memcpy(&(*encrypted_number)[0], s.ColumnBlob(4), encrypted_number_len); 135 } 136 *date_modified = s.ColumnInt64(5); 137 } 138 139 void CheckHasBackupData(sql::MetaTable* meta_table) { 140 std::string value; 141 EXPECT_TRUE(meta_table->GetValue( 142 "Default Search Provider ID Backup", &value)); 143 EXPECT_TRUE(meta_table->GetValue( 144 "Default Search Provider ID Backup Signature", &value)); 145 } 146 147 void CheckNoBackupData(const sql::Connection& connection, 148 sql::MetaTable* meta_table) { 149 std::string value; 150 EXPECT_FALSE(meta_table->GetValue( 151 "Default Search Provider ID Backup", &value)); 152 EXPECT_FALSE(meta_table->GetValue( 153 "Default Search Provider ID Backup Signature", &value)); 154 EXPECT_FALSE(connection.DoesTableExist("keywords_backup")); 155 } 156 157 std::string RemoveQuotes(const std::string& has_quotes) { 158 std::string no_quotes; 159 // SQLite quotes: http://www.sqlite.org/lang_keywords.html 160 base::RemoveChars(has_quotes, "\"[]`", &no_quotes); 161 return no_quotes; 162 } 163 164 } // anonymous namespace 165 166 // The WebDatabaseMigrationTest encapsulates testing of database migrations. 167 // Specifically, these tests are intended to exercise any schema changes in 168 // the WebDatabase and data migrations that occur in 169 // |WebDatabase::MigrateOldVersionsAsNeeded()|. 170 class WebDatabaseMigrationTest : public testing::Test { 171 public: 172 WebDatabaseMigrationTest() {} 173 virtual ~WebDatabaseMigrationTest() {} 174 175 virtual void SetUp() { 176 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 177 } 178 179 // Load the database via the WebDatabase class and migrate the database to 180 // the current version. 181 void DoMigration() { 182 // TODO(joi): This whole unit test file needs to stay in //chrome 183 // for now, as it needs to know about all the different table 184 // types. Once all webdata datatypes have been componentized, this 185 // could move to components_unittests. 186 AutofillTable autofill_table("en-US"); 187 KeywordTable keyword_table; 188 LoginsTable logins_table; 189 TokenServiceTable token_service_table; 190 191 WebDatabase db; 192 db.AddTable(&autofill_table); 193 db.AddTable(&keyword_table); 194 db.AddTable(&logins_table); 195 db.AddTable(&token_service_table); 196 197 // This causes the migration to occur. 198 ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); 199 } 200 201 protected: 202 // Current tested version number. When adding a migration in 203 // |WebDatabase::MigrateOldVersionsAsNeeded()| and changing the version number 204 // |kCurrentVersionNumber| this value should change to reflect the new version 205 // number and a new migration test added below. 206 static const int kCurrentTestedVersionNumber; 207 208 base::FilePath GetDatabasePath() { 209 const base::FilePath::CharType kWebDatabaseFilename[] = 210 FILE_PATH_LITERAL("TestWebDatabase.sqlite3"); 211 return temp_dir_.path().Append(base::FilePath(kWebDatabaseFilename)); 212 } 213 214 // The textual contents of |file| are read from 215 // "components/test/data/web_database" and returned in the string |contents|. 216 // Returns true if the file exists and is read successfully, false otherwise. 217 bool GetWebDatabaseData(const base::FilePath& file, std::string* contents) { 218 base::FilePath source_path; 219 PathService::Get(base::DIR_SOURCE_ROOT, &source_path); 220 source_path = source_path.AppendASCII("components"); 221 source_path = source_path.AppendASCII("test"); 222 source_path = source_path.AppendASCII("data"); 223 source_path = source_path.AppendASCII("web_database"); 224 source_path = source_path.Append(file); 225 return base::PathExists(source_path) && 226 base::ReadFileToString(source_path, contents); 227 } 228 229 static int VersionFromConnection(sql::Connection* connection) { 230 // Get version. 231 sql::Statement s(connection->GetUniqueStatement( 232 "SELECT value FROM meta WHERE key='version'")); 233 if (!s.Step()) 234 return 0; 235 return s.ColumnInt(0); 236 } 237 238 // The sql files located in "chrome/test/data/web_database" were generated by 239 // launching the Chromium application prior to schema change, then using the 240 // sqlite3 command-line application to dump the contents of the "Web Data" 241 // database. 242 // Like this: 243 // > .output version_nn.sql 244 // > .dump 245 void LoadDatabase(const base::FilePath::StringType& file); 246 247 private: 248 base::ScopedTempDir temp_dir_; 249 250 DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest); 251 }; 252 253 const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 58; 254 255 void WebDatabaseMigrationTest::LoadDatabase( 256 const base::FilePath::StringType& file) { 257 std::string contents; 258 ASSERT_TRUE(GetWebDatabaseData(base::FilePath(file), &contents)); 259 260 sql::Connection connection; 261 ASSERT_TRUE(connection.Open(GetDatabasePath())); 262 ASSERT_TRUE(connection.Execute(contents.data())); 263 } 264 265 // Tests that migrating from the golden files version_XX.sql results in the same 266 // schema as migrating from an empty database. 267 TEST_F(WebDatabaseMigrationTest, VersionXxSqlFilesAreGolden) { 268 DoMigration(); 269 sql::Connection connection; 270 ASSERT_TRUE(connection.Open(GetDatabasePath())); 271 const std::string& expected_schema = RemoveQuotes(connection.GetSchema()); 272 static const int kFirstVersion = 53; 273 for (int i = kFirstVersion; i < kCurrentTestedVersionNumber; ++i) { 274 connection.Raze(); 275 const base::FilePath& file_name = base::FilePath::FromUTF8Unsafe( 276 "version_" + base::IntToString(i) + ".sql"); 277 ASSERT_NO_FATAL_FAILURE(LoadDatabase(file_name.value())) 278 << "Failed to load " << file_name.MaybeAsASCII(); 279 DoMigration(); 280 EXPECT_EQ(expected_schema, RemoveQuotes(connection.GetSchema())); 281 } 282 } 283 284 // Tests that the all migrations from an empty database succeed. 285 TEST_F(WebDatabaseMigrationTest, MigrateEmptyToCurrent) { 286 DoMigration(); 287 288 // Verify post-conditions. These are expectations for current version of the 289 // database. 290 { 291 sql::Connection connection; 292 ASSERT_TRUE(connection.Open(GetDatabasePath())); 293 294 // Check version. 295 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 296 297 // Check that expected tables are present. 298 EXPECT_TRUE(connection.DoesTableExist("autofill")); 299 // The autofill_dates table is obsolete. (It's been merged into the autofill 300 // table.) 301 EXPECT_FALSE(connection.DoesTableExist("autofill_dates")); 302 EXPECT_TRUE(connection.DoesTableExist("autofill_profiles")); 303 EXPECT_TRUE(connection.DoesTableExist("credit_cards")); 304 EXPECT_TRUE(connection.DoesTableExist("keywords")); 305 // The logins table is obsolete. (We used to store saved passwords here.) 306 EXPECT_FALSE(connection.DoesTableExist("logins")); 307 EXPECT_TRUE(connection.DoesTableExist("meta")); 308 EXPECT_TRUE(connection.DoesTableExist("token_service")); 309 // The web_apps and web_apps_icons tables are obsolete as of version 58. 310 EXPECT_FALSE(connection.DoesTableExist("web_apps")); 311 EXPECT_FALSE(connection.DoesTableExist("web_app_icons")); 312 // The web_intents and web_intents_defaults tables are obsolete as of 313 // version 58. 314 EXPECT_FALSE(connection.DoesTableExist("web_intents")); 315 EXPECT_FALSE(connection.DoesTableExist("web_intents_defaults")); 316 } 317 } 318 319 // Tests that absent Autofill tables do not create any problems when migrating 320 // from a DB written by the earliest publicly released version of Chrome. 321 TEST_F(WebDatabaseMigrationTest, MigrateVersion20ToCurrent) { 322 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_20.sql"))); 323 324 // Verify pre-conditions. 325 { 326 sql::Connection connection; 327 ASSERT_TRUE(connection.Open(GetDatabasePath())); 328 329 EXPECT_FALSE(connection.DoesTableExist("autofill")); 330 EXPECT_FALSE(connection.DoesTableExist("autofill_profiles")); 331 EXPECT_FALSE(connection.DoesTableExist("credit_cards")); 332 } 333 334 DoMigration(); 335 336 // Verify post-conditions. These are expectations for current version of the 337 // database. 338 { 339 sql::Connection connection; 340 ASSERT_TRUE(connection.Open(GetDatabasePath())); 341 342 // Check version. 343 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 344 345 // Mostly this test just verifies that no SQL errors occur during migration; 346 // but might as well verify that the tables were created as well. 347 EXPECT_TRUE(connection.DoesTableExist("autofill")); 348 EXPECT_TRUE(connection.DoesTableExist("autofill_profiles")); 349 EXPECT_TRUE(connection.DoesTableExist("credit_cards")); 350 } 351 } 352 353 // Tests that rows with empty values get removed from the autofill tables. 354 TEST_F(WebDatabaseMigrationTest, MigrateVersion21ToCurrent) { 355 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_21.sql"))); 356 357 // Verify pre-conditions. 358 { 359 sql::Connection connection; 360 ASSERT_TRUE(connection.Open(GetDatabasePath())); 361 362 // Both empty and non-empty values are allowed in a version 21 database. 363 sql::Statement s_autofill(connection.GetUniqueStatement( 364 "SELECT name, value, value_lower, pair_id, count FROM autofill")); 365 sql::Statement s_dates(connection.GetUniqueStatement( 366 "SELECT pair_id, date_created FROM autofill_dates")); 367 368 // An entry with a non-empty value. 369 ASSERT_TRUE(s_autofill.Step()); 370 EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0)); 371 EXPECT_EQ(ASCIIToUTF16("John Doe"), s_autofill.ColumnString16(1)); 372 EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2)); 373 EXPECT_EQ(10, s_autofill.ColumnInt(3)); 374 EXPECT_EQ(1, s_autofill.ColumnInt(4)); 375 ASSERT_TRUE(s_dates.Step()); 376 EXPECT_EQ(10, s_dates.ColumnInt(0)); 377 EXPECT_EQ(1384299100, s_dates.ColumnInt64(1)); 378 379 // An entry with an empty value. 380 ASSERT_TRUE(s_autofill.Step()); 381 EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0)); 382 EXPECT_EQ(base::string16(), s_autofill.ColumnString16(1)); 383 EXPECT_EQ(base::string16(), s_autofill.ColumnString16(2)); 384 EXPECT_EQ(11, s_autofill.ColumnInt(3)); 385 EXPECT_EQ(1, s_autofill.ColumnInt(4)); 386 ASSERT_TRUE(s_dates.Step()); 387 EXPECT_EQ(11, s_dates.ColumnInt(0)); 388 EXPECT_EQ(1384299200, s_dates.ColumnInt64(1)); 389 390 // Another entry with a non-empty value. 391 ASSERT_TRUE(s_autofill.Step()); 392 EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0)); 393 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s_autofill.ColumnString16(1)); 394 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s_autofill.ColumnString16(2)); 395 EXPECT_EQ(20, s_autofill.ColumnInt(3)); 396 EXPECT_EQ(3, s_autofill.ColumnInt(4)); 397 ASSERT_TRUE(s_dates.Step()); 398 EXPECT_EQ(20, s_dates.ColumnInt(0)); 399 EXPECT_EQ(1384299300, s_dates.ColumnInt64(1)); 400 ASSERT_TRUE(s_dates.Step()); 401 EXPECT_EQ(20, s_dates.ColumnInt(0)); 402 EXPECT_EQ(1384299301, s_dates.ColumnInt64(1)); 403 404 // Another entry with an empty value. 405 ASSERT_TRUE(s_autofill.Step()); 406 EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0)); 407 EXPECT_EQ(base::string16(), s_autofill.ColumnString16(1)); 408 EXPECT_EQ(base::string16(), s_autofill.ColumnString16(2)); 409 EXPECT_EQ(21, s_autofill.ColumnInt(3)); 410 EXPECT_EQ(4, s_autofill.ColumnInt(4)); 411 ASSERT_TRUE(s_dates.Step()); 412 EXPECT_EQ(21, s_dates.ColumnInt(0)); 413 EXPECT_EQ(1384299401, s_dates.ColumnInt64(1)); 414 ASSERT_TRUE(s_dates.Step()); 415 EXPECT_EQ(21, s_dates.ColumnInt(0)); 416 EXPECT_EQ(1384299400, s_dates.ColumnInt64(1)); 417 ASSERT_TRUE(s_dates.Step()); 418 EXPECT_EQ(21, s_dates.ColumnInt(0)); 419 EXPECT_EQ(1384299403, s_dates.ColumnInt64(1)); 420 ASSERT_TRUE(s_dates.Step()); 421 EXPECT_EQ(21, s_dates.ColumnInt(0)); 422 EXPECT_EQ(1384299402, s_dates.ColumnInt64(1)); 423 424 // No more entries expected. 425 ASSERT_FALSE(s_autofill.Step()); 426 ASSERT_FALSE(s_dates.Step()); 427 } 428 429 DoMigration(); 430 431 // Verify post-conditions. These are expectations for current version of the 432 // database. 433 { 434 sql::Connection connection; 435 ASSERT_TRUE(connection.Open(GetDatabasePath())); 436 437 // Check version. 438 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 439 440 // Entries with empty values should have been dropped. The remaining 441 // entries should have been preserved. 442 sql::Statement s( 443 connection.GetUniqueStatement( 444 "SELECT name, value, value_lower, date_created, date_last_used," 445 " count " 446 "FROM autofill " 447 "ORDER BY name, value ASC")); 448 449 // "jane (at) example.com" 450 ASSERT_TRUE(s.Step()); 451 EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0)); 452 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s.ColumnString16(1)); 453 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s.ColumnString16(2)); 454 EXPECT_EQ(1384299300, s.ColumnInt64(3)); 455 EXPECT_EQ(1384299301, s.ColumnInt64(4)); 456 EXPECT_EQ(3, s.ColumnInt(5)); 457 458 // "John Doe" 459 ASSERT_TRUE(s.Step()); 460 EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0)); 461 EXPECT_EQ(ASCIIToUTF16("John Doe"), s.ColumnString16(1)); 462 EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2)); 463 EXPECT_EQ(1384299100, s.ColumnInt64(3)); 464 EXPECT_EQ(1384299100, s.ColumnInt64(4)); 465 EXPECT_EQ(1, s.ColumnInt(5)); 466 467 // No more entries expected. 468 ASSERT_FALSE(s.Step()); 469 } 470 } 471 472 // Tests that the |credit_card| table gets added to the schema for a version 22 473 // database. 474 TEST_F(WebDatabaseMigrationTest, MigrateVersion22ToCurrent) { 475 // This schema is taken from a build prior to the addition of the 476 // |credit_card| table. Version 22 of the schema. Contrast this with the 477 // corrupt version below. 478 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_22.sql"))); 479 480 // Verify pre-conditions. 481 { 482 sql::Connection connection; 483 ASSERT_TRUE(connection.Open(GetDatabasePath())); 484 485 // No |credit_card| table prior to version 23. 486 ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "guid")); 487 ASSERT_FALSE( 488 connection.DoesColumnExist("credit_cards", "card_number_encrypted")); 489 } 490 491 DoMigration(); 492 493 // Verify post-conditions. These are expectations for current version of the 494 // database. 495 { 496 sql::Connection connection; 497 ASSERT_TRUE(connection.Open(GetDatabasePath())); 498 499 // Check version. 500 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 501 502 // |credit_card| table now exists. 503 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); 504 EXPECT_TRUE( 505 connection.DoesColumnExist("credit_cards", "card_number_encrypted")); 506 } 507 } 508 509 // Tests that the |credit_card| table gets added to the schema for a corrupt 510 // version 22 database. The corruption is that the |credit_cards| table exists 511 // but the schema version number was not set correctly to 23 or later. This 512 // test exercises code introduced to fix bug http://crbug.com/50699 that 513 // resulted from the corruption. 514 TEST_F(WebDatabaseMigrationTest, MigrateVersion22CorruptedToCurrent) { 515 // This schema is taken from a build after the addition of the |credit_card| 516 // table. Due to a bug in the migration logic the version is set incorrectly 517 // to 22 (it should have been updated to 23 at least). 518 ASSERT_NO_FATAL_FAILURE( 519 LoadDatabase(FILE_PATH_LITERAL("version_22_corrupt.sql"))); 520 521 // Verify pre-conditions. These are expectations for corrupt version 22 of 522 // the database. 523 { 524 sql::Connection connection; 525 ASSERT_TRUE(connection.Open(GetDatabasePath())); 526 527 // Columns existing and not existing before current version. 528 ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id")); 529 ASSERT_TRUE( 530 connection.DoesColumnExist("credit_cards", "card_number_encrypted")); 531 ASSERT_TRUE(connection.DoesColumnExist("keywords", "id")); 532 } 533 534 DoMigration(); 535 536 // Verify post-conditions. These are expectations for current version of the 537 // database. 538 { 539 sql::Connection connection; 540 ASSERT_TRUE(connection.Open(GetDatabasePath())); 541 542 // Check version. 543 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 544 545 546 // Columns existing and not existing before version 25. 547 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id")); 548 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); 549 EXPECT_TRUE( 550 connection.DoesColumnExist("credit_cards", "card_number_encrypted")); 551 EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); 552 } 553 } 554 555 // Tests that the |keywords| |created_by_policy| column gets added to the schema 556 // for a version 25 database. 557 TEST_F(WebDatabaseMigrationTest, MigrateVersion25ToCurrent) { 558 // This schema is taken from a build prior to the addition of the |keywords| 559 // |created_by_policy| column. 560 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_25.sql"))); 561 562 // Verify pre-conditions. These are expectations for version 25 of the 563 // database. 564 { 565 sql::Connection connection; 566 ASSERT_TRUE(connection.Open(GetDatabasePath())); 567 } 568 569 DoMigration(); 570 571 // Verify post-conditions. These are expectations for current version of the 572 // database. 573 { 574 sql::Connection connection; 575 ASSERT_TRUE(connection.Open(GetDatabasePath())); 576 577 // Check version. 578 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 579 580 // |keywords| |created_by_policy| column should have been added. 581 EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); 582 EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy")); 583 } 584 } 585 586 // Tests that the credit_cards.billing_address column is changed from a string 587 // to an int whilst preserving the associated billing address. This version of 588 // the test makes sure a stored label is converted to an ID. 589 TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringLabels) { 590 // This schema is taken from a build prior to the change of column type for 591 // credit_cards.billing_address from string to int. 592 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql"))); 593 594 // Verify pre-conditions. These are expectations for version 26 of the 595 // database. 596 { 597 sql::Connection connection; 598 ASSERT_TRUE(connection.Open(GetDatabasePath())); 599 600 // Columns existing and not existing before current version. 601 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address")); 602 603 std::string stmt = "INSERT INTO autofill_profiles" 604 "(label, unique_id, first_name, middle_name, last_name, email," 605 " company_name, address_line_1, address_line_2, city, state, zipcode," 606 " country, phone, fax)" 607 "VALUES ('Home',1,'','','','','','','','','','','','','')"; 608 sql::Statement s(connection.GetUniqueStatement(stmt.c_str())); 609 ASSERT_TRUE(s.Run()); 610 611 // Insert a CC linked to an existing address. 612 std::string stmt2 = "INSERT INTO credit_cards" 613 "(label, unique_id, name_on_card, type, card_number," 614 " expiration_month, expiration_year, verification_code, billing_address," 615 " shipping_address, card_number_encrypted, verification_code_encrypted)" 616 "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','Home','','','')"; 617 sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str())); 618 ASSERT_TRUE(s2.Run()); 619 620 // |billing_address| is a string. 621 std::string stmt3 = "SELECT billing_address FROM credit_cards"; 622 sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str())); 623 ASSERT_TRUE(s3.Step()); 624 EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT); 625 } 626 627 DoMigration(); 628 629 // Verify post-conditions. These are expectations for current version of the 630 // database. 631 { 632 sql::Connection connection; 633 ASSERT_TRUE(connection.Open(GetDatabasePath())); 634 635 // Check version. 636 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 637 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address")); 638 639 // Verify the credit card data is converted. 640 sql::Statement s(connection.GetUniqueStatement( 641 "SELECT guid, name_on_card, expiration_month, expiration_year, " 642 "card_number_encrypted, date_modified " 643 "FROM credit_cards")); 644 ASSERT_TRUE(s.Step()); 645 EXPECT_EQ("Jack", s.ColumnString(1)); 646 EXPECT_EQ(2, s.ColumnInt(2)); 647 EXPECT_EQ(2012, s.ColumnInt(3)); 648 // Column 5 is encrypted number blob. 649 // Column 6 is date_modified. 650 } 651 } 652 653 // Tests that the credit_cards.billing_address column is changed from a string 654 // to an int whilst preserving the associated billing address. This version of 655 // the test makes sure a stored string ID is converted to an integer ID. 656 TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringIDs) { 657 // This schema is taken from a build prior to the change of column type for 658 // credit_cards.billing_address from string to int. 659 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql"))); 660 661 // Verify pre-conditions. These are expectations for version 26 of the 662 // database. 663 { 664 sql::Connection connection; 665 ASSERT_TRUE(connection.Open(GetDatabasePath())); 666 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address")); 667 668 std::string stmt = "INSERT INTO autofill_profiles" 669 "(label, unique_id, first_name, middle_name, last_name, email," 670 " company_name, address_line_1, address_line_2, city, state, zipcode," 671 " country, phone, fax)" 672 "VALUES ('Home',1,'','','','','','','','','','','','','')"; 673 sql::Statement s(connection.GetUniqueStatement(stmt.c_str())); 674 ASSERT_TRUE(s.Run()); 675 676 // Insert a CC linked to an existing address. 677 std::string stmt2 = "INSERT INTO credit_cards" 678 "(label, unique_id, name_on_card, type, card_number," 679 " expiration_month, expiration_year, verification_code, billing_address," 680 " shipping_address, card_number_encrypted, verification_code_encrypted)" 681 "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','1','','','')"; 682 sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str())); 683 ASSERT_TRUE(s2.Run()); 684 685 // |billing_address| is a string. 686 std::string stmt3 = "SELECT billing_address FROM credit_cards"; 687 sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str())); 688 ASSERT_TRUE(s3.Step()); 689 EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT); 690 } 691 692 DoMigration(); 693 694 // Verify post-conditions. These are expectations for current version of the 695 // database. 696 { 697 sql::Connection connection; 698 ASSERT_TRUE(connection.Open(GetDatabasePath())); 699 700 // Check version. 701 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 702 703 // |keywords| |created_by_policy| column should have been added. 704 EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); 705 EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy")); 706 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address")); 707 708 // Verify the credit card data is converted. 709 sql::Statement s(connection.GetUniqueStatement( 710 "SELECT guid, name_on_card, expiration_month, expiration_year, " 711 "card_number_encrypted, date_modified " 712 "FROM credit_cards")); 713 ASSERT_TRUE(s.Step()); 714 EXPECT_EQ("Jack", s.ColumnString(1)); 715 EXPECT_EQ(2, s.ColumnInt(2)); 716 EXPECT_EQ(2012, s.ColumnInt(3)); 717 // Column 5 is encrypted credit card number blo b. 718 // Column 6 is date_modified. 719 } 720 } 721 722 // Makes sure instant_url is added correctly to keywords. 723 TEST_F(WebDatabaseMigrationTest, MigrateVersion27ToCurrent) { 724 // Initialize the database. 725 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_27.sql"))); 726 727 // Verify pre-conditions. These are expectations for version 27 of the 728 // database. 729 { 730 sql::Connection connection; 731 ASSERT_TRUE(connection.Open(GetDatabasePath())); 732 733 ASSERT_FALSE(connection.DoesColumnExist("keywords", "instant_url")); 734 } 735 736 DoMigration(); 737 738 // Verify post-conditions. These are expectations for current version of the 739 // database. 740 { 741 sql::Connection connection; 742 ASSERT_TRUE(connection.Open(GetDatabasePath())); 743 744 // Check version. 745 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 746 747 // Make sure supports_instant (added in Version 28) was ultimately dropped 748 // again and instant_url was added. 749 EXPECT_FALSE(connection.DoesColumnExist("keywords", "supports_instant")); 750 EXPECT_TRUE(connection.DoesColumnExist("keywords", "instant_url")); 751 752 // Check that instant_url is empty. 753 std::string stmt = "SELECT instant_url FROM keywords"; 754 sql::Statement s(connection.GetUniqueStatement(stmt.c_str())); 755 ASSERT_TRUE(s.Step()); 756 EXPECT_EQ(std::string(), s.ColumnString(0)); 757 758 // Verify the data made it over. 759 stmt = "SELECT " + KeywordTable::GetKeywordColumns() + " FROM keywords"; 760 sql::Statement s2(connection.GetUniqueStatement(stmt.c_str())); 761 ASSERT_TRUE(s2.Step()); 762 EXPECT_EQ(2, s2.ColumnInt(0)); 763 EXPECT_EQ("Google", s2.ColumnString(1)); 764 EXPECT_EQ("google.com", s2.ColumnString(2)); 765 EXPECT_EQ("http://www.google.com/favicon.ico", s2.ColumnString(3)); 766 EXPECT_EQ("{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"\ 767 "{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}"\ 768 "&q={searchTerms}", 769 s2.ColumnString(4)); 770 EXPECT_TRUE(s2.ColumnBool(5)); 771 EXPECT_EQ(std::string(), s2.ColumnString(6)); 772 EXPECT_EQ(0, s2.ColumnInt(7)); 773 EXPECT_EQ(0, s2.ColumnInt(8)); 774 EXPECT_EQ(std::string("UTF-8"), s2.ColumnString(9)); 775 EXPECT_TRUE(s2.ColumnBool(10)); 776 EXPECT_EQ(std::string("{google:baseSuggestURL}search?client=chrome&hl=" 777 "{language}&q={searchTerms}"), s2.ColumnString(11)); 778 EXPECT_EQ(1, s2.ColumnInt(12)); 779 EXPECT_FALSE(s2.ColumnBool(13)); 780 EXPECT_EQ(std::string(), s2.ColumnString(14)); 781 EXPECT_EQ(0, s2.ColumnInt(15)); 782 EXPECT_EQ(std::string(), s2.ColumnString(16)); 783 } 784 } 785 786 // Makes sure date_modified is added correctly to autofill_profiles and 787 // credit_cards. 788 TEST_F(WebDatabaseMigrationTest, MigrateVersion29ToCurrent) { 789 // Initialize the database. 790 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_29.sql"))); 791 792 // Verify pre-conditions. These are expectations for version 29 of the 793 // database. 794 { 795 sql::Connection connection; 796 ASSERT_TRUE(connection.Open(GetDatabasePath())); 797 798 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", 799 "date_modified")); 800 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", 801 "date_modified")); 802 } 803 804 Time pre_creation_time = Time::Now(); 805 DoMigration(); 806 Time post_creation_time = Time::Now(); 807 808 // Verify post-conditions. These are expectations for current version of the 809 // database. 810 { 811 sql::Connection connection; 812 ASSERT_TRUE(connection.Open(GetDatabasePath())); 813 814 // Check version. 815 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 816 817 // Check that the columns were created. 818 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 819 "date_modified")); 820 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", 821 "date_modified")); 822 823 sql::Statement s_profiles(connection.GetUniqueStatement( 824 "SELECT date_modified FROM autofill_profiles ")); 825 ASSERT_TRUE(s_profiles.is_valid()); 826 while (s_profiles.Step()) { 827 EXPECT_GE(s_profiles.ColumnInt64(0), 828 pre_creation_time.ToTimeT()); 829 EXPECT_LE(s_profiles.ColumnInt64(0), 830 post_creation_time.ToTimeT()); 831 } 832 EXPECT_TRUE(s_profiles.Succeeded()); 833 834 sql::Statement s_credit_cards(connection.GetUniqueStatement( 835 "SELECT date_modified FROM credit_cards ")); 836 ASSERT_TRUE(s_credit_cards.is_valid()); 837 while (s_credit_cards.Step()) { 838 EXPECT_GE(s_credit_cards.ColumnInt64(0), 839 pre_creation_time.ToTimeT()); 840 EXPECT_LE(s_credit_cards.ColumnInt64(0), 841 post_creation_time.ToTimeT()); 842 } 843 EXPECT_TRUE(s_credit_cards.Succeeded()); 844 } 845 } 846 847 // Makes sure guids are added to autofill_profiles and credit_cards tables. 848 TEST_F(WebDatabaseMigrationTest, MigrateVersion30ToCurrent) { 849 // Initialize the database. 850 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_30.sql"))); 851 852 // Verify pre-conditions. These are expectations for version 29 of the 853 // database. 854 { 855 sql::Connection connection; 856 ASSERT_TRUE(connection.Open(GetDatabasePath())); 857 858 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "guid")); 859 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "guid")); 860 } 861 862 DoMigration(); 863 864 // Verify post-conditions. These are expectations for current version of the 865 // database. 866 { 867 sql::Connection connection; 868 ASSERT_TRUE(connection.Open(GetDatabasePath())); 869 870 // Check version. 871 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 872 873 ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 874 ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); 875 876 // Check that guids are non-null, non-empty, conforms to guid format, and 877 // are different. 878 sql::Statement s( 879 connection.GetUniqueStatement("SELECT guid FROM autofill_profiles")); 880 881 ASSERT_TRUE(s.Step()); 882 std::string guid1 = s.ColumnString(0); 883 EXPECT_TRUE(base::IsValidGUID(guid1)); 884 885 ASSERT_TRUE(s.Step()); 886 std::string guid2 = s.ColumnString(0); 887 EXPECT_TRUE(base::IsValidGUID(guid2)); 888 889 EXPECT_NE(guid1, guid2); 890 } 891 } 892 893 // Removes unique IDs and make GUIDs the primary key. Also removes unused 894 // columns. 895 TEST_F(WebDatabaseMigrationTest, MigrateVersion31ToCurrent) { 896 // Initialize the database. 897 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_31.sql"))); 898 899 // Verify pre-conditions. These are expectations for version 30 of the 900 // database. 901 AutofillProfile profile; 902 base::string16 profile_label; 903 int profile_unique_id = 0; 904 int64 profile_date_modified = 0; 905 CreditCard credit_card; 906 base::string16 cc_label; 907 int cc_unique_id = 0; 908 std::string cc_number_encrypted; 909 int64 cc_date_modified = 0; 910 { 911 sql::Connection connection; 912 ASSERT_TRUE(connection.Open(GetDatabasePath())); 913 914 // Verify existence of columns we'll be changing. 915 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 916 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "unique_id")); 917 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); 918 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id")); 919 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "type")); 920 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "card_number")); 921 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", 922 "verification_code")); 923 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address")); 924 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "shipping_address")); 925 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", 926 "verification_code_encrypted")); 927 928 // Fetch data in the database prior to migration. 929 sql::Statement s1( 930 connection.GetUniqueStatement( 931 "SELECT label, unique_id, first_name, middle_name, last_name, " 932 "email, company_name, address_line_1, address_line_2, city, state, " 933 "zipcode, country, phone, fax, date_modified, guid " 934 "FROM autofill_profiles")); 935 ASSERT_TRUE(s1.Step()); 936 EXPECT_NO_FATAL_FAILURE(AutofillProfile31FromStatement( 937 s1, &profile, &profile_label, &profile_unique_id, 938 &profile_date_modified)); 939 940 sql::Statement s2( 941 connection.GetUniqueStatement( 942 "SELECT label, unique_id, name_on_card, type, card_number, " 943 "expiration_month, expiration_year, verification_code, " 944 "billing_address, shipping_address, card_number_encrypted, " 945 "verification_code_encrypted, date_modified, guid " 946 "FROM credit_cards")); 947 ASSERT_TRUE(s2.Step()); 948 EXPECT_NO_FATAL_FAILURE(CreditCard31FromStatement(s2, 949 &credit_card, 950 &cc_label, 951 &cc_unique_id, 952 &cc_number_encrypted, 953 &cc_date_modified)); 954 955 EXPECT_NE(profile_unique_id, cc_unique_id); 956 EXPECT_NE(profile.guid(), credit_card.guid()); 957 } 958 959 DoMigration(); 960 961 // Verify post-conditions. These are expectations for current version of the 962 // database. 963 { 964 sql::Connection connection; 965 ASSERT_TRUE(connection.Open(GetDatabasePath())); 966 967 // Check version. 968 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 969 970 // Verify existence of columns we'll be changing. 971 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 972 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "unique_id")); 973 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); 974 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id")); 975 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "type")); 976 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "card_number")); 977 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", 978 "verification_code")); 979 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address")); 980 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", 981 "shipping_address")); 982 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", 983 "verification_code_encrypted")); 984 985 // Verify data in the database after the migration. 986 sql::Statement s1( 987 connection.GetUniqueStatement( 988 "SELECT guid, company_name, street_address, city, state, zipcode," 989 " country_code, date_modified " 990 "FROM autofill_profiles")); 991 ASSERT_TRUE(s1.Step()); 992 993 AutofillProfile profile_a; 994 int64 profile_date_modified_a = 0; 995 EXPECT_NO_FATAL_FAILURE(AutofillProfile33FromStatement( 996 s1, &profile_a, &profile_date_modified_a)); 997 EXPECT_EQ(profile.guid(), profile_a.guid()); 998 EXPECT_EQ(profile.GetRawInfo(autofill::COMPANY_NAME), 999 profile_a.GetRawInfo(autofill::COMPANY_NAME)); 1000 EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE1), 1001 profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE1)); 1002 EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE2), 1003 profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE2)); 1004 EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_CITY), 1005 profile_a.GetRawInfo(autofill::ADDRESS_HOME_CITY)); 1006 EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_STATE), 1007 profile_a.GetRawInfo(autofill::ADDRESS_HOME_STATE)); 1008 EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_ZIP), 1009 profile_a.GetRawInfo(autofill::ADDRESS_HOME_ZIP)); 1010 EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY), 1011 profile_a.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY)); 1012 EXPECT_EQ(profile_date_modified, profile_date_modified_a); 1013 1014 sql::Statement s2( 1015 connection.GetUniqueStatement( 1016 "SELECT guid, name_on_card, expiration_month, " 1017 "expiration_year, card_number_encrypted, date_modified " 1018 "FROM credit_cards")); 1019 ASSERT_TRUE(s2.Step()); 1020 1021 CreditCard credit_card_a; 1022 base::string16 cc_label_a; 1023 std::string cc_number_encrypted_a; 1024 int64 cc_date_modified_a = 0; 1025 EXPECT_NO_FATAL_FAILURE(CreditCard32FromStatement(s2, 1026 &credit_card_a, 1027 &cc_number_encrypted_a, 1028 &cc_date_modified_a)); 1029 EXPECT_EQ(credit_card, credit_card_a); 1030 EXPECT_EQ(cc_label, cc_label_a); 1031 EXPECT_EQ(cc_number_encrypted, cc_number_encrypted_a); 1032 EXPECT_EQ(cc_date_modified, cc_date_modified_a); 1033 } 1034 } 1035 1036 // Factor |autofill_profiles| address information separately from name, email, 1037 // and phone. 1038 TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) { 1039 // Initialize the database. 1040 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_32.sql"))); 1041 1042 // Verify pre-conditions. These are expectations for version 32 of the 1043 // database. 1044 { 1045 sql::Connection connection; 1046 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1047 1048 // Verify existence of columns we'll be changing. 1049 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 1050 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "label")); 1051 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "first_name")); 1052 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "middle_name")); 1053 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "last_name")); 1054 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "email")); 1055 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1056 "company_name")); 1057 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1058 "address_line_1")); 1059 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1060 "address_line_2")); 1061 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city")); 1062 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state")); 1063 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode")); 1064 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country")); 1065 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "phone")); 1066 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "fax")); 1067 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1068 "date_modified")); 1069 1070 EXPECT_FALSE(connection.DoesTableExist("autofill_profile_names")); 1071 EXPECT_FALSE(connection.DoesTableExist("autofill_profile_emails")); 1072 EXPECT_FALSE(connection.DoesTableExist("autofill_profile_phones")); 1073 1074 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "label")); 1075 } 1076 1077 DoMigration(); 1078 1079 // Verify post-conditions. These are expectations for current version of the 1080 // database. 1081 { 1082 sql::Connection connection; 1083 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1084 1085 // Check version. 1086 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1087 1088 // Verify changes to columns. 1089 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 1090 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "label")); 1091 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "first_name")); 1092 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", 1093 "middle_name")); 1094 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "last_name")); 1095 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "email")); 1096 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1097 "company_name")); 1098 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1099 "street_address")); 1100 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city")); 1101 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state")); 1102 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode")); 1103 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1104 "country_code")); 1105 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "phone")); 1106 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "fax")); 1107 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1108 "date_modified")); 1109 1110 // New "names" table. 1111 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", "guid")); 1112 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", 1113 "first_name")); 1114 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", 1115 "middle_name")); 1116 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", 1117 "last_name")); 1118 1119 // New "emails" table. 1120 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "guid")); 1121 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "email")); 1122 1123 // New "phones" table. 1124 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "guid")); 1125 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", 1126 "number")); 1127 1128 EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "label")); 1129 1130 // Verify data in the database after the migration. 1131 sql::Statement s1( 1132 connection.GetUniqueStatement( 1133 "SELECT guid, company_name, street_address, city, state, zipcode, " 1134 " country_code, date_modified " 1135 "FROM autofill_profiles")); 1136 1137 // John Doe. 1138 ASSERT_TRUE(s1.Step()); 1139 EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s1.ColumnString(0)); 1140 EXPECT_EQ(ASCIIToUTF16("Doe Enterprises"), s1.ColumnString16(1)); 1141 EXPECT_EQ(ASCIIToUTF16("1 Main St\n" 1142 "Apt 1"), 1143 s1.ColumnString16(2)); 1144 EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3)); 1145 EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4)); 1146 EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5)); 1147 EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6)); 1148 EXPECT_EQ(1297882100L, s1.ColumnInt64(7)); 1149 1150 // John P. Doe. 1151 // Gets merged during migration from 35 to 37 due to multi-valued fields. 1152 1153 // Dave Smith. 1154 ASSERT_TRUE(s1.Step()); 1155 EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s1.ColumnString(0)); 1156 EXPECT_EQ(base::string16(), s1.ColumnString16(1)); 1157 EXPECT_EQ(ASCIIToUTF16("2 Main Street"), s1.ColumnString16(2)); 1158 EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3)); 1159 EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4)); 1160 EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5)); 1161 EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6)); 1162 EXPECT_EQ(1297882100L, s1.ColumnInt64(7)); 1163 1164 // Dave Smith (Part 2). 1165 ASSERT_TRUE(s1.Step()); 1166 EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s1.ColumnString(0)); 1167 EXPECT_EQ(base::string16(), s1.ColumnString16(1)); 1168 EXPECT_EQ(ASCIIToUTF16("2 Main St"), s1.ColumnString16(2)); 1169 EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3)); 1170 EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4)); 1171 EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5)); 1172 EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6)); 1173 EXPECT_EQ(1297882100L, s1.ColumnInt64(7)); 1174 1175 // Alfred E Newman. 1176 // Gets culled during migration from 35 to 36 due to incomplete address. 1177 1178 // 3 Main St. 1179 ASSERT_TRUE(s1.Step()); 1180 EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s1.ColumnString(0)); 1181 EXPECT_EQ(base::string16(), s1.ColumnString16(1)); 1182 EXPECT_EQ(ASCIIToUTF16("3 Main St"), s1.ColumnString16(2)); 1183 EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3)); 1184 EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4)); 1185 EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5)); 1186 EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6)); 1187 EXPECT_EQ(1297882100L, s1.ColumnInt64(7)); 1188 1189 // That should be all. 1190 EXPECT_FALSE(s1.Step()); 1191 1192 sql::Statement s2( 1193 connection.GetUniqueStatement( 1194 "SELECT guid, first_name, middle_name, last_name " 1195 "FROM autofill_profile_names")); 1196 1197 // John Doe. 1198 ASSERT_TRUE(s2.Step()); 1199 EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0)); 1200 EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1)); 1201 EXPECT_EQ(base::string16(), s2.ColumnString16(2)); 1202 EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3)); 1203 1204 // John P. Doe. Note same guid as above due to merging of multi-valued 1205 // fields. 1206 ASSERT_TRUE(s2.Step()); 1207 EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0)); 1208 EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1)); 1209 EXPECT_EQ(ASCIIToUTF16("P."), s2.ColumnString16(2)); 1210 EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3)); 1211 1212 // Dave Smith. 1213 ASSERT_TRUE(s2.Step()); 1214 EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s2.ColumnString(0)); 1215 EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1)); 1216 EXPECT_EQ(base::string16(), s2.ColumnString16(2)); 1217 EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3)); 1218 1219 // Dave Smith (Part 2). 1220 ASSERT_TRUE(s2.Step()); 1221 EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s2.ColumnString(0)); 1222 EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1)); 1223 EXPECT_EQ(base::string16(), s2.ColumnString16(2)); 1224 EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3)); 1225 1226 // Alfred E Newman. 1227 // Gets culled during migration from 35 to 36 due to incomplete address. 1228 1229 // 3 Main St. 1230 ASSERT_TRUE(s2.Step()); 1231 EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s2.ColumnString(0)); 1232 EXPECT_EQ(base::string16(), s2.ColumnString16(1)); 1233 EXPECT_EQ(base::string16(), s2.ColumnString16(2)); 1234 EXPECT_EQ(base::string16(), s2.ColumnString16(3)); 1235 1236 // Should be all. 1237 EXPECT_FALSE(s2.Step()); 1238 1239 sql::Statement s3( 1240 connection.GetUniqueStatement( 1241 "SELECT guid, email " 1242 "FROM autofill_profile_emails")); 1243 1244 // John Doe. 1245 ASSERT_TRUE(s3.Step()); 1246 EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s3.ColumnString(0)); 1247 EXPECT_EQ(ASCIIToUTF16("john (at) doe.com"), s3.ColumnString16(1)); 1248 1249 // John P. Doe. 1250 // Gets culled during migration from 35 to 37 due to merging of John Doe and 1251 // John P. Doe addresses. 1252 1253 // 2 Main Street. 1254 ASSERT_TRUE(s3.Step()); 1255 EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s3.ColumnString(0)); 1256 EXPECT_EQ(base::string16(), s3.ColumnString16(1)); 1257 1258 // 2 Main St. 1259 ASSERT_TRUE(s3.Step()); 1260 EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s3.ColumnString(0)); 1261 EXPECT_EQ(base::string16(), s3.ColumnString16(1)); 1262 1263 // Alfred E Newman. 1264 // Gets culled during migration from 35 to 36 due to incomplete address. 1265 1266 // 3 Main St. 1267 ASSERT_TRUE(s3.Step()); 1268 EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s3.ColumnString(0)); 1269 EXPECT_EQ(base::string16(), s3.ColumnString16(1)); 1270 1271 // Should be all. 1272 EXPECT_FALSE(s3.Step()); 1273 1274 sql::Statement s4( 1275 connection.GetUniqueStatement( 1276 "SELECT guid, number " 1277 "FROM autofill_profile_phones")); 1278 1279 // John Doe phone. 1280 ASSERT_TRUE(s4.Step()); 1281 EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s4.ColumnString(0)); 1282 EXPECT_EQ(ASCIIToUTF16("4151112222"), s4.ColumnString16(1)); 1283 1284 // John Doe fax. 1285 // Gets culled after fax type removed. 1286 1287 // John P. Doe phone. 1288 // Gets culled during migration from 35 to 37 due to merging of John Doe and 1289 // John P. Doe addresses. 1290 1291 // John P. Doe fax. 1292 // Gets culled during migration from 35 to 37 due to merging of John Doe and 1293 // John P. Doe addresses. 1294 1295 // 2 Main Street phone. 1296 ASSERT_TRUE(s4.Step()); 1297 EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s4.ColumnString(0)); 1298 EXPECT_EQ(base::string16(), s4.ColumnString16(1)); 1299 1300 // 2 Main Street fax. 1301 // Gets culled after fax type removed. 1302 1303 // 2 Main St phone. 1304 ASSERT_TRUE(s4.Step()); 1305 EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s4.ColumnString(0)); 1306 EXPECT_EQ(0, s4.ColumnInt(1)); // 0 means phone. 1307 EXPECT_EQ(base::string16(), s4.ColumnString16(2)); 1308 1309 // 2 Main St fax. 1310 // Gets culled after fax type removed. 1311 1312 // Note no phone or fax for Alfred E Newman. 1313 1314 // 3 Main St phone. 1315 ASSERT_TRUE(s4.Step()); 1316 EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s4.ColumnString(0)); 1317 EXPECT_EQ(base::string16(), s4.ColumnString16(1)); 1318 1319 // 2 Main St fax. 1320 // Gets culled after fax type removed. 1321 1322 // Should be all. 1323 EXPECT_FALSE(s4.Step()); 1324 } 1325 } 1326 1327 // Adds a column for the autofill profile's country code. 1328 TEST_F(WebDatabaseMigrationTest, MigrateVersion33ToCurrent) { 1329 // Initialize the database. 1330 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_33.sql"))); 1331 1332 // Verify pre-conditions. These are expectations for version 33 of the 1333 // database. 1334 { 1335 sql::Connection connection; 1336 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1337 1338 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", 1339 "country_code")); 1340 1341 // Check that the country value is the one we expect. 1342 sql::Statement s( 1343 connection.GetUniqueStatement("SELECT country FROM autofill_profiles")); 1344 1345 ASSERT_TRUE(s.Step()); 1346 std::string country = s.ColumnString(0); 1347 EXPECT_EQ("United States", country); 1348 } 1349 1350 DoMigration(); 1351 1352 // Verify post-conditions. These are expectations for current version of the 1353 // database. 1354 { 1355 sql::Connection connection; 1356 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1357 1358 // Check version. 1359 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1360 1361 ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", 1362 "country_code")); 1363 1364 // Check that the country code is properly converted. 1365 sql::Statement s(connection.GetUniqueStatement( 1366 "SELECT country_code FROM autofill_profiles")); 1367 1368 ASSERT_TRUE(s.Step()); 1369 std::string country_code = s.ColumnString(0); 1370 EXPECT_EQ("US", country_code); 1371 } 1372 } 1373 1374 // Cleans up bad country code "UK" in favor of good country code "GB". 1375 TEST_F(WebDatabaseMigrationTest, MigrateVersion34ToCurrent) { 1376 // Initialize the database. 1377 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_34.sql"))); 1378 1379 // Verify pre-conditions. These are expectations for version 34 of the 1380 // database. 1381 { 1382 sql::Connection connection; 1383 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1384 1385 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", 1386 "country_code")); 1387 1388 // Check that the country_code value is the one we expect. 1389 sql::Statement s( 1390 connection.GetUniqueStatement("SELECT country_code " 1391 "FROM autofill_profiles")); 1392 1393 ASSERT_TRUE(s.Step()); 1394 std::string country_code = s.ColumnString(0); 1395 EXPECT_EQ("UK", country_code); 1396 1397 // Should have only one. 1398 ASSERT_FALSE(s.Step()); 1399 } 1400 1401 DoMigration(); 1402 1403 // Verify post-conditions. These are expectations for current version of the 1404 // database. 1405 { 1406 sql::Connection connection; 1407 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1408 1409 // Check version. 1410 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1411 1412 ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", 1413 "country_code")); 1414 1415 // Check that the country_code code is properly converted. 1416 sql::Statement s(connection.GetUniqueStatement( 1417 "SELECT country_code FROM autofill_profiles")); 1418 1419 ASSERT_TRUE(s.Step()); 1420 std::string country_code = s.ColumnString(0); 1421 EXPECT_EQ("GB", country_code); 1422 1423 // Should have only one. 1424 ASSERT_FALSE(s.Step()); 1425 } 1426 } 1427 1428 // Cleans up invalid profiles based on more agressive merging. Filters out 1429 // profiles that are subsets of other profiles, and profiles with invalid email, 1430 // state, and incomplete address. 1431 TEST_F(WebDatabaseMigrationTest, MigrateVersion35ToCurrent) { 1432 // Initialize the database. 1433 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_35.sql"))); 1434 1435 // Verify pre-conditions. These are expectations for version 34 of the 1436 // database. 1437 { 1438 sql::Connection connection; 1439 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1440 1441 EXPECT_FALSE(connection.DoesTableExist("autofill_profiles_trash")); 1442 ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 1443 1444 // Check that there are 6 profiles prior to merge. 1445 sql::Statement s( 1446 connection.GetUniqueStatement("SELECT guid FROM autofill_profiles")); 1447 int i = 0; 1448 while (s.Step()) 1449 ++i; 1450 EXPECT_EQ(6, i); 1451 } 1452 1453 DoMigration(); 1454 1455 // Verify post-conditions. These are expectations for current version of the 1456 // database. 1457 { 1458 sql::Connection connection; 1459 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1460 1461 // Check version. 1462 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1463 1464 ASSERT_TRUE(connection.DoesTableExist("autofill_profiles_trash")); 1465 ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles_trash", "guid")); 1466 ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); 1467 1468 // Verify data in the database after the migration. 1469 sql::Statement s1( 1470 connection.GetUniqueStatement( 1471 "SELECT guid, company_name, street_address, city, state, zipcode," 1472 " country_code, date_modified " 1473 "FROM autofill_profiles")); 1474 1475 // John Doe. 1476 ASSERT_TRUE(s1.Step()); 1477 EXPECT_EQ("00000000-0000-0000-0000-000000000001", s1.ColumnString(0)); 1478 EXPECT_EQ(ASCIIToUTF16("Acme Inc."), s1.ColumnString16(1)); 1479 EXPECT_EQ(ASCIIToUTF16("1 Main Street\n" 1480 "Apt 2"), 1481 s1.ColumnString16(2)); 1482 EXPECT_EQ(ASCIIToUTF16("San Francisco"), s1.ColumnString16(3)); 1483 EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4)); 1484 EXPECT_EQ(ASCIIToUTF16("94102"), s1.ColumnString16(5)); 1485 EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6)); 1486 EXPECT_EQ(1300131704, s1.ColumnInt64(7)); 1487 1488 // That should be it. 1489 ASSERT_FALSE(s1.Step()); 1490 1491 // Check that there 5 trashed profile after the merge. 1492 sql::Statement s2( 1493 connection.GetUniqueStatement("SELECT guid " 1494 "FROM autofill_profiles_trash")); 1495 ASSERT_TRUE(s2.Step()); 1496 EXPECT_EQ("00000000-0000-0000-0000-000000000002", s2.ColumnString(0)); 1497 1498 ASSERT_TRUE(s2.Step()); 1499 EXPECT_EQ("00000000-0000-0000-0000-000000000003", s2.ColumnString(0)); 1500 1501 ASSERT_TRUE(s2.Step()); 1502 EXPECT_EQ("00000000-0000-0000-0000-000000000004", s2.ColumnString(0)); 1503 1504 ASSERT_TRUE(s2.Step()); 1505 EXPECT_EQ("00000000-0000-0000-0000-000000000005", s2.ColumnString(0)); 1506 1507 ASSERT_TRUE(s2.Step()); 1508 EXPECT_EQ("00000000-0000-0000-0000-000000000006", s2.ColumnString(0)); 1509 1510 // That should be it. 1511 ASSERT_FALSE(s2.Step()); 1512 } 1513 } 1514 1515 // Tests that the |keywords| |last_modified| column gets added to the schema for 1516 // a version 37 database. 1517 TEST_F(WebDatabaseMigrationTest, MigrateVersion37ToCurrent) { 1518 // This schema is taken from a build prior to the addition of the |keywords| 1519 // |last_modified| column. 1520 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_37.sql"))); 1521 1522 // Verify pre-conditions. These are expectations for version 37 of the 1523 // database. 1524 { 1525 sql::Connection connection; 1526 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1527 1528 // Columns existing and not existing before current version. 1529 ASSERT_TRUE(connection.DoesColumnExist("keywords", "id")); 1530 ASSERT_FALSE(connection.DoesColumnExist("keywords", "last_modified")); 1531 } 1532 1533 DoMigration(); 1534 1535 // Verify post-conditions. These are expectations for current version of the 1536 // database. 1537 { 1538 sql::Connection connection; 1539 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1540 1541 // Check version. 1542 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1543 1544 // |keywords| |last_modified| column should have been added. 1545 EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); 1546 EXPECT_TRUE(connection.DoesColumnExist("keywords", "last_modified")); 1547 } 1548 } 1549 1550 // Tests that the |keywords| |sync_guid| column gets added to the schema for 1551 // a version 38 database. 1552 TEST_F(WebDatabaseMigrationTest, MigrateVersion38ToCurrent) { 1553 // This schema is taken from a build prior to the addition of the |keywords| 1554 // |sync_guid| column. 1555 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_38.sql"))); 1556 1557 // Verify pre-conditions. These are expectations for version 38 of the 1558 // database. 1559 { 1560 sql::Connection connection; 1561 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1562 1563 // Columns existing and not existing before current version. 1564 ASSERT_TRUE(connection.DoesColumnExist("keywords", "id")); 1565 ASSERT_FALSE(connection.DoesColumnExist("keywords", "sync_guid")); 1566 } 1567 1568 DoMigration(); 1569 1570 // Verify post-conditions. These are expectations for current version of the 1571 // database. 1572 { 1573 sql::Connection connection; 1574 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1575 1576 // Check version. 1577 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1578 1579 // |keywords| |sync_guid| column should have been added. 1580 EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); 1581 EXPECT_TRUE(connection.DoesColumnExist("keywords", "sync_guid")); 1582 } 1583 } 1584 1585 // Tests that no backup data is added to a version 39 database. 1586 TEST_F(WebDatabaseMigrationTest, MigrateVersion39ToCurrent) { 1587 // This schema is taken from a build prior to the addition of the default 1588 // search provider backup field to the meta table. 1589 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_39.sql"))); 1590 1591 // Verify pre-conditions. These are expectations for version 39 of the 1592 // database. 1593 { 1594 sql::Connection connection; 1595 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1596 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1597 1598 sql::MetaTable meta_table; 1599 ASSERT_TRUE(meta_table.Init(&connection, 39, 39)); 1600 1601 int64 default_search_provider_id = 0; 1602 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1603 &default_search_provider_id)); 1604 1605 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1606 } 1607 1608 DoMigration(); 1609 1610 // Verify post-conditions. These are expectations for current version of the 1611 // database. 1612 { 1613 sql::Connection connection; 1614 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1615 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1616 1617 // Check version. 1618 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1619 1620 sql::MetaTable meta_table; 1621 ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber, 1622 kCurrentTestedVersionNumber)); 1623 1624 int64 default_search_provider_id = 0; 1625 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1626 &default_search_provider_id)); 1627 EXPECT_NE(0, default_search_provider_id); 1628 1629 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1630 } 1631 } 1632 1633 // Tests that the backup data is removed from the database. 1634 TEST_F(WebDatabaseMigrationTest, MigrateVersion40ToCurrent) { 1635 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_40.sql"))); 1636 1637 // Verify pre-conditions. These are expectations for version 40 of the 1638 // database. 1639 { 1640 sql::Connection connection; 1641 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1642 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1643 1644 sql::MetaTable meta_table; 1645 ASSERT_TRUE(meta_table.Init(&connection, 40, 40)); 1646 1647 int64 default_search_provider_id = 0; 1648 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1649 &default_search_provider_id)); 1650 1651 EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table)); 1652 } 1653 1654 DoMigration(); 1655 1656 // Verify post-conditions. These are expectations for current version of the 1657 // database. 1658 { 1659 sql::Connection connection; 1660 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1661 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1662 1663 // Check version. 1664 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1665 1666 sql::MetaTable meta_table; 1667 ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber, 1668 kCurrentTestedVersionNumber)); 1669 1670 int64 default_search_provider_id = 0; 1671 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1672 &default_search_provider_id)); 1673 EXPECT_NE(0, default_search_provider_id); 1674 1675 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1676 } 1677 } 1678 1679 // Tests that the backup data is removed from the database. 1680 TEST_F(WebDatabaseMigrationTest, MigrateVersion41ToCurrent) { 1681 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_41.sql"))); 1682 1683 // Verify pre-conditions. These are expectations for version 41 of the 1684 // database. 1685 { 1686 sql::Connection connection; 1687 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1688 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1689 1690 sql::MetaTable meta_table; 1691 ASSERT_TRUE(meta_table.Init(&connection, 41, 41)); 1692 1693 int64 default_search_provider_id = 0; 1694 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1695 &default_search_provider_id)); 1696 1697 EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table)); 1698 } 1699 1700 DoMigration(); 1701 1702 // Verify post-conditions. These are expectations for current version of the 1703 // database. 1704 { 1705 sql::Connection connection; 1706 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1707 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1708 1709 // Check version. 1710 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1711 1712 sql::MetaTable meta_table; 1713 ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber, 1714 kCurrentTestedVersionNumber)); 1715 1716 int64 default_search_provider_id = 0; 1717 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1718 &default_search_provider_id)); 1719 EXPECT_NE(0, default_search_provider_id); 1720 1721 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1722 } 1723 } 1724 1725 // Tests that the backup data is removed from the database. 1726 TEST_F(WebDatabaseMigrationTest, MigrateVersion42ToCurrent) { 1727 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_42.sql"))); 1728 1729 // Verify pre-conditions. These are expectations for version 42 of the 1730 // database. 1731 { 1732 sql::Connection connection; 1733 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1734 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1735 1736 sql::MetaTable meta_table; 1737 ASSERT_TRUE(meta_table.Init(&connection, 42, 42)); 1738 1739 int64 default_search_provider_id = 0; 1740 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1741 &default_search_provider_id)); 1742 1743 EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table)); 1744 1745 EXPECT_FALSE(connection.DoesTableExist("keywords_backup")); 1746 } 1747 1748 DoMigration(); 1749 1750 // Verify post-conditions. These are expectations for current version of the 1751 // database. 1752 { 1753 sql::Connection connection; 1754 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1755 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1756 1757 // Check version. 1758 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1759 1760 sql::MetaTable meta_table; 1761 ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber, 1762 kCurrentTestedVersionNumber)); 1763 1764 int64 default_search_provider_id = 0; 1765 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1766 &default_search_provider_id)); 1767 EXPECT_NE(0, default_search_provider_id); 1768 1769 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1770 } 1771 } 1772 1773 // Tests that the backup data is removed from the database. 1774 TEST_F(WebDatabaseMigrationTest, MigrateVersion43ToCurrent) { 1775 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_43.sql"))); 1776 1777 int64 previous_default_search_provider_id; 1778 1779 // Verify pre-conditions. These are expectations for version 43 of the 1780 // database. 1781 { 1782 sql::Connection connection; 1783 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1784 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1785 1786 sql::MetaTable meta_table; 1787 ASSERT_TRUE(meta_table.Init(&connection, 43, 43)); 1788 1789 int64 default_search_provider_id = 0; 1790 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1791 &default_search_provider_id)); 1792 EXPECT_NE(default_search_provider_id, 0); 1793 previous_default_search_provider_id = default_search_provider_id; 1794 1795 EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table)); 1796 EXPECT_TRUE(connection.DoesTableExist("keywords_backup")); 1797 } 1798 1799 DoMigration(); 1800 1801 // Verify post-conditions. These are expectations for current version of the 1802 // database. 1803 { 1804 sql::Connection connection; 1805 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1806 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1807 1808 // Check version. 1809 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1810 1811 sql::MetaTable meta_table; 1812 ASSERT_TRUE(meta_table.Init( 1813 &connection, 1814 kCurrentTestedVersionNumber, 1815 kCurrentTestedVersionNumber)); 1816 1817 int64 default_search_provider_id = 0; 1818 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 1819 &default_search_provider_id)); 1820 // Default search provider ID should not change. 1821 EXPECT_EQ(previous_default_search_provider_id, default_search_provider_id); 1822 1823 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1824 } 1825 } 1826 1827 // Tests that the |autogenerate_keyword| and |logo_id| columns get removed from 1828 // the keyword table schema for a version 45 database. 1829 TEST_F(WebDatabaseMigrationTest, MigrateVersion44ToCurrent) { 1830 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_44.sql"))); 1831 1832 // Verify pre-conditions. These are expectations for version 44 of the 1833 // database. 1834 { 1835 sql::Connection connection; 1836 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1837 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1838 1839 sql::MetaTable meta_table; 1840 ASSERT_TRUE(meta_table.Init(&connection, 44, 44)); 1841 1842 ASSERT_TRUE(connection.DoesColumnExist("keywords", "autogenerate_keyword")); 1843 ASSERT_TRUE(connection.DoesColumnExist("keywords", "logo_id")); 1844 } 1845 1846 DoMigration(); 1847 1848 // Verify post-conditions. These are expectations for current version of the 1849 // database. 1850 { 1851 sql::Connection connection; 1852 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1853 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1854 1855 // Check version. 1856 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1857 1858 sql::MetaTable meta_table; 1859 ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber, 1860 kCurrentTestedVersionNumber)); 1861 1862 // We should have removed this obsolete key. 1863 std::string default_search_provider_backup; 1864 EXPECT_FALSE(meta_table.GetValue("Default Search Provider Backup", 1865 &default_search_provider_backup)); 1866 1867 // Two columns should have been removed. 1868 EXPECT_FALSE(connection.DoesColumnExist("keywords", 1869 "autogenerate_keyword")); 1870 EXPECT_FALSE(connection.DoesColumnExist("keywords", "logo_id")); 1871 1872 // Backup data should have been removed. 1873 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 1874 } 1875 } 1876 1877 // Previously, this tested that the web_intents and web_intents_defaults tables 1878 // were modified to include "scheme" columns. Since the web_intents and 1879 // web_intents_defaults tables are now obsolete, this test checks to ensure that 1880 // they are properly removed. 1881 TEST_F(WebDatabaseMigrationTest, MigrateVersion45ToCurrent) { 1882 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_45.sql"))); 1883 1884 // Verify pre-conditions. These are expectations for version 45 of the 1885 // database. 1886 { 1887 sql::Connection connection; 1888 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1889 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1890 1891 sql::MetaTable meta_table; 1892 ASSERT_TRUE(meta_table.Init(&connection, 45, 45)); 1893 1894 ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents")); 1895 ASSERT_FALSE(connection.DoesColumnExist( 1896 "scheme", "web_intents_defaults")); 1897 } 1898 1899 DoMigration(); 1900 1901 // Verify post-conditions. These are expectations for current version of the 1902 // database. 1903 { 1904 sql::Connection connection; 1905 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1906 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1907 1908 // Check version. 1909 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1910 1911 sql::MetaTable meta_table; 1912 ASSERT_TRUE(meta_table.Init( 1913 &connection, 1914 kCurrentTestedVersionNumber, 1915 kCurrentTestedVersionNumber)); 1916 1917 // finally ensure the migration code cleaned up after itself 1918 EXPECT_FALSE(connection.DoesTableExist("web_intents")); 1919 EXPECT_FALSE(connection.DoesTableExist("web_intents_defaults")); 1920 } 1921 } 1922 1923 // Previously, this tested that the web_intents and web_intents_defaults tables 1924 // were modified to include "scheme" columns. Since the web_intents and 1925 // web_intents_defaults tables are now obsolete, this test checks to ensure that 1926 // they are properly removed. 1927 TEST_F(WebDatabaseMigrationTest, MigrateVersion45InvalidToCurrent) { 1928 ASSERT_NO_FATAL_FAILURE( 1929 LoadDatabase(FILE_PATH_LITERAL("version_45_invalid.sql"))); 1930 1931 // Verify pre-conditions. These are expectations for version 45 of the 1932 // database. 1933 { 1934 sql::Connection connection; 1935 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1936 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1937 1938 sql::MetaTable meta_table; 1939 ASSERT_TRUE(meta_table.Init(&connection, 45, 45)); 1940 1941 ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents")); 1942 ASSERT_FALSE(connection.DoesColumnExist( 1943 "scheme", "web_intents_defaults")); 1944 } 1945 1946 DoMigration(); 1947 1948 // Verify post-conditions. These are expectations for current version of the 1949 // database. 1950 { 1951 sql::Connection connection; 1952 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1953 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1954 1955 // Check version. 1956 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1957 1958 sql::MetaTable meta_table; 1959 ASSERT_TRUE(meta_table.Init( 1960 &connection, 1961 kCurrentTestedVersionNumber, 1962 kCurrentTestedVersionNumber)); 1963 1964 EXPECT_FALSE(connection.DoesTableExist("web_intents")); 1965 EXPECT_FALSE(connection.DoesTableExist("web_intents_defaults")); 1966 } 1967 } 1968 1969 // Check that current version is forced to compatible version before migration, 1970 // if the former is smaller. 1971 TEST_F(WebDatabaseMigrationTest, MigrateVersion45CompatibleToCurrent) { 1972 ASSERT_NO_FATAL_FAILURE( 1973 LoadDatabase(FILE_PATH_LITERAL("version_45_compatible.sql"))); 1974 1975 // Verify pre-conditions. These are expectations for version 45 of the 1976 // database. 1977 { 1978 sql::Connection connection; 1979 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1980 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1981 1982 sql::MetaTable meta_table; 1983 // Database is actually version 45 but the version field states 40. 1984 ASSERT_TRUE(meta_table.Init(&connection, 40, 45)); 1985 } 1986 1987 DoMigration(); 1988 1989 // Verify post-conditions. These are expectations for current version of the 1990 // database. 1991 { 1992 sql::Connection connection; 1993 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1994 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 1995 1996 // Check version. 1997 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 1998 EXPECT_LE(45, VersionFromConnection(&connection)); 1999 } 2000 } 2001 2002 // Tests that the |alternate_urls| column is added to the keyword table schema 2003 // for a version 47 database. 2004 TEST_F(WebDatabaseMigrationTest, MigrateVersion46ToCurrent) { 2005 ASSERT_NO_FATAL_FAILURE( 2006 LoadDatabase(FILE_PATH_LITERAL("version_46.sql"))); 2007 2008 // Verify pre-conditions. These are expectations for version 46 of the 2009 // database. 2010 { 2011 sql::Connection connection; 2012 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2013 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2014 2015 sql::MetaTable meta_table; 2016 ASSERT_TRUE(meta_table.Init(&connection, 46, 46)); 2017 2018 ASSERT_FALSE(connection.DoesColumnExist("keywords", "alternate_urls")); 2019 ASSERT_FALSE(connection.DoesColumnExist("keywords_backup", 2020 "alternate_urls")); 2021 } 2022 2023 DoMigration(); 2024 2025 // Verify post-conditions. These are expectations for current version of the 2026 // database. 2027 { 2028 sql::Connection connection; 2029 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2030 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2031 2032 // Check version. 2033 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2034 2035 // A new column should have been created. 2036 EXPECT_TRUE(connection.DoesColumnExist("keywords", "alternate_urls")); 2037 } 2038 } 2039 2040 // Tests that the backup data is removed from the database. 2041 TEST_F(WebDatabaseMigrationTest, MigrateVersion47ToCurrent) { 2042 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_47.sql"))); 2043 2044 // Verify pre-conditions. These are expectations for version 47 of the 2045 // database. 2046 { 2047 sql::Connection connection; 2048 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2049 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2050 2051 sql::MetaTable meta_table; 2052 ASSERT_TRUE(meta_table.Init(&connection, 47, 47)); 2053 2054 int64 default_search_provider_id = 0; 2055 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 2056 &default_search_provider_id)); 2057 EXPECT_NE(0, default_search_provider_id); 2058 2059 EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table)); 2060 EXPECT_TRUE(connection.DoesTableExist("keywords_backup")); 2061 } 2062 2063 DoMigration(); 2064 2065 // Verify post-conditions. These are expectations for current version of the 2066 // database. 2067 { 2068 sql::Connection connection; 2069 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2070 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2071 2072 // Check version. 2073 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2074 2075 sql::MetaTable meta_table; 2076 ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber, 2077 kCurrentTestedVersionNumber)); 2078 2079 int64 default_search_provider_id = 0; 2080 EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey, 2081 &default_search_provider_id)); 2082 EXPECT_NE(0, default_search_provider_id); 2083 2084 EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table)); 2085 } 2086 } 2087 2088 // Tests that the |search_terms_replacement_key| column is added to the keyword 2089 // table schema for a version 49 database. 2090 TEST_F(WebDatabaseMigrationTest, MigrateVersion48ToCurrent) { 2091 ASSERT_NO_FATAL_FAILURE( 2092 LoadDatabase(FILE_PATH_LITERAL("version_48.sql"))); 2093 2094 // Verify pre-conditions. These are expectations for version 48 of the 2095 // database. 2096 { 2097 sql::Connection connection; 2098 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2099 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2100 2101 sql::MetaTable meta_table; 2102 ASSERT_TRUE(meta_table.Init(&connection, 48, 48)); 2103 2104 ASSERT_FALSE(connection.DoesColumnExist("keywords", 2105 "search_terms_replacement_key")); 2106 } 2107 2108 DoMigration(); 2109 2110 // Verify post-conditions. These are expectations for current version of the 2111 // database. 2112 { 2113 sql::Connection connection; 2114 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2115 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2116 2117 // Check version. 2118 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2119 2120 // A new column should have been created. 2121 EXPECT_TRUE(connection.DoesColumnExist("keywords", 2122 "search_terms_replacement_key")); 2123 } 2124 } 2125 2126 // Tests that the |origin| column is added to the autofill_profiles and 2127 // credit_cards table schemas for a version 50 database. 2128 TEST_F(WebDatabaseMigrationTest, MigrateVersion49ToCurrent) { 2129 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_49.sql"))); 2130 2131 // Verify pre-conditions. These are expectations for version 49 of the 2132 // database. 2133 { 2134 sql::Connection connection; 2135 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2136 2137 ASSERT_FALSE(connection.DoesColumnExist("autofill_profiles", "origin")); 2138 ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "origin")); 2139 } 2140 2141 DoMigration(); 2142 2143 // Verify post-conditions. These are expectations for current version of the 2144 // database. 2145 { 2146 sql::Connection connection; 2147 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2148 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2149 2150 // Check version. 2151 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2152 2153 // A new column should have been created in both tables. 2154 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "origin")); 2155 EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "origin")); 2156 } 2157 } 2158 2159 // Tests that the columns |image_url|, |search_url_post_params|, 2160 // |suggest_url_post_params|, |instant_url_post_params|, and 2161 // |image_url_post_params| are added to the keyword table schema for a version 2162 // 50 database. 2163 TEST_F(WebDatabaseMigrationTest, MigrateVersion50ToCurrent) { 2164 ASSERT_NO_FATAL_FAILURE( 2165 LoadDatabase(FILE_PATH_LITERAL("version_50.sql"))); 2166 2167 // Verify pre-conditions. These are expectations for version 50 of the 2168 // database. 2169 { 2170 sql::Connection connection; 2171 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2172 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2173 2174 sql::MetaTable meta_table; 2175 ASSERT_TRUE(meta_table.Init(&connection, 50, 50)); 2176 2177 ASSERT_FALSE(connection.DoesColumnExist("keywords", "image_url")); 2178 ASSERT_FALSE(connection.DoesColumnExist("keywords", 2179 "search_url_post_params")); 2180 ASSERT_FALSE(connection.DoesColumnExist("keywords", 2181 "suggest_url_post_params")); 2182 ASSERT_FALSE(connection.DoesColumnExist("keywords", 2183 "instant_url_post_params")); 2184 ASSERT_FALSE(connection.DoesColumnExist("keywords", 2185 "image_url_post_params")); 2186 } 2187 2188 DoMigration(); 2189 2190 // Verify post-conditions. These are expectations for current version of the 2191 // database. 2192 { 2193 sql::Connection connection; 2194 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2195 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2196 2197 // Check version. 2198 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2199 2200 // New columns should have been created. 2201 EXPECT_TRUE(connection.DoesColumnExist("keywords", "image_url")); 2202 EXPECT_TRUE(connection.DoesColumnExist("keywords", 2203 "search_url_post_params")); 2204 EXPECT_TRUE(connection.DoesColumnExist("keywords", 2205 "suggest_url_post_params")); 2206 EXPECT_TRUE(connection.DoesColumnExist("keywords", 2207 "instant_url_post_params")); 2208 EXPECT_TRUE(connection.DoesColumnExist("keywords", 2209 "image_url_post_params")); 2210 } 2211 } 2212 2213 // Tests that the column |new_tab_url| is added to the keyword table schema for 2214 // a version 52 database. 2215 TEST_F(WebDatabaseMigrationTest, MigrateVersion52ToCurrent) { 2216 ASSERT_NO_FATAL_FAILURE( 2217 LoadDatabase(FILE_PATH_LITERAL("version_52.sql"))); 2218 2219 // Verify pre-conditions. These are expectations for version 52 of the 2220 // database. 2221 { 2222 sql::Connection connection; 2223 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2224 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2225 2226 sql::MetaTable meta_table; 2227 ASSERT_TRUE(meta_table.Init(&connection, 52, 52)); 2228 2229 ASSERT_FALSE(connection.DoesColumnExist("keywords", "new_tab_url")); 2230 } 2231 2232 DoMigration(); 2233 2234 // Verify post-conditions. These are expectations for current version of the 2235 // database. 2236 { 2237 sql::Connection connection; 2238 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2239 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2240 2241 // Check version. 2242 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2243 2244 // New columns should have been created. 2245 EXPECT_TRUE(connection.DoesColumnExist("keywords", "new_tab_url")); 2246 } 2247 } 2248 2249 // Tests that for a version 54 database, 2250 // (a) The street_address, dependent_locality, and sorting_code columns are 2251 // added to the autofill_profiles table schema. 2252 // (b) The address_line1, address_line2, and country columns are dropped from 2253 // the autofill_profiles table schema. 2254 // (c) The type column is dropped from the autofill_profile_phones schema. 2255 TEST_F(WebDatabaseMigrationTest, MigrateVersion53ToCurrent) { 2256 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_53.sql"))); 2257 2258 // Verify pre-conditions. These are expectations for version 53 of the 2259 // database. 2260 { 2261 sql::Connection connection; 2262 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2263 2264 EXPECT_TRUE( 2265 connection.DoesColumnExist("autofill_profiles", "address_line_1")); 2266 EXPECT_TRUE( 2267 connection.DoesColumnExist("autofill_profiles", "address_line_2")); 2268 EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country")); 2269 EXPECT_FALSE( 2270 connection.DoesColumnExist("autofill_profiles", "street_address")); 2271 EXPECT_FALSE( 2272 connection.DoesColumnExist("autofill_profiles", "dependent_locality")); 2273 EXPECT_FALSE( 2274 connection.DoesColumnExist("autofill_profiles", "sorting_code")); 2275 EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "type")); 2276 } 2277 2278 DoMigration(); 2279 2280 // Verify post-conditions. These are expectations for current version of the 2281 // database. 2282 { 2283 sql::Connection connection; 2284 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2285 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2286 2287 // Check version. 2288 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2289 2290 // Columns should have been added and removed appropriately. 2291 EXPECT_FALSE( 2292 connection.DoesColumnExist("autofill_profiles", "address_line1")); 2293 EXPECT_FALSE( 2294 connection.DoesColumnExist("autofill_profiles", "address_line2")); 2295 EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "country")); 2296 EXPECT_TRUE( 2297 connection.DoesColumnExist("autofill_profiles", "street_address")); 2298 EXPECT_TRUE( 2299 connection.DoesColumnExist("autofill_profiles", "dependent_locality")); 2300 EXPECT_TRUE( 2301 connection.DoesColumnExist("autofill_profiles", "sorting_code")); 2302 EXPECT_FALSE(connection.DoesColumnExist("autofill_profile_phones", "type")); 2303 2304 // Data should have been preserved. 2305 sql::Statement s_profiles( 2306 connection.GetUniqueStatement( 2307 "SELECT guid, company_name, street_address, dependent_locality," 2308 " city, state, zipcode, sorting_code, country_code, date_modified," 2309 " origin " 2310 "FROM autofill_profiles")); 2311 2312 // Address lines 1 and 2. 2313 ASSERT_TRUE(s_profiles.Step()); 2314 EXPECT_EQ("00000000-0000-0000-0000-000000000001", 2315 s_profiles.ColumnString(0)); 2316 EXPECT_EQ(ASCIIToUTF16("Google, Inc."), s_profiles.ColumnString16(1)); 2317 EXPECT_EQ(ASCIIToUTF16("1950 Charleston Rd.\n" 2318 "(2nd floor)"), 2319 s_profiles.ColumnString16(2)); 2320 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3)); 2321 EXPECT_EQ(ASCIIToUTF16("Mountain View"), s_profiles.ColumnString16(4)); 2322 EXPECT_EQ(ASCIIToUTF16("CA"), s_profiles.ColumnString16(5)); 2323 EXPECT_EQ(ASCIIToUTF16("94043"), s_profiles.ColumnString16(6)); 2324 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7)); 2325 EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8)); 2326 EXPECT_EQ(1386046731, s_profiles.ColumnInt(9)); 2327 EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10)); 2328 2329 // Only address line 1. 2330 ASSERT_TRUE(s_profiles.Step()); 2331 EXPECT_EQ("00000000-0000-0000-0000-000000000002", 2332 s_profiles.ColumnString(0)); 2333 EXPECT_EQ(ASCIIToUTF16("Google!"), s_profiles.ColumnString16(1)); 2334 EXPECT_EQ(ASCIIToUTF16("1600 Amphitheatre Pkwy."), 2335 s_profiles.ColumnString16(2)); 2336 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3)); 2337 EXPECT_EQ(ASCIIToUTF16("Mtn. View"), s_profiles.ColumnString16(4)); 2338 EXPECT_EQ(ASCIIToUTF16("California"), s_profiles.ColumnString16(5)); 2339 EXPECT_EQ(ASCIIToUTF16("94043-1234"), s_profiles.ColumnString16(6)); 2340 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7)); 2341 EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8)); 2342 EXPECT_EQ(1386046800, s_profiles.ColumnInt(9)); 2343 EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10)); 2344 2345 // Only address line 2. 2346 ASSERT_TRUE(s_profiles.Step()); 2347 EXPECT_EQ("00000000-0000-0000-0000-000000000003", 2348 s_profiles.ColumnString(0)); 2349 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(1)); 2350 EXPECT_EQ(ASCIIToUTF16("\nOnly line 2???"), s_profiles.ColumnString16(2)); 2351 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3)); 2352 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(4)); 2353 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(5)); 2354 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(6)); 2355 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7)); 2356 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(8)); 2357 EXPECT_EQ(1386046834, s_profiles.ColumnInt(9)); 2358 EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10)); 2359 2360 // No address lines. 2361 ASSERT_TRUE(s_profiles.Step()); 2362 EXPECT_EQ("00000000-0000-0000-0000-000000000004", 2363 s_profiles.ColumnString(0)); 2364 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(1)); 2365 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(2)); 2366 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3)); 2367 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(4)); 2368 EXPECT_EQ(ASCIIToUTF16("Texas"), s_profiles.ColumnString16(5)); 2369 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(6)); 2370 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7)); 2371 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(8)); 2372 EXPECT_EQ(1386046847, s_profiles.ColumnInt(9)); 2373 EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10)); 2374 2375 // That should be it. 2376 EXPECT_FALSE(s_profiles.Step()); 2377 2378 // Verify the phone number data as well. 2379 sql::Statement s_phones( 2380 connection.GetUniqueStatement( 2381 "SELECT guid, number FROM autofill_profile_phones")); 2382 2383 ASSERT_TRUE(s_phones.Step()); 2384 EXPECT_EQ("00000000-0000-0000-0000-000000000001", s_phones.ColumnString(0)); 2385 EXPECT_EQ(ASCIIToUTF16("1.800.555.1234"), s_phones.ColumnString16(1)); 2386 2387 ASSERT_TRUE(s_phones.Step()); 2388 EXPECT_EQ("00000000-0000-0000-0000-000000000001", s_phones.ColumnString(0)); 2389 EXPECT_EQ(ASCIIToUTF16("+1 (800) 555-4321"), s_phones.ColumnString16(1)); 2390 2391 ASSERT_TRUE(s_phones.Step()); 2392 EXPECT_EQ("00000000-0000-0000-0000-000000000002", s_phones.ColumnString(0)); 2393 EXPECT_EQ(base::string16(), s_phones.ColumnString16(1)); 2394 2395 ASSERT_TRUE(s_phones.Step()); 2396 EXPECT_EQ("00000000-0000-0000-0000-000000000003", s_phones.ColumnString(0)); 2397 EXPECT_EQ(ASCIIToUTF16("6505557890"), s_phones.ColumnString16(1)); 2398 2399 ASSERT_TRUE(s_phones.Step()); 2400 EXPECT_EQ("00000000-0000-0000-0000-000000000004", s_phones.ColumnString(0)); 2401 EXPECT_EQ(base::string16(), s_phones.ColumnString16(1)); 2402 2403 EXPECT_FALSE(s_phones.Step()); 2404 } 2405 } 2406 2407 // Tests that migrating from version 54 to version 55 drops the autofill_dates 2408 // table, and merges the appropriate dates into the autofill table. 2409 TEST_F(WebDatabaseMigrationTest, MigrateVersion54ToCurrent) { 2410 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_54.sql"))); 2411 2412 // Verify pre-conditions. These are expectations for version 54 of the 2413 // database. 2414 { 2415 sql::Connection connection; 2416 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2417 2418 EXPECT_TRUE(connection.DoesTableExist("autofill_dates")); 2419 EXPECT_FALSE(connection.DoesColumnExist("autofill", "date_created")); 2420 EXPECT_FALSE(connection.DoesColumnExist("autofill", "date_last_used")); 2421 2422 // Verify the incoming data. 2423 sql::Statement s_autofill(connection.GetUniqueStatement( 2424 "SELECT name, value, value_lower, pair_id, count FROM autofill")); 2425 sql::Statement s_dates(connection.GetUniqueStatement( 2426 "SELECT pair_id, date_created FROM autofill_dates")); 2427 2428 // An entry with one timestamp. 2429 ASSERT_TRUE(s_autofill.Step()); 2430 EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0)); 2431 EXPECT_EQ(ASCIIToUTF16("John Doe"), s_autofill.ColumnString16(1)); 2432 EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2)); 2433 EXPECT_EQ(10, s_autofill.ColumnInt(3)); 2434 EXPECT_EQ(1, s_autofill.ColumnInt(4)); 2435 ASSERT_TRUE(s_dates.Step()); 2436 EXPECT_EQ(10, s_dates.ColumnInt(0)); 2437 EXPECT_EQ(1384299100, s_dates.ColumnInt64(1)); 2438 2439 // Another entry with one timestamp, differing from the previous one in case 2440 // only. 2441 ASSERT_TRUE(s_autofill.Step()); 2442 EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0)); 2443 EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(1)); 2444 EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2)); 2445 EXPECT_EQ(11, s_autofill.ColumnInt(3)); 2446 EXPECT_EQ(1, s_autofill.ColumnInt(4)); 2447 ASSERT_TRUE(s_dates.Step()); 2448 EXPECT_EQ(11, s_dates.ColumnInt(0)); 2449 EXPECT_EQ(1384299200, s_dates.ColumnInt64(1)); 2450 2451 // An entry with two timestamps (with count > 2; this is realistic). 2452 ASSERT_TRUE(s_autofill.Step()); 2453 EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0)); 2454 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s_autofill.ColumnString16(1)); 2455 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s_autofill.ColumnString16(2)); 2456 EXPECT_EQ(20, s_autofill.ColumnInt(3)); 2457 EXPECT_EQ(3, s_autofill.ColumnInt(4)); 2458 ASSERT_TRUE(s_dates.Step()); 2459 EXPECT_EQ(20, s_dates.ColumnInt(0)); 2460 EXPECT_EQ(1384299300, s_dates.ColumnInt64(1)); 2461 ASSERT_TRUE(s_dates.Step()); 2462 EXPECT_EQ(20, s_dates.ColumnInt(0)); 2463 EXPECT_EQ(1384299301, s_dates.ColumnInt64(1)); 2464 2465 // An entry with more than two timestamps, which are stored out of order. 2466 ASSERT_TRUE(s_autofill.Step()); 2467 EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0)); 2468 EXPECT_EQ(ASCIIToUTF16("jane.doe (at) example.org"), 2469 s_autofill.ColumnString16(1)); 2470 EXPECT_EQ(ASCIIToUTF16("jane.doe (at) example.org"), 2471 s_autofill.ColumnString16(2)); 2472 EXPECT_EQ(21, s_autofill.ColumnInt(3)); 2473 EXPECT_EQ(4, s_autofill.ColumnInt(4)); 2474 ASSERT_TRUE(s_dates.Step()); 2475 EXPECT_EQ(21, s_dates.ColumnInt(0)); 2476 EXPECT_EQ(1384299401, s_dates.ColumnInt64(1)); 2477 ASSERT_TRUE(s_dates.Step()); 2478 EXPECT_EQ(21, s_dates.ColumnInt(0)); 2479 EXPECT_EQ(1384299400, s_dates.ColumnInt64(1)); 2480 ASSERT_TRUE(s_dates.Step()); 2481 EXPECT_EQ(21, s_dates.ColumnInt(0)); 2482 EXPECT_EQ(1384299403, s_dates.ColumnInt64(1)); 2483 ASSERT_TRUE(s_dates.Step()); 2484 EXPECT_EQ(21, s_dates.ColumnInt(0)); 2485 EXPECT_EQ(1384299402, s_dates.ColumnInt64(1)); 2486 2487 // No more entries expected. 2488 ASSERT_FALSE(s_autofill.Step()); 2489 ASSERT_FALSE(s_dates.Step()); 2490 } 2491 2492 DoMigration(); 2493 2494 // Verify post-conditions. These are expectations for current version of the 2495 // database. 2496 { 2497 sql::Connection connection; 2498 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2499 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2500 2501 // Check version. 2502 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2503 2504 // The autofill_dates table should have been dropped, and its columns should 2505 // have been migrated to the autofill table. 2506 EXPECT_FALSE(connection.DoesTableExist("autofill_dates")); 2507 EXPECT_TRUE(connection.DoesColumnExist("autofill", "date_created")); 2508 EXPECT_TRUE(connection.DoesColumnExist("autofill", "date_last_used")); 2509 2510 // Data should have been preserved. Note that it appears out of order 2511 // relative to the previous table, as it's been alphabetized. That's ok. 2512 sql::Statement s( 2513 connection.GetUniqueStatement( 2514 "SELECT name, value, value_lower, date_created, date_last_used," 2515 " count " 2516 "FROM autofill " 2517 "ORDER BY name, value ASC")); 2518 2519 // "jane.doe (at) example.org": Timestamps should be parsed correctly, and only 2520 // the first and last should be kept. 2521 ASSERT_TRUE(s.Step()); 2522 EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0)); 2523 EXPECT_EQ(ASCIIToUTF16("jane.doe (at) example.org"), s.ColumnString16(1)); 2524 EXPECT_EQ(ASCIIToUTF16("jane.doe (at) example.org"), s.ColumnString16(2)); 2525 EXPECT_EQ(1384299400, s.ColumnInt64(3)); 2526 EXPECT_EQ(1384299403, s.ColumnInt64(4)); 2527 EXPECT_EQ(4, s.ColumnInt(5)); 2528 2529 // "jane (at) example.com": Timestamps should be parsed correctly. 2530 ASSERT_TRUE(s.Step()); 2531 EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0)); 2532 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s.ColumnString16(1)); 2533 EXPECT_EQ(ASCIIToUTF16("jane (at) example.com"), s.ColumnString16(2)); 2534 EXPECT_EQ(1384299300, s.ColumnInt64(3)); 2535 EXPECT_EQ(1384299301, s.ColumnInt64(4)); 2536 EXPECT_EQ(3, s.ColumnInt(5)); 2537 2538 // "John Doe": The single timestamp should be assigned as both the creation 2539 // and the last use timestamp. 2540 ASSERT_TRUE(s.Step()); 2541 EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0)); 2542 EXPECT_EQ(ASCIIToUTF16("John Doe"), s.ColumnString16(1)); 2543 EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2)); 2544 EXPECT_EQ(1384299100, s.ColumnInt64(3)); 2545 EXPECT_EQ(1384299100, s.ColumnInt64(4)); 2546 EXPECT_EQ(1, s.ColumnInt(5)); 2547 2548 // "john doe": Should not be merged with "John Doe" (case-sensitivity). 2549 ASSERT_TRUE(s.Step()); 2550 EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0)); 2551 EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(1)); 2552 EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2)); 2553 EXPECT_EQ(1384299200, s.ColumnInt64(3)); 2554 EXPECT_EQ(1384299200, s.ColumnInt64(4)); 2555 EXPECT_EQ(1, s.ColumnInt(5)); 2556 2557 // No more entries expected. 2558 ASSERT_FALSE(s.Step()); 2559 } 2560 } 2561 2562 // Tests that migrating from version 55 to version 56 adds the language_code 2563 // column to autofill_profiles table. 2564 TEST_F(WebDatabaseMigrationTest, MigrateVersion55ToCurrent) { 2565 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_55.sql"))); 2566 2567 // Verify pre-conditions. These are expectations for version 55 of the 2568 // database. 2569 { 2570 sql::Connection connection; 2571 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2572 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2573 2574 EXPECT_FALSE( 2575 connection.DoesColumnExist("autofill_profiles", "language_code")); 2576 } 2577 2578 DoMigration(); 2579 2580 // Verify post-conditions. These are expectations for current version of the 2581 // database. 2582 { 2583 sql::Connection connection; 2584 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2585 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2586 2587 // Check version. 2588 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2589 2590 // The language_code column should have been added to autofill_profiles 2591 // table. 2592 EXPECT_TRUE( 2593 connection.DoesColumnExist("autofill_profiles", "language_code")); 2594 2595 // Data should have been preserved. Language code should have been set to 2596 // empty string. 2597 sql::Statement s_profiles( 2598 connection.GetUniqueStatement( 2599 "SELECT guid, company_name, street_address, dependent_locality," 2600 " city, state, zipcode, sorting_code, country_code, date_modified," 2601 " origin, language_code " 2602 "FROM autofill_profiles")); 2603 2604 ASSERT_TRUE(s_profiles.Step()); 2605 EXPECT_EQ("00000000-0000-0000-0000-000000000001", 2606 s_profiles.ColumnString(0)); 2607 EXPECT_EQ(ASCIIToUTF16("Google Inc"), s_profiles.ColumnString16(1)); 2608 EXPECT_EQ(ASCIIToUTF16("340 Main St"), 2609 s_profiles.ColumnString16(2)); 2610 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3)); 2611 EXPECT_EQ(ASCIIToUTF16("Los Angeles"), s_profiles.ColumnString16(4)); 2612 EXPECT_EQ(ASCIIToUTF16("CA"), s_profiles.ColumnString16(5)); 2613 EXPECT_EQ(ASCIIToUTF16("90291"), s_profiles.ColumnString16(6)); 2614 EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7)); 2615 EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8)); 2616 EXPECT_EQ(1395948829, s_profiles.ColumnInt(9)); 2617 EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10)); 2618 EXPECT_EQ(std::string(), s_profiles.ColumnString(11)); 2619 2620 // No more entries expected. 2621 ASSERT_FALSE(s_profiles.Step()); 2622 } 2623 } 2624 2625 // Tests that migrating from version 56 to version 57 adds the full_name 2626 // column to autofill_profile_names table. 2627 TEST_F(WebDatabaseMigrationTest, MigrateVersion56ToCurrent) { 2628 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_56.sql"))); 2629 2630 // Verify pre-conditions. These are expectations for version 56 of the 2631 // database. 2632 { 2633 sql::Connection connection; 2634 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2635 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2636 2637 EXPECT_FALSE( 2638 connection.DoesColumnExist("autofill_profile_names", "full_name")); 2639 2640 // Verify the starting data. 2641 sql::Statement s_names( 2642 connection.GetUniqueStatement( 2643 "SELECT guid, first_name, middle_name, last_name " 2644 "FROM autofill_profile_names")); 2645 ASSERT_TRUE(s_names.Step()); 2646 EXPECT_EQ("B41FE6E0-B13E-2A2A-BF0B-29FCE2C3ADBD", s_names.ColumnString(0)); 2647 EXPECT_EQ(ASCIIToUTF16("Jon"), s_names.ColumnString16(1)); 2648 EXPECT_EQ(base::string16(), s_names.ColumnString16(2)); 2649 EXPECT_EQ(ASCIIToUTF16("Smith"), s_names.ColumnString16(3)); 2650 } 2651 2652 DoMigration(); 2653 2654 // Verify post-conditions. These are expectations for current version of the 2655 // database. 2656 { 2657 sql::Connection connection; 2658 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2659 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2660 2661 // Check version. 2662 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2663 2664 // The full_name column should have been added to autofill_profile_names 2665 // table. 2666 EXPECT_TRUE( 2667 connection.DoesColumnExist("autofill_profile_names", "full_name")); 2668 2669 // Data should have been preserved. Full name should have been set to the 2670 // empty string. 2671 sql::Statement s_names( 2672 connection.GetUniqueStatement( 2673 "SELECT guid, first_name, middle_name, last_name, full_name " 2674 "FROM autofill_profile_names")); 2675 2676 ASSERT_TRUE(s_names.Step()); 2677 EXPECT_EQ("B41FE6E0-B13E-2A2A-BF0B-29FCE2C3ADBD", s_names.ColumnString(0)); 2678 EXPECT_EQ(ASCIIToUTF16("Jon"), s_names.ColumnString16(1)); 2679 EXPECT_EQ(base::string16(), s_names.ColumnString16(2)); 2680 EXPECT_EQ(ASCIIToUTF16("Smith"), s_names.ColumnString16(3)); 2681 EXPECT_EQ(base::string16(), s_names.ColumnString16(4)); 2682 2683 // No more entries expected. 2684 ASSERT_FALSE(s_names.Step()); 2685 } 2686 } 2687 2688 // Tests that migrating from version 57 to version 58 drops the web_intents and 2689 // web_apps tables. 2690 TEST_F(WebDatabaseMigrationTest, MigrateVersion57ToCurrent) { 2691 ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_57.sql"))); 2692 2693 // Verify pre-conditions. These are expectations for version 57 of the 2694 // database. 2695 { 2696 sql::Connection connection; 2697 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2698 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2699 2700 EXPECT_TRUE(connection.DoesTableExist("web_apps")); 2701 EXPECT_TRUE(connection.DoesTableExist("web_app_icons")); 2702 EXPECT_TRUE(connection.DoesTableExist("web_intents")); 2703 EXPECT_TRUE(connection.DoesTableExist("web_intents_defaults")); 2704 } 2705 2706 DoMigration(); 2707 2708 // Verify post-conditions. These are expectations for current version of the 2709 // database. 2710 { 2711 sql::Connection connection; 2712 ASSERT_TRUE(connection.Open(GetDatabasePath())); 2713 ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); 2714 2715 // Check version. 2716 EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); 2717 2718 EXPECT_FALSE(connection.DoesTableExist("web_apps")); 2719 EXPECT_FALSE(connection.DoesTableExist("web_app_icons")); 2720 EXPECT_FALSE(connection.DoesTableExist("web_intents")); 2721 EXPECT_FALSE(connection.DoesTableExist("web_intents_defaults")); 2722 } 2723 } 2724