web_database_migration_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/string_util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/keyword_table.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/logins_table.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/web_apps_table.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_intents_table.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/webdata/token_service_table.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfile;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillTable;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::CreditCard;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutofillProfile31FromStatement(const sql::Statement& s,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AutofillProfile* profile,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    base::string16* label,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int* unique_id,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64* date_modified) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(label);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(unique_id);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *label = s.ColumnString16(0);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *unique_id = s.ColumnInt(1);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_FIRST, s.ColumnString16(2));
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_MIDDLE, s.ColumnString16(3));
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::NAME_LAST, s.ColumnString16(4));
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::EMAIL_ADDRESS, s.ColumnString16(5));
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(6));
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE1, s.ColumnString16(7));
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_LINE2, s.ColumnString16(8));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(9));
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(10));
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(11));
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetInfo(
653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY),
663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      s.ColumnString16(12), "en-US");
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(13));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(15);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(s.ColumnString(16));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(profile->guid()));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutofillProfile33FromStatement(const sql::Statement& s,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AutofillProfile* profile,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64* date_modified) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(s.ColumnString(0));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(profile->guid()));
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetRawInfo(autofill::COMPANY_NAME, s.ColumnString16(1));
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STREET_ADDRESS,
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      s.ColumnString16(2));
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_CITY, s.ColumnString16(3));
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_STATE, s.ColumnString16(4));
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  profile->SetRawInfo(autofill::ADDRESS_HOME_ZIP, s.ColumnString16(5));
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile->SetInfo(
873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY),
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      s.ColumnString16(6), "en-US");
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  *date_modified = s.ColumnInt64(7);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreditCard31FromStatement(const sql::Statement& s,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CreditCard* credit_card,
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              base::string16* label,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int* unique_id,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* encrypted_number,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64* date_modified) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_card);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(label);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(unique_id);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encrypted_number);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *label = s.ColumnString16(0);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *unique_id = s.ColumnInt(1);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(2));
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_TYPE, s.ColumnString16(3));
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(5));
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(6));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int encrypted_number_len = s.ColumnByteLength(10);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_number_len) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_number->resize(encrypted_number_len);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&(*encrypted_number)[0], s.ColumnBlob(10), encrypted_number_len);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(12);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(s.ColumnString(13));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(credit_card->guid()));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreditCard32FromStatement(const sql::Statement& s,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               CreditCard* credit_card,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::string* encrypted_number,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int64* date_modified) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_card);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encrypted_number);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(date_modified);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(s.ColumnString(0));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::IsValidGUID(credit_card->guid()));
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_NAME, s.ColumnString16(1));
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH, s.ColumnString16(2));
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card->SetRawInfo(
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(3));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int encrypted_number_len = s.ColumnByteLength(4);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_number_len) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_number->resize(encrypted_number_len);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&(*encrypted_number)[0], s.ColumnBlob(4), encrypted_number_len);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *date_modified = s.ColumnInt64(5);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckHasBackupData(sql::MetaTable* meta_table) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(meta_table->GetValue(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup", &value));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(meta_table->GetValue(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup Signature", &value));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckNoBackupData(const sql::Connection& connection,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       sql::MetaTable* meta_table) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(meta_table->GetValue(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup", &value));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(meta_table->GetValue(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Default Search Provider ID Backup Signature", &value));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection.DoesTableExist("keywords_backup"));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string RemoveQuotes(const std::string& has_quotes) {
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string no_quotes;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // SQLite quotes: http://www.sqlite.org/lang_keywords.html
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::RemoveChars(has_quotes, "\"[]`", &no_quotes);
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return no_quotes;
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The WebDatabaseMigrationTest encapsulates testing of database migrations.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically, these tests are intended to exercise any schema changes in
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the WebDatabase and data migrations that occur in
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |WebDatabase::MigrateOldVersionsAsNeeded()|.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDatabaseMigrationTest : public testing::Test {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebDatabaseMigrationTest() {}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDatabaseMigrationTest() {}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the database via the WebDatabase class and migrate the database to
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current version.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoMigration() {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(joi): This whole unit test file needs to stay in //chrome
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // for now, as it needs to know about all the different table
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // types. Once all webdata datatypes have been componentized, this
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // could move to components_unittests.
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillTable autofill_table("en-US");
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeywordTable keyword_table;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoginsTable logins_table;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TokenServiceTable token_service_table;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebAppsTable web_apps_table;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebIntentsTable web_intents_table;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebDatabase db;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&autofill_table);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&keyword_table);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&logins_table);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&token_service_table);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&web_apps_table);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db.AddTable(&web_intents_table);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This causes the migration to occur.
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath()));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current tested version number.  When adding a migration in
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |WebDatabase::MigrateOldVersionsAsNeeded()| and changing the version number
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |kCurrentVersionNumber| this value should change to reflect the new version
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number and a new migration test added below.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kCurrentTestedVersionNumber;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath GetDatabasePath() {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType kWebDatabaseFilename[] =
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("TestWebDatabase.sqlite3");
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return temp_dir_.path().Append(base::FilePath(kWebDatabaseFilename));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The textual contents of |file| are read from
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // "components/test/data/web_database" and returned in the string |contents|.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the file exists and is read successfully, false otherwise.
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetWebDatabaseData(const base::FilePath& file, std::string* contents) {
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::FilePath source_path;
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PathService::Get(base::DIR_SOURCE_ROOT, &source_path);
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("components");
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("test");
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("data");
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.AppendASCII("web_database");
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_path = source_path.Append(file);
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return base::PathExists(source_path) &&
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::ReadFileToString(source_path, contents);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int VersionFromConnection(sql::Connection* connection) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get version.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection->GetUniqueStatement(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT value FROM meta WHERE key='version'"));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s.Step())
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return s.ColumnInt(0);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sql files located in "chrome/test/data/web_database" were generated by
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launching the Chromium application prior to schema change, then using the
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sqlite3 command-line application to dump the contents of the "Web Data"
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Like this:
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   > .output version_nn.sql
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   > .dump
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadDatabase(const base::FilePath::StringType& file);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 56;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDatabaseMigrationTest::LoadDatabase(
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::StringType& file) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(GetWebDatabaseData(base::FilePath(file), &contents));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Connection connection;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(connection.Open(GetDatabasePath()));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(connection.Execute(contents.data()));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Tests that migrating from the golden files version_XX.sql results in the same
272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// schema as migrating from an empty database.
273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(WebDatabaseMigrationTest, VersionXxSqlFilesAreGolden) {
274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DoMigration();
275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sql::Connection connection;
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(connection.Open(GetDatabasePath()));
277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const std::string& expected_schema = RemoveQuotes(connection.GetSchema());
278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static const int kFirstVersion = 53;
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (int i = kFirstVersion; i < kCurrentTestedVersionNumber; ++i) {
280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    connection.Raze();
281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const base::FilePath& file_name = base::FilePath::FromUTF8Unsafe(
282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        "version_" + base::IntToString(i) + ".sql");
283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_NO_FATAL_FAILURE(LoadDatabase(file_name.value()))
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << "Failed to load " << file_name.MaybeAsASCII();
285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DoMigration();
286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(expected_schema, RemoveQuotes(connection.GetSchema()));
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the all migrations from an empty database succeed.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateEmptyToCurrent) {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that expected tables are present.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill"));
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The autofill_dates table is obsolete. (It's been merged into the autofill
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // table.)
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_dates"));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill_profiles"));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("credit_cards"));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords"));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The logins table is obsolete. (We used to store saved passwords here.)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("logins"));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("meta"));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("token_service"));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_app_icons"));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_apps"));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_intents"));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("web_intents_defaults"));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that absent Autofill tables do not create any problems when migrating
323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// from a DB written by the earliest publicly released version of Chrome.
324effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(WebDatabaseMigrationTest, MigrateVersion20ToCurrent) {
325effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_20.sql")));
326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Verify pre-conditions.
328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  {
329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sql::Connection connection;
330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ASSERT_TRUE(connection.Open(GetDatabasePath()));
331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(connection.DoesTableExist("autofill"));
333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(connection.DoesTableExist("autofill_profiles"));
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(connection.DoesTableExist("credit_cards"));
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DoMigration();
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Verify post-conditions.  These are expectations for current version of the
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // database.
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  {
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sql::Connection connection;
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ASSERT_TRUE(connection.Open(GetDatabasePath()));
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Check version.
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Mostly this test just verifies that no SQL errors occur during migration;
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // but might as well verify that the tables were created as well.
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_TRUE(connection.DoesTableExist("autofill"));
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_TRUE(connection.DoesTableExist("autofill_profiles"));
352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_TRUE(connection.DoesTableExist("credit_cards"));
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that rows with empty values get removed from the autofill tables.
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion21ToCurrent) {
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_21.sql")));
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify pre-conditions.
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Both empty and non-empty values are allowed in a version 21 database.
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_autofill(connection.GetUniqueStatement(
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT name, value, value_lower, pair_id, count FROM autofill"));
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_dates(connection.GetUniqueStatement(
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT pair_id, date_created FROM autofill_dates"));
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with a non-empty value.
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s_autofill.ColumnString16(1));
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2));
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_autofill.ColumnInt(3));
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_dates.ColumnInt(0));
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s_dates.ColumnInt64(1));
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with an empty value.
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(1));
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(2));
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_autofill.ColumnInt(3));
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_dates.ColumnInt(0));
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s_dates.ColumnInt64(1));
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Another entry with a non-empty value.
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(1));
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(2));
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_autofill.ColumnInt(3));
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s_autofill.ColumnInt(4));
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s_dates.ColumnInt64(1));
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s_dates.ColumnInt64(1));
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Another entry with an empty value.
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(1));
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_autofill.ColumnString16(2));
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_autofill.ColumnInt(3));
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4, s_autofill.ColumnInt(4));
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299401, s_dates.ColumnInt64(1));
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299400, s_dates.ColumnInt64(1));
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299403, s_dates.ColumnInt64(1));
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299402, s_dates.ColumnInt64(1));
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_autofill.Step());
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_dates.Step());
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoMigration();
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // database.
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Check version.
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Entries with empty values should have been dropped.  The remaining
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // entries should have been preserved.
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s(
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        connection.GetUniqueStatement(
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "SELECT name, value, value_lower, date_created, date_last_used,"
448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            " count "
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "FROM autofill "
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "ORDER BY name, value ASC"));
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "jane@example.com"
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0));
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(1));
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(2));
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s.ColumnInt64(3));
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s.ColumnInt64(4));
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s.ColumnInt(5));
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "John Doe"
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0));
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s.ColumnString16(1));
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2));
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(3));
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(4));
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s.ColumnInt(5));
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s.Step());
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |credit_card| table gets added to the schema for a version 22
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion22ToCurrent) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |credit_card| table.  Version 22 of the schema.  Contrast this with the
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corrupt version below.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_22.sql")));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No |credit_card| table prior to version 23.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "guid"));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |credit_card| table now exists.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |credit_card| table gets added to the schema for a corrupt
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version 22 database.  The corruption is that the |credit_cards| table exists
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but the schema version number was not set correctly to 23 or later.  This
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test exercises code introduced to fix bug http://crbug.com/50699 that
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resulted from the corruption.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion22CorruptedToCurrent) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build after the addition of the |credit_card|
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // table.  Due to a bug in the migration logic the version is set incorrectly
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to 22 (it should have been updated to 23 at least).
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_22_corrupt.sql")));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for corrupt version 22 of
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the database.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before version 25.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id"));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.DoesColumnExist("credit_cards", "card_number_encrypted"));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |created_by_policy| column gets added to the schema
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a version 25 database.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion25ToCurrent) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |created_by_policy| column.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_25.sql")));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 25 of the
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |created_by_policy| column should have been added.
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy"));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the credit_cards.billing_address column is changed from a string
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an int whilst preserving the associated billing address. This version of
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test makes sure a stored label is converted to an ID.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringLabels) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the change of column type for
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credit_cards.billing_address from string to int.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql")));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 26 of the
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "INSERT INTO autofill_profiles"
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, first_name, middle_name, last_name, email,"
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " company_name, address_line_1, address_line_2, city, state, zipcode,"
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " country, phone, fax)"
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('Home',1,'','','','','','','','','','','','','')";
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Run());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert a CC linked to an existing address.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt2 = "INSERT INTO credit_cards"
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, name_on_card, type, card_number,"
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expiration_month, expiration_year, verification_code, billing_address,"
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " shipping_address, card_number_encrypted, verification_code_encrypted)"
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','Home','','','')";
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str()));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Run());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |billing_address| is a string.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt3 = "SELECT billing_address FROM credit_cards";
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str()));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the credit card data is converted.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT guid, name_on_card, expiration_month, expiration_year, "
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "card_number_encrypted, date_modified "
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "FROM credit_cards"));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Jack", s.ColumnString(1));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s.ColumnInt(2));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2012, s.ColumnInt(3));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 5 is encrypted number blob.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 6 is date_modified.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the credit_cards.billing_address column is changed from a string
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an int whilst preserving the associated billing address. This version of
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test makes sure a stored string ID is converted to an integer ID.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringIDs) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the change of column type for
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credit_cards.billing_address from string to int.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql")));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 26 of the
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "INSERT INTO autofill_profiles"
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, first_name, middle_name, last_name, email,"
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " company_name, address_line_1, address_line_2, city, state, zipcode,"
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " country, phone, fax)"
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('Home',1,'','','','','','','','','','','','','')";
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Run());
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert a CC linked to an existing address.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt2 = "INSERT INTO credit_cards"
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(label, unique_id, name_on_card, type, card_number,"
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expiration_month, expiration_year, verification_code, billing_address,"
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " shipping_address, card_number_encrypted, verification_code_encrypted)"
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','1','','','')";
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str()));
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Run());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |billing_address| is a string.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt3 = "SELECT billing_address FROM credit_cards";
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str()));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |created_by_policy| column should have been added.
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy"));
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the credit card data is converted.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT guid, name_on_card, expiration_month, expiration_year, "
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "card_number_encrypted, date_modified "
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "FROM credit_cards"));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Jack", s.ColumnString(1));
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s.ColumnInt(2));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2012, s.ColumnInt(3));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 5 is encrypted credit card number blo b.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Column 6 is date_modified.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure instant_url is added correctly to keywords.
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion27ToCurrent) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_27.sql")));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 27 of the
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "instant_url"));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure supports_instant (added in Version 28) was ultimately dropped
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // again and instant_url was added.
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords", "supports_instant"));
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "instant_url"));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that instant_url is empty.
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string stmt = "SELECT instant_url FROM keywords";
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(stmt.c_str()));
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s.ColumnString(0));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify the data made it over.
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stmt = "SELECT " + KeywordTable::GetKeywordColumns() + " FROM keywords";
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(connection.GetUniqueStatement(stmt.c_str()));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, s2.ColumnInt(0));
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Google", s2.ColumnString(1));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("google.com", s2.ColumnString(2));
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://www.google.com/favicon.ico", s2.ColumnString(3));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"\
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}"\
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "&q={searchTerms}",
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s2.ColumnString(4));
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s2.ColumnBool(5));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(6));
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(7));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(8));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string("UTF-8"), s2.ColumnString(9));
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s2.ColumnBool(10));
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string("{google:baseSuggestURL}search?client=chrome&hl="
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "{language}&q={searchTerms}"), s2.ColumnString(11));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, s2.ColumnInt(12));
782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_FALSE(s2.ColumnBool(13));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(14));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(15));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(), s2.ColumnString(16));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure date_modified is added correctly to autofill_profiles and
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// credit_cards.
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion29ToCurrent) {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_29.sql")));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 29 of the
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "date_modified"));
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "date_modified"));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_creation_time = Time::Now();
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_creation_time = Time::Now();
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the columns were created.
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s_profiles(connection.GetUniqueStatement(
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT date_modified FROM autofill_profiles "));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s_profiles.is_valid());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s_profiles.Step()) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GE(s_profiles.ColumnInt64(0),
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_creation_time.ToTimeT());
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(s_profiles.ColumnInt64(0),
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_creation_time.ToTimeT());
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s_profiles.Succeeded());
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s_credit_cards(connection.GetUniqueStatement(
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT date_modified FROM credit_cards "));
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s_credit_cards.is_valid());
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s_credit_cards.Step()) {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GE(s_credit_cards.ColumnInt64(0),
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_creation_time.ToTimeT());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(s_credit_cards.ColumnInt64(0),
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_creation_time.ToTimeT());
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(s_credit_cards.Succeeded());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure guids are added to autofill_profiles and credit_cards tables.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion30ToCurrent) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_30.sql")));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 29 of the
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "guid"));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "guid"));
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that guids are non-null, non-empty, conforms to guid format, and
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are different.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid FROM autofill_profiles"));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string guid1 = s.ColumnString(0);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::IsValidGUID(guid1));
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string guid2 = s.ColumnString(0);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::IsValidGUID(guid2));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(guid1, guid2);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Removes unique IDs and make GUIDs the primary key.  Also removes unused
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// columns.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion31ToCurrent) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_31.sql")));
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 30 of the
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile profile;
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 profile_label;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int profile_unique_id = 0;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 profile_date_modified = 0;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard credit_card;
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 cc_label;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cc_unique_id = 0;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cc_number_encrypted;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 cc_date_modified = 0;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "unique_id"));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "type"));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "card_number"));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "verification_code"));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address"));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "shipping_address"));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards",
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "verification_code_encrypted"));
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fetch data in the database prior to migration.
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT label, unique_id, first_name, middle_name, last_name, "
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "email, company_name, address_line_1, address_line_2, city, state, "
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "zipcode, country, phone, fax, date_modified, guid "
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(AutofillProfile31FromStatement(
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s1, &profile, &profile_label, &profile_unique_id,
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &profile_date_modified));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT label, unique_id, name_on_card, type, card_number, "
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "expiration_month, expiration_year, verification_code, "
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "billing_address, shipping_address, card_number_encrypted, "
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "verification_code_encrypted, date_modified, guid "
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM credit_cards"));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CreditCard31FromStatement(s2,
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &credit_card,
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_label,
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_unique_id,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_number_encrypted,
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_date_modified));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(profile_unique_id, cc_unique_id);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(profile.guid(), credit_card.guid());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "unique_id"));
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid"));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id"));
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "type"));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "card_number"));
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "verification_code"));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address"));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "shipping_address"));
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards",
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "verification_code_encrypted"));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, city, state, zipcode,"
992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " country_code, date_modified "
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfile profile_a;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 profile_date_modified_a = 0;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(AutofillProfile33FromStatement(
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s1, &profile_a, &profile_date_modified_a));
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(profile.guid(), profile_a.guid());
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::COMPANY_NAME),
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::COMPANY_NAME));
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE1),
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE1));
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_LINE2),
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_LINE2));
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_CITY),
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_CITY));
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_STATE),
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_STATE));
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_ZIP),
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_ZIP));
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(profile.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY),
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_a.GetRawInfo(autofill::ADDRESS_HOME_COUNTRY));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(profile_date_modified, profile_date_modified_a);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, name_on_card, expiration_month, "
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "expiration_year, card_number_encrypted, date_modified "
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM credit_cards"));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreditCard credit_card_a;
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 cc_label_a;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string cc_number_encrypted_a;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 cc_date_modified_a = 0;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CreditCard32FromStatement(s2,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &credit_card_a,
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_number_encrypted_a,
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &cc_date_modified_a));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(credit_card, credit_card_a);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_label, cc_label_a);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_number_encrypted, cc_number_encrypted_a);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cc_date_modified, cc_date_modified_a);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factor |autofill_profiles| address information separately from name, email,
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and phone.
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_32.sql")));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 32 of the
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existence of columns we'll be changing.
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "label"));
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "first_name"));
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "middle_name"));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "last_name"));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "email"));
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "company_name"));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_1"));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "address_line_2"));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city"));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state"));
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode"));
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country"));
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "phone"));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "fax"));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_names"));
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_emails"));
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profile_phones"));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "label"));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify changes to columns.
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "label"));
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "first_name"));
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "middle_name"));
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "last_name"));
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "email"));
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "company_name"));
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
1102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           "street_address"));
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city"));
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state"));
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode"));
1106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
1107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           "country_code"));
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "phone"));
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "fax"));
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "date_modified"));
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "names" table.
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", "guid"));
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "first_name"));
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "middle_name"));
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names",
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "last_name"));
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "emails" table.
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "guid"));
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "email"));
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // New "phones" table.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "guid"));
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones",
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "number"));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "label"));
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
1136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, city, state, zipcode, "
1137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " country_code, date_modified "
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s1.ColumnString(0));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe Enterprises"), s1.ColumnString16(1));
1144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1 Main St\n"
1145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "Apt 1"),
1146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s1.ColumnString16(2));
1147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets merged during migration from 35 to 37 due to multi-valued fields.
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith.
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s1.ColumnString(0));
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("2 Main Street"), s1.ColumnString16(2));
1161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith (Part 2).
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s1.ColumnString(0));
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("2 Main St"), s1.ColumnString16(2));
1172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s1.ColumnString(0));
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s1.ColumnString16(1));
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("3 Main St"), s1.ColumnString16(2));
1186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(3));
1187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(5));
1189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1297882100L, s1.ColumnInt64(7));
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be all.
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s1.Step());
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, first_name, middle_name, last_name "
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_names"));
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1));
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3));
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.  Note same guid as above due to merging of multi-valued
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fields.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0));
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("P."), s2.ColumnString16(2));
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3));
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith.
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s2.ColumnString(0));
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1));
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3));
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dave Smith (Part 2).
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s2.ColumnString(0));
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1));
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3));
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s2.ColumnString(0));
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(1));
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(2));
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s2.ColumnString16(3));
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s2.Step());
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s3(
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "SELECT guid, email "
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_emails"));
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s3.ColumnString(0));
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john@doe.com"), s3.ColumnString16(1));
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe.
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s3.ColumnString(0));
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s3.ColumnString(0));
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Alfred E Newman.
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 36 due to incomplete address.
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s3.Step());
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s3.ColumnString(0));
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s3.ColumnString16(1));
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s3.Step());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s4(
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
1279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, number "
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profile_phones"));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe phone.
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s4.ColumnString(0));
1285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("4151112222"), s4.ColumnString16(1));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe fax.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe phone.
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe fax.
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled during migration from 35 to 37 due to merging of John Doe and
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John P. Doe addresses.
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street phone.
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s4.ColumnString(0));
1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(1));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main Street fax.
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St phone.
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s4.ColumnString(0));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s4.ColumnInt(1));  // 0 means phone.
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(2));
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St fax.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note no phone or fax for Alfred E Newman.
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 3 Main St phone.
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s4.Step());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s4.ColumnString(0));
1320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s4.ColumnString16(1));
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2 Main St fax.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets culled after fax type removed.
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be all.
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(s4.Step());
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds a column for the autofill profile's country code.
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion33ToCurrent) {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_33.sql")));
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 33 of the
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles",
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "country_code"));
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country value is the one we expect.
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT country FROM autofill_profiles"));
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country = s.ColumnString(0);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("United States", country);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles",
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country code is properly converted.
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT country_code FROM autofill_profiles"));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("US", country_code);
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleans up bad country code "UK" in favor of good country code "GB".
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion34ToCurrent) {
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_34.sql")));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 34 of the
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles",
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country_code value is the one we expect.
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT country_code "
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "FROM autofill_profiles"));
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("UK", country_code);
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have only one.
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s.Step());
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles",
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "country_code"));
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that the country_code code is properly converted.
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(connection.GetUniqueStatement(
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SELECT country_code FROM autofill_profiles"));
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s.Step());
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string country_code = s.ColumnString(0);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("GB", country_code);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have only one.
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s.Step());
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleans up invalid profiles based on more agressive merging.  Filters out
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// profiles that are subsets of other profiles, and profiles with invalid email,
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state, and incomplete address.
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion35ToCurrent) {
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database.
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_35.sql")));
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions. These are expectations for version 34 of the
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_profiles_trash"));
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that there are 6 profiles prior to merge.
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s(
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid FROM autofill_profiles"));
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (s.Step())
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++i;
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(6, i);
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesTableExist("autofill_profiles_trash"));
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles_trash", "guid"));
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid"));
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify data in the database after the migration.
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement(
1474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, city, state, zipcode,"
1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " country_code, date_modified "
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "FROM autofill_profiles"));
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // John Doe.
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s1.ColumnString(0));
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Acme Inc."), s1.ColumnString16(1));
1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1 Main Street\n"
1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "Apt 2"),
1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s1.ColumnString16(2));
1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("San Francisco"), s1.ColumnString16(3));
1486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(4));
1487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94102"), s1.ColumnString16(5));
1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s1.ColumnString16(6));
1489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1300131704, s1.ColumnInt64(7));
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be it.
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that there 5 trashed profile after the merge.
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT guid "
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "FROM autofill_profiles_trash"));
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002", s2.ColumnString(0));
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003", s2.ColumnString(0));
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004", s2.ColumnString(0));
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000005", s2.ColumnString(0));
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000006", s2.ColumnString(0));
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That should be it.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |last_modified| column gets added to the schema for
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a version 37 database.
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion37ToCurrent) {
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |last_modified| column.
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_37.sql")));
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 37 of the
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "last_modified"));
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |last_modified| column should have been added.
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "last_modified"));
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |keywords| |sync_guid| column gets added to the schema for
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a version 38 database.
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion38ToCurrent) {
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the |keywords|
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |sync_guid| column.
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_38.sql")));
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 38 of the
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Columns existing and not existing before current version.
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "id"));
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "sync_guid"));
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |keywords| |sync_guid| column should have been added.
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "id"));
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "sync_guid"));
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that no backup data is added to a version 39 database.
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion39ToCurrent) {
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This schema is taken from a build prior to the addition of the default
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // search provider backup field to the meta table.
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_39.sql")));
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 39 of the
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 39, 39));
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion40ToCurrent) {
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_40.sql")));
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 40 of the
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 40, 40));
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion41ToCurrent) {
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_41.sql")));
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 41 of the
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 41, 41));
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion42ToCurrent) {
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_42.sql")));
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 42 of the
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 42, 42));
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("keywords_backup"));
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion43ToCurrent) {
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_43.sql")));
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 previous_default_search_provider_id;
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 43 of the
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 43, 43));
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(default_search_provider_id, 0);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    previous_default_search_provider_id = default_search_provider_id;
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords_backup"));
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 default_search_provider_id = 0;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &default_search_provider_id));
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default search provider ID should not change.
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(previous_default_search_provider_id, default_search_provider_id);
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |autogenerate_keyword| and |logo_id| columns get removed from
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the keyword table schema for a version 45 database.
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion44ToCurrent) {
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_44.sql")));
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 44 of the
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 44, 44));
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "autogenerate_keyword"));
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.DoesColumnExist("keywords", "logo_id"));
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kCurrentTestedVersionNumber));
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should have removed this obsolete key.
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string default_search_provider_backup;
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(meta_table.GetValue("Default Search Provider Backup",
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &default_search_provider_backup));
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Two columns should have been removed.
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords",
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "autogenerate_keyword"));
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("keywords", "logo_id"));
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Backup data should have been removed.
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the web_intents and web_intents_defaults tables are
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modified to include "scheme" columns.
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45ToCurrent) {
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_45.sql")));
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 45, 45));
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents"));
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist(
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "scheme", "web_intents_defaults"));
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new "scheme" column should have been added to each web_intents table.
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents", "scheme"));
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents_defaults", "scheme"));
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existing user data was copied.
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents"));
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s1.Step());
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://poodles.com/fuzzer", s1.ColumnString(0));
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("fuzz"), s1.ColumnString16(1));
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("poodle/*"), s1.ColumnString16(2));
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Poodle Fuzzer"), s1.ColumnString16(3));
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("window"), s1.ColumnString16(4));
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(5));
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we want to verify existing user data was copied
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents_defaults"));
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(s2.Step());
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("fuzz", s2.ColumnString(0));
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("poodle/*"), s2.ColumnString16(1));
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2));
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(3));
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, s2.ColumnInt(4));
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("http://poodles.com/fuzzer"), s2.ColumnString16(5));
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(6));
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // finally ensure the migration code cleaned up after itself
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents"));
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents_defaults"));
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the web_intents and web_intents_defaults tables are
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modified to include "scheme" columns.
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45InvalidToCurrent) {
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_45_invalid.sql")));
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 45, 45));
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("scheme", "web_intents"));
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist(
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "scheme", "web_intents_defaults"));
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &connection,
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber,
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kCurrentTestedVersionNumber));
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new "scheme" column should have been added to each web_intents table.
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents", "scheme"));
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("web_intents_defaults", "scheme"));
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify existing user data was copied.
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s1(
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents"));
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s1.Step());  // Basically should be empty at this point.
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we want to verify existing user data was copied
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Statement s2(
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection.GetUniqueStatement("SELECT * FROM web_intents_defaults"));
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We were able to create the new tables, but unable to copy any data
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Given the initial bad state of the tables.
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(s2.Step());
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Finally ensure the migration code cleaned up after itself.
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents"));
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("old_web_intents_defaults"));
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that current version is forced to compatible version before migration,
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if the former is smaller.
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion45CompatibleToCurrent) {
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_45_compatible.sql")));
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 45 of the
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Database is actually version 45 but the version field states 40.
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 40, 45));
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(45, VersionFromConnection(&connection));
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the |alternate_urls| column is added to the keyword table schema
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a version 47 database.
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion46ToCurrent) {
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_46.sql")));
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 46 of the
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 46, 46));
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "alternate_urls"));
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords_backup",
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "alternate_urls"));
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new column should have been created.
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "alternate_urls"));
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the backup data is removed from the database.
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion47ToCurrent) {
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_47.sql")));
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 47 of the
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::MetaTable meta_table;
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 47, 47));
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 default_search_provider_id = 0;
21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &default_search_provider_id));
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckHasBackupData(&meta_table));
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("keywords_backup"));
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database.
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::Connection connection;
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check version.
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::MetaTable meta_table;
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, kCurrentTestedVersionNumber,
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                kCurrentTestedVersionNumber));
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 default_search_provider_id = 0;
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(meta_table.GetValue(KeywordTable::kDefaultSearchProviderKey,
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &default_search_provider_id));
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, default_search_provider_id);
21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the |search_terms_replacement_key| column is added to the keyword
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// table schema for a version 49 database.
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion48ToCurrent) {
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_48.sql")));
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 48 of the
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database.
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::Connection connection;
21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sql::MetaTable meta_table;
21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 48, 48));
21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            "search_terms_replacement_key"));
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoMigration();
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sql::Connection connection;
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check version.
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A new column should have been created.
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           "search_terms_replacement_key"));
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |origin| column is added to the autofill_profiles and
2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// credit_cards table schemas for a version 50 database.
2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion49ToCurrent) {
2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_49.sql")));
2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 49 of the
2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // database.
2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sql::Connection connection;
2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("autofill_profiles", "origin"));
2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "origin"));
2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoMigration();
2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // database.
2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sql::Connection connection;
2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check version.
2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A new column should have been created in both tables.
2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "origin"));
2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "origin"));
2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Tests that the columns |image_url|, |search_url_post_params|,
22093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// |suggest_url_post_params|, |instant_url_post_params|, and
22103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// |image_url_post_params| are added to the keyword table schema for a version
22113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// 50 database.
2212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion50ToCurrent) {
2213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
2214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_50.sql")));
2215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 50 of the
2217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // database.
2218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
2219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sql::Connection connection;
2220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sql::MetaTable meta_table;
2224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 50, 50));
2225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "image_url"));
2227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "search_url_post_params"));
2229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "suggest_url_post_params"));
2231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "instant_url_post_params"));
2233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords",
2234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "image_url_post_params"));
2235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DoMigration();
2238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // database.
2241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
2242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sql::Connection connection;
2243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Check version.
2247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // New columns should have been created.
2250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "image_url"));
2251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "search_url_post_params"));
2253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "suggest_url_post_params"));
2255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "instant_url_post_params"));
2257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords",
2258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                           "image_url_post_params"));
2259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
22613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Tests that the column |new_tab_url| is added to the keyword table schema for
22633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// a version 52 database.
22643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion52ToCurrent) {
22653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
22663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LoadDatabase(FILE_PATH_LITERAL("version_52.sql")));
22673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 52 of the
22693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // database.
22703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {
22713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sql::Connection connection;
22723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
22733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
22743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sql::MetaTable meta_table;
22763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(meta_table.Init(&connection, 52, 52));
22773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_FALSE(connection.DoesColumnExist("keywords", "new_tab_url"));
22793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
22803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DoMigration();
22823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
22843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // database.
22853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {
22863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sql::Connection connection;
22873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
22883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
22893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Check version.
22913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
22923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // New columns should have been created.
22943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("keywords", "new_tab_url"));
22953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
22963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that for a version 54 database,
2299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//   (a) The street_address, dependent_locality, and sorting_code columns are
2300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//       added to the autofill_profiles table schema.
2301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//   (b) The address_line1, address_line2, and country columns are dropped from
2302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//       the autofill_profiles table schema.
2303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//   (c) The type column is dropped from the autofill_profile_phones schema.
2304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion53ToCurrent) {
2305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_53.sql")));
2306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 53 of the
2308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // database.
2309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
2310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Connection connection;
2311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line_1"));
2315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line_2"));
2317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country"));
2318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "street_address"));
2320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "dependent_locality"));
2322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "sorting_code"));
2324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "type"));
2325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DoMigration();
2328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // database.
2331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
2332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Connection connection;
2333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Check version.
2337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Columns should have been added and removed appropriately.
2340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line1"));
2342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(
2343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "address_line2"));
2344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "country"));
2345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "street_address"));
2347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "dependent_locality"));
2349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(
2350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.DoesColumnExist("autofill_profiles", "sorting_code"));
2351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill_profile_phones", "type"));
2352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Data should have been preserved.
2354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Statement s_profiles(
2355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.GetUniqueStatement(
2356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, company_name, street_address, dependent_locality,"
2357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " city, state, zipcode, sorting_code, country_code, date_modified,"
2358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            " origin "
2359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "FROM autofill_profiles"));
2360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Address lines 1 and 2.
2362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001",
2364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Google, Inc."), s_profiles.ColumnString16(1));
2366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1950 Charleston Rd.\n"
2367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "(2nd floor)"),
2368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString16(2));
2369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Mountain View"), s_profiles.ColumnString16(4));
2371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CA"), s_profiles.ColumnString16(5));
2372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94043"), s_profiles.ColumnString16(6));
2373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8));
2375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046731, s_profiles.ColumnInt(9));
2376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Only address line 1.
2379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002",
2381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Google!"), s_profiles.ColumnString16(1));
2383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1600 Amphitheatre Pkwy."),
2384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString16(2));
2385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Mtn. View"), s_profiles.ColumnString16(4));
2387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("California"), s_profiles.ColumnString16(5));
2388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("94043-1234"), s_profiles.ColumnString16(6));
2389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8));
2391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046800, s_profiles.ColumnInt(9));
2392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Only address line 2.
2395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003",
2397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(1));
2399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("\nOnly line 2???"), s_profiles.ColumnString16(2));
2400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(4));
2402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(5));
2403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(6));
2404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(8));
2406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046834, s_profiles.ColumnInt(9));
2407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // No address lines.
2410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_profiles.Step());
2411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004",
2412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              s_profiles.ColumnString(0));
2413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(1));
2414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(2));
2415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(4));
2417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Texas"), s_profiles.ColumnString16(5));
2418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(6));
2419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(8));
2421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1386046847, s_profiles.ColumnInt(9));
2422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // That should be it.
2425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(s_profiles.Step());
2426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Verify the phone number data as well.
2428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sql::Statement s_phones(
2429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        connection.GetUniqueStatement(
2430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "SELECT guid, number FROM autofill_profile_phones"));
2431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s_phones.ColumnString(0));
2434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("1.800.555.1234"), s_phones.ColumnString16(1));
2435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000001", s_phones.ColumnString(0));
2438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("+1 (800) 555-4321"), s_phones.ColumnString16(1));
2439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000002", s_phones.ColumnString(0));
2442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_phones.ColumnString16(1));
2443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000003", s_phones.ColumnString(0));
2446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("6505557890"), s_phones.ColumnString16(1));
2447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(s_phones.Step());
2449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("00000000-0000-0000-0000-000000000004", s_phones.ColumnString(0));
2450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(base::string16(), s_phones.ColumnString16(1));
2451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(s_phones.Step());
2453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that migrating from version 54 to version 55 drops the autofill_dates
2457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// table, and merges the appropriate dates into the autofill table.
2458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(WebDatabaseMigrationTest, MigrateVersion54ToCurrent) {
2459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_54.sql")));
2460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify pre-conditions.  These are expectations for version 54 of the
2462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // database.
2463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
2464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
2465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(connection.DoesTableExist("autofill_dates"));
2468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill", "date_created"));
2469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesColumnExist("autofill", "date_last_used"));
2470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Verify the incoming data.
2472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_autofill(connection.GetUniqueStatement(
2473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT name, value, value_lower, pair_id, count FROM autofill"));
2474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s_dates(connection.GetUniqueStatement(
2475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "SELECT pair_id, date_created FROM autofill_dates"));
2476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with one timestamp.
2478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
2480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s_autofill.ColumnString16(1));
2481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2));
2482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_autofill.ColumnInt(3));
2483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
2484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(10, s_dates.ColumnInt(0));
2486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s_dates.ColumnInt64(1));
2487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Another entry with one timestamp, differing from the previous one in case
2489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // only.
2490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s_autofill.ColumnString16(0));
2492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(1));
2493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s_autofill.ColumnString16(2));
2494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_autofill.ColumnInt(3));
2495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s_autofill.ColumnInt(4));
2496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(11, s_dates.ColumnInt(0));
2498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s_dates.ColumnInt64(1));
2499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with two timestamps (with count > 2; this is realistic).
2501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
2503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(1));
2504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s_autofill.ColumnString16(2));
2505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_autofill.ColumnInt(3));
2506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s_autofill.ColumnInt(4));
2507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
2509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s_dates.ColumnInt64(1));
2510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(20, s_dates.ColumnInt(0));
2512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s_dates.ColumnInt64(1));
2513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // An entry with more than two timestamps, which are stored out of order.
2515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_autofill.Step());
2516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s_autofill.ColumnString16(0));
2517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"),
2518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              s_autofill.ColumnString16(1));
2519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"),
2520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              s_autofill.ColumnString16(2));
2521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_autofill.ColumnInt(3));
2522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4, s_autofill.ColumnInt(4));
2523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299401, s_dates.ColumnInt64(1));
2526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299400, s_dates.ColumnInt64(1));
2529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299403, s_dates.ColumnInt64(1));
2532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s_dates.Step());
2533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(21, s_dates.ColumnInt(0));
2534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299402, s_dates.ColumnInt64(1));
2535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
2537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_autofill.Step());
2538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s_dates.Step());
2539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoMigration();
2542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify post-conditions.  These are expectations for current version of the
2544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // database.
2545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
2546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Connection connection;
2547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Check version.
2551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The autofill_dates table should have been dropped, and its columns should
2554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // have been migrated to the autofill table.
2555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(connection.DoesTableExist("autofill_dates"));
2556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill", "date_created"));
2557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(connection.DoesColumnExist("autofill", "date_last_used"));
2558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Data should have been preserved.  Note that it appears out of order
2560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // relative to the previous table, as it's been alphabetized.  That's ok.
2561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sql::Statement s(
2562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        connection.GetUniqueStatement(
2563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "SELECT name, value, value_lower, date_created, date_last_used,"
2564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            " count "
2565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "FROM autofill "
2566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            "ORDER BY name, value ASC"));
2567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "jane.doe@example.org": Timestamps should be parsed correctly, and only
2569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // the first and last should be kept.
2570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0));
2572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"), s.ColumnString16(1));
2573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane.doe@example.org"), s.ColumnString16(2));
2574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299400, s.ColumnInt64(3));
2575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299403, s.ColumnInt64(4));
2576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4, s.ColumnInt(5));
2577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "jane@example.com": Timestamps should be parsed correctly.
2579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Email"), s.ColumnString16(0));
2581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(1));
2582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("jane@example.com"), s.ColumnString16(2));
2583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299300, s.ColumnInt64(3));
2584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299301, s.ColumnInt64(4));
2585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3, s.ColumnInt(5));
2586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "John Doe": The single timestamp should be assigned as both the creation
2588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // and the last use timestamp.
2589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0));
2591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("John Doe"), s.ColumnString16(1));
2592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2));
2593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(3));
2594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299100, s.ColumnInt64(4));
2595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s.ColumnInt(5));
2596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // "john doe": Should not be merged with "John Doe" (case-sensitivity).
2598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(s.Step());
2599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Name"), s.ColumnString16(0));
2600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(1));
2601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("john doe"), s.ColumnString16(2));
2602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s.ColumnInt64(3));
2603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1384299200, s.ColumnInt64(4));
2604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1, s.ColumnInt(5));
2605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // No more entries expected.
2607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(s.Step());
2608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2610a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Tests that migrating from version 55 to version 56 adds the language_code
2612a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// column to autofill_profiles table.
2613a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(WebDatabaseMigrationTest, MigrateVersion55ToCurrent) {
2614a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_55.sql")));
2615a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2616a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Verify pre-conditions. These are expectations for version 55 of the
2617a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // database.
2618a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  {
2619a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    sql::Connection connection;
2620a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2621a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2622a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2623a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_FALSE(
2624a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        connection.DoesColumnExist("autofill_profiles", "language_code"));
2625a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
2626a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2627a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DoMigration();
2628a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2629a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Verify post-conditions. These are expectations for current version of the
2630a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // database.
2631a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  {
2632a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    sql::Connection connection;
2633a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(connection.Open(GetDatabasePath()));
2634a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
2635a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2636a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Check version.
2637a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
2638a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2639a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // The language_code column should have been added to autofill_profiles
2640a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // table.
2641a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_TRUE(
2642a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        connection.DoesColumnExist("autofill_profiles", "language_code"));
2643a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2644a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Data should have been preserved. Language code should have been set to
2645a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // empty string.
2646a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    sql::Statement s_profiles(
2647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        connection.GetUniqueStatement(
2648a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            "SELECT guid, company_name, street_address, dependent_locality,"
2649a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            " city, state, zipcode, sorting_code, country_code, date_modified,"
2650a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            " origin, language_code "
2651a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            "FROM autofill_profiles"));
2652a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2653a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(s_profiles.Step());
2654a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ("00000000-0000-0000-0000-000000000001",
2655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              s_profiles.ColumnString(0));
2656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("Google Inc"), s_profiles.ColumnString16(1));
2657a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("340 Main St"),
2658a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              s_profiles.ColumnString16(2));
2659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(3));
2660a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("Los Angeles"), s_profiles.ColumnString16(4));
2661a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("CA"), s_profiles.ColumnString16(5));
2662a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("90291"), s_profiles.ColumnString16(6));
2663a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(base::string16(), s_profiles.ColumnString16(7));
2664a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("US"), s_profiles.ColumnString16(8));
2665a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(1395948829, s_profiles.ColumnInt(9));
2666a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(ASCIIToUTF16("Chrome settings"), s_profiles.ColumnString16(10));
2667a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(std::string(), s_profiles.ColumnString(11));
2668a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2669a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // No more entries expected.
2670a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_FALSE(s_profiles.Step());
2671a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
2672a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
2673