Index: chrome/browser/password_manager/password_store_mac_unittest.cc |
=================================================================== |
--- chrome/browser/password_manager/password_store_mac_unittest.cc (revision 19855) |
+++ chrome/browser/password_manager/password_store_mac_unittest.cc (working copy) |
@@ -331,114 +331,93 @@ |
} |
} |
-TEST_F(PasswordStoreMacTest, TestKeychainExactSearch) { |
- // Test a web form entry (SCHEME_HTML). |
- { |
- PasswordForm search_form; |
- search_form.signon_realm = std::string("http://some.domain.com/"); |
- search_form.origin = GURL("http://some.domain.com/insecure.html"); |
- search_form.action = GURL("http://some.domain.com/submit.cgi"); |
- search_form.username_element = std::wstring(L"username"); |
- search_form.username_value = std::wstring(L"joe_user"); |
- search_form.password_element = std::wstring(L"password"); |
- search_form.preferred = true; |
- SecKeychainItemRef match; |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- search_form); |
- EXPECT_EQ(reinterpret_cast<SecKeychainItemRef>(2), match); |
- keychain_->Free(match); |
+// Changes just the origin path of |form|. |
+static void SetPasswordFormPath(PasswordForm* form, const char* path) { |
+ GURL::Replacements replacement; |
+ std::string new_value(path); |
+ replacement.SetPathStr(new_value); |
+ form->origin = form->origin.ReplaceComponents(replacement); |
+} |
- // Make sure that the matching isn't looser than it should be. |
- PasswordForm wrong_username(search_form); |
- wrong_username.username_value = std::wstring(L"wrong_user"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_username); |
- EXPECT_EQ(NULL, match); |
+// Changes just the signon_realm port of |form|. |
+static void SetPasswordFormPort(PasswordForm* form, const char* port) { |
+ GURL::Replacements replacement; |
+ std::string new_value(port); |
+ replacement.SetPortStr(new_value); |
+ GURL signon_gurl = GURL(form->signon_realm); |
+ form->signon_realm = signon_gurl.ReplaceComponents(replacement).spec(); |
+} |
- PasswordForm wrong_path(search_form); |
- wrong_path.origin = GURL("http://some.domain.com/elsewhere.html"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_path); |
- EXPECT_EQ(NULL, match); |
+// Changes just the signon_ream auth realm of |form|. |
+static void SetPasswordFormRealm(PasswordForm* form, const char* realm) { |
+ GURL::Replacements replacement; |
+ std::string new_value(realm); |
+ replacement.SetPathStr(new_value); |
+ GURL signon_gurl = GURL(form->signon_realm); |
+ form->signon_realm = signon_gurl.ReplaceComponents(replacement).spec(); |
+} |
- PasswordForm wrong_scheme(search_form); |
- wrong_scheme.scheme = PasswordForm::SCHEME_BASIC; |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_scheme); |
- EXPECT_EQ(NULL, match); |
+TEST_F(PasswordStoreMacTest, TestKeychainExactSearch) { |
+ MacKeychainPasswordFormAdapter keychainAdapter(keychain_); |
- // With no path, we should match the pathless Keychain entry. |
- PasswordForm no_path(search_form); |
- no_path.origin = GURL("http://some.domain.com/"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- no_path); |
- EXPECT_EQ(reinterpret_cast<SecKeychainItemRef>(1), match); |
- keychain_->Free(match); |
+ PasswordFormData base_form_data[] = { |
+ { PasswordForm::SCHEME_HTML, "http://some.domain.com/", |
+ "http://some.domain.com/insecure.html", |
+ NULL, NULL, NULL, NULL, L"joe_user", NULL, true, false, 0 }, |
+ { PasswordForm::SCHEME_BASIC, "http://some.domain.com:4567/low_security", |
+ "http://some.domain.com:4567/insecure.html", |
+ NULL, NULL, NULL, NULL, L"basic_auth_user", NULL, true, false, 0 }, |
+ { PasswordForm::SCHEME_DIGEST, "https://some.domain.com/high_security", |
+ "https://some.domain.com", |
+ NULL, NULL, NULL, NULL, L"digest_auth_user", NULL, true, true, 0 }, |
+ }; |
- // We don't store blacklist entries in the keychain, and we want to ignore |
- // those stored by other browsers. |
- PasswordForm blacklist(search_form); |
- blacklist.blacklisted_by_user = true; |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- blacklist); |
- EXPECT_EQ(NULL, match); |
- } |
+ for (unsigned int i = 0; i < arraysize(base_form_data); ++i) { |
+ // Create a base form and make sure we find a match. |
+ scoped_ptr<PasswordForm> base_form(CreatePasswordFormFromData( |
+ base_form_data[i])); |
+ PasswordForm* match = |
+ keychainAdapter.PasswordExactlyMatchingForm(*base_form); |
+ EXPECT_TRUE(match != NULL); |
+ if (match) { |
+ EXPECT_EQ(base_form->scheme, match->scheme); |
+ EXPECT_EQ(base_form->origin, match->origin); |
+ EXPECT_EQ(base_form->username_value, match->username_value); |
+ delete match; |
+ } |
- // Test an http auth entry (SCHEME_BASIC, but SCHEME_DIGEST works is searched |
- // the same way, so this gives sufficient coverage of both). |
- { |
- PasswordForm search_form; |
- search_form.signon_realm = |
- std::string("http://some.domain.com:4567/low_security"); |
- search_form.origin = GURL("http://some.domain.com:4567/insecure.html"); |
- search_form.username_value = std::wstring(L"basic_auth_user"); |
- search_form.scheme = PasswordForm::SCHEME_BASIC; |
- SecKeychainItemRef match; |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- search_form); |
- EXPECT_EQ(reinterpret_cast<SecKeychainItemRef>(7), match); |
- keychain_->Free(match); |
+ // Make sure that the matching isn't looser than it should be by checking |
+ // that slightly altered forms don't match. |
+ std::vector<PasswordForm*> modified_forms; |
- // Make sure that the matching isn't looser than it should be. |
- PasswordForm wrong_username(search_form); |
- wrong_username.username_value = std::wstring(L"wrong_user"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_username); |
- EXPECT_EQ(NULL, match); |
+ modified_forms.push_back(new PasswordForm(*base_form)); |
+ modified_forms.back()->username_value = std::wstring(L"wrong_user"); |
- PasswordForm wrong_path(search_form); |
- wrong_path.origin = GURL("http://some.domain.com:4567/elsewhere.html"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_path); |
- EXPECT_EQ(NULL, match); |
+ modified_forms.push_back(new PasswordForm(*base_form)); |
+ SetPasswordFormPath(modified_forms.back(), "elsewhere.html"); |
- PasswordForm wrong_scheme(search_form); |
- wrong_scheme.scheme = PasswordForm::SCHEME_DIGEST; |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_scheme); |
- EXPECT_EQ(NULL, match); |
+ modified_forms.push_back(new PasswordForm(*base_form)); |
+ modified_forms.back()->scheme = PasswordForm::SCHEME_OTHER; |
- PasswordForm wrong_port(search_form); |
- wrong_port.signon_realm = |
- std::string("http://some.domain.com:1234/low_security"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_port); |
- EXPECT_EQ(NULL, match); |
+ modified_forms.push_back(new PasswordForm(*base_form)); |
+ SetPasswordFormPort(modified_forms.back(), "1234"); |
- PasswordForm wrong_realm(search_form); |
- wrong_realm.signon_realm = |
- std::string("http://some.domain.com:4567/incorrect"); |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- wrong_realm); |
- EXPECT_EQ(NULL, match); |
+ modified_forms.push_back(new PasswordForm(*base_form)); |
+ modified_forms.back()->blacklisted_by_user = true; |
- // We don't store blacklist entries in the keychain, and we want to ignore |
- // those stored by other browsers. |
- PasswordForm blacklist(search_form); |
- blacklist.blacklisted_by_user = true; |
- match = internal_keychain_helpers::MatchingKeychainItem(*keychain_, |
- blacklist); |
- EXPECT_EQ(NULL, match); |
+ if (base_form->scheme == PasswordForm::SCHEME_BASIC || |
+ base_form->scheme == PasswordForm::SCHEME_DIGEST) { |
+ modified_forms.push_back(new PasswordForm(*base_form)); |
+ SetPasswordFormRealm(modified_forms.back(), "incorrect"); |
+ } |
+ |
+ for (unsigned int j = 0; j < modified_forms.size(); ++j) { |
+ PasswordForm* match = |
+ keychainAdapter.PasswordExactlyMatchingForm(*modified_forms[j]); |
+ EXPECT_EQ(NULL, match) << "In modified version " << j << " of base form " |
+ << i; |
+ } |
+ STLDeleteElements(&modified_forms); |
} |
} |
@@ -479,19 +458,14 @@ |
bool add_succeeded = keychainAdapter.AddLogin(*in_form); |
EXPECT_EQ(test_data[i].should_succeed, add_succeeded); |
if (add_succeeded) { |
- SecKeychainItemRef matching_item; |
- matching_item = internal_keychain_helpers::MatchingKeychainItem( |
- *keychain_, *in_form); |
- EXPECT_TRUE(matching_item != NULL); |
- PasswordForm out_form; |
- internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
- *keychain_, matching_item, &out_form); |
- EXPECT_EQ(out_form.scheme, in_form->scheme); |
- EXPECT_EQ(out_form.signon_realm, in_form->signon_realm); |
- EXPECT_EQ(out_form.origin, in_form->origin); |
- EXPECT_EQ(out_form.username_value, in_form->username_value); |
- EXPECT_EQ(out_form.password_value, in_form->password_value); |
- keychain_->Free(matching_item); |
+ scoped_ptr<PasswordForm> out_form( |
+ keychainAdapter.PasswordExactlyMatchingForm(*in_form)); |
+ EXPECT_TRUE(out_form.get() != NULL); |
+ EXPECT_EQ(out_form->scheme, in_form->scheme); |
+ EXPECT_EQ(out_form->signon_realm, in_form->signon_realm); |
+ EXPECT_EQ(out_form->origin, in_form->origin); |
+ EXPECT_EQ(out_form->username_value, in_form->username_value); |
+ EXPECT_EQ(out_form->password_value, in_form->password_value); |
} |
delete in_form; |
} |