• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/files/file_enumerator.h"
8 #include "base/files/file_util.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.
ReadFile(const base::FilePath & file,std::string * content)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.
WriteFile(const base::FilePath & file,const std::string & content)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 
RunDataDrivenTest(const base::FilePath & input_directory,const base::FilePath & output_directory,const base::FilePath::StringType & file_name_pattern)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 
GetInputDirectory(const base::FilePath::StringType & test_name)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 
GetOutputDirectory(const base::FilePath::StringType & test_name)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 
DataDrivenTest(const base::FilePath & test_data_directory)86 DataDrivenTest::DataDrivenTest(const base::FilePath& test_data_directory)
87     : test_data_directory_(test_data_directory) {
88 }
89 
~DataDrivenTest()90 DataDrivenTest::~DataDrivenTest() {
91 }
92 
93 }  // namespace autofill
94