Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3937)

Unified Diff: chrome/browser/webdata/web_database_unittest.cc

Issue 6676031: Autofill database migration to clean up bogus profiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adds fix for upload. Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/webdata/web_database.cc ('k') | chrome/test/data/autofill/merge/input/validation.in » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
+ }
+}
« no previous file with comments | « chrome/browser/webdata/web_database.cc ('k') | chrome/test/data/autofill/merge/input/validation.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698