OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/metrics/histogram.h" |
| 6 #include "base/metrics/statistics_recorder.h" |
| 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "chrome/browser/password_manager/mock_password_store_service.h" |
| 9 #include "chrome/browser/password_manager/password_store_factory.h" |
| 10 #include "chrome/browser/ui/passwords/password_manager_presenter.h" |
| 11 #include "chrome/browser/ui/webui/options/password_manager_handler.h" |
| 12 #include "chrome/test/base/testing_profile.h" |
| 13 #include "components/password_manager/core/browser/mock_password_store.h" |
| 14 #include "content/public/test/test_browser_thread_bundle.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 |
| 18 class MockPasswordManagerPresenter : public PasswordManagerPresenter { |
| 19 public: |
| 20 MockPasswordManagerPresenter(PasswordUIView* handler) |
| 21 : PasswordManagerPresenter(handler), handler_(handler) {} |
| 22 ~MockPasswordManagerPresenter() override {} |
| 23 |
| 24 MOCK_METHOD1(AddPasswordsToStore, |
| 25 bool(const std::vector<autofill::PasswordForm>&)); |
| 26 MOCK_METHOD0(RequestToExportPassword, bool()); |
| 27 |
| 28 private: |
| 29 PasswordUIView* handler_; |
| 30 DISALLOW_COPY_AND_ASSIGN(MockPasswordManagerPresenter); |
| 31 }; |
| 32 |
| 33 class DummyPasswordManagerHandler : public PasswordUIView { |
| 34 public: |
| 35 explicit DummyPasswordManagerHandler(Profile* profile) |
| 36 : profile_(profile), password_manager_presenter_(this) { |
| 37 password_manager_presenter_.Initialize(); |
| 38 } |
| 39 ~DummyPasswordManagerHandler() override {} |
| 40 Profile* GetProfile() override; |
| 41 |
| 42 void ShowPassword(size_t, |
| 43 const std::string&, |
| 44 const std::string&, |
| 45 const base::string16&) override {} |
| 46 void SetPasswordList(const ScopedVector<autofill::PasswordForm>&, |
| 47 bool) override {} |
| 48 void SetPasswordExceptionList( |
| 49 const ScopedVector<autofill::PasswordForm>&) override {} |
| 50 |
| 51 #if !defined(OS_ANDROID) |
| 52 gfx::NativeWindow GetNativeWindow() const override; |
| 53 #endif |
| 54 private: |
| 55 Profile* profile_; |
| 56 PasswordManagerPresenter password_manager_presenter_; |
| 57 DISALLOW_COPY_AND_ASSIGN(DummyPasswordManagerHandler); |
| 58 }; |
| 59 |
| 60 #if !defined(OS_ANDROID) |
| 61 gfx::NativeWindow DummyPasswordManagerHandler::GetNativeWindow() const { |
| 62 return NULL; |
| 63 } |
| 64 #endif |
| 65 Profile* DummyPasswordManagerHandler::GetProfile() { |
| 66 return profile_; |
| 67 } |
| 68 |
| 69 class PasswordManagerHandlerTest : public testing::Test { |
| 70 protected: |
| 71 PasswordManagerHandlerTest() {} |
| 72 ~PasswordManagerHandlerTest() override { |
| 73 delete handler_; |
| 74 delete dummy_handler_; |
| 75 } |
| 76 |
| 77 void SetUp() override { |
| 78 UMA_HISTOGRAM_COUNTS( |
| 79 "PasswordManager.ImportedPasswordsPerUserInCSV.Success", 0); |
| 80 PasswordStoreFactory::GetInstance()->SetTestingFactory( |
| 81 &profile_, MockPasswordStoreService::Build); |
| 82 dummy_handler_ = new DummyPasswordManagerHandler(&profile_); |
| 83 handler_ = new options::PasswordManagerHandler( |
| 84 new MockPasswordManagerPresenter(dummy_handler_)); |
| 85 } |
| 86 |
| 87 MockPasswordManagerPresenter* GetPresenter() { |
| 88 return static_cast<MockPasswordManagerPresenter*>( |
| 89 handler_->password_manager_presenter_.get()); |
| 90 } |
| 91 |
| 92 void ExportPassword() { handler_->HandlePasswordExport(NULL); } |
| 93 |
| 94 void ImportPassword() { |
| 95 autofill::PasswordForm form(MakeForm()); |
| 96 std::vector<autofill::PasswordForm>* passwordForms = |
| 97 new std::vector<autofill::PasswordForm>; |
| 98 passwordForms->push_back(form); |
| 99 passwordForms->push_back(form); |
| 100 handler_->ImportPasswordFileRead( |
| 101 password_manager::PasswordImporter::SUCCESS, *passwordForms); |
| 102 } |
| 103 |
| 104 autofill::PasswordForm MakeForm() { |
| 105 autofill::PasswordForm form; |
| 106 GURL origin("http://test.com"); |
| 107 form.origin = origin; |
| 108 form.username_element = base::ASCIIToUTF16("Email"); |
| 109 form.username_value = base::ASCIIToUTF16("test@test.com"); |
| 110 form.password_element = base::ASCIIToUTF16("Password"); |
| 111 form.password_value = base::ASCIIToUTF16("abcdef"); |
| 112 return form; |
| 113 } |
| 114 |
| 115 private: |
| 116 content::TestBrowserThreadBundle thread_bundle_; |
| 117 TestingProfile profile_; |
| 118 options::PasswordManagerHandler* handler_; |
| 119 DummyPasswordManagerHandler* dummy_handler_; |
| 120 |
| 121 DISALLOW_COPY_AND_ASSIGN(PasswordManagerHandlerTest); |
| 122 }; |
| 123 |
| 124 MATCHER_P(FormMatches, form, "") { |
| 125 return arg.size() == 2 && form.signon_realm == arg[0].signon_realm && |
| 126 form.origin == arg[0].origin && form.action == arg[0].action && |
| 127 form.username_element == arg[0].username_element && |
| 128 form.password_element == arg[0].password_element && |
| 129 form.new_password_element == arg[0].new_password_element && |
| 130 form.password_autocomplete_set == arg[0].password_autocomplete_set && |
| 131 form.submit_element == arg[0].submit_element; |
| 132 } |
| 133 |
| 134 TEST_F(PasswordManagerHandlerTest, PasswordImport) { |
| 135 autofill::PasswordForm form(MakeForm()); |
| 136 base::HistogramBase* exported_passwords = |
| 137 base::StatisticsRecorder::FindHistogram( |
| 138 "PasswordManager.ImportedPasswordsPerUserInCSV.Success"); |
| 139 scoped_ptr<base::HistogramSamples> samples( |
| 140 exported_passwords->SnapshotSamples()); |
| 141 EXPECT_CALL(*GetPresenter(), AddPasswordsToStore(FormMatches(form))); |
| 142 ImportPassword(); |
| 143 EXPECT_EQ(samples->TotalCount(), 1); |
| 144 } |
| 145 |
| 146 TEST_F(PasswordManagerHandlerTest, PasswordExport) { |
| 147 EXPECT_CALL(*GetPresenter(), RequestToExportPassword()); |
| 148 ExportPassword(); |
| 149 } |
OLD | NEW |