Index: components/password_manager/core/browser/login_database_unittest.cc |
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc |
index fda25fb27e65d839bed1d54ec4c879b2ce7e46c9..a519895f7b17af657115f258786cfd10fec97a3a 100644 |
--- a/components/password_manager/core/browser/login_database_unittest.cc |
+++ b/components/password_manager/core/browser/login_database_unittest.cc |
@@ -38,6 +38,36 @@ PasswordStoreChangeList UpdateChangeForForm(const PasswordForm& form) { |
PasswordStoreChange::UPDATE, form)); |
} |
+void FormsAreEqual(const PasswordForm& expected, const PasswordForm& actual) { |
+ PasswordForm expected_copy(expected); |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+ // On the Mac we should never be storing passwords in the database. |
+ expected_copy.password_value = ASCIIToUTF16(""); |
+#endif |
+ EXPECT_EQ(expected_copy, actual); |
+} |
+ |
+void GenerateExamplePasswordForm(PasswordForm* form) { |
+ form->origin = GURL("http://accounts.google.com/LoginAuth"); |
+ form->action = GURL("http://accounts.google.com/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; |
+ form->times_used = 1; |
+ form->form_data.name = ASCIIToUTF16("form_name"); |
+ form->date_synced = base::Time::Now(); |
+ form->display_name = ASCIIToUTF16("Mr. Smith"); |
+ form->avatar_url = GURL("https://accounts.google.com/Avatar"); |
+ form->federation_url = GURL("https://accounts.google.com/federation"); |
+ form->is_zero_click = true; |
+} |
+ |
} // namespace |
// Serialization routines for vectors implemented in login_database.cc. |
@@ -53,15 +83,6 @@ class LoginDatabaseTest : public testing::Test { |
ASSERT_TRUE(db_.Init(file_)); |
} |
- void FormsAreEqual(const PasswordForm& expected, const PasswordForm& actual) { |
- PasswordForm expected_copy(expected); |
-#if defined(OS_MACOSX) && !defined(OS_IOS) |
- // On the Mac we should never be storing passwords in the database. |
- expected_copy.password_value = ASCIIToUTF16(""); |
-#endif |
- EXPECT_EQ(expected_copy, actual); |
- } |
- |
void TestNonHTMLFormPSLMatching(const PasswordForm::Scheme& scheme) { |
ScopedVector<PasswordForm> result; |
@@ -151,24 +172,7 @@ TEST_F(LoginDatabaseTest, Logins) { |
// Example password form. |
PasswordForm form; |
- form.origin = GURL("http://accounts.google.com/LoginAuth"); |
- form.action = GURL("http://accounts.google.com/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; |
- form.times_used = 1; |
- form.form_data.name = ASCIIToUTF16("form_name"); |
- form.date_synced = base::Time::Now(); |
- form.display_name = ASCIIToUTF16("Mr. Smith"); |
- form.avatar_url = GURL("https://accounts.google.com/Avatar"); |
- form.federation_url = GURL("https://accounts.google.com/federation"); |
- form.is_zero_click = true; |
+ GenerateExamplePasswordForm(&form); |
// Add it and make sure it is there and that all the fields were retrieved |
// correctly. |
@@ -1090,21 +1094,28 @@ TEST_F(LoginDatabaseTest, FilePermissions) { |
class LoginDatabaseMigrationTest : public testing::Test { |
protected: |
- void SetUp() override { |
- PathService::Get(base::DIR_SOURCE_ROOT, &database_dump_); |
- database_dump_ = database_dump_.AppendASCII("components") |
- .AppendASCII("test") |
- .AppendASCII("data") |
- .AppendASCII("password_manager") |
- .AppendASCII("login_db_v8.sql"); |
+ void SetUp() override { |
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
+ database_dump_location_ = database_dump_location_.AppendASCII("components") |
+ .AppendASCII("test") |
+ .AppendASCII("data") |
+ .AppendASCII("password_manager"); |
database_path_ = temp_dir_.path().AppendASCII("test.db"); |
+ } |
+ |
+ // Creates database of specific |version|. |
+ void CreateDatabase(int version) { |
+ base::FilePath database_dump; |
+ PathService::Get(base::DIR_SOURCE_ROOT, &database_dump); |
+ database_dump = |
+ database_dump.Append(database_dump_location_) |
+ .AppendASCII("login_db_v" + base::IntToString(version) + ".sql"); |
ASSERT_TRUE( |
- sql::test::CreateDatabaseFromSQL(database_path_, database_dump_)); |
+ sql::test::CreateDatabaseFromSQL(database_path_, database_dump)); |
} |
- void TearDown() override { |
+ void DestroyDatabase() { |
if (!database_path_.empty()) |
base::DeleteFile(database_path_, false); |
} |
@@ -1112,10 +1123,10 @@ class LoginDatabaseMigrationTest : public testing::Test { |
// Returns an empty vector on failure. Otherwise returns the values of the |
// date_created field from the logins table. The order of the returned rows |
// is well-defined. |
- std::vector<int64_t> GetDateCreated(const base::FilePath& db_path) { |
+ std::vector<int64_t> GetDateCreated() { |
sql::Connection db; |
std::vector<int64_t> results; |
- if (!db.Open(db_path)) |
+ if (!db.Open(database_path_)) |
return results; |
sql::Statement s(db.GetCachedStatement( |
@@ -1137,32 +1148,49 @@ class LoginDatabaseMigrationTest : public testing::Test { |
base::FilePath database_path_; |
private: |
- base::FilePath database_dump_; |
+ base::FilePath database_dump_location_; |
base::ScopedTempDir temp_dir_; |
}; |
-// Tests the migration of the login database from version 8 to version 9. |
-TEST_F(LoginDatabaseMigrationTest, MigrationV8ToV9) { |
- // Original date, in seconds since UTC epoch. |
- std::vector<int64_t> date_created(GetDateCreated(database_path_)); |
- ASSERT_EQ(1402955745, date_created[0]); |
- ASSERT_EQ(1402950000, date_created[1]); |
- |
- // Assert that the database was successfully opened and migrated. |
- { |
- LoginDatabase db; |
- ASSERT_TRUE(db.Init(database_path_)); |
- } |
- |
- // New date, in microseconds since platform independent epoch. |
- std::vector<int64_t> new_date_created(GetDateCreated(database_path_)); |
- ASSERT_EQ(13047429345000000, new_date_created[0]); |
- ASSERT_EQ(13047423600000000, new_date_created[1]); |
- |
- // Check that the two dates match up. |
- for (size_t i = 0; i < date_created.size(); ++i) { |
- EXPECT_EQ(base::Time::FromInternalValue(new_date_created[i]), |
- base::Time::FromTimeT(date_created[i])); |
+// Tests the migration of the login database from version 1 to version |
+// kCurrentVersionNumber. This test will fail when kCurrentVersionNumber |
+// will be changed to 10, because file login_db_v10.sql doesn't exist. |
+// It has to be added in order to fix test. |
+TEST_F(LoginDatabaseMigrationTest, MigrationV1ToVCurrent) { |
+ for (int version = 1; version < kCurrentVersionNumber; ++version) { |
+ CreateDatabase(version); |
+ // Original date, in seconds since UTC epoch. |
+ std::vector<int64_t> date_created(GetDateCreated()); |
+ ASSERT_EQ(1402955745, date_created[0]); |
+ ASSERT_EQ(1402950000, date_created[1]); |
+ |
+ { |
+ // Assert that the database was successfully opened and updated |
+ // to current version. |
+ LoginDatabase db; |
+ ASSERT_TRUE(db.Init(database_path_)); |
+ // Verifies that the final version can save all the appropriate fields. |
+ std::vector<PasswordForm*> result; |
+ PasswordForm form; |
+ GenerateExamplePasswordForm(&form); |
+ db.AddLogin(form); |
+ EXPECT_TRUE(db.GetLogins(form, &result)); |
+ ASSERT_EQ(1U, result.size()); |
+ FormsAreEqual(form, *result[0]); |
+ EXPECT_TRUE(db.RemoveLogin(form)); |
+ delete result[0]; |
+ result.clear(); |
+ } |
+ // New date, in microseconds since platform independent epoch. |
+ std::vector<int64_t> new_date_created(GetDateCreated()); |
+ ASSERT_EQ(13047429345000000, new_date_created[0]); |
+ ASSERT_EQ(13047423600000000, new_date_created[1]); |
+ // Check that the two dates match up. |
+ for (size_t i = 0; i < date_created.size(); ++i) { |
+ EXPECT_EQ(base::Time::FromInternalValue(new_date_created[i]), |
+ base::Time::FromTimeT(date_created[i])); |
+ } |
+ DestroyDatabase(); |
} |
} |