• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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