// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/autofill/personal_data_manager_factory.h" #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/testing_profile.h" #include "components/autofill/core/browser/autofill_metrics.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using testing::_; namespace autofill { namespace { class MockAutofillMetrics : public AutofillMetrics { public: MockAutofillMetrics() {} MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric)); private: DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); }; class TestPersonalDataManager : public PersonalDataManager { public: TestPersonalDataManager() : PersonalDataManager("en-US") {} using PersonalDataManager::set_database; using PersonalDataManager::SetPrefService; // Overridden to avoid a trip to the database. virtual void LoadProfiles() OVERRIDE {} virtual void LoadCreditCards() OVERRIDE {} MOCK_METHOD1(SaveImportedCreditCard, std::string(const CreditCard& imported_credit_card)); private: DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); }; } // namespace class AutofillCCInfobarDelegateTest : public ChromeRenderViewHostTestHarness { public: virtual ~AutofillCCInfobarDelegateTest(); virtual void SetUp() OVERRIDE; virtual void TearDown() OVERRIDE; protected: scoped_ptr CreateDelegate( MockAutofillMetrics* metric_logger); scoped_ptr personal_data_; }; AutofillCCInfobarDelegateTest::~AutofillCCInfobarDelegateTest() {} void AutofillCCInfobarDelegateTest::SetUp() { ChromeRenderViewHostTestHarness::SetUp(); // Ensure Mac OS X does not pop up a modal dialog for the Address Book. test::DisableSystemServices(profile()->GetPrefs()); PersonalDataManagerFactory::GetInstance()->SetTestingFactory(profile(), NULL); ChromeAutofillClient::CreateForWebContents(web_contents()); ChromeAutofillClient* autofill_client = ChromeAutofillClient::FromWebContents(web_contents()); personal_data_.reset(new TestPersonalDataManager()); personal_data_->set_database(autofill_client->GetDatabase()); personal_data_->SetPrefService(profile()->GetPrefs()); } void AutofillCCInfobarDelegateTest::TearDown() { personal_data_.reset(); ChromeRenderViewHostTestHarness::TearDown(); } scoped_ptr AutofillCCInfobarDelegateTest::CreateDelegate( MockAutofillMetrics* metric_logger) { EXPECT_CALL(*metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_SHOWN)); CreditCard credit_card; return AutofillCCInfoBarDelegate::Create( metric_logger, base::Bind( base::IgnoreResult(&TestPersonalDataManager::SaveImportedCreditCard), base::Unretained(personal_data_.get()), credit_card)); } // Test that credit card infobar metrics are logged correctly. TEST_F(AutofillCCInfobarDelegateTest, Metrics) { MockAutofillMetrics metric_logger; ::testing::InSequence dummy; // Accept the infobar. { scoped_ptr infobar(CreateDelegate(&metric_logger)); ASSERT_TRUE(infobar); EXPECT_CALL(*personal_data_, SaveImportedCreditCard(_)); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_ACCEPTED)); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) .Times(0); EXPECT_TRUE(infobar->Accept()); } // Cancel the infobar. { scoped_ptr infobar(CreateDelegate(&metric_logger)); ASSERT_TRUE(infobar); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)) .Times(1); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) .Times(0); EXPECT_TRUE(infobar->Cancel()); } // Dismiss the infobar. { scoped_ptr infobar(CreateDelegate(&metric_logger)); ASSERT_TRUE(infobar); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)) .Times(1); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) .Times(0); infobar->InfoBarDismissed(); } // Ignore the infobar. { scoped_ptr infobar(CreateDelegate(&metric_logger)); ASSERT_TRUE(infobar); EXPECT_CALL(metric_logger, LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)) .Times(1); } } } // namespace autofill