| 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();
|
| }
|
| }
|
|
|
|
|