| Index: chrome/browser/webdata/web_database_unittest.cc
|
| diff --git a/chrome/browser/webdata/web_database_unittest.cc b/chrome/browser/webdata/web_database_unittest.cc
|
| index 48301ff16f0a18b0c971d301f9d4a9d6637b410b..154abf75f09d5a62832ccbd29da1e930960b9a25 100644
|
| --- a/chrome/browser/webdata/web_database_unittest.cc
|
| +++ b/chrome/browser/webdata/web_database_unittest.cc
|
| @@ -9,8 +9,10 @@
|
| #include <utility>
|
| #include <vector>
|
|
|
| +#include "app/sql/statement.h"
|
| #include "base/file_util.h"
|
| #include "base/path_service.h"
|
| +#include "base/scoped_temp_dir.h"
|
| #include "base/stl_util-inl.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/string16.h"
|
| @@ -89,6 +91,10 @@ bool CompareAutofillEntries(const AutofillEntry& a, const AutofillEntry& b) {
|
| }
|
|
|
| class WebDatabaseTest : public testing::Test {
|
| + public:
|
| + WebDatabaseTest() {}
|
| + virtual ~WebDatabaseTest() {}
|
| +
|
| protected:
|
| typedef std::vector<AutofillChange> AutofillChangeList;
|
| typedef std::set<AutofillEntry,
|
| @@ -173,6 +179,9 @@ class WebDatabaseTest : public testing::Test {
|
| }
|
|
|
| FilePath file_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(WebDatabaseTest);
|
| };
|
|
|
| TEST_F(WebDatabaseTest, Keywords) {
|
| @@ -1507,3 +1516,443 @@ TEST_F(WebDatabaseTest, Autofill_GetAllAutofillEntries_TwoSame) {
|
|
|
| EXPECT_EQ(0U, expected_entries.size());
|
| }
|
| +
|
| +// 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));
|
| + }
|
| +
|
| + 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 tables in these "Setup" routines were generated by launching the
|
| + // Chromium application prior to schema change, then using the sqlite
|
| + // command-line application to dump the contents of the "Web Data" database.
|
| + // Like this:
|
| + // > .output foo_dump.sql
|
| + // > .dump
|
| + void SetUpVersion22Database();
|
| + void SetUpVersion22CorruptDatabase();
|
| + void SetUpVersion24Database();
|
| +
|
| + private:
|
| + ScopedTempDir temp_dir_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
|
| +};
|
| +
|
| +const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 25;
|
| +
|
| +// 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.
|
| +void WebDatabaseMigrationTest::SetUpVersion22Database() {
|
| + sql::Connection connection;
|
| + ASSERT_TRUE(connection.Open(GetDatabasePath()));
|
| + ASSERT_TRUE(connection.BeginTransaction());
|
| + ASSERT_TRUE(connection.Execute(
|
| + "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
|
| + "value LONGVARCHAR);"
|
| + "INSERT INTO \"meta\" VALUES('version','22');"
|
| + "INSERT INTO \"meta\" VALUES('last_compatible_version','21');"
|
| + "INSERT INTO \"meta\" VALUES('Builtin Keyword Version','27');"
|
| + "INSERT INTO \"meta\" VALUES('Default Search Provider ID','7');"
|
| + "CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,"
|
| + "keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,"
|
| + "url VARCHAR NOT NULL,show_in_default_list INTEGER,"
|
| + "safe_for_autoreplace INTEGER,originating_url VARCHAR,"
|
| + "date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,"
|
| + "input_encodings VARCHAR,suggest_url VARCHAR,"
|
| + "prepopulate_id INTEGER DEFAULT 0,"
|
| + "autogenerate_keyword INTEGER DEFAULT 0);"
|
| + "INSERT INTO \"keywords\" VALUES(2,'Google','google.com',"
|
| + "'http://www.google.com/favicon.ico',"
|
| + "'{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"
|
| + "{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}"
|
| + "&q={searchTerms}',1,1,'',0,0,'UTF-8','{google:baseSuggestURL}search?"
|
| + "client=chrome&hl={language}&q={searchTerms}',1,1);"
|
| + "INSERT INTO \"keywords\" VALUES(3,'Yahoo!','yahoo.com',"
|
| + "'http://search.yahoo.com/favicon.ico','http://search.yahoo.com/search?"
|
| + "ei={inputEncoding}&fr=crmas&p={searchTerms}',1,1,'',0,0,'UTF-8',"
|
| + "'http://ff.search.yahoo.com/gossip?output=fxjson&"
|
| + "command={searchTerms}',2,0);"
|
| + "INSERT INTO \"keywords\" VALUES(4,'Bing','bing.com',"
|
| + "'http://www.bing.com/s/wlflag.ico','http://www.bing.com/search?"
|
| + "setmkt=en-US&q={searchTerms}',1,1,'',0,0,'UTF-8',"
|
| + "'http://api.bing.com/osjson.aspx?query={searchTerms}&"
|
| + "language={language}',3,0);"
|
| + "INSERT INTO \"keywords\" VALUES(5,'Wikipedia (en)','en.wikipedia.org','',"
|
| + "'http://en.wikipedia.org/w/index.php?title=Special:Search&"
|
| + "search={searchTerms}',1,0,'',1283287335,0,'','',0,0);"
|
| + "INSERT INTO \"keywords\" VALUES(6,'NYTimes','query.nytimes.com','',"
|
| + "'http://query.nytimes.com/gst/handler.html?query={searchTerms}&"
|
| + "opensearch=1',1,0,'',1283287335,0,'','',0,0);"
|
| + "INSERT INTO \"keywords\" VALUES(7,'eBay','rover.ebay.com','',"
|
| + "'http://rover.ebay.com/rover/1/711-43047-14818-1/4?"
|
| + "satitle={searchTerms}',1,0,'',1283287335,0,'','',0,0);"
|
| + "INSERT INTO \"keywords\" VALUES(8,'ff','ff','','http://ff{searchTerms}',"
|
| + "0,0,'',1283287356,0,'','',0,0);"
|
| + "CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR, "
|
| + "username_element VARCHAR, username_value VARCHAR, "
|
| + "password_element VARCHAR, password_value BLOB, submit_element VARCHAR,"
|
| + "signon_realm VARCHAR NOT NULL,ssl_valid INTEGER NOT NULL,"
|
| + "preferred INTEGER NOT NULL,date_created INTEGER NOT NULL,"
|
| + "blacklisted_by_user INTEGER NOT NULL,scheme INTEGER NOT NULL,"
|
| + "UNIQUE (origin_url, username_element, username_value, "
|
| + "password_element, submit_element, signon_realm));"
|
| + "CREATE TABLE ie7_logins (url_hash VARCHAR NOT NULL, password_value BLOB, "
|
| + "date_created INTEGER NOT NULL,UNIQUE (url_hash));"
|
| + "CREATE TABLE web_app_icons (url LONGVARCHAR,width int,height int,"
|
| + "image BLOB, UNIQUE (url, width, height));"
|
| + "CREATE TABLE web_apps (url LONGVARCHAR UNIQUE,"
|
| + "has_all_images INTEGER NOT NULL);"
|
| + "CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR, "
|
| + "pair_id INTEGER PRIMARY KEY, count INTEGER DEFAULT 1);"
|
| + "CREATE TABLE autofill_dates ( pair_id INTEGER DEFAULT 0,"
|
| + "date_created INTEGER DEFAULT 0);"
|
| + "CREATE INDEX logins_signon ON logins (signon_realm);"
|
| + "CREATE INDEX ie7_logins_hash ON ie7_logins (url_hash);"
|
| + "CREATE INDEX web_apps_url_index ON web_apps (url);"
|
| + "CREATE INDEX autofill_name ON autofill (name);"
|
| + "CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);"
|
| + "CREATE INDEX autofill_dates_pair_id ON autofill_dates (pair_id);"));
|
| + ASSERT_TRUE(connection.CommitTransaction());
|
| +}
|
| +
|
| +// 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).
|
| +void WebDatabaseMigrationTest::SetUpVersion22CorruptDatabase() {
|
| + sql::Connection connection;
|
| + ASSERT_TRUE(connection.Open(GetDatabasePath()));
|
| + ASSERT_TRUE(connection.BeginTransaction());
|
| + ASSERT_TRUE(connection.Execute(
|
| + "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
|
| + "value LONGVARCHAR);"
|
| + "INSERT INTO \"meta\" VALUES('version','22');"
|
| + "INSERT INTO \"meta\" VALUES('last_compatible_version','21');"
|
| + "INSERT INTO \"meta\" VALUES('Default Search Provider ID','2');"
|
| + "INSERT INTO \"meta\" VALUES('Builtin Keyword Version','29');"
|
| + "CREATE TABLE keywords (id INTEGER PRIMARY KEY,"
|
| + "short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,"
|
| + "favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,"
|
| + "show_in_default_list INTEGER,safe_for_autoreplace INTEGER,"
|
| + "originating_url VARCHAR,date_created INTEGER DEFAULT 0,"
|
| + "usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,"
|
| + "suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,"
|
| + "autogenerate_keyword INTEGER DEFAULT 0);"
|
| + "INSERT INTO \"keywords\" VALUES(2,'Google','google.com',"
|
| + "'http://www.google.com/favicon.ico','{google:baseURL}search?"
|
| + "{google:RLZ}{google:acceptedSuggestion}"
|
| + "{google:originalQueryForSuggestion}sourceid=chrome&"
|
| + "ie={inputEncoding}&q={searchTerms}',1,1,'',0,0,'UTF-8',"
|
| + "'{google:baseSuggestURL}search?client=chrome&hl={language}&"
|
| + "q={searchTerms}',1,1);"
|
| + "INSERT INTO \"keywords\" VALUES(3,'Yahoo!','yahoo.com',"
|
| + "'http://search.yahoo.com/favicon.ico',"
|
| + "'http://search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
|
| + "p={searchTerms}',1,1,'',0,0,'UTF-8',"
|
| + "'http://ff.search.yahoo.com/gossip?output=fxjson&"
|
| + "command={searchTerms}',2,0);"
|
| + "INSERT INTO \"keywords\" VALUES(4,'Bing','bing.com',"
|
| + "'http://www.bing.com/s/wlflag.ico','http://www.bing.com/search?"
|
| + "setmkt=en-US&q={searchTerms}',1,1,'',0,0,'UTF-8',"
|
| + "'http://api.bing.com/osjson.aspx?query={searchTerms}&"
|
| + "language={language}',3,0);"
|
| + "INSERT INTO \"keywords\" VALUES(5,'Wikipedia (en)','en.wikipedia.org',"
|
| + "'','http://en.wikipedia.org/w/index.php?title=Special:Search&"
|
| + "search={searchTerms}',1,0,'',1283287335,0,'','',0,0);"
|
| + "INSERT INTO \"keywords\" VALUES(6,'NYTimes','query.nytimes.com','',"
|
| + "'http://query.nytimes.com/gst/handler.html?query={searchTerms}&"
|
| + "opensearch=1',1,0,'',1283287335,0,'','',0,0);"
|
| + "INSERT INTO \"keywords\" VALUES(7,'eBay','rover.ebay.com','',"
|
| + "'http://rover.ebay.com/rover/1/711-43047-14818-1/4?"
|
| + "satitle={searchTerms}',1,0,'',1283287335,0,'','',0,0);"
|
| + "INSERT INTO \"keywords\" VALUES(8,'ff','ff','','http://ff{searchTerms}'"
|
| + ",0,0,'',1283287356,0,'','',0,0);"
|
| + "CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR, "
|
| + "username_element VARCHAR, username_value VARCHAR, "
|
| + "password_element VARCHAR, password_value BLOB, "
|
| + "submit_element VARCHAR, signon_realm VARCHAR NOT NULL,"
|
| + "ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,"
|
| + "date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,"
|
| + "scheme INTEGER NOT NULL,UNIQUE (origin_url, username_element, "
|
| + "username_value, password_element, submit_element, signon_realm));"
|
| + "CREATE TABLE ie7_logins (url_hash VARCHAR NOT NULL, password_value BLOB,"
|
| + "date_created INTEGER NOT NULL,UNIQUE (url_hash));"
|
| + "CREATE TABLE web_app_icons (url LONGVARCHAR,width int,height int,"
|
| + "image BLOB, UNIQUE (url, width, height));"
|
| + "CREATE TABLE web_apps (url LONGVARCHAR UNIQUE,"
|
| + "has_all_images INTEGER NOT NULL);"
|
| + "CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR,"
|
| + "pair_id INTEGER PRIMARY KEY, count INTEGER DEFAULT 1);"
|
| + "CREATE TABLE autofill_dates ( pair_id INTEGER DEFAULT 0,"
|
| + "date_created INTEGER DEFAULT 0);"
|
| + "CREATE TABLE autofill_profiles ( label VARCHAR, "
|
| + "unique_id INTEGER PRIMARY KEY, first_name VARCHAR, "
|
| + "middle_name VARCHAR, last_name VARCHAR, email VARCHAR, "
|
| + "company_name VARCHAR, address_line_1 VARCHAR, "
|
| + "address_line_2 VARCHAR, city VARCHAR, state VARCHAR, "
|
| + "zipcode VARCHAR, country VARCHAR, phone VARCHAR, fax VARCHAR);"
|
| + "CREATE TABLE credit_cards ( label VARCHAR, "
|
| + "unique_id INTEGER PRIMARY KEY, name_on_card VARCHAR, type VARCHAR,"
|
| + "card_number VARCHAR, expiration_month INTEGER, "
|
| + "expiration_year INTEGER, verification_code VARCHAR, "
|
| + "billing_address VARCHAR, shipping_address VARCHAR, "
|
| + "card_number_encrypted BLOB, verification_code_encrypted BLOB);"
|
| + "CREATE INDEX logins_signon ON logins (signon_realm);"
|
| + "CREATE INDEX ie7_logins_hash ON ie7_logins (url_hash);"
|
| + "CREATE INDEX web_apps_url_index ON web_apps (url);"
|
| + "CREATE INDEX autofill_name ON autofill (name);"
|
| + "CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);"
|
| + "CREATE INDEX autofill_dates_pair_id ON autofill_dates (pair_id);"
|
| + "CREATE INDEX autofill_profiles_label_index ON autofill_profiles (label);"
|
| + "CREATE INDEX credit_cards_label_index ON credit_cards (label);"));
|
| + ASSERT_TRUE(connection.CommitTransaction());
|
| +}
|
| +
|
| +// This schema is taken from a build prior to the addition of the |keywords|
|
| +// |logo_id| column.
|
| +void WebDatabaseMigrationTest::SetUpVersion24Database() {
|
| + sql::Connection connection;
|
| + ASSERT_TRUE(connection.Open(GetDatabasePath()));
|
| + ASSERT_TRUE(connection.BeginTransaction());
|
| + ASSERT_TRUE(connection.Execute(
|
| + "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
|
| + "value LONGVARCHAR);"
|
| + "INSERT INTO \"meta\" VALUES('version','24');"
|
| + "INSERT INTO \"meta\" VALUES('last_compatible_version','24');"
|
| + "CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,"
|
| + "keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,"
|
| + "url VARCHAR NOT NULL,show_in_default_list INTEGER,"
|
| + "safe_for_autoreplace INTEGER,originating_url VARCHAR,"
|
| + "date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,"
|
| + "input_encodings VARCHAR,suggest_url VARCHAR,"
|
| + "prepopulate_id INTEGER DEFAULT 0,"
|
| + "autogenerate_keyword INTEGER DEFAULT 0);"
|
| + "CREATE TABLE logins (origin_url VARCHAR NOT NULL, action_url VARCHAR,"
|
| + "username_element VARCHAR, username_value VARCHAR,"
|
| + "password_element VARCHAR, password_value BLOB, submit_element VARCHAR,"
|
| + "signon_realm VARCHAR NOT NULL,"
|
| + "ssl_valid INTEGER NOT NULL,preferred INTEGER NOT NULL,"
|
| + "date_created INTEGER NOT NULL,blacklisted_by_user INTEGER NOT NULL,"
|
| + "scheme INTEGER NOT NULL,UNIQUE (origin_url, username_element,"
|
| + "username_value, password_element, submit_element, signon_realm));"
|
| + "CREATE TABLE web_app_icons (url LONGVARCHAR,width int,height int,"
|
| + "image BLOB, UNIQUE (url, width, height));"
|
| + "CREATE TABLE web_apps (url LONGVARCHAR UNIQUE,"
|
| + "has_all_images INTEGER NOT NULL);"
|
| + "CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR,"
|
| + "pair_id INTEGER PRIMARY KEY, count INTEGER DEFAULT 1);"
|
| + "CREATE TABLE autofill_dates ( pair_id INTEGER DEFAULT 0,"
|
| + "date_created INTEGER DEFAULT 0);"
|
| + "CREATE TABLE autofill_profiles ( label VARCHAR,"
|
| + "unique_id INTEGER PRIMARY KEY, first_name VARCHAR,"
|
| + "middle_name VARCHAR, last_name VARCHAR, email VARCHAR,"
|
| + "company_name VARCHAR, address_line_1 VARCHAR, address_line_2 VARCHAR,"
|
| + "city VARCHAR, state VARCHAR, zipcode VARCHAR, country VARCHAR,"
|
| + "phone VARCHAR, fax VARCHAR);"
|
| + "CREATE TABLE credit_cards ( label VARCHAR, unique_id INTEGER PRIMARY KEY,"
|
| + "name_on_card VARCHAR, type VARCHAR, card_number VARCHAR,"
|
| + "expiration_month INTEGER, expiration_year INTEGER,"
|
| + "verification_code VARCHAR, billing_address VARCHAR,"
|
| + "shipping_address VARCHAR, card_number_encrypted BLOB,"
|
| + "verification_code_encrypted BLOB);"
|
| + "CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,"
|
| + "encrypted_token BLOB);"
|
| + "CREATE INDEX logins_signon ON logins (signon_realm);"
|
| + "CREATE INDEX web_apps_url_index ON web_apps (url);"
|
| + "CREATE INDEX autofill_name ON autofill (name);"
|
| + "CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);"
|
| + "CREATE INDEX autofill_dates_pair_id ON autofill_dates (pair_id);"
|
| + "CREATE INDEX autofill_profiles_label_index ON autofill_profiles (label);"
|
| + "CREATE INDEX credit_cards_label_index ON credit_cards (label);"));
|
| + ASSERT_TRUE(connection.CommitTransaction());
|
| +}
|
| +
|
| +// 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) {
|
| + // Initialize the database.
|
| + SetUpVersion22Database();
|
| +
|
| + // 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", "unique_id"));
|
| + 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", "unique_id"));
|
| + 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) {
|
| + // Initialize the database.
|
| + SetUpVersion22CorruptDatabase();
|
| +
|
| + // 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_TRUE(connection.DoesColumnExist("credit_cards", "unique_id"));
|
| + 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) {
|
| + // Initialize the database.
|
| + SetUpVersion24Database();
|
| +
|
| + // 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"));
|
| + }
|
| +}
|
|
|