|  | // Copyright 2015 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/inherited_libraries.h" | 
|  | #include "tools/gn/target.h" | 
|  | #include "tools/gn/test_with_scope.h" | 
|  | #include "util/test/test.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // In these tests, Pair can't be used conveniently because the | 
|  | // "const" won't be inferred and the types won't match. This helper makes the | 
|  | // right type of pair with the const Target. | 
|  | std::pair<const Target*, bool> Pair(const Target* t, bool b) { | 
|  | return std::pair<const Target*, bool>(t, b); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | TEST(InheritedLibraries, Unique) { | 
|  | TestWithScope setup; | 
|  |  | 
|  | Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 
|  | Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 
|  |  | 
|  | // Setup, add the two targets as private. | 
|  | InheritedLibraries libs; | 
|  | libs.Append(&a, false); | 
|  | libs.Append(&b, false); | 
|  | auto result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(2u, result.size()); | 
|  | EXPECT_EQ(Pair(&a, false), result[0]); | 
|  | EXPECT_EQ(Pair(&b, false), result[1]); | 
|  |  | 
|  | // Add again as private, this should be a NOP. | 
|  | libs.Append(&a, false); | 
|  | libs.Append(&b, false); | 
|  | result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(2u, result.size()); | 
|  | EXPECT_EQ(Pair(&a, false), result[0]); | 
|  | EXPECT_EQ(Pair(&b, false), result[1]); | 
|  |  | 
|  | // Add as public, this should make both public. | 
|  | libs.Append(&a, true); | 
|  | libs.Append(&b, true); | 
|  | result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(2u, result.size()); | 
|  | EXPECT_EQ(Pair(&a, true), result[0]); | 
|  | EXPECT_EQ(Pair(&b, true), result[1]); | 
|  |  | 
|  | // Add again private, they should stay public. | 
|  | libs.Append(&a, false); | 
|  | libs.Append(&b, false); | 
|  | result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(2u, result.size()); | 
|  | EXPECT_EQ(Pair(&a, true), result[0]); | 
|  | EXPECT_EQ(Pair(&b, true), result[1]); | 
|  | } | 
|  |  | 
|  | TEST(InheritedLibraries, AppendInherited) { | 
|  | TestWithScope setup; | 
|  |  | 
|  | Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 
|  | Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 
|  | Target w(setup.settings(), Label(SourceDir("//foo/"), "w")); | 
|  | Target x(setup.settings(), Label(SourceDir("//foo/"), "x")); | 
|  | Target y(setup.settings(), Label(SourceDir("//foo/"), "y")); | 
|  | Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); | 
|  |  | 
|  | InheritedLibraries libs; | 
|  | libs.Append(&a, false); | 
|  | libs.Append(&b, false); | 
|  |  | 
|  | // Appending these things with private inheritance should make them private, | 
|  | // no matter how they're listed in the appended class. | 
|  | InheritedLibraries append_private; | 
|  | append_private.Append(&a, true); | 
|  | append_private.Append(&b, false); | 
|  | append_private.Append(&w, true); | 
|  | append_private.Append(&x, false); | 
|  | libs.AppendInherited(append_private, false); | 
|  |  | 
|  | auto result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(4u, result.size()); | 
|  | EXPECT_EQ(Pair(&a, false), result[0]); | 
|  | EXPECT_EQ(Pair(&b, false), result[1]); | 
|  | EXPECT_EQ(Pair(&w, false), result[2]); | 
|  | EXPECT_EQ(Pair(&x, false), result[3]); | 
|  |  | 
|  | // Appending these things with public inheritance should convert them. | 
|  | InheritedLibraries append_public; | 
|  | append_public.Append(&a, true); | 
|  | append_public.Append(&b, false); | 
|  | append_public.Append(&y, true); | 
|  | append_public.Append(&z, false); | 
|  | libs.AppendInherited(append_public, true); | 
|  |  | 
|  | result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(6u, result.size()); | 
|  | EXPECT_EQ(Pair(&a, true), result[0]);  // Converted to public. | 
|  | EXPECT_EQ(Pair(&b, false), result[1]); | 
|  | EXPECT_EQ(Pair(&w, false), result[2]); | 
|  | EXPECT_EQ(Pair(&x, false), result[3]); | 
|  | EXPECT_EQ(Pair(&y, true), result[4]);  // Appended as public. | 
|  | EXPECT_EQ(Pair(&z, false), result[5]); | 
|  | } | 
|  |  | 
|  | TEST(InheritedLibraries, AppendPublicSharedLibraries) { | 
|  | TestWithScope setup; | 
|  | InheritedLibraries append; | 
|  |  | 
|  | // Two source sets. | 
|  | Target set_pub(setup.settings(), Label(SourceDir("//foo/"), "set_pub")); | 
|  | set_pub.set_output_type(Target::SOURCE_SET); | 
|  | append.Append(&set_pub, true); | 
|  | Target set_priv(setup.settings(), Label(SourceDir("//foo/"), "set_priv")); | 
|  | set_priv.set_output_type(Target::SOURCE_SET); | 
|  | append.Append(&set_priv, false); | 
|  |  | 
|  | // Two shared libraries. | 
|  | Target sh_pub(setup.settings(), Label(SourceDir("//foo/"), "sh_pub")); | 
|  | sh_pub.set_output_type(Target::SHARED_LIBRARY); | 
|  | append.Append(&sh_pub, true); | 
|  | Target sh_priv(setup.settings(), Label(SourceDir("//foo/"), "sh_priv")); | 
|  | sh_priv.set_output_type(Target::SHARED_LIBRARY); | 
|  | append.Append(&sh_priv, false); | 
|  |  | 
|  | InheritedLibraries libs; | 
|  | libs.AppendPublicSharedLibraries(append, true); | 
|  |  | 
|  | auto result = libs.GetOrderedAndPublicFlag(); | 
|  | ASSERT_EQ(1u, result.size()); | 
|  | EXPECT_EQ(Pair(&sh_pub, true), result[0]); | 
|  | } |