158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/build_settings.h"
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/config.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/settings.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/target.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/test_with_scope.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "tools/gn/toolchain.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tests that lib[_dir]s are inherited across deps boundaries for static
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// libraries but not executables.
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, LibInheritance) {
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  TestWithScope setup;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const std::string lib("foo");
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const SourceDir libdir("/foo_dir/");
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Leaf target with ldflags set.
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target z(setup.settings(), Label(SourceDir("//foo/"), "z"));
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  z.set_output_type(Target::STATIC_LIBRARY);
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  z.config_values().libs().push_back(lib);
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  z.config_values().lib_dirs().push_back(libdir);
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  z.visibility().SetPublic();
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  z.SetToolchain(setup.toolchain());
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(z.OnResolved(&err));
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // All lib[_dir]s should be set when target is resolved.
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(1u, z.all_libs().size());
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(lib, z.all_libs()[0]);
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(1u, z.all_lib_dirs().size());
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(libdir, z.all_lib_dirs()[0]);
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Shared library target should inherit the libs from the static library
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // and its own. Its own flag should be before the inherited one.
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const std::string second_lib("bar");
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const SourceDir second_libdir("/bar_dir/");
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target shared(setup.settings(), Label(SourceDir("//foo/"), "shared"));
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  shared.set_output_type(Target::SHARED_LIBRARY);
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  shared.config_values().libs().push_back(second_lib);
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  shared.config_values().lib_dirs().push_back(second_libdir);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  shared.private_deps().push_back(LabelTargetPair(&z));
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  shared.visibility().SetPublic();
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  shared.SetToolchain(setup.toolchain());
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(shared.OnResolved(&err));
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(2u, shared.all_libs().size());
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(second_lib, shared.all_libs()[0]);
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(lib, shared.all_libs()[1]);
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(2u, shared.all_lib_dirs().size());
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(second_libdir, shared.all_lib_dirs()[0]);
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(libdir, shared.all_lib_dirs()[1]);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Executable target shouldn't get either by depending on shared.
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target exec(setup.settings(), Label(SourceDir("//foo/"), "exec"));
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  exec.set_output_type(Target::EXECUTABLE);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  exec.private_deps().push_back(LabelTargetPair(&shared));
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  exec.SetToolchain(setup.toolchain());
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(exec.OnResolved(&err));
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, exec.all_libs().size());
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0u, exec.all_lib_dirs().size());
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test all_dependent_configs, public_config inheritance, and
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// forward_dependent_configs_from
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, DependentConfigs) {
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  TestWithScope setup;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set up a dependency chain of a -> b -> c
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  a.set_output_type(Target::EXECUTABLE);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.visibility().SetPublic();
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  a.SetToolchain(setup.toolchain());
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  b.set_output_type(Target::STATIC_LIBRARY);
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPublic();
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  b.SetToolchain(setup.toolchain());
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target c(setup.settings(), Label(SourceDir("//foo/"), "c"));
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  c.set_output_type(Target::STATIC_LIBRARY);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.visibility().SetPublic();
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  c.SetToolchain(setup.toolchain());
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.private_deps().push_back(LabelTargetPair(&b));
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.private_deps().push_back(LabelTargetPair(&c));
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Normal non-inherited config.
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Config config(setup.settings(), Label(SourceDir("//foo/"), "config"));
910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  c.configs().push_back(LabelConfigPair(&config));
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // All dependent config.
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Config all(setup.settings(), Label(SourceDir("//foo/"), "all"));
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  c.all_dependent_configs().push_back(LabelConfigPair(&all));
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Direct dependent config.
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct"));
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.public_configs().push_back(LabelConfigPair(&direct));
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(c.OnResolved(&err));
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(a.OnResolved(&err));
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // B should have gotten both dependent configs from C.
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2u, b.configs().size());
1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&all, b.configs()[0].ptr);
1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&direct, b.configs()[1].ptr);
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, b.all_dependent_configs().size());
1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&all, b.all_dependent_configs()[0].ptr);
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // A should have just gotten the "all" dependent config from C.
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, a.configs().size());
1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&all, a.configs()[0].ptr);
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&all, a.all_dependent_configs()[0].ptr);
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Making an an alternate A and B with B forwarding the direct dependents.
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target a_fwd(setup.settings(), Label(SourceDir("//foo/"), "a_fwd"));
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  a_fwd.set_output_type(Target::EXECUTABLE);
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a_fwd.visibility().SetPublic();
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  a_fwd.SetToolchain(setup.toolchain());
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target b_fwd(setup.settings(), Label(SourceDir("//foo/"), "b_fwd"));
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  b_fwd.set_output_type(Target::STATIC_LIBRARY);
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  b_fwd.SetToolchain(setup.toolchain());
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b_fwd.visibility().SetPublic();
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a_fwd.private_deps().push_back(LabelTargetPair(&b_fwd));
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b_fwd.private_deps().push_back(LabelTargetPair(&c));
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  b_fwd.forward_dependent_configs().push_back(LabelTargetPair(&c));
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b_fwd.OnResolved(&err));
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(a_fwd.OnResolved(&err));
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // A_fwd should now have both configs.
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2u, a_fwd.configs().size());
1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&all, a_fwd.configs()[0].ptr);
1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&direct, a_fwd.configs()[1].ptr);
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, a_fwd.all_dependent_configs().size());
1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr);
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, InheritLibs) {
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  TestWithScope setup;
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Create a dependency chain:
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   A (executable) -> B (shared lib) -> C (static lib) -> D (source set)
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  a.set_output_type(Target::EXECUTABLE);
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.visibility().SetPublic();
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  a.SetToolchain(setup.toolchain());
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  b.set_output_type(Target::SHARED_LIBRARY);
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPublic();
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  b.SetToolchain(setup.toolchain());
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target c(setup.settings(), Label(SourceDir("//foo/"), "c"));
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  c.set_output_type(Target::STATIC_LIBRARY);
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.visibility().SetPublic();
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  c.SetToolchain(setup.toolchain());
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target d(setup.settings(), Label(SourceDir("//foo/"), "d"));
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  d.set_output_type(Target::SOURCE_SET);
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  d.visibility().SetPublic();
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  d.SetToolchain(setup.toolchain());
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.private_deps().push_back(LabelTargetPair(&b));
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.private_deps().push_back(LabelTargetPair(&c));
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.private_deps().push_back(LabelTargetPair(&d));
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(d.OnResolved(&err));
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(c.OnResolved(&err));
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(a.OnResolved(&err));
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // C should have D in its inherited libs.
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const UniqueVector<const Target*>& c_inherited = c.inherited_libraries();
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, c_inherited.size());
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1));
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // B should have C and D in its inherited libs.
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const UniqueVector<const Target*>& b_inherited = b.inherited_libraries();
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2u, b_inherited.size());
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1));
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(b_inherited.IndexOf(&d) != static_cast<size_t>(-1));
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // A should have B in its inherited libs, but not any others (the shared
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // library will include the static library and source set).
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const UniqueVector<const Target*>& a_inherited = a.inherited_libraries();
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, a_inherited.size());
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1));
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, InheritCompleteStaticLib) {
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Create a dependency chain:
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   A (executable) -> B (complete static lib) -> C (source set)
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_output_type(Target::EXECUTABLE);
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.visibility().SetPublic();
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.SetToolchain(setup.toolchain());
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_output_type(Target::STATIC_LIBRARY);
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPublic();
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_complete_static_lib(true);
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.SetToolchain(setup.toolchain());
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target c(setup.settings(), Label(SourceDir("//foo/"), "c"));
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.set_output_type(Target::SOURCE_SET);
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.visibility().SetPublic();
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.SetToolchain(setup.toolchain());
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.public_deps().push_back(LabelTargetPair(&b));
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.public_deps().push_back(LabelTargetPair(&c));
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(c.OnResolved(&err));
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(a.OnResolved(&err));
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // B should have C in its inherited libs.
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const UniqueVector<const Target*>& b_inherited = b.inherited_libraries();
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1u, b_inherited.size());
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1));
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A should have B in its inherited libs, but not any others (the complete
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // static library will include the source set).
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const UniqueVector<const Target*>& a_inherited = a.inherited_libraries();
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1u, a_inherited.size());
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(a_inherited.IndexOf(&b) != static_cast<size_t>(-1));
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, InheritCompleteStaticLibNoDirectStaticLibDeps) {
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Create a dependency chain:
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   A (complete static lib) -> B (static lib)
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_output_type(Target::STATIC_LIBRARY);
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.visibility().SetPublic();
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_complete_static_lib(true);
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.SetToolchain(setup.toolchain());
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_output_type(Target::STATIC_LIBRARY);
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPublic();
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.SetToolchain(setup.toolchain());
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.public_deps().push_back(LabelTargetPair(&b));
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(a.OnResolved(&err));
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, InheritCompleteStaticLibNoIheritedStaticLibDeps) {
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Create a dependency chain:
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   A (complete static lib) -> B (source set) -> C (static lib)
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_output_type(Target::STATIC_LIBRARY);
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.visibility().SetPublic();
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_complete_static_lib(true);
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.SetToolchain(setup.toolchain());
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_output_type(Target::SOURCE_SET);
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPublic();
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.SetToolchain(setup.toolchain());
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target c(setup.settings(), Label(SourceDir("//foo/"), "c"));
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.set_output_type(Target::STATIC_LIBRARY);
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.visibility().SetPublic();
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c.SetToolchain(setup.toolchain());
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.public_deps().push_back(LabelTargetPair(&b));
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.public_deps().push_back(LabelTargetPair(&c));
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(c.OnResolved(&err));
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(a.OnResolved(&err));
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(Target, GetComputedOutputName) {
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  TestWithScope setup;
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Basic target with no prefix (executable type tool in the TestWithScope has
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // no prefix) or output name.
28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target basic(setup.settings(), Label(SourceDir("//foo/"), "bar"));
28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  basic.set_output_type(Target::EXECUTABLE);
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  basic.SetToolchain(setup.toolchain());
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(basic.OnResolved(&err));
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("bar", basic.GetComputedOutputName(false));
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("bar", basic.GetComputedOutputName(true));
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Target with no prefix but an output name.
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target with_name(setup.settings(), Label(SourceDir("//foo/"), "bar"));
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  with_name.set_output_type(Target::EXECUTABLE);
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  with_name.set_output_name("myoutput");
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  with_name.SetToolchain(setup.toolchain());
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(with_name.OnResolved(&err));
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("myoutput", with_name.GetComputedOutputName(false));
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("myoutput", with_name.GetComputedOutputName(true));
29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Target with a "lib" prefix (the static library tool in the TestWithScope
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // should specify a "lib" output prefix).
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target with_prefix(setup.settings(), Label(SourceDir("//foo/"), "bar"));
30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  with_prefix.set_output_type(Target::STATIC_LIBRARY);
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  with_prefix.SetToolchain(setup.toolchain());
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(with_prefix.OnResolved(&err));
30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("bar", with_prefix.GetComputedOutputName(false));
30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("libbar", with_prefix.GetComputedOutputName(true));
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Target with a "lib" prefix that already has it applied. The prefix should
30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // not duplicate something already in the target name.
31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Target dup_prefix(setup.settings(), Label(SourceDir("//foo/"), "bar"));
31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dup_prefix.set_output_type(Target::STATIC_LIBRARY);
31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dup_prefix.set_output_name("libbar");
31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dup_prefix.SetToolchain(setup.toolchain());
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(dup_prefix.OnResolved(&err));
31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName(false));
31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName(true));
31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test visibility failure case.
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, VisibilityFails) {
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target b(setup.settings(), Label(SourceDir("//private/"), "b"));
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_output_type(Target::STATIC_LIBRARY);
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.SetToolchain(setup.toolchain());
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPrivate(b.label().dir());
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Make a target depending on "b". The dependency must have an origin to mark
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // it as user-set so we check visibility. This check should fail.
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target a(setup.settings(), Label(SourceDir("//app/"), "a"));
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_output_type(Target::EXECUTABLE);
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.private_deps().push_back(LabelTargetPair(&b));
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IdentifierNode origin;  // Dummy origin.
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.private_deps()[0].origin = &origin;
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.SetToolchain(setup.toolchain());
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(a.OnResolved(&err));
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test visibility with a single data_dep.
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, VisibilityDatadeps) {
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target b(setup.settings(), Label(SourceDir("//public/"), "b"));
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_output_type(Target::STATIC_LIBRARY);
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.SetToolchain(setup.toolchain());
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPublic();
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Make a target depending on "b". The dependency must have an origin to mark
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // it as user-set so we check visibility. This check should fail.
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target a(setup.settings(), Label(SourceDir("//app/"), "a"));
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_output_type(Target::EXECUTABLE);
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.data_deps().push_back(LabelTargetPair(&b));
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IdentifierNode origin;  // Dummy origin.
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.data_deps()[0].origin = &origin;
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.SetToolchain(setup.toolchain());
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(a.OnResolved(&err)) << err.help_text();
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that A -> Group -> B where the group is visible from A but B isn't,
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// passes visibility even though the group's deps get expanded into A.
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, VisibilityGroup) {
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IdentifierNode origin;  // Dummy origin.
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // B has private visibility. This lets the group see it since the group is in
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the same directory.
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target b(setup.settings(), Label(SourceDir("//private/"), "b"));
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.set_output_type(Target::STATIC_LIBRARY);
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.SetToolchain(setup.toolchain());
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b.visibility().SetPrivate(b.label().dir());
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The group has public visibility and depends on b.
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target g(setup.settings(), Label(SourceDir("//private/"), "g"));
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g.set_output_type(Target::GROUP);
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g.SetToolchain(setup.toolchain());
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g.private_deps().push_back(LabelTargetPair(&b));
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g.private_deps()[0].origin = &origin;
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g.visibility().SetPublic();
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(b.OnResolved(&err));
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Make a target depending on "g". This should succeed.
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target a(setup.settings(), Label(SourceDir("//app/"), "a"));
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.set_output_type(Target::EXECUTABLE);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.private_deps().push_back(LabelTargetPair(&g));
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.private_deps()[0].origin = &origin;
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  a.SetToolchain(setup.toolchain());
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(a.OnResolved(&err));
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that only testonly targets can depend on other testonly targets.
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Many of the above dependency checking cases covered the non-testonly
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// case.
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, Testonly) {
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // "testlib" is a test-only library.
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target testlib(setup.settings(), Label(SourceDir("//test/"), "testlib"));
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  testlib.set_testonly(true);
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  testlib.set_output_type(Target::STATIC_LIBRARY);
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  testlib.visibility().SetPublic();
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  testlib.SetToolchain(setup.toolchain());
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(testlib.OnResolved(&err));
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // "test" is a test-only executable depending on testlib, this is OK.
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target test(setup.settings(), Label(SourceDir("//test/"), "test"));
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.set_testonly(true);
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.set_output_type(Target::EXECUTABLE);
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.private_deps().push_back(LabelTargetPair(&testlib));
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.SetToolchain(setup.toolchain());
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(test.OnResolved(&err));
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // "product" is a non-test depending on testlib. This should fail.
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target product(setup.settings(), Label(SourceDir("//app/"), "product"));
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  product.set_testonly(false);
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  product.set_output_type(Target::EXECUTABLE);
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  product.private_deps().push_back(LabelTargetPair(&testlib));
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  product.SetToolchain(setup.toolchain());
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(product.OnResolved(&err));
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, PublicConfigs) {
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Label pub_config_label(SourceDir("//a/"), "pubconfig");
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Config pub_config(setup.settings(), pub_config_label);
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This is the destination target that has a public config.
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target dest(setup.settings(), Label(SourceDir("//a/"), "a"));
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dest.set_output_type(Target::SOURCE_SET);
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dest.visibility().SetPublic();
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dest.SetToolchain(setup.toolchain());
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dest.public_configs().push_back(LabelConfigPair(&pub_config));
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(dest.OnResolved(&err));
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This target has a public dependency on dest.
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target pub(setup.settings(), Label(SourceDir("//a/"), "pub"));
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pub.set_output_type(Target::SOURCE_SET);
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pub.visibility().SetPublic();
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pub.SetToolchain(setup.toolchain());
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pub.public_deps().push_back(LabelTargetPair(&dest));
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(pub.OnResolved(&err));
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Depending on the target with the public dependency should forward dest's
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to the current target.
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target dep_on_pub(setup.settings(), Label(SourceDir("//a/"), "dop"));
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_pub.set_output_type(Target::SOURCE_SET);
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_pub.visibility().SetPublic();
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_pub.SetToolchain(setup.toolchain());
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_pub.private_deps().push_back(LabelTargetPair(&pub));
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(dep_on_pub.OnResolved(&err));
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, dep_on_pub.configs().size());
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(&pub_config, dep_on_pub.configs()[0].ptr);
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This target has a private dependency on dest for forwards configs.
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target forward(setup.settings(), Label(SourceDir("//a/"), "f"));
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  forward.set_output_type(Target::SOURCE_SET);
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  forward.visibility().SetPublic();
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  forward.SetToolchain(setup.toolchain());
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  forward.private_deps().push_back(LabelTargetPair(&dest));
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  forward.forward_dependent_configs().push_back(LabelTargetPair(&dest));
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(forward.OnResolved(&err));
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Depending on the forward target should apply the config.
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target dep_on_forward(setup.settings(), Label(SourceDir("//a/"), "dof"));
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_forward.set_output_type(Target::SOURCE_SET);
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_forward.visibility().SetPublic();
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_forward.SetToolchain(setup.toolchain());
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dep_on_forward.private_deps().push_back(LabelTargetPair(&forward));
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(dep_on_forward.OnResolved(&err));
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, dep_on_forward.configs().size());
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(&pub_config, dep_on_forward.configs()[0].ptr);
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that different link/depend outputs work for solink tools.
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(Target, LinkAndDepOutputs) {
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWithScope setup;
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Err err;
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Toolchain toolchain(setup.settings(), Label(SourceDir("//tc/"), "tc"));
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<Tool> solink_tool(new Tool());
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  solink_tool->set_output_prefix("lib");
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  solink_tool->set_default_output_extension(".so");
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kLinkPattern[] =
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{{root_out_dir}}/{{target_output_name}}{{output_extension}}";
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SubstitutionPattern link_output = SubstitutionPattern::MakeForTest(
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kLinkPattern);
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  solink_tool->set_link_output(link_output);
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kDependPattern[] =
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.TOC";
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SubstitutionPattern depend_output = SubstitutionPattern::MakeForTest(
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kDependPattern);
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  solink_tool->set_depend_output(depend_output);
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  solink_tool->set_outputs(SubstitutionList::MakeForTest(
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kLinkPattern, kDependPattern));
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  toolchain.SetTool(Toolchain::TYPE_SOLINK, solink_tool.Pass());
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Target target(setup.settings(), Label(SourceDir("//a/"), "a"));
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target.set_output_type(Target::SHARED_LIBRARY);
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target.SetToolchain(&toolchain);
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(target.OnResolved(&err));
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("./liba.so", target.link_output_file().value());
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value());
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
519