Index: chrome/browser/password_manager/native_backend_gnome_x_unittest.cc |
diff --git a/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc b/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc |
index 66f9902a45d239cb971395b63745f309bb415271..13905592a384c9e30992b1ea3206658cee8d84d5 100644 |
--- a/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc |
+++ b/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc |
@@ -282,6 +282,11 @@ class MockGnomeKeyringLoader : public GnomeKeyringLoader { |
class NativeBackendGnomeTest : public testing::Test { |
protected: |
+ enum UpdateType { // Used in CheckPSLUpdate(). |
+ UPDATE_BY_UPDATELOGIN, |
+ UPDATE_BY_ADDLOGIN, |
+ }; |
+ |
NativeBackendGnomeTest() |
: ui_thread_(BrowserThread::UI, &message_loop_), |
db_thread_(BrowserThread::DB) { |
@@ -396,16 +401,13 @@ class NativeBackendGnomeTest : public testing::Test { |
CheckStringAttribute(item, "application", app_string); |
} |
- // Checks (using EXPECT_* macros), that |credentials| are accessible for |
- // filling in for a page with |origin| iff |
- // |should_credential_be_available_to_url| is true. |
- void CheckCredentialAvailability(const PasswordForm& credentials, |
- const std::string& url, |
- bool should_credential_be_available_to_url) { |
- password_manager::PSLMatchingHelper helper; |
- ASSERT_TRUE(helper.IsMatchingEnabled()) |
- << "PSL matching needs to be enabled."; |
- |
+ // Saves |credentials| and then gets login for origin and realm |url|. Returns |
+ // true when something is found, and in such case copies the result to |
+ // |result| when |result| is not NULL. (Note that there can be max. 1 result, |
+ // derived from |credentials|.) |
+ bool CheckCredentialAvailability(const PasswordForm& credentials, |
+ const GURL& url, |
+ PasswordForm* result) { |
NativeBackendGnome backend(321); |
backend.Init(); |
@@ -417,8 +419,8 @@ class NativeBackendGnomeTest : public testing::Test { |
credentials)); |
PasswordForm target_form; |
- target_form.origin = GURL(url); |
- target_form.signon_realm = url; |
+ target_form.origin = url; |
+ target_form.signon_realm = url.spec(); |
std::vector<PasswordForm*> form_list; |
BrowserThread::PostTask( |
BrowserThread::DB, |
@@ -434,10 +436,131 @@ class NativeBackendGnomeTest : public testing::Test { |
if (mock_keyring_items.size() > 0) |
CheckMockKeyringItem(&mock_keyring_items[0], credentials, "chrome-321"); |
- if (should_credential_be_available_to_url) |
- EXPECT_EQ(1u, form_list.size()); |
- else |
- EXPECT_EQ(0u, form_list.size()); |
+ if (form_list.empty()) |
+ return false; |
+ EXPECT_EQ(1u, form_list.size()); |
+ if (result) |
+ *result = *form_list[0]; |
+ STLDeleteElements(&form_list); |
+ return true; |
+ } |
+ |
+ // Test that updating does not use PSL matching: Add a www.facebook.com |
+ // password, then use PSL matching to get a copy of it for m.facebook.com, and |
+ // add that copy as well. Now update the www.facebook.com password -- the |
+ // m.facebook.com password should not get updated. Depending on the argument, |
+ // the credential update is done via UpdateLogin or AddLogin. |
+ void CheckPSLUpdate(UpdateType update_type) { |
+ password_manager::PSLMatchingHelper helper; |
+ ASSERT_TRUE(helper.IsMatchingEnabled()); |
+ |
+ NativeBackendGnome backend(321); |
+ backend.Init(); |
+ |
+ // Add |form_facebook_| to saved logins. |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), |
+ base::Unretained(&backend), |
+ form_facebook_)); |
+ |
+ // Get the PSL-matched copy of the saved login for m.facebook. |
+ const GURL kMobileURL("http://m.facebook.com/"); |
+ PasswordForm m_facebook_lookup; |
+ m_facebook_lookup.origin = kMobileURL; |
+ m_facebook_lookup.signon_realm = kMobileURL.spec(); |
+ std::vector<PasswordForm*> form_list; |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::GetLogins), |
+ base::Unretained(&backend), |
+ m_facebook_lookup, |
+ &form_list)); |
+ RunBothThreads(); |
+ EXPECT_EQ(1u, mock_keyring_items.size()); |
+ EXPECT_EQ(1u, form_list.size()); |
+ PasswordForm m_facebook = *form_list[0]; |
+ STLDeleteElements(&form_list); |
+ EXPECT_EQ(kMobileURL, m_facebook.origin); |
+ EXPECT_EQ(kMobileURL.spec(), m_facebook.signon_realm); |
+ |
+ // Add the PSL-matched copy to saved logins. |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), |
+ base::Unretained(&backend), |
+ m_facebook)); |
+ RunBothThreads(); |
+ EXPECT_EQ(2u, mock_keyring_items.size()); |
+ |
+ // Update www.facebook.com login. |
+ PasswordForm new_facebook(form_facebook_); |
+ const base::string16 kOldPassword(form_facebook_.password_value); |
+ const base::string16 kNewPassword(UTF8ToUTF16("new_b")); |
+ EXPECT_NE(kOldPassword, kNewPassword); |
+ new_facebook.password_value = kNewPassword; |
+ switch (update_type) { |
+ case UPDATE_BY_UPDATELOGIN: |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::UpdateLogin), |
+ base::Unretained(&backend), |
+ new_facebook)); |
+ break; |
+ case UPDATE_BY_ADDLOGIN: |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), |
+ base::Unretained(&backend), |
+ new_facebook)); |
+ break; |
+ } |
+ |
+ RunBothThreads(); |
+ EXPECT_EQ(2u, mock_keyring_items.size()); |
+ |
+ // Check that m.facebook.com login was not modified by the update. |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::GetLogins), |
+ base::Unretained(&backend), |
+ m_facebook_lookup, |
+ &form_list)); |
+ RunBothThreads(); |
+ // There should be two results -- the exact one, and the PSL-matched one. |
+ EXPECT_EQ(2u, form_list.size()); |
+ size_t index_non_psl = 0; |
+ if (!form_list[index_non_psl]->original_signon_realm.empty()) |
+ index_non_psl = 1; |
+ EXPECT_EQ(kMobileURL, form_list[index_non_psl]->origin); |
+ EXPECT_EQ(kMobileURL.spec(), form_list[index_non_psl]->signon_realm); |
+ EXPECT_EQ(kOldPassword, form_list[index_non_psl]->password_value); |
+ STLDeleteElements(&form_list); |
+ |
+ // Check that www.facebook.com login was modified by the update. |
+ BrowserThread::PostTask( |
+ BrowserThread::DB, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&NativeBackendGnome::GetLogins), |
+ base::Unretained(&backend), |
+ form_facebook_, |
+ &form_list)); |
+ RunBothThreads(); |
+ // There should be two results -- the exact one, and the PSL-matched one. |
+ EXPECT_EQ(2u, form_list.size()); |
+ index_non_psl = 0; |
+ if (!form_list[index_non_psl]->original_signon_realm.empty()) |
+ index_non_psl = 1; |
+ EXPECT_EQ(form_facebook_.origin, form_list[index_non_psl]->origin); |
+ EXPECT_EQ(form_facebook_.signon_realm, |
+ form_list[index_non_psl]->signon_realm); |
+ EXPECT_EQ(kNewPassword, form_list[index_non_psl]->password_value); |
STLDeleteElements(&form_list); |
} |
@@ -496,24 +619,40 @@ TEST_F(NativeBackendGnomeTest, BasicListLogins) { |
// Save a password for www.facebook.com and see it suggested for m.facebook.com. |
TEST_F(NativeBackendGnomeTest, PSLMatchingPositive) { |
- CheckCredentialAvailability(form_facebook_, |
- "http://m.facebook.com/", |
- /*should_credential_be_available_to_url=*/true); |
+ PasswordForm result; |
+ const GURL kMobileURL("http://m.facebook.com/"); |
+ password_manager::PSLMatchingHelper helper; |
+ ASSERT_TRUE(helper.IsMatchingEnabled()); |
+ EXPECT_TRUE(CheckCredentialAvailability(form_facebook_, kMobileURL, &result)); |
+ EXPECT_EQ(kMobileURL, result.origin); |
+ EXPECT_EQ(kMobileURL.spec(), result.signon_realm); |
} |
// Save a password for www.facebook.com and see it not suggested for |
// m-facebook.com. |
TEST_F(NativeBackendGnomeTest, PSLMatchingNegativeDomainMismatch) { |
- CheckCredentialAvailability(form_facebook_, |
- "http://m-facebook.com/", |
- /*should_credential_be_available_to_url=*/false); |
+ password_manager::PSLMatchingHelper helper; |
+ ASSERT_TRUE(helper.IsMatchingEnabled()); |
+ EXPECT_FALSE(CheckCredentialAvailability( |
+ form_facebook_, GURL("http://m-facebook.com/"), NULL)); |
} |
// Test PSL matching is off for domains excluded from it. |
TEST_F(NativeBackendGnomeTest, PSLMatchingDisabledDomains) { |
- CheckCredentialAvailability(form_google_, |
- "http://one.google.com/", |
- /*should_credential_be_available_to_url=*/false); |
+ password_manager::PSLMatchingHelper helper; |
+ ASSERT_TRUE(helper.IsMatchingEnabled()); |
+ EXPECT_FALSE(CheckCredentialAvailability( |
+ form_google_, GURL("http://one.google.com/"), NULL)); |
+} |
+ |
+TEST_F(NativeBackendGnomeTest, PSLUpdatingStrictUpdateLogin) { |
+ CheckPSLUpdate(UPDATE_BY_UPDATELOGIN); |
+} |
+ |
+TEST_F(NativeBackendGnomeTest, PSLUpdatingStrictAddLogin) { |
+ // TODO(vabr): if AddLogin becomes no longer valid for existing logins, then |
+ // just delete this test. |
+ CheckPSLUpdate(UPDATE_BY_ADDLOGIN); |
} |
TEST_F(NativeBackendGnomeTest, BasicUpdateLogin) { |