web_database_migration_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/guid.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/path_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/keyword_table.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/logins_table.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/token_service_table.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/web_apps_table.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_intents_table.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfile;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillTable;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::CreditCard;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutofillProfile31FromStatement(const sql::Statement& s,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AutofillProfile* profile,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    base::string16* label,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int* unique_id,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64* date_modified) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(label);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(unique_id);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *label = s.ColumnString16(0);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *unique_id = s.ColumnInt(1);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_FIRST, s.ColumnString16(2));
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_MIDDLE, s.ColumnString16(3));
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_LAST, s.ColumnString16(4));
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::EMAIL_ADDRESS, s.ColumnString16(5));
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(6));
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE1, s.ColumnString16(7));
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE2, s.ColumnString16(8));
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(9));
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(10));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(11));
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetInfo(
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::ADDRESS_HOME_COUNTRY, s.ColumnString16(12), "en-US");
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(13));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(15);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(s.ColumnString(16));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(profile->guid()));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutofillProfile33FromStatement(const sql::Statement& s,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AutofillProfile* profile,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64* date_modified) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(s.ColumnString(0));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(profile->guid()));
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(1));
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE1, s.ColumnString16(2));
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE2, s.ColumnString16(3));
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(4));
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(5));
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(6));
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetInfo(
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::ADDRESS_HOME_COUNTRY, s.ColumnString16(7), "en-US");
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(8);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreditCard31FromStatement(const sql::Statement& s,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CreditCard* credit_card,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              base::string16* label,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int* unique_id,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* encrypted_number,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64* date_modified) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_card);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(label);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(unique_id);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encrypted_number);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *label = s.ColumnString16(0);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *unique_id = s.ColumnInt(1);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(2));
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_TYPE, s.ColumnString16(3));
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(5));
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(6));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int encrypted_number_len = s.ColumnByteLength(10);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_number_len) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_number->resize(encrypted_number_len);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&(*encrypted_number)[0], s.ColumnBlob(10), encrypted_number_len);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(12);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(s.ColumnString(13));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(credit_card->guid()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreditCard32FromStatement(const sql::Statement& s,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               CreditCard* credit_card,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::string* encrypted_number,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int64* date_modified) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_card);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encrypted_number);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(s.ColumnString(0));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(credit_card->guid()));
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(1));
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(2));
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(3));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int encrypted_number_len = s.ColumnByteLength(4);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_number_len) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_number->resize(encrypted_number_len);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&(*encrypted_number)[0], s.ColumnBlob(4), encrypted_number_len);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(5);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckHasBackupData(sql::MetaTable* meta_table) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(meta_table->GetValue(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup", &value));
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(meta_table->GetValue(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup Signature", &value));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckNoBackupData(const sql::Connection& connection,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       sql::MetaTable* meta_table) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(meta_table->GetValue(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup", &value));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(meta_table->GetValue(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup Signature", &value));
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection.DoesTableExist("keywords_backup"));
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The WebDatabaseMigrationTest encapsulates testing of database migrations.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically, these tests are intended to exercise any schema changes in
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the WebDatabase and data migrations that occur in
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |WebDatabase::MigrateOldVersionsAsNeeded()|.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDatabaseMigrationTest : public testing::Test {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebDatabaseMigrationTest() {}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDatabaseMigrationTest() {}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the database via the WebDatabase class and migrate the database to
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current version.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoMigration() {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(joi): This whole unit test file needs to stay in //chrome
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // for now, as it needs to know about all the different table
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // types. Once all webdata datatypes have been componentized, this
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // could move to components_unittests.
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillTable autofill_table("en-US");
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeywordTable keyword_table;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoginsTable logins_table;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TokenServiceTable token_service_table;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebAppsTable web_apps_table;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebIntentsTable web_intents_table;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebDatabase db;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&autofill_table);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&keyword_table);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&logins_table);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&token_service_table);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&web_apps_table);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&web_intents_table);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This causes the migration to occur.
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath()));
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current tested version number.  When adding a migration in
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |WebDatabase::MigrateOldVersionsAsNeeded()| and changing the version number
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |kCurrentVersionNumber| this value should change to reflect the new version
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number and a new migration test added below.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kCurrentTestedVersionNumber;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath GetDatabasePath() {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType kWebDatabaseFilename[] =
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("TestWebDatabase.sqlite3");
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return temp_dir_.path().Append(base::FilePath(kWebDatabaseFilename));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The textual contents of |file| are read from
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // "components/test/data/web_database" and returned in the string |contents|.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the file exists and is read successfully, false otherwise.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetWebDatabaseData(const base::FilePath& file, std::string* contents) {
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::FilePath source_path;
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PathService::Get(base::DIR_SOURCE_ROOT, &source_path);
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("components");
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("test");
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("data");
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("web_database");
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.Append(file);
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return base::PathExists(source_path) &&
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        file_util::ReadFileToString(source_path, contents);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int VersionFromConnection(sql::Connection* connection) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get version.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection->GetUniqueStatement(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT value FROM meta WHERE key='version'"));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s.Step())
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return s.ColumnInt(0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sql files located in "chrome/test/data/web_database" were generated by
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launching the Chromium application prior to schema change, then using the
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sqlite3 command-line application to dump the contents of the "Web Data"
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Like this:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   > .output version_nn.sql
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   > .dump
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadDatabase(const base::FilePath::StringType& file);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 51;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDatabaseMigrationTest::LoadDatabase(
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::StringType& file) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(GetWebDatabaseData(base::FilePath(file), &contents));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Connection connection;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(connection.Open(GetDatabasePath()));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(connection.Execute(contents.data()));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the all migrations from an empty database succeed.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateEmptyToCurrent) {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that expected tables are present.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill"));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill_dates"));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill_profiles"));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("credit_cards"));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords"));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The logins table is obsolete. (We used to store saved passwords here.)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("logins"));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("meta"));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("token_service"));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_app_icons"));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_apps"));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_intents"));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_intents_defaults"));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |credit_card| table gets added to the schema for a version 22
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion22ToCurrent) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |credit_card| table.  Version 22 of the schema.  Contrast this with the
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corrupt version below.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_22.sql")));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No |credit_card| table prior to version 23.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "guid"));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |credit_card| table now exists.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |credit_card| table gets added to the schema for a corrupt
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version 22 database.  The corruption is that the |credit_cards| table exists
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but the schema version number was not set correctly to 23 or later.  This
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test exercises code introduced to fix bug http://crbug.com/50699 that
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resulted from the corruption.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion22CorruptedToCurrent) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build after the addition of the |credit_card|
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // table.  Due to a bug in the migration logic the version is set incorrectly
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to 22 (it should have been updated to 23 at least).
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_22_corrupt.sql")));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for corrupt version 22 of
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the database.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before version 25.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id"));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |created_by_policy| column gets added to the schema
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a version 25 database.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion25ToCurrent) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |created_by_policy| column.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_25.sql")));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 25 of the
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |created_by_policy| column should have been added.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy"));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the credit_cards.billing_address column is changed from a string
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an int whilst preserving the associated billing address. This version of
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test makes sure a stored label is converted to an ID.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringLabels) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the change of column type for
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credit_cards.billing_address from string to int.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql")));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 26 of the
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "INSERT INTO autofill_profiles"
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, first_name, middle_name, last_name, email,"
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " company_name, address_line_1, address_line_2, city, state, zipcode,"
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " country, phone, fax)"
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('Home',1,'','','','','','','','','','','','','')";
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Run());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert a CC linked to an existing address.
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt2 = "INSERT INTO credit_cards"
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, name_on_card, type, card_number,"
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expiration_month, expiration_year, verification_code, billing_address,"
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " shipping_address, card_number_encrypted, verification_code_encrypted)"
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','Home','','','')";
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str()));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Run());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |billing_address| is a string.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt3 = "SELECT billing_address FROM credit_cards";
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str()));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the credit card data is converted.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT guid, name_on_card, expiration_month, expiration_year, "
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "card_number_encrypted, date_modified "
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "FROM credit_cards"));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Jack", s.ColumnString(1));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s.ColumnInt(2));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2012, s.ColumnInt(3));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 5 is encrypted number blob.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 6 is date_modified.
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the credit_cards.billing_address column is changed from a string
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an int whilst preserving the associated billing address. This version of
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test makes sure a stored string ID is converted to an integer ID.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringIDs) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the change of column type for
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credit_cards.billing_address from string to int.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql")));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 26 of the
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "INSERT INTO autofill_profiles"
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, first_name, middle_name, last_name, email,"
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " company_name, address_line_1, address_line_2, city, state, zipcode,"
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " country, phone, fax)"
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('Home',1,'','','','','','','','','','','','','')";
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Run());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert a CC linked to an existing address.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt2 = "INSERT INTO credit_cards"
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, name_on_card, type, card_number,"
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expiration_month, expiration_year, verification_code, billing_address,"
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " shipping_address, card_number_encrypted, verification_code_encrypted)"
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','1','','','')";
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str()));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Run());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |billing_address| is a string.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt3 = "SELECT billing_address FROM credit_cards";
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str()));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |created_by_policy| column should have been added.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy"));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the credit card data is converted.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT guid, name_on_card, expiration_month, expiration_year, "
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "card_number_encrypted, date_modified "
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "FROM credit_cards"));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Jack", s.ColumnString(1));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s.ColumnInt(2));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2012, s.ColumnInt(3));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 5 is encrypted credit card number blo b.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 6 is date_modified.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure instant_url is added correctly to keywords.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion27ToCurrent) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_27.sql")));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 27 of the
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "instant_url"));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure supports_instant (added in Version 28) was ultimately dropped
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // again and instant_url was added.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords", "supports_instant"));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "instant_url"));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that instant_url is empty.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "SELECT instant_url FROM keywords";
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s.ColumnString(0));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the data made it over.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stmt = "SELECT " + KeywordTable::GetKeywordColumns() + " FROM keywords";
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt.c_str()));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s2.ColumnInt(0));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Google", s2.ColumnString(1));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("google.com", s2.ColumnString(2));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://www.google.com/favicon.ico", s2.ColumnString(3));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"\
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}"\
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "&q={searchTerms}",
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s2.ColumnString(4));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s2.ColumnBool(5));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(6));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(7));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(8));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string("UTF-8"), s2.ColumnString(9));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s2.ColumnBool(10));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string("{google:baseSuggestURL}search?client=chrome&hl="
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "{language}&q={searchTerms}"), s2.ColumnString(11));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, s2.ColumnInt(12));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //EXPECT_EQ(false, s2.ColumnBool(13));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(14));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(15));
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(16));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure date_modified is added correctly to autofill_profiles and
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// credit_cards.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion29ToCurrent) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_29.sql")));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 29 of the
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "date_modified"));
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "date_modified"));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_creation_time = Time::Now();
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_creation_time = Time::Now();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the columns were created.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s_profiles(connection.GetUniqueStatement(
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT date_modified FROM autofill_profiles "));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s_profiles.is_valid());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s_profiles.Step()) {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GE(s_profiles.ColumnInt64(0),
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_creation_time.ToTimeT());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(s_profiles.ColumnInt64(0),
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_creation_time.ToTimeT());
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s_profiles.Succeeded());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s_credit_cards(connection.GetUniqueStatement(
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT date_modified FROM credit_cards "));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s_credit_cards.is_valid());
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s_credit_cards.Step()) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GE(s_credit_cards.ColumnInt64(0),
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_creation_time.ToTimeT());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(s_credit_cards.ColumnInt64(0),
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_creation_time.ToTimeT());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s_credit_cards.Succeeded());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure guids are added to autofill_profiles and credit_cards tables.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion30ToCurrent) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_30.sql")));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 29 of the
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "guid"));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "guid"));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that guids are non-null, non-empty, conforms to guid format, and
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are different.
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid FROM autofill_profiles"));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string guid1 = s.ColumnString(0);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::IsValidGUID(guid1));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string guid2 = s.ColumnString(0);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::IsValidGUID(guid2));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(guid1, guid2);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Removes unique IDs and make GUIDs the primary key.  Also removes unused
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// columns.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion31ToCurrent) {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_31.sql")));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 30 of the
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile profile;
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 profile_label;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int profile_unique_id = 0;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 profile_date_modified = 0;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard credit_card;
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 cc_label;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cc_unique_id = 0;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cc_number_encrypted;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 cc_date_modified = 0;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "unique_id"));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "type"));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "card_number"));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "verification_code"));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "shipping_address"));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "verification_code_encrypted"));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fetch data in the database prior to migration.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT label, unique_id, first_name, middle_name, last_name, "
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "email, company_name, address_line_1, address_line_2, city, state, "
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "zipcode, country, phone, fax, date_modified, guid "
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(AutofillProfile31FromStatement(
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s1, &profile, &profile_label, &profile_unique_id,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &profile_date_modified));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT label, unique_id, name_on_card, type, card_number, "
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "expiration_month, expiration_year, verification_code, "
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "billing_address, shipping_address, card_number_encrypted, "
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "verification_code_encrypted, date_modified, guid "
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM credit_cards"));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CreditCard31FromStatement(s2,
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &credit_card,
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_label,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_unique_id,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_number_encrypted,
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_date_modified));
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(profile_unique_id, cc_unique_id);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(profile.guid(), credit_card.guid());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "unique_id"));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id"));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "type"));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "card_number"));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "verification_code"));
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "shipping_address"));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "verification_code_encrypted"));
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, company_name, address_line_1, address_line_2, "
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "city, state, zipcode, country, date_modified "
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfile profile_a;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 profile_date_modified_a = 0;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(AutofillProfile33FromStatement(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s1, &profile_a, &profile_date_modified_a));
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(profile.guid(), profile_a.guid());
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::COMPANY_NAME),
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::COMPANY_NAME));
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE1),
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE1));
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE2),
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE2));
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_CITY),
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_CITY));
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_STATE),
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_STATE));
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_ZIP),
827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_ZIP));
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY),
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY));
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(profile_date_modified, profile_date_modified_a);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, name_on_card, expiration_month, "
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "expiration_year, card_number_encrypted, date_modified "
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM credit_cards"));
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreditCard credit_card_a;
840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 cc_label_a;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string cc_number_encrypted_a;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 cc_date_modified_a = 0;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CreditCard32FromStatement(s2,
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &credit_card_a,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_number_encrypted_a,
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_date_modified_a));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(credit_card, credit_card_a);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_label, cc_label_a);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_number_encrypted, cc_number_encrypted_a);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_date_modified, cc_date_modified_a);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factor |autofill_profiles| address information separately from name, email,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and phone.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) {
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_32.sql")));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 32 of the
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "label"));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "first_name"));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "middle_name"));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "last_name"));
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "email"));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "company_name"));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_1"));
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_2"));
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city"));
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state"));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode"));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country"));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "phone"));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "fax"));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_names"));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_emails"));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_phones"));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "label"));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify changes to columns.
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "label"));
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "first_name"));
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "middle_name"));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "last_name"));
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "email"));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "company_name"));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_1"));
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_2"));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city"));
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state"));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode"));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country"));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "phone"));
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "fax"));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "names" table.
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", "guid"));
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "first_name"));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "middle_name"));
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "last_name"));
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "emails" table.
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "guid"));
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "email"));
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "phones" table.
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "guid"));
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "type"));
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones",
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "number"));
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "label"));
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, company_name, address_line_1, address_line_2, "
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "city, state, zipcode, country, date_modified "
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s1.ColumnString(0));
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe Enterprises"), s1.ColumnString16(1));
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1 Main St"), s1.ColumnString16(2));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Apt 1"), s1.ColumnString16(3));
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4));
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7));
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(8));
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets merged during migration from 35 to 37 due to multi-valued fields.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith.
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s1.ColumnString(0));
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("2 Main Street"), s1.ColumnString16(2));
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(3));
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5));
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6));
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(8));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith (Part 2).
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s1.ColumnString(0));
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("2 Main St"), s1.ColumnString16(2));
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(3));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4));
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5));
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6));
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(8));
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s1.ColumnString(0));
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("3 Main St"), s1.ColumnString16(2));
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(3));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4));
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(8));
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be all.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s1.Step());
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, first_name, middle_name, last_name "
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_names"));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1));
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.  Note same guid as above due to merging of multi-valued
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fields.
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0));
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("P."), s2.ColumnString16(2));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith.
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s2.ColumnString(0));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1));
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3));
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith (Part 2).
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s2.ColumnString(0));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1));
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s2.ColumnString(0));
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(1));
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(3));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s2.Step());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, email "
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_emails"));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s3.ColumnString(0));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john@doe.com"), s3.ColumnString16(1));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street.
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s3.ColumnString(0));
1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St.
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s3.ColumnString(0));
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s3.ColumnString(0));
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s3.Step());
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s4(
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, type, number "
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_phones"));
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe phone.
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s4.ColumnString(0));
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s4.ColumnInt(1));  // 0 means phone.
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("4151112222"), s4.ColumnString16(2));
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe fax.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe phone.
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe fax.
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street phone.
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s4.ColumnString(0));
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s4.ColumnInt(1));  // 0 means phone.
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(2));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street fax.
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St phone.
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s4.ColumnString(0));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s4.ColumnInt(1));  // 0 means phone.
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(2));
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St fax.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note no phone or fax for Alfred E Newman.
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St phone.
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s4.ColumnString(0));
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s4.ColumnInt(1));  // 0 means phone.
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(2));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St fax.
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s4.Step());
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds a column for the autofill profile's country code.
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion33ToCurrent) {
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_33.sql")));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 33 of the
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "country_code"));
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country value is the one we expect.
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT country FROM autofill_profiles"));
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country = s.ColumnString(0);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("United States", country);
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles",
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country code is properly converted.
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT country_code FROM autofill_profiles"));
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("US", country_code);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleans up bad country code "UK" in favor of good country code "GB".
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion34ToCurrent) {
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_34.sql")));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 34 of the
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country_code value is the one we expect.
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT country_code "
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "FROM autofill_profiles"));
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("UK", country_code);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have only one.
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s.Step());
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles",
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country_code code is properly converted.
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT country_code FROM autofill_profiles"));
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("GB", country_code);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have only one.
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s.Step());
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleans up invalid profiles based on more agressive merging.  Filters out
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// profiles that are subsets of other profiles, and profiles with invalid email,
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state, and incomplete address.
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion35ToCurrent) {
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_35.sql")));
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 34 of the
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profiles_trash"));
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that there are 6 profiles prior to merge.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid FROM autofill_profiles"));
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s.Step())
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++i;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(6, i);
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesTableExist("autofill_profiles_trash"));
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles_trash", "guid"));
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, company_name, address_line_1, address_line_2, "
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "city, state, zipcode, country, date_modified "
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s1.ColumnString(0));
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Acme Inc."), s1.ColumnString16(1));
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1 Main Street"), s1.ColumnString16(2));
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Apt 2"), s1.ColumnString16(3));
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("San Francisco"), s1.ColumnString16(4));
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5));
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94102"), s1.ColumnString16(6));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7));
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1300131704, s1.ColumnInt64(8));
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be it.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that there 5 trashed profile after the merge.
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid "
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "FROM autofill_profiles_trash"));
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002", s2.ColumnString(0));
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003", s2.ColumnString(0));
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004", s2.ColumnString(0));
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000005", s2.ColumnString(0));
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000006", s2.ColumnString(0));
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be it.
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |last_modified| column gets added to the schema for
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a version 37 database.
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion37ToCurrent) {
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |last_modified| column.
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_37.sql")));
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 37 of the
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "last_modified"));
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |last_modified| column should have been added.
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "last_modified"));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |sync_guid| column gets added to the schema for
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a version 38 database.
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion38ToCurrent) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |sync_guid| column.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_38.sql")));
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 38 of the
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "sync_guid"));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |sync_guid| column should have been added.
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "sync_guid"));
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that no backup data is added to a version 39 database.
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion39ToCurrent) {
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the default
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // search provider backup field to the meta table.
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_39.sql")));
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 39 of the
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 39, 39));
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion40ToCurrent) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_40.sql")));
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 40 of the
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 40, 40));
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion41ToCurrent) {
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_41.sql")));
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 41 of the
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 41, 41));
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion42ToCurrent) {
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_42.sql")));
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 42 of the
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 42, 42));
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("keywords_backup"));
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion43ToCurrent) {
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_43.sql")));
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 previous_default_search_provider_id;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 43 of the
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 43, 43));
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(default_search_provider_id, 0);
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    previous_default_search_provider_id = default_search_provider_id;
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords_backup"));
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default search provider ID should not change.
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(previous_default_search_provider_id, default_search_provider_id);
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |autogenerate_keyword| and |logo_id| columns get removed from
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the keyword table schema for a version 45 database.
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion44ToCurrent) {
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_44.sql")));
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 44 of the
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 44, 44));
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "autogenerate_keyword"));
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "logo_id"));
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should have removed this obsolete key.
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string default_search_provider_backup;
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(meta_table.GetValue("Default Search Provider Backup",
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &default_search_provider_backup));
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Two columns should have been removed.
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords",
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "autogenerate_keyword"));
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords", "logo_id"));
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Backup data should have been removed.
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the web_intents and web_intents_defaults tables are
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modified to include "scheme" columns.
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45ToCurrent) {
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_45.sql")));
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 45, 45));
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents"));
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist(
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "scheme", "web_intents_defaults"));
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new "scheme" column should have been added to each web_intents table.
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents", "scheme"));
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents_defaults", "scheme"));
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existing user data was copied.
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents"));
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://poodles.com/fuzzer", s1.ColumnString(0));
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("fuzz"), s1.ColumnString16(1));
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("poodle/*"), s1.ColumnString16(2));
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Poodle Fuzzer"), s1.ColumnString16(3));
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("window"), s1.ColumnString16(4));
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(5));
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we want to verify existing user data was copied
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents_defaults"));
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("fuzz", s2.ColumnString(0));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("poodle/*"), s2.ColumnString16(1));
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2));
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(3));
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(4));
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("http://poodles.com/fuzzer"), s2.ColumnString16(5));
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(6));
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // finally ensure the migration code cleaned up after itself
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents"));
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents_defaults"));
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the web_intents and web_intents_defaults tables are
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modified to include "scheme" columns.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45InvalidToCurrent) {
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_45_invalid.sql")));
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 45, 45));
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents"));
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist(
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "scheme", "web_intents_defaults"));
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new "scheme" column should have been added to each web_intents table.
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents", "scheme"));
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents_defaults", "scheme"));
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existing user data was copied.
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents"));
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());  // Basically should be empty at this point.
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we want to verify existing user data was copied
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents_defaults"));
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We were able to create the new tables, but unable to copy any data
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Given the initial bad state of the tables.
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Finally ensure the migration code cleaned up after itself.
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents"));
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents_defaults"));
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that current version is forced to compatible version before migration,
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if the former is smaller.
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45CompatibleToCurrent) {
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_45_compatible.sql")));
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Database is actually version 45 but the version field states 40.
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 40, 45));
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(45, VersionFromConnection(&connection));
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |alternate_urls| column is added to the keyword table schema
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a version 47 database.
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion46ToCurrent) {
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_46.sql")));
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 46 of the
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 46, 46));
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "alternate_urls"));
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords_backup",
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "alternate_urls"));
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new column should have been created.
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "alternate_urls"));
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion47ToCurrent) {
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_47.sql")));
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 47 of the
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 47, 47));
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 default_search_provider_id = 0;
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &default_search_provider_id));
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords_backup"));
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database.
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::Connection connection;
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check version.
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::MetaTable meta_table;
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                kCurrentTestedVersionNumber));
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 default_search_provider_id = 0;
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &default_search_provider_id));
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the |search_terms_replacement_key| column is added to the keyword
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// table schema for a version 49 database.
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion48ToCurrent) {
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_48.sql")));
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 48 of the
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database.
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::Connection connection;
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::MetaTable meta_table;
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 48, 48));
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            "search_terms_replacement_key"));
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new column should have been created.
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           "search_terms_replacement_key"));
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |origin| column is added to the autofill_profiles and
1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// credit_cards table schemas for a version 50 database.
1998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion49ToCurrent) {
1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_49.sql")));
2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 49 of the
2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // database.
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sql::Connection connection;
2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("autofill_profiles", "origin"));
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "origin"));
2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoMigration();
2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // database.
2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sql::Connection connection;
2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check version.
2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A new column should have been created in both tables.
2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "origin"));
2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "origin"));
2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2028