Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: chrome/browser/autofill/autofill_metrics_unittest.cc

Issue 12434004: Move remaining Autofill code to //components/autofill. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix long lines Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 <vector>
6
7 #include "base/memory/scoped_ptr.h"
8 #include "base/string16.h"
9 #include "base/time.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/autofill/autocheckout_page_meta_data.h"
12 #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h"
13 #include "chrome/browser/autofill/autofill_common_test.h"
14 #include "chrome/browser/autofill/autofill_manager.h"
15 #include "chrome/browser/autofill/autofill_manager_delegate.h"
16 #include "chrome/browser/autofill/autofill_metrics.h"
17 #include "chrome/browser/autofill/personal_data_manager.h"
18 #include "chrome/browser/autofill/personal_data_manager_factory.h"
19 #include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h"
20 #include "chrome/browser/webdata/web_data_service.h"
21 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
22 #include "chrome/test/base/testing_profile.h"
23 #include "components/autofill/common/form_data.h"
24 #include "components/autofill/common/form_field_data.h"
25 #include "content/public/test/test_browser_thread.h"
26 #include "googleurl/src/gurl.h"
27 #include "testing/gmock/include/gmock/gmock.h"
28 #include "testing/gtest/include/gtest/gtest.h"
29 #include "ui/gfx/rect.h"
30
31 using content::BrowserThread;
32 using ::testing::_;
33 using ::testing::AnyNumber;
34 using ::testing::Mock;
35 using base::TimeTicks;
36 using base::TimeDelta;
37
38 namespace {
39
40 class MockAutofillMetrics : public AutofillMetrics {
41 public:
42 MockAutofillMetrics() {}
43 MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric));
44 MOCK_CONST_METHOD1(LogDeveloperEngagementMetric,
45 void(DeveloperEngagementMetric metric));
46 MOCK_CONST_METHOD3(LogHeuristicTypePrediction,
47 void(FieldTypeQualityMetric metric,
48 AutofillFieldType field_type,
49 const std::string& experiment_id));
50 MOCK_CONST_METHOD3(LogOverallTypePrediction,
51 void(FieldTypeQualityMetric metric,
52 AutofillFieldType field_type,
53 const std::string& experiment_id));
54 MOCK_CONST_METHOD3(LogServerTypePrediction,
55 void(FieldTypeQualityMetric metric,
56 AutofillFieldType field_type,
57 const std::string& experiment_id));
58 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric,
59 const std::string& experiment_id));
60 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric));
61 MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric));
62 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithAutofill,
63 void(const TimeDelta& duration));
64 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithoutAutofill,
65 void(const TimeDelta& duration));
66 MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithAutofill,
67 void(const TimeDelta& duration));
68 MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithoutAutofill,
69 void(const TimeDelta& duration));
70 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled));
71 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled));
72 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles));
73 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions));
74 MOCK_CONST_METHOD1(LogServerExperimentIdForQuery,
75 void(const std::string& experiment_id));
76 MOCK_CONST_METHOD1(LogServerExperimentIdForUpload,
77 void(const std::string& experiment_id));
78
79 private:
80 DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics);
81 };
82
83 class TestPersonalDataManager : public PersonalDataManager {
84 public:
85 TestPersonalDataManager() : autofill_enabled_(true) {
86 set_metric_logger(new MockAutofillMetrics);
87 CreateTestAutofillProfiles(&web_profiles_);
88 }
89
90 void SetBrowserContext(content::BrowserContext* context) {
91 set_browser_context(context);
92 }
93
94 // Overridden to avoid a trip to the database. This should be a no-op except
95 // for the side-effect of logging the profile count.
96 virtual void LoadProfiles() OVERRIDE {
97 std::vector<AutofillProfile*> profiles;
98 web_profiles_.release(&profiles);
99 WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT,
100 profiles);
101 ReceiveLoadedProfiles(0, &result);
102 }
103
104 // Overridden to avoid a trip to the database.
105 virtual void LoadCreditCards() OVERRIDE {}
106
107 const MockAutofillMetrics* metric_logger() const {
108 return static_cast<const MockAutofillMetrics*>(
109 PersonalDataManager::metric_logger());
110 }
111
112 void set_autofill_enabled(bool autofill_enabled) {
113 autofill_enabled_ = autofill_enabled;
114 }
115
116 virtual bool IsAutofillEnabled() const OVERRIDE {
117 return autofill_enabled_;
118 }
119
120 MOCK_METHOD1(SaveImportedCreditCard,
121 void(const CreditCard& imported_credit_card));
122
123 private:
124 void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) {
125 AutofillProfile* profile = new AutofillProfile;
126 autofill_test::SetProfileInfo(profile, "Elvis", "Aaron",
127 "Presley", "theking@gmail.com", "RCA",
128 "3734 Elvis Presley Blvd.", "Apt. 10",
129 "Memphis", "Tennessee", "38116", "US",
130 "12345678901");
131 profile->set_guid("00000000-0000-0000-0000-000000000001");
132 profiles->push_back(profile);
133 profile = new AutofillProfile;
134 autofill_test::SetProfileInfo(profile, "Charles", "Hardin",
135 "Holley", "buddy@gmail.com", "Decca",
136 "123 Apple St.", "unit 6", "Lubbock",
137 "Texas", "79401", "US", "2345678901");
138 profile->set_guid("00000000-0000-0000-0000-000000000002");
139 profiles->push_back(profile);
140 }
141
142 bool autofill_enabled_;
143
144 DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager);
145 };
146
147 class TestFormStructure : public FormStructure {
148 public:
149 explicit TestFormStructure(const FormData& form)
150 : FormStructure(form, std::string()) {}
151 virtual ~TestFormStructure() {}
152
153 void SetFieldTypes(const std::vector<AutofillFieldType>& heuristic_types,
154 const std::vector<AutofillFieldType>& server_types) {
155 ASSERT_EQ(field_count(), heuristic_types.size());
156 ASSERT_EQ(field_count(), server_types.size());
157
158 for (size_t i = 0; i < field_count(); ++i) {
159 AutofillField* form_field = field(i);
160 ASSERT_TRUE(form_field);
161 form_field->set_heuristic_type(heuristic_types[i]);
162 form_field->set_server_type(server_types[i]);
163 }
164
165 UpdateAutofillCount();
166 }
167
168 virtual std::string server_experiment_id() const OVERRIDE {
169 return server_experiment_id_;
170 }
171 void set_server_experiment_id(const std::string& server_experiment_id) {
172 server_experiment_id_ = server_experiment_id;
173 }
174
175 private:
176 std::string server_experiment_id_;
177 DISALLOW_COPY_AND_ASSIGN(TestFormStructure);
178 };
179
180 class TestAutofillManager : public AutofillManager {
181 public:
182 TestAutofillManager(content::WebContents* web_contents,
183 autofill::AutofillManagerDelegate* manager_delegate,
184 TestPersonalDataManager* personal_manager)
185 : AutofillManager(web_contents, manager_delegate, personal_manager),
186 autofill_enabled_(true),
187 did_finish_async_form_submit_(false),
188 message_loop_is_running_(false) {
189 set_metric_logger(new MockAutofillMetrics);
190 }
191 virtual ~TestAutofillManager() {}
192
193 virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; }
194
195 void set_autofill_enabled(bool autofill_enabled) {
196 autofill_enabled_ = autofill_enabled;
197 }
198
199 MockAutofillMetrics* metric_logger() {
200 return static_cast<MockAutofillMetrics*>(const_cast<AutofillMetrics*>(
201 AutofillManager::metric_logger()));
202 }
203
204 void AddSeenForm(const FormData& form,
205 const std::vector<AutofillFieldType>& heuristic_types,
206 const std::vector<AutofillFieldType>& server_types,
207 const std::string& experiment_id) {
208 FormData empty_form = form;
209 for (size_t i = 0; i < empty_form.fields.size(); ++i) {
210 empty_form.fields[i].value = string16();
211 }
212
213 // |form_structure| will be owned by |form_structures()|.
214 TestFormStructure* form_structure = new TestFormStructure(empty_form);
215 form_structure->SetFieldTypes(heuristic_types, server_types);
216 form_structure->set_server_experiment_id(experiment_id);
217 form_structures()->push_back(form_structure);
218 }
219
220 void FormSubmitted(const FormData& form, const TimeTicks& timestamp) {
221 if (!OnFormSubmitted(form, timestamp))
222 return;
223
224 // Wait for the asynchronous FormSubmitted() call to complete.
225 if (!did_finish_async_form_submit_) {
226 // TODO(isherman): It seems silly to need this variable. Is there some
227 // way I can just query the message loop's state?
228 message_loop_is_running_ = true;
229 MessageLoop::current()->Run();
230 } else {
231 did_finish_async_form_submit_ = false;
232 }
233 }
234
235 virtual void UploadFormDataAsyncCallback(
236 const FormStructure* submitted_form,
237 const base::TimeTicks& load_time,
238 const base::TimeTicks& interaction_time,
239 const base::TimeTicks& submission_time) OVERRIDE {
240 if (message_loop_is_running_) {
241 MessageLoop::current()->Quit();
242 message_loop_is_running_ = false;
243 } else {
244 did_finish_async_form_submit_ = true;
245 }
246
247 AutofillManager::UploadFormDataAsyncCallback(submitted_form,
248 load_time,
249 interaction_time,
250 submission_time);
251 }
252
253 private:
254 bool autofill_enabled_;
255 bool did_finish_async_form_submit_;
256 bool message_loop_is_running_;
257
258 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager);
259 };
260
261 } // namespace
262
263 class AutofillMetricsTest : public ChromeRenderViewHostTestHarness {
264 public:
265 AutofillMetricsTest();
266 virtual ~AutofillMetricsTest();
267
268 virtual void SetUp() OVERRIDE;
269 virtual void TearDown() OVERRIDE;
270
271 protected:
272 scoped_ptr<ConfirmInfoBarDelegate> CreateDelegate(
273 MockAutofillMetrics* metric_logger);
274
275 content::TestBrowserThread ui_thread_;
276 content::TestBrowserThread file_thread_;
277 content::TestBrowserThread io_thread_;
278
279 scoped_ptr<TestAutofillManager> autofill_manager_;
280 TestPersonalDataManager personal_data_;
281
282 private:
283 std::string default_gmock_verbosity_level_;
284
285 DISALLOW_COPY_AND_ASSIGN(AutofillMetricsTest);
286 };
287
288 AutofillMetricsTest::AutofillMetricsTest()
289 : ChromeRenderViewHostTestHarness(),
290 ui_thread_(BrowserThread::UI, &message_loop_),
291 file_thread_(BrowserThread::FILE),
292 io_thread_(BrowserThread::IO) {
293 }
294
295 AutofillMetricsTest::~AutofillMetricsTest() {
296 // Order of destruction is important as AutofillManager relies on
297 // PersonalDataManager to be around when it gets destroyed.
298 autofill_manager_.reset();
299 }
300
301 void AutofillMetricsTest::SetUp() {
302 TestingProfile* profile = new TestingProfile();
303 profile->CreateRequestContext();
304 browser_context_.reset(profile);
305 PersonalDataManagerFactory::GetInstance()->SetTestingFactory(profile, NULL);
306
307 ChromeRenderViewHostTestHarness::SetUp();
308 io_thread_.StartIOThread();
309 autofill::TabAutofillManagerDelegate::CreateForWebContents(web_contents());
310 personal_data_.SetBrowserContext(profile);
311 autofill_manager_.reset(new TestAutofillManager(
312 web_contents(),
313 autofill::TabAutofillManagerDelegate::FromWebContents(web_contents()),
314 &personal_data_));
315
316 file_thread_.Start();
317
318 // Ignore any metrics that we haven't explicitly set expectations for.
319 // If we don't override the verbosity level, we'll get lots of log spew from
320 // mocked functions that aren't relevant to a test but happen to be called
321 // during the test's execution.
322 // CAUTION: This is a global variable. So as to not affect other tests, this
323 // _must_ be restored to its original value at the end of the test.
324 default_gmock_verbosity_level_ = ::testing::FLAGS_gmock_verbose;
325 ::testing::FLAGS_gmock_verbose = "error";
326 }
327
328 void AutofillMetricsTest::TearDown() {
329 // Restore the global Gmock verbosity level to its default value.
330 ::testing::FLAGS_gmock_verbose = default_gmock_verbosity_level_;
331
332 // Order of destruction is important as AutofillManager relies on
333 // PersonalDataManager to be around when it gets destroyed. Also, a real
334 // AutofillManager is tied to the lifetime of the WebContents, so it must
335 // be destroyed at the destruction of the WebContents.
336 autofill_manager_.reset();
337 profile()->ResetRequestContext();
338 file_thread_.Stop();
339 ChromeRenderViewHostTestHarness::TearDown();
340 io_thread_.Stop();
341 }
342
343 scoped_ptr<ConfirmInfoBarDelegate> AutofillMetricsTest::CreateDelegate(
344 MockAutofillMetrics* metric_logger) {
345 EXPECT_CALL(*metric_logger,
346 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_SHOWN));
347
348 CreditCard credit_card;
349 return AutofillCCInfoBarDelegate::CreateForTesting(
350 metric_logger,
351 base::Bind(&TestPersonalDataManager::SaveImportedCreditCard,
352 base::Unretained(&personal_data_), credit_card));
353 }
354
355 // Test that we log quality metrics appropriately.
356 TEST_F(AutofillMetricsTest, QualityMetrics) {
357 // Set up our form data.
358 FormData form;
359 form.name = ASCIIToUTF16("TestForm");
360 form.method = ASCIIToUTF16("POST");
361 form.origin = GURL("http://example.com/form.html");
362 form.action = GURL("http://example.com/submit.html");
363 form.user_submitted = true;
364
365 std::vector<AutofillFieldType> heuristic_types, server_types;
366 FormFieldData field;
367
368 autofill_test::CreateTestFormField(
369 "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field);
370 field.is_autofilled = true;
371 form.fields.push_back(field);
372 heuristic_types.push_back(NAME_FULL);
373 server_types.push_back(NAME_FIRST);
374
375 autofill_test::CreateTestFormField(
376 "Autofill Failed", "autofillfailed", "buddy@gmail.com", "text", &field);
377 field.is_autofilled = false;
378 form.fields.push_back(field);
379 heuristic_types.push_back(PHONE_HOME_NUMBER);
380 server_types.push_back(EMAIL_ADDRESS);
381
382 autofill_test::CreateTestFormField(
383 "Empty", "empty", "", "text", &field);
384 field.is_autofilled = false;
385 form.fields.push_back(field);
386 heuristic_types.push_back(NAME_FULL);
387 server_types.push_back(NAME_FIRST);
388
389 autofill_test::CreateTestFormField(
390 "Unknown", "unknown", "garbage", "text", &field);
391 field.is_autofilled = false;
392 form.fields.push_back(field);
393 heuristic_types.push_back(PHONE_HOME_NUMBER);
394 server_types.push_back(EMAIL_ADDRESS);
395
396 autofill_test::CreateTestFormField(
397 "Select", "select", "USA", "select-one", &field);
398 field.is_autofilled = false;
399 form.fields.push_back(field);
400 heuristic_types.push_back(UNKNOWN_TYPE);
401 server_types.push_back(NO_SERVER_DATA);
402
403 autofill_test::CreateTestFormField(
404 "Phone", "phone", "2345678901", "tel", &field);
405 field.is_autofilled = true;
406 form.fields.push_back(field);
407 heuristic_types.push_back(PHONE_HOME_CITY_AND_NUMBER);
408 server_types.push_back(PHONE_HOME_WHOLE_NUMBER);
409
410 // Simulate having seen this form on page load.
411 autofill_manager_->AddSeenForm(form, heuristic_types, server_types,
412 std::string());
413
414 // Establish our expectations.
415 ::testing::InSequence dummy;
416 EXPECT_CALL(*autofill_manager_->metric_logger(),
417 LogServerExperimentIdForUpload(std::string()));
418 // Autofilled field
419 EXPECT_CALL(*autofill_manager_->metric_logger(),
420 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
421 std::string()));
422 EXPECT_CALL(*autofill_manager_->metric_logger(),
423 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH,
424 NAME_FULL, std::string()));
425 EXPECT_CALL(*autofill_manager_->metric_logger(),
426 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH,
427 NAME_FULL, std::string()));
428 EXPECT_CALL(*autofill_manager_->metric_logger(),
429 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH,
430 NAME_FULL, std::string()));
431 EXPECT_CALL(*autofill_manager_->metric_logger(),
432 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED,
433 std::string()));
434 // Non-autofilled field for which we had data
435 EXPECT_CALL(*autofill_manager_->metric_logger(),
436 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
437 std::string()));
438 EXPECT_CALL(*autofill_manager_->metric_logger(),
439 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH,
440 EMAIL_ADDRESS, std::string()));
441 EXPECT_CALL(*autofill_manager_->metric_logger(),
442 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH,
443 EMAIL_ADDRESS, std::string()));
444 EXPECT_CALL(*autofill_manager_->metric_logger(),
445 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH,
446 EMAIL_ADDRESS, std::string()));
447 EXPECT_CALL(*autofill_manager_->metric_logger(),
448 LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED,
449 std::string()));
450 EXPECT_CALL(*autofill_manager_->metric_logger(),
451 LogQualityMetric(
452 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
453 std::string()));
454 EXPECT_CALL(*autofill_manager_->metric_logger(),
455 LogQualityMetric(
456 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH,
457 std::string()));
458 // Empty field
459 EXPECT_CALL(*autofill_manager_->metric_logger(),
460 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
461 std::string()));
462 // Unknown field
463 EXPECT_CALL(*autofill_manager_->metric_logger(),
464 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
465 std::string()));
466 // <select> field
467 EXPECT_CALL(*autofill_manager_->metric_logger(),
468 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
469 std::string()));
470 EXPECT_CALL(*autofill_manager_->metric_logger(),
471 LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
472 ADDRESS_HOME_COUNTRY, std::string()));
473 EXPECT_CALL(*autofill_manager_->metric_logger(),
474 LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
475 ADDRESS_HOME_COUNTRY, std::string()));
476 EXPECT_CALL(*autofill_manager_->metric_logger(),
477 LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
478 ADDRESS_HOME_COUNTRY, std::string()));
479 // Phone field
480 EXPECT_CALL(*autofill_manager_->metric_logger(),
481 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
482 std::string()));
483 EXPECT_CALL(*autofill_manager_->metric_logger(),
484 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH,
485 PHONE_HOME_WHOLE_NUMBER, std::string()));
486 EXPECT_CALL(*autofill_manager_->metric_logger(),
487 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH,
488 PHONE_HOME_WHOLE_NUMBER, std::string()));
489 EXPECT_CALL(*autofill_manager_->metric_logger(),
490 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH,
491 PHONE_HOME_WHOLE_NUMBER, std::string()));
492 EXPECT_CALL(*autofill_manager_->metric_logger(),
493 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED,
494 std::string()));
495 EXPECT_CALL(*autofill_manager_->metric_logger(),
496 LogUserHappinessMetric(
497 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME));
498
499 // Simulate form submission.
500 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form,
501 TimeTicks::Now()));
502 }
503
504 // Test that we log the appropriate additional metrics when Autofill failed.
505 TEST_F(AutofillMetricsTest, QualityMetricsForFailure) {
506 // Set up our form data.
507 FormData form;
508 form.name = ASCIIToUTF16("TestForm");
509 form.method = ASCIIToUTF16("POST");
510 form.origin = GURL("http://example.com/form.html");
511 form.action = GURL("http://example.com/submit.html");
512 form.user_submitted = true;
513
514 struct {
515 const char* label;
516 const char* name;
517 const char* value;
518 AutofillFieldType heuristic_type;
519 AutofillFieldType server_type;
520 AutofillMetrics::QualityMetric heuristic_metric;
521 AutofillMetrics::QualityMetric server_metric;
522 } failure_cases[] = {
523 {
524 "Heuristics unknown, server unknown", "0,0", "Elvis",
525 UNKNOWN_TYPE, NO_SERVER_DATA,
526 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN,
527 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN
528 },
529 {
530 "Heuristics match, server unknown", "1,0", "Aaron",
531 NAME_MIDDLE, NO_SERVER_DATA,
532 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH,
533 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN
534 },
535 {
536 "Heuristics mismatch, server unknown", "2,0", "Presley",
537 PHONE_HOME_NUMBER, NO_SERVER_DATA,
538 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
539 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN
540 },
541 {
542 "Heuristics unknown, server match", "0,1", "theking@gmail.com",
543 UNKNOWN_TYPE, EMAIL_ADDRESS,
544 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN,
545 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH
546 },
547 {
548 "Heuristics match, server match", "1,1", "3734 Elvis Presley Blvd.",
549 ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE1,
550 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH,
551 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH
552 },
553 {
554 "Heuristics mismatch, server match", "2,1", "Apt. 10",
555 PHONE_HOME_NUMBER, ADDRESS_HOME_LINE2,
556 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
557 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH
558 },
559 {
560 "Heuristics unknown, server mismatch", "0,2", "Memphis",
561 UNKNOWN_TYPE, PHONE_HOME_NUMBER,
562 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN,
563 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH
564 },
565 {
566 "Heuristics match, server mismatch", "1,2", "Tennessee",
567 ADDRESS_HOME_STATE, PHONE_HOME_NUMBER,
568 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH,
569 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH
570 },
571 {
572 "Heuristics mismatch, server mismatch", "2,2", "38116",
573 PHONE_HOME_NUMBER, PHONE_HOME_NUMBER,
574 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
575 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH
576 }
577 };
578
579 std::vector<AutofillFieldType> heuristic_types, server_types;
580 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) {
581 FormFieldData field;
582 autofill_test::CreateTestFormField(failure_cases[i].label,
583 failure_cases[i].name,
584 failure_cases[i].value, "text", &field);
585 form.fields.push_back(field);
586 heuristic_types.push_back(failure_cases[i].heuristic_type);
587 server_types.push_back(failure_cases[i].server_type);
588
589 }
590
591 // Simulate having seen this form with the desired heuristic and server types.
592 // |form_structure| will be owned by |autofill_manager_|.
593 autofill_manager_->AddSeenForm(form, heuristic_types, server_types,
594 std::string());
595
596
597 // Establish our expectations.
598 ::testing::InSequence dummy;
599 EXPECT_CALL(*autofill_manager_->metric_logger(),
600 LogServerExperimentIdForUpload(std::string()));
601 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) {
602 EXPECT_CALL(*autofill_manager_->metric_logger(),
603 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
604 std::string()));
605 EXPECT_CALL(*autofill_manager_->metric_logger(),
606 LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED,
607 std::string()));
608 EXPECT_CALL(*autofill_manager_->metric_logger(),
609 LogQualityMetric(failure_cases[i].heuristic_metric,
610 std::string()));
611 EXPECT_CALL(*autofill_manager_->metric_logger(),
612 LogQualityMetric(failure_cases[i].server_metric,
613 std::string()));
614 }
615
616 // Simulate form submission.
617 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form,
618 TimeTicks::Now()));
619 }
620
621 // Test that we behave sanely when the cached form differs from the submitted
622 // one.
623 TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) {
624 // Set up our form data.
625 FormData form;
626 form.name = ASCIIToUTF16("TestForm");
627 form.method = ASCIIToUTF16("POST");
628 form.origin = GURL("http://example.com/form.html");
629 form.action = GURL("http://example.com/submit.html");
630 form.user_submitted = true;
631
632 std::vector<AutofillFieldType> heuristic_types, server_types;
633
634 FormFieldData field;
635 autofill_test::CreateTestFormField(
636 "Both match", "match", "Elvis Aaron Presley", "text", &field);
637 field.is_autofilled = true;
638 form.fields.push_back(field);
639 heuristic_types.push_back(NAME_FULL);
640 server_types.push_back(NAME_FULL);
641 autofill_test::CreateTestFormField(
642 "Both mismatch", "mismatch", "buddy@gmail.com", "text", &field);
643 field.is_autofilled = false;
644 form.fields.push_back(field);
645 heuristic_types.push_back(PHONE_HOME_NUMBER);
646 server_types.push_back(PHONE_HOME_NUMBER);
647 autofill_test::CreateTestFormField(
648 "Only heuristics match", "mixed", "Memphis", "text", &field);
649 field.is_autofilled = false;
650 form.fields.push_back(field);
651 heuristic_types.push_back(ADDRESS_HOME_CITY);
652 server_types.push_back(PHONE_HOME_NUMBER);
653 autofill_test::CreateTestFormField(
654 "Unknown", "unknown", "garbage", "text", &field);
655 field.is_autofilled = false;
656 form.fields.push_back(field);
657 heuristic_types.push_back(UNKNOWN_TYPE);
658 server_types.push_back(UNKNOWN_TYPE);
659
660 // Simulate having seen this form with the desired heuristic and server types.
661 // |form_structure| will be owned by |autofill_manager_|.
662 autofill_manager_->AddSeenForm(form, heuristic_types, server_types,
663 std::string());
664
665
666 // Add a field and re-arrange the remaining form fields before submitting.
667 std::vector<FormFieldData> cached_fields = form.fields;
668 form.fields.clear();
669 autofill_test::CreateTestFormField(
670 "New field", "new field", "Tennessee", "text", &field);
671 form.fields.push_back(field);
672 form.fields.push_back(cached_fields[2]);
673 form.fields.push_back(cached_fields[1]);
674 form.fields.push_back(cached_fields[3]);
675 form.fields.push_back(cached_fields[0]);
676
677 // Establish our expectations.
678 ::testing::InSequence dummy;
679 // New field
680 EXPECT_CALL(*autofill_manager_->metric_logger(),
681 LogServerExperimentIdForUpload(std::string()));
682 EXPECT_CALL(*autofill_manager_->metric_logger(),
683 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
684 std::string()));
685 EXPECT_CALL(*autofill_manager_->metric_logger(),
686 LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
687 ADDRESS_HOME_STATE, std::string()));
688 EXPECT_CALL(*autofill_manager_->metric_logger(),
689 LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
690 ADDRESS_HOME_STATE, std::string()));
691 EXPECT_CALL(*autofill_manager_->metric_logger(),
692 LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
693 ADDRESS_HOME_STATE, std::string()));
694 EXPECT_CALL(*autofill_manager_->metric_logger(),
695 LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED,
696 std::string()));
697 EXPECT_CALL(*autofill_manager_->metric_logger(),
698 LogQualityMetric(
699 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN,
700 std::string()));
701 EXPECT_CALL(*autofill_manager_->metric_logger(),
702 LogQualityMetric(
703 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN,
704 std::string()));
705 // Only heuristics match
706 EXPECT_CALL(*autofill_manager_->metric_logger(),
707 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
708 std::string()));
709 EXPECT_CALL(*autofill_manager_->metric_logger(),
710 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH,
711 ADDRESS_HOME_CITY, std::string()));
712 EXPECT_CALL(*autofill_manager_->metric_logger(),
713 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH,
714 ADDRESS_HOME_CITY, std::string()));
715 EXPECT_CALL(*autofill_manager_->metric_logger(),
716 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH,
717 ADDRESS_HOME_CITY, std::string()));
718 EXPECT_CALL(*autofill_manager_->metric_logger(),
719 LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED,
720 std::string()));
721 EXPECT_CALL(*autofill_manager_->metric_logger(),
722 LogQualityMetric(
723 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH,
724 std::string()));
725 EXPECT_CALL(*autofill_manager_->metric_logger(),
726 LogQualityMetric(
727 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH,
728 std::string()));
729 // Both mismatch
730 EXPECT_CALL(*autofill_manager_->metric_logger(),
731 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
732 std::string()));
733 EXPECT_CALL(*autofill_manager_->metric_logger(),
734 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH,
735 EMAIL_ADDRESS, std::string()));
736 EXPECT_CALL(*autofill_manager_->metric_logger(),
737 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH,
738 EMAIL_ADDRESS, std::string()));
739 EXPECT_CALL(*autofill_manager_->metric_logger(),
740 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH,
741 EMAIL_ADDRESS, std::string()));
742 EXPECT_CALL(*autofill_manager_->metric_logger(),
743 LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED,
744 std::string()));
745 EXPECT_CALL(*autofill_manager_->metric_logger(),
746 LogQualityMetric(
747 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
748 std::string()));
749 EXPECT_CALL(*autofill_manager_->metric_logger(),
750 LogQualityMetric(
751 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH,
752 std::string()));
753 // Unknown
754 EXPECT_CALL(*autofill_manager_->metric_logger(),
755 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
756 std::string()));
757 // Both match
758 EXPECT_CALL(*autofill_manager_->metric_logger(),
759 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
760 std::string()));
761 EXPECT_CALL(*autofill_manager_->metric_logger(),
762 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH,
763 NAME_FULL, std::string()));
764 EXPECT_CALL(*autofill_manager_->metric_logger(),
765 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH,
766 NAME_FULL, std::string()));
767 EXPECT_CALL(*autofill_manager_->metric_logger(),
768 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH,
769 NAME_FULL, std::string()));
770 EXPECT_CALL(*autofill_manager_->metric_logger(),
771 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED,
772 std::string()));
773
774 // Simulate form submission.
775 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form,
776 TimeTicks::Now()));
777 }
778
779 // Verify that we correctly log metrics regarding developer engagement.
780 TEST_F(AutofillMetricsTest, DeveloperEngagement) {
781 // Start with a non-fillable form.
782 FormData form;
783 form.name = ASCIIToUTF16("TestForm");
784 form.method = ASCIIToUTF16("POST");
785 form.origin = GURL("http://example.com/form.html");
786 form.action = GURL("http://example.com/submit.html");
787
788 FormFieldData field;
789 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
790 form.fields.push_back(field);
791 autofill_test::CreateTestFormField("Email", "email", "", "text", &field);
792 form.fields.push_back(field);
793
794 std::vector<FormData> forms(1, form);
795
796 // Ensure no metrics are logged when loading a non-fillable form.
797 {
798 EXPECT_CALL(*autofill_manager_->metric_logger(),
799 LogDeveloperEngagementMetric(_)).Times(0);
800 autofill_manager_->OnFormsSeen(forms, TimeTicks());
801 autofill_manager_->Reset();
802 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
803 }
804
805 // Add another field to the form, so that it becomes fillable.
806 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field);
807 forms.back().fields.push_back(field);
808
809 // Expect only the "form parsed" metric to be logged; no metrics about
810 // author-specified field type hints.
811 {
812 EXPECT_CALL(
813 *autofill_manager_->metric_logger(),
814 LogDeveloperEngagementMetric(
815 AutofillMetrics::FILLABLE_FORM_PARSED)).Times(1);
816 EXPECT_CALL(
817 *autofill_manager_->metric_logger(),
818 LogDeveloperEngagementMetric(
819 AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS)).Times(0);
820 autofill_manager_->OnFormsSeen(forms, TimeTicks());
821 autofill_manager_->Reset();
822 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
823 }
824
825 // Add some fields with an author-specified field type to the form.
826 // We need to add at least three fields, because a form must have at least
827 // three fillable fields to be considered to be autofillable; and if at least
828 // one field specifies an explicit type hint, we don't apply any of our usual
829 // local heuristics to detect field types in the rest of the form.
830 autofill_test::CreateTestFormField("", "", "", "text", &field);
831 field.autocomplete_attribute = "given-name";
832 forms.back().fields.push_back(field);
833 autofill_test::CreateTestFormField("", "", "", "text", &field);
834 field.autocomplete_attribute = "email";
835 forms.back().fields.push_back(field);
836 autofill_test::CreateTestFormField("", "", "", "text", &field);
837 field.autocomplete_attribute = "street-address";
838 forms.back().fields.push_back(field);
839
840 // Expect both the "form parsed" metric and the author-specified field type
841 // hints metric to be logged.
842 {
843 EXPECT_CALL(
844 *autofill_manager_->metric_logger(),
845 LogDeveloperEngagementMetric(
846 AutofillMetrics::FILLABLE_FORM_PARSED)).Times(1);
847 EXPECT_CALL(
848 *autofill_manager_->metric_logger(),
849 LogDeveloperEngagementMetric(
850 AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS)).Times(1);
851 autofill_manager_->OnFormsSeen(forms, TimeTicks());
852 autofill_manager_->Reset();
853 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
854 }
855 }
856
857 // Test that we don't log quality metrics for non-autofillable forms.
858 TEST_F(AutofillMetricsTest, NoQualityMetricsForNonAutofillableForms) {
859 // Forms must include at least three fields to be auto-fillable.
860 FormData form;
861 form.name = ASCIIToUTF16("TestForm");
862 form.method = ASCIIToUTF16("POST");
863 form.origin = GURL("http://example.com/form.html");
864 form.action = GURL("http://example.com/submit.html");
865 form.user_submitted = true;
866
867 FormFieldData field;
868 autofill_test::CreateTestFormField(
869 "Autofilled", "autofilled", "Elvis Presley", "text", &field);
870 field.is_autofilled = true;
871 form.fields.push_back(field);
872 autofill_test::CreateTestFormField(
873 "Autofill Failed", "autofillfailed", "buddy@gmail.com", "text", &field);
874 form.fields.push_back(field);
875
876 // Simulate form submission.
877 EXPECT_CALL(*autofill_manager_->metric_logger(),
878 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
879 std::string())).Times(0);
880 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form,
881 TimeTicks::Now()));
882
883 // Search forms are not auto-fillable.
884 form.action = GURL("http://example.com/search?q=Elvis%20Presley");
885 autofill_test::CreateTestFormField(
886 "Empty", "empty", "", "text", &field);
887 form.fields.push_back(field);
888
889 // Simulate form submission.
890 EXPECT_CALL(*autofill_manager_->metric_logger(),
891 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
892 std::string())).Times(0);
893 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form,
894 TimeTicks::Now()));
895 }
896
897 // Test that we recored the experiment id appropriately.
898 TEST_F(AutofillMetricsTest, QualityMetricsWithExperimentId) {
899 // Set up our form data.
900 FormData form;
901 form.name = ASCIIToUTF16("TestForm");
902 form.method = ASCIIToUTF16("POST");
903 form.origin = GURL("http://example.com/form.html");
904 form.action = GURL("http://example.com/submit.html");
905 form.user_submitted = true;
906
907 std::vector<AutofillFieldType> heuristic_types, server_types;
908 FormFieldData field;
909
910 autofill_test::CreateTestFormField(
911 "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field);
912 field.is_autofilled = true;
913 form.fields.push_back(field);
914 heuristic_types.push_back(NAME_FULL);
915 server_types.push_back(NAME_FIRST);
916
917 autofill_test::CreateTestFormField(
918 "Autofill Failed", "autofillfailed", "buddy@gmail.com", "text", &field);
919 field.is_autofilled = false;
920 form.fields.push_back(field);
921 heuristic_types.push_back(PHONE_HOME_NUMBER);
922 server_types.push_back(EMAIL_ADDRESS);
923
924 autofill_test::CreateTestFormField(
925 "Empty", "empty", "", "text", &field);
926 field.is_autofilled = false;
927 form.fields.push_back(field);
928 heuristic_types.push_back(NAME_FULL);
929 server_types.push_back(NAME_FIRST);
930
931 autofill_test::CreateTestFormField(
932 "Unknown", "unknown", "garbage", "text", &field);
933 field.is_autofilled = false;
934 form.fields.push_back(field);
935 heuristic_types.push_back(PHONE_HOME_NUMBER);
936 server_types.push_back(EMAIL_ADDRESS);
937
938 autofill_test::CreateTestFormField(
939 "Select", "select", "USA", "select-one", &field);
940 field.is_autofilled = false;
941 form.fields.push_back(field);
942 heuristic_types.push_back(UNKNOWN_TYPE);
943 server_types.push_back(NO_SERVER_DATA);
944
945 const std::string experiment_id = "ThatOughtaDoIt";
946
947 // Simulate having seen this form on page load.
948 // |form_structure| will be owned by |autofill_manager_|.
949 autofill_manager_->AddSeenForm(form, heuristic_types, server_types,
950 experiment_id);
951
952 // Establish our expectations.
953 ::testing::InSequence dummy;
954 EXPECT_CALL(*autofill_manager_->metric_logger(),
955 LogServerExperimentIdForUpload(experiment_id));
956 // Autofilled field
957 EXPECT_CALL(*autofill_manager_->metric_logger(),
958 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
959 experiment_id));
960 EXPECT_CALL(*autofill_manager_->metric_logger(),
961 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH,
962 NAME_FULL, experiment_id));
963 EXPECT_CALL(*autofill_manager_->metric_logger(),
964 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH,
965 NAME_FULL, experiment_id));
966 EXPECT_CALL(*autofill_manager_->metric_logger(),
967 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH,
968 NAME_FULL, experiment_id));
969 EXPECT_CALL(*autofill_manager_->metric_logger(),
970 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED,
971 experiment_id));
972 // Non-autofilled field for which we had data
973 EXPECT_CALL(*autofill_manager_->metric_logger(),
974 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
975 experiment_id));
976 EXPECT_CALL(*autofill_manager_->metric_logger(),
977 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH,
978 EMAIL_ADDRESS, experiment_id));
979 EXPECT_CALL(*autofill_manager_->metric_logger(),
980 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH,
981 EMAIL_ADDRESS, experiment_id));
982 EXPECT_CALL(*autofill_manager_->metric_logger(),
983 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH,
984 EMAIL_ADDRESS, experiment_id));
985 EXPECT_CALL(*autofill_manager_->metric_logger(),
986 LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED,
987 experiment_id));
988 EXPECT_CALL(*autofill_manager_->metric_logger(),
989 LogQualityMetric(
990 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
991 experiment_id));
992 EXPECT_CALL(*autofill_manager_->metric_logger(),
993 LogQualityMetric(
994 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH,
995 experiment_id));
996 // Empty field
997 EXPECT_CALL(*autofill_manager_->metric_logger(),
998 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
999 experiment_id));
1000 // Unknown field
1001 EXPECT_CALL(*autofill_manager_->metric_logger(),
1002 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
1003 experiment_id));
1004 // <select> field
1005 EXPECT_CALL(*autofill_manager_->metric_logger(),
1006 LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED,
1007 experiment_id));
1008 EXPECT_CALL(*autofill_manager_->metric_logger(),
1009 LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
1010 ADDRESS_HOME_COUNTRY, experiment_id));
1011 EXPECT_CALL(*autofill_manager_->metric_logger(),
1012 LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
1013 ADDRESS_HOME_COUNTRY, experiment_id));
1014 EXPECT_CALL(*autofill_manager_->metric_logger(),
1015 LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN,
1016 ADDRESS_HOME_COUNTRY, experiment_id));
1017
1018 // Simulate form submission.
1019 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form,
1020 TimeTicks::Now()));
1021 }
1022
1023 // Test that the profile count is logged correctly.
1024 TEST_F(AutofillMetricsTest, StoredProfileCount) {
1025 // The metric should be logged when the profiles are first loaded.
1026 EXPECT_CALL(*personal_data_.metric_logger(),
1027 LogStoredProfileCount(2)).Times(1);
1028 personal_data_.LoadProfiles();
1029
1030 // The metric should only be logged once.
1031 EXPECT_CALL(*personal_data_.metric_logger(),
1032 LogStoredProfileCount(::testing::_)).Times(0);
1033 personal_data_.LoadProfiles();
1034 }
1035
1036 // Test that we correctly log when Autofill is enabled.
1037 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtStartup) {
1038 personal_data_.set_autofill_enabled(true);
1039 EXPECT_CALL(*personal_data_.metric_logger(),
1040 LogIsAutofillEnabledAtStartup(true)).Times(1);
1041 personal_data_.Init(profile());
1042 }
1043
1044 // Test that we correctly log when Autofill is disabled.
1045 TEST_F(AutofillMetricsTest, AutofillIsDisabledAtStartup) {
1046 personal_data_.set_autofill_enabled(false);
1047 EXPECT_CALL(*personal_data_.metric_logger(),
1048 LogIsAutofillEnabledAtStartup(false)).Times(1);
1049 personal_data_.Init(profile());
1050 }
1051
1052 // Test that we log the number of Autofill suggestions when filling a form.
1053 TEST_F(AutofillMetricsTest, AddressSuggestionsCount) {
1054 // Set up our form data.
1055 FormData form;
1056 form.name = ASCIIToUTF16("TestForm");
1057 form.method = ASCIIToUTF16("POST");
1058 form.origin = GURL("http://example.com/form.html");
1059 form.action = GURL("http://example.com/submit.html");
1060 form.user_submitted = true;
1061
1062 FormFieldData field;
1063 std::vector<AutofillFieldType> field_types;
1064 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
1065 form.fields.push_back(field);
1066 field_types.push_back(NAME_FULL);
1067 autofill_test::CreateTestFormField("Email", "email", "", "email", &field);
1068 form.fields.push_back(field);
1069 field_types.push_back(EMAIL_ADDRESS);
1070 autofill_test::CreateTestFormField("Phone", "phone", "", "tel", &field);
1071 form.fields.push_back(field);
1072 field_types.push_back(PHONE_HOME_NUMBER);
1073
1074 // Simulate having seen this form on page load.
1075 // |form_structure| will be owned by |autofill_manager_|.
1076 autofill_manager_->AddSeenForm(form, field_types, field_types,
1077 std::string());
1078
1079 // Establish our expectations.
1080 ::testing::InSequence dummy;
1081 EXPECT_CALL(*autofill_manager_->metric_logger(),
1082 LogAddressSuggestionsCount(2)).Times(1);
1083
1084 // Simulate activating the autofill popup for the phone field.
1085 autofill_manager_->OnQueryFormFieldAutofill(
1086 0, form, field, gfx::Rect(), false);
1087
1088 // Simulate activating the autofill popup for the email field after typing.
1089 // No new metric should be logged, since we're still on the same page.
1090 autofill_test::CreateTestFormField("Email", "email", "b", "email", &field);
1091 autofill_manager_->OnQueryFormFieldAutofill(
1092 0, form, field, gfx::Rect(), false);
1093
1094 // Reset the autofill manager state.
1095 autofill_manager_->Reset();
1096 autofill_manager_->AddSeenForm(form, field_types, field_types,
1097 std::string());
1098
1099 // Establish our expectations.
1100 EXPECT_CALL(*autofill_manager_->metric_logger(),
1101 LogAddressSuggestionsCount(1)).Times(1);
1102
1103 // Simulate activating the autofill popup for the email field after typing.
1104 autofill_manager_->OnQueryFormFieldAutofill(
1105 0, form, field, gfx::Rect(), false);
1106
1107 // Reset the autofill manager state again.
1108 autofill_manager_->Reset();
1109 autofill_manager_->AddSeenForm(form, field_types, field_types,
1110 std::string());
1111
1112 // Establish our expectations.
1113 EXPECT_CALL(*autofill_manager_->metric_logger(),
1114 LogAddressSuggestionsCount(::testing::_)).Times(0);
1115
1116 // Simulate activating the autofill popup for the email field after typing.
1117 form.fields[0].is_autofilled = true;
1118 autofill_manager_->OnQueryFormFieldAutofill(
1119 0, form, field, gfx::Rect(), false);
1120 }
1121
1122 // Test that we log whether Autofill is enabled when filling a form.
1123 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) {
1124 // Establish our expectations.
1125 ::testing::InSequence dummy;
1126 EXPECT_CALL(*autofill_manager_->metric_logger(),
1127 LogIsAutofillEnabledAtPageLoad(true)).Times(1);
1128
1129 autofill_manager_->set_autofill_enabled(true);
1130 autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks());
1131
1132 // Reset the autofill manager state.
1133 autofill_manager_->Reset();
1134
1135 // Establish our expectations.
1136 EXPECT_CALL(*autofill_manager_->metric_logger(),
1137 LogIsAutofillEnabledAtPageLoad(false)).Times(1);
1138
1139 autofill_manager_->set_autofill_enabled(false);
1140 autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks());
1141 }
1142
1143 // Test that credit card infobar metrics are logged correctly.
1144 TEST_F(AutofillMetricsTest, CreditCardInfoBar) {
1145 MockAutofillMetrics metric_logger;
1146 ::testing::InSequence dummy;
1147
1148 // Accept the infobar.
1149 {
1150 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger));
1151 ASSERT_TRUE(infobar);
1152 EXPECT_CALL(personal_data_, SaveImportedCreditCard(_));
1153 EXPECT_CALL(metric_logger,
1154 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_ACCEPTED)).Times(1);
1155 EXPECT_CALL(metric_logger,
1156 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(0);
1157 EXPECT_TRUE(infobar->Accept());
1158 }
1159
1160 // Cancel the infobar.
1161 {
1162 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger));
1163 ASSERT_TRUE(infobar);
1164 EXPECT_CALL(metric_logger,
1165 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)).Times(1);
1166 EXPECT_CALL(metric_logger,
1167 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(0);
1168 EXPECT_TRUE(infobar->Cancel());
1169 }
1170
1171 // Dismiss the infobar.
1172 {
1173 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger));
1174 ASSERT_TRUE(infobar);
1175 EXPECT_CALL(metric_logger,
1176 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)).Times(1);
1177 EXPECT_CALL(metric_logger,
1178 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(0);
1179 infobar->InfoBarDismissed();
1180 }
1181
1182 // Ignore the infobar.
1183 {
1184 scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger));
1185 ASSERT_TRUE(infobar);
1186 EXPECT_CALL(metric_logger,
1187 LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(1);
1188 }
1189 }
1190
1191 // Test that server query response experiment id metrics are logged correctly.
1192 TEST_F(AutofillMetricsTest, ServerQueryExperimentIdForQuery) {
1193 MockAutofillMetrics metric_logger;
1194 ::testing::InSequence dummy;
1195
1196 // No experiment specified.
1197 EXPECT_CALL(metric_logger,
1198 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_RECEIVED));
1199 EXPECT_CALL(metric_logger,
1200 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED));
1201 EXPECT_CALL(metric_logger,
1202 LogServerExperimentIdForQuery(std::string()));
1203 EXPECT_CALL(metric_logger,
1204 LogServerQueryMetric(
1205 AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS));
1206 autofill::AutocheckoutPageMetaData page_meta_data;
1207 FormStructure::ParseQueryResponse(
1208 "<autofillqueryresponse></autofillqueryresponse>",
1209 std::vector<FormStructure*>(),
1210 &page_meta_data,
1211 metric_logger);
1212
1213 // Experiment "ar1" specified.
1214 EXPECT_CALL(metric_logger,
1215 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_RECEIVED));
1216 EXPECT_CALL(metric_logger,
1217 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED));
1218 EXPECT_CALL(metric_logger,
1219 LogServerExperimentIdForQuery("ar1"));
1220 EXPECT_CALL(metric_logger,
1221 LogServerQueryMetric(
1222 AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS));
1223 FormStructure::ParseQueryResponse(
1224 "<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>",
1225 std::vector<FormStructure*>(),
1226 &page_meta_data,
1227 metric_logger);
1228 }
1229
1230 // Verify that we correctly log user happiness metrics dealing with form loading
1231 // and form submission.
1232 TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) {
1233 // Start with a form with insufficiently many fields.
1234 FormData form;
1235 form.name = ASCIIToUTF16("TestForm");
1236 form.method = ASCIIToUTF16("POST");
1237 form.origin = GURL("http://example.com/form.html");
1238 form.action = GURL("http://example.com/submit.html");
1239 form.user_submitted = true;
1240
1241 FormFieldData field;
1242 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
1243 form.fields.push_back(field);
1244 autofill_test::CreateTestFormField("Email", "email", "", "text", &field);
1245 form.fields.push_back(field);
1246
1247 std::vector<FormData> forms(1, form);
1248
1249 // Expect no notifications when the form is first seen.
1250 {
1251 EXPECT_CALL(*autofill_manager_->metric_logger(),
1252 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)).Times(0);
1253 autofill_manager_->OnFormsSeen(forms, TimeTicks());
1254 }
1255
1256
1257 // Expect no notifications when the form is submitted.
1258 {
1259 EXPECT_CALL(
1260 *autofill_manager_->metric_logger(),
1261 LogUserHappinessMetric(
1262 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)).Times(0);
1263 EXPECT_CALL(
1264 *autofill_manager_->metric_logger(),
1265 LogUserHappinessMetric(
1266 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)).Times(0);
1267 EXPECT_CALL(
1268 *autofill_manager_->metric_logger(),
1269 LogUserHappinessMetric(
1270 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)).Times(0);
1271 EXPECT_CALL(
1272 *autofill_manager_->metric_logger(),
1273 LogUserHappinessMetric(
1274 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)).Times(0);
1275 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1276 }
1277
1278 // Add more fields to the form.
1279 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field);
1280 form.fields.push_back(field);
1281 autofill_test::CreateTestFormField("Unknown", "unknown", "", "text", &field);
1282 form.fields.push_back(field);
1283 forms.front() = form;
1284
1285 // Expect a notification when the form is first seen.
1286 {
1287 EXPECT_CALL(*autofill_manager_->metric_logger(),
1288 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED));
1289 autofill_manager_->OnFormsSeen(forms, TimeTicks());
1290 }
1291
1292 // Expect a notification when the form is submitted.
1293 {
1294 EXPECT_CALL(*autofill_manager_->metric_logger(),
1295 LogUserHappinessMetric(
1296 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM));
1297 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1298 }
1299
1300 // Fill in two of the fields.
1301 form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley");
1302 form.fields[1].value = ASCIIToUTF16("theking@gmail.com");
1303 forms.front() = form;
1304
1305 // Expect a notification when the form is submitted.
1306 {
1307 EXPECT_CALL(*autofill_manager_->metric_logger(),
1308 LogUserHappinessMetric(
1309 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM));
1310 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1311 }
1312
1313 // Fill in the third field.
1314 form.fields[2].value = ASCIIToUTF16("12345678901");
1315 forms.front() = form;
1316
1317 // Expect notifications when the form is submitted.
1318 {
1319 EXPECT_CALL(*autofill_manager_->metric_logger(),
1320 LogUserHappinessMetric(
1321 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE));
1322 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1323 }
1324
1325
1326 // Mark one of the fields as autofilled.
1327 form.fields[1].is_autofilled = true;
1328 forms.front() = form;
1329
1330 // Expect notifications when the form is submitted.
1331 {
1332 EXPECT_CALL(*autofill_manager_->metric_logger(),
1333 LogUserHappinessMetric(
1334 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME));
1335 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1336 }
1337
1338 // Mark all of the fillable fields as autofilled.
1339 form.fields[0].is_autofilled = true;
1340 form.fields[2].is_autofilled = true;
1341 forms.front() = form;
1342
1343 // Expect notifications when the form is submitted.
1344 {
1345 EXPECT_CALL(*autofill_manager_->metric_logger(),
1346 LogUserHappinessMetric(
1347 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL));
1348 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1349 }
1350
1351 // Clear out the third field's value.
1352 form.fields[2].value = string16();
1353 forms.front() = form;
1354
1355 // Expect notifications when the form is submitted.
1356 {
1357 EXPECT_CALL(*autofill_manager_->metric_logger(),
1358 LogUserHappinessMetric(
1359 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM));
1360 autofill_manager_->FormSubmitted(form, TimeTicks::Now());
1361 }
1362 }
1363
1364 // Verify that we correctly log user happiness metrics dealing with form
1365 // interaction.
1366 TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) {
1367 // Load a fillable form.
1368 FormData form;
1369 form.name = ASCIIToUTF16("TestForm");
1370 form.method = ASCIIToUTF16("POST");
1371 form.origin = GURL("http://example.com/form.html");
1372 form.action = GURL("http://example.com/submit.html");
1373 form.user_submitted = true;
1374
1375 FormFieldData field;
1376 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
1377 form.fields.push_back(field);
1378 autofill_test::CreateTestFormField("Email", "email", "", "text", &field);
1379 form.fields.push_back(field);
1380 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field);
1381 form.fields.push_back(field);
1382
1383 std::vector<FormData> forms(1, form);
1384
1385 // Expect a notification when the form is first seen.
1386 {
1387 EXPECT_CALL(*autofill_manager_->metric_logger(),
1388 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED));
1389 autofill_manager_->OnFormsSeen(forms, TimeTicks());
1390 }
1391
1392 // Simulate typing.
1393 {
1394 EXPECT_CALL(*autofill_manager_->metric_logger(),
1395 LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE));
1396 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(),
1397 TimeTicks());
1398 }
1399
1400 // Simulate suggestions shown twice for a single edit (i.e. multiple
1401 // keystrokes in a single field).
1402 {
1403 EXPECT_CALL(*autofill_manager_->metric_logger(),
1404 LogUserHappinessMetric(
1405 AutofillMetrics::SUGGESTIONS_SHOWN)).Times(1);
1406 EXPECT_CALL(*autofill_manager_->metric_logger(),
1407 LogUserHappinessMetric(
1408 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(1);
1409 autofill_manager_->OnDidShowAutofillSuggestions(true);
1410 autofill_manager_->OnDidShowAutofillSuggestions(false);
1411 }
1412
1413 // Simulate suggestions shown for a different field.
1414 {
1415 EXPECT_CALL(*autofill_manager_->metric_logger(),
1416 LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN));
1417 EXPECT_CALL(*autofill_manager_->metric_logger(),
1418 LogUserHappinessMetric(
1419 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(0);
1420 autofill_manager_->OnDidShowAutofillSuggestions(true);
1421 }
1422
1423 // Simulate invoking autofill.
1424 {
1425 EXPECT_CALL(*autofill_manager_->metric_logger(),
1426 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL));
1427 EXPECT_CALL(*autofill_manager_->metric_logger(),
1428 LogUserHappinessMetric(
1429 AutofillMetrics::USER_DID_AUTOFILL_ONCE));
1430 autofill_manager_->OnDidFillAutofillFormData(TimeTicks());
1431 }
1432
1433 // Simulate editing an autofilled field.
1434 {
1435 EXPECT_CALL(*autofill_manager_->metric_logger(),
1436 LogUserHappinessMetric(
1437 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD));
1438 EXPECT_CALL(*autofill_manager_->metric_logger(),
1439 LogUserHappinessMetric(
1440 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE));
1441 PersonalDataManager::GUIDPair guid(
1442 "00000000-0000-0000-0000-000000000001", 0);
1443 PersonalDataManager::GUIDPair empty(std::string(), 0);
1444 autofill_manager_->OnFillAutofillFormData(
1445 0, form, form.fields.front(),
1446 autofill_manager_->PackGUIDs(empty, guid));
1447 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(),
1448 TimeTicks());
1449 // Simulate a second keystroke; make sure we don't log the metric twice.
1450 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(),
1451 TimeTicks());
1452 }
1453
1454 // Simulate invoking autofill again.
1455 EXPECT_CALL(*autofill_manager_->metric_logger(),
1456 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL));
1457 EXPECT_CALL(*autofill_manager_->metric_logger(),
1458 LogUserHappinessMetric(
1459 AutofillMetrics::USER_DID_AUTOFILL_ONCE)).Times(0);
1460 autofill_manager_->OnDidFillAutofillFormData(TimeTicks());
1461
1462 // Simulate editing another autofilled field.
1463 {
1464 EXPECT_CALL(*autofill_manager_->metric_logger(),
1465 LogUserHappinessMetric(
1466 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD));
1467 autofill_manager_->OnTextFieldDidChange(form, form.fields[1], TimeTicks());
1468 }
1469 }
1470
1471 // Verify that we correctly log metrics tracking the duration of form fill.
1472 TEST_F(AutofillMetricsTest, FormFillDuration) {
1473 // Load a fillable form.
1474 FormData form;
1475 form.name = ASCIIToUTF16("TestForm");
1476 form.method = ASCIIToUTF16("POST");
1477 form.origin = GURL("http://example.com/form.html");
1478 form.action = GURL("http://example.com/submit.html");
1479 form.user_submitted = true;
1480
1481 FormFieldData field;
1482 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
1483 form.fields.push_back(field);
1484 autofill_test::CreateTestFormField("Email", "email", "", "text", &field);
1485 form.fields.push_back(field);
1486 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field);
1487 form.fields.push_back(field);
1488
1489 std::vector<FormData> forms(1, form);
1490
1491 // Fill the field values for form submission.
1492 form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley");
1493 form.fields[1].value = ASCIIToUTF16("theking@gmail.com");
1494 form.fields[2].value = ASCIIToUTF16("12345678901");
1495
1496 // Expect only form load metrics to be logged if the form is submitted without
1497 // user interaction.
1498 {
1499 EXPECT_CALL(*autofill_manager_->metric_logger(),
1500 LogFormFillDurationFromLoadWithAutofill(_)).Times(0);
1501 EXPECT_CALL(*autofill_manager_->metric_logger(),
1502 LogFormFillDurationFromLoadWithoutAutofill(
1503 TimeDelta::FromInternalValue(16)));
1504 EXPECT_CALL(*autofill_manager_->metric_logger(),
1505 LogFormFillDurationFromInteractionWithAutofill(_)).Times(0);
1506 EXPECT_CALL(*autofill_manager_->metric_logger(),
1507 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0);
1508 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1));
1509 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17));
1510 autofill_manager_->Reset();
1511 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
1512 }
1513
1514 // Expect metric to be logged if the user manually edited a form field.
1515 {
1516 EXPECT_CALL(*autofill_manager_->metric_logger(),
1517 LogFormFillDurationFromLoadWithAutofill(_)).Times(0);
1518 EXPECT_CALL(*autofill_manager_->metric_logger(),
1519 LogFormFillDurationFromLoadWithoutAutofill(
1520 TimeDelta::FromInternalValue(16)));
1521 EXPECT_CALL(*autofill_manager_->metric_logger(),
1522 LogFormFillDurationFromInteractionWithAutofill(_)).Times(0);
1523 EXPECT_CALL(*autofill_manager_->metric_logger(),
1524 LogFormFillDurationFromInteractionWithoutAutofill(
1525 TimeDelta::FromInternalValue(14)));
1526 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1));
1527 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(),
1528 TimeTicks::FromInternalValue(3));
1529 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17));
1530 autofill_manager_->Reset();
1531 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
1532 }
1533
1534 // Expect metric to be logged if the user autofilled the form.
1535 form.fields[0].is_autofilled = true;
1536 {
1537 EXPECT_CALL(*autofill_manager_->metric_logger(),
1538 LogFormFillDurationFromLoadWithAutofill(
1539 TimeDelta::FromInternalValue(16)));
1540 EXPECT_CALL(*autofill_manager_->metric_logger(),
1541 LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0);
1542 EXPECT_CALL(*autofill_manager_->metric_logger(),
1543 LogFormFillDurationFromInteractionWithAutofill(
1544 TimeDelta::FromInternalValue(12)));
1545 EXPECT_CALL(*autofill_manager_->metric_logger(),
1546 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0);
1547 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1));
1548 autofill_manager_->OnDidFillAutofillFormData(
1549 TimeTicks::FromInternalValue(5));
1550 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17));
1551 autofill_manager_->Reset();
1552 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
1553 }
1554
1555 // Expect metric to be logged if the user both manually filled some fields
1556 // and autofilled others. Messages can arrive out of order, so make sure they
1557 // take precedence appropriately.
1558 {
1559 EXPECT_CALL(*autofill_manager_->metric_logger(),
1560 LogFormFillDurationFromLoadWithAutofill(
1561 TimeDelta::FromInternalValue(16)));
1562 EXPECT_CALL(*autofill_manager_->metric_logger(),
1563 LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0);
1564 EXPECT_CALL(*autofill_manager_->metric_logger(),
1565 LogFormFillDurationFromInteractionWithAutofill(
1566 TimeDelta::FromInternalValue(14)));
1567 EXPECT_CALL(*autofill_manager_->metric_logger(),
1568 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0);
1569 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1));
1570 autofill_manager_->OnDidFillAutofillFormData(
1571 TimeTicks::FromInternalValue(5));
1572 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(),
1573 TimeTicks::FromInternalValue(3));
1574 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17));
1575 autofill_manager_->Reset();
1576 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger());
1577 }
1578 }
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_metrics.cc ('k') | chrome/browser/autofill/autofill_popup_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698