Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(257)

Unified Diff: tools/gn/inherited_libraries_unittest.cc

Issue 1083663007: Propagate GN public shared libraries through shared libraries (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more docs Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/gn/inherited_libraries_unittest.cc
diff --git a/tools/gn/inherited_libraries_unittest.cc b/tools/gn/inherited_libraries_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..51152095352bc4adeb882f9a7853adb7fb9f5cdd
--- /dev/null
+++ b/tools/gn/inherited_libraries_unittest.cc
@@ -0,0 +1,135 @@
+// 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 "testing/gtest/include/gtest/gtest.h"
+#include "tools/gn/inherited_libraries.h"
+#include "tools/gn/target.h"
+#include "tools/gn/test_with_scope.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]);
+}

Powered by Google App Engine
This is Rietveld 408576698