Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: tools/gn/analyzer_unittest.cc

Issue 2940873002: Implement tracking of BUILD.gn files used to define target, toolchain or (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "testing/gtest/include/gtest/gtest.h" 5 #include "testing/gtest/include/gtest/gtest.h"
6 #include "tools/gn/analyzer.h" 6 #include "tools/gn/analyzer.h"
7 #include "tools/gn/build_settings.h" 7 #include "tools/gn/build_settings.h"
8 #include "tools/gn/builder.h" 8 #include "tools/gn/builder.h"
9 #include "tools/gn/loader.h" 9 #include "tools/gn/loader.h"
10 #include "tools/gn/settings.h" 10 #include "tools/gn/settings.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 settings_.set_toolchain_label(Label(SourceDir("//tc/"), "default")); 42 settings_.set_toolchain_label(Label(SourceDir("//tc/"), "default"));
43 settings_.set_default_toolchain_label(settings_.toolchain_label()); 43 settings_.set_default_toolchain_label(settings_.toolchain_label());
44 tc_dir_ = settings_.toolchain_label().dir(); 44 tc_dir_ = settings_.toolchain_label().dir();
45 tc_name_ = settings_.toolchain_label().name(); 45 tc_name_ = settings_.toolchain_label().name();
46 } 46 }
47 47
48 Target* MakeTarget(const std::string dir, 48 Target* MakeTarget(const std::string dir,
49 const std::string name, 49 const std::string name,
50 Target::OutputType type, 50 Target::OutputType type,
51 const std::vector<std::string>& sources, 51 const std::vector<std::string>& sources,
52 const std::vector<Target*>& deps) { 52 const std::vector<Target*>& deps,
53 const std::vector<std::string>& gn_files) {
53 Label lbl(SourceDir(dir), name, tc_dir_, tc_name_); 54 Label lbl(SourceDir(dir), name, tc_dir_, tc_name_);
54 Target* target = new Target(&settings_, lbl); 55 std::set<uint32_t> source_files_hashes;
56 for (const auto& gn : gn_files)
57 source_files_hashes.insert(base::Hash(gn));
58 Target* target = new Target(&settings_, lbl, source_files_hashes);
55 target->set_output_type(type); 59 target->set_output_type(type);
56 for (const auto& s : sources) 60 for (const auto& s : sources)
57 target->sources().push_back(SourceFile(s)); 61 target->sources().push_back(SourceFile(s));
58 for (const auto* d : deps) 62 for (const auto* d : deps)
59 target->public_deps().push_back(LabelTargetPair(d)); 63 target->public_deps().push_back(LabelTargetPair(d));
60 builder_.ItemDefined(std::unique_ptr<Item>(target)); 64 builder_.ItemDefined(std::unique_ptr<Item>(target));
61 return target; 65 return target;
62 } 66 }
63 67
64 void AddSource(Target* a, std::string path) {} 68 void AddSource(Target* a, std::string path) {}
65 69
66 void AddDep(Target* a, Target* b) {} 70 void AddDep(Target* a, Target* b) {}
67 71
68 void SetUpABasicBuildGraph() { 72 void SetUpABasicBuildGraph() {
69 std::vector<std::string> no_sources; 73 std::vector<std::string> no_sources;
70 std::vector<Target*> no_deps; 74 std::vector<Target*> no_deps;
71 75
72 // All of the targets below are owned by the builder, so none of them 76 // All of the targets below are owned by the builder, so none of them
73 // get leaked. 77 // get leaked.
74 78
75 // Ignore the returned target since nothing depends on it. 79 // Ignore the returned target since nothing depends on it.
76 MakeTarget("//", "a", Target::EXECUTABLE, {"//a.cc"}, no_deps); 80 MakeTarget("//", "a", Target::EXECUTABLE, {"//a.cc"}, no_deps,
81 {"//BUILD.gn", "//features.gni"});
77 82
78 Target* b = 83 Target* b = MakeTarget("//d", "b", Target::SOURCE_SET, {"//d/b.cc"},
79 MakeTarget("//d", "b", Target::SOURCE_SET, {"//d/b.cc"}, no_deps); 84 no_deps, {"//d/BUILD.gn"});
80 85
81 Target* b_unittests = MakeTarget("//d", "b_unittests", Target::EXECUTABLE, 86 Target* b_unittests =
82 {"//d/b_unittest.cc"}, {b}); 87 MakeTarget("//d", "b_unittests", Target::EXECUTABLE,
88 {"//d/b_unittest.cc"}, {b}, {"//d/BUILD.gn"});
83 89
84 Target* c = MakeTarget("//d", "c", Target::EXECUTABLE, {"//d/c.cc"}, {b}); 90 Target* c = MakeTarget("//d", "c", Target::EXECUTABLE, {"//d/c.cc"}, {b},
91 {"//d/BUILD.gn"});
85 92
86 Target* b_unittests_and_c = 93 Target* b_unittests_and_c =
87 MakeTarget("//d", "b_unittests_and_c", Target::GROUP, no_sources, 94 MakeTarget("//d", "b_unittests_and_c", Target::GROUP, no_sources,
88 {b_unittests, c}); 95 {b_unittests, c}, {"//d/BUILD.gn"});
89 96
90 Target* e = 97 Target* e = MakeTarget("//d", "e", Target::EXECUTABLE, {"//d/e.cc"},
91 MakeTarget("//d", "e", Target::EXECUTABLE, {"//d/e.cc"}, no_deps); 98 no_deps, {"//d/BUILD.gn"});
92 99
93 // Also ignore this returned target since nothing depends on it. 100 // Also ignore this returned target since nothing depends on it.
94 MakeTarget("//d", "d", Target::GROUP, no_sources, {b_unittests_and_c, e}); 101 MakeTarget("//d", "d", Target::GROUP, no_sources, {b_unittests_and_c, e},
102 {"//d/BUILD.gn"});
95 } 103 }
96 104
97 void RunBasicTest(const std::string& input, 105 void RunBasicTest(const std::string& input,
98 const std::string& expected_output) { 106 const std::string& expected_output) {
99 SetUpABasicBuildGraph(); 107 SetUpABasicBuildGraph();
100 Err err; 108 Err err;
101 std::string actual_output = Analyzer(builder_).Analyze(input, &err); 109 std::string actual_output = Analyzer(builder_).Analyze(input, &err);
102 EXPECT_EQ(err.has_error(), false); 110 EXPECT_EQ(err.has_error(), false);
103 EXPECT_EQ(expected_output, actual_output); 111 EXPECT_EQ(expected_output, actual_output);
104 } 112 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 " \"test_targets\": [ \"//:a\" ]" 202 " \"test_targets\": [ \"//:a\" ]"
195 "}", 203 "}",
196 "{" 204 "{"
197 "\"error\":" 205 "\"error\":"
198 "\"Input does not have a key named " 206 "\"Input does not have a key named "
199 "\\\"additional_compile_targets\\\" with a list value.\"," 207 "\\\"additional_compile_targets\\\" with a list value.\","
200 "\"invalid_targets\":[]" 208 "\"invalid_targets\":[]"
201 "}"); 209 "}");
202 } 210 }
203 211
204 TEST_F(AnalyzerTest, BuildFilesWereModified) { 212 TEST_F(AnalyzerTest, DotGnFileWasModified) {
205 // This tests that if a build file is modified, we bail out early with
206 // "Found dependency (all)" error since we can't handle changes to
207 // build files yet (crbug.com/555273).
208 RunBasicTest( 213 RunBasicTest(
209 "{" 214 "{"
210 " \"files\": [ \"//a.cc\", \"//BUILD.gn\" ]," 215 " \"files\": [ \"//.gn\" ],"
211 " \"additional_compile_targets\": []," 216 " \"additional_compile_targets\": [],"
212 " \"test_targets\": [ \"//:a\" ]" 217 " \"test_targets\": [ \"//:a\" ]"
213 "}", 218 "}",
214 "{" 219 "{"
215 "\"compile_targets\":[\"//:a\"]," 220 "\"compile_targets\":[\"//:a\"],"
216 "\"status\":\"Found dependency (all)\"," 221 "\"status\":\"Found dependency (all)\","
217 "\"test_targets\":[\"//:a\"]" 222 "\"test_targets\":[\"//:a\"]"
218 "}"); 223 "}");
219 } 224 }
220 225
221 TEST_F(AnalyzerTest, BuildFilesWereModifiedAndCompilingAll) { 226 TEST_F(AnalyzerTest, DotGnFileWasModifiedAndCompilingAll) {
222 // This tests that if a build file is modified, we bail out early with
223 // "Found dependency (all)" error since we can't handle changes to
224 // build files yet (crbug.com/555273).
225 RunBasicTest( 227 RunBasicTest(
226 "{" 228 "{"
227 " \"files\": [ \"//a.cc\", \"//BUILD.gn\" ]," 229 " \"files\": [ \"//.gn\" ],"
228 " \"additional_compile_targets\": [ \"all\" ]," 230 " \"additional_compile_targets\": [ \"all\" ],"
229 " \"test_targets\": [ \"//:a\" ]" 231 " \"test_targets\": [ \"//:a\" ]"
230 "}", 232 "}",
231 "{" 233 "{"
232 "\"compile_targets\":[\"all\"]," 234 "\"compile_targets\":[\"all\"],"
233 "\"status\":\"Found dependency (all)\"," 235 "\"status\":\"Found dependency (all)\","
234 "\"test_targets\":[\"//:a\"]" 236 "\"test_targets\":[\"//:a\"]"
235 "}"); 237 "}");
236 } 238 }
239
240 TEST_F(AnalyzerTest, BuildFileWasModified) {
241 RunBasicTest(
242 "{"
243 " \"files\": [ \"//BUILD.gn\" ],"
244 " \"additional_compile_targets\": [],"
245 " \"test_targets\": [ \"//:a\" ]"
246 "}",
247 "{"
248 "\"compile_targets\":[],"
249 "\"status\":\"Found dependency\","
250 "\"test_targets\":[\"//:a\"]"
251 "}");
252 }
253
254 TEST_F(AnalyzerTest, BuildFileWasModifiedAndCompilingAll) {
255 RunBasicTest(
256 "{"
257 " \"files\": [ \"//BUILD.gn\" ],"
258 " \"additional_compile_targets\": [ \"all\" ],"
259 " \"test_targets\": [ \"//:a\" ]"
260 "}",
261 "{"
262 "\"compile_targets\":[\"//:a\"],"
263 "\"status\":\"Found dependency\","
264 "\"test_targets\":[\"//:a\"]"
265 "}");
266 }
267
268 TEST_F(AnalyzerTest, UnnededBuildFileWasModified) {
269 RunBasicTest(
270 "{"
271 " \"files\": [ \"//BUILD.gn\" ],"
272 " \"additional_compile_targets\": [],"
273 " \"test_targets\": [ \"//d:b_unittests\" ]"
274 "}",
275 "{"
276 "\"compile_targets\":[],"
277 "\"status\":\"No dependency\","
278 "\"test_targets\":[]"
279 "}");
280 }
OLDNEW
« no previous file with comments | « tools/gn/analyzer.cc ('k') | tools/gn/builder_unittest.cc » ('j') | tools/gn/scope.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698