diff options
author | andybons@chromium.org <andybons@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-01 13:34:53 +0000 |
---|---|---|
committer | andybons@chromium.org <andybons@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-01 13:34:53 +0000 |
commit | 9268173603c6ee2b9292fe53017fd27a444307b6 (patch) | |
tree | 400fbb906d2a2f7f264261c2ad2873a61ffda1db /chrome/browser/webdata/web_database_unittest.cc | |
parent | 0414411f67979897882bbad4f7b5f218c30c1f76 (diff) | |
download | chromium_src-9268173603c6ee2b9292fe53017fd27a444307b6.zip chromium_src-9268173603c6ee2b9292fe53017fd27a444307b6.tar.gz chromium_src-9268173603c6ee2b9292fe53017fd27a444307b6.tar.bz2 |
Split out the rest of the tables within WebDatabase.
Logins, WebApps and TokenService
BUG=none
TEST=WebDatabaseMigrationTest,LoginsTableTest,WebAppsTableTest,TokenServiceTableTest
Review URL: http://codereview.chromium.org/6670122
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80150 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/webdata/web_database_unittest.cc')
-rw-r--r-- | chrome/browser/webdata/web_database_unittest.cc | 1893 |
1 files changed, 0 insertions, 1893 deletions
diff --git a/chrome/browser/webdata/web_database_unittest.cc b/chrome/browser/webdata/web_database_unittest.cc deleted file mode 100644 index 9939284..0000000 --- a/chrome/browser/webdata/web_database_unittest.cc +++ /dev/null @@ -1,1893 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <list> -#include <map> -#include <set> -#include <string> -#include <utility> -#include <vector> - -#include "app/sql/statement.h" -#include "base/file_util.h" -#include "base/memory/scoped_temp_dir.h" -#include "base/path_service.h" -#include "base/stl_util-inl.h" -#include "base/string16.h" -#include "base/string_number_conversions.h" -#include "base/time.h" -#include "base/utf_string_conversions.h" -#include "base/values.h" -#include "chrome/browser/autofill/autofill_profile.h" -#include "chrome/browser/autofill/autofill_type.h" -#include "chrome/browser/autofill/credit_card.h" -#include "chrome/browser/password_manager/encryptor.h" -#include "chrome/browser/webdata/autofill_change.h" -#include "chrome/browser/webdata/autofill_entry.h" -#include "chrome/browser/webdata/web_database.h" -#include "chrome/common/chrome_paths.h" -#include "chrome/common/guid.h" -#include "chrome/test/ui_test_utils.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "webkit/glue/password_form.h" - -using base::Time; -using base::TimeDelta; -using webkit_glue::PasswordForm; - -namespace { - -void AutofillProfile31FromStatement(const sql::Statement& s, - AutofillProfile* profile, - string16* label, - int* unique_id, - int64* date_modified) { - DCHECK(profile); - DCHECK(label); - DCHECK(unique_id); - DCHECK(date_modified); - *label = s.ColumnString16(0); - *unique_id = s.ColumnInt(1); - profile->SetInfo(NAME_FIRST, s.ColumnString16(2)); - profile->SetInfo(NAME_MIDDLE, s.ColumnString16(3)); - profile->SetInfo(NAME_LAST,s.ColumnString16(4)); - profile->SetInfo(EMAIL_ADDRESS, s.ColumnString16(5)); - profile->SetInfo(COMPANY_NAME, s.ColumnString16(6)); - profile->SetInfo(ADDRESS_HOME_LINE1, s.ColumnString16(7)); - profile->SetInfo(ADDRESS_HOME_LINE2, s.ColumnString16(8)); - profile->SetInfo(ADDRESS_HOME_CITY, s.ColumnString16(9)); - profile->SetInfo(ADDRESS_HOME_STATE, s.ColumnString16(10)); - profile->SetInfo(ADDRESS_HOME_ZIP, s.ColumnString16(11)); - profile->SetInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(12)); - profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(13)); - profile->SetInfo(PHONE_FAX_WHOLE_NUMBER, s.ColumnString16(14)); - *date_modified = s.ColumnInt64(15); - profile->set_guid(s.ColumnString(16)); - EXPECT_TRUE(guid::IsValidGUID(profile->guid())); -} - -void AutofillProfile32FromStatement(const sql::Statement& s, - AutofillProfile* profile, - string16* label, - int64* date_modified) { - DCHECK(profile); - DCHECK(label); - DCHECK(date_modified); - profile->set_guid(s.ColumnString(0)); - EXPECT_TRUE(guid::IsValidGUID(profile->guid())); - *label = s.ColumnString16(1); - profile->SetInfo(NAME_FIRST, s.ColumnString16(2)); - profile->SetInfo(NAME_MIDDLE, s.ColumnString16(3)); - profile->SetInfo(NAME_LAST,s.ColumnString16(4)); - profile->SetInfo(EMAIL_ADDRESS, s.ColumnString16(5)); - profile->SetInfo(COMPANY_NAME, s.ColumnString16(6)); - profile->SetInfo(ADDRESS_HOME_LINE1, s.ColumnString16(7)); - profile->SetInfo(ADDRESS_HOME_LINE2, s.ColumnString16(8)); - profile->SetInfo(ADDRESS_HOME_CITY, s.ColumnString16(9)); - profile->SetInfo(ADDRESS_HOME_STATE, s.ColumnString16(10)); - profile->SetInfo(ADDRESS_HOME_ZIP, s.ColumnString16(11)); - profile->SetInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(12)); - profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(13)); - profile->SetInfo(PHONE_FAX_WHOLE_NUMBER, s.ColumnString16(14)); - *date_modified = s.ColumnInt64(15); -} - -void AutofillProfile33FromStatement(const sql::Statement& s, - AutofillProfile* profile, - int64* date_modified) { - DCHECK(profile); - DCHECK(date_modified); - profile->set_guid(s.ColumnString(0)); - EXPECT_TRUE(guid::IsValidGUID(profile->guid())); - profile->SetInfo(COMPANY_NAME, s.ColumnString16(1)); - profile->SetInfo(ADDRESS_HOME_LINE1, s.ColumnString16(2)); - profile->SetInfo(ADDRESS_HOME_LINE2, s.ColumnString16(3)); - profile->SetInfo(ADDRESS_HOME_CITY, s.ColumnString16(4)); - profile->SetInfo(ADDRESS_HOME_STATE, s.ColumnString16(5)); - profile->SetInfo(ADDRESS_HOME_ZIP, s.ColumnString16(6)); - profile->SetInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(7)); - *date_modified = s.ColumnInt64(8); -} - -void CreditCard31FromStatement(const sql::Statement& s, - CreditCard* credit_card, - string16* label, - int* unique_id, - std::string* encrypted_number, - int64* date_modified) { - DCHECK(credit_card); - DCHECK(label); - DCHECK(unique_id); - DCHECK(encrypted_number); - DCHECK(date_modified); - *label = s.ColumnString16(0); - *unique_id = s.ColumnInt(1); - credit_card->SetInfo(CREDIT_CARD_NAME, s.ColumnString16(2)); - credit_card->SetInfo(CREDIT_CARD_TYPE, s.ColumnString16(3)); - credit_card->SetInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(5)); - credit_card->SetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(6)); - int encrypted_number_len = s.ColumnByteLength(10); - if (encrypted_number_len) { - encrypted_number->resize(encrypted_number_len); - memcpy(&(*encrypted_number)[0], s.ColumnBlob(10), encrypted_number_len); - } - *date_modified = s.ColumnInt64(12); - credit_card->set_guid(s.ColumnString(13)); - EXPECT_TRUE(guid::IsValidGUID(credit_card->guid())); -} - -void CreditCard32FromStatement(const sql::Statement& s, - CreditCard* credit_card, - std::string* encrypted_number, - int64* date_modified) { - DCHECK(credit_card); - DCHECK(encrypted_number); - DCHECK(date_modified); - credit_card->set_guid(s.ColumnString(0)); - EXPECT_TRUE(guid::IsValidGUID(credit_card->guid())); - credit_card->SetInfo(CREDIT_CARD_NAME, s.ColumnString16(1)); - credit_card->SetInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(2)); - credit_card->SetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(3)); - int encrypted_number_len = s.ColumnByteLength(4); - if (encrypted_number_len) { - encrypted_number->resize(encrypted_number_len); - memcpy(&(*encrypted_number)[0], s.ColumnBlob(4), encrypted_number_len); - } - *date_modified = s.ColumnInt64(5); -} - -} // anonymous namespace - -class WebDatabaseTest : public testing::Test { - public: - WebDatabaseTest() {} - virtual ~WebDatabaseTest() {} - - protected: - virtual void SetUp() { -#if defined(OS_MACOSX) - Encryptor::UseMockKeychain(true); -#endif - PathService::Get(chrome::DIR_TEST_DATA, &file_); - const std::string test_db = "TestWebDatabase" + - base::Int64ToString(Time::Now().ToTimeT()) + - ".db"; - file_ = file_.AppendASCII(test_db); - file_util::Delete(file_, false); - } - - virtual void TearDown() { - file_util::Delete(file_, false); - } - - FilePath file_; - - private: - DISALLOW_COPY_AND_ASSIGN(WebDatabaseTest); -}; - -TEST_F(WebDatabaseTest, Logins) { - WebDatabase db; - - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - - std::vector<PasswordForm*> result; - - // Verify the database is empty. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(0U, result.size()); - - // Example password form. - PasswordForm form; - form.origin = GURL("http://www.google.com/accounts/LoginAuth"); - form.action = GURL("http://www.google.com/accounts/Login"); - form.username_element = ASCIIToUTF16("Email"); - form.username_value = ASCIIToUTF16("test@gmail.com"); - form.password_element = ASCIIToUTF16("Passwd"); - form.password_value = ASCIIToUTF16("test"); - form.submit_element = ASCIIToUTF16("signIn"); - form.signon_realm = "http://www.google.com/"; - form.ssl_valid = false; - form.preferred = false; - form.scheme = PasswordForm::SCHEME_HTML; - - // Add it and make sure it is there. - EXPECT_TRUE(db.AddLogin(form)); - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // Match against an exact copy. - EXPECT_TRUE(db.GetLogins(form, &result)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // The example site changes... - PasswordForm form2(form); - form2.origin = GURL("http://www.google.com/new/accounts/LoginAuth"); - form2.submit_element = ASCIIToUTF16("reallySignIn"); - - // Match against an inexact copy - EXPECT_TRUE(db.GetLogins(form2, &result)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // Uh oh, the site changed origin & action URL's all at once! - PasswordForm form3(form2); - form3.action = GURL("http://www.google.com/new/accounts/Login"); - - // signon_realm is the same, should match. - EXPECT_TRUE(db.GetLogins(form3, &result)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // Imagine the site moves to a secure server for login. - PasswordForm form4(form3); - form4.signon_realm = "https://www.google.com/"; - form4.ssl_valid = true; - - // We have only an http record, so no match for this. - EXPECT_TRUE(db.GetLogins(form4, &result)); - EXPECT_EQ(0U, result.size()); - - // Let's imagine the user logs into the secure site. - EXPECT_TRUE(db.AddLogin(form4)); - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(2U, result.size()); - delete result[0]; - delete result[1]; - result.clear(); - - // Now the match works - EXPECT_TRUE(db.GetLogins(form4, &result)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // The user chose to forget the original but not the new. - EXPECT_TRUE(db.RemoveLogin(form)); - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // The old form wont match the new site (http vs https). - EXPECT_TRUE(db.GetLogins(form, &result)); - EXPECT_EQ(0U, result.size()); - - // The user's request for the HTTPS site is intercepted - // by an attacker who presents an invalid SSL cert. - PasswordForm form5(form4); - form5.ssl_valid = 0; - - // It will match in this case. - EXPECT_TRUE(db.GetLogins(form5, &result)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - - // User changes his password. - PasswordForm form6(form5); - form6.password_value = ASCIIToUTF16("test6"); - form6.preferred = true; - - // We update, and check to make sure it matches the - // old form, and there is only one record. - EXPECT_TRUE(db.UpdateLogin(form6)); - // matches - EXPECT_TRUE(db.GetLogins(form5, &result)); - EXPECT_EQ(1U, result.size()); - delete result[0]; - result.clear(); - // Only one record. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(1U, result.size()); - // password element was updated. - EXPECT_EQ(form6.password_value, result[0]->password_value); - // Preferred login. - EXPECT_TRUE(form6.preferred); - delete result[0]; - result.clear(); - - // Make sure everything can disappear. - EXPECT_TRUE(db.RemoveLogin(form4)); - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(0U, result.size()); -} - -static bool AddTimestampedLogin(WebDatabase* db, std::string url, - const std::string& unique_string, - const Time& time) { - // Example password form. - PasswordForm form; - form.origin = GURL(url + std::string("/LoginAuth")); - form.username_element = ASCIIToUTF16(unique_string); - form.username_value = ASCIIToUTF16(unique_string); - form.password_element = ASCIIToUTF16(unique_string); - form.submit_element = ASCIIToUTF16("signIn"); - form.signon_realm = url; - form.date_created = time; - return db->AddLogin(form); -} - -static void ClearResults(std::vector<PasswordForm*>* results) { - for (size_t i = 0; i < results->size(); ++i) { - delete (*results)[i]; - } - results->clear(); -} - -TEST_F(WebDatabaseTest, ClearPrivateData_SavedPasswords) { - WebDatabase db; - - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - - std::vector<PasswordForm*> result; - - // Verify the database is empty. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(0U, result.size()); - - Time now = Time::Now(); - TimeDelta one_day = TimeDelta::FromDays(1); - - // Create one with a 0 time. - EXPECT_TRUE(AddTimestampedLogin(&db, "1", "foo1", Time())); - // Create one for now and +/- 1 day. - EXPECT_TRUE(AddTimestampedLogin(&db, "2", "foo2", now - one_day)); - EXPECT_TRUE(AddTimestampedLogin(&db, "3", "foo3", now)); - EXPECT_TRUE(AddTimestampedLogin(&db, "4", "foo4", now + one_day)); - - // Verify inserts worked. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(4U, result.size()); - ClearResults(&result); - - // Delete everything from today's date and on. - db.RemoveLoginsCreatedBetween(now, Time()); - - // Should have deleted half of what we inserted. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(2U, result.size()); - ClearResults(&result); - - // Delete with 0 date (should delete all). - db.RemoveLoginsCreatedBetween(Time(), Time()); - - // Verify nothing is left. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(0U, result.size()); -} - -TEST_F(WebDatabaseTest, BlacklistedLogins) { - WebDatabase db; - - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - std::vector<PasswordForm*> result; - - // Verify the database is empty. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - ASSERT_EQ(0U, result.size()); - - // Save a form as blacklisted. - PasswordForm form; - form.origin = GURL("http://www.google.com/accounts/LoginAuth"); - form.action = GURL("http://www.google.com/accounts/Login"); - form.username_element = ASCIIToUTF16("Email"); - form.password_element = ASCIIToUTF16("Passwd"); - form.submit_element = ASCIIToUTF16("signIn"); - form.signon_realm = "http://www.google.com/"; - form.ssl_valid = false; - form.preferred = true; - form.blacklisted_by_user = true; - form.scheme = PasswordForm::SCHEME_HTML; - EXPECT_TRUE(db.AddLogin(form)); - - // Get all non-blacklisted logins (should be none). - EXPECT_TRUE(db.GetAllLogins(&result, false)); - ASSERT_EQ(0U, result.size()); - - // GetLogins should give the blacklisted result. - EXPECT_TRUE(db.GetLogins(form, &result)); - EXPECT_EQ(1U, result.size()); - ClearResults(&result); - - // So should GetAll including blacklisted. - EXPECT_TRUE(db.GetAllLogins(&result, true)); - EXPECT_EQ(1U, result.size()); - ClearResults(&result); -} - -TEST_F(WebDatabaseTest, WebAppHasAllImages) { - WebDatabase db; - - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - GURL url("http://google.com/"); - - // Initial value for unknown web app should be false. - EXPECT_FALSE(db.GetWebAppHasAllImages(url)); - - // Set the value and make sure it took. - EXPECT_TRUE(db.SetWebAppHasAllImages(url, true)); - EXPECT_TRUE(db.GetWebAppHasAllImages(url)); - - // Remove the app and make sure value reverts to default. - EXPECT_TRUE(db.RemoveWebApp(url)); - EXPECT_FALSE(db.GetWebAppHasAllImages(url)); -} - -TEST_F(WebDatabaseTest, WebAppImages) { - WebDatabase db; - - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - GURL url("http://google.com/"); - - // Web app should initially have no images. - std::vector<SkBitmap> images; - ASSERT_TRUE(db.GetWebAppImages(url, &images)); - ASSERT_EQ(0U, images.size()); - - // Add an image. - SkBitmap image; - image.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); - image.allocPixels(); - image.eraseColor(SK_ColorBLACK); - ASSERT_TRUE(db.SetWebAppImage(url, image)); - - // Make sure we get the image back. - ASSERT_TRUE(db.GetWebAppImages(url, &images)); - ASSERT_EQ(1U, images.size()); - ASSERT_EQ(16, images[0].width()); - ASSERT_EQ(16, images[0].height()); - - // Add another 16x16 image and make sure it replaces the original. - image.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); - image.allocPixels(); - image.eraseColor(SK_ColorBLACK); - - // Set some random pixels so that we can identify the image. We don't use - // transparent images because of pre-multiplication rounding errors. - SkColor test_pixel_1 = 0xffccbbaa; - SkColor test_pixel_2 = 0xffaabbaa; - SkColor test_pixel_3 = 0xff339966; - image.getAddr32(0, 1)[0] = test_pixel_1; - image.getAddr32(0, 1)[1] = test_pixel_2; - image.getAddr32(0, 1)[2] = test_pixel_3; - - ASSERT_TRUE(db.SetWebAppImage(url, image)); - images.clear(); - ASSERT_TRUE(db.GetWebAppImages(url, &images)); - ASSERT_EQ(1U, images.size()); - ASSERT_EQ(16, images[0].width()); - ASSERT_EQ(16, images[0].height()); - images[0].lockPixels(); - ASSERT_TRUE(images[0].getPixels() != NULL); - ASSERT_EQ(test_pixel_1, images[0].getAddr32(0, 1)[0]); - ASSERT_EQ(test_pixel_2, images[0].getAddr32(0, 1)[1]); - ASSERT_EQ(test_pixel_3, images[0].getAddr32(0, 1)[2]); - images[0].unlockPixels(); - - // Add another image at a bigger size. - image.setConfig(SkBitmap::kARGB_8888_Config, 32, 32); - image.allocPixels(); - image.eraseColor(SK_ColorBLACK); - ASSERT_TRUE(db.SetWebAppImage(url, image)); - - // Make sure we get both images back. - images.clear(); - ASSERT_TRUE(db.GetWebAppImages(url, &images)); - ASSERT_EQ(2U, images.size()); - if (images[0].width() == 16) { - ASSERT_EQ(16, images[0].width()); - ASSERT_EQ(16, images[0].height()); - ASSERT_EQ(32, images[1].width()); - ASSERT_EQ(32, images[1].height()); - } else { - ASSERT_EQ(32, images[0].width()); - ASSERT_EQ(32, images[0].height()); - ASSERT_EQ(16, images[1].width()); - ASSERT_EQ(16, images[1].height()); - } -} - -TEST_F(WebDatabaseTest, TokenServiceGetAllRemoveAll) { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - - std::map<std::string, std::string> out_map; - std::string service; - std::string service2; - service = "testservice"; - service2 = "othertestservice"; - - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_TRUE(out_map.empty()); - - // Check that get all tokens works - EXPECT_TRUE(db.SetTokenForService(service, "pepperoni")); - EXPECT_TRUE(db.SetTokenForService(service2, "steak")); - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_EQ(out_map.find(service)->second, "pepperoni"); - EXPECT_EQ(out_map.find(service2)->second, "steak"); - out_map.clear(); - - // Purge - EXPECT_TRUE(db.RemoveAllTokens()); - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_TRUE(out_map.empty()); - - // Check that you can still add it back in - EXPECT_TRUE(db.SetTokenForService(service, "cheese")); - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_EQ(out_map.find(service)->second, "cheese"); -} - -TEST_F(WebDatabaseTest, TokenServiceGetSet) { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(file_)); - - std::map<std::string, std::string> out_map; - std::string service; - service = "testservice"; - - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_TRUE(out_map.empty()); - - EXPECT_TRUE(db.SetTokenForService(service, "pepperoni")); - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_EQ(out_map.find(service)->second, "pepperoni"); - out_map.clear(); - - // try blanking it - won't remove it from the db though! - EXPECT_TRUE(db.SetTokenForService(service, "")); - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_EQ(out_map.find(service)->second, ""); - out_map.clear(); - - // try mutating it - EXPECT_TRUE(db.SetTokenForService(service, "ham")); - EXPECT_TRUE(db.GetAllTokens(&out_map)); - EXPECT_EQ(out_map.find(service)->second, "ham"); -} - -// The WebDatabaseMigrationTest encapsulates testing of database migrations. -// Specifically, these tests are intended to exercise any schema changes in -// the WebDatabase and data migrations that occur in -// |WebDatabase::MigrateOldVersionsAsNeeded()|. -class WebDatabaseMigrationTest : public testing::Test { - public: - WebDatabaseMigrationTest() {} - virtual ~WebDatabaseMigrationTest() {} - - virtual void SetUp() { - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - } - - protected: - // Current tested version number. When adding a migration in - // |WebDatabase::MigrateOldVersionsAsNeeded()| and changing the version number - // |kCurrentVersionNumber| this value should change to reflect the new version - // number and a new migration test added below. - static const int kCurrentTestedVersionNumber; - - FilePath GetDatabasePath() { - const FilePath::CharType kWebDatabaseFilename[] = - FILE_PATH_LITERAL("TestWebDatabase.sqlite3"); - return temp_dir_.path().Append(FilePath(kWebDatabaseFilename)); - } - - // The textual contents of |file| are read from - // "chrome/test/data/web_database" and returned in the string |contents|. - // Returns true if the file exists and is read successfully, false otherwise. - bool GetWebDatabaseData(const FilePath& file, std::string* contents) { - FilePath path = ui_test_utils::GetTestFilePath( - FilePath(FILE_PATH_LITERAL("web_database")), file); - return file_util::PathExists(path) && - file_util::ReadFileToString(path, contents); - } - - static int VersionFromConnection(sql::Connection* connection) { - // Get version. - sql::Statement s(connection->GetUniqueStatement( - "SELECT value FROM meta WHERE key='version'")); - if (!s.Step()) - return 0; - return s.ColumnInt(0); - } - - // The sql files located in "chrome/test/data/web_database" were generated by - // launching the Chromium application prior to schema change, then using the - // sqlite3 command-line application to dump the contents of the "Web Data" - // database. - // Like this: - // > .output version_nn.sql - // > .dump - void LoadDatabase(const FilePath::StringType& file); - - // Assertion testing for migrating from version 27 and 28. - void MigrateVersion28Assertions(); - - private: - ScopedTempDir temp_dir_; - - DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest); -}; - -const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 36; - -void WebDatabaseMigrationTest::LoadDatabase(const FilePath::StringType& file) { - std::string contents; - ASSERT_TRUE(GetWebDatabaseData(FilePath(file), &contents)); - - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - ASSERT_TRUE(connection.Execute(contents.data())); -} - -void WebDatabaseMigrationTest::MigrateVersion28Assertions() { - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // Make sure supports_instant was dropped and instant_url was added. - EXPECT_FALSE(connection.DoesColumnExist("keywords", "supports_instant")); - EXPECT_TRUE(connection.DoesColumnExist("keywords", "instant_url")); - - // Check that instant_url is empty. - std::string stmt = "SELECT instant_url FROM keywords"; - sql::Statement s(connection.GetUniqueStatement(stmt.c_str())); - ASSERT_TRUE(s.Step()); - EXPECT_EQ(std::string(), s.ColumnString(0)); - - // Verify the data made it over. - stmt = "SELECT id, short_name, keyword, favicon_url, url, " - "show_in_default_list, safe_for_autoreplace, originating_url, " - "date_created, usage_count, input_encodings, suggest_url, " - "prepopulate_id, autogenerate_keyword, logo_id, created_by_policy, " - "instant_url FROM keywords"; - sql::Statement s2(connection.GetUniqueStatement(stmt.c_str())); - ASSERT_TRUE(s2.Step()); - EXPECT_EQ(2, s2.ColumnInt(0)); - EXPECT_EQ("Google", s2.ColumnString(1)); - EXPECT_EQ("google.com", s2.ColumnString(2)); - EXPECT_EQ("http://www.google.com/favicon.ico", s2.ColumnString(3)); - EXPECT_EQ("{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"\ - "{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}"\ - "&q={searchTerms}", - s2.ColumnString(4)); - EXPECT_EQ(1, s2.ColumnInt(5)); - EXPECT_EQ(1, s2.ColumnInt(6)); - EXPECT_EQ(std::string(), s2.ColumnString(7)); - EXPECT_EQ(0, s2.ColumnInt(8)); - EXPECT_EQ(0, s2.ColumnInt(9)); - EXPECT_EQ(std::string("UTF-8"), s2.ColumnString(10)); - EXPECT_EQ(std::string("{google:baseSuggestURL}search?client=chrome&hl=" - "{language}&q={searchTerms}"), s2.ColumnString(11)); - EXPECT_EQ(1, s2.ColumnInt(12)); - EXPECT_EQ(1, s2.ColumnInt(13)); - EXPECT_EQ(6245, s2.ColumnInt(14)); - EXPECT_EQ(0, s2.ColumnInt(15)); - EXPECT_EQ(0, s2.ColumnInt(16)); - EXPECT_EQ(std::string(), s2.ColumnString(17)); - } -} - -// Tests that the all migrations from an empty database succeed. -TEST_F(WebDatabaseMigrationTest, MigrateEmptyToCurrent) { - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // Check that expected tables are present. - EXPECT_TRUE(connection.DoesTableExist("meta")); - EXPECT_TRUE(connection.DoesTableExist("keywords")); - EXPECT_TRUE(connection.DoesTableExist("logins")); - EXPECT_TRUE(connection.DoesTableExist("web_app_icons")); - EXPECT_TRUE(connection.DoesTableExist("web_apps")); - EXPECT_TRUE(connection.DoesTableExist("autofill")); - EXPECT_TRUE(connection.DoesTableExist("autofill_dates")); - EXPECT_TRUE(connection.DoesTableExist("autofill_profiles")); - EXPECT_TRUE(connection.DoesTableExist("credit_cards")); - EXPECT_TRUE(connection.DoesTableExist("token_service")); - } -} - -// Tests that the |credit_card| table gets added to the schema for a version 22 -// database. -TEST_F(WebDatabaseMigrationTest, MigrateVersion22ToCurrent) { - // This schema is taken from a build prior to the addition of the - // |credit_card| table. Version 22 of the schema. Contrast this with the - // corrupt version below. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_22.sql"))); - - // Verify pre-conditions. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // No |credit_card| table prior to version 23. - ASSERT_FALSE(connection.DoesColumnExist("credit_cards", "guid")); - ASSERT_FALSE( - connection.DoesColumnExist("credit_cards", "card_number_encrypted")); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // |credit_card| table now exists. - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); - EXPECT_TRUE( - connection.DoesColumnExist("credit_cards", "card_number_encrypted")); - } -} - -// Tests that the |credit_card| table gets added to the schema for a corrupt -// version 22 database. The corruption is that the |credit_cards| table exists -// but the schema version number was not set correctly to 23 or later. This -// test exercises code introduced to fix bug http://crbug.com/50699 that -// resulted from the corruption. -TEST_F(WebDatabaseMigrationTest, MigrateVersion22CorruptedToCurrent) { - // This schema is taken from a build after the addition of the |credit_card| - // table. Due to a bug in the migration logic the version is set incorrectly - // to 22 (it should have been updated to 23 at least). - ASSERT_NO_FATAL_FAILURE( - LoadDatabase(FILE_PATH_LITERAL("version_22_corrupt.sql"))); - - // Verify pre-conditions. These are expectations for corrupt version 22 of - // the database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Columns existing and not existing before current version. - ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id")); - ASSERT_TRUE( - connection.DoesColumnExist("credit_cards", "card_number_encrypted")); - ASSERT_TRUE(connection.DoesColumnExist("keywords", "id")); - ASSERT_FALSE(connection.DoesColumnExist("keywords", "logo_id")); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - - // Columns existing and not existing before version 25. - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); - EXPECT_TRUE( - connection.DoesColumnExist("credit_cards", "card_number_encrypted")); - EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); - EXPECT_TRUE(connection.DoesColumnExist("keywords", "logo_id")); - } -} - -// Tests that the |keywords| |logo_id| column gets added to the schema for a -// version 24 database. -TEST_F(WebDatabaseMigrationTest, MigrateVersion24ToCurrent) { - // This schema is taken from a build prior to the addition of the |keywords| - // |logo_id| column. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_24.sql"))); - - // Verify pre-conditions. These are expectations for version 24 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Columns existing and not existing before current version. - ASSERT_TRUE(connection.DoesColumnExist("keywords", "id")); - ASSERT_FALSE(connection.DoesColumnExist("keywords", "logo_id")); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // |keywords| |logo_id| column should have been added. - EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); - EXPECT_TRUE(connection.DoesColumnExist("keywords", "logo_id")); - } -} - -// Tests that the |keywords| |created_by_policy| column gets added to the schema -// for a version 25 database. -TEST_F(WebDatabaseMigrationTest, MigrateVersion25ToCurrent) { - // This schema is taken from a build prior to the addition of the |keywords| - // |created_by_policy| column. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_25.sql"))); - - // Verify pre-conditions. These are expectations for version 25 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // |keywords| |logo_id| column should have been added. - EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); - EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy")); - } -} - -// Tests that the credit_cards.billing_address column is changed from a string -// to an int whilst preserving the associated billing address. This version of -// the test makes sure a stored label is converted to an ID. -TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringLabels) { - // This schema is taken from a build prior to the change of column type for - // credit_cards.billing_address from string to int. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql"))); - - // Verify pre-conditions. These are expectations for version 26 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Columns existing and not existing before current version. - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address")); - - std::string stmt = "INSERT INTO autofill_profiles" - "(label, unique_id, first_name, middle_name, last_name, email," - " company_name, address_line_1, address_line_2, city, state, zipcode," - " country, phone, fax)" - "VALUES ('Home',1,'','','','','','','','','','','','','')"; - sql::Statement s(connection.GetUniqueStatement(stmt.c_str())); - ASSERT_TRUE(s.Run()); - - // Insert a CC linked to an existing address. - std::string stmt2 = "INSERT INTO credit_cards" - "(label, unique_id, name_on_card, type, card_number," - " expiration_month, expiration_year, verification_code, billing_address," - " shipping_address, card_number_encrypted, verification_code_encrypted)" - "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','Home','','','')"; - sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str())); - ASSERT_TRUE(s2.Run()); - - // |billing_address| is a string. - std::string stmt3 = "SELECT billing_address FROM credit_cards"; - sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str())); - ASSERT_TRUE(s3.Step()); - EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address")); - - // Verify the credit card data is converted. - sql::Statement s(connection.GetUniqueStatement( - "SELECT guid, name_on_card, expiration_month, expiration_year, " - "card_number_encrypted, date_modified " - "FROM credit_cards")); - ASSERT_TRUE(s.Step()); - EXPECT_EQ("Jack", s.ColumnString(1)); - EXPECT_EQ(2, s.ColumnInt(2)); - EXPECT_EQ(2012, s.ColumnInt(3)); - // Column 5 is encrypted number blob. - // Column 6 is date_modified. - } -} - -// Tests that the credit_cards.billing_address column is changed from a string -// to an int whilst preserving the associated billing address. This version of -// the test makes sure a stored string ID is converted to an integer ID. -TEST_F(WebDatabaseMigrationTest, MigrateVersion26ToCurrentStringIDs) { - // This schema is taken from a build prior to the change of column type for - // credit_cards.billing_address from string to int. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_26.sql"))); - - // Verify pre-conditions. These are expectations for version 26 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address")); - - std::string stmt = "INSERT INTO autofill_profiles" - "(label, unique_id, first_name, middle_name, last_name, email," - " company_name, address_line_1, address_line_2, city, state, zipcode," - " country, phone, fax)" - "VALUES ('Home',1,'','','','','','','','','','','','','')"; - sql::Statement s(connection.GetUniqueStatement(stmt.c_str())); - ASSERT_TRUE(s.Run()); - - // Insert a CC linked to an existing address. - std::string stmt2 = "INSERT INTO credit_cards" - "(label, unique_id, name_on_card, type, card_number," - " expiration_month, expiration_year, verification_code, billing_address," - " shipping_address, card_number_encrypted, verification_code_encrypted)" - "VALUES ('label',2,'Jack','Visa','1234',2,2012,'','1','','','')"; - sql::Statement s2(connection.GetUniqueStatement(stmt2.c_str())); - ASSERT_TRUE(s2.Run()); - - // |billing_address| is a string. - std::string stmt3 = "SELECT billing_address FROM credit_cards"; - sql::Statement s3(connection.GetUniqueStatement(stmt3.c_str())); - ASSERT_TRUE(s3.Step()); - EXPECT_EQ(s3.ColumnType(0), sql::COLUMN_TYPE_TEXT); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // |keywords| |logo_id| column should have been added. - EXPECT_TRUE(connection.DoesColumnExist("keywords", "id")); - EXPECT_TRUE(connection.DoesColumnExist("keywords", "created_by_policy")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address")); - - // Verify the credit card data is converted. - sql::Statement s(connection.GetUniqueStatement( - "SELECT guid, name_on_card, expiration_month, expiration_year, " - "card_number_encrypted, date_modified " - "FROM credit_cards")); - ASSERT_TRUE(s.Step()); - EXPECT_EQ("Jack", s.ColumnString(1)); - EXPECT_EQ(2, s.ColumnInt(2)); - EXPECT_EQ(2012, s.ColumnInt(3)); - // Column 5 is encrypted credit card number blob. - // Column 6 is date_modified. - } -} - -// Tests migration from 27->current. This test is now the same as 28->current -// as the column added in 28 was nuked in 29. -TEST_F(WebDatabaseMigrationTest, MigrateVersion27ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_27.sql"))); - - // Verify pre-conditions. These are expectations for version 28 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - ASSERT_FALSE(connection.DoesColumnExist("keywords", "supports_instant")); - ASSERT_FALSE(connection.DoesColumnExist("keywords", "instant_url")); - } - - MigrateVersion28Assertions(); -} - -// Makes sure instant_url is added correctly to keywords. -TEST_F(WebDatabaseMigrationTest, MigrateVersion28ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_28.sql"))); - - // Verify pre-conditions. These are expectations for version 28 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - ASSERT_TRUE(connection.DoesColumnExist("keywords", "supports_instant")); - ASSERT_FALSE(connection.DoesColumnExist("keywords", "instant_url")); - } - - MigrateVersion28Assertions(); -} - -// Makes sure date_modified is added correctly to autofill_profiles and -// credit_cards. -TEST_F(WebDatabaseMigrationTest, MigrateVersion29ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_29.sql"))); - - // Verify pre-conditions. These are expectations for version 29 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", - "date_modified")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", - "date_modified")); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - Time pre_creation_time = Time::Now(); - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - Time post_creation_time = Time::Now(); - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // Check that the columns were created. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "date_modified")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", - "date_modified")); - - sql::Statement s_profiles(connection.GetUniqueStatement( - "SELECT date_modified FROM autofill_profiles ")); - ASSERT_TRUE(s_profiles); - while (s_profiles.Step()) { - EXPECT_GE(s_profiles.ColumnInt64(0), - pre_creation_time.ToTimeT()); - EXPECT_LE(s_profiles.ColumnInt64(0), - post_creation_time.ToTimeT()); - } - EXPECT_TRUE(s_profiles.Succeeded()); - - sql::Statement s_credit_cards(connection.GetUniqueStatement( - "SELECT date_modified FROM credit_cards ")); - ASSERT_TRUE(s_credit_cards); - while (s_credit_cards.Step()) { - EXPECT_GE(s_credit_cards.ColumnInt64(0), - pre_creation_time.ToTimeT()); - EXPECT_LE(s_credit_cards.ColumnInt64(0), - post_creation_time.ToTimeT()); - } - EXPECT_TRUE(s_credit_cards.Succeeded()); - } -} - -// Makes sure guids are added to autofill_profiles and credit_cards tables. -TEST_F(WebDatabaseMigrationTest, MigrateVersion30ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_30.sql"))); - - // Verify pre-conditions. These are expectations for version 29 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "guid")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "guid")); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - ASSERT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); - - // Check that guids are non-null, non-empty, conforms to guid format, and - // are different. - sql::Statement s( - connection.GetUniqueStatement("SELECT guid FROM autofill_profiles")); - - ASSERT_TRUE(s.Step()); - std::string guid1 = s.ColumnString(0); - EXPECT_TRUE(guid::IsValidGUID(guid1)); - - ASSERT_TRUE(s.Step()); - std::string guid2 = s.ColumnString(0); - EXPECT_TRUE(guid::IsValidGUID(guid2)); - - EXPECT_NE(guid1, guid2); - } -} - -// Removes unique IDs and make GUIDs the primary key. Also removes unused -// columns. -TEST_F(WebDatabaseMigrationTest, MigrateVersion31ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_31.sql"))); - - // Verify pre-conditions. These are expectations for version 30 of the - // database. - AutofillProfile profile; - string16 profile_label; - int profile_unique_id = 0; - int64 profile_date_modified = 0; - CreditCard credit_card; - string16 cc_label; - int cc_unique_id = 0; - std::string cc_number_encrypted; - int64 cc_date_modified = 0; - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Verify existence of columns we'll be changing. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "unique_id")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "unique_id")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "type")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "card_number")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", - "verification_code")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "billing_address")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "shipping_address")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", - "verification_code_encrypted")); - - // Fetch data in the database prior to migration. - sql::Statement s1( - connection.GetUniqueStatement( - "SELECT label, unique_id, first_name, middle_name, last_name, " - "email, company_name, address_line_1, address_line_2, city, state, " - "zipcode, country, phone, fax, date_modified, guid " - "FROM autofill_profiles")); - ASSERT_TRUE(s1.Step()); - EXPECT_NO_FATAL_FAILURE(AutofillProfile31FromStatement( - s1, &profile, &profile_label, &profile_unique_id, - &profile_date_modified)); - - sql::Statement s2( - connection.GetUniqueStatement( - "SELECT label, unique_id, name_on_card, type, card_number, " - "expiration_month, expiration_year, verification_code, " - "billing_address, shipping_address, card_number_encrypted, " - "verification_code_encrypted, date_modified, guid " - "FROM credit_cards")); - ASSERT_TRUE(s2.Step()); - EXPECT_NO_FATAL_FAILURE(CreditCard31FromStatement(s2, - &credit_card, - &cc_label, - &cc_unique_id, - &cc_number_encrypted, - &cc_date_modified)); - - EXPECT_NE(profile_unique_id, cc_unique_id); - EXPECT_NE(profile.guid(), credit_card.guid()); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // Verify existence of columns we'll be changing. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "unique_id")); - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "guid")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "unique_id")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "type")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "card_number")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", - "verification_code")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "billing_address")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", - "shipping_address")); - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", - "verification_code_encrypted")); - - // Verify data in the database after the migration. - sql::Statement s1( - connection.GetUniqueStatement( - "SELECT guid, company_name, address_line_1, address_line_2, " - "city, state, zipcode, country, date_modified " - "FROM autofill_profiles")); - ASSERT_TRUE(s1.Step()); - - AutofillProfile profile_a; - int64 profile_date_modified_a = 0; - EXPECT_NO_FATAL_FAILURE(AutofillProfile33FromStatement( - s1, &profile_a, &profile_date_modified_a)); - EXPECT_EQ(profile.guid(), profile_a.guid()); - EXPECT_EQ(profile.GetInfo(COMPANY_NAME), - profile_a.GetInfo(COMPANY_NAME)); - EXPECT_EQ(profile.GetInfo(ADDRESS_HOME_LINE1), - profile_a.GetInfo(ADDRESS_HOME_LINE1)); - EXPECT_EQ(profile.GetInfo(ADDRESS_HOME_LINE2), - profile_a.GetInfo(ADDRESS_HOME_LINE2)); - EXPECT_EQ(profile.GetInfo(ADDRESS_HOME_CITY), - profile_a.GetInfo(ADDRESS_HOME_CITY)); - EXPECT_EQ(profile.GetInfo(ADDRESS_HOME_STATE), - profile_a.GetInfo(ADDRESS_HOME_STATE)); - EXPECT_EQ(profile.GetInfo(ADDRESS_HOME_ZIP), - profile_a.GetInfo(ADDRESS_HOME_ZIP)); - EXPECT_EQ(profile.GetInfo(ADDRESS_HOME_COUNTRY), - profile_a.GetInfo(ADDRESS_HOME_COUNTRY)); - EXPECT_EQ(profile_date_modified, profile_date_modified_a); - - sql::Statement s2( - connection.GetUniqueStatement( - "SELECT guid, name_on_card, expiration_month, " - "expiration_year, card_number_encrypted, date_modified " - "FROM credit_cards")); - ASSERT_TRUE(s2.Step()); - - CreditCard credit_card_a; - string16 cc_label_a; - std::string cc_number_encrypted_a; - int64 cc_date_modified_a = 0; - EXPECT_NO_FATAL_FAILURE(CreditCard32FromStatement(s2, - &credit_card_a, - &cc_number_encrypted_a, - &cc_date_modified_a)); - EXPECT_EQ(credit_card, credit_card_a); - EXPECT_EQ(cc_label, cc_label_a); - EXPECT_EQ(cc_number_encrypted, cc_number_encrypted_a); - EXPECT_EQ(cc_date_modified, cc_date_modified_a); - } -} - -// Factor |autofill_profiles| address information separately from name, email, -// and phone. -TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_32.sql"))); - - // Verify pre-conditions. These are expectations for version 32 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Verify existence of columns we'll be changing. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "label")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "first_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "middle_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "last_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "email")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "company_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "address_line_1")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "address_line_2")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "phone")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "fax")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "date_modified")); - - EXPECT_FALSE(connection.DoesTableExist("autofill_profile_names")); - EXPECT_FALSE(connection.DoesTableExist("autofill_profile_emails")); - EXPECT_FALSE(connection.DoesTableExist("autofill_profile_phones")); - - EXPECT_TRUE(connection.DoesColumnExist("credit_cards", "label")); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - // Verify changes to columns. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "label")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "first_name")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", - "middle_name")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "last_name")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "email")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "company_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "address_line_1")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "address_line_2")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "city")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "state")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "zipcode")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", "country")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "phone")); - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", "fax")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "date_modified")); - - // New "names" table. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", "guid")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", - "first_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", - "middle_name")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_names", - "last_name")); - - // New "emails" table. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "guid")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_emails", "email")); - - // New "phones" table. - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "guid")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", "type")); - EXPECT_TRUE(connection.DoesColumnExist("autofill_profile_phones", - "number")); - - EXPECT_FALSE(connection.DoesColumnExist("credit_cards", "label")); - - // Verify data in the database after the migration. - sql::Statement s1( - connection.GetUniqueStatement( - "SELECT guid, company_name, address_line_1, address_line_2, " - "city, state, zipcode, country, date_modified " - "FROM autofill_profiles")); - - // John Doe. - ASSERT_TRUE(s1.Step()); - EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s1.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("Doe Enterprises"), s1.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("1 Main St"), s1.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Apt 1"), s1.ColumnString16(3)); - EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4)); - EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5)); - EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6)); - EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7)); - EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); - - // John P. Doe. - ASSERT_TRUE(s1.Step()); - EXPECT_EQ("589636FD-9037-3053-200C-80ABC97D7344", s1.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("Doe Enterprises"), s1.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("1 Main St"), s1.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Apt 1"), s1.ColumnString16(3)); - EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4)); - EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5)); - EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6)); - EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7)); - EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); - - // Dave Smith. - ASSERT_TRUE(s1.Step()); - EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s1.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("2 Main Street"), s1.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(3)); - EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4)); - EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5)); - EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6)); - EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7)); - EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); - - // Dave Smith (Part 2). - ASSERT_TRUE(s1.Step()); - EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s1.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("2 Main St"), s1.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(3)); - EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4)); - EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5)); - EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6)); - EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7)); - EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); - - // Alfred E Newman. - // Gets culled during migration from 35 to 36 due to incomplete address. - - // 3 Main St. - ASSERT_TRUE(s1.Step()); - EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s1.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("3 Main St"), s1.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(3)); - EXPECT_EQ(ASCIIToUTF16("Los Altos"), s1.ColumnString16(4)); - EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5)); - EXPECT_EQ(ASCIIToUTF16("94022"), s1.ColumnString16(6)); - EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7)); - EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); - - // That should be all. - EXPECT_FALSE(s1.Step()); - - sql::Statement s2( - connection.GetUniqueStatement( - "SELECT guid, first_name, middle_name, last_name " - "FROM autofill_profile_names")); - - // John Doe. - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s2.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3)); - - // John P. Doe. - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("589636FD-9037-3053-200C-80ABC97D7344", s2.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("John"), s2.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("P."), s2.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Doe"), s2.ColumnString16(3)); - - // Dave Smith. - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s2.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3)); - - // Dave Smith (Part 2). - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s2.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("Dave"), s2.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3)); - - // Alfred E Newman. - // Gets culled during migration from 35 to 36 due to incomplete address. - - // 3 Main St. - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s2.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16(""), s2.ColumnString16(3)); - - // Should be all. - EXPECT_FALSE(s2.Step()); - - sql::Statement s3( - connection.GetUniqueStatement( - "SELECT guid, email " - "FROM autofill_profile_emails")); - - // John Doe. - ASSERT_TRUE(s3.Step()); - EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s3.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("john@doe.com"), s3.ColumnString16(1)); - - // John P. Doe. - ASSERT_TRUE(s3.Step()); - EXPECT_EQ("589636FD-9037-3053-200C-80ABC97D7344", s3.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("john@doe.com"), s3.ColumnString16(1)); - - // 2 Main Street. - ASSERT_TRUE(s3.Step()); - EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s3.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s3.ColumnString16(1)); - - // 2 Main St. - ASSERT_TRUE(s3.Step()); - EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s3.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s3.ColumnString16(1)); - - // Alfred E Newman. - // Gets culled during migration from 35 to 36 due to incomplete address. - - // 3 Main St. - ASSERT_TRUE(s3.Step()); - EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s3.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16(""), s3.ColumnString16(1)); - - // Should be all. - EXPECT_FALSE(s3.Step()); - - sql::Statement s4( - connection.GetUniqueStatement( - "SELECT guid, type, number " - "FROM autofill_profile_phones")); - - // John Doe phone. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s4.ColumnString(0)); - EXPECT_EQ(0, s4.ColumnInt(1)); // 0 means phone. - EXPECT_EQ(ASCIIToUTF16("4151112222"), s4.ColumnString16(2)); - - // John Doe fax. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("00580526-FF81-EE2A-0546-1AC593A32E2F", s4.ColumnString(0)); - EXPECT_EQ(1, s4.ColumnInt(1)); // 1 means phone. - EXPECT_EQ(ASCIIToUTF16("4153334444"), s4.ColumnString16(2)); - - // John P. Doe phone. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("589636FD-9037-3053-200C-80ABC97D7344", s4.ColumnString(0)); - EXPECT_EQ(0, s4.ColumnInt(1)); // 0 means phone. - EXPECT_EQ(ASCIIToUTF16("4151112222"), s4.ColumnString16(2)); - - // John P. Doe fax. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("589636FD-9037-3053-200C-80ABC97D7344", s4.ColumnString(0)); - EXPECT_EQ(1, s4.ColumnInt(1)); // 1 means fax. - EXPECT_EQ(ASCIIToUTF16("4153334444"), s4.ColumnString16(2)); - - // 2 Main Street phone. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s4.ColumnString(0)); - EXPECT_EQ(0, s4.ColumnInt(1)); // 0 means phone. - EXPECT_EQ(ASCIIToUTF16(""), s4.ColumnString16(2)); - - // 2 Main Street fax. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("4C74A9D8-7EEE-423E-F9C2-E7FA70ED1396", s4.ColumnString(0)); - EXPECT_EQ(1, s4.ColumnInt(1)); // 1 means fax. - EXPECT_EQ(ASCIIToUTF16(""), s4.ColumnString16(2)); - - // 2 Main St phone. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s4.ColumnString(0)); - EXPECT_EQ(0, s4.ColumnInt(1)); // 0 means phone. - EXPECT_EQ(ASCIIToUTF16(""), s4.ColumnString16(2)); - - // 2 Main St fax. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("722DF5C4-F74A-294A-46F0-31FFDED0D635", s4.ColumnString(0)); - EXPECT_EQ(1, s4.ColumnInt(1)); // 1 means fax. - EXPECT_EQ(ASCIIToUTF16(""), s4.ColumnString16(2)); - - // Note no phone or fax for Alfred E Newman. - - // 3 Main St phone. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s4.ColumnString(0)); - EXPECT_EQ(0, s4.ColumnInt(1)); // 0 means phone. - EXPECT_EQ(ASCIIToUTF16(""), s4.ColumnString16(2)); - - // 2 Main St fax. - ASSERT_TRUE(s4.Step()); - EXPECT_EQ("9E5FE298-62C7-83DF-6293-381BC589183F", s4.ColumnString(0)); - EXPECT_EQ(1, s4.ColumnInt(1)); // 1 means fax. - EXPECT_EQ(ASCIIToUTF16(""), s4.ColumnString16(2)); - - - // Should be all. - EXPECT_FALSE(s4.Step()); - } -} - -// Adds a column for the autofill profile's country code. -TEST_F(WebDatabaseMigrationTest, MigrateVersion33ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_33.sql"))); - - // Verify pre-conditions. These are expectations for version 33 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - EXPECT_FALSE(connection.DoesColumnExist("autofill_profiles", - "country_code")); - - // Check that the country value is the one we expect. - sql::Statement s( - connection.GetUniqueStatement("SELECT country FROM autofill_profiles")); - - ASSERT_TRUE(s.Step()); - std::string country = s.ColumnString(0); - EXPECT_EQ("United States", country); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", - "country_code")); - - // Check that the country code is properly converted. - sql::Statement s(connection.GetUniqueStatement( - "SELECT country_code FROM autofill_profiles")); - - ASSERT_TRUE(s.Step()); - std::string country_code = s.ColumnString(0); - EXPECT_EQ("US", country_code); - } -} - -// Cleans up bad country code "UK" in favor of good country code "GB". -TEST_F(WebDatabaseMigrationTest, MigrateVersion34ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_34.sql"))); - - // Verify pre-conditions. These are expectations for version 34 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - EXPECT_TRUE(connection.DoesColumnExist("autofill_profiles", - "country_code")); - - // Check that the country_code value is the one we expect. - sql::Statement s( - connection.GetUniqueStatement("SELECT country_code " - "FROM autofill_profiles")); - - ASSERT_TRUE(s.Step()); - std::string country_code = s.ColumnString(0); - EXPECT_EQ("UK", country_code); - - // Should have only one. - ASSERT_FALSE(s.Step()); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", - "country_code")); - - // Check that the country_code code is properly converted. - sql::Statement s(connection.GetUniqueStatement( - "SELECT country_code FROM autofill_profiles")); - - ASSERT_TRUE(s.Step()); - std::string country_code = s.ColumnString(0); - EXPECT_EQ("GB", country_code); - - // Should have only one. - ASSERT_FALSE(s.Step()); - } -} - -// Cleans up invalid profiles based on more agressive merging. Filters out -// profiles that are subsets of other profiles, and profiles with invalid email, -// state, and incomplete address. -TEST_F(WebDatabaseMigrationTest, MigrateVersion35ToCurrent) { - // Initialize the database. - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_35.sql"))); - - // Verify pre-conditions. These are expectations for version 34 of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - EXPECT_FALSE(connection.DoesTableExist("autofill_profiles_trash")); - ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - - // Check that there are 6 profiles prior to merge. - sql::Statement s( - connection.GetUniqueStatement("SELECT guid FROM autofill_profiles")); - int i = 0; - while (s.Step()) - ++i; - EXPECT_EQ(6, i); - } - - // Load the database via the WebDatabase class and migrate the database to - // the current version. - { - WebDatabase db; - ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath())); - } - - // Verify post-conditions. These are expectations for current version of the - // database. - { - sql::Connection connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - ASSERT_TRUE(connection.DoesTableExist("autofill_profiles_trash")); - ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles_trash", "guid")); - ASSERT_TRUE(connection.DoesColumnExist("autofill_profiles", "guid")); - - // Verify data in the database after the migration. - sql::Statement s1( - connection.GetUniqueStatement( - "SELECT guid, company_name, address_line_1, address_line_2, " - "city, state, zipcode, country, date_modified " - "FROM autofill_profiles")); - - // John Doe. - ASSERT_TRUE(s1.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000001", s1.ColumnString(0)); - EXPECT_EQ(ASCIIToUTF16("Acme Inc."), s1.ColumnString16(1)); - EXPECT_EQ(ASCIIToUTF16("1 Main Street"), s1.ColumnString16(2)); - EXPECT_EQ(ASCIIToUTF16("Apt 2"), s1.ColumnString16(3)); - EXPECT_EQ(ASCIIToUTF16("San Francisco"), s1.ColumnString16(4)); - EXPECT_EQ(ASCIIToUTF16("CA"), s1.ColumnString16(5)); - EXPECT_EQ(ASCIIToUTF16("94102"), s1.ColumnString16(6)); - EXPECT_EQ(ASCIIToUTF16("United States"), s1.ColumnString16(7)); - EXPECT_EQ(1300131704, s1.ColumnInt64(8)); - - // That should be it. - ASSERT_FALSE(s1.Step()); - - // Check that there 5 trashed profile after the merge. - sql::Statement s2( - connection.GetUniqueStatement("SELECT guid " - "FROM autofill_profiles_trash")); - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000002", s2.ColumnString(0)); - - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000003", s2.ColumnString(0)); - - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000004", s2.ColumnString(0)); - - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000005", s2.ColumnString(0)); - - ASSERT_TRUE(s2.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000006", s2.ColumnString(0)); - - // That should be it. - ASSERT_FALSE(s2.Step()); - } -} |