Index: chrome/browser/autofill/autofill_metrics_unittest.cc |
diff --git a/chrome/browser/autofill/autofill_metrics_unittest.cc b/chrome/browser/autofill/autofill_metrics_unittest.cc |
index ca4dce331929b16647aa4f091c3455b3a216f924..41df1e979b9ea201c559ddbbae2ab69cec4f0b2e 100644 |
--- a/chrome/browser/autofill/autofill_metrics_unittest.cc |
+++ b/chrome/browser/autofill/autofill_metrics_unittest.cc |
@@ -2,6 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <vector> |
+ |
#include "base/ref_counted.h" |
#include "base/scoped_ptr.h" |
#include "base/string16.h" |
@@ -112,12 +114,40 @@ class TestAutoFillManager : public AutoFillManager { |
AutoFillManager::metric_logger()); |
} |
+ void AddSeenForm(FormStructure* form) { |
+ form_structures()->push_back(form); |
+ } |
+ |
private: |
bool autofill_enabled_; |
DISALLOW_COPY_AND_ASSIGN(TestAutoFillManager); |
}; |
+class TestFormStructure : public FormStructure { |
+ public: |
+ explicit TestFormStructure(const FormData& form) : FormStructure(form) {} |
+ virtual ~TestFormStructure() {} |
+ |
+ void SetFieldTypes(const std::vector<AutoFillFieldType>& heuristic_types, |
+ const std::vector<AutoFillFieldType>& server_types) { |
+ ASSERT_EQ(field_count(), heuristic_types.size()); |
+ ASSERT_EQ(field_count(), server_types.size()); |
+ |
+ for (size_t i = 0; i < field_count(); ++i) { |
+ AutoFillField* field = (*fields())[i]; |
+ ASSERT_TRUE(field); |
+ field->set_heuristic_type(heuristic_types[i]); |
+ field->set_server_type(server_types[i]); |
+ } |
+ |
+ UpdateAutoFillCount(); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TestFormStructure); |
+}; |
+ |
} // namespace |
class AutoFillMetricsTest : public RenderViewHostTestHarness { |
@@ -182,7 +212,11 @@ TEST_F(AutoFillMetricsTest, QualityMetrics) { |
EXPECT_CALL(*autofill_manager_->metric_logger(), |
Log(AutoFillMetrics::FIELD_SUBMITTED)); |
EXPECT_CALL(*autofill_manager_->metric_logger(), |
- Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED )); |
+ Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ Log(AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN)); |
EXPECT_CALL(*autofill_manager_->metric_logger(), |
Log(AutoFillMetrics::FIELD_SUBMITTED)); |
EXPECT_CALL(*autofill_manager_->metric_logger(), |
@@ -192,6 +226,117 @@ TEST_F(AutoFillMetricsTest, QualityMetrics) { |
EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); |
} |
+// Test that we log the appropriate additional metrics when AutoFill failed. |
+TEST_F(AutoFillMetricsTest, QualityMetricsForFailure) { |
+ // Set up our form data. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.method = ASCIIToUTF16("POST"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ struct { |
+ const char* label; |
+ const char* name; |
+ const char* value; |
+ AutoFillFieldType heuristic_type; |
+ AutoFillFieldType server_type; |
+ AutoFillMetrics::QualityMetric heuristic_metric; |
+ AutoFillMetrics::QualityMetric server_metric; |
+ } failure_cases[] = { |
+ { |
+ "Heuristics unknown, server unknown", "0,0", "Elvis", |
+ UNKNOWN_TYPE, NO_SERVER_DATA, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN |
+ }, |
+ { |
+ "Heuristics match, server unknown", "1,0", "Aaron", |
+ NAME_MIDDLE, NO_SERVER_DATA, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_MATCH, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN |
+ }, |
+ { |
+ "Heuristics mismatch, server unknown", "2,0", "Presley", |
+ PHONE_HOME_NUMBER, NO_SERVER_DATA, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN |
+ }, |
+ { |
+ "Heuristics unknown, server match", "0,1", "theking@gmail.com", |
+ UNKNOWN_TYPE, EMAIL_ADDRESS, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_MATCH |
+ }, |
+ { |
+ "Heuristics match, server match", "1,1", "3734 Elvis Presley Blvd.", |
+ ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE1, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_MATCH, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_MATCH |
+ }, |
+ { |
+ "Heuristics mismatch, server match", "2,1", "Apt. 10", |
+ PHONE_HOME_NUMBER, ADDRESS_HOME_LINE2, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_MATCH |
+ }, |
+ { |
+ "Heuristics unknown, server mismatch", "0,2", "Memphis", |
+ UNKNOWN_TYPE, PHONE_HOME_NUMBER, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_MISMATCH |
+ }, |
+ { |
+ "Heuristics match, server mismatch", "1,2", "Tennessee", |
+ ADDRESS_HOME_STATE, PHONE_HOME_NUMBER, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_MATCH, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_MISMATCH |
+ }, |
+ { |
+ "Heuristics mismatch, server mismatch", "2,2", "38116", |
+ PHONE_HOME_NUMBER, PHONE_HOME_NUMBER, |
+ AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH, |
+ AutoFillMetrics::FIELD_SERVER_TYPE_MISMATCH |
+ } |
+ }; |
+ |
+ std::vector<AutoFillFieldType> heuristic_types, server_types; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { |
+ FormField field; |
+ autofill_test::CreateTestFormField(failure_cases[i].label, |
+ failure_cases[i].name, |
+ failure_cases[i].value, "text", &field); |
+ form.fields.push_back(field); |
+ heuristic_types.push_back(failure_cases[i].heuristic_type); |
+ server_types.push_back(failure_cases[i].server_type); |
+ |
+ } |
+ |
+ // Simulate having seen this form with the desired heuristic and server types. |
+ // |form_structure| will be owned by |autofill_manager_|. |
+ TestFormStructure* form_structure = new TestFormStructure(form); |
+ form_structure->SetFieldTypes(heuristic_types, server_types); |
+ autofill_manager_->AddSeenForm(form_structure); |
+ |
+ // Establish our expectations. Only print gmock errors, as the warnings are |
+ // too verbose. |
+ ::testing::InSequence dummy; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ Log(AutoFillMetrics::FIELD_SUBMITTED)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ Log(failure_cases[i].heuristic_metric)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ Log(failure_cases[i].server_metric)); |
+ } |
+ |
+ // Simulate form submission. |
+ EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); |
+} |
+ |
// Test that we don't log quality metrics for non-autofillable forms. |
TEST_F(AutoFillMetricsTest, NoQualityMetricsForNonAutoFillableForms) { |
// Forms must include at least three fields to be auto-fillable. |