| Index: components/autofill/core/browser/autofill_manager_unittest.cc | 
| diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc | 
| index 34bdd02ef311740ebecfcb5bd2ca7f9846c01ec6..e9d94a48d4007bdfa171308b4ec47b95e6fa3aa5 100644 | 
| --- a/components/autofill/core/browser/autofill_manager_unittest.cc | 
| +++ b/components/autofill/core/browser/autofill_manager_unittest.cc | 
| @@ -1032,6 +1032,11 @@ class AutofillManagerTest : public testing::Test { | 
| scoped_feature_list_.InitAndEnableFeature(kAutofillUkmLogging); | 
| } | 
|  | 
| +  void EnableAutofillUpstreamRequestCvcIfMissingExperimentAndUkmLogging() { | 
| +    scoped_feature_list_.InitWithFeatures( | 
| +        {kAutofillUpstreamRequestCvcIfMissing, kAutofillUkmLogging}, {}); | 
| +  } | 
| + | 
| void ExpectUniqueFillableFormParsedUkm() { | 
| ukm::TestUkmService* ukm_service = autofill_client_.GetTestUkmService(); | 
|  | 
| @@ -4842,6 +4847,145 @@ TEST_F(AutofillManagerTest, MAYBE_UploadCreditCard_MultipleCvcFields) { | 
|  | 
| // TODO(crbug.com/666704): Flaky on android_n5x_swarming_rel bot. | 
| #if defined(OS_ANDROID) | 
| +#define MAYBE_UploadCreditCard_NoCvcFieldOnForm \ | 
| +  DISABLED_UploadCreditCard_NoCvcFieldOnForm | 
| +#else | 
| +#define MAYBE_UploadCreditCard_NoCvcFieldOnForm \ | 
| +  UploadCreditCard_NoCvcFieldOnForm | 
| +#endif | 
| +TEST_F(AutofillManagerTest, MAYBE_UploadCreditCard_NoCvcFieldOnForm) { | 
| +  EnableAutofillUpstreamRequestCvcIfMissingExperimentAndUkmLogging(); | 
| +  autofill_manager_->set_credit_card_upload_enabled(true); | 
| + | 
| +  // Remove the profiles that were created in the TestPersonalDataManager | 
| +  // constructor because they would result in conflicting names that would | 
| +  // prevent the upload. | 
| +  personal_data_.ClearAutofillProfiles(); | 
| + | 
| +  // Create, fill and submit an address form in order to establish a recent | 
| +  // profile which can be selected for the upload request. | 
| +  FormData address_form; | 
| +  test::CreateTestAddressFormData(&address_form); | 
| +  FormsSeen(std::vector<FormData>(1, address_form)); | 
| +  ManuallyFillAddressForm("Flo", "Master", "77401", "US", &address_form); | 
| +  FormSubmitted(address_form); | 
| + | 
| +  // Set up our credit card form data.  Note that CVC field is missing. | 
| +  FormData credit_card_form; | 
| +  credit_card_form.name = ASCIIToUTF16("MyForm"); | 
| +  credit_card_form.origin = GURL("https://myform.com/form.html"); | 
| +  credit_card_form.action = GURL("https://myform.com/submit.html"); | 
| + | 
| +  FormFieldData field; | 
| +  test::CreateTestFormField("Card Name", "cardname", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| +  test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| +  test::CreateTestFormField("Expiration Month", "ccmonth", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| +  test::CreateTestFormField("Expiration Year", "ccyear", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| + | 
| +  FormsSeen(std::vector<FormData>(1, credit_card_form)); | 
| + | 
| +  // Edit the data, and submit. | 
| +  credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master"); | 
| +  credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111"); | 
| +  credit_card_form.fields[2].value = ASCIIToUTF16("11"); | 
| +  credit_card_form.fields[3].value = ASCIIToUTF16("2017"); | 
| + | 
| +  base::HistogramTester histogram_tester; | 
| + | 
| +  // Upload should still happen as long as the user provides CVC in the bubble. | 
| +  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_, _)).Times(0); | 
| +  FormSubmitted(credit_card_form); | 
| +  EXPECT_TRUE(autofill_manager_->credit_card_was_uploaded()); | 
| + | 
| +  // Verify that the correct histogram entry (and only that) was logged. | 
| +  histogram_tester.ExpectUniqueSample("Autofill.CardUploadDecisionExpanded", | 
| +                                      AutofillMetrics::UPLOAD_OFFERED_NO_CVC, | 
| +                                      1); | 
| +  // Verify that the correct UKM was logged. | 
| +  ExpectCardUploadDecisionUkm(AutofillMetrics::UPLOAD_OFFERED_NO_CVC); | 
| +} | 
| + | 
| +// TODO(crbug.com/666704): Flaky on android_n5x_swarming_rel bot. | 
| +#if defined(OS_ANDROID) | 
| +#define MAYBE_UploadCreditCard_NoCvcFieldOnFormExperimentOff \ | 
| +  DISABLED_UploadCreditCard_NoCvcFieldOnFormExperimentOff | 
| +#else | 
| +#define MAYBE_UploadCreditCard_NoCvcFieldOnFormExperimentOff \ | 
| +  UploadCreditCard_NoCvcFieldOnFormExperimentOff | 
| +#endif | 
| +TEST_F(AutofillManagerTest, | 
| +       MAYBE_UploadCreditCard_NoCvcFieldOnFormExperimentOff) { | 
| +  EnableUkmLogging(); | 
| +  autofill_manager_->set_credit_card_upload_enabled(true); | 
| + | 
| +  // Remove the profiles that were created in the TestPersonalDataManager | 
| +  // constructor because they would result in conflicting names that would | 
| +  // prevent the upload. | 
| +  personal_data_.ClearAutofillProfiles(); | 
| + | 
| +  // Create, fill and submit an address form in order to establish a recent | 
| +  // profile which can be selected for the upload request. | 
| +  FormData address_form; | 
| +  test::CreateTestAddressFormData(&address_form); | 
| +  FormsSeen(std::vector<FormData>(1, address_form)); | 
| +  ManuallyFillAddressForm("Flo", "Master", "77401", "US", &address_form); | 
| +  FormSubmitted(address_form); | 
| + | 
| +  // Set up our credit card form data.  Note that CVC field is missing. | 
| +  FormData credit_card_form; | 
| +  credit_card_form.name = ASCIIToUTF16("MyForm"); | 
| +  credit_card_form.origin = GURL("https://myform.com/form.html"); | 
| +  credit_card_form.action = GURL("https://myform.com/submit.html"); | 
| + | 
| +  FormFieldData field; | 
| +  test::CreateTestFormField("Card Name", "cardname", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| +  test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| +  test::CreateTestFormField("Expiration Month", "ccmonth", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| +  test::CreateTestFormField("Expiration Year", "ccyear", "", "text", &field); | 
| +  credit_card_form.fields.push_back(field); | 
| + | 
| +  FormsSeen(std::vector<FormData>(1, credit_card_form)); | 
| + | 
| +  // Edit the data, and submit. | 
| +  credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master"); | 
| +  credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111"); | 
| +  credit_card_form.fields[2].value = ASCIIToUTF16("11"); | 
| +  credit_card_form.fields[3].value = ASCIIToUTF16("2017"); | 
| + | 
| +  base::HistogramTester histogram_tester; | 
| + | 
| +  // Neither a local save nor an upload should happen in this case. | 
| +  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_, _)).Times(0); | 
| +  FormSubmitted(credit_card_form); | 
| +  EXPECT_FALSE(autofill_manager_->credit_card_was_uploaded()); | 
| + | 
| +  // Verify that the correct histogram entry (and only that) was logged. | 
| +  histogram_tester.ExpectUniqueSample( | 
| +      "Autofill.CardUploadDecisionExpanded", | 
| +      AutofillMetrics::UPLOAD_NOT_OFFERED_NO_CVC, 1); | 
| +  // Verify that the correct UKM was logged. | 
| +  ExpectCardUploadDecisionUkm(AutofillMetrics::UPLOAD_NOT_OFFERED_NO_CVC); | 
| + | 
| +  rappor::TestRapporServiceImpl* rappor_service = | 
| +      autofill_client_.test_rappor_service(); | 
| +  EXPECT_EQ(1, rappor_service->GetReportsCount()); | 
| +  std::string sample; | 
| +  rappor::RapporType type; | 
| +  EXPECT_TRUE(rappor_service->GetRecordedSampleForMetric( | 
| +      "Autofill.CardUploadNotOfferedNoCvc", &sample, &type)); | 
| +  EXPECT_EQ("myform.com", sample); | 
| +  EXPECT_EQ(rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, type); | 
| +} | 
| + | 
| +// TODO(crbug.com/666704): Flaky on android_n5x_swarming_rel bot. | 
| +#if defined(OS_ANDROID) | 
| #define MAYBE_UploadCreditCard_NoProfileAvailable DISABLED_UploadCreditCard_NoProfileAvailable | 
| #else | 
| #define MAYBE_UploadCreditCard_NoProfileAvailable UploadCreditCard_NoProfileAvailable | 
|  |