Home | History | Annotate | Download | only in autofill
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/files/file_path.h"
      8 #include "base/path_service.h"
      9 #include "base/strings/string_util.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 #include "chrome/browser/ui/browser.h"
     12 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     13 #include "chrome/common/chrome_paths.h"
     14 #include "chrome/test/base/in_process_browser_test.h"
     15 #include "chrome/test/base/ui_test_utils.h"
     16 #include "components/autofill/content/browser/content_autofill_driver.h"
     17 #include "components/autofill/core/browser/autofill_manager.h"
     18 #include "components/autofill/core/browser/data_driven_test.h"
     19 #include "components/autofill/core/browser/form_structure.h"
     20 #include "url/gurl.h"
     21 
     22 namespace autofill {
     23 namespace {
     24 
     25 const base::FilePath::CharType kTestName[] = FILE_PATH_LITERAL("heuristics");
     26 
     27 // Convert the |html| snippet to a data URI.
     28 GURL HTMLToDataURI(const std::string& html) {
     29   return GURL(std::string("data:text/html;charset=utf-8,") + html);
     30 }
     31 
     32 const base::FilePath& GetTestDataDir() {
     33   CR_DEFINE_STATIC_LOCAL(base::FilePath, dir, ());
     34   if (dir.empty())
     35     PathService::Get(chrome::DIR_TEST_DATA, &dir);
     36   return dir;
     37 }
     38 
     39 }  // namespace
     40 
     41 // A data-driven test for verifying Autofill heuristics. Each input is an HTML
     42 // file that contains one or more forms. The corresponding output file lists the
     43 // heuristically detected type for eachfield.
     44 class FormStructureBrowserTest : public InProcessBrowserTest,
     45                                  public DataDrivenTest {
     46  protected:
     47   FormStructureBrowserTest();
     48   virtual ~FormStructureBrowserTest();
     49 
     50   // DataDrivenTest:
     51   virtual void GenerateResults(const std::string& input,
     52                                std::string* output) OVERRIDE;
     53 
     54   // Serializes the given |forms| into a string.
     55   std::string FormStructuresToString(const std::vector<FormStructure*>& forms);
     56 
     57  private:
     58   DISALLOW_COPY_AND_ASSIGN(FormStructureBrowserTest);
     59 };
     60 
     61 FormStructureBrowserTest::FormStructureBrowserTest()
     62     : DataDrivenTest(GetTestDataDir()) {
     63 }
     64 
     65 FormStructureBrowserTest::~FormStructureBrowserTest() {
     66 }
     67 
     68 void FormStructureBrowserTest::GenerateResults(const std::string& input,
     69                                                std::string* output) {
     70   ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
     71                                                        HTMLToDataURI(input)));
     72 
     73   ContentAutofillDriver* autofill_driver =
     74       ContentAutofillDriver::FromWebContents(
     75           browser()->tab_strip_model()->GetActiveWebContents());
     76   ASSERT_NE(static_cast<ContentAutofillDriver*>(NULL), autofill_driver);
     77   AutofillManager* autofill_manager = autofill_driver->autofill_manager();
     78   ASSERT_NE(static_cast<AutofillManager*>(NULL), autofill_manager);
     79   std::vector<FormStructure*> forms = autofill_manager->form_structures_.get();
     80   *output = FormStructureBrowserTest::FormStructuresToString(forms);
     81 }
     82 
     83 std::string FormStructureBrowserTest::FormStructuresToString(
     84     const std::vector<FormStructure*>& forms) {
     85   std::string forms_string;
     86   for (std::vector<FormStructure*>::const_iterator iter = forms.begin();
     87        iter != forms.end();
     88        ++iter) {
     89 
     90     for (std::vector<AutofillField*>::const_iterator field_iter =
     91             (*iter)->begin();
     92          field_iter != (*iter)->end();
     93          ++field_iter) {
     94       forms_string += (*field_iter)->Type().ToString();
     95       forms_string += " | " + base::UTF16ToUTF8((*field_iter)->name);
     96       forms_string += " | " + base::UTF16ToUTF8((*field_iter)->label);
     97       forms_string += " | " + base::UTF16ToUTF8((*field_iter)->value);
     98       forms_string += "\n";
     99     }
    100   }
    101   return forms_string;
    102 }
    103 
    104 // Heuristics tests timeout on Windows.  See http://crbug.com/85276
    105 // Also on ChromeOS/Aura. See crbug.com/173621
    106 // On Linux too. See crbug.com/323093
    107 #if defined(USE_AURA)
    108 #define MAYBE_DataDrivenHeuristics(n) DISABLED_DataDrivenHeuristics##n
    109 #else
    110 #define MAYBE_DataDrivenHeuristics(n) DataDrivenHeuristics##n
    111 #endif
    112 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, DataDrivenHeuristics00) {
    113   const base::FilePath::CharType kFileNamePattern[] =
    114       FILE_PATH_LITERAL("00_*.html");
    115   RunDataDrivenTest(GetInputDirectory(kTestName),
    116                     GetOutputDirectory(kTestName),
    117                     kFileNamePattern);
    118 }
    119 
    120 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, DataDrivenHeuristics01) {
    121   const base::FilePath::CharType kFileNamePattern[] =
    122       FILE_PATH_LITERAL("01_*.html");
    123   RunDataDrivenTest(GetInputDirectory(kTestName),
    124                     GetOutputDirectory(kTestName),
    125                     kFileNamePattern);
    126 }
    127 
    128 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    129     MAYBE_DataDrivenHeuristics(02)) {
    130   const base::FilePath::CharType kFileNamePattern[] =
    131       FILE_PATH_LITERAL("02_*.html");
    132   RunDataDrivenTest(GetInputDirectory(kTestName),
    133                     GetOutputDirectory(kTestName),
    134                     kFileNamePattern);
    135 }
    136 
    137 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    138     MAYBE_DataDrivenHeuristics(03)) {
    139   const base::FilePath::CharType kFileNamePattern[] =
    140       FILE_PATH_LITERAL("03_*.html");
    141   RunDataDrivenTest(GetInputDirectory(kTestName),
    142                     GetOutputDirectory(kTestName),
    143                     kFileNamePattern);
    144 }
    145 
    146 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    147     MAYBE_DataDrivenHeuristics(04)) {
    148   const base::FilePath::CharType kFileNamePattern[] =
    149       FILE_PATH_LITERAL("04_*.html");
    150   RunDataDrivenTest(GetInputDirectory(kTestName),
    151                     GetOutputDirectory(kTestName),
    152                     kFileNamePattern);
    153 }
    154 
    155 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    156     MAYBE_DataDrivenHeuristics(05)) {
    157   const base::FilePath::CharType kFileNamePattern[] =
    158       FILE_PATH_LITERAL("05_*.html");
    159   RunDataDrivenTest(GetInputDirectory(kTestName),
    160                     GetOutputDirectory(kTestName),
    161                     kFileNamePattern);
    162 }
    163 
    164 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    165     MAYBE_DataDrivenHeuristics(06)) {
    166   const base::FilePath::CharType kFileNamePattern[] =
    167       FILE_PATH_LITERAL("06_*.html");
    168   RunDataDrivenTest(GetInputDirectory(kTestName),
    169                     GetOutputDirectory(kTestName),
    170                     kFileNamePattern);
    171 }
    172 
    173 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    174     MAYBE_DataDrivenHeuristics(07)) {
    175   const base::FilePath::CharType kFileNamePattern[] =
    176       FILE_PATH_LITERAL("07_*.html");
    177   RunDataDrivenTest(GetInputDirectory(kTestName),
    178                     GetOutputDirectory(kTestName),
    179                     kFileNamePattern);
    180 }
    181 
    182 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    183     MAYBE_DataDrivenHeuristics(08)) {
    184   const base::FilePath::CharType kFileNamePattern[] =
    185       FILE_PATH_LITERAL("08_*.html");
    186   RunDataDrivenTest(GetInputDirectory(kTestName),
    187                     GetOutputDirectory(kTestName),
    188                     kFileNamePattern);
    189 }
    190 
    191 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    192     MAYBE_DataDrivenHeuristics(09)) {
    193   const base::FilePath::CharType kFileNamePattern[] =
    194       FILE_PATH_LITERAL("09_*.html");
    195   RunDataDrivenTest(GetInputDirectory(kTestName),
    196                     GetOutputDirectory(kTestName),
    197                     kFileNamePattern);
    198 }
    199 
    200 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    201     MAYBE_DataDrivenHeuristics(10)) {
    202   const base::FilePath::CharType kFileNamePattern[] =
    203       FILE_PATH_LITERAL("10_*.html");
    204   RunDataDrivenTest(GetInputDirectory(kTestName),
    205                     GetOutputDirectory(kTestName),
    206                     kFileNamePattern);
    207 }
    208 
    209 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    210     MAYBE_DataDrivenHeuristics(11)) {
    211   const base::FilePath::CharType kFileNamePattern[] =
    212       FILE_PATH_LITERAL("11_*.html");
    213   RunDataDrivenTest(GetInputDirectory(kTestName),
    214                     GetOutputDirectory(kTestName),
    215                     kFileNamePattern);
    216 }
    217 
    218 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    219     MAYBE_DataDrivenHeuristics(12)) {
    220   const base::FilePath::CharType kFileNamePattern[] =
    221       FILE_PATH_LITERAL("12_*.html");
    222   RunDataDrivenTest(GetInputDirectory(kTestName),
    223                     GetOutputDirectory(kTestName),
    224                     kFileNamePattern);
    225 }
    226 
    227 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    228     MAYBE_DataDrivenHeuristics(13)) {
    229   const base::FilePath::CharType kFileNamePattern[] =
    230       FILE_PATH_LITERAL("13_*.html");
    231   RunDataDrivenTest(GetInputDirectory(kTestName),
    232                     GetOutputDirectory(kTestName),
    233                     kFileNamePattern);
    234 }
    235 
    236 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    237     MAYBE_DataDrivenHeuristics(14)) {
    238   const base::FilePath::CharType kFileNamePattern[] =
    239       FILE_PATH_LITERAL("14_*.html");
    240   RunDataDrivenTest(GetInputDirectory(kTestName),
    241                     GetOutputDirectory(kTestName),
    242                     kFileNamePattern);
    243 }
    244 
    245 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    246     MAYBE_DataDrivenHeuristics(15)) {
    247   const base::FilePath::CharType kFileNamePattern[] =
    248       FILE_PATH_LITERAL("15_*.html");
    249   RunDataDrivenTest(GetInputDirectory(kTestName),
    250                     GetOutputDirectory(kTestName),
    251                     kFileNamePattern);
    252 }
    253 
    254 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    255     MAYBE_DataDrivenHeuristics(16)) {
    256   const base::FilePath::CharType kFileNamePattern[] =
    257       FILE_PATH_LITERAL("16_*.html");
    258   RunDataDrivenTest(GetInputDirectory(kTestName),
    259                     GetOutputDirectory(kTestName),
    260                     kFileNamePattern);
    261 }
    262 
    263 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    264     MAYBE_DataDrivenHeuristics(17)) {
    265   const base::FilePath::CharType kFileNamePattern[] =
    266       FILE_PATH_LITERAL("17_*.html");
    267   RunDataDrivenTest(GetInputDirectory(kTestName),
    268                     GetOutputDirectory(kTestName),
    269                     kFileNamePattern);
    270 }
    271 
    272 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    273     MAYBE_DataDrivenHeuristics(20)) {
    274   const base::FilePath::CharType kFileNamePattern[] =
    275       FILE_PATH_LITERAL("20_*.html");
    276   RunDataDrivenTest(GetInputDirectory(kTestName),
    277                     GetOutputDirectory(kTestName),
    278                     kFileNamePattern);
    279 }
    280 
    281 }  // namespace autofill
    282