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