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 2075808a0818e2ceb5825cc54779c7685d3f08a6..1bebd0751575daad6d7e3b4999e469409a11205c 100644 |
--- a/chrome/browser/webdata/web_database_unittest.cc |
+++ b/chrome/browser/webdata/web_database_unittest.cc |
@@ -1535,6 +1535,100 @@ TEST_F(WebDatabaseTest, AutofillProfile) { |
EXPECT_FALSE(db.GetAutofillProfile(billing_profile.guid(), &db_profile)); |
} |
+TEST_F(WebDatabaseTest, AutofillProfileTrash) { |
+ WebDatabase db; |
+ |
+ ASSERT_EQ(sql::INIT_OK, db.Init(file_)); |
+ |
+ std::vector<std::string> guids; |
+ db.GetAutofillProfilesInTrash(&guids); |
+ EXPECT_TRUE(guids.empty()); |
+ |
+ ASSERT_TRUE( |
+ db.AddAutofillGUIDToTrash("00000000-0000-0000-0000-000000000000")); |
+ ASSERT_TRUE( |
+ db.AddAutofillGUIDToTrash("00000000-0000-0000-0000-000000000001")); |
+ ASSERT_TRUE(db.GetAutofillProfilesInTrash(&guids)); |
+ EXPECT_EQ(2UL, guids.size()); |
+ EXPECT_EQ("00000000-0000-0000-0000-000000000000", guids[0]); |
+ EXPECT_EQ("00000000-0000-0000-0000-000000000001", guids[1]); |
+ |
+ ASSERT_TRUE(db.EmptyAutofillProfilesTrash()); |
+ ASSERT_TRUE(db.GetAutofillProfilesInTrash(&guids)); |
+ EXPECT_TRUE(guids.empty()); |
+} |
+ |
+TEST_F(WebDatabaseTest, AutofillProfileTrashInteraction) { |
+ WebDatabase db; |
+ |
+ ASSERT_EQ(sql::INIT_OK, db.Init(file_)); |
+ |
+ std::vector<std::string> guids; |
+ db.GetAutofillProfilesInTrash(&guids); |
+ EXPECT_TRUE(guids.empty()); |
+ |
+ AutofillProfile profile; |
+ profile.SetInfo(AutofillType(NAME_FIRST), ASCIIToUTF16("John")); |
+ profile.SetInfo(AutofillType(NAME_MIDDLE), ASCIIToUTF16("Q.")); |
+ profile.SetInfo(AutofillType(NAME_LAST), ASCIIToUTF16("Smith")); |
+ profile.SetInfo(AutofillType(EMAIL_ADDRESS),ASCIIToUTF16("js@smith.xyz")); |
+ profile.SetInfo(AutofillType(ADDRESS_HOME_LINE1), ASCIIToUTF16("1 Main St")); |
+ profile.SetInfo(AutofillType(ADDRESS_HOME_CITY), ASCIIToUTF16("Los Angeles")); |
+ profile.SetInfo(AutofillType(ADDRESS_HOME_STATE), ASCIIToUTF16("CA")); |
+ profile.SetInfo(AutofillType(ADDRESS_HOME_ZIP), ASCIIToUTF16("90025")); |
+ profile.SetInfo(AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("US")); |
+ |
+ // Mark this profile as in the trash. This stops |AddAutofillProfile| from |
+ // adding it. |
+ EXPECT_TRUE(db.AddAutofillGUIDToTrash(profile.guid())); |
+ EXPECT_TRUE(db.AddAutofillProfile(profile)); |
+ AutofillProfile* added_profile = NULL; |
+ EXPECT_FALSE(db.GetAutofillProfile(profile.guid(), &added_profile)); |
+ EXPECT_EQ(static_cast<AutofillProfile*>(NULL), added_profile); |
+ |
+ // Add the profile for real this time. |
+ EXPECT_TRUE(db.EmptyAutofillProfilesTrash()); |
+ EXPECT_TRUE(db.GetAutofillProfilesInTrash(&guids)); |
+ EXPECT_TRUE(guids.empty()); |
+ EXPECT_TRUE(db.AddAutofillProfile(profile)); |
+ EXPECT_TRUE(db.GetAutofillProfile(profile.guid(), &added_profile)); |
+ ASSERT_NE(static_cast<AutofillProfile*>(NULL), added_profile); |
+ delete added_profile; |
+ |
+ // Mark this profile as in the trash. This stops |UpdateAutofillProfile| from |
+ // updating it. In normal operation a profile should not be both in the trash |
+ // and in the profiles table simultaneously. |
+ EXPECT_TRUE(db.AddAutofillGUIDToTrash(profile.guid())); |
+ profile.SetInfo(AutofillType(NAME_FIRST), ASCIIToUTF16("Jane")); |
+ EXPECT_TRUE(db.UpdateAutofillProfile(profile)); |
+ AutofillProfile* updated_profile = NULL; |
+ EXPECT_TRUE(db.GetAutofillProfile(profile.guid(), &updated_profile)); |
+ ASSERT_NE(static_cast<AutofillProfile*>(NULL), added_profile); |
+ EXPECT_EQ(ASCIIToUTF16("John"), |
+ updated_profile->GetFieldText(AutofillType(NAME_FIRST))); |
+ delete updated_profile; |
+ |
+ // Try to delete the trashed profile. This stops |RemoveAutofillProfile| from |
+ // deleting it. In normal operation deletion is done by migration step, and |
+ // removal from trash is done by |WebDataService|. |RemoveAutofillProfile| |
+ // does remove the item from the trash if it is found however, so that if |
+ // other clients remove it (via Sync say) then it is gone and doesn't need to |
+ // be processed further by |WebDataService|. |
+ EXPECT_TRUE(db.RemoveAutofillProfile(profile.guid())); |
+ AutofillProfile* removed_profile = NULL; |
+ EXPECT_TRUE(db.GetAutofillProfile(profile.guid(), &removed_profile)); |
+ EXPECT_FALSE(db.IsAutofillGUIDInTrash(profile.guid())); |
+ ASSERT_NE(static_cast<AutofillProfile*>(NULL), removed_profile); |
+ delete removed_profile; |
+ |
+ // Check that emptying the trash now allows removal to occur. |
+ EXPECT_TRUE(db.EmptyAutofillProfilesTrash()); |
+ EXPECT_TRUE(db.RemoveAutofillProfile(profile.guid())); |
+ removed_profile = NULL; |
+ EXPECT_FALSE(db.GetAutofillProfile(profile.guid(), &removed_profile)); |
+ EXPECT_EQ(static_cast<AutofillProfile*>(NULL), removed_profile); |
+} |
+ |
TEST_F(WebDatabaseTest, CreditCard) { |
WebDatabase db; |
@@ -2104,7 +2198,7 @@ class WebDatabaseMigrationTest : public testing::Test { |
DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest); |
}; |
-const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 35; |
+const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 36; |
void WebDatabaseMigrationTest::LoadDatabase(const FilePath::StringType& file) { |
std::string contents; |
@@ -2983,16 +3077,7 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) { |
EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); |
// Alfred E Newman. |
- ASSERT_TRUE(s1.Step()); |
- EXPECT_EQ("584282AC-5D21-8D73-A2DB-4F892EF61F3F", s1.ColumnString(0)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(1)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(2)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(3)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(4)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(5)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(6)); |
- EXPECT_EQ(ASCIIToUTF16(""), s1.ColumnString16(7)); |
- EXPECT_EQ(1297882100L, s1.ColumnInt64(8)); |
+ // Gets culled during migration from 35 to 36 due to incomplete address. |
// 3 Main St. |
ASSERT_TRUE(s1.Step()); |
@@ -3043,11 +3128,7 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) { |
EXPECT_EQ(ASCIIToUTF16("Smith"), s2.ColumnString16(3)); |
// Alfred E Newman. |
- ASSERT_TRUE(s2.Step()); |
- EXPECT_EQ("584282AC-5D21-8D73-A2DB-4F892EF61F3F", s2.ColumnString(0)); |
- EXPECT_EQ(ASCIIToUTF16("Alfred"), s2.ColumnString16(1)); |
- EXPECT_EQ(ASCIIToUTF16("E"), s2.ColumnString16(2)); |
- EXPECT_EQ(ASCIIToUTF16("Newman"), s2.ColumnString16(3)); |
+ // Gets culled during migration from 35 to 36 due to incomplete address. |
// Note no name for 3 Main St. |
@@ -3073,9 +3154,7 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion32ToCurrent) { |
// Note no email for 2 Main St. |
// Alfred E Newman. |
- ASSERT_TRUE(s3.Step()); |
- EXPECT_EQ("584282AC-5D21-8D73-A2DB-4F892EF61F3F", s3.ColumnString(0)); |
- EXPECT_EQ(ASCIIToUTF16("a@e.com"), s3.ColumnString16(1)); |
+ // Gets culled during migration from 35 to 36 due to incomplete address. |
// Note no email for 3 Main St. |
@@ -3231,3 +3310,94 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion34ToCurrent) { |
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()); |
+ } |
+} |