Index: tools/gn/target_unittest.cc |
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc |
index 8cc29e1771b555a2fa35b3b3fcf875d7008a9018..020d43226763d0d02b795e574b82d96f87e8c024 100644 |
--- a/tools/gn/target_unittest.cc |
+++ b/tools/gn/target_unittest.cc |
@@ -170,21 +170,21 @@ TEST(Target, InheritLibs) { |
ASSERT_TRUE(a.OnResolved(&err)); |
// C should have D in its inherited libs. |
- const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); |
- EXPECT_EQ(1u, c_inherited.size()); |
- EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); |
+ std::vector<const Target*> c_inherited = c.inherited_libraries().GetOrdered(); |
+ ASSERT_EQ(1u, c_inherited.size()); |
+ EXPECT_EQ(&d, c_inherited[0]); |
// B should have C and D in its inherited libs. |
- const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); |
- EXPECT_EQ(2u, b_inherited.size()); |
- EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); |
- EXPECT_TRUE(b_inherited.IndexOf(&d) != static_cast<size_t>(-1)); |
+ std::vector<const Target*> b_inherited = b.inherited_libraries().GetOrdered(); |
+ ASSERT_EQ(2u, b_inherited.size()); |
+ EXPECT_EQ(&c, b_inherited[0]); |
+ EXPECT_EQ(&d, b_inherited[1]); |
// A should have B in its inherited libs, but not any others (the shared |
// library will include the static library and source set). |
- const UniqueVector<const Target*>& a_inherited = a.inherited_libraries(); |
- EXPECT_EQ(1u, a_inherited.size()); |
- EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1)); |
+ std::vector<const Target*> a_inherited = a.inherited_libraries().GetOrdered(); |
+ ASSERT_EQ(1u, a_inherited.size()); |
+ EXPECT_EQ(&b, a_inherited[0]); |
} |
TEST(Target, InheritCompleteStaticLib) { |
@@ -214,15 +214,15 @@ TEST(Target, InheritCompleteStaticLib) { |
ASSERT_TRUE(a.OnResolved(&err)); |
// B should have C in its inherited libs. |
- const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); |
- EXPECT_EQ(1u, b_inherited.size()); |
- EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); |
+ std::vector<const Target*> b_inherited = b.inherited_libraries().GetOrdered(); |
+ ASSERT_EQ(1u, b_inherited.size()); |
+ EXPECT_EQ(&c, b_inherited[0]); |
// A should have B in its inherited libs, but not any others (the complete |
// static library will include the source set). |
- const UniqueVector<const Target*>& a_inherited = a.inherited_libraries(); |
+ std::vector<const Target*> a_inherited = a.inherited_libraries().GetOrdered(); |
EXPECT_EQ(1u, a_inherited.size()); |
- EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1)); |
+ EXPECT_EQ(&b, a_inherited[0]); |
} |
TEST(Target, InheritCompleteStaticLibNoDirectStaticLibDeps) { |
@@ -516,3 +516,57 @@ TEST(Target, LinkAndDepOutputs) { |
EXPECT_EQ("./liba.so", target.link_output_file().value()); |
EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value()); |
} |
+ |
+// Shared libraries should be inherited across public shared liobrary |
+// boundaries. |
+TEST(Target, SharedInheritance) { |
+ TestWithScope setup; |
+ Err err; |
+ |
+ // Create two leaf shared libraries. |
+ Target pub(setup.settings(), Label(SourceDir("//foo/"), "pub")); |
+ pub.set_output_type(Target::SHARED_LIBRARY); |
+ pub.visibility().SetPublic(); |
+ pub.SetToolchain(setup.toolchain()); |
+ ASSERT_TRUE(pub.OnResolved(&err)); |
+ |
+ Target priv(setup.settings(), Label(SourceDir("//foo/"), "priv")); |
+ priv.set_output_type(Target::SHARED_LIBRARY); |
+ priv.visibility().SetPublic(); |
+ priv.SetToolchain(setup.toolchain()); |
+ ASSERT_TRUE(priv.OnResolved(&err)); |
+ |
+ // Intermediate shared library with the leaf shared libraries as |
+ // dependencies, one public, one private. |
+ Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter")); |
+ inter.set_output_type(Target::SHARED_LIBRARY); |
+ inter.visibility().SetPublic(); |
+ inter.public_deps().push_back(LabelTargetPair(&pub)); |
+ inter.private_deps().push_back(LabelTargetPair(&priv)); |
+ inter.SetToolchain(setup.toolchain()); |
+ ASSERT_TRUE(inter.OnResolved(&err)); |
+ |
+ // The intermediate shared library should have both "pub" and "priv" in its |
+ // inherited libraries. |
+ std::vector<const Target*> inter_inherited = |
+ inter.inherited_libraries().GetOrdered(); |
+ ASSERT_EQ(2u, inter_inherited.size()); |
+ EXPECT_EQ(&pub, inter_inherited[0]); |
+ EXPECT_EQ(&priv, inter_inherited[1]); |
+ |
+ // Make a toplevel executable target depending on the intermediate one. |
+ Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe")); |
+ exe.set_output_type(Target::SHARED_LIBRARY); |
+ exe.visibility().SetPublic(); |
+ exe.private_deps().push_back(LabelTargetPair(&inter)); |
+ exe.SetToolchain(setup.toolchain()); |
+ ASSERT_TRUE(exe.OnResolved(&err)); |
+ |
+ // The exe's inherited libraries should be "inter" (because it depended |
+ // directly on it) and "pub" (because inter depended publicly on it). |
+ std::vector<const Target*> exe_inherited = |
+ exe.inherited_libraries().GetOrdered(); |
+ ASSERT_EQ(2u, exe_inherited.size()); |
+ EXPECT_EQ(&inter, exe_inherited[0]); |
+ EXPECT_EQ(&pub, exe_inherited[1]); |
+} |