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