1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <vector> 6 7 #include "base/memory/ref_counted.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "base/string16.h" 10 #include "base/utf_string_conversions.h" 11 #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" 12 #include "chrome/browser/autofill/autofill_common_test.h" 13 #include "chrome/browser/autofill/autofill_manager.h" 14 #include "chrome/browser/autofill/autofill_metrics.h" 15 #include "chrome/browser/autofill/personal_data_manager.h" 16 #include "chrome/browser/webdata/web_data_service.h" 17 #include "content/browser/tab_contents/test_tab_contents.h" 18 #include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h" 19 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gtest/include/gtest/gtest.h" 21 #include "webkit/glue/form_data.h" 22 #include "webkit/glue/form_field.h" 23 24 using webkit_glue::FormData; 25 using webkit_glue::FormField; 26 27 namespace { 28 29 class MockAutofillMetrics : public AutofillMetrics { 30 public: 31 MockAutofillMetrics() {} 32 MOCK_CONST_METHOD1(Log, void(CreditCardInfoBarMetric metric)); 33 MOCK_CONST_METHOD3(Log, void(HeuristicTypeQualityMetric metric, 34 AutofillFieldType field_type, 35 const std::string& experiment_id)); 36 MOCK_CONST_METHOD3(Log, void(PredictedTypeQualityMetric metric, 37 AutofillFieldType field_type, 38 const std::string& experiment_id)); 39 MOCK_CONST_METHOD2(Log, void(QualityMetric metric, 40 const std::string& experiment_id)); 41 MOCK_CONST_METHOD1(Log, void(ServerQueryMetric metric)); 42 MOCK_CONST_METHOD3(Log, void(ServerTypeQualityMetric metric, 43 AutofillFieldType field_type, 44 const std::string& experiment_id)); 45 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); 46 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); 47 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); 48 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions)); 49 50 private: 51 DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); 52 }; 53 54 class TestPersonalDataManager : public PersonalDataManager { 55 public: 56 TestPersonalDataManager() : autofill_enabled_(true) { 57 set_metric_logger(new MockAutofillMetrics); 58 CreateTestAutofillProfiles(&web_profiles_); 59 } 60 61 // Overridden to avoid a trip to the database. This should be a no-op except 62 // for the side-effect of logging the profile count. 63 virtual void LoadProfiles() OVERRIDE { 64 std::vector<AutofillProfile*> profiles; 65 web_profiles_.release(&profiles); 66 WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, 67 profiles); 68 ReceiveLoadedProfiles(0, &result); 69 } 70 71 // Overridden to avoid a trip to the database. 72 virtual void LoadCreditCards() OVERRIDE {} 73 74 // Adds |profile| to |web_profiles_| and takes ownership of the profile's 75 // memory. 76 virtual void AddProfile(AutofillProfile* profile) { 77 web_profiles_.push_back(profile); 78 } 79 80 const MockAutofillMetrics* metric_logger() const { 81 return static_cast<const MockAutofillMetrics*>( 82 PersonalDataManager::metric_logger()); 83 } 84 85 void set_autofill_enabled(bool autofill_enabled) { 86 autofill_enabled_ = autofill_enabled; 87 } 88 89 virtual bool IsAutofillEnabled() const OVERRIDE { 90 return autofill_enabled_; 91 } 92 93 MOCK_METHOD1(SaveImportedCreditCard, 94 void(const CreditCard& imported_credit_card)); 95 96 private: 97 void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) { 98 AutofillProfile* profile = new AutofillProfile; 99 autofill_test::SetProfileInfo(profile, "Elvis", "Aaron", 100 "Presley", "theking (at) gmail.com", "RCA", 101 "3734 Elvis Presley Blvd.", "Apt. 10", 102 "Memphis", "Tennessee", "38116", "USA", 103 "12345678901", ""); 104 profile->set_guid("00000000-0000-0000-0000-000000000001"); 105 profiles->push_back(profile); 106 profile = new AutofillProfile; 107 autofill_test::SetProfileInfo(profile, "Charles", "Hardin", 108 "Holley", "buddy (at) gmail.com", "Decca", 109 "123 Apple St.", "unit 6", "Lubbock", 110 "Texas", "79401", "USA", "2345678901", 111 ""); 112 profile->set_guid("00000000-0000-0000-0000-000000000002"); 113 profiles->push_back(profile); 114 } 115 116 bool autofill_enabled_; 117 118 DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); 119 }; 120 121 class TestAutofillManager : public AutofillManager { 122 public: 123 TestAutofillManager(TabContents* tab_contents, 124 TestPersonalDataManager* personal_manager) 125 : AutofillManager(tab_contents, personal_manager), 126 autofill_enabled_(true) { 127 set_metric_logger(new MockAutofillMetrics); 128 } 129 virtual ~TestAutofillManager() {} 130 131 virtual bool IsAutofillEnabled() const { return autofill_enabled_; } 132 133 void set_autofill_enabled(bool autofill_enabled) { 134 autofill_enabled_ = autofill_enabled; 135 } 136 137 const MockAutofillMetrics* metric_logger() const { 138 return static_cast<const MockAutofillMetrics*>( 139 AutofillManager::metric_logger()); 140 } 141 142 void AddSeenForm(FormStructure* form) { 143 form_structures()->push_back(form); 144 } 145 146 private: 147 bool autofill_enabled_; 148 149 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); 150 }; 151 152 class TestFormStructure : public FormStructure { 153 public: 154 explicit TestFormStructure(const FormData& form) : FormStructure(form) {} 155 virtual ~TestFormStructure() {} 156 157 void SetFieldTypes(const std::vector<AutofillFieldType>& heuristic_types, 158 const std::vector<AutofillFieldType>& server_types) { 159 ASSERT_EQ(field_count(), heuristic_types.size()); 160 ASSERT_EQ(field_count(), server_types.size()); 161 162 for (size_t i = 0; i < field_count(); ++i) { 163 AutofillField* field = (*fields())[i]; 164 ASSERT_TRUE(field); 165 field->set_heuristic_type(heuristic_types[i]); 166 field->set_server_type(server_types[i]); 167 } 168 169 UpdateAutofillCount(); 170 } 171 172 virtual std::string server_experiment_id() const OVERRIDE { 173 return server_experiment_id_; 174 } 175 void set_server_experiment_id(const std::string& server_experiment_id) { 176 server_experiment_id_ = server_experiment_id; 177 } 178 179 private: 180 std::string server_experiment_id_; 181 DISALLOW_COPY_AND_ASSIGN(TestFormStructure); 182 }; 183 184 } // namespace 185 186 class AutofillMetricsTest : public TabContentsWrapperTestHarness { 187 public: 188 AutofillMetricsTest() {} 189 virtual ~AutofillMetricsTest() { 190 // Order of destruction is important as AutofillManager relies on 191 // PersonalDataManager to be around when it gets destroyed. 192 autofill_manager_.reset(NULL); 193 test_personal_data_ = NULL; 194 } 195 196 virtual void SetUp() { 197 TabContentsWrapperTestHarness::SetUp(); 198 test_personal_data_ = new TestPersonalDataManager(); 199 autofill_manager_.reset(new TestAutofillManager(contents(), 200 test_personal_data_.get())); 201 } 202 203 protected: 204 scoped_ptr<TestAutofillManager> autofill_manager_; 205 scoped_refptr<TestPersonalDataManager> test_personal_data_; 206 207 private: 208 DISALLOW_COPY_AND_ASSIGN(AutofillMetricsTest); 209 }; 210 211 // Test that we log quality metrics appropriately. 212 TEST_F(AutofillMetricsTest, QualityMetrics) { 213 // Set up our form data. 214 FormData form; 215 form.name = ASCIIToUTF16("TestForm"); 216 form.method = ASCIIToUTF16("POST"); 217 form.origin = GURL("http://example.com/form.html"); 218 form.action = GURL("http://example.com/submit.html"); 219 form.user_submitted = true; 220 221 std::vector<AutofillFieldType> heuristic_types, server_types; 222 FormField field; 223 224 autofill_test::CreateTestFormField( 225 "Autofilled", "autofilled", "Elvis Presley", "text", &field); 226 field.is_autofilled = true; 227 form.fields.push_back(field); 228 heuristic_types.push_back(NAME_FULL); 229 server_types.push_back(NAME_FIRST); 230 231 autofill_test::CreateTestFormField( 232 "Autofill Failed", "autofillfailed", "buddy (at) gmail.com", "text", &field); 233 form.fields.push_back(field); 234 heuristic_types.push_back(PHONE_HOME_NUMBER); 235 server_types.push_back(EMAIL_ADDRESS); 236 237 autofill_test::CreateTestFormField( 238 "Empty", "empty", "", "text", &field); 239 form.fields.push_back(field); 240 heuristic_types.push_back(NAME_FULL); 241 server_types.push_back(NAME_FIRST); 242 243 autofill_test::CreateTestFormField( 244 "Unknown", "unknown", "garbage", "text", &field); 245 form.fields.push_back(field); 246 heuristic_types.push_back(PHONE_HOME_NUMBER); 247 server_types.push_back(EMAIL_ADDRESS); 248 249 autofill_test::CreateTestFormField( 250 "Select", "select", "USA", "select-one", &field); 251 form.fields.push_back(field); 252 heuristic_types.push_back(UNKNOWN_TYPE); 253 server_types.push_back(NO_SERVER_DATA); 254 255 autofill_test::CreateTestFormField( 256 "Phone", "phone", "2345678901", "tel", &field); 257 field.is_autofilled = true; 258 form.fields.push_back(field); 259 heuristic_types.push_back(PHONE_HOME_CITY_AND_NUMBER); 260 server_types.push_back(PHONE_HOME_WHOLE_NUMBER); 261 262 // Simulate having seen this form on page load. 263 // |form_structure| will be owned by |autofill_manager_|. 264 TestFormStructure* form_structure = new TestFormStructure(form); 265 form_structure->SetFieldTypes(heuristic_types, server_types); 266 autofill_manager_->AddSeenForm(form_structure); 267 268 // Establish our expectations. 269 ::testing::InSequence dummy; 270 // Autofilled field 271 EXPECT_CALL(*autofill_manager_->metric_logger(), 272 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 273 EXPECT_CALL(*autofill_manager_->metric_logger(), 274 Log(AutofillMetrics::HEURISTIC_TYPE_MATCH, 275 UNKNOWN_TYPE, std::string())); 276 EXPECT_CALL(*autofill_manager_->metric_logger(), 277 Log(AutofillMetrics::SERVER_TYPE_MISMATCH, 278 UNKNOWN_TYPE, std::string())); 279 EXPECT_CALL(*autofill_manager_->metric_logger(), 280 Log(AutofillMetrics::PREDICTED_TYPE_MISMATCH, 281 UNKNOWN_TYPE, std::string())); 282 EXPECT_CALL(*autofill_manager_->metric_logger(), 283 Log(AutofillMetrics::FIELD_AUTOFILLED, std::string())); 284 // Non-autofilled field for which we had data 285 EXPECT_CALL(*autofill_manager_->metric_logger(), 286 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 287 EXPECT_CALL(*autofill_manager_->metric_logger(), 288 Log(AutofillMetrics::HEURISTIC_TYPE_MISMATCH, 289 EMAIL_ADDRESS, std::string())); 290 EXPECT_CALL(*autofill_manager_->metric_logger(), 291 Log(AutofillMetrics::SERVER_TYPE_MATCH, 292 EMAIL_ADDRESS, std::string())); 293 EXPECT_CALL(*autofill_manager_->metric_logger(), 294 Log(AutofillMetrics::PREDICTED_TYPE_MATCH, 295 EMAIL_ADDRESS, std::string())); 296 EXPECT_CALL(*autofill_manager_->metric_logger(), 297 Log(AutofillMetrics::FIELD_NOT_AUTOFILLED, std::string())); 298 EXPECT_CALL(*autofill_manager_->metric_logger(), 299 Log(AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, 300 std::string())); 301 EXPECT_CALL(*autofill_manager_->metric_logger(), 302 Log(AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH, 303 std::string())); 304 // Empty field 305 EXPECT_CALL(*autofill_manager_->metric_logger(), 306 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 307 // Unknown field 308 EXPECT_CALL(*autofill_manager_->metric_logger(), 309 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 310 // <select> field 311 EXPECT_CALL(*autofill_manager_->metric_logger(), 312 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 313 EXPECT_CALL(*autofill_manager_->metric_logger(), 314 Log(AutofillMetrics::HEURISTIC_TYPE_UNKNOWN, 315 ADDRESS_HOME_COUNTRY, std::string())); 316 EXPECT_CALL(*autofill_manager_->metric_logger(), 317 Log(AutofillMetrics::SERVER_TYPE_UNKNOWN, 318 ADDRESS_HOME_COUNTRY, std::string())); 319 EXPECT_CALL(*autofill_manager_->metric_logger(), 320 Log(AutofillMetrics::PREDICTED_TYPE_UNKNOWN, 321 ADDRESS_HOME_COUNTRY, std::string())); 322 // Phone field 323 EXPECT_CALL(*autofill_manager_->metric_logger(), 324 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 325 EXPECT_CALL(*autofill_manager_->metric_logger(), 326 Log(AutofillMetrics::HEURISTIC_TYPE_MATCH, 327 PHONE_HOME_WHOLE_NUMBER, std::string())); 328 EXPECT_CALL(*autofill_manager_->metric_logger(), 329 Log(AutofillMetrics::SERVER_TYPE_MATCH, 330 PHONE_HOME_WHOLE_NUMBER, std::string())); 331 EXPECT_CALL(*autofill_manager_->metric_logger(), 332 Log(AutofillMetrics::PREDICTED_TYPE_MATCH, 333 PHONE_HOME_WHOLE_NUMBER, std::string())); 334 EXPECT_CALL(*autofill_manager_->metric_logger(), 335 Log(AutofillMetrics::FIELD_AUTOFILLED, std::string())); 336 337 // Simulate form submission. 338 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 339 } 340 341 // Test that we log the appropriate additional metrics when Autofill failed. 342 TEST_F(AutofillMetricsTest, QualityMetricsForFailure) { 343 // Set up our form data. 344 FormData form; 345 form.name = ASCIIToUTF16("TestForm"); 346 form.method = ASCIIToUTF16("POST"); 347 form.origin = GURL("http://example.com/form.html"); 348 form.action = GURL("http://example.com/submit.html"); 349 form.user_submitted = true; 350 351 struct { 352 const char* label; 353 const char* name; 354 const char* value; 355 AutofillFieldType heuristic_type; 356 AutofillFieldType server_type; 357 AutofillMetrics::QualityMetric heuristic_metric; 358 AutofillMetrics::QualityMetric server_metric; 359 } failure_cases[] = { 360 { 361 "Heuristics unknown, server unknown", "0,0", "Elvis", 362 UNKNOWN_TYPE, NO_SERVER_DATA, 363 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, 364 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN 365 }, 366 { 367 "Heuristics match, server unknown", "1,0", "Aaron", 368 NAME_MIDDLE, NO_SERVER_DATA, 369 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, 370 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN 371 }, 372 { 373 "Heuristics mismatch, server unknown", "2,0", "Presley", 374 PHONE_HOME_NUMBER, NO_SERVER_DATA, 375 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, 376 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN 377 }, 378 { 379 "Heuristics unknown, server match", "0,1", "theking (at) gmail.com", 380 UNKNOWN_TYPE, EMAIL_ADDRESS, 381 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, 382 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH 383 }, 384 { 385 "Heuristics match, server match", "1,1", "3734 Elvis Presley Blvd.", 386 ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE1, 387 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, 388 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH 389 }, 390 { 391 "Heuristics mismatch, server match", "2,1", "Apt. 10", 392 PHONE_HOME_NUMBER, ADDRESS_HOME_LINE2, 393 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, 394 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH 395 }, 396 { 397 "Heuristics unknown, server mismatch", "0,2", "Memphis", 398 UNKNOWN_TYPE, PHONE_HOME_NUMBER, 399 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, 400 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH 401 }, 402 { 403 "Heuristics match, server mismatch", "1,2", "Tennessee", 404 ADDRESS_HOME_STATE, PHONE_HOME_NUMBER, 405 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, 406 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH 407 }, 408 { 409 "Heuristics mismatch, server mismatch", "2,2", "38116", 410 PHONE_HOME_NUMBER, PHONE_HOME_NUMBER, 411 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, 412 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH 413 } 414 }; 415 416 std::vector<AutofillFieldType> heuristic_types, server_types; 417 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { 418 FormField field; 419 autofill_test::CreateTestFormField(failure_cases[i].label, 420 failure_cases[i].name, 421 failure_cases[i].value, "text", &field); 422 form.fields.push_back(field); 423 heuristic_types.push_back(failure_cases[i].heuristic_type); 424 server_types.push_back(failure_cases[i].server_type); 425 426 } 427 428 // Simulate having seen this form with the desired heuristic and server types. 429 // |form_structure| will be owned by |autofill_manager_|. 430 TestFormStructure* form_structure = new TestFormStructure(form); 431 form_structure->SetFieldTypes(heuristic_types, server_types); 432 autofill_manager_->AddSeenForm(form_structure); 433 434 // Establish our expectations. 435 ::testing::FLAGS_gmock_verbose = "error"; 436 ::testing::InSequence dummy; 437 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { 438 EXPECT_CALL(*autofill_manager_->metric_logger(), 439 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 440 EXPECT_CALL(*autofill_manager_->metric_logger(), 441 Log(AutofillMetrics::FIELD_NOT_AUTOFILLED, std::string())); 442 EXPECT_CALL(*autofill_manager_->metric_logger(), 443 Log(failure_cases[i].heuristic_metric, std::string())); 444 EXPECT_CALL(*autofill_manager_->metric_logger(), 445 Log(failure_cases[i].server_metric, std::string())); 446 } 447 448 // Simulate form submission. 449 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 450 } 451 452 // Test that we behave sanely when the cached form differs from the submitted 453 // one. 454 TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) { 455 // Set up our form data. 456 FormData form; 457 form.name = ASCIIToUTF16("TestForm"); 458 form.method = ASCIIToUTF16("POST"); 459 form.origin = GURL("http://example.com/form.html"); 460 form.action = GURL("http://example.com/submit.html"); 461 form.user_submitted = true; 462 463 std::vector<AutofillFieldType> heuristic_types, server_types; 464 465 FormField field; 466 autofill_test::CreateTestFormField( 467 "Both match", "match", "Elvis Presley", "text", &field); 468 field.is_autofilled = true; 469 form.fields.push_back(field); 470 heuristic_types.push_back(NAME_FULL); 471 server_types.push_back(NAME_FULL); 472 autofill_test::CreateTestFormField( 473 "Both mismatch", "mismatch", "buddy (at) gmail.com", "text", &field); 474 form.fields.push_back(field); 475 heuristic_types.push_back(PHONE_HOME_NUMBER); 476 server_types.push_back(PHONE_HOME_NUMBER); 477 autofill_test::CreateTestFormField( 478 "Only heuristics match", "mixed", "Memphis", "text", &field); 479 form.fields.push_back(field); 480 heuristic_types.push_back(ADDRESS_HOME_CITY); 481 server_types.push_back(PHONE_HOME_NUMBER); 482 autofill_test::CreateTestFormField( 483 "Unknown", "unknown", "garbage", "text", &field); 484 form.fields.push_back(field); 485 heuristic_types.push_back(UNKNOWN_TYPE); 486 server_types.push_back(UNKNOWN_TYPE); 487 488 // Simulate having seen this form with the desired heuristic and server types. 489 // |form_structure| will be owned by |autofill_manager_|. 490 TestFormStructure* form_structure = new TestFormStructure(form); 491 form_structure->SetFieldTypes(heuristic_types, server_types); 492 autofill_manager_->AddSeenForm(form_structure); 493 494 // Add a field and re-arrange the remaining form fields before submitting. 495 std::vector<FormField> cached_fields = form.fields; 496 form.fields.clear(); 497 autofill_test::CreateTestFormField( 498 "New field", "new field", "Tennessee", "text", &field); 499 form.fields.push_back(field); 500 form.fields.push_back(cached_fields[2]); 501 form.fields.push_back(cached_fields[1]); 502 form.fields.push_back(cached_fields[3]); 503 form.fields.push_back(cached_fields[0]); 504 505 // Establish our expectations. 506 ::testing::InSequence dummy; 507 // New field 508 EXPECT_CALL(*autofill_manager_->metric_logger(), 509 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 510 EXPECT_CALL(*autofill_manager_->metric_logger(), 511 Log(AutofillMetrics::HEURISTIC_TYPE_UNKNOWN, 512 ADDRESS_HOME_STATE, std::string())); 513 EXPECT_CALL(*autofill_manager_->metric_logger(), 514 Log(AutofillMetrics::SERVER_TYPE_UNKNOWN, 515 ADDRESS_HOME_STATE, std::string())); 516 EXPECT_CALL(*autofill_manager_->metric_logger(), 517 Log(AutofillMetrics::PREDICTED_TYPE_UNKNOWN, 518 ADDRESS_HOME_STATE, std::string())); 519 EXPECT_CALL(*autofill_manager_->metric_logger(), 520 Log(AutofillMetrics::FIELD_NOT_AUTOFILLED, std::string())); 521 EXPECT_CALL(*autofill_manager_->metric_logger(), 522 Log(AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, 523 std::string())); 524 EXPECT_CALL(*autofill_manager_->metric_logger(), 525 Log(AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN, 526 std::string())); 527 // Only heuristics match 528 EXPECT_CALL(*autofill_manager_->metric_logger(), 529 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 530 EXPECT_CALL(*autofill_manager_->metric_logger(), 531 Log(AutofillMetrics::HEURISTIC_TYPE_MATCH, 532 ADDRESS_HOME_CITY, std::string())); 533 EXPECT_CALL(*autofill_manager_->metric_logger(), 534 Log(AutofillMetrics::SERVER_TYPE_MISMATCH, 535 ADDRESS_HOME_CITY, std::string())); 536 EXPECT_CALL(*autofill_manager_->metric_logger(), 537 Log(AutofillMetrics::PREDICTED_TYPE_MISMATCH, 538 ADDRESS_HOME_CITY, std::string())); 539 EXPECT_CALL(*autofill_manager_->metric_logger(), 540 Log(AutofillMetrics::FIELD_NOT_AUTOFILLED, std::string())); 541 EXPECT_CALL(*autofill_manager_->metric_logger(), 542 Log(AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, 543 std::string())); 544 EXPECT_CALL(*autofill_manager_->metric_logger(), 545 Log(AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH, 546 std::string())); 547 // Both mismatch 548 EXPECT_CALL(*autofill_manager_->metric_logger(), 549 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 550 EXPECT_CALL(*autofill_manager_->metric_logger(), 551 Log(AutofillMetrics::HEURISTIC_TYPE_MISMATCH, 552 EMAIL_ADDRESS, std::string())); 553 EXPECT_CALL(*autofill_manager_->metric_logger(), 554 Log(AutofillMetrics::SERVER_TYPE_MISMATCH, 555 EMAIL_ADDRESS, std::string())); 556 EXPECT_CALL(*autofill_manager_->metric_logger(), 557 Log(AutofillMetrics::PREDICTED_TYPE_MISMATCH, 558 EMAIL_ADDRESS, std::string())); 559 EXPECT_CALL(*autofill_manager_->metric_logger(), 560 Log(AutofillMetrics::FIELD_NOT_AUTOFILLED, std::string())); 561 EXPECT_CALL(*autofill_manager_->metric_logger(), 562 Log(AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, 563 std::string())); 564 EXPECT_CALL(*autofill_manager_->metric_logger(), 565 Log(AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH, 566 std::string())); 567 // Unknown 568 EXPECT_CALL(*autofill_manager_->metric_logger(), 569 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 570 // Both match 571 EXPECT_CALL(*autofill_manager_->metric_logger(), 572 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())); 573 EXPECT_CALL(*autofill_manager_->metric_logger(), 574 Log(AutofillMetrics::HEURISTIC_TYPE_MATCH, 575 UNKNOWN_TYPE, std::string())); 576 EXPECT_CALL(*autofill_manager_->metric_logger(), 577 Log(AutofillMetrics::SERVER_TYPE_MATCH, 578 UNKNOWN_TYPE, std::string())); 579 EXPECT_CALL(*autofill_manager_->metric_logger(), 580 Log(AutofillMetrics::PREDICTED_TYPE_MATCH, 581 UNKNOWN_TYPE, std::string())); 582 EXPECT_CALL(*autofill_manager_->metric_logger(), 583 Log(AutofillMetrics::FIELD_AUTOFILLED, std::string())); 584 585 // Simulate form submission. 586 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 587 } 588 589 // Test that we don't log quality metrics for non-autofillable forms. 590 TEST_F(AutofillMetricsTest, NoQualityMetricsForNonAutofillableForms) { 591 // Forms must include at least three fields to be auto-fillable. 592 FormData form; 593 form.name = ASCIIToUTF16("TestForm"); 594 form.method = ASCIIToUTF16("POST"); 595 form.origin = GURL("http://example.com/form.html"); 596 form.action = GURL("http://example.com/submit.html"); 597 form.user_submitted = true; 598 599 FormField field; 600 autofill_test::CreateTestFormField( 601 "Autofilled", "autofilled", "Elvis Presley", "text", &field); 602 field.is_autofilled = true; 603 form.fields.push_back(field); 604 autofill_test::CreateTestFormField( 605 "Autofill Failed", "autofillfailed", "buddy (at) gmail.com", "text", &field); 606 form.fields.push_back(field); 607 608 // Simulate form submission. 609 EXPECT_CALL(*autofill_manager_->metric_logger(), 610 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())).Times(0); 611 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 612 613 // Search forms are not auto-fillable. 614 form.action = GURL("http://example.com/search?q=Elvis%20Presley"); 615 autofill_test::CreateTestFormField( 616 "Empty", "empty", "", "text", &field); 617 form.fields.push_back(field); 618 619 // Simulate form submission. 620 EXPECT_CALL(*autofill_manager_->metric_logger(), 621 Log(AutofillMetrics::FIELD_SUBMITTED, std::string())).Times(0); 622 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 623 } 624 625 // Test that we recored the experiment id appropriately. 626 TEST_F(AutofillMetricsTest, QualityMetricsWithExperimentId) { 627 // Set up our form data. 628 FormData form; 629 form.name = ASCIIToUTF16("TestForm"); 630 form.method = ASCIIToUTF16("POST"); 631 form.origin = GURL("http://example.com/form.html"); 632 form.action = GURL("http://example.com/submit.html"); 633 form.user_submitted = true; 634 635 std::vector<AutofillFieldType> heuristic_types, server_types; 636 FormField field; 637 638 autofill_test::CreateTestFormField( 639 "Autofilled", "autofilled", "Elvis Presley", "text", &field); 640 field.is_autofilled = true; 641 form.fields.push_back(field); 642 heuristic_types.push_back(NAME_FULL); 643 server_types.push_back(NAME_FIRST); 644 645 autofill_test::CreateTestFormField( 646 "Autofill Failed", "autofillfailed", "buddy (at) gmail.com", "text", &field); 647 form.fields.push_back(field); 648 heuristic_types.push_back(PHONE_HOME_NUMBER); 649 server_types.push_back(EMAIL_ADDRESS); 650 651 autofill_test::CreateTestFormField( 652 "Empty", "empty", "", "text", &field); 653 form.fields.push_back(field); 654 heuristic_types.push_back(NAME_FULL); 655 server_types.push_back(NAME_FIRST); 656 657 autofill_test::CreateTestFormField( 658 "Unknown", "unknown", "garbage", "text", &field); 659 form.fields.push_back(field); 660 heuristic_types.push_back(PHONE_HOME_NUMBER); 661 server_types.push_back(EMAIL_ADDRESS); 662 663 autofill_test::CreateTestFormField( 664 "Select", "select", "USA", "select-one", &field); 665 form.fields.push_back(field); 666 heuristic_types.push_back(UNKNOWN_TYPE); 667 server_types.push_back(NO_SERVER_DATA); 668 669 const std::string experiment_id = "ThatOughtaDoIt"; 670 671 // Simulate having seen this form on page load. 672 // |form_structure| will be owned by |autofill_manager_|. 673 TestFormStructure* form_structure = new TestFormStructure(form); 674 form_structure->SetFieldTypes(heuristic_types, server_types); 675 form_structure->set_server_experiment_id(experiment_id); 676 autofill_manager_->AddSeenForm(form_structure); 677 678 // Establish our expectations. 679 ::testing::InSequence dummy; 680 // Autofilled field 681 EXPECT_CALL(*autofill_manager_->metric_logger(), 682 Log(AutofillMetrics::FIELD_SUBMITTED, experiment_id)); 683 EXPECT_CALL(*autofill_manager_->metric_logger(), 684 Log(AutofillMetrics::HEURISTIC_TYPE_MATCH, 685 UNKNOWN_TYPE, experiment_id)); 686 EXPECT_CALL(*autofill_manager_->metric_logger(), 687 Log(AutofillMetrics::SERVER_TYPE_MISMATCH, 688 UNKNOWN_TYPE, experiment_id)); 689 EXPECT_CALL(*autofill_manager_->metric_logger(), 690 Log(AutofillMetrics::PREDICTED_TYPE_MISMATCH, 691 UNKNOWN_TYPE, experiment_id)); 692 EXPECT_CALL(*autofill_manager_->metric_logger(), 693 Log(AutofillMetrics::FIELD_AUTOFILLED, experiment_id)); 694 // Non-autofilled field for which we had data 695 EXPECT_CALL(*autofill_manager_->metric_logger(), 696 Log(AutofillMetrics::FIELD_SUBMITTED, experiment_id)); 697 EXPECT_CALL(*autofill_manager_->metric_logger(), 698 Log(AutofillMetrics::HEURISTIC_TYPE_MISMATCH, 699 EMAIL_ADDRESS, experiment_id)); 700 EXPECT_CALL(*autofill_manager_->metric_logger(), 701 Log(AutofillMetrics::SERVER_TYPE_MATCH, 702 EMAIL_ADDRESS, experiment_id)); 703 EXPECT_CALL(*autofill_manager_->metric_logger(), 704 Log(AutofillMetrics::PREDICTED_TYPE_MATCH, 705 EMAIL_ADDRESS, experiment_id)); 706 EXPECT_CALL(*autofill_manager_->metric_logger(), 707 Log(AutofillMetrics::FIELD_NOT_AUTOFILLED, experiment_id)); 708 EXPECT_CALL(*autofill_manager_->metric_logger(), 709 Log(AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, 710 experiment_id)); 711 EXPECT_CALL(*autofill_manager_->metric_logger(), 712 Log(AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MATCH, 713 experiment_id)); 714 // Empty field 715 EXPECT_CALL(*autofill_manager_->metric_logger(), 716 Log(AutofillMetrics::FIELD_SUBMITTED, experiment_id)); 717 // Unknown field 718 EXPECT_CALL(*autofill_manager_->metric_logger(), 719 Log(AutofillMetrics::FIELD_SUBMITTED, experiment_id)); 720 // <select> field 721 EXPECT_CALL(*autofill_manager_->metric_logger(), 722 Log(AutofillMetrics::FIELD_SUBMITTED, experiment_id)); 723 EXPECT_CALL(*autofill_manager_->metric_logger(), 724 Log(AutofillMetrics::HEURISTIC_TYPE_UNKNOWN, 725 ADDRESS_HOME_COUNTRY, experiment_id)); 726 EXPECT_CALL(*autofill_manager_->metric_logger(), 727 Log(AutofillMetrics::SERVER_TYPE_UNKNOWN, 728 ADDRESS_HOME_COUNTRY, experiment_id)); 729 EXPECT_CALL(*autofill_manager_->metric_logger(), 730 Log(AutofillMetrics::PREDICTED_TYPE_UNKNOWN, 731 ADDRESS_HOME_COUNTRY, experiment_id)); 732 733 // Simulate form submission. 734 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 735 } 736 737 // Test that the profile count is logged correctly. 738 TEST_F(AutofillMetricsTest, StoredProfileCount) { 739 // The metric should be logged when the profiles are first loaded. 740 EXPECT_CALL(*test_personal_data_->metric_logger(), 741 LogStoredProfileCount(2)).Times(1); 742 test_personal_data_->LoadProfiles(); 743 744 // The metric should only be logged once. 745 EXPECT_CALL(*test_personal_data_->metric_logger(), 746 LogStoredProfileCount(::testing::_)).Times(0); 747 test_personal_data_->LoadProfiles(); 748 } 749 750 // Test that we correctly log whether Autofill is enabled. 751 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtStartup) { 752 test_personal_data_->set_autofill_enabled(true); 753 EXPECT_CALL(*test_personal_data_->metric_logger(), 754 LogIsAutofillEnabledAtStartup(true)).Times(1); 755 test_personal_data_->Init(NULL); 756 757 test_personal_data_->set_autofill_enabled(false); 758 EXPECT_CALL(*test_personal_data_->metric_logger(), 759 LogIsAutofillEnabledAtStartup(false)).Times(1); 760 test_personal_data_->Init(NULL); 761 } 762 763 // Test that we log the number of Autofill suggestions when filling a form. 764 TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { 765 // Set up our form data. 766 FormData form; 767 form.name = ASCIIToUTF16("TestForm"); 768 form.method = ASCIIToUTF16("POST"); 769 form.origin = GURL("http://example.com/form.html"); 770 form.action = GURL("http://example.com/submit.html"); 771 form.user_submitted = true; 772 773 FormField field; 774 std::vector<AutofillFieldType> field_types; 775 autofill_test::CreateTestFormField("Name", "name", "", "text", &field); 776 form.fields.push_back(field); 777 field_types.push_back(NAME_FULL); 778 autofill_test::CreateTestFormField("Email", "email", "", "email", &field); 779 form.fields.push_back(field); 780 field_types.push_back(EMAIL_ADDRESS); 781 autofill_test::CreateTestFormField("Phone", "phone", "", "tel", &field); 782 form.fields.push_back(field); 783 field_types.push_back(PHONE_HOME_NUMBER); 784 785 // Simulate having seen this form on page load. 786 // |form_structure| will be owned by |autofill_manager_|. 787 TestFormStructure* form_structure = new TestFormStructure(form); 788 form_structure->SetFieldTypes(field_types, field_types); 789 autofill_manager_->AddSeenForm(form_structure); 790 791 // Establish our expectations. 792 ::testing::FLAGS_gmock_verbose = "error"; 793 ::testing::InSequence dummy; 794 EXPECT_CALL(*autofill_manager_->metric_logger(), 795 LogAddressSuggestionsCount(2)).Times(1); 796 797 // Simulate activating the autofill popup for the phone field. 798 autofill_manager_->OnQueryFormFieldAutofill(0, form, field); 799 800 // Simulate activating the autofill popup for the email field after typing. 801 // No new metric should be logged, since we're still on the same page. 802 autofill_test::CreateTestFormField("Email", "email", "b", "email", &field); 803 autofill_manager_->OnQueryFormFieldAutofill(0, form, field); 804 805 // Reset the autofill manager state. 806 autofill_manager_->Reset(); 807 form_structure = new TestFormStructure(form); 808 form_structure->SetFieldTypes(field_types, field_types); 809 autofill_manager_->AddSeenForm(form_structure); 810 811 // Establish our expectations. 812 EXPECT_CALL(*autofill_manager_->metric_logger(), 813 LogAddressSuggestionsCount(1)).Times(1); 814 815 // Simulate activating the autofill popup for the email field after typing. 816 autofill_manager_->OnQueryFormFieldAutofill(0, form, field); 817 818 // Reset the autofill manager state again. 819 autofill_manager_->Reset(); 820 form_structure = new TestFormStructure(form); 821 form_structure->SetFieldTypes(field_types, field_types); 822 autofill_manager_->AddSeenForm(form_structure); 823 824 // Establish our expectations. 825 EXPECT_CALL(*autofill_manager_->metric_logger(), 826 LogAddressSuggestionsCount(::testing::_)).Times(0); 827 828 // Simulate activating the autofill popup for the email field after typing. 829 form.fields[0].is_autofilled = true; 830 autofill_manager_->OnQueryFormFieldAutofill(0, form, field); 831 } 832 833 // Test that we log whether Autofill is enabled when filling a form. 834 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) { 835 // Establish our expectations. 836 ::testing::FLAGS_gmock_verbose = "error"; 837 ::testing::InSequence dummy; 838 EXPECT_CALL(*autofill_manager_->metric_logger(), 839 LogIsAutofillEnabledAtPageLoad(true)).Times(1); 840 841 autofill_manager_->set_autofill_enabled(true); 842 autofill_manager_->OnFormsSeen(std::vector<FormData>()); 843 844 // Reset the autofill manager state. 845 autofill_manager_->Reset(); 846 847 // Establish our expectations. 848 EXPECT_CALL(*autofill_manager_->metric_logger(), 849 LogIsAutofillEnabledAtPageLoad(false)).Times(1); 850 851 autofill_manager_->set_autofill_enabled(false); 852 autofill_manager_->OnFormsSeen(std::vector<FormData>()); 853 } 854 855 // Test that credit card infobar metrics are logged correctly. 856 TEST_F(AutofillMetricsTest, CreditCardInfoBar) { 857 MockAutofillMetrics metric_logger; 858 CreditCard* credit_card; 859 AutofillCCInfoBarDelegate* infobar; 860 ::testing::InSequence dummy; 861 862 // Accept the infobar. 863 EXPECT_CALL(metric_logger, Log(AutofillMetrics::CREDIT_CARD_INFOBAR_SHOWN)); 864 credit_card = new CreditCard(); 865 infobar = new AutofillCCInfoBarDelegate(contents(), 866 credit_card, 867 test_personal_data_.get(), 868 &metric_logger); 869 870 EXPECT_CALL(*test_personal_data_.get(), SaveImportedCreditCard(*credit_card)); 871 EXPECT_CALL(metric_logger, 872 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_ACCEPTED)).Times(1); 873 EXPECT_CALL(metric_logger, 874 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_IGNORED)).Times(0); 875 EXPECT_TRUE(infobar->Accept()); 876 infobar->InfoBarClosed(); 877 878 // Cancel the infobar. 879 EXPECT_CALL(metric_logger, Log(AutofillMetrics::CREDIT_CARD_INFOBAR_SHOWN)); 880 credit_card = new CreditCard(); 881 infobar = new AutofillCCInfoBarDelegate(contents(), 882 credit_card, 883 test_personal_data_.get(), 884 &metric_logger); 885 886 EXPECT_CALL(metric_logger, 887 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_DENIED)).Times(1); 888 EXPECT_CALL(metric_logger, 889 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_IGNORED)).Times(0); 890 EXPECT_TRUE(infobar->Cancel()); 891 infobar->InfoBarClosed(); 892 893 // Dismiss the infobar. 894 EXPECT_CALL(metric_logger, Log(AutofillMetrics::CREDIT_CARD_INFOBAR_SHOWN)); 895 credit_card = new CreditCard(); 896 infobar = new AutofillCCInfoBarDelegate(contents(), 897 credit_card, 898 test_personal_data_.get(), 899 &metric_logger); 900 901 EXPECT_CALL(metric_logger, 902 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_DENIED)).Times(1); 903 EXPECT_CALL(metric_logger, 904 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_IGNORED)).Times(0); 905 infobar->InfoBarDismissed(); 906 infobar->InfoBarClosed(); 907 908 // Ignore the infobar. 909 EXPECT_CALL(metric_logger, Log(AutofillMetrics::CREDIT_CARD_INFOBAR_SHOWN)); 910 credit_card = new CreditCard(); 911 infobar = new AutofillCCInfoBarDelegate(contents(), 912 credit_card, 913 test_personal_data_.get(), 914 &metric_logger); 915 916 EXPECT_CALL(metric_logger, 917 Log(AutofillMetrics::CREDIT_CARD_INFOBAR_IGNORED)).Times(1); 918 infobar->InfoBarClosed(); 919 } 920