| Index: tools/gn/analyzer_unittest.cc
|
| diff --git a/tools/gn/analyzer_unittest.cc b/tools/gn/analyzer_unittest.cc
|
| index a3c8d5becb7b31b6a0270d5d87139697ac8ad33a..cc46c39c0f906cf68a91730c7e14797bcb348ed5 100644
|
| --- a/tools/gn/analyzer_unittest.cc
|
| +++ b/tools/gn/analyzer_unittest.cc
|
| @@ -2,15 +2,16 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| #include "tools/gn/analyzer.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| #include "tools/gn/build_settings.h"
|
| #include "tools/gn/builder.h"
|
| +#include "tools/gn/input_file.h"
|
| #include "tools/gn/loader.h"
|
| #include "tools/gn/settings.h"
|
| #include "tools/gn/source_file.h"
|
|
|
| -
|
| namespace {
|
|
|
| class MockLoader : public Loader {
|
| @@ -34,6 +35,7 @@ class MockLoader : public Loader {
|
|
|
| class AnalyzerTest : public testing::Test {
|
| public:
|
| + using InputFileMap = base::hash_map<SourceFile, std::unique_ptr<InputFile>>;
|
| AnalyzerTest()
|
| : loader_(new MockLoader),
|
| builder_(loader_.get()),
|
| @@ -49,9 +51,22 @@ class AnalyzerTest : public testing::Test {
|
| const std::string name,
|
| Target::OutputType type,
|
| const std::vector<std::string>& sources,
|
| - const std::vector<Target*>& deps) {
|
| + const std::vector<Target*>& deps,
|
| + const std::vector<std::string>& gn_files) {
|
| Label lbl(SourceDir(dir), name, tc_dir_, tc_name_);
|
| - Target* target = new Target(&settings_, lbl);
|
| + InputFileSet input_files;
|
| + for (const auto& gn : gn_files) {
|
| + SourceFile source_file(gn);
|
| + auto found_input_file = input_files_.find(source_file);
|
| + if (found_input_file != input_files_.end()) {
|
| + input_files.insert(found_input_file->second.get());
|
| + } else {
|
| + auto input_file = base::MakeUnique<InputFile>(source_file);
|
| + input_files.insert(input_file.get());
|
| + input_files_.insert(std::make_pair(source_file, std::move(input_file)));
|
| + }
|
| + }
|
| + Target* target = new Target(&settings_, lbl, input_files);
|
| target->set_output_type(type);
|
| for (const auto& s : sources)
|
| target->sources().push_back(SourceFile(s));
|
| @@ -73,32 +88,38 @@ class AnalyzerTest : public testing::Test {
|
| // get leaked.
|
|
|
| // Ignore the returned target since nothing depends on it.
|
| - MakeTarget("//", "a", Target::EXECUTABLE, {"//a.cc"}, no_deps);
|
| + MakeTarget("//", "a", Target::EXECUTABLE, {"//a.cc"}, no_deps,
|
| + {"//BUILD.gn", "//features.gni"});
|
|
|
| - Target* b =
|
| - MakeTarget("//d", "b", Target::SOURCE_SET, {"//d/b.cc"}, no_deps);
|
| + Target* b = MakeTarget("//d", "b", Target::SOURCE_SET, {"//d/b.cc"},
|
| + no_deps, {"//d/BUILD.gn"});
|
|
|
| - Target* b_unittests = MakeTarget("//d", "b_unittests", Target::EXECUTABLE,
|
| - {"//d/b_unittest.cc"}, {b});
|
| + Target* b_unittests =
|
| + MakeTarget("//d", "b_unittests", Target::EXECUTABLE,
|
| + {"//d/b_unittest.cc"}, {b}, {"//d/BUILD.gn"});
|
|
|
| - Target* c = MakeTarget("//d", "c", Target::EXECUTABLE, {"//d/c.cc"}, {b});
|
| + Target* c = MakeTarget("//d", "c", Target::EXECUTABLE, {"//d/c.cc"}, {b},
|
| + {"//d/BUILD.gn"});
|
|
|
| Target* b_unittests_and_c =
|
| MakeTarget("//d", "b_unittests_and_c", Target::GROUP, no_sources,
|
| - {b_unittests, c});
|
| + {b_unittests, c}, {"//d/BUILD.gn"});
|
|
|
| - Target* e =
|
| - MakeTarget("//d", "e", Target::EXECUTABLE, {"//d/e.cc"}, no_deps);
|
| + Target* e = MakeTarget("//d", "e", Target::EXECUTABLE, {"//d/e.cc"},
|
| + no_deps, {"//d/BUILD.gn"});
|
|
|
| // Also ignore this returned target since nothing depends on it.
|
| - MakeTarget("//d", "d", Target::GROUP, no_sources, {b_unittests_and_c, e});
|
| + MakeTarget("//d", "d", Target::GROUP, no_sources, {b_unittests_and_c, e},
|
| + {"//d/BUILD.gn"});
|
| }
|
|
|
| void RunBasicTest(const std::string& input,
|
| const std::string& expected_output) {
|
| SetUpABasicBuildGraph();
|
| Err err;
|
| - std::string actual_output = Analyzer(builder_).Analyze(input, &err);
|
| + Analyzer analyzer(builder_, build_settings_.build_config_file(),
|
| + SourceFile("//.gn"));
|
| + std::string actual_output = analyzer.Analyze(input, &err);
|
| EXPECT_EQ(err.has_error(), false);
|
| EXPECT_EQ(expected_output, actual_output);
|
| }
|
| @@ -110,6 +131,7 @@ class AnalyzerTest : public testing::Test {
|
| Settings settings_;
|
| SourceDir tc_dir_;
|
| std::string tc_name_;
|
| + InputFileMap input_files_;
|
| };
|
|
|
| } // namespace
|
| @@ -201,13 +223,10 @@ TEST_F(AnalyzerTest, WrongInputFields) {
|
| "}");
|
| }
|
|
|
| -TEST_F(AnalyzerTest, BuildFilesWereModified) {
|
| - // This tests that if a build file is modified, we bail out early with
|
| - // "Found dependency (all)" error since we can't handle changes to
|
| - // build files yet (crbug.com/555273).
|
| +TEST_F(AnalyzerTest, DotGnFileWasModified) {
|
| RunBasicTest(
|
| "{"
|
| - " \"files\": [ \"//a.cc\", \"//BUILD.gn\" ],"
|
| + " \"files\": [ \"//.gn\" ],"
|
| " \"additional_compile_targets\": [],"
|
| " \"test_targets\": [ \"//:a\" ]"
|
| "}",
|
| @@ -218,13 +237,10 @@ TEST_F(AnalyzerTest, BuildFilesWereModified) {
|
| "}");
|
| }
|
|
|
| -TEST_F(AnalyzerTest, BuildFilesWereModifiedAndCompilingAll) {
|
| - // This tests that if a build file is modified, we bail out early with
|
| - // "Found dependency (all)" error since we can't handle changes to
|
| - // build files yet (crbug.com/555273).
|
| +TEST_F(AnalyzerTest, DotGnFileWasModifiedAndCompilingAll) {
|
| RunBasicTest(
|
| "{"
|
| - " \"files\": [ \"//a.cc\", \"//BUILD.gn\" ],"
|
| + " \"files\": [ \"//.gn\" ],"
|
| " \"additional_compile_targets\": [ \"all\" ],"
|
| " \"test_targets\": [ \"//:a\" ]"
|
| "}",
|
| @@ -234,3 +250,45 @@ TEST_F(AnalyzerTest, BuildFilesWereModifiedAndCompilingAll) {
|
| "\"test_targets\":[\"//:a\"]"
|
| "}");
|
| }
|
| +
|
| +TEST_F(AnalyzerTest, BuildFileWasModified) {
|
| + RunBasicTest(
|
| + "{"
|
| + " \"files\": [ \"//BUILD.gn\" ],"
|
| + " \"additional_compile_targets\": [],"
|
| + " \"test_targets\": [ \"//:a\" ]"
|
| + "}",
|
| + "{"
|
| + "\"compile_targets\":[],"
|
| + "\"status\":\"Found dependency\","
|
| + "\"test_targets\":[\"//:a\"]"
|
| + "}");
|
| +}
|
| +
|
| +TEST_F(AnalyzerTest, BuildFileWasModifiedAndCompilingAll) {
|
| + RunBasicTest(
|
| + "{"
|
| + " \"files\": [ \"//BUILD.gn\" ],"
|
| + " \"additional_compile_targets\": [ \"all\" ],"
|
| + " \"test_targets\": [ \"//:a\" ]"
|
| + "}",
|
| + "{"
|
| + "\"compile_targets\":[\"//:a\"],"
|
| + "\"status\":\"Found dependency\","
|
| + "\"test_targets\":[\"//:a\"]"
|
| + "}");
|
| +}
|
| +
|
| +TEST_F(AnalyzerTest, UnnededBuildFileWasModified) {
|
| + RunBasicTest(
|
| + "{"
|
| + " \"files\": [ \"//BUILD.gn\" ],"
|
| + " \"additional_compile_targets\": [],"
|
| + " \"test_targets\": [ \"//d:b_unittests\" ]"
|
| + "}",
|
| + "{"
|
| + "\"compile_targets\":[],"
|
| + "\"status\":\"No dependency\","
|
| + "\"test_targets\":[]"
|
| + "}");
|
| +}
|
|
|