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/autofill_driver_impl.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   AutofillDriverImpl* autofill_driver = AutofillDriverImpl::FromWebContents(
     74       browser()->tab_strip_model()->GetActiveWebContents());
     75   ASSERT_NE(static_cast<AutofillDriverImpl*>(NULL), autofill_driver);
     76   AutofillManager* autofill_manager = autofill_driver->autofill_manager();
     77   ASSERT_NE(static_cast<AutofillManager*>(NULL), autofill_manager);
     78   std::vector<FormStructure*> forms = autofill_manager->form_structures_.get();
     79   *output = FormStructureBrowserTest::FormStructuresToString(forms);
     80 }
     81 
     82 std::string FormStructureBrowserTest::FormStructuresToString(
     83     const std::vector<FormStructure*>& forms) {
     84   std::string forms_string;
     85   for (std::vector<FormStructure*>::const_iterator iter = forms.begin();
     86        iter != forms.end();
     87        ++iter) {
     88 
     89     for (std::vector<AutofillField*>::const_iterator field_iter =
     90             (*iter)->begin();
     91          field_iter != (*iter)->end();
     92          ++field_iter) {
     93       forms_string += (*field_iter)->Type().ToString();
     94       forms_string += " | " + UTF16ToUTF8((*field_iter)->name);
     95       forms_string += " | " + UTF16ToUTF8((*field_iter)->label);
     96       forms_string += " | " + UTF16ToUTF8((*field_iter)->value);
     97       forms_string += "\n";
     98     }
     99   }
    100   return forms_string;
    101 }
    102 
    103 // Heuristics tests timeout on Windows.  See http://crbug.com/85276
    104 // Also on ChromeOS/Aura. See crbug.com/173621
    105 // On Linux too. See crbug.com/323093
    106 #if defined(OS_WIN) || defined(USE_AURA) || defined(OS_LINUX)
    107 #define MAYBE_DataDrivenHeuristics(n) DISABLED_DataDrivenHeuristics##n
    108 #else
    109 #define MAYBE_DataDrivenHeuristics(n) DataDrivenHeuristics##n
    110 #endif
    111 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, DataDrivenHeuristics00) {
    112   const base::FilePath::CharType kFileNamePattern[] =
    113       FILE_PATH_LITERAL("00_*.html");
    114   RunDataDrivenTest(GetInputDirectory(kTestName),
    115                     GetOutputDirectory(kTestName),
    116                     kFileNamePattern);
    117 }
    118 
    119 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, DataDrivenHeuristics01) {
    120   const base::FilePath::CharType kFileNamePattern[] =
    121       FILE_PATH_LITERAL("01_*.html");
    122   RunDataDrivenTest(GetInputDirectory(kTestName),
    123                     GetOutputDirectory(kTestName),
    124                     kFileNamePattern);
    125 }
    126 
    127 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    128     MAYBE_DataDrivenHeuristics(02)) {
    129   const base::FilePath::CharType kFileNamePattern[] =
    130       FILE_PATH_LITERAL("02_*.html");
    131   RunDataDrivenTest(GetInputDirectory(kTestName),
    132                     GetOutputDirectory(kTestName),
    133                     kFileNamePattern);
    134 }
    135 
    136 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    137     MAYBE_DataDrivenHeuristics(03)) {
    138   const base::FilePath::CharType kFileNamePattern[] =
    139       FILE_PATH_LITERAL("03_*.html");
    140   RunDataDrivenTest(GetInputDirectory(kTestName),
    141                     GetOutputDirectory(kTestName),
    142                     kFileNamePattern);
    143 }
    144 
    145 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    146     MAYBE_DataDrivenHeuristics(04)) {
    147   const base::FilePath::CharType kFileNamePattern[] =
    148       FILE_PATH_LITERAL("04_*.html");
    149   RunDataDrivenTest(GetInputDirectory(kTestName),
    150                     GetOutputDirectory(kTestName),
    151                     kFileNamePattern);
    152 }
    153 
    154 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    155     MAYBE_DataDrivenHeuristics(05)) {
    156   const base::FilePath::CharType kFileNamePattern[] =
    157       FILE_PATH_LITERAL("05_*.html");
    158   RunDataDrivenTest(GetInputDirectory(kTestName),
    159                     GetOutputDirectory(kTestName),
    160                     kFileNamePattern);
    161 }
    162 
    163 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    164     MAYBE_DataDrivenHeuristics(06)) {
    165   const base::FilePath::CharType kFileNamePattern[] =
    166       FILE_PATH_LITERAL("06_*.html");
    167   RunDataDrivenTest(GetInputDirectory(kTestName),
    168                     GetOutputDirectory(kTestName),
    169                     kFileNamePattern);
    170 }
    171 
    172 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    173     MAYBE_DataDrivenHeuristics(07)) {
    174   const base::FilePath::CharType kFileNamePattern[] =
    175       FILE_PATH_LITERAL("07_*.html");
    176   RunDataDrivenTest(GetInputDirectory(kTestName),
    177                     GetOutputDirectory(kTestName),
    178                     kFileNamePattern);
    179 }
    180 
    181 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    182     MAYBE_DataDrivenHeuristics(08)) {
    183   const base::FilePath::CharType kFileNamePattern[] =
    184       FILE_PATH_LITERAL("08_*.html");
    185   RunDataDrivenTest(GetInputDirectory(kTestName),
    186                     GetOutputDirectory(kTestName),
    187                     kFileNamePattern);
    188 }
    189 
    190 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    191     MAYBE_DataDrivenHeuristics(09)) {
    192   const base::FilePath::CharType kFileNamePattern[] =
    193       FILE_PATH_LITERAL("09_*.html");
    194   RunDataDrivenTest(GetInputDirectory(kTestName),
    195                     GetOutputDirectory(kTestName),
    196                     kFileNamePattern);
    197 }
    198 
    199 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    200     MAYBE_DataDrivenHeuristics(10)) {
    201   const base::FilePath::CharType kFileNamePattern[] =
    202       FILE_PATH_LITERAL("10_*.html");
    203   RunDataDrivenTest(GetInputDirectory(kTestName),
    204                     GetOutputDirectory(kTestName),
    205                     kFileNamePattern);
    206 }
    207 
    208 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    209     MAYBE_DataDrivenHeuristics(11)) {
    210   const base::FilePath::CharType kFileNamePattern[] =
    211       FILE_PATH_LITERAL("11_*.html");
    212   RunDataDrivenTest(GetInputDirectory(kTestName),
    213                     GetOutputDirectory(kTestName),
    214                     kFileNamePattern);
    215 }
    216 
    217 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    218     MAYBE_DataDrivenHeuristics(12)) {
    219   const base::FilePath::CharType kFileNamePattern[] =
    220       FILE_PATH_LITERAL("12_*.html");
    221   RunDataDrivenTest(GetInputDirectory(kTestName),
    222                     GetOutputDirectory(kTestName),
    223                     kFileNamePattern);
    224 }
    225 
    226 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    227     MAYBE_DataDrivenHeuristics(13)) {
    228   const base::FilePath::CharType kFileNamePattern[] =
    229       FILE_PATH_LITERAL("13_*.html");
    230   RunDataDrivenTest(GetInputDirectory(kTestName),
    231                     GetOutputDirectory(kTestName),
    232                     kFileNamePattern);
    233 }
    234 
    235 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    236     MAYBE_DataDrivenHeuristics(14)) {
    237   const base::FilePath::CharType kFileNamePattern[] =
    238       FILE_PATH_LITERAL("14_*.html");
    239   RunDataDrivenTest(GetInputDirectory(kTestName),
    240                     GetOutputDirectory(kTestName),
    241                     kFileNamePattern);
    242 }
    243 
    244 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    245     MAYBE_DataDrivenHeuristics(15)) {
    246   const base::FilePath::CharType kFileNamePattern[] =
    247       FILE_PATH_LITERAL("15_*.html");
    248   RunDataDrivenTest(GetInputDirectory(kTestName),
    249                     GetOutputDirectory(kTestName),
    250                     kFileNamePattern);
    251 }
    252 
    253 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    254     MAYBE_DataDrivenHeuristics(16)) {
    255   const base::FilePath::CharType kFileNamePattern[] =
    256       FILE_PATH_LITERAL("16_*.html");
    257   RunDataDrivenTest(GetInputDirectory(kTestName),
    258                     GetOutputDirectory(kTestName),
    259                     kFileNamePattern);
    260 }
    261 
    262 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    263     MAYBE_DataDrivenHeuristics(17)) {
    264   const base::FilePath::CharType kFileNamePattern[] =
    265       FILE_PATH_LITERAL("17_*.html");
    266   RunDataDrivenTest(GetInputDirectory(kTestName),
    267                     GetOutputDirectory(kTestName),
    268                     kFileNamePattern);
    269 }
    270 
    271 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest,
    272     MAYBE_DataDrivenHeuristics(20)) {
    273   const base::FilePath::CharType kFileNamePattern[] =
    274       FILE_PATH_LITERAL("20_*.html");
    275   RunDataDrivenTest(GetInputDirectory(kTestName),
    276                     GetOutputDirectory(kTestName),
    277                     kFileNamePattern);
    278 }
    279 
    280 }  // namespace autofill
    281