Index: components/autofill/core/browser/autofill_metrics_unittest.cc |
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc |
index 306d2474e07cad399c07fd9f077d9a2a449c958a..e656cb1a9ba0adec0edda82b9fb428b4113ee562 100644 |
--- a/components/autofill/core/browser/autofill_metrics_unittest.cc |
+++ b/components/autofill/core/browser/autofill_metrics_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <stddef.h> |
#include <memory> |
+#include <utility> |
#include <vector> |
#include "base/feature_list.h" |
@@ -53,7 +54,8 @@ using base::Bucket; |
using base::TimeTicks; |
using rappor::TestRapporServiceImpl; |
using ::testing::ElementsAre; |
-using ::testing::UnorderedElementsAre; |
+using ::testing::Matcher; |
+using ::testing::Pointwise; |
namespace autofill { |
namespace { |
@@ -316,6 +318,53 @@ const ukm::Entry_Metric* FindMetric( |
return nullptr; |
} |
+void VerifyDeveloperEngagementUkm( |
+ const FormData& form, |
+ const ukm::TestUkmService* ukm_service, |
+ AutofillMetrics::DeveloperEngagementMetric expected_value) { |
+ const ukm::UkmEntry* entry = ukm_service->GetEntryForEntryName( |
+ internal::kUKMDeveloperEngagementEntryName); |
+ ASSERT_NE(nullptr, entry); |
+ ukm::Entry entry_proto; |
+ entry->PopulateProto(&entry_proto); |
+ |
+ const ukm::UkmSource* source = |
+ ukm_service->GetSourceForSourceId(entry_proto.source_id()); |
+ ASSERT_NE(nullptr, source); |
+ EXPECT_EQ(form.origin, source->url()); |
+ |
+ const ukm::Entry_Metric* metric = FindMetric( |
+ internal::kUKMDeveloperEngagementMetricName, entry_proto.metrics()); |
+ ASSERT_NE(nullptr, metric); |
+ EXPECT_EQ(expected_value, metric->value()); |
+} |
+ |
+MATCHER(CompareMetrics, "") { |
+ const ukm::Entry_Metric& lhs = ::testing::get<0>(arg); |
+ const std::pair<const char*, int64_t>& rhs = ::testing::get<1>(arg); |
+ return lhs.metric_hash() == base::HashMetricName(rhs.first) && |
+ lhs.value() == rhs.second; |
+} |
+ |
+void VerifyFormInteractionsUkm( |
+ const FormData& form, |
+ const ukm::TestUkmService* ukm_service, |
+ const std::vector<std::pair<const char*, int64_t>>& expected_metrics) { |
+ const ukm::UkmEntry* entry = ukm_service->GetEntryForEntryName( |
+ internal::kUKMFormInteractionsEntryName); |
+ ASSERT_NE(nullptr, entry); |
+ ukm::Entry entry_proto; |
+ entry->PopulateProto(&entry_proto); |
+ |
+ const ukm::UkmSource* source = |
+ ukm_service->GetSourceForSourceId(entry_proto.source_id()); |
+ ASSERT_NE(nullptr, source); |
+ EXPECT_EQ(form.origin, source->url()); |
+ |
+ EXPECT_THAT(entry_proto.metrics(), |
sebsg
2017/04/10 19:20:19
very nice!
csashi
2017/04/10 20:15:58
Credit to Zhanyong Wan.
|
+ Pointwise(CompareMetrics(), expected_metrics)); |
+} |
+ |
} // namespace |
// This is defined in the autofill_metrics.cc implementation file. |
@@ -393,6 +442,7 @@ void AutofillMetricsTest::TearDown() { |
account_tracker_.reset(); |
signin_client_.reset(); |
test::ReenableSystemServices(); |
+ autofill_client_.GetTestUkmService()->Purge(); |
} |
void AutofillMetricsTest::EnableWalletSync() { |
@@ -1380,6 +1430,11 @@ TEST_F(AutofillMetricsTest, NumberOfEditedAutofilledFields) { |
// fields is logged. |
histogram_tester.ExpectUniqueSample( |
"Autofill.NumberOfEditedAutofilledFieldsAtSubmission", 2, 1); |
+ |
+ // UKM must not be logged unless enabled. |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ EXPECT_EQ(0U, ukm_service->sources_count()); |
+ EXPECT_EQ(0U, ukm_service->entries_count()); |
} |
// Verify that when resetting the autofill manager (such as during a |
@@ -1567,30 +1622,23 @@ TEST_F(AutofillMetricsTest, |
test::CreateTestFormField("Phone", "phone", "", "text", &field); |
forms.back().fields.push_back(field); |
- // Expect the "form parsed without field type hints" metric to be logged. |
+ // Expect the "form parsed without field type hints" metric and the |
+ // "form loaded" form interaction event to be logged. |
{ |
autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
autofill_manager_->Reset(); |
- ASSERT_EQ(1U, ukm_service->sources_count()); |
- const ukm::UkmSource* source = |
- ukm_service->GetSourceForUrl(form.origin.spec().c_str()); |
- ASSERT_NE(nullptr, source); |
- |
- ASSERT_EQ(1U, ukm_service->entries_count()); |
- const ukm::UkmEntry* entry = ukm_service->GetEntry(0); |
- EXPECT_EQ(source->id(), entry->source_id()); |
- |
- ukm::Entry entry_proto; |
- entry->PopulateProto(&entry_proto); |
- EXPECT_EQ(source->id(), entry_proto.source_id()); |
- EXPECT_EQ(base::HashMetricName(internal::kUKMDeveloperEngagementEntryName), |
- entry_proto.event_hash()); |
- const ukm::Entry_Metric* metric = FindMetric( |
- internal::kUKMDeveloperEngagementMetricName, entry_proto.metrics()); |
- ASSERT_NE(nullptr, metric); |
- EXPECT_EQ(AutofillMetrics::FILLABLE_FORM_PARSED_WITHOUT_TYPE_HINTS, |
- metric->value()); |
+ // Expect an entry for |kUKMDeveloperEngagementEntryName| and another entry |
+ // for |kUKMFormInteractionsEntryName|. Both entries are for the same URL. |
+ ASSERT_EQ(2U, ukm_service->entries_count()); |
+ ASSERT_EQ(2U, ukm_service->sources_count()); |
+ VerifyDeveloperEngagementUkm( |
+ form, ukm_service, |
+ AutofillMetrics::FILLABLE_FORM_PARSED_WITHOUT_TYPE_HINTS); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::FORMS_LOADED}}); |
} |
} |
@@ -1633,30 +1681,23 @@ TEST_F(AutofillMetricsTest, |
field.autocomplete_attribute = "address-line1"; |
forms.back().fields.push_back(field); |
- // Expect the "form parsed with field type hints" metric to be logged. |
+ // Expect the "form parsed without field type hints" metric and the |
+ // "form loaded" form interaction event to be logged. |
{ |
autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
autofill_manager_->Reset(); |
- ASSERT_EQ(1U, ukm_service->sources_count()); |
- const ukm::UkmSource* source = |
- ukm_service->GetSourceForUrl(form.origin.spec().c_str()); |
- ASSERT_NE(nullptr, source); |
- |
- ASSERT_EQ(1U, ukm_service->entries_count()); |
- const ukm::UkmEntry* entry = ukm_service->GetEntry(0); |
- EXPECT_EQ(source->id(), entry->source_id()); |
- |
- ukm::Entry entry_proto; |
- entry->PopulateProto(&entry_proto); |
- EXPECT_EQ(source->id(), entry_proto.source_id()); |
- EXPECT_EQ(base::HashMetricName(internal::kUKMDeveloperEngagementEntryName), |
- entry_proto.event_hash()); |
- const ukm::Entry_Metric* metric = FindMetric( |
- internal::kUKMDeveloperEngagementMetricName, entry_proto.metrics()); |
- ASSERT_NE(nullptr, metric); |
- EXPECT_EQ(AutofillMetrics::FILLABLE_FORM_PARSED_WITH_TYPE_HINTS, |
- metric->value()); |
+ // Expect an entry for |kUKMDeveloperEngagementEntryName| and another entry |
+ // for |kUKMFormInteractionsEntryName|. Both entries are for the same URL. |
+ ASSERT_EQ(2U, ukm_service->entries_count()); |
+ ASSERT_EQ(2U, ukm_service->sources_count()); |
+ VerifyDeveloperEngagementUkm( |
+ form, ukm_service, |
+ AutofillMetrics::FILLABLE_FORM_PARSED_WITH_TYPE_HINTS); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::FORMS_LOADED}}); |
} |
} |
@@ -1682,29 +1723,20 @@ TEST_F(AutofillMetricsTest, UkmDeveloperEngagement_LogUpiVpaTypeHint) { |
std::vector<FormData> forms(1, form); |
- // Expect the "upi-vpa hint" metric to be logged. |
+ // Expect the "upi-vpa hint" metric to be logged and the "form loaded" form |
+ // interaction event to be logged. |
{ |
autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
autofill_manager_->Reset(); |
- ASSERT_EQ(1U, ukm_service->sources_count()); |
- const ukm::UkmSource* source = |
- ukm_service->GetSourceForUrl(form.origin.spec().c_str()); |
- ASSERT_NE(nullptr, source); |
- |
- ASSERT_EQ(1U, ukm_service->entries_count()); |
- const ukm::UkmEntry* entry = ukm_service->GetEntry(0); |
- EXPECT_EQ(source->id(), entry->source_id()); |
- |
- ukm::Entry entry_proto; |
- entry->PopulateProto(&entry_proto); |
- EXPECT_EQ(source->id(), entry_proto.source_id()); |
- EXPECT_EQ(base::HashMetricName(internal::kUKMDeveloperEngagementEntryName), |
- entry_proto.event_hash()); |
- const ukm::Entry_Metric* metric = FindMetric( |
- internal::kUKMDeveloperEngagementMetricName, entry_proto.metrics()); |
- ASSERT_NE(nullptr, metric); |
- EXPECT_EQ(AutofillMetrics::FORM_CONTAINS_UPI_VPA_HINT, metric->value()); |
+ ASSERT_EQ(2U, ukm_service->entries_count()); |
+ ASSERT_EQ(2U, ukm_service->sources_count()); |
+ VerifyDeveloperEngagementUkm(form, ukm_service, |
+ AutofillMetrics::FORM_CONTAINS_UPI_VPA_HINT); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::FORMS_LOADED}}); |
} |
} |
@@ -1887,6 +1919,9 @@ TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { |
// Test that the credit card checkout flow user actions are correctly logged. |
TEST_F(AutofillMetricsTest, CreditCardCheckoutFlowUserActions) { |
+ EnableUkmLogging(); |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ |
personal_data_->RecreateCreditCards( |
true /* include_local_credit_card */, |
false /* include_masked_server_credit_card */, |
@@ -1962,10 +1997,31 @@ TEST_F(AutofillMetricsTest, CreditCardCheckoutFlowUserActions) { |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_NonFillable")); |
} |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ // Expect 2 |FORM_EVENT_LOCAL_SUGGESTION_FILLED| events. First, from |
+ // call to |external_delegate_->DidAcceptSuggestion|. Second, from call to |
+ // |autofill_manager_->FillOrPreviewForm|. |
+ // Expect |NON_FILLABLE_FORM_OR_NEW_DATA| in |AutofillFormSubmittedState| |
+ // because |field.value| is empty in |DeterminePossibleFieldTypesForUpload|. |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
} |
// Test that the profile checkout flow user actions are correctly logged. |
TEST_F(AutofillMetricsTest, ProfileCheckoutFlowUserActions) { |
+ EnableUkmLogging(); |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ |
// Create a profile. |
personal_data_->RecreateProfile(); |
@@ -2013,7 +2069,7 @@ TEST_F(AutofillMetricsTest, ProfileCheckoutFlowUserActions) { |
std::string guid("00000000-0000-0000-0000-000000000001"); // local profile. |
external_delegate_->DidAcceptSuggestion( |
ASCIIToUTF16("Test"), |
- autofill_manager_->MakeFrontendID(guid, std::string()), 0); |
+ autofill_manager_->MakeFrontendID(std::string(), guid), 0); |
EXPECT_EQ(1, |
user_action_tester.GetActionCount("Autofill_SelectedSuggestion")); |
} |
@@ -2039,6 +2095,24 @@ TEST_F(AutofillMetricsTest, ProfileCheckoutFlowUserActions) { |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_NonFillable")); |
} |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ // Expect 2 |FORM_EVENT_LOCAL_SUGGESTION_FILLED| events. First, from |
+ // call to |external_delegate_->DidAcceptSuggestion|. Second, from call to |
+ // |autofill_manager_->FillOrPreviewForm|. |
+ // Expect |NON_FILLABLE_FORM_OR_NEW_DATA| in |AutofillFormSubmittedState| |
+ // because |field.value| is empty in |DeterminePossibleFieldTypesForUpload|. |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
} |
// Tests that the Autofill_PolledCreditCardSuggestions user action is only |
@@ -2328,6 +2402,11 @@ TEST_F(AutofillMetricsTest, CreditCardShownFormEvents) { |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN_ONCE, 0); |
} |
+ |
+ // UKM must not be logged unless enabled. |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ EXPECT_EQ(0U, ukm_service->sources_count()); |
+ EXPECT_EQ(0U, ukm_service->entries_count()); |
} |
// Test that we log selected form event for credit cards. |
@@ -2593,6 +2672,9 @@ TEST_F(AutofillMetricsTest, CreditCardGetRealPanDuration) { |
// Test that we log submitted form events for credit cards. |
TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
+ EnableUkmLogging(); |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ |
EnableWalletSync(); |
// Creating all kinds of cards. |
personal_data_->RecreateCreditCards( |
@@ -2632,6 +2714,14 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Reset the autofill manager state. |
@@ -2650,6 +2740,16 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_SUGGESTION_SHOWN_WILL_SUBMIT_ONCE, 1); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Reset the autofill manager state. |
@@ -2671,6 +2771,16 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_SUBMITTED_ONCE, 1); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Reset the autofill manager state. |
@@ -2693,6 +2803,16 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_SUBMITTED_ONCE, 1); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Reset the autofill manager state. |
@@ -2709,6 +2829,7 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
autofill_manager_->MakeFrontendID(guid, std::string())); |
autofill_manager_->OnDidGetRealPan(AutofillClient::SUCCESS, |
"6011000990139424"); |
+ autofill_manager_->SubmitForm(form, TimeTicks::Now()); |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED, 1); |
@@ -2716,8 +2837,24 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED_ONCE, |
1); |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsUnmaskPromptEventMetricName, |
+ AutofillMetrics::UNMASK_PROMPT_SHOWN}, |
+ {internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SELECTED}, |
+ {internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ |
// Recreating cards as the previous test should have upgraded the masked |
// card to a full card. |
personal_data_->RecreateCreditCards( |
@@ -2725,8 +2862,6 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
true /* include_masked_server_credit_card */, |
true /* include_full_server_credit_card */); |
- // Reset the autofill manager state. |
- autofill_manager_->Reset(); |
autofill_manager_->AddSeenForm(form, field_types, field_types); |
{ |
@@ -2734,7 +2869,25 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
base::HistogramTester histogram_tester; |
autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::RectF()); |
autofill_manager_->SubmitForm(form, TimeTicks::Now()); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
+ |
autofill_manager_->SubmitForm(form, TimeTicks::Now()); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
+ |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.CreditCard", |
AutofillMetrics::FORM_EVENT_NO_SUGGESTION_WILL_SUBMIT_ONCE, 1); |
@@ -2815,6 +2968,16 @@ TEST_F(AutofillMetricsTest, CreditCardSubmittedFormEvents) { |
AutofillMetrics:: |
FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_WILL_SUBMIT_ONCE, |
0); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsCreditCardFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
} |
@@ -3236,6 +3399,9 @@ TEST_F(AutofillMetricsTest, AddressFilledFormEvents) { |
// Test that we log submitted form events for address. |
TEST_F(AutofillMetricsTest, AddressSubmittedFormEvents) { |
+ EnableUkmLogging(); |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ |
EnableWalletSync(); |
// Create a profile. |
personal_data_->RecreateProfile(); |
@@ -3272,6 +3438,14 @@ TEST_F(AutofillMetricsTest, AddressSubmittedFormEvents) { |
histogram_tester.ExpectBucketCount( |
"Autofill.FormEvents.Address", |
AutofillMetrics::FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Reset the autofill manager state. |
@@ -3729,7 +3903,6 @@ TEST_F(AutofillMetricsTest, AddressFormEventsAreSegmented) { |
} |
} |
- |
// Test that we log that Autofill is enabled when filling a form. |
TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) { |
base::HistogramTester histogram_tester; |
@@ -3768,6 +3941,9 @@ TEST_F(AutofillMetricsTest, DaysSinceLastUse_Profile) { |
// Verify that we correctly log the submitted form's state. |
TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
+ EnableUkmLogging(); |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ |
// Start with a form with insufficiently many fields. |
FormData form; |
form.name = ASCIIToUTF16("TestForm"); |
@@ -3802,6 +3978,21 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA, 1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_NonFillable")); |
+ |
+ // Expect an entry for |kUKMDeveloperEngagementEntryName| and another entry |
+ // for |kUKMFormInteractionsEntryName|. Both entries are for the same URL. |
+ ASSERT_EQ(2U, ukm_service->entries_count()); |
+ ASSERT_EQ(2U, ukm_service->sources_count()); |
+ VerifyDeveloperEngagementUkm( |
+ form, ukm_service, |
+ AutofillMetrics::FILLABLE_FORM_PARSED_WITHOUT_TYPE_HINTS); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::FORMS_LOADED}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Non fillable form. |
@@ -3818,6 +4009,14 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA, 1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_NonFillable")); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
// Fill in the third field. |
@@ -3835,6 +4034,15 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_FilledNone_SuggestionsNotShown")); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics:: |
+ FILLABLE_FORM_AUTOFILLED_NONE_DID_NOT_SHOW_SUGGESTIONS}}); |
+ ukm_service->Purge(); |
} |
// Autofilled none with suggestions shown. |
@@ -3848,6 +4056,17 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
AutofillMetrics::FILLABLE_FORM_AUTOFILLED_NONE_DID_SHOW_SUGGESTIONS, 1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_FilledNone_SuggestionsShown")); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics:: |
+ FILLABLE_FORM_AUTOFILLED_NONE_DID_SHOW_SUGGESTIONS}}); |
+ ukm_service->Purge(); |
} |
// Mark one of the fields as autofilled. |
@@ -3864,6 +4083,14 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
AutofillMetrics::FILLABLE_FORM_AUTOFILLED_SOME, 1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_FilledSome")); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::FILLABLE_FORM_AUTOFILLED_SOME}}); |
+ ukm_service->Purge(); |
} |
// Mark all of the fillable fields as autofilled. |
@@ -3881,6 +4108,14 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
AutofillMetrics::FILLABLE_FORM_AUTOFILLED_ALL, 1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_FilledAll")); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::FILLABLE_FORM_AUTOFILLED_ALL}}); |
+ ukm_service->Purge(); |
} |
// Clear out the third field's value. |
@@ -3897,12 +4132,23 @@ TEST_F(AutofillMetricsTest, AutofillFormSubmittedState) { |
AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA, 1); |
EXPECT_EQ(1, user_action_tester.GetActionCount( |
"Autofill_FormSubmitted_NonFillable")); |
+ |
+ ASSERT_EQ(1U, ukm_service->entries_count()); |
+ ASSERT_EQ(1U, ukm_service->sources_count()); |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName, |
+ AutofillMetrics::NON_FILLABLE_FORM_OR_NEW_DATA}}); |
+ ukm_service->Purge(); |
} |
} |
// Verify that we correctly log user happiness metrics dealing with form |
// interaction. |
TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { |
+ EnableUkmLogging(); |
+ ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); |
+ |
// Load a fillable form. |
FormData form; |
form.name = ASCIIToUTF16("TestForm"); |
@@ -4002,6 +4248,30 @@ TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { |
"Autofill.UserHappiness", |
AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD, 1); |
} |
+ |
+ autofill_manager_->Reset(); |
+ |
+ // Verify UKM logs. |
+ VerifyFormInteractionsUkm( |
+ form, ukm_service, |
+ {{internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::FORMS_LOADED}, |
+ {internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::USER_DID_TYPE}, |
+ {internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN}, |
+ {internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::USER_DID_AUTOFILL}, |
+ {internal::kUKMFormInteractionsAddressFormEventMetricName, |
+ AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED}, |
+ {internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD}, |
+ {internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::USER_DID_AUTOFILL}, |
+ {internal::kUKMFormInteractionsUserHappinessMetricMetricName, |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD}}); |
} |
// Verify that we correctly log metrics tracking the duration of form fill. |
@@ -4579,7 +4849,7 @@ TEST_F(AutofillMetricsTest, RecordCardUploadDecisionMetric) { |
ukm::UkmServiceTestingHarness ukm_service_test_harness; |
GURL url("https://www.google.com"); |
int upload_decision = 1; |
- std::map<std::string, int> metrics = { |
+ std::vector<std::pair<const char*, int>> metrics = { |
{internal::kUKMCardUploadDecisionMetricName, upload_decision}}; |
EXPECT_TRUE(AutofillMetrics::LogUkm( |
@@ -4620,7 +4890,7 @@ TEST_F(AutofillMetricsTest, RecordDeveloperEngagementMetric) { |
ukm::UkmServiceTestingHarness ukm_service_test_harness; |
GURL url("https://www.google.com"); |
int form_structure_metric = 1; |
- std::map<std::string, int> metrics = { |
+ std::vector<std::pair<const char*, int>> metrics = { |
{internal::kUKMDeveloperEngagementMetricName, form_structure_metric}}; |
EXPECT_TRUE(AutofillMetrics::LogUkm( |
@@ -4660,7 +4930,7 @@ TEST_F(AutofillMetricsTest, RecordCardUploadDecisionMetric_InvalidUrl) { |
EnableUkmLogging(); |
ukm::UkmServiceTestingHarness ukm_service_test_harness; |
GURL url(""); |
- std::map<std::string, int> metrics = {{"metric", 1}}; |
+ std::vector<std::pair<const char*, int>> metrics = {{"metric", 1}}; |
EXPECT_FALSE(AutofillMetrics::LogUkm( |
ukm_service_test_harness.test_ukm_service(), url, "test_ukm", metrics)); |
@@ -4672,7 +4942,7 @@ TEST_F(AutofillMetricsTest, RecordCardUploadDecisionMetric_NoMetrics) { |
EnableUkmLogging(); |
ukm::UkmServiceTestingHarness ukm_service_test_harness; |
GURL url("https://www.google.com"); |
- std::map<std::string, int> metrics; |
+ std::vector<std::pair<const char*, int>> metrics; |
EXPECT_FALSE(AutofillMetrics::LogUkm( |
ukm_service_test_harness.test_ukm_service(), url, "test_ukm", metrics)); |
@@ -4684,7 +4954,7 @@ TEST_F(AutofillMetricsTest, RecordCardUploadDecisionMetric_NoUkmService) { |
EnableUkmLogging(); |
ukm::UkmServiceTestingHarness ukm_service_test_harness; |
GURL url("https://www.google.com"); |
- std::map<std::string, int> metrics = {{"metric", 1}}; |
+ std::vector<std::pair<const char*, int>> metrics = {{"metric", 1}}; |
EXPECT_FALSE(AutofillMetrics::LogUkm(nullptr, url, "test_ukm", metrics)); |
ASSERT_EQ(0U, ukm_service_test_harness.test_ukm_service()->sources_count()); |
@@ -4694,7 +4964,7 @@ TEST_F(AutofillMetricsTest, RecordCardUploadDecisionMetric_NoUkmService) { |
TEST_F(AutofillMetricsTest, RecordCardUploadDecisionMetric_FeatureDisabled) { |
ukm::UkmServiceTestingHarness ukm_service_test_harness; |
GURL url("https://www.google.com"); |
- std::map<std::string, int> metrics = {{"metric", 1}}; |
+ std::vector<std::pair<const char*, int>> metrics = {{"metric", 1}}; |
EXPECT_FALSE(AutofillMetrics::LogUkm( |
ukm_service_test_harness.test_ukm_service(), url, "test_ukm", metrics)); |