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