blob: 634a2c564c19ef467a678b418195a142effac34b [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "tools/gn/metadata_walk.h"
#include "tools/gn/metadata.h"
#include "tools/gn/target.h"
#include "tools/gn/test_with_scope.h"
#include "tools/gn/unique_vector.h"
#include "util/test/test.h"
TEST(MetadataWalkTest, CollectNoRecurse) {
TestWithScope setup;
TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
Value a_expected(nullptr, Value::LIST);
a_expected.list_value().push_back(Value(nullptr, "foo"));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_expected));
Value b_expected(nullptr, Value::LIST);
b_expected.list_value().push_back(Value(nullptr, true));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("b", b_expected));
one.metadata().set_source_dir(SourceDir("/usr/home/files/"));
TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
Value a_2_expected(nullptr, Value::LIST);
a_2_expected.list_value().push_back(Value(nullptr, "bar"));
two.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_2_expected));
Value b_2_expected(nullptr, Value::LIST);
b_2_expected.list_value().push_back(Value(nullptr, false));
two.metadata().contents().insert(
std::pair<base::StringPiece, Value>("b", b_2_expected));
two.metadata().set_source_dir(SourceDir("/usr/home/files/inner"));
UniqueVector<const Target*> targets;
targets.push_back(&one);
targets.push_back(&two);
std::vector<std::string> data_keys;
data_keys.push_back("a");
data_keys.push_back("b");
std::vector<std::string> walk_keys;
Err err;
std::set<const Target*> targets_walked;
std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
SourceDir(), &targets_walked, &err);
EXPECT_FALSE(err.has_error());
std::vector<Value> expected;
expected.push_back(Value(nullptr, "foo"));
expected.push_back(Value(nullptr, true));
expected.push_back(Value(nullptr, "bar"));
expected.push_back(Value(nullptr, false));
EXPECT_EQ(result, expected);
std::set<const Target*> expected_walked_targets;
expected_walked_targets.insert(&one);
expected_walked_targets.insert(&two);
EXPECT_EQ(targets_walked, expected_walked_targets);
}
TEST(MetadataWalkTest, CollectWithRecurse) {
TestWithScope setup;
TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
Value a_expected(nullptr, Value::LIST);
a_expected.list_value().push_back(Value(nullptr, "foo"));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_expected));
Value b_expected(nullptr, Value::LIST);
b_expected.list_value().push_back(Value(nullptr, true));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("b", b_expected));
TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
Value a_2_expected(nullptr, Value::LIST);
a_2_expected.list_value().push_back(Value(nullptr, "bar"));
two.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_2_expected));
one.public_deps().push_back(LabelTargetPair(&two));
UniqueVector<const Target*> targets;
targets.push_back(&one);
std::vector<std::string> data_keys;
data_keys.push_back("a");
data_keys.push_back("b");
std::vector<std::string> walk_keys;
Err err;
std::set<const Target*> targets_walked;
std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
SourceDir(), &targets_walked, &err);
EXPECT_FALSE(err.has_error());
std::vector<Value> expected;
expected.push_back(Value(nullptr, "bar"));
expected.push_back(Value(nullptr, "foo"));
expected.push_back(Value(nullptr, true));
EXPECT_EQ(result, expected);
std::set<const Target*> expected_walked_targets;
expected_walked_targets.insert(&one);
expected_walked_targets.insert(&two);
EXPECT_EQ(targets_walked, expected_walked_targets);
}
TEST(MetadataWalkTest, CollectWithBarrier) {
TestWithScope setup;
TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
Value a_expected(nullptr, Value::LIST);
a_expected.list_value().push_back(Value(nullptr, "foo"));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_expected));
Value walk_expected(nullptr, Value::LIST);
walk_expected.list_value().push_back(
Value(nullptr, "//foo:two(//toolchain:default)"));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("walk", walk_expected));
TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
Value a_2_expected(nullptr, Value::LIST);
a_2_expected.list_value().push_back(Value(nullptr, "bar"));
two.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_2_expected));
TestTarget three(setup, "//foo:three", Target::SOURCE_SET);
Value a_3_expected(nullptr, Value::LIST);
a_3_expected.list_value().push_back(Value(nullptr, "baz"));
three.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_3_expected));
one.public_deps().push_back(LabelTargetPair(&two));
one.public_deps().push_back(LabelTargetPair(&three));
UniqueVector<const Target*> targets;
targets.push_back(&one);
std::vector<std::string> data_keys;
data_keys.push_back("a");
std::vector<std::string> walk_keys;
walk_keys.push_back("walk");
Err err;
std::set<const Target*> targets_walked;
std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
SourceDir(), &targets_walked, &err);
EXPECT_FALSE(err.has_error()) << err.message();
std::vector<Value> expected;
expected.push_back(Value(nullptr, "bar"));
expected.push_back(Value(nullptr, "foo"));
EXPECT_EQ(result, expected) << result.size();
std::set<const Target*> expected_walked_targets;
expected_walked_targets.insert(&one);
expected_walked_targets.insert(&two);
EXPECT_EQ(targets_walked, expected_walked_targets);
}
TEST(MetadataWalkTest, CollectWithError) {
TestWithScope setup;
TestTarget one(setup, "//foo:one", Target::SOURCE_SET);
Value a_expected(nullptr, Value::LIST);
a_expected.list_value().push_back(Value(nullptr, "foo"));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("a", a_expected));
Value walk_expected(nullptr, Value::LIST);
walk_expected.list_value().push_back(Value(nullptr, "//foo:missing"));
one.metadata().contents().insert(
std::pair<base::StringPiece, Value>("walk", walk_expected));
UniqueVector<const Target*> targets;
targets.push_back(&one);
std::vector<std::string> data_keys;
data_keys.push_back("a");
std::vector<std::string> walk_keys;
walk_keys.push_back("walk");
Err err;
std::set<const Target*> targets_walked;
std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
SourceDir(), &targets_walked, &err);
EXPECT_TRUE(result.empty());
EXPECT_TRUE(err.has_error());
EXPECT_EQ(err.message(),
"I was expecting //foo:missing to be a dependency of "
"//foo:one(//toolchain:default). "
"Make sure it's included in the deps or data_deps, and that you've "
"specified the appropriate toolchain.")
<< err.message();
}