Commit c77cf7d6 authored by Sujie Zhu's avatar Sujie Zhu Committed by Commit Bot

[AF][Nickname] Add nickname column to masked_credit_card

Add nickname column with VARCHAR type to masked_credit_card table, so
that we later could store synced response to this table and retrieve
nickname.

Also add migration function and corresponding unittests to migrate
older version database to this new schema.

The follow up will be:
1. Store the nickname from sync response to masked_credit_card table.
2. PersonalDataManager retrieves the nickname from table.

Bug: 1059087
Change-Id: Iaabd50099eb6d6d0af1740f3f5b24b5767b58c69
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2093011
Commit-Queue: Sujie Zhu <sujiezhu@google.com>
Reviewed-by: default avatarDominic Battré <battre@chromium.org>
Reviewed-by: default avatarCait Phillips <caitkp@chromium.org>
Reviewed-by: default avatarJared Saul <jsaul@google.com>
Cr-Commit-Position: refs/heads/master@{#749795}
parent 88835fa5
......@@ -490,6 +490,9 @@ bool AutofillTable::MigrateToVersion(int version,
case 83:
*update_compatible_version = true;
return MigrateToVersion83RemoveServerCardTypeColumn();
case 84:
*update_compatible_version = false;
return MigrateToVersion84AddNicknameColumn();
}
return true;
}
......@@ -2769,6 +2772,13 @@ bool AutofillTable::MigrateToVersion83RemoveServerCardTypeColumn() {
transaction.Commit();
}
bool AutofillTable::MigrateToVersion84AddNicknameColumn() {
// Add the nickname column to the masked_credit_cards table.
return db_->DoesColumnExist("masked_credit_cards", "nickname") ||
db_->Execute(
"ALTER TABLE masked_credit_cards ADD COLUMN nickname VARCHAR");
}
bool AutofillTable::AddFormFieldValuesTime(
const std::vector<FormFieldData>& elements,
std::vector<AutofillChange>* changes,
......@@ -3121,7 +3131,8 @@ bool AutofillTable::InitMaskedCreditCardsTable() {
"last_four VARCHAR,"
"exp_month INTEGER DEFAULT 0,"
"exp_year INTEGER DEFAULT 0, "
"bank_name VARCHAR)")) {
"bank_name VARCHAR, "
"nickname VARCHAR)")) {
NOTREACHED();
return false;
}
......
......@@ -176,8 +176,7 @@ struct PaymentsCustomerData;
// exp_month Expiration month: 1-12
// exp_year Four-digit year: 2017
// bank_name Issuer bank name of the credit card.
// cloud_token_data Opaque identifier for the cloud token associated with
// the payment instrument.
// nickname The card's nickname, if it exists. Added in version 84.
//
// unmasked_credit_cards
// When a masked credit credit card is unmasked and the
......@@ -554,6 +553,7 @@ class AutofillTable : public WebDatabaseTable,
bool MigrateToVersion80AddIsClientValidityStatesUpdatedColumn();
bool MigrateToVersion81CleanUpWrongModelTypeData();
bool MigrateToVersion83RemoveServerCardTypeColumn();
bool MigrateToVersion84AddNicknameColumn();
// Max data length saved in the table, AKA the maximum length allowed for
// form data.
// Copied to components/autofill/ios/browser/resources/autofill_controller.js.
......
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
INSERT INTO meta VALUES('mmap_status','-1');
INSERT INTO meta VALUES('version','83');
INSERT INTO meta VALUES('last_compatible_version','79');
INSERT INTO meta VALUES('Builtin Keyword Version','117');
CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,encrypted_token BLOB);
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,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,created_by_policy INTEGER DEFAULT 0,last_modified INTEGER DEFAULT 0,sync_guid VARCHAR,alternate_urls VARCHAR,image_url VARCHAR,search_url_post_params VARCHAR,suggest_url_post_params VARCHAR,image_url_post_params VARCHAR,new_tab_url VARCHAR,last_visited INTEGER DEFAULT 0, created_from_play_api INTEGER DEFAULT 0);
CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR, date_created INTEGER DEFAULT 0, date_last_used INTEGER DEFAULT 0, count INTEGER DEFAULT 1, PRIMARY KEY (name, value));
CREATE TABLE credit_cards ( guid VARCHAR PRIMARY KEY, name_on_card VARCHAR, expiration_month INTEGER, expiration_year INTEGER, card_number_encrypted BLOB, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR);
CREATE TABLE autofill_profiles ( guid VARCHAR PRIMARY KEY, company_name VARCHAR, street_address VARCHAR, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zipcode VARCHAR, sorting_code VARCHAR, country_code VARCHAR, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', language_code VARCHAR, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, validity_bitfield UNSIGNED NOT NULL DEFAULT 0, is_client_validity_states_updated BOOL NOT NULL DEFAULT FALSE);
CREATE TABLE autofill_profile_names ( guid VARCHAR, first_name VARCHAR, middle_name VARCHAR, last_name VARCHAR, full_name VARCHAR);
CREATE TABLE autofill_profile_emails ( guid VARCHAR, email VARCHAR);
CREATE TABLE autofill_profile_phones ( guid VARCHAR, number VARCHAR);
CREATE TABLE autofill_profiles_trash ( guid VARCHAR);
CREATE TABLE masked_credit_cards (id VARCHAR,status VARCHAR,name_on_card VARCHAR,network VARCHAR,last_four VARCHAR,exp_month INTEGER DEFAULT 0,exp_year INTEGER DEFAULT 0, bank_name VARCHAR);
INSERT INTO "masked_credit_cards" VALUES('card_1','status','bob','VISA','1234',12,2050,'Chase');
CREATE TABLE unmasked_credit_cards (id VARCHAR,card_number_encrypted VARCHAR, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, unmask_date INTEGER NOT NULL DEFAULT 0);
CREATE TABLE server_card_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR);
CREATE TABLE server_addresses (id VARCHAR,company_name VARCHAR,street_address VARCHAR,address_1 VARCHAR,address_2 VARCHAR,address_3 VARCHAR,address_4 VARCHAR,postal_code VARCHAR,sorting_code VARCHAR,country_code VARCHAR,language_code VARCHAR, recipient_name VARCHAR, phone_number VARCHAR);
CREATE TABLE server_address_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, has_converted BOOL NOT NULL DEFAULT FALSE);
CREATE TABLE autofill_sync_metadata (model_type INTEGER NOT NULL, storage_key VARCHAR NOT NULL, value BLOB, PRIMARY KEY (model_type, storage_key));
CREATE TABLE autofill_model_type_state (model_type INTEGER NOT NULL PRIMARY KEY, value BLOB);
CREATE TABLE payments_customer_data (customer_id VARCHAR);
CREATE TABLE payments_upi_vpa (vpa VARCHAR);
CREATE TABLE server_card_cloud_token_data ( id VARCHAR, suffix VARCHAR, exp_month INTEGER DEFAULT 0, exp_year INTEGER DEFAULT 0, card_art_url VARCHAR, instrument_token VARCHAR);
CREATE INDEX autofill_name ON autofill (name);
CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);
COMMIT;
......@@ -70,6 +70,7 @@ bundle_data("unit_tests_bundle_data") {
"//components/test/data/web_database/version_80.sql",
"//components/test/data/web_database/version_81.sql",
"//components/test/data/web_database/version_82.sql",
"//components/test/data/web_database/version_83.sql",
]
outputs = [ "{{bundle_resources_dir}}/" +
"{{source_root_relative_dir}}/{{source_file_part}}" ]
......
......@@ -13,7 +13,7 @@
// corresponding changes must happen in the unit tests, and new migration test
// added. See |WebDatabaseMigrationTest::kCurrentTestedVersionNumber|.
// static
const int WebDatabase::kCurrentVersionNumber = 83;
const int WebDatabase::kCurrentVersionNumber = 84;
const int WebDatabase::kDeprecatedVersionNumber = 51;
......
......@@ -126,7 +126,7 @@ class WebDatabaseMigrationTest : public testing::Test {
DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
};
const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 83;
const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 84;
void WebDatabaseMigrationTest::LoadDatabase(
const base::FilePath::StringType& file) {
......@@ -1824,3 +1824,41 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion82ToCurrent) {
EXPECT_EQ("1980751", cards.ColumnString(0));
}
}
// Tests addition of nickname column in masked_credit_cards table.
TEST_F(WebDatabaseMigrationTest, MigrateVersion83ToCurrent) {
ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_83.sql")));
// Verify pre-conditions.
{
sql::Database connection;
ASSERT_TRUE(connection.Open(GetDatabasePath()));
ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
sql::MetaTable meta_table;
ASSERT_TRUE(meta_table.Init(&connection, 83, 79));
EXPECT_FALSE(connection.DoesColumnExist("masked_credit_cards", "nickname"));
}
DoMigration();
// Verify post-conditions.
{
sql::Database connection;
ASSERT_TRUE(connection.Open(GetDatabasePath()));
ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
// Check version.
EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
// The nickname column should exist.
EXPECT_TRUE(connection.DoesColumnExist("masked_credit_cards", "nickname"));
// Make sure that the default nickname value is empty.
sql::Statement s_masked_cards(connection.GetUniqueStatement(
"SELECT nickname FROM masked_credit_cards"));
ASSERT_TRUE(s_masked_cards.Step());
EXPECT_EQ("", s_masked_cards.ColumnString(0));
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment