[Autofill] Credit Card validation for rAc.

Validate all things credit card. (Number, CSC, Expiration)
BUG=170467


Review URL: https://chromiumcodereview.appspot.com/12213077

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@181861 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/autofill/validation.cc b/chrome/browser/autofill/validation.cc
index ad34b312..a0072111 100644
--- a/chrome/browser/autofill/validation.cc
+++ b/chrome/browser/autofill/validation.cc
@@ -45,4 +45,17 @@
   return (sum % 10) == 0;
 }
 
+bool IsValidCreditCardSecurityCode(const string16& text) {
+  if (text.size() < 3U || text.size() > 4U)
+    return false;
+
+  for (string16::const_iterator iter = text.begin();
+       iter != text.end();
+       ++iter) {
+    if (!IsAsciiDigit(*iter))
+      return false;
+  }
+  return true;
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/autofill/validation.h b/chrome/browser/autofill/validation.h
index f8e923b..93557b7 100644
--- a/chrome/browser/autofill/validation.h
+++ b/chrome/browser/autofill/validation.h
@@ -13,6 +13,9 @@
 // Uses the Luhn formula to validate the number.
 bool IsValidCreditCardNumber(const string16& text);
 
+// Returns true if |text| looks like a valid credit card security code.
+bool IsValidCreditCardSecurityCode(const string16& text);
+
 }  // namespace autofill
 
 #endif  // CHROME_BROWSER_AUTOFILL_VALIDATION_H_
diff --git a/chrome/browser/autofill/validation_unittest.cc b/chrome/browser/autofill/validation_unittest.cc
index bb94a0f..6e67b861 100644
--- a/chrome/browser/autofill/validation_unittest.cc
+++ b/chrome/browser/autofill/validation_unittest.cc
@@ -34,7 +34,15 @@
   "4111-1111-1111-1110", /* wrong Luhn checksum */
   "3056 9309 0259 04aa", /* non-digit characters */
 };
-
+const char* const kValidCreditCardSecurityCode[] = {
+  "323",  // 3-digit CSC.
+  "3234",  // 4-digit CSC.
+};
+const char* const kInvalidCreditCardSecurityCode[] = {
+  "32",  // CSC too short.
+  "12345",  // CSC too long.
+  "asd",  // non-numeric CSC.
+};
 }  // namespace
 
 TEST(AutofillValidation, IsValidCreditCardNumber) {
@@ -49,3 +57,19 @@
         autofill::IsValidCreditCardNumber(ASCIIToUTF16(kInvalidNumbers[i])));
   }
 }
+
+TEST(AutofillValidation, IsValidCreditCardSecurityCode) {
+  for (size_t i = 0; i < arraysize(kValidCreditCardSecurityCode); ++i) {
+    SCOPED_TRACE(kValidCreditCardSecurityCode[i]);
+    EXPECT_TRUE(
+        autofill::IsValidCreditCardSecurityCode(
+            ASCIIToUTF16(kValidCreditCardSecurityCode[i])));
+  }
+  for (size_t i = 0; i < arraysize(kInvalidCreditCardSecurityCode); ++i) {
+    SCOPED_TRACE(kInvalidCreditCardSecurityCode[i]);
+    EXPECT_FALSE(
+        autofill::IsValidCreditCardSecurityCode(
+            ASCIIToUTF16(kInvalidCreditCardSecurityCode[i])));
+  }
+}
+