| // Copyright 2013 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 "base/bind.h" |
| #include "base/callback.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/ui/autofill/autocheckout_bubble_controller.h" |
| #include "components/autofill/core/browser/autofill_metrics.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/gfx/rect.h" |
| |
| namespace autofill { |
| namespace { |
| |
| class TestAutofillMetrics : public AutofillMetrics { |
| public: |
| TestAutofillMetrics() |
| : metric_(NUM_BUBBLE_METRICS) {} |
| virtual ~TestAutofillMetrics() {} |
| virtual void LogAutocheckoutBubbleMetric(BubbleMetric metric) const OVERRIDE { |
| metric_ = metric; |
| } |
| |
| AutofillMetrics::BubbleMetric metric() const { return metric_; } |
| |
| private: |
| mutable AutofillMetrics::BubbleMetric metric_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TestAutofillMetrics); |
| }; |
| |
| class TestCallback { |
| public: |
| TestCallback() : accepted_count_(0), dismissed_count_(0) {} |
| ~TestCallback() {} |
| |
| void Run(AutocheckoutBubbleState state) { |
| if (state == AUTOCHECKOUT_BUBBLE_ACCEPTED) |
| accepted_count_++; |
| else |
| dismissed_count_++; |
| } |
| |
| int accepted_count() const { |
| return accepted_count_; |
| } |
| |
| int dismissed_count() const { |
| return dismissed_count_; |
| } |
| |
| base::Callback<void(AutocheckoutBubbleState)> GetCallback() { |
| return base::Bind(&TestCallback::Run, base::Unretained(this)); |
| } |
| |
| private: |
| int accepted_count_; |
| int dismissed_count_; |
| }; |
| |
| class TestAutocheckoutBubbleController : |
| public autofill::AutocheckoutBubbleController { |
| public: |
| explicit TestAutocheckoutBubbleController( |
| const base::Callback<void(AutocheckoutBubbleState)>& callback) |
| : AutocheckoutBubbleController(gfx::RectF(), |
| gfx::NativeWindow(), |
| true /* is_google_user */, |
| callback) { |
| set_metric_logger(new TestAutofillMetrics); |
| } |
| virtual ~TestAutocheckoutBubbleController() {} |
| |
| const TestAutofillMetrics* get_metric_logger() const { |
| return static_cast<TestAutofillMetrics*>(const_cast<AutofillMetrics*>( |
| AutocheckoutBubbleController::metric_logger())); |
| } |
| }; |
| |
| } // namespace |
| |
| TEST(AutocheckoutBubbleControllerTest, BubbleCreationAndDestructionMetrics) { |
| // Test bubble created metric. |
| TestCallback callback; |
| TestAutocheckoutBubbleController controller(callback.GetCallback()); |
| |
| controller.BubbleCreated(); |
| |
| EXPECT_EQ(AutofillMetrics::BUBBLE_CREATED, |
| controller.get_metric_logger()->metric()); |
| EXPECT_EQ(0, callback.accepted_count()); |
| EXPECT_EQ(0, callback.dismissed_count()); |
| |
| // If neither BubbleAccepted or BubbleCanceled was called the bubble was |
| // ignored. |
| controller.BubbleDestroyed(); |
| |
| EXPECT_EQ(AutofillMetrics::BUBBLE_IGNORED, |
| controller.get_metric_logger()->metric()); |
| EXPECT_EQ(0, callback.accepted_count()); |
| EXPECT_EQ(1, callback.dismissed_count()); |
| } |
| |
| TEST(AutocheckoutBubbleControllerTest, BubbleAcceptedMetric) { |
| // Test bubble accepted metric. |
| TestCallback callback; |
| TestAutocheckoutBubbleController controller(callback.GetCallback()); |
| |
| controller.BubbleAccepted(); |
| |
| EXPECT_EQ(AutofillMetrics::BUBBLE_ACCEPTED, |
| controller.get_metric_logger()->metric()); |
| EXPECT_EQ(1, callback.accepted_count()); |
| EXPECT_EQ(0, callback.dismissed_count()); |
| |
| // Test that after a bubble is accepted it is not considered ignored. |
| controller.BubbleDestroyed(); |
| |
| EXPECT_EQ(AutofillMetrics::BUBBLE_ACCEPTED, |
| controller.get_metric_logger()->metric()); |
| EXPECT_EQ(1, callback.accepted_count()); |
| EXPECT_EQ(0, callback.dismissed_count()); |
| } |
| |
| TEST(AutocheckoutBubbleControllerTest, BubbleCanceledMetric) { |
| // Test bubble dismissed metric. |
| TestCallback callback; |
| TestAutocheckoutBubbleController controller(callback.GetCallback()); |
| |
| controller.BubbleCanceled(); |
| |
| EXPECT_EQ(AutofillMetrics::BUBBLE_DISMISSED, |
| controller.get_metric_logger()->metric()); |
| EXPECT_EQ(0, callback.accepted_count()); |
| EXPECT_EQ(1, callback.dismissed_count()); |
| |
| // Test that after a bubble is dismissed it is not considered ignored. |
| controller.BubbleDestroyed(); |
| |
| EXPECT_EQ(AutofillMetrics::BUBBLE_DISMISSED, |
| controller.get_metric_logger()->metric()); |
| EXPECT_EQ(0, callback.accepted_count()); |
| EXPECT_EQ(1, callback.dismissed_count()); |
| } |
| |
| } // namespace autofill |