Index: components/autofill/core/browser/webdata/autofill_table_unittest.cc |
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc |
index daae45482663babf45486e366648ede229fa7291..89b22c9c5c8e928cde749953f6637ce7b8e26c7c 100644 |
--- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc |
+++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc |
@@ -8,6 +8,7 @@ |
#include "base/files/file_util.h" |
#include "base/files/scoped_temp_dir.h" |
#include "base/guid.h" |
+#include "base/memory/scoped_vector.h" |
#include "base/stl_util.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
@@ -1791,4 +1792,77 @@ TEST_F(AutofillTableTest, SetServerProfile) { |
outputs.clear(); |
} |
+// Tests that deleting time ranges re-masks server credit cards that were |
+// unmasked in that time. |
+TEST_F(AutofillTableTest, DeleteUnmaskedCard) { |
+ // This isn't the exact unmasked time, since the database will use the |
+ // current time that it is called. The code below has to be approximate. |
+ base::Time unmasked_time = base::Time::Now(); |
+ |
+ // Add a masked card. |
+ base::string16 masked_number = ASCIIToUTF16("1111"); |
+ CreditCard masked_card(CreditCard::MASKED_SERVER_CARD, "a123"); |
+ masked_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Paul F. Tompkins")); |
+ masked_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("1")); |
+ masked_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2020")); |
+ masked_card.SetRawInfo(CREDIT_CARD_NUMBER, masked_number); |
+ masked_card.SetTypeForMaskedCard(kVisaCard); |
+ |
+ std::vector<CreditCard> inputs; |
+ inputs.push_back(masked_card); |
+ table_->SetServerCreditCards(inputs); |
+ |
+ // Unmask it. |
+ base::string16 full_number = ASCIIToUTF16("4111111111111111"); |
+ table_->UnmaskServerCreditCard(masked_card.server_id(), full_number); |
+ |
+ // Delete data in a range a year in the future. |
+ std::vector<std::string> profile_guids; |
+ std::vector<std::string> credit_card_guids; |
+ ASSERT_TRUE(table_->RemoveAutofillDataModifiedBetween( |
+ unmasked_time + base::TimeDelta::FromDays(365), |
+ unmasked_time + base::TimeDelta::FromDays(530), |
+ &profile_guids, &credit_card_guids)); |
+ |
+ // This should not affect the unmasked card (should be unmasked). |
+ ScopedVector<CreditCard> outputs; |
+ ASSERT_TRUE(table_->GetServerCreditCards(&outputs.get())); |
+ ASSERT_EQ(1u, outputs.size()); |
+ EXPECT_EQ(CreditCard::FULL_SERVER_CARD, outputs[0]->record_type()); |
+ EXPECT_EQ(full_number, outputs[0]->GetRawInfo(CREDIT_CARD_NUMBER)); |
+ outputs.clear(); |
+ |
+ // Delete data in the range of the last 24 hours. |
+ base::Time now = base::Time::Now(); |
+ ASSERT_TRUE(table_->RemoveAutofillDataModifiedBetween( |
+ now - base::TimeDelta::FromDays(1), now, |
+ &profile_guids, &credit_card_guids)); |
+ |
+ // This should re-mask. |
+ ASSERT_TRUE(table_->GetServerCreditCards(&outputs.get())); |
+ ASSERT_EQ(1u, outputs.size()); |
+ EXPECT_EQ(CreditCard::MASKED_SERVER_CARD, outputs[0]->record_type()); |
+ EXPECT_EQ(masked_number, outputs[0]->GetRawInfo(CREDIT_CARD_NUMBER)); |
+ outputs.clear(); |
+ |
+ // Unmask again, the card should be back. |
+ table_->UnmaskServerCreditCard(masked_card.server_id(), full_number); |
+ ASSERT_TRUE(table_->GetServerCreditCards(&outputs.get())); |
+ ASSERT_EQ(1u, outputs.size()); |
+ EXPECT_EQ(CreditCard::FULL_SERVER_CARD, outputs[0]->record_type()); |
+ EXPECT_EQ(full_number, outputs[0]->GetRawInfo(CREDIT_CARD_NUMBER)); |
+ outputs.clear(); |
+ |
+ // Delete all data. |
+ ASSERT_TRUE(table_->RemoveAutofillDataModifiedBetween( |
+ base::Time(), base::Time::Max(), &profile_guids, &credit_card_guids)); |
+ |
+ // Should be masked again. |
+ ASSERT_TRUE(table_->GetServerCreditCards(&outputs.get())); |
+ ASSERT_EQ(1u, outputs.size()); |
+ EXPECT_EQ(CreditCard::MASKED_SERVER_CARD, outputs[0]->record_type()); |
+ EXPECT_EQ(masked_number, outputs[0]->GetRawInfo(CREDIT_CARD_NUMBER)); |
+ outputs.clear(); |
+} |
+ |
} // namespace autofill |