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