Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(616)

Side by Side Diff: chrome/browser/autofill/autofill_metrics_unittest.cc

Issue 7747009: Add metrics to track Autofill "user happiness" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/autofill/autofill_metrics.cc ('k') | chrome/browser/autofill/form_structure.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include <vector>
6 6
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/string16.h" 9 #include "base/string16.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 28 matching lines...) Expand all
39 void(FieldTypeQualityMetric metric, 39 void(FieldTypeQualityMetric metric,
40 AutofillFieldType field_type, 40 AutofillFieldType field_type,
41 const std::string& experiment_id)); 41 const std::string& experiment_id));
42 MOCK_CONST_METHOD3(LogServerTypePrediction, 42 MOCK_CONST_METHOD3(LogServerTypePrediction,
43 void(FieldTypeQualityMetric metric, 43 void(FieldTypeQualityMetric metric,
44 AutofillFieldType field_type, 44 AutofillFieldType field_type,
45 const std::string& experiment_id)); 45 const std::string& experiment_id));
46 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, 46 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric,
47 const std::string& experiment_id)); 47 const std::string& experiment_id));
48 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); 48 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric));
49 MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric));
49 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); 50 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled));
50 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); 51 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled));
51 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); 52 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles));
52 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions)); 53 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions));
53 MOCK_CONST_METHOD1(LogServerExperimentIdForQuery, 54 MOCK_CONST_METHOD1(LogServerExperimentIdForQuery,
54 void(const std::string& experiment_id)); 55 void(const std::string& experiment_id));
55 MOCK_CONST_METHOD1(LogServerExperimentIdForUpload, 56 MOCK_CONST_METHOD1(LogServerExperimentIdForUpload,
56 void(const std::string& experiment_id)); 57 void(const std::string& experiment_id));
57 58
58 private: 59 private:
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 PHONE_HOME_WHOLE_NUMBER, std::string())); 383 PHONE_HOME_WHOLE_NUMBER, std::string()));
383 EXPECT_CALL(*autofill_manager_->metric_logger(), 384 EXPECT_CALL(*autofill_manager_->metric_logger(),
384 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, 385 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH,
385 PHONE_HOME_WHOLE_NUMBER, std::string())); 386 PHONE_HOME_WHOLE_NUMBER, std::string()));
386 EXPECT_CALL(*autofill_manager_->metric_logger(), 387 EXPECT_CALL(*autofill_manager_->metric_logger(),
387 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, 388 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH,
388 PHONE_HOME_WHOLE_NUMBER, std::string())); 389 PHONE_HOME_WHOLE_NUMBER, std::string()));
389 EXPECT_CALL(*autofill_manager_->metric_logger(), 390 EXPECT_CALL(*autofill_manager_->metric_logger(),
390 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, 391 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED,
391 std::string())); 392 std::string()));
393 EXPECT_CALL(*autofill_manager_->metric_logger(),
394 LogUserHappinessMetric(
395 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME));
392 396
393 // Simulate form submission. 397 // Simulate form submission.
394 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); 398 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form));
395 } 399 }
396 400
397 // Test that we log the appropriate additional metrics when Autofill failed. 401 // Test that we log the appropriate additional metrics when Autofill failed.
398 TEST_F(AutofillMetricsTest, QualityMetricsForFailure) { 402 TEST_F(AutofillMetricsTest, QualityMetricsForFailure) {
399 // Set up our form data. 403 // Set up our form data.
400 FormData form; 404 FormData form;
401 form.name = ASCIIToUTF16("TestForm"); 405 form.name = ASCIIToUTF16("TestForm");
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED)); 1023 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED));
1020 EXPECT_CALL(metric_logger, 1024 EXPECT_CALL(metric_logger,
1021 LogServerExperimentIdForQuery("ar1")); 1025 LogServerExperimentIdForQuery("ar1"));
1022 EXPECT_CALL(metric_logger, 1026 EXPECT_CALL(metric_logger,
1023 LogServerQueryMetric( 1027 LogServerQueryMetric(
1024 AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS)); 1028 AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS));
1025 FormStructure::ParseQueryResponse( 1029 FormStructure::ParseQueryResponse(
1026 "<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>", 1030 "<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>",
1027 std::vector<FormStructure*>(), metric_logger); 1031 std::vector<FormStructure*>(), metric_logger);
1028 } 1032 }
1033
1034 // Verify that we correctly log user happiness metrics dealing with form loading
1035 // and form submission.
1036 TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) {
1037 // Start with a form with insufficiently many fields.
1038 FormData form;
1039 form.name = ASCIIToUTF16("TestForm");
1040 form.method = ASCIIToUTF16("POST");
1041 form.origin = GURL("http://example.com/form.html");
1042 form.action = GURL("http://example.com/submit.html");
1043 form.user_submitted = true;
1044
1045 FormField field;
1046 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
1047 form.fields.push_back(field);
1048 autofill_test::CreateTestFormField("Email", "email", "", "text", &field);
1049 form.fields.push_back(field);
1050
1051 std::vector<FormData> forms(1, form);
1052
1053 // Expect no notifications when the form is first seen.
1054 {
1055 EXPECT_CALL(*autofill_manager_->metric_logger(),
1056 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)).Times(0);
1057 autofill_manager_->OnFormsSeen(forms);
1058 }
1059
1060
1061 // Expect no notifications when the form is submitted.
1062 {
1063 EXPECT_CALL(
1064 *autofill_manager_->metric_logger(),
1065 LogUserHappinessMetric(
1066 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)).Times(0);
1067 EXPECT_CALL(
1068 *autofill_manager_->metric_logger(),
1069 LogUserHappinessMetric(
1070 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)).Times(0);
1071 EXPECT_CALL(
1072 *autofill_manager_->metric_logger(),
1073 LogUserHappinessMetric(
1074 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)).Times(0);
1075 EXPECT_CALL(
1076 *autofill_manager_->metric_logger(),
1077 LogUserHappinessMetric(
1078 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)).Times(0);
1079 autofill_manager_->OnFormSubmitted(form);
1080 }
1081
1082 // Add more fields to the form.
1083 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field);
1084 form.fields.push_back(field);
1085 autofill_test::CreateTestFormField("Unknown", "unknown", "", "text", &field);
1086 form.fields.push_back(field);
1087 forms.front() = form;
1088
1089 // Expect a notification when the form is first seen.
1090 {
1091 EXPECT_CALL(*autofill_manager_->metric_logger(),
1092 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED));
1093 autofill_manager_->OnFormsSeen(forms);
1094 }
1095
1096 // Expect a notification when the form is submitted.
1097 {
1098 EXPECT_CALL(*autofill_manager_->metric_logger(),
1099 LogUserHappinessMetric(
1100 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM));
1101 autofill_manager_->OnFormSubmitted(form);
1102 }
1103
1104 // Fill in two of the fields.
1105 form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley");
1106 form.fields[1].value = ASCIIToUTF16("theking@gmail.com");
1107 forms.front() = form;
1108
1109 // Expect a notification when the form is submitted.
1110 {
1111 EXPECT_CALL(*autofill_manager_->metric_logger(),
1112 LogUserHappinessMetric(
1113 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM));
1114 autofill_manager_->OnFormSubmitted(form);
1115 }
1116
1117 // Fill in the third field.
1118 form.fields[2].value = ASCIIToUTF16("12345678901");
1119 forms.front() = form;
1120
1121 // Expect notifications when the form is submitted.
1122 {
1123 EXPECT_CALL(*autofill_manager_->metric_logger(),
1124 LogUserHappinessMetric(
1125 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE));
1126 autofill_manager_->OnFormSubmitted(form);
1127 }
1128
1129
1130 // Mark one of the fields as autofilled.
1131 form.fields[1].is_autofilled = true;
1132 forms.front() = form;
1133
1134 // Expect notifications when the form is submitted.
1135 {
1136 EXPECT_CALL(*autofill_manager_->metric_logger(),
1137 LogUserHappinessMetric(
1138 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME));
1139 autofill_manager_->OnFormSubmitted(form);
1140 }
1141
1142 // Mark all of the fillable fields as autofilled.
1143 form.fields[0].is_autofilled = true;
1144 form.fields[2].is_autofilled = true;
1145 forms.front() = form;
1146
1147 // Expect notifications when the form is submitted.
1148 {
1149 EXPECT_CALL(*autofill_manager_->metric_logger(),
1150 LogUserHappinessMetric(
1151 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL));
1152 autofill_manager_->OnFormSubmitted(form);
1153 }
1154
1155 // Clear out the third field's value.
1156 form.fields[2].value = string16();
1157 forms.front() = form;
1158
1159 // Expect notifications when the form is submitted.
1160 {
1161 EXPECT_CALL(*autofill_manager_->metric_logger(),
1162 LogUserHappinessMetric(
1163 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM));
1164 autofill_manager_->OnFormSubmitted(form);
1165 }
1166 }
1167
1168 // Verify that we correctly log user happiness metrics dealing with form
1169 // interaction.
1170 TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) {
1171 // Load a fillable form.
1172 FormData form;
1173 form.name = ASCIIToUTF16("TestForm");
1174 form.method = ASCIIToUTF16("POST");
1175 form.origin = GURL("http://example.com/form.html");
1176 form.action = GURL("http://example.com/submit.html");
1177 form.user_submitted = true;
1178
1179 FormField field;
1180 autofill_test::CreateTestFormField("Name", "name", "", "text", &field);
1181 form.fields.push_back(field);
1182 autofill_test::CreateTestFormField("Email", "email", "", "text", &field);
1183 form.fields.push_back(field);
1184 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field);
1185 form.fields.push_back(field);
1186
1187 std::vector<FormData> forms(1, form);
1188
1189 // Expect a notification when the form is first seen.
1190 {
1191 EXPECT_CALL(*autofill_manager_->metric_logger(),
1192 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED));
1193 autofill_manager_->OnFormsSeen(forms);
1194 }
1195
1196 // Simulate typing.
1197 {
1198 EXPECT_CALL(*autofill_manager_->metric_logger(),
1199 LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE));
1200 autofill_manager_->OnTextFieldDidChange(form, form.fields.front());
1201 }
1202
1203 // Simulate suggestions shown twice for a single edit (i.e. multiple
1204 // keystrokes in a single field).
1205 {
1206 EXPECT_CALL(*autofill_manager_->metric_logger(),
1207 LogUserHappinessMetric(
1208 AutofillMetrics::SUGGESTIONS_SHOWN)).Times(1);
1209 EXPECT_CALL(*autofill_manager_->metric_logger(),
1210 LogUserHappinessMetric(
1211 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(1);
1212 autofill_manager_->OnDidShowAutofillSuggestions(true);
1213 autofill_manager_->OnDidShowAutofillSuggestions(false);
1214 }
1215
1216 // Simulate suggestions shown for a different field.
1217 {
1218 EXPECT_CALL(*autofill_manager_->metric_logger(),
1219 LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN));
1220 EXPECT_CALL(*autofill_manager_->metric_logger(),
1221 LogUserHappinessMetric(
1222 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(0);
1223 autofill_manager_->OnDidShowAutofillSuggestions(true);
1224 }
1225
1226 // Simulate invoking autofill.
1227 {
1228 EXPECT_CALL(*autofill_manager_->metric_logger(),
1229 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL));
1230 EXPECT_CALL(*autofill_manager_->metric_logger(),
1231 LogUserHappinessMetric(
1232 AutofillMetrics::USER_DID_AUTOFILL_ONCE));
1233 autofill_manager_->OnDidFillAutofillFormData();
1234 }
1235
1236 // Simulate editing an autofilled field.
1237 {
1238 EXPECT_CALL(*autofill_manager_->metric_logger(),
1239 LogUserHappinessMetric(
1240 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD));
1241 EXPECT_CALL(*autofill_manager_->metric_logger(),
1242 LogUserHappinessMetric(
1243 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE));
1244 AutofillManager::GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
1245 AutofillManager::GUIDPair empty(std::string(), 0);
1246 autofill_manager_->OnFillAutofillFormData(
1247 0, form, form.fields.front(),
1248 autofill_manager_->PackGUIDs(empty, guid));
1249 autofill_manager_->OnTextFieldDidChange(form, form.fields.front());
1250 // Simulate a second keystroke; make sure we don't log the metric twice.
1251 autofill_manager_->OnTextFieldDidChange(form, form.fields.front());
1252 }
1253
1254 // Simulate invoking autofill again.
1255 EXPECT_CALL(*autofill_manager_->metric_logger(),
1256 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL));
1257 EXPECT_CALL(*autofill_manager_->metric_logger(),
1258 LogUserHappinessMetric(
1259 AutofillMetrics::USER_DID_AUTOFILL_ONCE)).Times(0);
1260 autofill_manager_->OnDidFillAutofillFormData();
1261
1262 // Simulate editing another autofilled field.
1263 {
1264 EXPECT_CALL(*autofill_manager_->metric_logger(),
1265 LogUserHappinessMetric(
1266 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD));
1267 autofill_manager_->OnTextFieldDidChange(form, form.fields[1]);
1268 }
1269 }
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_metrics.cc ('k') | chrome/browser/autofill/form_structure.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698