autofill_dialog_controller_browsertest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 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/bind.h"
6#include "base/message_loop.h"
7#include "base/time.h"
8#include "base/utf_string_conversions.h"
9#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h"
10#include "chrome/browser/ui/autofill/autofill_dialog_view.h"
11#include "chrome/browser/ui/browser.h"
12#include "chrome/browser/ui/tabs/tab_strip_model.h"
13#include "chrome/test/base/in_process_browser_test.h"
14#include "components/autofill/browser/autofill_metrics.h"
15#include "components/autofill/common/form_data.h"
16#include "components/autofill/common/form_field_data.h"
17#include "content/public/test/test_utils.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
20namespace autofill {
21
22namespace {
23
24void MockCallback(const FormStructure*) {}
25
26class MockAutofillMetrics : public AutofillMetrics {
27 public:
28  MockAutofillMetrics()
29      : dialog_type_(static_cast<DialogType>(-1)),
30        dialog_dismissal_action_(
31            static_cast<AutofillMetrics::DialogDismissalAction>(-1)),
32        autocheckout_status_(
33            static_cast<AutofillMetrics::AutocheckoutCompletionStatus>(-1)) {}
34  virtual ~MockAutofillMetrics() {}
35
36  // AutofillMetrics:
37  virtual void LogAutocheckoutDuration(
38      const base::TimeDelta& duration,
39      AutocheckoutCompletionStatus status) const OVERRIDE {
40    // Ignore constness for testing.
41    MockAutofillMetrics* mutable_this = const_cast<MockAutofillMetrics*>(this);
42    mutable_this->autocheckout_status_ = status;
43  }
44
45  virtual void LogDialogUiDuration(
46      const base::TimeDelta& duration,
47      DialogType dialog_type,
48      DialogDismissalAction dismissal_action) const OVERRIDE {
49    // Ignore constness for testing.
50    MockAutofillMetrics* mutable_this = const_cast<MockAutofillMetrics*>(this);
51    mutable_this->dialog_type_ = dialog_type;
52    mutable_this->dialog_dismissal_action_ = dismissal_action;
53  }
54
55  DialogType dialog_type() const { return dialog_type_; }
56  AutofillMetrics::DialogDismissalAction dialog_dismissal_action() const {
57    return dialog_dismissal_action_;
58  }
59
60  AutofillMetrics::AutocheckoutCompletionStatus autocheckout_status() const {
61    return autocheckout_status_;
62  }
63
64 private:
65  DialogType dialog_type_;
66  AutofillMetrics::DialogDismissalAction dialog_dismissal_action_;
67  AutofillMetrics::AutocheckoutCompletionStatus autocheckout_status_;
68
69  DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics);
70};
71
72class TestAutofillDialogController : public AutofillDialogControllerImpl {
73 public:
74  TestAutofillDialogController(content::WebContents* contents,
75                               const FormData& form_data,
76                               const AutofillMetrics& metric_logger,
77                               const DialogType dialog_type)
78      : AutofillDialogControllerImpl(contents,
79                                     form_data,
80                                     GURL(),
81                                     metric_logger,
82                                     dialog_type,
83                                     base::Bind(&MockCallback)) {
84    DisableWallet();
85  }
86
87  virtual ~TestAutofillDialogController() {}
88
89  virtual void ViewClosed() OVERRIDE {
90    AutofillDialogControllerImpl::ViewClosed();
91    MessageLoop::current()->Quit();
92  }
93
94  virtual bool InputIsValid(AutofillFieldType type,
95                            const string16& value) OVERRIDE {
96    return true;
97  }
98
99  virtual std::vector<AutofillFieldType> InputsAreValid(
100      const DetailOutputMap& inputs) OVERRIDE {
101    return std::vector<AutofillFieldType>();
102  }
103
104  // Increase visibility for testing.
105  AutofillDialogView* view() { return AutofillDialogControllerImpl::view(); }
106
107 private:
108  DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogController);
109};
110
111}  // namespace
112
113class AutofillDialogControllerTest : public InProcessBrowserTest {
114 public:
115  AutofillDialogControllerTest() {}
116  virtual ~AutofillDialogControllerTest() {}
117
118  content::WebContents* GetActiveWebContents() {
119    return browser()->tab_strip_model()->GetActiveWebContents();
120  }
121
122 private:
123  DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerTest);
124};
125
126// TODO(isherman): Enable this test on other platforms once the UI is
127// implemented on those platforms.
128#if defined(TOOLKIT_VIEWS)
129#define MAYBE_RequestAutocompleteUiDurationMetrics \
130    RequestAutocompleteUiDurationMetrics
131#else
132#define MAYBE_RequestAutocompleteUiDurationMetrics \
133    DISABLED_RequestAutocompleteUiDurationMetrics
134#endif  // defined(TOOLKIT_VIEWS)
135IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
136                       MAYBE_RequestAutocompleteUiDurationMetrics) {
137  FormData form;
138  form.name = ASCIIToUTF16("TestForm");
139  form.method = ASCIIToUTF16("POST");
140  form.origin = GURL("http://example.com/form.html");
141  form.action = GURL("http://example.com/submit.html");
142  form.user_submitted = true;
143
144  FormFieldData field;
145  field.autocomplete_attribute = "email";
146  form.fields.push_back(field);
147
148  // Submit the form data.
149  {
150    MockAutofillMetrics metric_logger;
151    TestAutofillDialogController* dialog_controller =
152        new TestAutofillDialogController(
153            GetActiveWebContents(), form, metric_logger,
154            DIALOG_TYPE_REQUEST_AUTOCOMPLETE);
155    dialog_controller->Show();
156    dialog_controller->view()->SubmitForTesting();
157
158    content::RunMessageLoop();
159
160    EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED,
161              metric_logger.dialog_dismissal_action());
162    EXPECT_EQ(DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric_logger.dialog_type());
163  }
164
165  // Cancel out of the dialog.
166  {
167    MockAutofillMetrics metric_logger;
168    TestAutofillDialogController* dialog_controller =
169        new TestAutofillDialogController(
170            GetActiveWebContents(), form, metric_logger,
171            DIALOG_TYPE_AUTOCHECKOUT);
172    dialog_controller->Show();
173    dialog_controller->view()->CancelForTesting();
174
175    content::RunMessageLoop();
176
177    EXPECT_EQ(AutofillMetrics::DIALOG_CANCELED,
178              metric_logger.dialog_dismissal_action());
179    EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger.dialog_type());
180  }
181
182  // Take some other action that dismisses the dialog.
183  {
184    MockAutofillMetrics metric_logger;
185    TestAutofillDialogController* dialog_controller =
186        new TestAutofillDialogController(
187            GetActiveWebContents(), form, metric_logger,
188            DIALOG_TYPE_AUTOCHECKOUT);
189    dialog_controller->Show();
190    dialog_controller->Hide();
191
192    content::RunMessageLoop();
193
194    EXPECT_EQ(AutofillMetrics::DIALOG_CANCELED,
195              metric_logger.dialog_dismissal_action());
196    EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger.dialog_type());
197  }
198
199  // Test Autocheckout success metrics.
200  {
201    MockAutofillMetrics metric_logger;
202    TestAutofillDialogController* dialog_controller =
203        new TestAutofillDialogController(
204            GetActiveWebContents(), form, metric_logger,
205            DIALOG_TYPE_AUTOCHECKOUT);
206    dialog_controller->Show();
207    dialog_controller->view()->SubmitForTesting();
208
209    EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED,
210              metric_logger.dialog_dismissal_action());
211    EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger.dialog_type());
212
213    dialog_controller->Hide();
214
215    content::RunMessageLoop();
216
217    EXPECT_EQ(AutofillMetrics::AUTOCHECKOUT_SUCCEEDED,
218              metric_logger.autocheckout_status());
219  }
220
221  // Test Autocheckout failure metric.
222  {
223    MockAutofillMetrics metric_logger;
224    TestAutofillDialogController* dialog_controller =
225        new TestAutofillDialogController(
226            GetActiveWebContents(), form, metric_logger,
227            DIALOG_TYPE_AUTOCHECKOUT);
228    dialog_controller->Show();
229    dialog_controller->view()->SubmitForTesting();
230
231    EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED,
232              metric_logger.dialog_dismissal_action());
233    EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger.dialog_type());
234
235    dialog_controller->OnAutocheckoutError();
236    dialog_controller->view()->CancelForTesting();
237
238    content::RunMessageLoop();
239
240    EXPECT_EQ(AutofillMetrics::AUTOCHECKOUT_FAILED,
241              metric_logger.autocheckout_status());
242  }
243}
244
245}  // namespace autofill
246