| 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 f3cf2006b1ac6c27f43c08654179e51bc4bea717..af71b6c9b660b925590f67829c0d2d28cfc4dbfd 100644 | 
| --- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc | 
| +++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc | 
| @@ -5,6 +5,7 @@ | 
| #include <utility> | 
| #include <vector> | 
|  | 
| +#include "base/command_line.h" | 
| #include "base/files/file_util.h" | 
| #include "base/files/scoped_temp_dir.h" | 
| #include "base/guid.h" | 
| @@ -21,6 +22,8 @@ | 
| #include "components/autofill/core/browser/webdata/autofill_change.h" | 
| #include "components/autofill/core/browser/webdata/autofill_entry.h" | 
| #include "components/autofill/core/browser/webdata/autofill_table.h" | 
| +#include "components/autofill/core/common/autofill_switches.h" | 
| +#include "components/autofill/core/common/autofill_util.h" | 
| #include "components/autofill/core/common/form_field_data.h" | 
| #include "components/os_crypt/os_crypt.h" | 
| #include "components/webdata/common/web_database.h" | 
| @@ -1856,4 +1859,60 @@ TEST_F(AutofillTableTest, DeleteUnmaskedCard) { | 
| outputs.clear(); | 
| } | 
|  | 
| +TEST_F(AutofillTableTest, GetFormValuesForElementName_SubstringMatchEnabled) { | 
| +  // Token matching is currently behind a flag. | 
| +  base::CommandLine::ForCurrentProcess()->AppendSwitch( | 
| +      autofill::switches::kEnableSuggestionsWithSubstringMatch); | 
| + | 
| +  const size_t kMaxCount = 2; | 
| +  const struct { | 
| +    const char* const field_suggestion[kMaxCount]; | 
| +    const char* const field_contents; | 
| +    size_t expected_suggestion_count; | 
| +    const char* const expected_suggestion[kMaxCount]; | 
| +  } kTestCases[] = { | 
| +      {{"user.test", "test_user"}, "TEST",   2, {"test_user", "user.test"}}, | 
| +      {{"user test", "test-user"}, "user",   2, {"user test", "test-user"}}, | 
| +      {{"user test", "test-rest"}, "user",   1, {"user test", nullptr}}, | 
| +      {{"user@test", "test_user"}, "user@t", 1, {"user@test", nullptr}}, | 
| +      {{"user.test", "test_user"}, "er.tes", 0, {nullptr,     nullptr}}, | 
| +      {{"user test", "test_user"}, "_ser",   0, {nullptr,     nullptr}}, | 
| +      {{"user.test", "test_user"}, "%ser",   0, {nullptr,     nullptr}}, | 
| +      {{"user.test", "test_user"}, | 
| +       "; DROP TABLE autofill;", | 
| +       0, | 
| +       {nullptr, nullptr}}, | 
| +  }; | 
| + | 
| +  for (size_t i = 0; i < arraysize(kTestCases); ++i) { | 
| +    SCOPED_TRACE(testing::Message() | 
| +                 << "suggestion = " << kTestCases[i].field_suggestion[0] | 
| +                 << ", contents = " << kTestCases[i].field_contents); | 
| + | 
| +    Time t1 = Time::Now(); | 
| + | 
| +    // Simulate the submission of a handful of entries in a field called "Name". | 
| +    AutofillChangeList changes; | 
| +    FormFieldData field; | 
| +    for (size_t k = 0; k < kMaxCount; ++k) { | 
| +      field.name = ASCIIToUTF16("Name"); | 
| +      field.value = ASCIIToUTF16(kTestCases[i].field_suggestion[k]); | 
| +      table_->AddFormFieldValue(field, &changes); | 
| +    } | 
| + | 
| +    std::vector<base::string16> v; | 
| +    table_->GetFormValuesForElementName( | 
| +        ASCIIToUTF16("Name"), ASCIIToUTF16(kTestCases[i].field_contents), &v, | 
| +        6); | 
| + | 
| +    EXPECT_EQ(kTestCases[i].expected_suggestion_count, v.size()); | 
| +    for (size_t j = 0; j < kTestCases[i].expected_suggestion_count; ++j) { | 
| +      EXPECT_EQ(ASCIIToUTF16(kTestCases[i].expected_suggestion[j]), v[j]); | 
| +    } | 
| + | 
| +    changes.clear(); | 
| +    table_->RemoveFormElementsAddedBetween(t1, Time(), &changes); | 
| +  } | 
| +} | 
| + | 
| }  // namespace autofill | 
|  |