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

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

Issue 825773003: PasswordStore: Use ScopedVector to express ownership of forms (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use assignment instead of construction Created 5 years, 10 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
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 "chrome/browser/password_manager/password_store_mac.h" 5 #include "chrome/browser/password_manager/password_store_mac.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/files/scoped_temp_dir.h" 8 #include "base/files/scoped_temp_dir.h"
9 #include "base/memory/scoped_vector.h"
10 #include "base/scoped_observer.h" 9 #include "base/scoped_observer.h"
11 #include "base/stl_util.h" 10 #include "base/stl_util.h"
12 #include "base/strings/string_util.h" 11 #include "base/strings/string_util.h"
13 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
14 #include "base/synchronization/waitable_event.h" 13 #include "base/synchronization/waitable_event.h"
15 #include "chrome/browser/password_manager/password_store_mac_internal.h" 14 #include "chrome/browser/password_manager/password_store_mac_internal.h"
16 #include "chrome/common/chrome_paths.h" 15 #include "chrome/common/chrome_paths.h"
17 #include "components/password_manager/core/browser/login_database.h" 16 #include "components/password_manager/core/browser/login_database.h"
18 #include "components/password_manager/core/browser/password_store_consumer.h" 17 #include "components/password_manager/core/browser/password_store_consumer.h"
19 #include "content/public/test/test_browser_thread.h" 18 #include "content/public/test/test_browser_thread.h"
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 }; 474 };
476 475
477 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); 476 MacKeychainPasswordFormAdapter keychain_adapter(keychain_);
478 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); 477 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_);
479 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); 478 owned_keychain_adapter.SetFindsOnlyOwnedItems(true);
480 for (unsigned int i = 0; i < arraysize(test_data); ++i) { 479 for (unsigned int i = 0; i < arraysize(test_data); ++i) {
481 scoped_ptr<PasswordForm> query_form( 480 scoped_ptr<PasswordForm> query_form(
482 CreatePasswordFormFromData(test_data[i].data)); 481 CreatePasswordFormFromData(test_data[i].data));
483 482
484 // Check matches treating the form as a fill target. 483 // Check matches treating the form as a fill target.
485 std::vector<PasswordForm*> matching_items = 484 ScopedVector<autofill::PasswordForm> matching_items =
486 keychain_adapter.PasswordsFillingForm(query_form->signon_realm, 485 keychain_adapter.PasswordsFillingForm(query_form->signon_realm,
487 query_form->scheme); 486 query_form->scheme);
488 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size()); 487 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size());
489 STLDeleteElements(&matching_items); 488 matching_items.clear();
490 489
491 // Check matches treating the form as a merging target. 490 // Check matches treating the form as a merging target.
492 EXPECT_EQ(test_data[i].expected_merge_matches > 0, 491 EXPECT_EQ(test_data[i].expected_merge_matches > 0,
493 keychain_adapter.HasPasswordsMergeableWithForm(*query_form)); 492 keychain_adapter.HasPasswordsMergeableWithForm(*query_form));
494 std::vector<SecKeychainItemRef> keychain_items; 493 std::vector<SecKeychainItemRef> keychain_items;
495 std::vector<internal_keychain_helpers::ItemFormPair> item_form_pairs = 494 std::vector<internal_keychain_helpers::ItemFormPair> item_form_pairs =
496 internal_keychain_helpers:: 495 internal_keychain_helpers::
497 ExtractAllKeychainItemAttributesIntoPasswordForms(&keychain_items, 496 ExtractAllKeychainItemAttributesIntoPasswordForms(&keychain_items,
498 *keychain_); 497 *keychain_);
499 matching_items = 498 matching_items =
500 internal_keychain_helpers::ExtractPasswordsMergeableWithForm( 499 internal_keychain_helpers::ExtractPasswordsMergeableWithForm(
501 *keychain_, item_form_pairs, *query_form); 500 *keychain_, item_form_pairs, *query_form);
502 EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size()); 501 EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size());
503 STLDeleteContainerPairSecondPointers(item_form_pairs.begin(), 502 STLDeleteContainerPairSecondPointers(item_form_pairs.begin(),
504 item_form_pairs.end()); 503 item_form_pairs.end());
505 for (std::vector<SecKeychainItemRef>::iterator i = keychain_items.begin(); 504 for (std::vector<SecKeychainItemRef>::iterator i = keychain_items.begin();
506 i != keychain_items.end(); ++i) { 505 i != keychain_items.end(); ++i) {
507 keychain_->Free(*i); 506 keychain_->Free(*i);
508 } 507 }
509 STLDeleteElements(&matching_items);
510 508
511 // None of the pre-seeded items are owned by us, so none should match an 509 // None of the pre-seeded items are owned by us, so none should match an
512 // owned-passwords-only search. 510 // owned-passwords-only search.
513 matching_items = owned_keychain_adapter.PasswordsFillingForm( 511 matching_items = owned_keychain_adapter.PasswordsFillingForm(
514 query_form->signon_realm, query_form->scheme); 512 query_form->signon_realm, query_form->scheme);
515 EXPECT_EQ(0U, matching_items.size()); 513 EXPECT_EQ(0U, matching_items.size());
516 STLDeleteElements(&matching_items);
517 } 514 }
518 } 515 }
519 516
520 // Changes just the origin path of |form|. 517 // Changes just the origin path of |form|.
521 static void SetPasswordFormPath(PasswordForm* form, const char* path) { 518 static void SetPasswordFormPath(PasswordForm* form, const char* path) {
522 GURL::Replacements replacement; 519 GURL::Replacements replacement;
523 std::string new_value(path); 520 std::string new_value(path);
524 replacement.SetPathStr(new_value); 521 replacement.SetPathStr(new_value);
525 form->origin = form->origin.ReplaceComponents(replacement); 522 form->origin = form->origin.ReplaceComponents(replacement);
526 } 523 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 557
561 for (unsigned int i = 0; i < arraysize(base_form_data); ++i) { 558 for (unsigned int i = 0; i < arraysize(base_form_data); ++i) {
562 // Create a base form and make sure we find a match. 559 // Create a base form and make sure we find a match.
563 scoped_ptr<PasswordForm> base_form(CreatePasswordFormFromData( 560 scoped_ptr<PasswordForm> base_form(CreatePasswordFormFromData(
564 base_form_data[i])); 561 base_form_data[i]));
565 EXPECT_TRUE(keychain_adapter.HasPasswordsMergeableWithForm(*base_form)); 562 EXPECT_TRUE(keychain_adapter.HasPasswordsMergeableWithForm(*base_form));
566 EXPECT_TRUE(keychain_adapter.HasPasswordExactlyMatchingForm(*base_form)); 563 EXPECT_TRUE(keychain_adapter.HasPasswordExactlyMatchingForm(*base_form));
567 564
568 // Make sure that the matching isn't looser than it should be by checking 565 // Make sure that the matching isn't looser than it should be by checking
569 // that slightly altered forms don't match. 566 // that slightly altered forms don't match.
570 std::vector<PasswordForm*> modified_forms; 567 ScopedVector<autofill::PasswordForm> modified_forms;
571 568
572 modified_forms.push_back(new PasswordForm(*base_form)); 569 modified_forms.push_back(new PasswordForm(*base_form));
573 modified_forms.back()->username_value = ASCIIToUTF16("wrong_user"); 570 modified_forms.back()->username_value = ASCIIToUTF16("wrong_user");
574 571
575 modified_forms.push_back(new PasswordForm(*base_form)); 572 modified_forms.push_back(new PasswordForm(*base_form));
576 SetPasswordFormPath(modified_forms.back(), "elsewhere.html"); 573 SetPasswordFormPath(modified_forms.back(), "elsewhere.html");
577 574
578 modified_forms.push_back(new PasswordForm(*base_form)); 575 modified_forms.push_back(new PasswordForm(*base_form));
579 modified_forms.back()->scheme = PasswordForm::SCHEME_OTHER; 576 modified_forms.back()->scheme = PasswordForm::SCHEME_OTHER;
580 577
581 modified_forms.push_back(new PasswordForm(*base_form)); 578 modified_forms.push_back(new PasswordForm(*base_form));
582 SetPasswordFormPort(modified_forms.back(), "1234"); 579 SetPasswordFormPort(modified_forms.back(), "1234");
583 580
584 modified_forms.push_back(new PasswordForm(*base_form)); 581 modified_forms.push_back(new PasswordForm(*base_form));
585 modified_forms.back()->blacklisted_by_user = true; 582 modified_forms.back()->blacklisted_by_user = true;
586 583
587 if (base_form->scheme == PasswordForm::SCHEME_BASIC || 584 if (base_form->scheme == PasswordForm::SCHEME_BASIC ||
588 base_form->scheme == PasswordForm::SCHEME_DIGEST) { 585 base_form->scheme == PasswordForm::SCHEME_DIGEST) {
589 modified_forms.push_back(new PasswordForm(*base_form)); 586 modified_forms.push_back(new PasswordForm(*base_form));
590 SetPasswordFormRealm(modified_forms.back(), "incorrect"); 587 SetPasswordFormRealm(modified_forms.back(), "incorrect");
591 } 588 }
592 589
593 for (unsigned int j = 0; j < modified_forms.size(); ++j) { 590 for (unsigned int j = 0; j < modified_forms.size(); ++j) {
594 bool match = keychain_adapter.HasPasswordExactlyMatchingForm( 591 bool match = keychain_adapter.HasPasswordExactlyMatchingForm(
595 *modified_forms[j]); 592 *modified_forms[j]);
596 EXPECT_FALSE(match) << "In modified version " << j 593 EXPECT_FALSE(match) << "In modified version " << j
597 << " of base form " << i; 594 << " of base form " << i;
598 } 595 }
599 STLDeleteElements(&modified_forms);
600 } 596 }
601 } 597 }
602 598
603 TEST_F(PasswordStoreMacInternalsTest, TestKeychainAdd) { 599 TEST_F(PasswordStoreMacInternalsTest, TestKeychainAdd) {
604 struct TestDataAndExpectation { 600 struct TestDataAndExpectation {
605 PasswordFormData data; 601 PasswordFormData data;
606 bool should_succeed; 602 bool should_succeed;
607 }; 603 };
608 TestDataAndExpectation test_data[] = { 604 TestDataAndExpectation test_data[] = {
609 // Test a variety of scheme/port/protocol/path variations. 605 // Test a variety of scheme/port/protocol/path variations.
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 CHECK(current_test < kTestCount); 879 CHECK(current_test < kTestCount);
884 test_data[KEYCHAIN_INPUT][current_test].push_back(&keychain_user_1); 880 test_data[KEYCHAIN_INPUT][current_test].push_back(&keychain_user_1);
885 test_data[KEYCHAIN_INPUT][current_test].push_back(&keychain_user_1_with_path); 881 test_data[KEYCHAIN_INPUT][current_test].push_back(&keychain_user_1_with_path);
886 test_data[DATABASE_INPUT][current_test].push_back(&db_user_1); 882 test_data[DATABASE_INPUT][current_test].push_back(&db_user_1);
887 test_data[DATABASE_INPUT][current_test].push_back(&db_user_1_with_path); 883 test_data[DATABASE_INPUT][current_test].push_back(&db_user_1_with_path);
888 test_data[MERGE_OUTPUT][current_test].push_back(&merged_user_1); 884 test_data[MERGE_OUTPUT][current_test].push_back(&merged_user_1);
889 test_data[MERGE_OUTPUT][current_test].push_back( 885 test_data[MERGE_OUTPUT][current_test].push_back(
890 &merged_user_1_with_both_paths); 886 &merged_user_1_with_both_paths);
891 887
892 for (unsigned int test_case = 0; test_case <= current_test; ++test_case) { 888 for (unsigned int test_case = 0; test_case <= current_test; ++test_case) {
893 std::vector<PasswordForm*> keychain_forms; 889 ScopedVector<autofill::PasswordForm> keychain_forms;
894 for (std::vector<PasswordFormData*>::iterator i = 890 for (std::vector<PasswordFormData*>::iterator i =
895 test_data[KEYCHAIN_INPUT][test_case].begin(); 891 test_data[KEYCHAIN_INPUT][test_case].begin();
896 i != test_data[KEYCHAIN_INPUT][test_case].end(); ++i) { 892 i != test_data[KEYCHAIN_INPUT][test_case].end(); ++i) {
897 keychain_forms.push_back(CreatePasswordFormFromData(*(*i))); 893 keychain_forms.push_back(CreatePasswordFormFromData(*(*i)));
898 } 894 }
899 std::vector<PasswordForm*> database_forms; 895 ScopedVector<autofill::PasswordForm> database_forms;
900 for (std::vector<PasswordFormData*>::iterator i = 896 for (std::vector<PasswordFormData*>::iterator i =
901 test_data[DATABASE_INPUT][test_case].begin(); 897 test_data[DATABASE_INPUT][test_case].begin();
902 i != test_data[DATABASE_INPUT][test_case].end(); ++i) { 898 i != test_data[DATABASE_INPUT][test_case].end(); ++i) {
903 database_forms.push_back(CreatePasswordFormFromData(*(*i))); 899 database_forms.push_back(CreatePasswordFormFromData(*(*i)));
904 } 900 }
905 901
906 std::vector<PasswordForm*> merged_forms; 902 ScopedVector<autofill::PasswordForm> merged_forms;
907 internal_keychain_helpers::MergePasswordForms(&keychain_forms, 903 internal_keychain_helpers::MergePasswordForms(&keychain_forms,
908 &database_forms, 904 &database_forms,
909 &merged_forms); 905 &merged_forms);
910 906
911 CHECK_FORMS(keychain_forms, test_data[KEYCHAIN_OUTPUT][test_case], 907 CHECK_FORMS(keychain_forms.get(), test_data[KEYCHAIN_OUTPUT][test_case],
912 test_case); 908 test_case);
913 CHECK_FORMS(database_forms, test_data[DATABASE_OUTPUT][test_case], 909 CHECK_FORMS(database_forms.get(), test_data[DATABASE_OUTPUT][test_case],
914 test_case); 910 test_case);
915 CHECK_FORMS(merged_forms, test_data[MERGE_OUTPUT][test_case], test_case); 911 CHECK_FORMS(merged_forms.get(), test_data[MERGE_OUTPUT][test_case],
916 912 test_case);
917 STLDeleteElements(&keychain_forms);
918 STLDeleteElements(&database_forms);
919 STLDeleteElements(&merged_forms);
920 } 913 }
921 } 914 }
922 915
923 TEST_F(PasswordStoreMacInternalsTest, TestPasswordBulkLookup) { 916 TEST_F(PasswordStoreMacInternalsTest, TestPasswordBulkLookup) {
924 PasswordFormData db_data[] = { 917 PasswordFormData db_data[] = {
925 { PasswordForm::SCHEME_HTML, "http://some.domain.com/", 918 { PasswordForm::SCHEME_HTML, "http://some.domain.com/",
926 "http://some.domain.com/", "http://some.domain.com/action.cgi", 919 "http://some.domain.com/", "http://some.domain.com/action.cgi",
927 L"submit", L"username", L"password", L"joe_user", L"", 920 L"submit", L"username", L"password", L"joe_user", L"",
928 true, false, 1212121212 }, 921 true, false, 1212121212 },
929 { PasswordForm::SCHEME_HTML, "http://some.domain.com/", 922 { PasswordForm::SCHEME_HTML, "http://some.domain.com/",
930 "http://some.domain.com/page.html", 923 "http://some.domain.com/page.html",
931 "http://some.domain.com/handlepage.cgi", 924 "http://some.domain.com/handlepage.cgi",
932 L"submit", L"username", L"password", L"joe_user", L"", 925 L"submit", L"username", L"password", L"joe_user", L"",
933 true, false, 1234567890 }, 926 true, false, 1234567890 },
934 { PasswordForm::SCHEME_HTML, "http://some.domain.com/", 927 { PasswordForm::SCHEME_HTML, "http://some.domain.com/",
935 "http://some.domain.com/page.html", 928 "http://some.domain.com/page.html",
936 "http://some.domain.com/handlepage.cgi", 929 "http://some.domain.com/handlepage.cgi",
937 L"submit", L"username", L"password", L"second-account", L"", 930 L"submit", L"username", L"password", L"second-account", L"",
938 true, false, 1240000000 }, 931 true, false, 1240000000 },
939 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/", 932 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/",
940 "http://dont.remember.com/", 933 "http://dont.remember.com/",
941 "http://dont.remember.com/handlepage.cgi", 934 "http://dont.remember.com/handlepage.cgi",
942 L"submit", L"username", L"password", L"joe_user", L"", 935 L"submit", L"username", L"password", L"joe_user", L"",
943 true, false, 1240000000 }, 936 true, false, 1240000000 },
944 { PasswordForm::SCHEME_HTML, "http://some.domain.com/", 937 { PasswordForm::SCHEME_HTML, "http://some.domain.com/",
945 "http://some.domain.com/path.html", "http://some.domain.com/action.cgi", 938 "http://some.domain.com/path.html", "http://some.domain.com/action.cgi",
946 L"submit", L"username", L"password", NULL, NULL, 939 L"submit", L"username", L"password", NULL, NULL,
947 true, false, 1212121212 }, 940 true, false, 1212121212 },
948 }; 941 };
949 std::vector<PasswordForm*> database_forms; 942 ScopedVector<autofill::PasswordForm> database_forms;
950 for (unsigned int i = 0; i < arraysize(db_data); ++i) { 943 for (unsigned int i = 0; i < arraysize(db_data); ++i) {
951 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); 944 database_forms.push_back(CreatePasswordFormFromData(db_data[i]));
952 } 945 }
953 std::vector<PasswordForm*> merged_forms = 946 ScopedVector<autofill::PasswordForm> merged_forms;
954 internal_keychain_helpers::GetPasswordsForForms(*keychain_, 947 internal_keychain_helpers::GetPasswordsForForms(*keychain_, &database_forms,
955 &database_forms); 948 &merged_forms);
956 EXPECT_EQ(2U, database_forms.size()); 949 EXPECT_EQ(2U, database_forms.size());
957 ASSERT_EQ(3U, merged_forms.size()); 950 ASSERT_EQ(3U, merged_forms.size());
958 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value); 951 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value);
959 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value); 952 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value);
960 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user); 953 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user);
961
962 STLDeleteElements(&database_forms);
963 STLDeleteElements(&merged_forms);
964 } 954 }
965 955
966 TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) { 956 TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) {
967 PasswordFormData db_data[] = { 957 PasswordFormData db_data[] = {
968 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/", 958 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/",
969 "http://dont.remember.com/", 959 "http://dont.remember.com/",
970 "http://dont.remember.com/handlepage.cgi", 960 "http://dont.remember.com/handlepage.cgi",
971 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", 961 L"submit", L"username", L"password", L"joe_user", L"non_empty_password",
972 true, false, 1240000000 }, 962 true, false, 1240000000 },
973 { PasswordForm::SCHEME_HTML, "https://dont.remember.com/", 963 { PasswordForm::SCHEME_HTML, "https://dont.remember.com/",
974 "https://dont.remember.com/", 964 "https://dont.remember.com/",
975 "https://dont.remember.com/handlepage_secure.cgi", 965 "https://dont.remember.com/handlepage_secure.cgi",
976 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", 966 L"submit", L"username", L"password", L"joe_user", L"non_empty_password",
977 true, false, 1240000000 }, 967 true, false, 1240000000 },
978 }; 968 };
979 std::vector<PasswordForm*> database_forms; 969 ScopedVector<autofill::PasswordForm> database_forms;
980 for (unsigned int i = 0; i < arraysize(db_data); ++i) { 970 for (unsigned int i = 0; i < arraysize(db_data); ++i) {
981 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); 971 database_forms.push_back(CreatePasswordFormFromData(db_data[i]));
982 } 972 }
983 std::vector<PasswordForm*> merged_forms = 973 ScopedVector<autofill::PasswordForm> merged_forms;
984 internal_keychain_helpers::GetPasswordsForForms(*keychain_, 974 internal_keychain_helpers::GetPasswordsForForms(*keychain_, &database_forms,
985 &database_forms); 975 &merged_forms);
986 EXPECT_EQ(2U, database_forms.size()); 976 EXPECT_EQ(2U, database_forms.size());
987 ASSERT_EQ(0U, merged_forms.size()); 977 ASSERT_EQ(0U, merged_forms.size());
988
989 STLDeleteElements(&database_forms);
990 STLDeleteElements(&merged_forms);
991 } 978 }
992 979
993 TEST_F(PasswordStoreMacInternalsTest, TestFillPasswordFormFromKeychainItem) { 980 TEST_F(PasswordStoreMacInternalsTest, TestFillPasswordFormFromKeychainItem) {
994 // When |extract_password_data| is false, the password field must be empty, 981 // When |extract_password_data| is false, the password field must be empty,
995 // and |blacklisted_by_user| must be false. 982 // and |blacklisted_by_user| must be false.
996 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(1); 983 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(1);
997 PasswordForm form_without_extracted_password; 984 PasswordForm form_without_extracted_password;
998 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( 985 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem(
999 *keychain_, 986 *keychain_,
1000 keychain_item, 987 keychain_item,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1080 { PasswordForm::SCHEME_DIGEST, "https://digest.site.com/differentrealm", 1067 { PasswordForm::SCHEME_DIGEST, "https://digest.site.com/differentrealm",
1081 "https://digest.site.com/secure.html", NULL, NULL, NULL, NULL, 1068 "https://digest.site.com/secure.html", NULL, NULL, NULL, NULL,
1082 L"testname", L"testpass", false, false, 0 }, 1069 L"testname", L"testpass", false, false, 0 },
1083 }; 1070 };
1084 for (unsigned int i = 0; i < arraysize(owned_password_data); ++i) { 1071 for (unsigned int i = 0; i < arraysize(owned_password_data); ++i) {
1085 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData( 1072 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(
1086 owned_password_data[i])); 1073 owned_password_data[i]));
1087 owned_keychain_adapter.AddPassword(*form); 1074 owned_keychain_adapter.AddPassword(*form);
1088 } 1075 }
1089 1076
1090 std::vector<PasswordForm*> all_passwords = 1077 ScopedVector<autofill::PasswordForm> all_passwords =
1091 keychain_adapter.GetAllPasswordFormPasswords(); 1078 keychain_adapter.GetAllPasswordFormPasswords();
1092 EXPECT_EQ(8 + arraysize(owned_password_data), all_passwords.size()); 1079 EXPECT_EQ(8 + arraysize(owned_password_data), all_passwords.size());
1093 STLDeleteElements(&all_passwords);
1094 1080
1095 std::vector<PasswordForm*> owned_passwords = 1081 ScopedVector<autofill::PasswordForm> owned_passwords =
1096 owned_keychain_adapter.GetAllPasswordFormPasswords(); 1082 owned_keychain_adapter.GetAllPasswordFormPasswords();
1097 EXPECT_EQ(arraysize(owned_password_data), owned_passwords.size()); 1083 EXPECT_EQ(arraysize(owned_password_data), owned_passwords.size());
1098 STLDeleteElements(&owned_passwords);
1099 } 1084 }
1100 1085
1101 #pragma mark - 1086 #pragma mark -
1102 1087
1103 class PasswordStoreMacTest : public testing::Test { 1088 class PasswordStoreMacTest : public testing::Test {
1104 public: 1089 public:
1105 PasswordStoreMacTest() : ui_thread_(BrowserThread::UI, &message_loop_) {} 1090 PasswordStoreMacTest() : ui_thread_(BrowserThread::UI, &message_loop_) {}
1106 1091
1107 void SetUp() override { 1092 void SetUp() override {
1108 ASSERT_TRUE(db_dir_.CreateUniqueTempDir()); 1093 ASSERT_TRUE(db_dir_.CreateUniqueTempDir());
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 store_->UpdateLogin(*form); 1215 store_->UpdateLogin(*form);
1231 } 1216 }
1232 1217
1233 FinishAsyncProcessing(); 1218 FinishAsyncProcessing();
1234 1219
1235 MacKeychainPasswordFormAdapter keychain_adapter(keychain()); 1220 MacKeychainPasswordFormAdapter keychain_adapter(keychain());
1236 for (unsigned int i = 0; i < arraysize(updates); ++i) { 1221 for (unsigned int i = 0; i < arraysize(updates); ++i) {
1237 scoped_ptr<PasswordForm> query_form( 1222 scoped_ptr<PasswordForm> query_form(
1238 CreatePasswordFormFromData(updates[i].form_data)); 1223 CreatePasswordFormFromData(updates[i].form_data));
1239 1224
1240 std::vector<PasswordForm*> matching_items = 1225 ScopedVector<autofill::PasswordForm> matching_items =
1241 keychain_adapter.PasswordsFillingForm(query_form->signon_realm, 1226 keychain_adapter.PasswordsFillingForm(query_form->signon_realm,
1242 query_form->scheme); 1227 query_form->scheme);
1243 if (updates[i].password) { 1228 if (updates[i].password) {
1244 EXPECT_GT(matching_items.size(), 0U) << "iteration " << i; 1229 EXPECT_GT(matching_items.size(), 0U) << "iteration " << i;
1245 if (matching_items.size() >= 1) 1230 if (matching_items.size() >= 1)
1246 EXPECT_EQ(ASCIIToUTF16(updates[i].password), 1231 EXPECT_EQ(ASCIIToUTF16(updates[i].password),
1247 matching_items[0]->password_value) << "iteration " << i; 1232 matching_items[0]->password_value) << "iteration " << i;
1248 } else { 1233 } else {
1249 EXPECT_EQ(0U, matching_items.size()) << "iteration " << i; 1234 EXPECT_EQ(0U, matching_items.size()) << "iteration " << i;
1250 } 1235 }
1251 STLDeleteElements(&matching_items); 1236 matching_items.clear();
1252 1237
1253 login_db()->GetLogins(*query_form, &matching_items); 1238 login_db()->GetLogins(*query_form, &matching_items);
1254 EXPECT_EQ(updates[i].password ? 1U : 0U, matching_items.size()) 1239 EXPECT_EQ(updates[i].password ? 1U : 0U, matching_items.size())
1255 << "iteration " << i; 1240 << "iteration " << i;
1256 STLDeleteElements(&matching_items);
1257 } 1241 }
1258 } 1242 }
1259 1243
1260 TEST_F(PasswordStoreMacTest, TestDBKeychainAssociation) { 1244 TEST_F(PasswordStoreMacTest, TestDBKeychainAssociation) {
1261 // Tests that association between the keychain and login database parts of a 1245 // Tests that association between the keychain and login database parts of a
1262 // password added by fuzzy (PSL) matching works. 1246 // password added by fuzzy (PSL) matching works.
1263 // 1. Add a password for www.facebook.com 1247 // 1. Add a password for www.facebook.com
1264 // 2. Get a password for m.facebook.com. This fuzzy matches and returns the 1248 // 2. Get a password for m.facebook.com. This fuzzy matches and returns the
1265 // www.facebook.com password. 1249 // www.facebook.com password.
1266 // 3. Add the returned password for m.facebook.com. 1250 // 3. Add the returned password for m.facebook.com.
(...skipping 30 matching lines...) Expand all
1297 1281
1298 // 3. Add the returned password for m.facebook.com. 1282 // 3. Add the returned password for m.facebook.com.
1299 login_db()->AddLogin(consumer.last_result[0]); 1283 login_db()->AddLogin(consumer.last_result[0]);
1300 owned_keychain_adapter.AddPassword(m_form); 1284 owned_keychain_adapter.AddPassword(m_form);
1301 1285
1302 // 4. Remove both passwords. 1286 // 4. Remove both passwords.
1303 store_->RemoveLogin(*www_form); 1287 store_->RemoveLogin(*www_form);
1304 store_->RemoveLogin(m_form); 1288 store_->RemoveLogin(m_form);
1305 FinishAsyncProcessing(); 1289 FinishAsyncProcessing();
1306 1290
1307 std::vector<PasswordForm*> matching_items;
1308 // No trace of www.facebook.com. 1291 // No trace of www.facebook.com.
1309 matching_items = owned_keychain_adapter.PasswordsFillingForm( 1292 ScopedVector<autofill::PasswordForm> matching_items =
1310 www_form->signon_realm, www_form->scheme); 1293 owned_keychain_adapter.PasswordsFillingForm(www_form->signon_realm,
1294 www_form->scheme);
1311 EXPECT_EQ(0u, matching_items.size()); 1295 EXPECT_EQ(0u, matching_items.size());
1312 login_db()->GetLogins(*www_form, &matching_items); 1296 login_db()->GetLogins(*www_form, &matching_items);
1313 EXPECT_EQ(0u, matching_items.size()); 1297 EXPECT_EQ(0u, matching_items.size());
1314 // No trace of m.facebook.com. 1298 // No trace of m.facebook.com.
1315 matching_items = owned_keychain_adapter.PasswordsFillingForm( 1299 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1316 m_form.signon_realm, m_form.scheme); 1300 m_form.signon_realm, m_form.scheme);
1317 EXPECT_EQ(0u, matching_items.size()); 1301 EXPECT_EQ(0u, matching_items.size());
1318 login_db()->GetLogins(m_form, &matching_items); 1302 login_db()->GetLogins(m_form, &matching_items);
1319 EXPECT_EQ(0u, matching_items.size()); 1303 EXPECT_EQ(0u, matching_items.size());
1320 } 1304 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 test->store()->AddLogin(*form_facebook); 1374 test->store()->AddLogin(*form_facebook);
1391 test->store()->AddLogin(*form_other); 1375 test->store()->AddLogin(*form_other);
1392 EXPECT_CALL(observer, OnLoginsChanged(GetAddChangeList(*form_facebook_old))); 1376 EXPECT_CALL(observer, OnLoginsChanged(GetAddChangeList(*form_facebook_old)));
1393 EXPECT_CALL(observer, OnLoginsChanged(GetAddChangeList(*form_facebook))); 1377 EXPECT_CALL(observer, OnLoginsChanged(GetAddChangeList(*form_facebook)));
1394 EXPECT_CALL(observer, OnLoginsChanged(GetAddChangeList(*form_other))); 1378 EXPECT_CALL(observer, OnLoginsChanged(GetAddChangeList(*form_other)));
1395 observer.WaitAndVerify(test); 1379 observer.WaitAndVerify(test);
1396 1380
1397 // Check the keychain content. 1381 // Check the keychain content.
1398 MacKeychainPasswordFormAdapter owned_keychain_adapter(test->keychain()); 1382 MacKeychainPasswordFormAdapter owned_keychain_adapter(test->keychain());
1399 owned_keychain_adapter.SetFindsOnlyOwnedItems(false); 1383 owned_keychain_adapter.SetFindsOnlyOwnedItems(false);
1400 ScopedVector<PasswordForm> matching_items; 1384 ScopedVector<PasswordForm> matching_items(
1401 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( 1385 owned_keychain_adapter.PasswordsFillingForm(form_facebook->signon_realm,
1402 form_facebook->signon_realm, form_facebook->scheme); 1386 form_facebook->scheme));
1403 EXPECT_EQ(1u, matching_items.size()); 1387 EXPECT_EQ(1u, matching_items.size());
1404 matching_items.clear(); 1388 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1405 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm(
1406 form_other->signon_realm, form_other->scheme); 1389 form_other->signon_realm, form_other->scheme);
1407 EXPECT_EQ(1u, matching_items.size()); 1390 EXPECT_EQ(1u, matching_items.size());
1408 matching_items.clear();
1409 1391
1410 // Remove facebook. 1392 // Remove facebook.
1411 void (PasswordStore::*method)(base::Time, base::Time) = 1393 void (PasswordStore::*method)(base::Time, base::Time) =
1412 check_created ? &PasswordStore::RemoveLoginsCreatedBetween 1394 check_created ? &PasswordStore::RemoveLoginsCreatedBetween
1413 : &PasswordStore::RemoveLoginsSyncedBetween; 1395 : &PasswordStore::RemoveLoginsSyncedBetween;
1414 (test->store()->*method)(base::Time(), next_day); 1396 (test->store()->*method)(base::Time(), next_day);
1415 password_manager::PasswordStoreChangeList list; 1397 password_manager::PasswordStoreChangeList list;
1416 form_facebook_old->password_value.clear(); 1398 form_facebook_old->password_value.clear();
1417 form_facebook->password_value.clear(); 1399 form_facebook->password_value.clear();
1418 list.push_back(password_manager::PasswordStoreChange( 1400 list.push_back(password_manager::PasswordStoreChange(
1419 password_manager::PasswordStoreChange::REMOVE, *form_facebook_old)); 1401 password_manager::PasswordStoreChange::REMOVE, *form_facebook_old));
1420 list.push_back(password_manager::PasswordStoreChange( 1402 list.push_back(password_manager::PasswordStoreChange(
1421 password_manager::PasswordStoreChange::REMOVE, *form_facebook)); 1403 password_manager::PasswordStoreChange::REMOVE, *form_facebook));
1422 EXPECT_CALL(observer, OnLoginsChanged(list)); 1404 EXPECT_CALL(observer, OnLoginsChanged(list));
1423 list.clear(); 1405 list.clear();
1424 observer.WaitAndVerify(test); 1406 observer.WaitAndVerify(test);
1425 1407
1426 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( 1408 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1427 form_facebook->signon_realm, form_facebook->scheme); 1409 form_facebook->signon_realm, form_facebook->scheme);
1428 EXPECT_EQ(0u, matching_items.size()); 1410 EXPECT_EQ(0u, matching_items.size());
1429 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( 1411 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1430 form_other->signon_realm, form_other->scheme); 1412 form_other->signon_realm, form_other->scheme);
1431 EXPECT_EQ(1u, matching_items.size()); 1413 EXPECT_EQ(1u, matching_items.size());
1432 matching_items.clear();
1433 1414
1434 // Remove form_other. 1415 // Remove form_other.
1435 (test->store()->*method)(next_day, base::Time()); 1416 (test->store()->*method)(next_day, base::Time());
1436 form_other->password_value.clear(); 1417 form_other->password_value.clear();
1437 list.push_back(password_manager::PasswordStoreChange( 1418 list.push_back(password_manager::PasswordStoreChange(
1438 password_manager::PasswordStoreChange::REMOVE, *form_other)); 1419 password_manager::PasswordStoreChange::REMOVE, *form_other));
1439 EXPECT_CALL(observer, OnLoginsChanged(list)); 1420 EXPECT_CALL(observer, OnLoginsChanged(list));
1440 observer.WaitAndVerify(test); 1421 observer.WaitAndVerify(test);
1441 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( 1422 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1442 form_other->signon_realm, form_other->scheme); 1423 form_other->signon_realm, form_other->scheme);
1443 EXPECT_EQ(0u, matching_items.size()); 1424 EXPECT_EQ(0u, matching_items.size());
1444 } 1425 }
1445 1426
1446 } // namespace 1427 } // namespace
1447 1428
1448 TEST_F(PasswordStoreMacTest, TestRemoveLoginsCreatedBetween) { 1429 TEST_F(PasswordStoreMacTest, TestRemoveLoginsCreatedBetween) {
1449 CheckRemoveLoginsBetween(this, true); 1430 CheckRemoveLoginsBetween(this, true);
1450 } 1431 }
1451 1432
(...skipping 26 matching lines...) Expand all
1478 // Add a password from the current profile. 1459 // Add a password from the current profile.
1479 PasswordFormData www_form_data2 = { 1460 PasswordFormData www_form_data2 = {
1480 PasswordForm::SCHEME_HTML, "http://www.facebook.com/", 1461 PasswordForm::SCHEME_HTML, "http://www.facebook.com/",
1481 "http://www.facebook.com/index.html", "login", L"username", L"password", 1462 "http://www.facebook.com/index.html", "login", L"username", L"password",
1482 L"submit", L"not_joe_user", L"12345", true, false, 1 }; 1463 L"submit", L"not_joe_user", L"12345", true, false, 1 };
1483 www_form.reset(CreatePasswordFormFromData(www_form_data2)); 1464 www_form.reset(CreatePasswordFormFromData(www_form_data2));
1484 store_->AddLogin(*www_form); 1465 store_->AddLogin(*www_form);
1485 FinishAsyncProcessing(); 1466 FinishAsyncProcessing();
1486 1467
1487 ScopedVector<PasswordForm> matching_items; 1468 ScopedVector<PasswordForm> matching_items;
1488 login_db()->GetLogins(*www_form, &matching_items.get()); 1469 login_db()->GetLogins(*www_form, &matching_items);
1489 EXPECT_EQ(1u, matching_items.size()); 1470 EXPECT_EQ(1u, matching_items.size());
1490 matching_items.clear(); 1471 matching_items.clear();
1491 1472
1492 store_->RemoveLoginsCreatedBetween(base::Time(), base::Time()); 1473 store_->RemoveLoginsCreatedBetween(base::Time(), base::Time());
1493 FinishAsyncProcessing(); 1474 FinishAsyncProcessing();
1494 1475
1495 // Check the second facebook form is gone. 1476 // Check the second facebook form is gone.
1496 login_db()->GetLogins(*www_form, &matching_items.get()); 1477 login_db()->GetLogins(*www_form, &matching_items);
1497 EXPECT_EQ(0u, matching_items.size()); 1478 EXPECT_EQ(0u, matching_items.size());
1498 1479
1499 // Check the first facebook form is still there. 1480 // Check the first facebook form is still there.
1500 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( 1481 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1501 www_form->signon_realm, www_form->scheme); 1482 www_form->signon_realm, www_form->scheme);
1502 ASSERT_EQ(1u, matching_items.size()); 1483 ASSERT_EQ(1u, matching_items.size());
1503 EXPECT_EQ(ASCIIToUTF16("joe_user"), matching_items[0]->username_value); 1484 EXPECT_EQ(ASCIIToUTF16("joe_user"), matching_items[0]->username_value);
1504 matching_items.clear(); 1485 matching_items.clear();
1505 1486
1506 // Check the third-party password is still there. 1487 // Check the third-party password is still there.
1507 owned_keychain_adapter.SetFindsOnlyOwnedItems(false); 1488 owned_keychain_adapter.SetFindsOnlyOwnedItems(false);
1508 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( 1489 matching_items = owned_keychain_adapter.PasswordsFillingForm(
1509 "http://some.domain.com/insecure.html", PasswordForm::SCHEME_HTML); 1490 "http://some.domain.com/insecure.html", PasswordForm::SCHEME_HTML);
1510 ASSERT_EQ(1u, matching_items.size()); 1491 ASSERT_EQ(1u, matching_items.size());
1511 } 1492 }
1512 1493
1513 // Open the store and immediately write to it and try to read it back, without 1494 // Open the store and immediately write to it and try to read it back, without
1514 // first waiting for the initialization to finish. If tasks are processed in 1495 // first waiting for the initialization to finish. If tasks are processed in
1515 // order, read/write operations will correctly be performed only after the 1496 // order, read/write operations will correctly be performed only after the
1516 // initialization has finished. 1497 // initialization has finished.
1517 TEST_F(PasswordStoreMacTest, StoreIsUsableImmediatelyAfterConstruction) { 1498 TEST_F(PasswordStoreMacTest, StoreIsUsableImmediatelyAfterConstruction) {
1518 ClosePasswordStore(); 1499 ClosePasswordStore();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 1571
1591 // Delete one login; a range of logins. 1572 // Delete one login; a range of logins.
1592 store()->RemoveLogin(*form); 1573 store()->RemoveLogin(*form);
1593 store()->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max()); 1574 store()->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max());
1594 store()->RemoveLoginsSyncedBetween(base::Time(), base::Time::Max()); 1575 store()->RemoveLoginsSyncedBetween(base::Time(), base::Time::Max());
1595 FinishAsyncProcessing(); 1576 FinishAsyncProcessing();
1596 1577
1597 // Verify no notifications are fired during shutdown either. 1578 // Verify no notifications are fired during shutdown either.
1598 ClosePasswordStore(); 1579 ClosePasswordStore();
1599 } 1580 }
OLDNEW
« no previous file with comments | « chrome/browser/password_manager/password_store_mac_internal.h ('k') | chrome/browser/password_manager/password_store_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698