Index: components/autofill/browser/autofill_metrics_unittest.cc |
diff --git a/components/autofill/browser/autofill_metrics_unittest.cc b/components/autofill/browser/autofill_metrics_unittest.cc |
deleted file mode 100644 |
index b73bc6a5f72e697abfb6acef89993312ee5428e9..0000000000000000000000000000000000000000 |
--- a/components/autofill/browser/autofill_metrics_unittest.cc |
+++ /dev/null |
@@ -1,1559 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <vector> |
- |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/strings/string16.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/time.h" |
-#include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" |
-#include "chrome/browser/autofill/personal_data_manager_factory.h" |
-#include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h" |
-#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "components/autofill/browser/autofill_common_test.h" |
-#include "components/autofill/browser/autofill_manager.h" |
-#include "components/autofill/browser/autofill_manager_delegate.h" |
-#include "components/autofill/browser/autofill_metrics.h" |
-#include "components/autofill/browser/personal_data_manager.h" |
-#include "components/autofill/browser/test_autofill_driver.h" |
-#include "components/autofill/content/browser/autocheckout_page_meta_data.h" |
-#include "components/autofill/core/common/form_data.h" |
-#include "components/autofill/core/common/form_field_data.h" |
-#include "components/autofill/core/common/forms_seen_state.h" |
-#include "components/webdata/common/web_data_results.h" |
-#include "content/public/test/test_utils.h" |
-#include "googleurl/src/gurl.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/gfx/rect.h" |
- |
-using base::TimeDelta; |
-using base::TimeTicks; |
-using testing::_; |
-using testing::AnyNumber; |
-using testing::Mock; |
- |
-namespace autofill { |
- |
-namespace { |
- |
-class MockAutofillMetrics : public AutofillMetrics { |
- public: |
- MockAutofillMetrics() {} |
- MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric)); |
- MOCK_CONST_METHOD1(LogDeveloperEngagementMetric, |
- void(DeveloperEngagementMetric metric)); |
- MOCK_CONST_METHOD3(LogHeuristicTypePrediction, |
- void(FieldTypeQualityMetric metric, |
- AutofillFieldType field_type, |
- const std::string& experiment_id)); |
- MOCK_CONST_METHOD3(LogOverallTypePrediction, |
- void(FieldTypeQualityMetric metric, |
- AutofillFieldType field_type, |
- const std::string& experiment_id)); |
- MOCK_CONST_METHOD3(LogServerTypePrediction, |
- void(FieldTypeQualityMetric metric, |
- AutofillFieldType field_type, |
- const std::string& experiment_id)); |
- MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, |
- const std::string& experiment_id)); |
- MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); |
- MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric)); |
- MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithAutofill, |
- void(const TimeDelta& duration)); |
- MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithoutAutofill, |
- void(const TimeDelta& duration)); |
- MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithAutofill, |
- void(const TimeDelta& duration)); |
- MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithoutAutofill, |
- void(const TimeDelta& duration)); |
- MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); |
- MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); |
- MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); |
- MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions)); |
- MOCK_CONST_METHOD1(LogServerExperimentIdForQuery, |
- void(const std::string& experiment_id)); |
- MOCK_CONST_METHOD1(LogServerExperimentIdForUpload, |
- void(const std::string& experiment_id)); |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); |
-}; |
- |
-class TestPersonalDataManager : public PersonalDataManager { |
- public: |
- TestPersonalDataManager() |
- : PersonalDataManager("en-US"), |
- autofill_enabled_(true) { |
- set_metric_logger(new testing::NiceMock<MockAutofillMetrics>()); |
- CreateTestAutofillProfiles(&web_profiles_); |
- } |
- |
- void SetBrowserContext(content::BrowserContext* context) { |
- set_browser_context(context); |
- } |
- |
- // Overridden to avoid a trip to the database. This should be a no-op except |
- // for the side-effect of logging the profile count. |
- virtual void LoadProfiles() OVERRIDE { |
- std::vector<AutofillProfile*> profiles; |
- web_profiles_.release(&profiles); |
- WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, |
- profiles); |
- ReceiveLoadedProfiles(0, &result); |
- } |
- |
- // Overridden to avoid a trip to the database. |
- virtual void LoadCreditCards() OVERRIDE {} |
- |
- const MockAutofillMetrics* metric_logger() const { |
- return static_cast<const MockAutofillMetrics*>( |
- PersonalDataManager::metric_logger()); |
- } |
- |
- void set_autofill_enabled(bool autofill_enabled) { |
- autofill_enabled_ = autofill_enabled; |
- } |
- |
- virtual bool IsAutofillEnabled() const OVERRIDE { |
- return autofill_enabled_; |
- } |
- |
- MOCK_METHOD1(SaveImportedCreditCard, |
- void(const CreditCard& imported_credit_card)); |
- |
- private: |
- void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) { |
- AutofillProfile* profile = new AutofillProfile; |
- test::SetProfileInfo(profile, "Elvis", "Aaron", |
- "Presley", "theking@gmail.com", "RCA", |
- "3734 Elvis Presley Blvd.", "Apt. 10", |
- "Memphis", "Tennessee", "38116", "US", |
- "12345678901"); |
- profile->set_guid("00000000-0000-0000-0000-000000000001"); |
- profiles->push_back(profile); |
- profile = new AutofillProfile; |
- test::SetProfileInfo(profile, "Charles", "Hardin", |
- "Holley", "buddy@gmail.com", "Decca", |
- "123 Apple St.", "unit 6", "Lubbock", |
- "Texas", "79401", "US", "2345678901"); |
- profile->set_guid("00000000-0000-0000-0000-000000000002"); |
- profiles->push_back(profile); |
- } |
- |
- bool autofill_enabled_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); |
-}; |
- |
-class TestFormStructure : public FormStructure { |
- public: |
- explicit TestFormStructure(const FormData& form) |
- : FormStructure(form, std::string()) {} |
- virtual ~TestFormStructure() {} |
- |
- void SetFieldTypes(const std::vector<AutofillFieldType>& heuristic_types, |
- const std::vector<AutofillFieldType>& server_types) { |
- ASSERT_EQ(field_count(), heuristic_types.size()); |
- ASSERT_EQ(field_count(), server_types.size()); |
- |
- for (size_t i = 0; i < field_count(); ++i) { |
- AutofillField* form_field = field(i); |
- ASSERT_TRUE(form_field); |
- form_field->set_heuristic_type(heuristic_types[i]); |
- form_field->set_server_type(server_types[i]); |
- } |
- |
- UpdateAutofillCount(); |
- } |
- |
- virtual std::string server_experiment_id() const OVERRIDE { |
- return server_experiment_id_; |
- } |
- void set_server_experiment_id(const std::string& server_experiment_id) { |
- server_experiment_id_ = server_experiment_id; |
- } |
- |
- private: |
- std::string server_experiment_id_; |
- DISALLOW_COPY_AND_ASSIGN(TestFormStructure); |
-}; |
- |
-class TestAutofillManager : public AutofillManager { |
- public: |
- TestAutofillManager(AutofillDriver* driver, |
- AutofillManagerDelegate* manager_delegate, |
- TestPersonalDataManager* personal_manager) |
- : AutofillManager(driver, manager_delegate, personal_manager), |
- autofill_enabled_(true) { |
- set_metric_logger(new testing::NiceMock<MockAutofillMetrics>); |
- } |
- virtual ~TestAutofillManager() {} |
- |
- virtual std::string GetAutocheckoutURLPrefix() const OVERRIDE { |
- return std::string(); |
- } |
- |
- virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; } |
- |
- void set_autofill_enabled(bool autofill_enabled) { |
- autofill_enabled_ = autofill_enabled; |
- } |
- |
- MockAutofillMetrics* metric_logger() { |
- return static_cast<MockAutofillMetrics*>(const_cast<AutofillMetrics*>( |
- AutofillManager::metric_logger())); |
- } |
- |
- void AddSeenForm(const FormData& form, |
- const std::vector<AutofillFieldType>& heuristic_types, |
- const std::vector<AutofillFieldType>& server_types, |
- const std::string& experiment_id) { |
- FormData empty_form = form; |
- for (size_t i = 0; i < empty_form.fields.size(); ++i) { |
- empty_form.fields[i].value = base::string16(); |
- } |
- |
- // |form_structure| will be owned by |form_structures()|. |
- TestFormStructure* form_structure = new TestFormStructure(empty_form); |
- form_structure->SetFieldTypes(heuristic_types, server_types); |
- form_structure->set_server_experiment_id(experiment_id); |
- form_structures()->push_back(form_structure); |
- } |
- |
- void FormSubmitted(const FormData& form, const TimeTicks& timestamp) { |
- message_loop_runner_ = new content::MessageLoopRunner(); |
- if (!OnFormSubmitted(form, timestamp)) |
- return; |
- |
- // Wait for the asynchronous FormSubmitted() call to complete. |
- message_loop_runner_->Run(); |
- } |
- |
- virtual void UploadFormDataAsyncCallback( |
- const FormStructure* submitted_form, |
- const base::TimeTicks& load_time, |
- const base::TimeTicks& interaction_time, |
- const base::TimeTicks& submission_time) OVERRIDE { |
- message_loop_runner_->Quit(); |
- |
- AutofillManager::UploadFormDataAsyncCallback(submitted_form, |
- load_time, |
- interaction_time, |
- submission_time); |
- } |
- |
- private: |
- bool autofill_enabled_; |
- scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); |
-}; |
- |
-} // namespace |
- |
-class AutofillMetricsTest : public ChromeRenderViewHostTestHarness { |
- public: |
- virtual ~AutofillMetricsTest(); |
- |
- virtual void SetUp() OVERRIDE; |
- virtual void TearDown() OVERRIDE; |
- |
- protected: |
- scoped_ptr<ConfirmInfoBarDelegate> CreateDelegate( |
- MockAutofillMetrics* metric_logger); |
- |
- scoped_ptr<TestAutofillDriver> autofill_driver_; |
- scoped_ptr<TestAutofillManager> autofill_manager_; |
- scoped_ptr<TestPersonalDataManager> personal_data_; |
-}; |
- |
-AutofillMetricsTest::~AutofillMetricsTest() { |
- // Order of destruction is important as AutofillManager relies on |
- // PersonalDataManager to be around when it gets destroyed. |
- autofill_manager_.reset(); |
-} |
- |
-void AutofillMetricsTest::SetUp() { |
- TestingProfile* profile = new TestingProfile(); |
- |
- // Ensure Mac OS X does not pop up a modal dialog for the Address Book. |
- autofill::test::DisableSystemServices(profile); |
- |
- profile->CreateRequestContext(); |
- browser_context_.reset(profile); |
- PersonalDataManagerFactory::GetInstance()->SetTestingFactory(profile, NULL); |
- |
- ChromeRenderViewHostTestHarness::SetUp(); |
- TabAutofillManagerDelegate::CreateForWebContents(web_contents()); |
- |
- personal_data_.reset(new TestPersonalDataManager()); |
- personal_data_->SetBrowserContext(profile); |
- autofill_driver_.reset(new TestAutofillDriver(web_contents())); |
- autofill_manager_.reset(new TestAutofillManager( |
- autofill_driver_.get(), |
- TabAutofillManagerDelegate::FromWebContents(web_contents()), |
- personal_data_.get())); |
-} |
- |
-void AutofillMetricsTest::TearDown() { |
- // Order of destruction is important as AutofillManager relies on |
- // PersonalDataManager to be around when it gets destroyed. Also, a real |
- // AutofillManager is tied to the lifetime of the WebContents, so it must |
- // be destroyed at the destruction of the WebContents. |
- autofill_manager_.reset(); |
- autofill_driver_.reset(); |
- personal_data_.reset(); |
- profile()->ResetRequestContext(); |
- ChromeRenderViewHostTestHarness::TearDown(); |
-} |
- |
-scoped_ptr<ConfirmInfoBarDelegate> AutofillMetricsTest::CreateDelegate( |
- MockAutofillMetrics* metric_logger) { |
- EXPECT_CALL(*metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_SHOWN)); |
- |
- CreditCard credit_card; |
- return AutofillCCInfoBarDelegate::CreateForTesting( |
- metric_logger, |
- base::Bind(&TestPersonalDataManager::SaveImportedCreditCard, |
- base::Unretained(personal_data_.get()), credit_card)); |
-} |
- |
-// Test that we log quality metrics appropriately. |
-TEST_F(AutofillMetricsTest, QualityMetrics) { |
- // Set up our form data. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- std::vector<AutofillFieldType> heuristic_types, server_types; |
- FormFieldData field; |
- |
- test::CreateTestFormField( |
- "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field); |
- field.is_autofilled = true; |
- form.fields.push_back(field); |
- heuristic_types.push_back(NAME_FULL); |
- server_types.push_back(NAME_FIRST); |
- |
- test::CreateTestFormField( |
- "Autofill Failed", "autofillfailed", "buddy@gmail.com", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(PHONE_HOME_NUMBER); |
- server_types.push_back(EMAIL_ADDRESS); |
- |
- test::CreateTestFormField("Empty", "empty", "", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(NAME_FULL); |
- server_types.push_back(NAME_FIRST); |
- |
- test::CreateTestFormField("Unknown", "unknown", "garbage", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(PHONE_HOME_NUMBER); |
- server_types.push_back(EMAIL_ADDRESS); |
- |
- test::CreateTestFormField("Select", "select", "USA", "select-one", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(UNKNOWN_TYPE); |
- server_types.push_back(NO_SERVER_DATA); |
- |
- test::CreateTestFormField("Phone", "phone", "2345678901", "tel", &field); |
- field.is_autofilled = true; |
- form.fields.push_back(field); |
- heuristic_types.push_back(PHONE_HOME_CITY_AND_NUMBER); |
- server_types.push_back(PHONE_HOME_WHOLE_NUMBER); |
- |
- // Simulate having seen this form on page load. |
- autofill_manager_->AddSeenForm(form, heuristic_types, server_types, |
- std::string()); |
- |
- // Establish our expectations. |
- ::testing::InSequence dummy; |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerExperimentIdForUpload(std::string())); |
- // Autofilled field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, |
- NAME_FULL, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- NAME_FULL, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- NAME_FULL, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, |
- std::string())); |
- // Non-autofilled field for which we had data |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- EMAIL_ADDRESS, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, |
- EMAIL_ADDRESS, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, |
- EMAIL_ADDRESS, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH, |
- std::string())); |
- // Empty field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- // Unknown field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- // <select> field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_COUNTRY, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_COUNTRY, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_COUNTRY, std::string())); |
- // Phone field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, |
- PHONE_HOME_WHOLE_NUMBER, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, |
- PHONE_HOME_WHOLE_NUMBER, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, |
- PHONE_HOME_WHOLE_NUMBER, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); |
- |
- // Simulate form submission. |
- EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, |
- TimeTicks::Now())); |
-} |
- |
-// Test that we log the appropriate additional metrics when Autofill failed. |
-TEST_F(AutofillMetricsTest, QualityMetricsForFailure) { |
- // Set up our form data. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- struct { |
- const char* label; |
- const char* name; |
- const char* value; |
- AutofillFieldType heuristic_type; |
- AutofillFieldType server_type; |
- AutofillMetrics::QualityMetric heuristic_metric; |
- AutofillMetrics::QualityMetric server_metric; |
- } failure_cases[] = { |
- { |
- "Heuristics unknown, server unknown", "0,0", "Elvis", |
- UNKNOWN_TYPE, NO_SERVER_DATA, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN |
- }, |
- { |
- "Heuristics match, server unknown", "1,0", "Aaron", |
- NAME_MIDDLE, NO_SERVER_DATA, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN |
- }, |
- { |
- "Heuristics mismatch, server unknown", "2,0", "Presley", |
- PHONE_HOME_NUMBER, NO_SERVER_DATA, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN |
- }, |
- { |
- "Heuristics unknown, server match", "0,1", "theking@gmail.com", |
- UNKNOWN_TYPE, EMAIL_ADDRESS, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH |
- }, |
- { |
- "Heuristics match, server match", "1,1", "3734 Elvis Presley Blvd.", |
- ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE1, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH |
- }, |
- { |
- "Heuristics mismatch, server match", "2,1", "Apt. 10", |
- PHONE_HOME_NUMBER, ADDRESS_HOME_LINE2, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH |
- }, |
- { |
- "Heuristics unknown, server mismatch", "0,2", "Memphis", |
- UNKNOWN_TYPE, PHONE_HOME_NUMBER, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH |
- }, |
- { |
- "Heuristics match, server mismatch", "1,2", "Tennessee", |
- ADDRESS_HOME_STATE, PHONE_HOME_NUMBER, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH |
- }, |
- { |
- "Heuristics mismatch, server mismatch", "2,2", "38116", |
- PHONE_HOME_NUMBER, PHONE_HOME_NUMBER, |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH |
- } |
- }; |
- |
- std::vector<AutofillFieldType> heuristic_types, server_types; |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { |
- FormFieldData field; |
- test::CreateTestFormField(failure_cases[i].label, |
- failure_cases[i].name, |
- failure_cases[i].value, "text", &field); |
- form.fields.push_back(field); |
- heuristic_types.push_back(failure_cases[i].heuristic_type); |
- server_types.push_back(failure_cases[i].server_type); |
- |
- } |
- |
- // Simulate having seen this form with the desired heuristic and server types. |
- // |form_structure| will be owned by |autofill_manager_|. |
- autofill_manager_->AddSeenForm(form, heuristic_types, server_types, |
- std::string()); |
- |
- |
- // Establish our expectations. |
- ::testing::InSequence dummy; |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerExperimentIdForUpload(std::string())); |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(failure_cases[i].heuristic_metric, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(failure_cases[i].server_metric, |
- std::string())); |
- } |
- |
- // Simulate form submission. |
- EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, |
- TimeTicks::Now())); |
-} |
- |
-// Test that we behave sanely when the cached form differs from the submitted |
-// one. |
-TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) { |
- // Set up our form data. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- std::vector<AutofillFieldType> heuristic_types, server_types; |
- |
- FormFieldData field; |
- test::CreateTestFormField( |
- "Both match", "match", "Elvis Aaron Presley", "text", &field); |
- field.is_autofilled = true; |
- form.fields.push_back(field); |
- heuristic_types.push_back(NAME_FULL); |
- server_types.push_back(NAME_FULL); |
- test::CreateTestFormField( |
- "Both mismatch", "mismatch", "buddy@gmail.com", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(PHONE_HOME_NUMBER); |
- server_types.push_back(PHONE_HOME_NUMBER); |
- test::CreateTestFormField( |
- "Only heuristics match", "mixed", "Memphis", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(ADDRESS_HOME_CITY); |
- server_types.push_back(PHONE_HOME_NUMBER); |
- test::CreateTestFormField("Unknown", "unknown", "garbage", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(UNKNOWN_TYPE); |
- server_types.push_back(UNKNOWN_TYPE); |
- |
- // Simulate having seen this form with the desired heuristic and server types. |
- // |form_structure| will be owned by |autofill_manager_|. |
- autofill_manager_->AddSeenForm(form, heuristic_types, server_types, |
- std::string()); |
- |
- |
- // Add a field and re-arrange the remaining form fields before submitting. |
- std::vector<FormFieldData> cached_fields = form.fields; |
- form.fields.clear(); |
- test::CreateTestFormField( |
- "New field", "new field", "Tennessee", "text", &field); |
- form.fields.push_back(field); |
- form.fields.push_back(cached_fields[2]); |
- form.fields.push_back(cached_fields[1]); |
- form.fields.push_back(cached_fields[3]); |
- form.fields.push_back(cached_fields[0]); |
- |
- // Establish our expectations. |
- ::testing::InSequence dummy; |
- // New field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerExperimentIdForUpload(std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_STATE, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_STATE, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_STATE, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN, |
- std::string())); |
- // Only heuristics match |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, |
- ADDRESS_HOME_CITY, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- ADDRESS_HOME_CITY, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- ADDRESS_HOME_CITY, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH, |
- std::string())); |
- // Both mismatch |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- EMAIL_ADDRESS, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- EMAIL_ADDRESS, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- EMAIL_ADDRESS, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH, |
- std::string())); |
- // Unknown |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- // Both match |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, |
- NAME_FULL, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, |
- NAME_FULL, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, |
- NAME_FULL, std::string())); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, |
- std::string())); |
- |
- // Simulate form submission. |
- EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, |
- TimeTicks::Now())); |
-} |
- |
-// Verify that we correctly log metrics regarding developer engagement. |
-TEST_F(AutofillMetricsTest, DeveloperEngagement) { |
- // Start with a non-fillable form. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- |
- FormFieldData field; |
- test::CreateTestFormField("Name", "name", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Email", "email", "", "text", &field); |
- form.fields.push_back(field); |
- |
- std::vector<FormData> forms(1, form); |
- |
- // Ensure no metrics are logged when loading a non-fillable form. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogDeveloperEngagementMetric(_)).Times(0); |
- autofill_manager_->OnFormsSeen(forms, TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
- |
- // Add another field to the form, so that it becomes fillable. |
- test::CreateTestFormField("Phone", "phone", "", "text", &field); |
- forms.back().fields.push_back(field); |
- |
- // Expect only the "form parsed" metric to be logged; no metrics about |
- // author-specified field type hints. |
- { |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogDeveloperEngagementMetric( |
- AutofillMetrics::FILLABLE_FORM_PARSED)).Times(1); |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogDeveloperEngagementMetric( |
- AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS)).Times(0); |
- autofill_manager_->OnFormsSeen(forms, TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
- |
- // Add some fields with an author-specified field type to the form. |
- // We need to add at least three fields, because a form must have at least |
- // three fillable fields to be considered to be autofillable; and if at least |
- // one field specifies an explicit type hint, we don't apply any of our usual |
- // local heuristics to detect field types in the rest of the form. |
- test::CreateTestFormField("", "", "", "text", &field); |
- field.autocomplete_attribute = "given-name"; |
- forms.back().fields.push_back(field); |
- test::CreateTestFormField("", "", "", "text", &field); |
- field.autocomplete_attribute = "email"; |
- forms.back().fields.push_back(field); |
- test::CreateTestFormField("", "", "", "text", &field); |
- field.autocomplete_attribute = "street-address"; |
- forms.back().fields.push_back(field); |
- |
- // Expect both the "form parsed" metric and the author-specified field type |
- // hints metric to be logged. |
- { |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogDeveloperEngagementMetric( |
- AutofillMetrics::FILLABLE_FORM_PARSED)).Times(1); |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogDeveloperEngagementMetric( |
- AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS)).Times(1); |
- autofill_manager_->OnFormsSeen(forms, TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
-} |
- |
-// Test that we don't log quality metrics for non-autofillable forms. |
-TEST_F(AutofillMetricsTest, NoQualityMetricsForNonAutofillableForms) { |
- // Forms must include at least three fields to be auto-fillable. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- FormFieldData field; |
- test::CreateTestFormField( |
- "Autofilled", "autofilled", "Elvis Presley", "text", &field); |
- field.is_autofilled = true; |
- form.fields.push_back(field); |
- test::CreateTestFormField( |
- "Autofill Failed", "autofillfailed", "buddy@gmail.com", "text", &field); |
- form.fields.push_back(field); |
- |
- // Simulate form submission. |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())).Times(0); |
- EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, |
- TimeTicks::Now())); |
- |
- // Search forms are not auto-fillable. |
- form.action = GURL("http://example.com/search?q=Elvis%20Presley"); |
- test::CreateTestFormField("Empty", "empty", "", "text", &field); |
- form.fields.push_back(field); |
- |
- // Simulate form submission. |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- std::string())).Times(0); |
- EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, |
- TimeTicks::Now())); |
-} |
- |
-// Test that we recored the experiment id appropriately. |
-TEST_F(AutofillMetricsTest, QualityMetricsWithExperimentId) { |
- // Set up our form data. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- std::vector<AutofillFieldType> heuristic_types, server_types; |
- FormFieldData field; |
- |
- test::CreateTestFormField( |
- "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field); |
- field.is_autofilled = true; |
- form.fields.push_back(field); |
- heuristic_types.push_back(NAME_FULL); |
- server_types.push_back(NAME_FIRST); |
- |
- test::CreateTestFormField( |
- "Autofill Failed", "autofillfailed", "buddy@gmail.com", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(PHONE_HOME_NUMBER); |
- server_types.push_back(EMAIL_ADDRESS); |
- |
- test::CreateTestFormField("Empty", "empty", "", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(NAME_FULL); |
- server_types.push_back(NAME_FIRST); |
- |
- test::CreateTestFormField("Unknown", "unknown", "garbage", "text", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(PHONE_HOME_NUMBER); |
- server_types.push_back(EMAIL_ADDRESS); |
- |
- test::CreateTestFormField("Select", "select", "USA", "select-one", &field); |
- field.is_autofilled = false; |
- form.fields.push_back(field); |
- heuristic_types.push_back(UNKNOWN_TYPE); |
- server_types.push_back(NO_SERVER_DATA); |
- |
- const std::string experiment_id = "ThatOughtaDoIt"; |
- |
- // Simulate having seen this form on page load. |
- // |form_structure| will be owned by |autofill_manager_|. |
- autofill_manager_->AddSeenForm(form, heuristic_types, server_types, |
- experiment_id); |
- |
- // Establish our expectations. |
- ::testing::InSequence dummy; |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerExperimentIdForUpload(experiment_id)); |
- // Autofilled field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, |
- NAME_FULL, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- NAME_FULL, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- NAME_FULL, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, |
- experiment_id)); |
- // Non-autofilled field for which we had data |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH, |
- EMAIL_ADDRESS, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, |
- EMAIL_ADDRESS, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, |
- EMAIL_ADDRESS, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_NOT_AUTOFILLED, |
- experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
- experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric( |
- AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH, |
- experiment_id)); |
- // Empty field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- experiment_id)); |
- // Unknown field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- experiment_id)); |
- // <select> field |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogQualityMetric(AutofillMetrics::FIELD_SUBMITTED, |
- experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_COUNTRY, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_COUNTRY, experiment_id)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN, |
- ADDRESS_HOME_COUNTRY, experiment_id)); |
- |
- // Simulate form submission. |
- EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, |
- TimeTicks::Now())); |
-} |
- |
-// Test that the profile count is logged correctly. |
-TEST_F(AutofillMetricsTest, StoredProfileCount) { |
- // The metric should be logged when the profiles are first loaded. |
- EXPECT_CALL(*personal_data_->metric_logger(), |
- LogStoredProfileCount(2)).Times(1); |
- personal_data_->LoadProfiles(); |
- |
- // The metric should only be logged once. |
- EXPECT_CALL(*personal_data_->metric_logger(), |
- LogStoredProfileCount(::testing::_)).Times(0); |
- personal_data_->LoadProfiles(); |
-} |
- |
-// Test that we correctly log when Autofill is enabled. |
-TEST_F(AutofillMetricsTest, AutofillIsEnabledAtStartup) { |
- personal_data_->set_autofill_enabled(true); |
- EXPECT_CALL(*personal_data_->metric_logger(), |
- LogIsAutofillEnabledAtStartup(true)).Times(1); |
- personal_data_->Init(profile()); |
-} |
- |
-// Test that we correctly log when Autofill is disabled. |
-TEST_F(AutofillMetricsTest, AutofillIsDisabledAtStartup) { |
- personal_data_->set_autofill_enabled(false); |
- EXPECT_CALL(*personal_data_->metric_logger(), |
- LogIsAutofillEnabledAtStartup(false)).Times(1); |
- personal_data_->Init(profile()); |
-} |
- |
-// Test that we log the number of Autofill suggestions when filling a form. |
-TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { |
- // Set up our form data. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- FormFieldData field; |
- std::vector<AutofillFieldType> field_types; |
- test::CreateTestFormField("Name", "name", "", "text", &field); |
- form.fields.push_back(field); |
- field_types.push_back(NAME_FULL); |
- test::CreateTestFormField("Email", "email", "", "email", &field); |
- form.fields.push_back(field); |
- field_types.push_back(EMAIL_ADDRESS); |
- test::CreateTestFormField("Phone", "phone", "", "tel", &field); |
- form.fields.push_back(field); |
- field_types.push_back(PHONE_HOME_NUMBER); |
- |
- // Simulate having seen this form on page load. |
- // |form_structure| will be owned by |autofill_manager_|. |
- autofill_manager_->AddSeenForm(form, field_types, field_types, |
- std::string()); |
- |
- // Establish our expectations. |
- ::testing::InSequence dummy; |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogAddressSuggestionsCount(2)).Times(1); |
- |
- // Simulate activating the autofill popup for the phone field. |
- autofill_manager_->OnQueryFormFieldAutofill( |
- 0, form, field, gfx::Rect(), false); |
- |
- // Simulate activating the autofill popup for the email field after typing. |
- // No new metric should be logged, since we're still on the same page. |
- test::CreateTestFormField("Email", "email", "b", "email", &field); |
- autofill_manager_->OnQueryFormFieldAutofill( |
- 0, form, field, gfx::Rect(), false); |
- |
- // Reset the autofill manager state. |
- autofill_manager_->Reset(); |
- autofill_manager_->AddSeenForm(form, field_types, field_types, |
- std::string()); |
- |
- // Establish our expectations. |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogAddressSuggestionsCount(1)).Times(1); |
- |
- // Simulate activating the autofill popup for the email field after typing. |
- autofill_manager_->OnQueryFormFieldAutofill( |
- 0, form, field, gfx::Rect(), false); |
- |
- // Reset the autofill manager state again. |
- autofill_manager_->Reset(); |
- autofill_manager_->AddSeenForm(form, field_types, field_types, |
- std::string()); |
- |
- // Establish our expectations. |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogAddressSuggestionsCount(::testing::_)).Times(0); |
- |
- // Simulate activating the autofill popup for the email field after typing. |
- form.fields[0].is_autofilled = true; |
- autofill_manager_->OnQueryFormFieldAutofill( |
- 0, form, field, gfx::Rect(), false); |
-} |
- |
-// Test that we log whether Autofill is enabled when filling a form. |
-TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) { |
- // Establish our expectations. |
- ::testing::InSequence dummy; |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogIsAutofillEnabledAtPageLoad(true)).Times(1); |
- |
- autofill_manager_->set_autofill_enabled(true); |
- autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- |
- // Reset the autofill manager state. |
- autofill_manager_->Reset(); |
- |
- // Establish our expectations. |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogIsAutofillEnabledAtPageLoad(false)).Times(1); |
- |
- autofill_manager_->set_autofill_enabled(false); |
- autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
-} |
- |
-// Test that credit card infobar metrics are logged correctly. |
-TEST_F(AutofillMetricsTest, CreditCardInfoBar) { |
- testing::NiceMock<MockAutofillMetrics> metric_logger; |
- ::testing::InSequence dummy; |
- |
- // Accept the infobar. |
- { |
- scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); |
- ASSERT_TRUE(infobar); |
- EXPECT_CALL(*personal_data_, SaveImportedCreditCard(_)); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_ACCEPTED)).Times(1); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(0); |
- EXPECT_TRUE(infobar->Accept()); |
- } |
- |
- // Cancel the infobar. |
- { |
- scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); |
- ASSERT_TRUE(infobar); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)).Times(1); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(0); |
- EXPECT_TRUE(infobar->Cancel()); |
- } |
- |
- // Dismiss the infobar. |
- { |
- scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); |
- ASSERT_TRUE(infobar); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_DENIED)).Times(1); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(0); |
- infobar->InfoBarDismissed(); |
- } |
- |
- // Ignore the infobar. |
- { |
- scoped_ptr<ConfirmInfoBarDelegate> infobar(CreateDelegate(&metric_logger)); |
- ASSERT_TRUE(infobar); |
- EXPECT_CALL(metric_logger, |
- LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_IGNORED)).Times(1); |
- } |
-} |
- |
-// Test that server query response experiment id metrics are logged correctly. |
-TEST_F(AutofillMetricsTest, ServerQueryExperimentIdForQuery) { |
- testing::NiceMock<MockAutofillMetrics> metric_logger; |
- ::testing::InSequence dummy; |
- |
- // No experiment specified. |
- EXPECT_CALL(metric_logger, |
- LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_RECEIVED)); |
- EXPECT_CALL(metric_logger, |
- LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED)); |
- EXPECT_CALL(metric_logger, |
- LogServerExperimentIdForQuery(std::string())); |
- EXPECT_CALL(metric_logger, |
- LogServerQueryMetric( |
- AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS)); |
- AutocheckoutPageMetaData page_meta_data; |
- FormStructure::ParseQueryResponse( |
- "<autofillqueryresponse></autofillqueryresponse>", |
- std::vector<FormStructure*>(), |
- &page_meta_data, |
- metric_logger); |
- |
- // Experiment "ar1" specified. |
- EXPECT_CALL(metric_logger, |
- LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_RECEIVED)); |
- EXPECT_CALL(metric_logger, |
- LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED)); |
- EXPECT_CALL(metric_logger, |
- LogServerExperimentIdForQuery("ar1")); |
- EXPECT_CALL(metric_logger, |
- LogServerQueryMetric( |
- AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS)); |
- FormStructure::ParseQueryResponse( |
- "<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>", |
- std::vector<FormStructure*>(), |
- &page_meta_data, |
- metric_logger); |
-} |
- |
-// Verify that we correctly log user happiness metrics dealing with form loading |
-// and form submission. |
-TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) { |
- // Start with a form with insufficiently many fields. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- FormFieldData field; |
- test::CreateTestFormField("Name", "name", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Email", "email", "", "text", &field); |
- form.fields.push_back(field); |
- |
- std::vector<FormData> forms(1, form); |
- |
- // Expect no notifications when the form is first seen. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)).Times(0); |
- autofill_manager_->OnFormsSeen(forms, TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- } |
- |
- |
- // Expect no notifications when the form is submitted. |
- { |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)).Times(0); |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)).Times(0); |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)).Times(0); |
- EXPECT_CALL( |
- *autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)).Times(0); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
- |
- // Add more fields to the form. |
- test::CreateTestFormField("Phone", "phone", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Unknown", "unknown", "", "text", &field); |
- form.fields.push_back(field); |
- forms.front() = form; |
- |
- // Expect a notification when the form is first seen. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); |
- autofill_manager_->OnFormsSeen(forms, TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- } |
- |
- // Expect a notification when the form is submitted. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
- |
- // Fill in two of the fields. |
- form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); |
- form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); |
- forms.front() = form; |
- |
- // Expect a notification when the form is submitted. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
- |
- // Fill in the third field. |
- form.fields[2].value = ASCIIToUTF16("12345678901"); |
- forms.front() = form; |
- |
- // Expect notifications when the form is submitted. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
- |
- |
- // Mark one of the fields as autofilled. |
- form.fields[1].is_autofilled = true; |
- forms.front() = form; |
- |
- // Expect notifications when the form is submitted. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
- |
- // Mark all of the fillable fields as autofilled. |
- form.fields[0].is_autofilled = true; |
- form.fields[2].is_autofilled = true; |
- forms.front() = form; |
- |
- // Expect notifications when the form is submitted. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
- |
- // Clear out the third field's value. |
- form.fields[2].value = base::string16(); |
- forms.front() = form; |
- |
- // Expect notifications when the form is submitted. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
- } |
-} |
- |
-// Verify that we correctly log user happiness metrics dealing with form |
-// interaction. |
-TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { |
- // Load a fillable form. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- FormFieldData field; |
- test::CreateTestFormField("Name", "name", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Email", "email", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Phone", "phone", "", "text", &field); |
- form.fields.push_back(field); |
- |
- std::vector<FormData> forms(1, form); |
- |
- // Expect a notification when the form is first seen. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); |
- autofill_manager_->OnFormsSeen(forms, TimeTicks(), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- } |
- |
- // Simulate typing. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE)); |
- autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
- TimeTicks()); |
- } |
- |
- // Simulate suggestions shown twice for a single edit (i.e. multiple |
- // keystrokes in a single field). |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUGGESTIONS_SHOWN)).Times(1); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(1); |
- autofill_manager_->OnDidShowAutofillSuggestions(true); |
- autofill_manager_->OnDidShowAutofillSuggestions(false); |
- } |
- |
- // Simulate suggestions shown for a different field. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(0); |
- autofill_manager_->OnDidShowAutofillSuggestions(true); |
- } |
- |
- // Simulate invoking autofill. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::USER_DID_AUTOFILL_ONCE)); |
- autofill_manager_->OnDidFillAutofillFormData(TimeTicks()); |
- } |
- |
- // Simulate editing an autofilled field. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE)); |
- PersonalDataManager::GUIDPair guid( |
- "00000000-0000-0000-0000-000000000001", 0); |
- PersonalDataManager::GUIDPair empty(std::string(), 0); |
- autofill_manager_->OnFillAutofillFormData( |
- 0, form, form.fields.front(), |
- autofill_manager_->PackGUIDs(empty, guid)); |
- autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
- TimeTicks()); |
- // Simulate a second keystroke; make sure we don't log the metric twice. |
- autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
- TimeTicks()); |
- } |
- |
- // Simulate invoking autofill again. |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::USER_DID_AUTOFILL_ONCE)).Times(0); |
- autofill_manager_->OnDidFillAutofillFormData(TimeTicks()); |
- |
- // Simulate editing another autofilled field. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogUserHappinessMetric( |
- AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); |
- autofill_manager_->OnTextFieldDidChange(form, form.fields[1], TimeTicks()); |
- } |
-} |
- |
-// Verify that we correctly log metrics tracking the duration of form fill. |
-TEST_F(AutofillMetricsTest, FormFillDuration) { |
- // Load a fillable form. |
- FormData form; |
- form.name = ASCIIToUTF16("TestForm"); |
- form.method = ASCIIToUTF16("POST"); |
- form.origin = GURL("http://example.com/form.html"); |
- form.action = GURL("http://example.com/submit.html"); |
- form.user_submitted = true; |
- |
- FormFieldData field; |
- test::CreateTestFormField("Name", "name", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Email", "email", "", "text", &field); |
- form.fields.push_back(field); |
- test::CreateTestFormField("Phone", "phone", "", "text", &field); |
- form.fields.push_back(field); |
- |
- std::vector<FormData> forms(1, form); |
- |
- // Fill the field values for form submission. |
- form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); |
- form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); |
- form.fields[2].value = ASCIIToUTF16("12345678901"); |
- |
- // Expect only form load metrics to be logged if the form is submitted without |
- // user interaction. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithAutofill(_)).Times(0); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithoutAutofill( |
- TimeDelta::FromInternalValue(16))); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithAutofill(_)).Times(0); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); |
- autofill_manager_->OnFormsSeen( |
- forms, TimeTicks::FromInternalValue(1), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
- |
- // Expect metric to be logged if the user manually edited a form field. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithAutofill(_)).Times(0); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithoutAutofill( |
- TimeDelta::FromInternalValue(16))); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithAutofill(_)).Times(0); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithoutAutofill( |
- TimeDelta::FromInternalValue(14))); |
- autofill_manager_->OnFormsSeen( |
- forms, TimeTicks::FromInternalValue(1), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
- TimeTicks::FromInternalValue(3)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
- |
- // Expect metric to be logged if the user autofilled the form. |
- form.fields[0].is_autofilled = true; |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithAutofill( |
- TimeDelta::FromInternalValue(16))); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithAutofill( |
- TimeDelta::FromInternalValue(12))); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); |
- autofill_manager_->OnFormsSeen( |
- forms, TimeTicks::FromInternalValue(1), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->OnDidFillAutofillFormData( |
- TimeTicks::FromInternalValue(5)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
- |
- // Expect metric to be logged if the user both manually filled some fields |
- // and autofilled others. Messages can arrive out of order, so make sure they |
- // take precedence appropriately. |
- { |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithAutofill( |
- TimeDelta::FromInternalValue(16))); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithAutofill( |
- TimeDelta::FromInternalValue(14))); |
- EXPECT_CALL(*autofill_manager_->metric_logger(), |
- LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); |
- autofill_manager_->OnFormsSeen( |
- forms, TimeTicks::FromInternalValue(1), |
- autofill::NO_SPECIAL_FORMS_SEEN); |
- autofill_manager_->OnDidFillAutofillFormData( |
- TimeTicks::FromInternalValue(5)); |
- autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
- TimeTicks::FromInternalValue(3)); |
- autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
- autofill_manager_->Reset(); |
- Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
- } |
-} |
- |
-} // namespace autofill |