1// Copyright 2014 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 "chrome/browser/autofill/autofill_cc_infobar_delegate.h" 6 7#include "base/memory/scoped_ptr.h" 8#include "chrome/browser/autofill/personal_data_manager_factory.h" 9#include "chrome/browser/ui/autofill/chrome_autofill_client.h" 10#include "chrome/test/base/chrome_render_view_host_test_harness.h" 11#include "chrome/test/base/testing_profile.h" 12#include "components/autofill/core/browser/autofill_metrics.h" 13#include "components/autofill/core/browser/autofill_test_utils.h" 14#include "components/autofill/core/browser/personal_data_manager.h" 15#include "testing/gmock/include/gmock/gmock.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18using testing::_; 19 20namespace autofill { 21 22namespace { 23 24class MockAutofillMetrics : public AutofillMetrics { 25 public: 26 MockAutofillMetrics() {} 27 MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric)); 28 29 private: 30 DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); 31}; 32 33class TestPersonalDataManager : public PersonalDataManager { 34 public: 35 TestPersonalDataManager() : PersonalDataManager("en-US") {} 36 37 using PersonalDataManager::set_database; 38 using PersonalDataManager::SetPrefService; 39 40 // Overridden to avoid a trip to the database. 41 virtual void LoadProfiles() OVERRIDE {} 42 virtual void LoadCreditCards() OVERRIDE {} 43 44 MOCK_METHOD1(SaveImportedCreditCard, 45 std::string(const CreditCard& imported_credit_card)); 46 47 private: 48 DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); 49}; 50 51} // namespace 52 53class AutofillCCInfobarDelegateTest : public ChromeRenderViewHostTestHarness { 54 public: 55 virtual ~AutofillCCInfobarDelegateTest(); 56 57 virtual void SetUp() OVERRIDE; 58 virtual void TearDown() OVERRIDE; 59 60 protected: 61 scoped_ptr<ConfirmInfoBarDelegate> CreateDelegate( 62 MockAutofillMetrics* metric_logger); 63 64 scoped_ptr<TestPersonalDataManager> personal_data_; 65}; 66 67AutofillCCInfobarDelegateTest::~AutofillCCInfobarDelegateTest() {} 68 69void AutofillCCInfobarDelegateTest::SetUp() { 70 ChromeRenderViewHostTestHarness::SetUp(); 71 72 // Ensure Mac OS X does not pop up a modal dialog for the Address Book. 73 test::DisableSystemServices(profile()->GetPrefs()); 74 75 PersonalDataManagerFactory::GetInstance()->SetTestingFactory(profile(), NULL); 76 77 ChromeAutofillClient::CreateForWebContents(web_contents()); 78 ChromeAutofillClient* autofill_client = 79 ChromeAutofillClient::FromWebContents(web_contents()); 80 81 personal_data_.reset(new TestPersonalDataManager()); 82 personal_data_->set_database(autofill_client->GetDatabase()); 83 personal_data_->SetPrefService(profile()->GetPrefs()); 84} 85 86void AutofillCCInfobarDelegateTest::TearDown() { 87 personal_data_.reset(); 88 ChromeRenderViewHostTestHarness::TearDown(); 89} 90 91scoped_ptr<ConfirmInfoBarDelegate> 92AutofillCCInfobarDelegateTest::CreateDelegate( 93 MockAutofillMetrics* metric_logger) { 94 EXPECT_CALL(*metric_logger, 95 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_SHOWN)); 96 97 CreditCard credit_card; 98 return AutofillCCInfoBarDelegate::Create( 99 metric_logger, 100 base::Bind( 101 base::IgnoreResult(&TestPersonalDataManager::SaveImportedCreditCard), 102 base::Unretained(personal_data_.get()), 103 credit_card)); 104} 105 106// Test that credit card infobar metrics are logged correctly. 107TEST_F(AutofillCCInfobarDelegateTest, Metrics) { 108 MockAutofillMetrics metric_logger; 109 ::testing::InSequence dummy; 110 111 // Accept the infobar. 112 { 113 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); 114 ASSERT_TRUE(infobar); 115 EXPECT_CALL(*personal_data_, SaveImportedCreditCard(_)); 116 EXPECT_CALL(metric_logger, 117 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_ACCEPTED)); 118 119 EXPECT_CALL(metric_logger, 120 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) 121 .Times(0); 122 EXPECT_TRUE(infobar->Accept()); 123 } 124 125 // Cancel the infobar. 126 { 127 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); 128 ASSERT_TRUE(infobar); 129 EXPECT_CALL(metric_logger, 130 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)) 131 .Times(1); 132 EXPECT_CALL(metric_logger, 133 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) 134 .Times(0); 135 EXPECT_TRUE(infobar->Cancel()); 136 } 137 138 // Dismiss the infobar. 139 { 140 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); 141 ASSERT_TRUE(infobar); 142 EXPECT_CALL(metric_logger, 143 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)) 144 .Times(1); 145 EXPECT_CALL(metric_logger, 146 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) 147 .Times(0); 148 infobar->InfoBarDismissed(); 149 } 150 151 // Ignore the infobar. 152 { 153 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); 154 ASSERT_TRUE(infobar); 155 EXPECT_CALL(metric_logger, 156 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) 157 .Times(1); 158 } 159} 160 161} // namespace autofill 162