Home | History | Annotate | Download | only in browser
      1 // Copyright 2013 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 "components/autofill/core/browser/data_driven_test.h"
      6 
      7 #include "base/file_util.h"
      8 #include "base/files/file_enumerator.h"
      9 #include "base/strings/string_util.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 
     12 namespace autofill {
     13 namespace {
     14 
     15 // Reads |file| into |content|, and converts Windows line-endings to Unix ones.
     16 // Returns true on success.
     17 bool ReadFile(const base::FilePath& file, std::string* content) {
     18   if (!base::ReadFileToString(file, content))
     19     return false;
     20 
     21   ReplaceSubstringsAfterOffset(content, 0, "\r\n", "\n");
     22   return true;
     23 }
     24 
     25 // Write |content| to |file|. Returns true on success.
     26 bool WriteFile(const base::FilePath& file, const std::string& content) {
     27   int write_size = base::WriteFile(file, content.c_str(),
     28                                    static_cast<int>(content.length()));
     29   return write_size == static_cast<int>(content.length());
     30 }
     31 
     32 }  // namespace
     33 
     34 void DataDrivenTest::RunDataDrivenTest(
     35     const base::FilePath& input_directory,
     36     const base::FilePath& output_directory,
     37     const base::FilePath::StringType& file_name_pattern) {
     38   ASSERT_TRUE(base::DirectoryExists(input_directory));
     39   ASSERT_TRUE(base::DirectoryExists(output_directory));
     40   base::FileEnumerator input_files(input_directory,
     41                                    false,
     42                                    base::FileEnumerator::FILES,
     43                                    file_name_pattern);
     44 
     45   for (base::FilePath input_file = input_files.Next();
     46        !input_file.empty();
     47        input_file = input_files.Next()) {
     48     SCOPED_TRACE(input_file.BaseName().value());
     49 
     50     std::string input;
     51     ASSERT_TRUE(ReadFile(input_file, &input));
     52 
     53     std::string output;
     54     GenerateResults(input, &output);
     55 
     56     base::FilePath output_file = output_directory.Append(
     57         input_file.BaseName().StripTrailingSeparators().ReplaceExtension(
     58             FILE_PATH_LITERAL(".out")));
     59 
     60     std::string output_file_contents;
     61     if (ReadFile(output_file, &output_file_contents))
     62       EXPECT_EQ(output_file_contents, output);
     63     else
     64       ASSERT_TRUE(WriteFile(output_file, output));
     65   }
     66 }
     67 
     68 base::FilePath DataDrivenTest::GetInputDirectory(
     69     const base::FilePath::StringType& test_name) {
     70   base::FilePath dir;
     71   dir = test_data_directory_.AppendASCII("autofill")
     72                             .Append(test_name)
     73                             .AppendASCII("input");
     74   return dir;
     75 }
     76 
     77 base::FilePath DataDrivenTest::GetOutputDirectory(
     78     const base::FilePath::StringType& test_name) {
     79   base::FilePath dir;
     80   dir = test_data_directory_.AppendASCII("autofill")
     81                             .Append(test_name)
     82                             .AppendASCII("output");
     83   return dir;
     84 }
     85 
     86 DataDrivenTest::DataDrivenTest(const base::FilePath& test_data_directory)
     87     : test_data_directory_(test_data_directory) {
     88 }
     89 
     90 DataDrivenTest::~DataDrivenTest() {
     91 }
     92 
     93 }  // namespace autofill
     94