1 // Copyright 2018 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 "gn/metadata_walk.h"
6
7 #include "gn/metadata.h"
8 #include "gn/target.h"
9 #include "gn/test_with_scope.h"
10 #include "gn/unique_vector.h"
11 #include "util/test/test.h"
12
TEST(MetadataWalkTest,CollectNoRecurse)13 TEST(MetadataWalkTest, CollectNoRecurse) {
14 TestWithScope setup;
15
16 TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
17 Value a_expected(nullptr, Value::LIST);
18 a_expected.list_value().push_back(Value(nullptr, "foo"));
19 one.metadata().contents().insert(
20 std::pair<std::string_view, Value>("a", a_expected));
21
22 Value b_expected(nullptr, Value::LIST);
23 b_expected.list_value().push_back(Value(nullptr, true));
24 one.metadata().contents().insert(
25 std::pair<std::string_view, Value>("b", b_expected));
26
27 one.metadata().set_source_dir(SourceDir("/usr/home/files/"));
28
29 TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
30 Value a_2_expected(nullptr, Value::LIST);
31 a_2_expected.list_value().push_back(Value(nullptr, "bar"));
32 two.metadata().contents().insert(
33 std::pair<std::string_view, Value>("a", a_2_expected));
34
35 Value b_2_expected(nullptr, Value::LIST);
36 b_2_expected.list_value().push_back(Value(nullptr, false));
37 two.metadata().contents().insert(
38 std::pair<std::string_view, Value>("b", b_2_expected));
39
40 two.metadata().set_source_dir(SourceDir("/usr/home/files/inner"));
41
42 UniqueVector<const Target*> targets;
43 targets.push_back(&one);
44 targets.push_back(&two);
45
46 std::vector<std::string> data_keys;
47 data_keys.push_back("a");
48 data_keys.push_back("b");
49
50 std::vector<std::string> walk_keys;
51
52 Err err;
53 TargetSet targets_walked;
54 std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
55 SourceDir(), &targets_walked, &err);
56 EXPECT_FALSE(err.has_error());
57
58 std::vector<Value> expected;
59 expected.push_back(Value(nullptr, "foo"));
60 expected.push_back(Value(nullptr, true));
61 expected.push_back(Value(nullptr, "bar"));
62 expected.push_back(Value(nullptr, false));
63 EXPECT_EQ(result, expected);
64
65 TargetSet expected_walked_targets;
66 expected_walked_targets.insert(&one);
67 expected_walked_targets.insert(&two);
68 EXPECT_EQ(targets_walked, expected_walked_targets);
69 }
70
TEST(MetadataWalkTest,CollectWithRecurse)71 TEST(MetadataWalkTest, CollectWithRecurse) {
72 TestWithScope setup;
73
74 TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
75 Value a_expected(nullptr, Value::LIST);
76 a_expected.list_value().push_back(Value(nullptr, "foo"));
77 one.metadata().contents().insert(
78 std::pair<std::string_view, Value>("a", a_expected));
79
80 Value b_expected(nullptr, Value::LIST);
81 b_expected.list_value().push_back(Value(nullptr, true));
82 one.metadata().contents().insert(
83 std::pair<std::string_view, Value>("b", b_expected));
84
85 TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
86 Value a_2_expected(nullptr, Value::LIST);
87 a_2_expected.list_value().push_back(Value(nullptr, "bar"));
88 two.metadata().contents().insert(
89 std::pair<std::string_view, Value>("a", a_2_expected));
90
91 one.public_deps().push_back(LabelTargetPair(&two));
92
93 UniqueVector<const Target*> targets;
94 targets.push_back(&one);
95
96 std::vector<std::string> data_keys;
97 data_keys.push_back("a");
98 data_keys.push_back("b");
99
100 std::vector<std::string> walk_keys;
101
102 Err err;
103 TargetSet targets_walked;
104 std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
105 SourceDir(), &targets_walked, &err);
106 EXPECT_FALSE(err.has_error());
107
108 std::vector<Value> expected;
109 expected.push_back(Value(nullptr, "bar"));
110 expected.push_back(Value(nullptr, "foo"));
111 expected.push_back(Value(nullptr, true));
112 EXPECT_EQ(result, expected);
113
114 TargetSet expected_walked_targets;
115 expected_walked_targets.insert(&one);
116 expected_walked_targets.insert(&two);
117 EXPECT_EQ(targets_walked, expected_walked_targets);
118 }
119
TEST(MetadataWalkTest,CollectWithBarrier)120 TEST(MetadataWalkTest, CollectWithBarrier) {
121 TestWithScope setup;
122
123 TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
124 Value a_expected(nullptr, Value::LIST);
125 a_expected.list_value().push_back(Value(nullptr, "foo"));
126 one.metadata().contents().insert(
127 std::pair<std::string_view, Value>("a", a_expected));
128
129 Value walk_expected(nullptr, Value::LIST);
130 walk_expected.list_value().push_back(
131 Value(nullptr, "//foo:two(//toolchain:default)"));
132 one.metadata().contents().insert(
133 std::pair<std::string_view, Value>("walk", walk_expected));
134
135 TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
136 Value a_2_expected(nullptr, Value::LIST);
137 a_2_expected.list_value().push_back(Value(nullptr, "bar"));
138 two.metadata().contents().insert(
139 std::pair<std::string_view, Value>("a", a_2_expected));
140
141 TestTarget three(setup, "//foo:three", Target::SOURCE_SET);
142 Value a_3_expected(nullptr, Value::LIST);
143 a_3_expected.list_value().push_back(Value(nullptr, "baz"));
144 three.metadata().contents().insert(
145 std::pair<std::string_view, Value>("a", a_3_expected));
146
147 one.public_deps().push_back(LabelTargetPair(&two));
148 one.public_deps().push_back(LabelTargetPair(&three));
149
150 UniqueVector<const Target*> targets;
151 targets.push_back(&one);
152
153 std::vector<std::string> data_keys;
154 data_keys.push_back("a");
155
156 std::vector<std::string> walk_keys;
157 walk_keys.push_back("walk");
158
159 Err err;
160 TargetSet targets_walked;
161 std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
162 SourceDir(), &targets_walked, &err);
163 EXPECT_FALSE(err.has_error()) << err.message();
164
165 std::vector<Value> expected;
166 expected.push_back(Value(nullptr, "bar"));
167 expected.push_back(Value(nullptr, "foo"));
168 EXPECT_EQ(result, expected) << result.size();
169
170 TargetSet expected_walked_targets;
171 expected_walked_targets.insert(&one);
172 expected_walked_targets.insert(&two);
173 EXPECT_EQ(targets_walked, expected_walked_targets);
174 }
175
TEST(MetadataWalkTest,CollectWithError)176 TEST(MetadataWalkTest, CollectWithError) {
177 TestWithScope setup;
178
179 TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
180 Value a_expected(nullptr, Value::LIST);
181 a_expected.list_value().push_back(Value(nullptr, "foo"));
182 one.metadata().contents().insert(
183 std::pair<std::string_view, Value>("a", a_expected));
184
185 Value walk_expected(nullptr, Value::LIST);
186 walk_expected.list_value().push_back(Value(nullptr, "//foo:missing"));
187 one.metadata().contents().insert(
188 std::pair<std::string_view, Value>("walk", walk_expected));
189
190 UniqueVector<const Target*> targets;
191 targets.push_back(&one);
192
193 std::vector<std::string> data_keys;
194 data_keys.push_back("a");
195
196 std::vector<std::string> walk_keys;
197 walk_keys.push_back("walk");
198
199 Err err;
200 TargetSet targets_walked;
201 std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
202 SourceDir(), &targets_walked, &err);
203 EXPECT_TRUE(result.empty());
204 EXPECT_TRUE(err.has_error());
205 EXPECT_EQ(err.message(),
206 "I was expecting //foo:missing(//toolchain:default) to be a "
207 "dependency of //foo:one(//toolchain:default). "
208 "Make sure it's included in the deps or data_deps, and that you've "
209 "specified the appropriate toolchain.")
210 << err.message();
211 }
212