| Index: chrome/browser/autofill/form_structure_browsertest.cc | 
| =================================================================== | 
| --- chrome/browser/autofill/form_structure_browsertest.cc	(revision 67097) | 
| +++ chrome/browser/autofill/form_structure_browsertest.cc	(working copy) | 
| @@ -4,20 +4,74 @@ | 
|  | 
| #include <vector> | 
|  | 
| +#include "base/file_path.h" | 
| +#include "base/path_service.h" | 
| +#include "base/string_util.h" | 
| +#include "base/utf_string_conversions.h" | 
| #include "chrome/browser/autofill/autofill_manager.h" | 
| #include "chrome/browser/autofill/form_structure.h" | 
| #include "chrome/browser/tab_contents/tab_contents.h" | 
| #include "chrome/browser/ui/browser.h" | 
| +#include "chrome/common/chrome_paths.h" | 
| #include "chrome/test/in_process_browser_test.h" | 
| #include "chrome/test/ui_test_utils.h" | 
| #include "googleurl/src/gurl.h" | 
|  | 
| +namespace { | 
| + | 
| +FilePath GetInputFileDirectory() { | 
| +  FilePath test_data_dir_; | 
| +  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); | 
| +  test_data_dir_ = test_data_dir_.AppendASCII("autofill_heuristics") | 
| +                                 .AppendASCII("input"); | 
| +  return test_data_dir_; | 
| +} | 
| + | 
| +FilePath GetOutputFileDirectory() { | 
| +  FilePath test_data_dir_; | 
| +  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); | 
| +  test_data_dir_ = test_data_dir_.AppendASCII("autofill_heuristics") | 
| +                                 .AppendASCII("output"); | 
| +  return test_data_dir_; | 
| +} | 
| + | 
| +// Write |content| to |file|. Returns true on success. | 
| +bool WriteFile(const FilePath& file, const std::string& content) { | 
| +  int write_size = file_util::WriteFile(file, content.c_str(), | 
| +                                        content.length()); | 
| +  return write_size == static_cast<int>(content.length()); | 
| +} | 
| + | 
| +// Convert |html| to URL format, and return the converted string. | 
| +const std::string ConvertToURLFormat(const std::string& html) { | 
| +  return std::string("data:text/html;charset=utf-8,") + html; | 
| +} | 
| + | 
| +// Compare |output_file_source| with |form_string|. Returns true when they are | 
| +// identical. | 
| +bool CompareText(const std::string& output_file_source, | 
| +                 const std::string& form_string) { | 
| +  std::string output_file = output_file_source; | 
| +  std::string form = form_string; | 
| + | 
| +  ReplaceSubstringsAfterOffset(&output_file, 0, "\r\n", " "); | 
| +  ReplaceSubstringsAfterOffset(&output_file, 0, "\r", " "); | 
| +  ReplaceSubstringsAfterOffset(&output_file, 0, "\n", " "); | 
| +  ReplaceSubstringsAfterOffset(&form, 0, "\n", " "); | 
| + | 
| +  return (output_file == form); | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| // Test class for verifying proper form structure as determined by AutoFill | 
| -// heuristics.  After a test loads HTML content with a call to |NavigateToURL| | 
| -// the |AutoFillManager| associated with the tab contents is queried for the | 
| -// form structures that were loaded and parsed. | 
| -// These form structures are serialized to string form and compared with | 
| -// expected results. | 
| +// heuristics. A test inputs each form file(e.g. form_[language_code].html), | 
| +// loads its HTML content with a call to |NavigateToURL|, the |AutoFillManager| | 
| +// associated with the tab contents is queried for the form structures that | 
| +// were loaded and parsed. These form structures are serialized to string form. | 
| +// If this is the first time test is run, a gold test result file is generated | 
| +// in output directory, else the form structures are compared against the | 
| +// existing result file. | 
| class FormStructureBrowserTest : public InProcessBrowserTest { | 
| public: | 
| FormStructureBrowserTest() {} | 
| @@ -51,8 +105,6 @@ | 
| for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); | 
| iter != forms.end(); | 
| ++iter) { | 
| -    forms_string += (*iter)->source_url().spec(); | 
| -    forms_string += "\n"; | 
|  | 
| for (std::vector<AutoFillField*>::const_iterator field_iter = | 
| (*iter)->begin(); | 
| @@ -162,55 +214,53 @@ | 
| default: | 
| NOTREACHED() << "Invalid AutoFillFieldType value."; | 
| } | 
| - | 
| return std::string(); | 
| } | 
|  | 
| -IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, BasicFormStructure) { | 
| -  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); | 
| -  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( | 
| -      browser(), GURL("data:text/html;charset=utf-8," | 
| -                      "<form action=\"http://www.google.com/\" method=\"POST\">" | 
| -                      "<label for=\"firstname\">First name:</label>" | 
| -                      " <input type=\"text\" id=\"firstname\"/><br />" | 
| -                      "<label for=\"lastname\">Last name:</label>" | 
| -                      " <input type=\"text\" id=\"lastname\" /><br />" | 
| -                      "<label for=\"address1\">Address line 1:</label>" | 
| -                      " <input type=\"text\" id=\"address1\" /><br />" | 
| -                      "<label for=\"address2\">Address line 2:</label>" | 
| -                      " <input type=\"text\" id=\"address2\" /><br />" | 
| -                      "<label for=\"city\">City:</label>" | 
| -                      " <input type=\"text\" id=\"city\" /><br />" | 
| -                      "</form>"))); | 
| +IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, HTMLFiles) { | 
| +  FilePath input_file_path = GetInputFileDirectory(); | 
| +  file_util::FileEnumerator input_file_enumerator(input_file_path, | 
| +      false, file_util::FileEnumerator::FILES, FILE_PATH_LITERAL("*.html")); | 
| + | 
| +  for (input_file_path = input_file_enumerator.Next(); | 
| +       !input_file_path.empty(); | 
| +       input_file_path = input_file_enumerator.Next()) { | 
| +    std::string input_file_source; | 
| + | 
| +    ASSERT_TRUE(file_util::ReadFileToString(input_file_path, | 
| +                                            &input_file_source)); | 
| +    input_file_source = ConvertToURLFormat(input_file_source); | 
|  | 
| -  ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), | 
| -                                                     VIEW_ID_TAB_CONTAINER)); | 
| -  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), | 
| -                                           VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 
| +    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); | 
| +    ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( | 
| +        browser(), GURL(input_file_source))); | 
|  | 
| -  AutoFillManager* autofill_manager = | 
| -      browser()->GetSelectedTabContents()->GetAutoFillManager(); | 
| -  ASSERT_NE(static_cast<AutoFillManager*>(NULL), autofill_manager); | 
| -  std::vector<FormStructure*> forms = GetFormStructures(*autofill_manager); | 
| -  std::string expected("data:text/html;charset=utf-8," | 
| -                       "<form action=\"http://www.google.com/\"" | 
| -                       " method=\"POST\">" | 
| -                       "<label for=\"firstname\">First name:</label>" | 
| -                       " <input type=\"text\" id=\"firstname\"/><br />" | 
| -                       "<label for=\"lastname\">Last name:</label>" | 
| -                       " <input type=\"text\" id=\"lastname\" /><br />" | 
| -                       "<label for=\"address1\">Address line 1:</label>" | 
| -                       " <input type=\"text\" id=\"address1\" /><br />" | 
| -                       "<label for=\"address2\">Address line 2:</label>" | 
| -                       " <input type=\"text\" id=\"address2\" /><br />" | 
| -                       "<label for=\"city\">City:</label>" | 
| -                       " <input type=\"text\" id=\"city\" /><br />" | 
| -                       "</form>\n" | 
| -                       "NAME_FIRST\n" | 
| -                       "NAME_LAST\n" | 
| -                       "ADDRESS_HOME_LINE1\n" | 
| -                       "ADDRESS_HOME_LINE2\n" | 
| -                       "ADDRESS_HOME_CITY\n"); | 
| +    ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), | 
| +                                                       VIEW_ID_TAB_CONTAINER)); | 
| +    ASSERT_TRUE(ui_test_utils::IsViewFocused( | 
| +        browser(), | 
| +        VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 
|  | 
| -  EXPECT_EQ(expected, FormStructureBrowserTest::FormStructuresToString(forms)); | 
| +    AutoFillManager* autofill_manager = | 
| +        browser()->GetSelectedTabContents()->GetAutoFillManager(); | 
| +    ASSERT_NE(static_cast<AutoFillManager*>(NULL), autofill_manager); | 
| +    std::vector<FormStructure*> forms = GetFormStructures(*autofill_manager); | 
| + | 
| +    FilePath output_file_directory = GetOutputFileDirectory(); | 
| +    FilePath output_file_path = output_file_directory.Append( | 
| +        input_file_path.BaseName().StripTrailingSeparators().ReplaceExtension( | 
| +            FILE_PATH_LITERAL(".out"))); | 
| + | 
| +    std::string output_file_source; | 
| +    if (file_util::ReadFileToString(output_file_path, &output_file_source)) { | 
| +      ASSERT_TRUE(CompareText( | 
| +          output_file_source, | 
| +          FormStructureBrowserTest::FormStructuresToString(forms))); | 
| + | 
| +    } else { | 
| +      ASSERT_TRUE(WriteFile( | 
| +          output_file_path, | 
| +          FormStructureBrowserTest::FormStructuresToString(forms))); | 
| +    } | 
| +  } | 
| } | 
|  |