blob: 185b60bebacb6f5e173859fca07a9220eced259e [file] [log] [blame]
// 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]);
}