1 // Copyright (c) 2011 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/file_path.h" 8 #include "base/string_util.h" 9 #include "base/utf_string_conversions.h" 10 #include "chrome/browser/autofill/autofill_manager.h" 11 #include "chrome/browser/autofill/data_driven_test.h" 12 #include "chrome/browser/autofill/form_structure.h" 13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 15 #include "chrome/test/in_process_browser_test.h" 16 #include "chrome/test/ui_test_utils.h" 17 #include "googleurl/src/gurl.h" 18 19 namespace { 20 21 const FilePath::CharType kTestName[] = FILE_PATH_LITERAL("heuristics"); 22 const FilePath::CharType kFileNamePattern[] = FILE_PATH_LITERAL("*.html"); 23 24 // Convert the |html| snippet to a data URI. 25 GURL HTMLToDataURI(const std::string& html) { 26 return GURL(std::string("data:text/html;charset=utf-8,") + html); 27 } 28 29 } // namespace 30 31 // A data-driven test for verifying Autofill heuristics. Each input is an HTML 32 // file that contains one or more forms. The corresponding output file lists the 33 // heuristically detected type for eachfield. 34 class FormStructureBrowserTest : public InProcessBrowserTest, 35 public DataDrivenTest { 36 protected: 37 FormStructureBrowserTest(); 38 virtual ~FormStructureBrowserTest(); 39 40 // DataDrivenTest: 41 virtual void GenerateResults(const std::string& input, 42 std::string* output); 43 44 // Serializes the given |forms| into a string. 45 std::string FormStructuresToString(const std::vector<FormStructure*>& forms); 46 47 private: 48 DISALLOW_COPY_AND_ASSIGN(FormStructureBrowserTest); 49 }; 50 51 FormStructureBrowserTest::FormStructureBrowserTest() { 52 } 53 54 FormStructureBrowserTest::~FormStructureBrowserTest() { 55 } 56 57 void FormStructureBrowserTest::GenerateResults(const std::string& input, 58 std::string* output) { 59 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), 60 HTMLToDataURI(input))); 61 62 AutofillManager* autofill_manager = 63 browser()->GetSelectedTabContentsWrapper()->autofill_manager(); 64 ASSERT_NE(static_cast<AutofillManager*>(NULL), autofill_manager); 65 std::vector<FormStructure*> forms = autofill_manager->form_structures_.get(); 66 *output = FormStructureBrowserTest::FormStructuresToString(forms); 67 } 68 69 std::string FormStructureBrowserTest::FormStructuresToString( 70 const std::vector<FormStructure*>& forms) { 71 std::string forms_string; 72 for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); 73 iter != forms.end(); 74 ++iter) { 75 76 for (std::vector<AutofillField*>::const_iterator field_iter = 77 (*iter)->begin(); 78 field_iter != (*iter)->end(); 79 ++field_iter) { 80 // The field list is NULL-terminated. Exit loop when at the end. 81 if (!*field_iter) 82 break; 83 forms_string += AutofillType::FieldTypeToString((*field_iter)->type()); 84 forms_string += "\n"; 85 } 86 } 87 return forms_string; 88 } 89 90 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, DataDrivenHeuristics) { 91 RunDataDrivenTest(GetInputDirectory(kTestName), 92 GetOutputDirectory(kTestName), 93 kFileNamePattern); 94 } 95