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