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

Side by Side Diff: chrome/browser/password_manager/password_store_mac_unittest.cc

Issue 23477015: [sync] Significantly speed up password model association on mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years, 2 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/password_manager/password_store_mac_internal.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "testing/gmock/include/gmock/gmock.h" 5 #include "testing/gmock/include/gmock/gmock.h"
6 #include "testing/gtest/include/gtest/gtest.h" 6 #include "testing/gtest/include/gtest/gtest.h"
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/files/scoped_temp_dir.h" 9 #include "base/files/scoped_temp_dir.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 "http://a.server.com/", L"abc", L"123", false, 273 "http://a.server.com/", L"abc", L"123", false,
274 1601, 1, 1, 0, 0, 0 }, 274 1601, 1, 1, 0, 0, 0 },
275 }; 275 };
276 276
277 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(expected); ++i) { 277 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(expected); ++i) {
278 // Create our fake KeychainItemRef; see MockAppleKeychain docs. 278 // Create our fake KeychainItemRef; see MockAppleKeychain docs.
279 SecKeychainItemRef keychain_item = 279 SecKeychainItemRef keychain_item =
280 reinterpret_cast<SecKeychainItemRef>(i + 1); 280 reinterpret_cast<SecKeychainItemRef>(i + 1);
281 PasswordForm form; 281 PasswordForm form;
282 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( 282 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
283 *keychain_, keychain_item, &form); 283 *keychain_, keychain_item, &form, true);
284 284
285 EXPECT_TRUE(parsed) << "In iteration " << i; 285 EXPECT_TRUE(parsed) << "In iteration " << i;
286 286
287 EXPECT_EQ(expected[i].scheme, form.scheme) << "In iteration " << i; 287 EXPECT_EQ(expected[i].scheme, form.scheme) << "In iteration " << i;
288 EXPECT_EQ(GURL(expected[i].origin), form.origin) << "In iteration " << i; 288 EXPECT_EQ(GURL(expected[i].origin), form.origin) << "In iteration " << i;
289 EXPECT_EQ(expected[i].ssl_valid, form.ssl_valid) << "In iteration " << i; 289 EXPECT_EQ(expected[i].ssl_valid, form.ssl_valid) << "In iteration " << i;
290 EXPECT_EQ(std::string(expected[i].signon_realm), form.signon_realm) 290 EXPECT_EQ(std::string(expected[i].signon_realm), form.signon_realm)
291 << "In iteration " << i; 291 << "In iteration " << i;
292 if (expected[i].username) { 292 if (expected[i].username) {
293 EXPECT_EQ(WideToUTF16(expected[i].username), form.username_value) 293 EXPECT_EQ(WideToUTF16(expected[i].username), form.username_value)
(...skipping 18 matching lines...) Expand all
312 << "In iteration " << i; 312 << "In iteration " << i;
313 EXPECT_EQ(expected[i].creation_second, exploded_time.second) 313 EXPECT_EQ(expected[i].creation_second, exploded_time.second)
314 << "In iteration " << i; 314 << "In iteration " << i;
315 } 315 }
316 316
317 { 317 {
318 // Use an invalid ref, to make sure errors are reported. 318 // Use an invalid ref, to make sure errors are reported.
319 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(99); 319 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(99);
320 PasswordForm form; 320 PasswordForm form;
321 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( 321 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
322 *keychain_, keychain_item, &form); 322 *keychain_, keychain_item, &form, true);
323 EXPECT_FALSE(parsed); 323 EXPECT_FALSE(parsed);
324 } 324 }
325 } 325 }
326 326
327 TEST_F(PasswordStoreMacInternalsTest, TestKeychainSearch) { 327 TEST_F(PasswordStoreMacInternalsTest, TestKeychainSearch) {
328 struct TestDataAndExpectation { 328 struct TestDataAndExpectation {
329 const PasswordFormData data; 329 const PasswordFormData data;
330 const size_t expected_fill_matches; 330 const size_t expected_fill_matches;
331 const size_t expected_merge_matches; 331 const size_t expected_merge_matches;
332 }; 332 };
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 381
382 // Check matches treating the form as a fill target. 382 // Check matches treating the form as a fill target.
383 std::vector<PasswordForm*> matching_items = 383 std::vector<PasswordForm*> matching_items =
384 keychain_adapter.PasswordsFillingForm(*query_form); 384 keychain_adapter.PasswordsFillingForm(*query_form);
385 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size()); 385 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size());
386 STLDeleteElements(&matching_items); 386 STLDeleteElements(&matching_items);
387 387
388 // Check matches treating the form as a merging target. 388 // Check matches treating the form as a merging target.
389 EXPECT_EQ(test_data[i].expected_merge_matches > 0, 389 EXPECT_EQ(test_data[i].expected_merge_matches > 0,
390 keychain_adapter.HasPasswordsMergeableWithForm(*query_form)); 390 keychain_adapter.HasPasswordsMergeableWithForm(*query_form));
391 matching_items = keychain_adapter.PasswordsMergeableWithForm(*query_form); 391 std::vector<SecKeychainItemRef> keychain_items;
392 std::vector<internal_keychain_helpers::ItemFormPair> item_form_pairs =
393 internal_keychain_helpers::
394 ExtractAllKeychainItemAttributesIntoPasswordForms(&keychain_items,
395 *keychain_);
396 matching_items =
397 internal_keychain_helpers::ExtractPasswordsMergeableWithForm(
398 *keychain_, item_form_pairs, *query_form);
392 EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size()); 399 EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size());
400 STLDeleteContainerPairSecondPointers(item_form_pairs.begin(),
401 item_form_pairs.end());
402 for (std::vector<SecKeychainItemRef>::iterator i = keychain_items.begin();
403 i != keychain_items.end(); ++i) {
404 keychain_->Free(*i);
405 }
393 STLDeleteElements(&matching_items); 406 STLDeleteElements(&matching_items);
394 407
395 // None of the pre-seeded items are owned by us, so none should match an 408 // None of the pre-seeded items are owned by us, so none should match an
396 // owned-passwords-only search. 409 // owned-passwords-only search.
397 matching_items = owned_keychain_adapter.PasswordsFillingForm(*query_form); 410 matching_items = owned_keychain_adapter.PasswordsFillingForm(*query_form);
398 EXPECT_EQ(0U, matching_items.size()); 411 EXPECT_EQ(0U, matching_items.size());
399 STLDeleteElements(&matching_items); 412 STLDeleteElements(&matching_items);
400 } 413 }
401 } 414 }
402 415
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 "http://some.domain.com/insecure.html", NULL, 564 "http://some.domain.com/insecure.html", NULL,
552 NULL, NULL, NULL, L"joe_user", L"updated_password", false, false, 0 565 NULL, NULL, NULL, L"joe_user", L"updated_password", false, false, 0
553 }; 566 };
554 scoped_ptr<PasswordForm> update_form(CreatePasswordFormFromData(data)); 567 scoped_ptr<PasswordForm> update_form(CreatePasswordFormFromData(data));
555 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); 568 MacKeychainPasswordFormAdapter keychain_adapter(keychain_);
556 EXPECT_TRUE(keychain_adapter.AddPassword(*update_form)); 569 EXPECT_TRUE(keychain_adapter.AddPassword(*update_form));
557 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(2); 570 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(2);
558 PasswordForm stored_form; 571 PasswordForm stored_form;
559 internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_, 572 internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_,
560 keychain_item, 573 keychain_item,
561 &stored_form); 574 &stored_form,
575 true);
562 EXPECT_EQ(update_form->password_value, stored_form.password_value); 576 EXPECT_EQ(update_form->password_value, stored_form.password_value);
563 } 577 }
564 } 578 }
565 579
566 TEST_F(PasswordStoreMacInternalsTest, TestKeychainRemove) { 580 TEST_F(PasswordStoreMacInternalsTest, TestKeychainRemove) {
567 struct TestDataAndExpectation { 581 struct TestDataAndExpectation {
568 PasswordFormData data; 582 PasswordFormData data;
569 bool should_succeed; 583 bool should_succeed;
570 }; 584 };
571 TestDataAndExpectation test_data[] = { 585 TestDataAndExpectation test_data[] = {
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 EXPECT_EQ(2U, database_forms.size()); 869 EXPECT_EQ(2U, database_forms.size());
856 ASSERT_EQ(3U, merged_forms.size()); 870 ASSERT_EQ(3U, merged_forms.size());
857 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value); 871 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value);
858 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value); 872 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value);
859 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user); 873 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user);
860 874
861 STLDeleteElements(&database_forms); 875 STLDeleteElements(&database_forms);
862 STLDeleteElements(&merged_forms); 876 STLDeleteElements(&merged_forms);
863 } 877 }
864 878
879 TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) {
880 PasswordFormData db_data[] = {
881 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/",
882 "http://dont.remember.com/",
883 "http://dont.remember.com/handlepage.cgi",
884 L"submit", L"username", L"password", L"joe_user", L"non_empty_password",
885 true, false, 1240000000 },
886 { PasswordForm::SCHEME_HTML, "https://dont.remember.com/",
887 "https://dont.remember.com/",
888 "https://dont.remember.com/handlepage_secure.cgi",
889 L"submit", L"username", L"password", L"joe_user", L"non_empty_password",
890 true, false, 1240000000 },
891 };
892 std::vector<PasswordForm*> database_forms;
893 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(db_data); ++i) {
894 database_forms.push_back(CreatePasswordFormFromData(db_data[i]));
895 }
896 std::vector<PasswordForm*> merged_forms =
897 internal_keychain_helpers::GetPasswordsForForms(*keychain_,
898 &database_forms);
899 EXPECT_EQ(2U, database_forms.size());
900 ASSERT_EQ(0U, merged_forms.size());
901
902 STLDeleteElements(&database_forms);
903 STLDeleteElements(&merged_forms);
904 }
905
906 TEST_F(PasswordStoreMacInternalsTest, TestFillPasswordFormFromKeychainItem) {
907 // When |extract_password_data| is false, the password field must be empty,
908 // and |blacklisted_by_user| must be false.
909 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(1);
910 PasswordForm form_without_extracted_password;
911 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
912 *keychain_,
913 keychain_item,
914 &form_without_extracted_password,
915 false); // Do not extract password.
916 EXPECT_TRUE(parsed);
917 ASSERT_TRUE(form_without_extracted_password.password_value.empty());
918 ASSERT_FALSE(form_without_extracted_password.blacklisted_by_user);
919
920 // When |extract_password_data| is true and the keychain entry has a non-empty
921 // password, the password field must be non-empty, and the value of
922 // |blacklisted_by_user| must be false.
923 keychain_item = reinterpret_cast<SecKeychainItemRef>(1);
924 PasswordForm form_with_extracted_password;
925 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
926 *keychain_,
927 keychain_item,
928 &form_with_extracted_password,
929 true); // Extract password.
930 EXPECT_TRUE(parsed);
931 ASSERT_EQ(ASCIIToUTF16("sekrit"),
932 form_with_extracted_password.password_value);
933 ASSERT_FALSE(form_with_extracted_password.blacklisted_by_user);
934
935 // When |extract_password_data| is true and the keychain entry has an empty
936 // username and password (""), the password field must be empty, and the value
937 // of |blacklisted_by_user| must be true.
938 keychain_item = reinterpret_cast<SecKeychainItemRef>(4);
939 PasswordForm negative_form;
940 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
941 *keychain_,
942 keychain_item,
943 &negative_form,
944 true); // Extract password.
945 EXPECT_TRUE(parsed);
946 ASSERT_TRUE(negative_form.username_value.empty());
947 ASSERT_TRUE(negative_form.password_value.empty());
948 ASSERT_TRUE(negative_form.blacklisted_by_user);
949
950 // When |extract_password_data| is true and the keychain entry has an empty
951 // password (""), the password field must be empty (""), and the value of
952 // |blacklisted_by_user| must be true.
953 keychain_item = reinterpret_cast<SecKeychainItemRef>(5);
954 PasswordForm form_with_empty_password_a;
955 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
956 *keychain_,
957 keychain_item,
958 &form_with_empty_password_a,
959 true); // Extract password.
960 EXPECT_TRUE(parsed);
961 ASSERT_TRUE(form_with_empty_password_a.password_value.empty());
962 ASSERT_TRUE(form_with_empty_password_a.blacklisted_by_user);
963
964 // When |extract_password_data| is true and the keychain entry has a single
965 // space password (" "), the password field must be a single space (" "), and
966 // the value of |blacklisted_by_user| must be true.
967 keychain_item = reinterpret_cast<SecKeychainItemRef>(6);
968 PasswordForm form_with_empty_password_b;
969 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
970 *keychain_,
971 keychain_item,
972 &form_with_empty_password_b,
973 true); // Extract password.
974 EXPECT_TRUE(parsed);
975 ASSERT_EQ(ASCIIToUTF16(" "),
976 form_with_empty_password_b.password_value);
977 ASSERT_TRUE(form_with_empty_password_b.blacklisted_by_user);
978 }
979
865 TEST_F(PasswordStoreMacInternalsTest, TestPasswordGetAll) { 980 TEST_F(PasswordStoreMacInternalsTest, TestPasswordGetAll) {
866 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); 981 MacKeychainPasswordFormAdapter keychain_adapter(keychain_);
867 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); 982 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_);
868 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); 983 owned_keychain_adapter.SetFindsOnlyOwnedItems(true);
869 984
870 // Add a few passwords of various types so that we own some. 985 // Add a few passwords of various types so that we own some.
871 PasswordFormData owned_password_data[] = { 986 PasswordFormData owned_password_data[] = {
872 { PasswordForm::SCHEME_HTML, "http://web.site.com/", 987 { PasswordForm::SCHEME_HTML, "http://web.site.com/",
873 "http://web.site.com/path/to/page.html", NULL, NULL, NULL, NULL, 988 "http://web.site.com/path/to/page.html", NULL, NULL, NULL, NULL,
874 L"anonymous", L"knock-knock", false, false, 0 }, 989 L"anonymous", L"knock-knock", false, false, 0 },
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 EXPECT_EQ(0U, matching_items.size()) << "iteration " << i; 1136 EXPECT_EQ(0U, matching_items.size()) << "iteration " << i;
1022 } 1137 }
1023 STLDeleteElements(&matching_items); 1138 STLDeleteElements(&matching_items);
1024 1139
1025 login_db_->GetLogins(*query_form, &matching_items); 1140 login_db_->GetLogins(*query_form, &matching_items);
1026 EXPECT_EQ(updates[i].password ? 1U : 0U, matching_items.size()) 1141 EXPECT_EQ(updates[i].password ? 1U : 0U, matching_items.size())
1027 << "iteration " << i; 1142 << "iteration " << i;
1028 STLDeleteElements(&matching_items); 1143 STLDeleteElements(&matching_items);
1029 } 1144 }
1030 } 1145 }
OLDNEW
« no previous file with comments | « chrome/browser/password_manager/password_store_mac_internal.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698