web_database_migration_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/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/web_apps_table.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_intents_table.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/signin/core/webdata/token_service_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;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutofillProfile31FromStatement(const sql::Statement& s,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AutofillProfile* profile,
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    base::string16* label,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int* unique_id,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64* date_modified) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(label);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(unique_id);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *label = s.ColumnString16(0);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *unique_id = s.ColumnInt(1);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_FIRST, s.ColumnString16(2));
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_MIDDLE, s.ColumnString16(3));
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_LAST, s.ColumnString16(4));
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::EMAIL_ADDRESS, s.ColumnString16(5));
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(6));
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE1, s.ColumnString16(7));
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE2, s.ColumnString16(8));
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(9));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(10));
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(11));
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetInfo(
643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY),
653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      s.ColumnString16(12), "en-US");
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(13));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(15);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(s.ColumnString(16));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(profile->guid()));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutofillProfile33FromStatement(const sql::Statement& s,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AutofillProfile* profile,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64* date_modified) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(s.ColumnString(0));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(profile->guid()));
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(1));
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STREET_ADDRESS,
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      s.ColumnString16(2));
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(3));
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(4));
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(5));
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetInfo(
863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY),
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      s.ColumnString16(6), "en-US");
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  *date_modified = s.ColumnInt64(7);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreditCard31FromStatement(const sql::Statement& s,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CreditCard* credit_card,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              base::string16* label,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int* unique_id,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* encrypted_number,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64* date_modified) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_card);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(label);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(unique_id);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encrypted_number);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *label = s.ColumnString16(0);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *unique_id = s.ColumnInt(1);
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(2));
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_TYPE, s.ColumnString16(3));
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(5));
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(6));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int encrypted_number_len = s.ColumnByteLength(10);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_number_len) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_number->resize(encrypted_number_len);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&(*encrypted_number)[0], s.ColumnBlob(10), encrypted_number_len);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(12);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(s.ColumnString(13));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(credit_card->guid()));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreditCard32FromStatement(const sql::Statement& s,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               CreditCard* credit_card,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::string* encrypted_number,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int64* date_modified) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_card);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encrypted_number);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(s.ColumnString(0));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(credit_card->guid()));
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(1));
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(2));
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(3));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int encrypted_number_len = s.ColumnByteLength(4);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_number_len) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_number->resize(encrypted_number_len);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&(*encrypted_number)[0], s.ColumnBlob(4), encrypted_number_len);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(5);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckHasBackupData(sql::MetaTable* meta_table) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(meta_table->GetValue(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup", &value));
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(meta_table->GetValue(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup Signature", &value));
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckNoBackupData(const sql::Connection& connection,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       sql::MetaTable* meta_table) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(meta_table->GetValue(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup", &value));
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(meta_table->GetValue(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup Signature", &value));
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection.DoesTableExist("keywords_backup"));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The WebDatabaseMigrationTest encapsulates testing of database migrations.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically, these tests are intended to exercise any schema changes in
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the WebDatabase and data migrations that occur in
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |WebDatabase::MigrateOldVersionsAsNeeded()|.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDatabaseMigrationTest : public testing::Test {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebDatabaseMigrationTest() {}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDatabaseMigrationTest() {}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the database via the WebDatabase class and migrate the database to
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current version.
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoMigration() {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(joi): This whole unit test file needs to stay in //chrome
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // for now, as it needs to know about all the different table
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // types. Once all webdata datatypes have been componentized, this
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // could move to components_unittests.
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillTable autofill_table("en-US");
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeywordTable keyword_table;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoginsTable logins_table;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TokenServiceTable token_service_table;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebAppsTable web_apps_table;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebIntentsTable web_intents_table;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebDatabase db;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&autofill_table);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&keyword_table);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&logins_table);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&token_service_table);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&web_apps_table);
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&web_intents_table);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This causes the migration to occur.
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath()));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current tested version number.  When adding a migration in
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |WebDatabase::MigrateOldVersionsAsNeeded()| and changing the version number
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |kCurrentVersionNumber| this value should change to reflect the new version
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number and a new migration test added below.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kCurrentTestedVersionNumber;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath GetDatabasePath() {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType kWebDatabaseFilename[] =
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("TestWebDatabase.sqlite3");
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return temp_dir_.path().Append(base::FilePath(kWebDatabaseFilename));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The textual contents of |file| are read from
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // "components/test/data/web_database" and returned in the string |contents|.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the file exists and is read successfully, false otherwise.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetWebDatabaseData(const base::FilePath& file, std::string* contents) {
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::FilePath source_path;
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PathService::Get(base::DIR_SOURCE_ROOT, &source_path);
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("components");
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("test");
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("data");
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("web_database");
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.Append(file);
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return base::PathExists(source_path) &&
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::ReadFileToString(source_path, contents);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int VersionFromConnection(sql::Connection* connection) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get version.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection->GetUniqueStatement(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT value FROM meta WHERE key='version'"));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s.Step())
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return s.ColumnInt(0);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sql files located in "chrome/test/data/web_database" were generated by
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launching the Chromium application prior to schema change, then using the
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sqlite3 command-line application to dump the contents of the "Web Data"
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Like this:
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   > .output version_nn.sql
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   > .dump
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadDatabase(const base::FilePath::StringType& file);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 55;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDatabaseMigrationTest::LoadDatabase(
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::StringType& file) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(GetWebDatabaseData(base::FilePath(file), &contents));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Connection connection;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(connection.Open(GetDatabasePath()));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(connection.Execute(contents.data()));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the all migrations from an empty database succeed.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateEmptyToCurrent) {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that expected tables are present.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill"));
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The autofill_dates table is obsolete. (It's been merged into the autofill
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // table.)
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_dates"));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill_profiles"));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("credit_cards"));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords"));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The logins table is obsolete. (We used to store saved passwords here.)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("logins"));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("meta"));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("token_service"));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_app_icons"));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_apps"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_intents"));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_intents_defaults"));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that rows with empty values get removed from the autofill tables.
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion21ToCurrent) {
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_21.sql")));
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify pre-conditions.
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Both empty and non-empty values are allowed in a version 21 database.
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_autofill(connection.GetUniqueStatement(
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT name, value, value_lower, pair_id, count FROM autofill"));
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_dates(connection.GetUniqueStatement(
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT pair_id, date_created FROM autofill_dates"));
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with a non-empty value.
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s_autofill.ColumnString16(1));
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2));
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_autofill.ColumnInt(3));
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_dates.ColumnInt(0));
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s_dates.ColumnInt64(1));
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with an empty value.
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(1));
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(2));
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_autofill.ColumnInt(3));
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_dates.ColumnInt(0));
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s_dates.ColumnInt64(1));
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Another entry with a non-empty value.
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(1));
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(2));
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_autofill.ColumnInt(3));
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s_autofill.ColumnInt(4));
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s_dates.ColumnInt64(1));
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s_dates.ColumnInt64(1));
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Another entry with an empty value.
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(1));
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(2));
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_autofill.ColumnInt(3));
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4, s_autofill.ColumnInt(4));
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299401, s_dates.ColumnInt64(1));
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299400, s_dates.ColumnInt64(1));
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299403, s_dates.ColumnInt64(1));
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299402, s_dates.ColumnInt64(1));
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_autofill.Step());
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_dates.Step());
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoMigration();
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // database.
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Check version.
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Entries with empty values should have been dropped.  The remaining
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // entries should have been preserved.
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s(
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        connection.GetUniqueStatement(
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "SELECT name, value, value_lower, date_created, date_last_used,"
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            " count "
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "FROM autofill "
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "ORDER BY name, value ASC"));
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "jane@example.com"
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0));
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(1));
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(2));
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s.ColumnInt64(3));
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s.ColumnInt64(4));
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s.ColumnInt(5));
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "John Doe"
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0));
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s.ColumnString16(1));
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2));
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(3));
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(4));
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s.ColumnInt(5));
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s.Step());
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |credit_card| table gets added to the schema for a version 22
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion22ToCurrent) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |credit_card| table.  Version 22 of the schema.  Contrast this with the
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corrupt version below.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_22.sql")));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No |credit_card| table prior to version 23.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "guid"));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |credit_card| table now exists.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |credit_card| table gets added to the schema for a corrupt
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version 22 database.  The corruption is that the |credit_cards| table exists
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but the schema version number was not set correctly to 23 or later.  This
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test exercises code introduced to fix bug http://crbug.com/50699 that
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resulted from the corruption.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion22CorruptedToCurrent) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build after the addition of the |credit_card|
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // table.  Due to a bug in the migration logic the version is set incorrectly
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to 22 (it should have been updated to 23 at least).
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_22_corrupt.sql")));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for corrupt version 22 of
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the database.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before version 25.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id"));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |created_by_policy| column gets added to the schema
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a version 25 database.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion25ToCurrent) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |created_by_policy| column.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_25.sql")));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 25 of the
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |created_by_policy| column should have been added.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy"));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the credit_cards.billing_address column is changed from a string
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an int whilst preserving the associated billing address. This version of
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test makes sure a stored label is converted to an ID.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringLabels) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the change of column type for
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credit_cards.billing_address from string to int.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql")));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 26 of the
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "INSERT INTO autofill_profiles"
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, first_name, middle_name, last_name, email,"
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " company_name, address_line_1, address_line_2, city, state, zipcode,"
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " country, phone, fax)"
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('Home',1,'','','','','','','','','','','','','')";
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Run());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert a CC linked to an existing address.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt2 = "INSERT INTO credit_cards"
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, name_on_card, type, card_number,"
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expiration_month, expiration_year, verification_code, billing_address,"
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " shipping_address, card_number_encrypted, verification_code_encrypted)"
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','Home','','','')";
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str()));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Run());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |billing_address| is a string.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt3 = "SELECT billing_address FROM credit_cards";
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str()));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the credit card data is converted.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT guid, name_on_card, expiration_month, expiration_year, "
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "card_number_encrypted, date_modified "
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "FROM credit_cards"));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Jack", s.ColumnString(1));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s.ColumnInt(2));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2012, s.ColumnInt(3));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 5 is encrypted number blob.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 6 is date_modified.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the credit_cards.billing_address column is changed from a string
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an int whilst preserving the associated billing address. This version of
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test makes sure a stored string ID is converted to an integer ID.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringIDs) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the change of column type for
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credit_cards.billing_address from string to int.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql")));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 26 of the
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "INSERT INTO autofill_profiles"
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, first_name, middle_name, last_name, email,"
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " company_name, address_line_1, address_line_2, city, state, zipcode,"
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " country, phone, fax)"
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('Home',1,'','','','','','','','','','','','','')";
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Run());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert a CC linked to an existing address.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt2 = "INSERT INTO credit_cards"
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, name_on_card, type, card_number,"
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expiration_month, expiration_year, verification_code, billing_address,"
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " shipping_address, card_number_encrypted, verification_code_encrypted)"
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','1','','','')";
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str()));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Run());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |billing_address| is a string.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt3 = "SELECT billing_address FROM credit_cards";
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str()));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |created_by_policy| column should have been added.
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy"));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the credit card data is converted.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT guid, name_on_card, expiration_month, expiration_year, "
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "card_number_encrypted, date_modified "
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "FROM credit_cards"));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Jack", s.ColumnString(1));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s.ColumnInt(2));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2012, s.ColumnInt(3));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 5 is encrypted credit card number blo b.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 6 is date_modified.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure instant_url is added correctly to keywords.
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion27ToCurrent) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_27.sql")));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 27 of the
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "instant_url"));
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure supports_instant (added in Version 28) was ultimately dropped
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // again and instant_url was added.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords", "supports_instant"));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "instant_url"));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that instant_url is empty.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "SELECT instant_url FROM keywords";
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s.ColumnString(0));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the data made it over.
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stmt = "SELECT " + KeywordTable::GetKeywordColumns() + " FROM keywords";
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt.c_str()));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s2.ColumnInt(0));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Google", s2.ColumnString(1));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("google.com", s2.ColumnString(2));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://www.google.com/favicon.ico", s2.ColumnString(3));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"\
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}"\
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "&q={searchTerms}",
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s2.ColumnString(4));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s2.ColumnBool(5));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(6));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(7));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(8));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string("UTF-8"), s2.ColumnString(9));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s2.ColumnBool(10));
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string("{google:baseSuggestURL}search?client=chrome&hl="
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "{language}&q={searchTerms}"), s2.ColumnString(11));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, s2.ColumnInt(12));
721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_FALSE(s2.ColumnBool(13));
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(14));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(15));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(16));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure date_modified is added correctly to autofill_profiles and
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// credit_cards.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion29ToCurrent) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_29.sql")));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 29 of the
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "date_modified"));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "date_modified"));
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_creation_time = Time::Now();
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_creation_time = Time::Now();
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the columns were created.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s_profiles(connection.GetUniqueStatement(
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT date_modified FROM autofill_profiles "));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s_profiles.is_valid());
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s_profiles.Step()) {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GE(s_profiles.ColumnInt64(0),
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_creation_time.ToTimeT());
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(s_profiles.ColumnInt64(0),
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_creation_time.ToTimeT());
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s_profiles.Succeeded());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s_credit_cards(connection.GetUniqueStatement(
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT date_modified FROM credit_cards "));
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s_credit_cards.is_valid());
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s_credit_cards.Step()) {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GE(s_credit_cards.ColumnInt64(0),
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_creation_time.ToTimeT());
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(s_credit_cards.ColumnInt64(0),
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_creation_time.ToTimeT());
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s_credit_cards.Succeeded());
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure guids are added to autofill_profiles and credit_cards tables.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion30ToCurrent) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_30.sql")));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 29 of the
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "guid"));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "guid"));
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that guids are non-null, non-empty, conforms to guid format, and
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are different.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid FROM autofill_profiles"));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string guid1 = s.ColumnString(0);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::IsValidGUID(guid1));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string guid2 = s.ColumnString(0);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::IsValidGUID(guid2));
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(guid1, guid2);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Removes unique IDs and make GUIDs the primary key.  Also removes unused
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// columns.
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion31ToCurrent) {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_31.sql")));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 30 of the
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile profile;
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 profile_label;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int profile_unique_id = 0;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 profile_date_modified = 0;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard credit_card;
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 cc_label;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cc_unique_id = 0;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cc_number_encrypted;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 cc_date_modified = 0;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "unique_id"));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "type"));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "card_number"));
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "verification_code"));
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "shipping_address"));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "verification_code_encrypted"));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fetch data in the database prior to migration.
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT label, unique_id, first_name, middle_name, last_name, "
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "email, company_name, address_line_1, address_line_2, city, state, "
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "zipcode, country, phone, fax, date_modified, guid "
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(AutofillProfile31FromStatement(
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s1, &profile, &profile_label, &profile_unique_id,
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &profile_date_modified));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT label, unique_id, name_on_card, type, card_number, "
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "expiration_month, expiration_year, verification_code, "
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "billing_address, shipping_address, card_number_encrypted, "
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "verification_code_encrypted, date_modified, guid "
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM credit_cards"));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CreditCard31FromStatement(s2,
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &credit_card,
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_label,
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_unique_id,
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_number_encrypted,
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_date_modified));
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(profile_unique_id, cc_unique_id);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(profile.guid(), credit_card.guid());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "unique_id"));
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id"));
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "type"));
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "card_number"));
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "verification_code"));
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "shipping_address"));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "verification_code_encrypted"));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, city, state, zipcode,"
931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " country_code, date_modified "
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfile profile_a;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 profile_date_modified_a = 0;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(AutofillProfile33FromStatement(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s1, &profile_a, &profile_date_modified_a));
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(profile.guid(), profile_a.guid());
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::COMPANY_NAME),
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::COMPANY_NAME));
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE1),
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE1));
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE2),
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE2));
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_CITY),
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_CITY));
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_STATE),
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_STATE));
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_ZIP),
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_ZIP));
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY),
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(profile_date_modified, profile_date_modified_a);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, name_on_card, expiration_month, "
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "expiration_year, card_number_encrypted, date_modified "
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM credit_cards"));
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreditCard credit_card_a;
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 cc_label_a;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string cc_number_encrypted_a;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 cc_date_modified_a = 0;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CreditCard32FromStatement(s2,
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &credit_card_a,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_number_encrypted_a,
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_date_modified_a));
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(credit_card, credit_card_a);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_label, cc_label_a);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_number_encrypted, cc_number_encrypted_a);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_date_modified, cc_date_modified_a);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factor |autofill_profiles| address information separately from name, email,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and phone.
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_32.sql")));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 32 of the
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "label"));
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "first_name"));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "middle_name"));
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "last_name"));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "email"));
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "company_name"));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_1"));
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_2"));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city"));
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state"));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode"));
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country"));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "phone"));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "fax"));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_names"));
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_emails"));
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_phones"));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "label"));
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify changes to columns.
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "label"));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "first_name"));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "middle_name"));
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "last_name"));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "email"));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "company_name"));
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           "street_address"));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city"));
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state"));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode"));
1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           "country_code"));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "phone"));
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "fax"));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "names" table.
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", "guid"));
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "first_name"));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "middle_name"));
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "last_name"));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "emails" table.
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "guid"));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "email"));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "phones" table.
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "guid"));
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones",
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "number"));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "label"));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
1075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, city, state, zipcode, "
1076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " country_code, date_modified "
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s1.ColumnString(0));
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe Enterprises"), s1.ColumnString16(1));
1083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1 Main St\n"
1084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "Apt 1"),
1085a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s1.ColumnString16(2));
1086a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1088a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets merged during migration from 35 to 37 due to multi-valued fields.
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith.
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s1.ColumnString(0));
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("2 Main Street"), s1.ColumnString16(2));
1100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith (Part 2).
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s1.ColumnString(0));
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("2 Main St"), s1.ColumnString16(2));
1111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s1.ColumnString(0));
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("3 Main St"), s1.ColumnString16(2));
1125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be all.
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s1.Step());
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, first_name, middle_name, last_name "
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_names"));
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0));
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1));
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3));
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.  Note same guid as above due to merging of multi-valued
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fields.
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0));
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1));
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("P."), s2.ColumnString16(2));
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3));
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith.
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s2.ColumnString(0));
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1));
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3));
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith (Part 2).
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s2.ColumnString(0));
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1));
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3));
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s2.ColumnString(0));
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(1));
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(3));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s2.Step());
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, email "
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_emails"));
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s3.ColumnString(0));
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john@doe.com"), s3.ColumnString16(1));
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street.
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s3.ColumnString(0));
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St.
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s3.ColumnString(0));
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s3.ColumnString(0));
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s3.Step());
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s4(
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
1218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, number "
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_phones"));
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe phone.
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s4.ColumnString(0));
1224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("4151112222"), s4.ColumnString16(1));
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe fax.
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe phone.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe fax.
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street phone.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s4.ColumnString(0));
1240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(1));
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street fax.
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St phone.
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s4.ColumnString(0));
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s4.ColumnInt(1));  // 0 means phone.
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(2));
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St fax.
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note no phone or fax for Alfred E Newman.
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St phone.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s4.ColumnString(0));
1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(1));
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St fax.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s4.Step());
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds a column for the autofill profile's country code.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion33ToCurrent) {
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_33.sql")));
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 33 of the
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "country_code"));
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country value is the one we expect.
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT country FROM autofill_profiles"));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country = s.ColumnString(0);
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("United States", country);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles",
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country code is properly converted.
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT country_code FROM autofill_profiles"));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("US", country_code);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleans up bad country code "UK" in favor of good country code "GB".
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion34ToCurrent) {
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_34.sql")));
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 34 of the
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country_code value is the one we expect.
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT country_code "
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "FROM autofill_profiles"));
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("UK", country_code);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have only one.
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s.Step());
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles",
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country_code code is properly converted.
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT country_code FROM autofill_profiles"));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("GB", country_code);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have only one.
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s.Step());
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleans up invalid profiles based on more agressive merging.  Filters out
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// profiles that are subsets of other profiles, and profiles with invalid email,
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state, and incomplete address.
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion35ToCurrent) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_35.sql")));
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 34 of the
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profiles_trash"));
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that there are 6 profiles prior to merge.
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid FROM autofill_profiles"));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s.Step())
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++i;
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(6, i);
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesTableExist("autofill_profiles_trash"));
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles_trash", "guid"));
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
1413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, city, state, zipcode,"
1414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " country_code, date_modified "
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s1.ColumnString(0));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Acme Inc."), s1.ColumnString16(1));
1421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1 Main Street\n"
1422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "Apt 2"),
1423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s1.ColumnString16(2));
1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("San Francisco"), s1.ColumnString16(3));
1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94102"), s1.ColumnString16(5));
1427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1300131704, s1.ColumnInt64(7));
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be it.
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that there 5 trashed profile after the merge.
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid "
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "FROM autofill_profiles_trash"));
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002", s2.ColumnString(0));
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003", s2.ColumnString(0));
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004", s2.ColumnString(0));
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000005", s2.ColumnString(0));
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000006", s2.ColumnString(0));
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be it.
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |last_modified| column gets added to the schema for
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a version 37 database.
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion37ToCurrent) {
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |last_modified| column.
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_37.sql")));
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 37 of the
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "last_modified"));
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |last_modified| column should have been added.
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "last_modified"));
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |sync_guid| column gets added to the schema for
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a version 38 database.
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion38ToCurrent) {
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |sync_guid| column.
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_38.sql")));
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 38 of the
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "sync_guid"));
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |sync_guid| column should have been added.
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "sync_guid"));
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that no backup data is added to a version 39 database.
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion39ToCurrent) {
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the default
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // search provider backup field to the meta table.
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_39.sql")));
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 39 of the
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 39, 39));
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion40ToCurrent) {
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_40.sql")));
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 40 of the
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 40, 40));
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion41ToCurrent) {
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_41.sql")));
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 41 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)    sql::MetaTable meta_table;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 41, 41));
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion42ToCurrent) {
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_42.sql")));
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 42 of the
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 42, 42));
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("keywords_backup"));
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion43ToCurrent) {
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_43.sql")));
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 previous_default_search_provider_id;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 43 of the
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 43, 43));
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(default_search_provider_id, 0);
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    previous_default_search_provider_id = default_search_provider_id;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords_backup"));
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default search provider ID should not change.
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(previous_default_search_provider_id, default_search_provider_id);
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |autogenerate_keyword| and |logo_id| columns get removed from
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the keyword table schema for a version 45 database.
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion44ToCurrent) {
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_44.sql")));
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 44 of the
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 44, 44));
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "autogenerate_keyword"));
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "logo_id"));
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should have removed this obsolete key.
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string default_search_provider_backup;
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(meta_table.GetValue("Default Search Provider Backup",
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &default_search_provider_backup));
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Two columns should have been removed.
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords",
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "autogenerate_keyword"));
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords", "logo_id"));
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Backup data should have been removed.
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the web_intents and web_intents_defaults tables are
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modified to include "scheme" columns.
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45ToCurrent) {
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_45.sql")));
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 45, 45));
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents"));
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist(
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "scheme", "web_intents_defaults"));
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new "scheme" column should have been added to each web_intents table.
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents", "scheme"));
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents_defaults", "scheme"));
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existing user data was copied.
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents"));
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://poodles.com/fuzzer", s1.ColumnString(0));
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("fuzz"), s1.ColumnString16(1));
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("poodle/*"), s1.ColumnString16(2));
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Poodle Fuzzer"), s1.ColumnString16(3));
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("window"), s1.ColumnString16(4));
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(5));
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we want to verify existing user data was copied
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents_defaults"));
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("fuzz", s2.ColumnString(0));
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("poodle/*"), s2.ColumnString16(1));
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2));
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(3));
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(4));
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("http://poodles.com/fuzzer"), s2.ColumnString16(5));
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(6));
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // finally ensure the migration code cleaned up after itself
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents"));
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents_defaults"));
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the web_intents and web_intents_defaults tables are
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modified to include "scheme" columns.
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45InvalidToCurrent) {
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_45_invalid.sql")));
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 45, 45));
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents"));
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist(
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "scheme", "web_intents_defaults"));
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new "scheme" column should have been added to each web_intents table.
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents", "scheme"));
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents_defaults", "scheme"));
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existing user data was copied.
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents"));
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());  // Basically should be empty at this point.
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we want to verify existing user data was copied
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents_defaults"));
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We were able to create the new tables, but unable to copy any data
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Given the initial bad state of the tables.
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Finally ensure the migration code cleaned up after itself.
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents"));
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents_defaults"));
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that current version is forced to compatible version before migration,
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if the former is smaller.
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45CompatibleToCurrent) {
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_45_compatible.sql")));
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Database is actually version 45 but the version field states 40.
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 40, 45));
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(45, VersionFromConnection(&connection));
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |alternate_urls| column is added to the keyword table schema
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a version 47 database.
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion46ToCurrent) {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_46.sql")));
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 46 of the
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 46, 46));
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "alternate_urls"));
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords_backup",
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "alternate_urls"));
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new column should have been created.
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "alternate_urls"));
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion47ToCurrent) {
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_47.sql")));
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 47 of the
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 47, 47));
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 default_search_provider_id = 0;
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &default_search_provider_id));
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords_backup"));
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database.
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::Connection connection;
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check version.
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::MetaTable meta_table;
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                kCurrentTestedVersionNumber));
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 default_search_provider_id = 0;
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &default_search_provider_id));
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the |search_terms_replacement_key| column is added to the keyword
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// table schema for a version 49 database.
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion48ToCurrent) {
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_48.sql")));
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 48 of the
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database.
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::Connection connection;
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::MetaTable meta_table;
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 48, 48));
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            "search_terms_replacement_key"));
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new column should have been created.
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           "search_terms_replacement_key"));
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |origin| column is added to the autofill_profiles and
2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// credit_cards table schemas for a version 50 database.
2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion49ToCurrent) {
2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_49.sql")));
2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 49 of the
2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // database.
2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sql::Connection connection;
2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("autofill_profiles", "origin"));
2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "origin"));
2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoMigration();
2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // database.
2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sql::Connection connection;
2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check version.
2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A new column should have been created in both tables.
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "origin"));
2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "origin"));
2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Tests that the columns |image_url|, |search_url_post_params|,
21483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// |suggest_url_post_params|, |instant_url_post_params|, and
21493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// |image_url_post_params| are added to the keyword table schema for a version
21503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// 50 database.
2151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion50ToCurrent) {
2152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
2153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_50.sql")));
2154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 50 of the
2156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // database.
2157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
2158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sql::Connection connection;
2159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sql::MetaTable meta_table;
2163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 50, 50));
2164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "image_url"));
2166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "search_url_post_params"));
2168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "suggest_url_post_params"));
2170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "instant_url_post_params"));
2172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "image_url_post_params"));
2174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DoMigration();
2177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // database.
2180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
2181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sql::Connection connection;
2182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Check version.
2186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // New columns should have been created.
2189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "image_url"));
2190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "search_url_post_params"));
2192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "suggest_url_post_params"));
2194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "instant_url_post_params"));
2196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "image_url_post_params"));
2198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
22003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Tests that the column |new_tab_url| is added to the keyword table schema for
22023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// a version 52 database.
22033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion52ToCurrent) {
22043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
22053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_52.sql")));
22063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 52 of the
22083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // database.
22093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {
22103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sql::Connection connection;
22113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
22123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
22133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sql::MetaTable meta_table;
22153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 52, 52));
22163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "new_tab_url"));
22183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
22193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DoMigration();
22213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
22233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // database.
22243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {
22253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sql::Connection connection;
22263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
22273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
22283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Check version.
22303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
22313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // New columns should have been created.
22333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "new_tab_url"));
22343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
22353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that for a version 54 database,
2238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//   (a) The street_address, dependent_locality, and sorting_code columns are
2239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//       added to the autofill_profiles table schema.
2240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//   (b) The address_line1, address_line2, and country columns are dropped from
2241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//       the autofill_profiles table schema.
2242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//   (c) The type column is dropped from the autofill_profile_phones schema.
2243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion53ToCurrent) {
2244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_53.sql")));
2245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 53 of the
2247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // database.
2248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
2249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Connection connection;
2250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line_1"));
2254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line_2"));
2256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country"));
2257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "street_address"));
2259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "dependent_locality"));
2261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "sorting_code"));
2263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "type"));
2264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DoMigration();
2267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // database.
2270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
2271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Connection connection;
2272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Check version.
2276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Columns should have been added and removed appropriately.
2279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line1"));
2281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line2"));
2283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "country"));
2284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "street_address"));
2286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "dependent_locality"));
2288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "sorting_code"));
2290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profile_phones", "type"));
2291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Data should have been preserved.
2293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Statement s_profiles(
2294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.GetUniqueStatement(
2295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, dependent_locality,"
2296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " city, state, zipcode, sorting_code, country_code, date_modified,"
2297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " origin "
2298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "FROM autofill_profiles"));
2299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Address lines 1 and 2.
2301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001",
2303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Google, Inc."), s_profiles.ColumnString16(1));
2305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1950 Charleston Rd.\n"
2306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "(2nd floor)"),
2307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString16(2));
2308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Mountain View"), s_profiles.ColumnString16(4));
2310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s_profiles.ColumnString16(5));
2311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94043"), s_profiles.ColumnString16(6));
2312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8));
2314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046731, s_profiles.ColumnInt(9));
2315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Only address line 1.
2318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002",
2320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Google!"), s_profiles.ColumnString16(1));
2322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1600 Amphitheatre Pkwy."),
2323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString16(2));
2324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Mtn. View"), s_profiles.ColumnString16(4));
2326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("California"), s_profiles.ColumnString16(5));
2327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94043-1234"), s_profiles.ColumnString16(6));
2328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8));
2330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046800, s_profiles.ColumnInt(9));
2331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Only address line 2.
2334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003",
2336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(1));
2338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("\nOnly line 2???"), s_profiles.ColumnString16(2));
2339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(4));
2341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(5));
2342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(6));
2343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(8));
2345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046834, s_profiles.ColumnInt(9));
2346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // No address lines.
2349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004",
2351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(1));
2353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(2));
2354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(4));
2356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Texas"), s_profiles.ColumnString16(5));
2357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(6));
2358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(8));
2360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046847, s_profiles.ColumnInt(9));
2361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // That should be it.
2364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(s_profiles.Step());
2365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Verify the phone number data as well.
2367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Statement s_phones(
2368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.GetUniqueStatement(
2369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, number FROM autofill_profile_phones"));
2370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s_phones.ColumnString(0));
2373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1.800.555.1234"), s_phones.ColumnString16(1));
2374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s_phones.ColumnString(0));
2377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("+1 (800) 555-4321"), s_phones.ColumnString16(1));
2378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002", s_phones.ColumnString(0));
2381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_phones.ColumnString16(1));
2382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003", s_phones.ColumnString(0));
2385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("6505557890"), s_phones.ColumnString16(1));
2386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004", s_phones.ColumnString(0));
2389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_phones.ColumnString16(1));
2390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(s_phones.Step());
2392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that migrating from version 54 to version 55 drops the autofill_dates
2396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// table, and merges the appropriate dates into the autofill table.
2397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion54ToCurrent) {
2398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_54.sql")));
2399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 54 of the
2401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // database.
2402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
2403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
2404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill_dates"));
2407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill", "date_created"));
2408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill", "date_last_used"));
2409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Verify the incoming data.
2411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_autofill(connection.GetUniqueStatement(
2412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT name, value, value_lower, pair_id, count FROM autofill"));
2413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_dates(connection.GetUniqueStatement(
2414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT pair_id, date_created FROM autofill_dates"));
2415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with one timestamp.
2417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
2419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s_autofill.ColumnString16(1));
2420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2));
2421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_autofill.ColumnInt(3));
2422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
2423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_dates.ColumnInt(0));
2425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s_dates.ColumnInt64(1));
2426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Another entry with one timestamp, differing from the previous one in case
2428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // only.
2429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
2431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(1));
2432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2));
2433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_autofill.ColumnInt(3));
2434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
2435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_dates.ColumnInt(0));
2437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s_dates.ColumnInt64(1));
2438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with two timestamps (with count > 2; this is realistic).
2440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
2442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(1));
2443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(2));
2444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_autofill.ColumnInt(3));
2445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s_autofill.ColumnInt(4));
2446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
2448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s_dates.ColumnInt64(1));
2449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
2451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s_dates.ColumnInt64(1));
2452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with more than two timestamps, which are stored out of order.
2454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
2456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"),
2457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              s_autofill.ColumnString16(1));
2458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"),
2459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              s_autofill.ColumnString16(2));
2460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_autofill.ColumnInt(3));
2461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4, s_autofill.ColumnInt(4));
2462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299401, s_dates.ColumnInt64(1));
2465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299400, s_dates.ColumnInt64(1));
2468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299403, s_dates.ColumnInt64(1));
2471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299402, s_dates.ColumnInt64(1));
2474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
2476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_autofill.Step());
2477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_dates.Step());
2478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoMigration();
2481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // database.
2484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
2485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
2486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Check version.
2490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The autofill_dates table should have been dropped, and its columns should
2493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // have been migrated to the autofill table.
2494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_dates"));
2495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill", "date_created"));
2496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill", "date_last_used"));
2497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Data should have been preserved.  Note that it appears out of order
2499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // relative to the previous table, as it's been alphabetized.  That's ok.
2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s(
2501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        connection.GetUniqueStatement(
2502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "SELECT name, value, value_lower, date_created, date_last_used,"
2503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            " count "
2504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "FROM autofill "
2505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "ORDER BY name, value ASC"));
2506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "jane.doe@example.org": Timestamps should be parsed correctly, and only
2508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // the first and last should be kept.
2509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0));
2511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"), s.ColumnString16(1));
2512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"), s.ColumnString16(2));
2513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299400, s.ColumnInt64(3));
2514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299403, s.ColumnInt64(4));
2515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4, s.ColumnInt(5));
2516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "jane@example.com": Timestamps should be parsed correctly.
2518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0));
2520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(1));
2521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(2));
2522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s.ColumnInt64(3));
2523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s.ColumnInt64(4));
2524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s.ColumnInt(5));
2525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "John Doe": The single timestamp should be assigned as both the creation
2527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // and the last use timestamp.
2528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0));
2530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s.ColumnString16(1));
2531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2));
2532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(3));
2533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(4));
2534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s.ColumnInt(5));
2535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "john doe": Should not be merged with "John Doe" (case-sensitivity).
2537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0));
2539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(1));
2540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2));
2541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s.ColumnInt64(3));
2542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s.ColumnInt64(4));
2543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s.ColumnInt(5));
2544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
2546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s.Step());
2547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2549