| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
| 6 #include "tools/gn/build_settings.h" | 6 #include "tools/gn/build_settings.h" |
| 7 #include "tools/gn/config.h" | 7 #include "tools/gn/config.h" |
| 8 #include "tools/gn/settings.h" | 8 #include "tools/gn/settings.h" |
| 9 #include "tools/gn/target.h" | 9 #include "tools/gn/target.h" |
| 10 #include "tools/gn/test_with_scope.h" | 10 #include "tools/gn/test_with_scope.h" |
| 11 #include "tools/gn/toolchain.h" | 11 #include "tools/gn/toolchain.h" |
| 12 | 12 |
| 13 // Tests that depending on a group is like depending directly on the group's | |
| 14 // deps. | |
| 15 TEST(Target, GroupDeps) { | |
| 16 TestWithScope setup; | |
| 17 Err err; | |
| 18 | |
| 19 // Used as the origin for the not-automatically-set deps. | |
| 20 IdentifierNode origin; | |
| 21 | |
| 22 // Two low-level targets. | |
| 23 Target x(setup.settings(), Label(SourceDir("//component/"), "x")); | |
| 24 x.set_output_type(Target::STATIC_LIBRARY); | |
| 25 x.SetToolchain(setup.toolchain()); | |
| 26 ASSERT_TRUE(x.OnResolved(&err)); | |
| 27 Target y(setup.settings(), Label(SourceDir("//component/"), "y")); | |
| 28 y.set_output_type(Target::STATIC_LIBRARY); | |
| 29 y.SetToolchain(setup.toolchain()); | |
| 30 ASSERT_TRUE(y.OnResolved(&err)); | |
| 31 | |
| 32 // Make a group for both x and y. | |
| 33 Target g(setup.settings(), Label(SourceDir("//group/"), "g")); | |
| 34 g.set_output_type(Target::GROUP); | |
| 35 g.visibility().SetPublic(); | |
| 36 g.deps().push_back(LabelTargetPair(&x)); | |
| 37 g.deps()[0].origin = &origin; | |
| 38 g.deps().push_back(LabelTargetPair(&y)); | |
| 39 g.deps()[1].origin = &origin; | |
| 40 | |
| 41 // Random placeholder target so we can see the group's deps get inserted at | |
| 42 // the right place. | |
| 43 Target b(setup.settings(), Label(SourceDir("//app/"), "b")); | |
| 44 b.set_output_type(Target::STATIC_LIBRARY); | |
| 45 b.SetToolchain(setup.toolchain()); | |
| 46 b.visibility().SetPublic(); | |
| 47 ASSERT_TRUE(b.OnResolved(&err)); | |
| 48 | |
| 49 // Make a target depending on the group and "b". OnResolved will expand. | |
| 50 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | |
| 51 a.set_output_type(Target::EXECUTABLE); | |
| 52 a.deps().push_back(LabelTargetPair(&g)); | |
| 53 a.deps()[0].origin = &origin; | |
| 54 a.deps().push_back(LabelTargetPair(&b)); | |
| 55 a.deps()[1].origin = &origin; | |
| 56 a.SetToolchain(setup.toolchain()); | |
| 57 ASSERT_TRUE(a.OnResolved(&err)); | |
| 58 | |
| 59 // The group's deps should be inserted after the group itself in the deps | |
| 60 // list, so we should get "g, x, y, b" | |
| 61 ASSERT_EQ(4u, a.deps().size()); | |
| 62 EXPECT_EQ(&g, a.deps()[0].ptr); | |
| 63 EXPECT_EQ(&x, a.deps()[1].ptr); | |
| 64 EXPECT_EQ(&y, a.deps()[2].ptr); | |
| 65 EXPECT_EQ(&b, a.deps()[3].ptr); | |
| 66 | |
| 67 // The "regular" deps on a should have the origin set. The automatically | |
| 68 // expanded ones will have a null origin so we know they are generated. | |
| 69 EXPECT_EQ(&origin, a.deps()[0].origin); | |
| 70 EXPECT_EQ(NULL, a.deps()[1].origin); | |
| 71 EXPECT_EQ(NULL, a.deps()[2].origin); | |
| 72 EXPECT_EQ(&origin, a.deps()[3].origin); | |
| 73 } | |
| 74 | |
| 75 // Tests that lib[_dir]s are inherited across deps boundaries for static | 13 // Tests that lib[_dir]s are inherited across deps boundaries for static |
| 76 // libraries but not executables. | 14 // libraries but not executables. |
| 77 TEST(Target, LibInheritance) { | 15 TEST(Target, LibInheritance) { |
| 78 TestWithScope setup; | 16 TestWithScope setup; |
| 79 Err err; | 17 Err err; |
| 80 | 18 |
| 81 const std::string lib("foo"); | 19 const std::string lib("foo"); |
| 82 const SourceDir libdir("/foo_dir/"); | 20 const SourceDir libdir("/foo_dir/"); |
| 83 | 21 |
| 84 // Leaf target with ldflags set. | 22 // Leaf target with ldflags set. |
| 85 Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); | 23 Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); |
| 86 z.set_output_type(Target::STATIC_LIBRARY); | 24 z.set_output_type(Target::STATIC_LIBRARY); |
| 87 z.config_values().libs().push_back(lib); | 25 z.config_values().libs().push_back(lib); |
| 88 z.config_values().lib_dirs().push_back(libdir); | 26 z.config_values().lib_dirs().push_back(libdir); |
| 27 z.visibility().SetPublic(); |
| 89 z.SetToolchain(setup.toolchain()); | 28 z.SetToolchain(setup.toolchain()); |
| 90 ASSERT_TRUE(z.OnResolved(&err)); | 29 ASSERT_TRUE(z.OnResolved(&err)); |
| 91 | 30 |
| 92 // All lib[_dir]s should be set when target is resolved. | 31 // All lib[_dir]s should be set when target is resolved. |
| 93 ASSERT_EQ(1u, z.all_libs().size()); | 32 ASSERT_EQ(1u, z.all_libs().size()); |
| 94 EXPECT_EQ(lib, z.all_libs()[0]); | 33 EXPECT_EQ(lib, z.all_libs()[0]); |
| 95 ASSERT_EQ(1u, z.all_lib_dirs().size()); | 34 ASSERT_EQ(1u, z.all_lib_dirs().size()); |
| 96 EXPECT_EQ(libdir, z.all_lib_dirs()[0]); | 35 EXPECT_EQ(libdir, z.all_lib_dirs()[0]); |
| 97 | 36 |
| 98 // Shared library target should inherit the libs from the static library | 37 // Shared library target should inherit the libs from the static library |
| 99 // and its own. Its own flag should be before the inherited one. | 38 // and its own. Its own flag should be before the inherited one. |
| 100 const std::string second_lib("bar"); | 39 const std::string second_lib("bar"); |
| 101 const SourceDir second_libdir("/bar_dir/"); | 40 const SourceDir second_libdir("/bar_dir/"); |
| 102 Target shared(setup.settings(), Label(SourceDir("//foo/"), "shared")); | 41 Target shared(setup.settings(), Label(SourceDir("//foo/"), "shared")); |
| 103 shared.set_output_type(Target::SHARED_LIBRARY); | 42 shared.set_output_type(Target::SHARED_LIBRARY); |
| 104 shared.config_values().libs().push_back(second_lib); | 43 shared.config_values().libs().push_back(second_lib); |
| 105 shared.config_values().lib_dirs().push_back(second_libdir); | 44 shared.config_values().lib_dirs().push_back(second_libdir); |
| 106 shared.deps().push_back(LabelTargetPair(&z)); | 45 shared.private_deps().push_back(LabelTargetPair(&z)); |
| 46 shared.visibility().SetPublic(); |
| 107 shared.SetToolchain(setup.toolchain()); | 47 shared.SetToolchain(setup.toolchain()); |
| 108 ASSERT_TRUE(shared.OnResolved(&err)); | 48 ASSERT_TRUE(shared.OnResolved(&err)); |
| 109 | 49 |
| 110 ASSERT_EQ(2u, shared.all_libs().size()); | 50 ASSERT_EQ(2u, shared.all_libs().size()); |
| 111 EXPECT_EQ(second_lib, shared.all_libs()[0]); | 51 EXPECT_EQ(second_lib, shared.all_libs()[0]); |
| 112 EXPECT_EQ(lib, shared.all_libs()[1]); | 52 EXPECT_EQ(lib, shared.all_libs()[1]); |
| 113 ASSERT_EQ(2u, shared.all_lib_dirs().size()); | 53 ASSERT_EQ(2u, shared.all_lib_dirs().size()); |
| 114 EXPECT_EQ(second_libdir, shared.all_lib_dirs()[0]); | 54 EXPECT_EQ(second_libdir, shared.all_lib_dirs()[0]); |
| 115 EXPECT_EQ(libdir, shared.all_lib_dirs()[1]); | 55 EXPECT_EQ(libdir, shared.all_lib_dirs()[1]); |
| 116 | 56 |
| 117 // Executable target shouldn't get either by depending on shared. | 57 // Executable target shouldn't get either by depending on shared. |
| 118 Target exec(setup.settings(), Label(SourceDir("//foo/"), "exec")); | 58 Target exec(setup.settings(), Label(SourceDir("//foo/"), "exec")); |
| 119 exec.set_output_type(Target::EXECUTABLE); | 59 exec.set_output_type(Target::EXECUTABLE); |
| 120 exec.deps().push_back(LabelTargetPair(&shared)); | 60 exec.private_deps().push_back(LabelTargetPair(&shared)); |
| 121 exec.SetToolchain(setup.toolchain()); | 61 exec.SetToolchain(setup.toolchain()); |
| 122 ASSERT_TRUE(exec.OnResolved(&err)); | 62 ASSERT_TRUE(exec.OnResolved(&err)); |
| 123 EXPECT_EQ(0u, exec.all_libs().size()); | 63 EXPECT_EQ(0u, exec.all_libs().size()); |
| 124 EXPECT_EQ(0u, exec.all_lib_dirs().size()); | 64 EXPECT_EQ(0u, exec.all_lib_dirs().size()); |
| 125 } | 65 } |
| 126 | 66 |
| 127 // Test all/direct_dependent_configs inheritance, and | 67 // Test all_dependent_configs, public_config inheritance, and |
| 128 // forward_dependent_configs_from | 68 // forward_dependent_configs_from |
| 129 TEST(Target, DependentConfigs) { | 69 TEST(Target, DependentConfigs) { |
| 130 TestWithScope setup; | 70 TestWithScope setup; |
| 131 Err err; | 71 Err err; |
| 132 | 72 |
| 133 // Set up a dependency chain of a -> b -> c | 73 // Set up a dependency chain of a -> b -> c |
| 134 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 74 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
| 135 a.set_output_type(Target::EXECUTABLE); | 75 a.set_output_type(Target::EXECUTABLE); |
| 76 a.visibility().SetPublic(); |
| 136 a.SetToolchain(setup.toolchain()); | 77 a.SetToolchain(setup.toolchain()); |
| 137 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 78 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
| 138 b.set_output_type(Target::STATIC_LIBRARY); | 79 b.set_output_type(Target::STATIC_LIBRARY); |
| 80 b.visibility().SetPublic(); |
| 139 b.SetToolchain(setup.toolchain()); | 81 b.SetToolchain(setup.toolchain()); |
| 140 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | 82 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); |
| 141 c.set_output_type(Target::STATIC_LIBRARY); | 83 c.set_output_type(Target::STATIC_LIBRARY); |
| 84 c.visibility().SetPublic(); |
| 142 c.SetToolchain(setup.toolchain()); | 85 c.SetToolchain(setup.toolchain()); |
| 143 a.deps().push_back(LabelTargetPair(&b)); | 86 a.private_deps().push_back(LabelTargetPair(&b)); |
| 144 b.deps().push_back(LabelTargetPair(&c)); | 87 b.private_deps().push_back(LabelTargetPair(&c)); |
| 145 | 88 |
| 146 // Normal non-inherited config. | 89 // Normal non-inherited config. |
| 147 Config config(setup.settings(), Label(SourceDir("//foo/"), "config")); | 90 Config config(setup.settings(), Label(SourceDir("//foo/"), "config")); |
| 148 c.configs().push_back(LabelConfigPair(&config)); | 91 c.configs().push_back(LabelConfigPair(&config)); |
| 149 | 92 |
| 150 // All dependent config. | 93 // All dependent config. |
| 151 Config all(setup.settings(), Label(SourceDir("//foo/"), "all")); | 94 Config all(setup.settings(), Label(SourceDir("//foo/"), "all")); |
| 152 c.all_dependent_configs().push_back(LabelConfigPair(&all)); | 95 c.all_dependent_configs().push_back(LabelConfigPair(&all)); |
| 153 | 96 |
| 154 // Direct dependent config. | 97 // Direct dependent config. |
| 155 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); | 98 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); |
| 156 c.direct_dependent_configs().push_back(LabelConfigPair(&direct)); | 99 c.public_configs().push_back(LabelConfigPair(&direct)); |
| 157 | 100 |
| 158 ASSERT_TRUE(c.OnResolved(&err)); | 101 ASSERT_TRUE(c.OnResolved(&err)); |
| 159 ASSERT_TRUE(b.OnResolved(&err)); | 102 ASSERT_TRUE(b.OnResolved(&err)); |
| 160 ASSERT_TRUE(a.OnResolved(&err)); | 103 ASSERT_TRUE(a.OnResolved(&err)); |
| 161 | 104 |
| 162 // B should have gotten both dependent configs from C. | 105 // B should have gotten both dependent configs from C. |
| 163 ASSERT_EQ(2u, b.configs().size()); | 106 ASSERT_EQ(2u, b.configs().size()); |
| 164 EXPECT_EQ(&all, b.configs()[0].ptr); | 107 EXPECT_EQ(&all, b.configs()[0].ptr); |
| 165 EXPECT_EQ(&direct, b.configs()[1].ptr); | 108 EXPECT_EQ(&direct, b.configs()[1].ptr); |
| 166 ASSERT_EQ(1u, b.all_dependent_configs().size()); | 109 ASSERT_EQ(1u, b.all_dependent_configs().size()); |
| 167 EXPECT_EQ(&all, b.all_dependent_configs()[0].ptr); | 110 EXPECT_EQ(&all, b.all_dependent_configs()[0].ptr); |
| 168 | 111 |
| 169 // A should have just gotten the "all" dependent config from C. | 112 // A should have just gotten the "all" dependent config from C. |
| 170 ASSERT_EQ(1u, a.configs().size()); | 113 ASSERT_EQ(1u, a.configs().size()); |
| 171 EXPECT_EQ(&all, a.configs()[0].ptr); | 114 EXPECT_EQ(&all, a.configs()[0].ptr); |
| 172 EXPECT_EQ(&all, a.all_dependent_configs()[0].ptr); | 115 EXPECT_EQ(&all, a.all_dependent_configs()[0].ptr); |
| 173 | 116 |
| 174 // Making an an alternate A and B with B forwarding the direct dependents. | 117 // Making an an alternate A and B with B forwarding the direct dependents. |
| 175 Target a_fwd(setup.settings(), Label(SourceDir("//foo/"), "a_fwd")); | 118 Target a_fwd(setup.settings(), Label(SourceDir("//foo/"), "a_fwd")); |
| 176 a_fwd.set_output_type(Target::EXECUTABLE); | 119 a_fwd.set_output_type(Target::EXECUTABLE); |
| 120 a_fwd.visibility().SetPublic(); |
| 177 a_fwd.SetToolchain(setup.toolchain()); | 121 a_fwd.SetToolchain(setup.toolchain()); |
| 178 Target b_fwd(setup.settings(), Label(SourceDir("//foo/"), "b_fwd")); | 122 Target b_fwd(setup.settings(), Label(SourceDir("//foo/"), "b_fwd")); |
| 179 b_fwd.set_output_type(Target::STATIC_LIBRARY); | 123 b_fwd.set_output_type(Target::STATIC_LIBRARY); |
| 180 b_fwd.SetToolchain(setup.toolchain()); | 124 b_fwd.SetToolchain(setup.toolchain()); |
| 181 a_fwd.deps().push_back(LabelTargetPair(&b_fwd)); | 125 b_fwd.visibility().SetPublic(); |
| 182 b_fwd.deps().push_back(LabelTargetPair(&c)); | 126 a_fwd.private_deps().push_back(LabelTargetPair(&b_fwd)); |
| 127 b_fwd.private_deps().push_back(LabelTargetPair(&c)); |
| 183 b_fwd.forward_dependent_configs().push_back(LabelTargetPair(&c)); | 128 b_fwd.forward_dependent_configs().push_back(LabelTargetPair(&c)); |
| 184 | 129 |
| 185 ASSERT_TRUE(b_fwd.OnResolved(&err)); | 130 ASSERT_TRUE(b_fwd.OnResolved(&err)); |
| 186 ASSERT_TRUE(a_fwd.OnResolved(&err)); | 131 ASSERT_TRUE(a_fwd.OnResolved(&err)); |
| 187 | 132 |
| 188 // A_fwd should now have both configs. | 133 // A_fwd should now have both configs. |
| 189 ASSERT_EQ(2u, a_fwd.configs().size()); | 134 ASSERT_EQ(2u, a_fwd.configs().size()); |
| 190 EXPECT_EQ(&all, a_fwd.configs()[0].ptr); | 135 EXPECT_EQ(&all, a_fwd.configs()[0].ptr); |
| 191 EXPECT_EQ(&direct, a_fwd.configs()[1].ptr); | 136 EXPECT_EQ(&direct, a_fwd.configs()[1].ptr); |
| 192 ASSERT_EQ(1u, a_fwd.all_dependent_configs().size()); | 137 ASSERT_EQ(1u, a_fwd.all_dependent_configs().size()); |
| 193 EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr); | 138 EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr); |
| 194 } | 139 } |
| 195 | 140 |
| 196 // Tests that forward_dependent_configs_from works for groups, forwarding the | |
| 197 // group's deps' dependent configs. | |
| 198 TEST(Target, ForwardDependentConfigsFromGroups) { | |
| 199 TestWithScope setup; | |
| 200 Err err; | |
| 201 | |
| 202 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | |
| 203 a.set_output_type(Target::EXECUTABLE); | |
| 204 a.SetToolchain(setup.toolchain()); | |
| 205 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | |
| 206 b.set_output_type(Target::GROUP); | |
| 207 b.SetToolchain(setup.toolchain()); | |
| 208 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | |
| 209 c.set_output_type(Target::STATIC_LIBRARY); | |
| 210 c.SetToolchain(setup.toolchain()); | |
| 211 a.deps().push_back(LabelTargetPair(&b)); | |
| 212 b.deps().push_back(LabelTargetPair(&c)); | |
| 213 | |
| 214 // Direct dependent config on C. | |
| 215 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); | |
| 216 c.direct_dependent_configs().push_back(LabelConfigPair(&direct)); | |
| 217 | |
| 218 // A forwards the dependent configs from B. | |
| 219 a.forward_dependent_configs().push_back(LabelTargetPair(&b)); | |
| 220 | |
| 221 ASSERT_TRUE(c.OnResolved(&err)); | |
| 222 ASSERT_TRUE(b.OnResolved(&err)); | |
| 223 ASSERT_TRUE(a.OnResolved(&err)); | |
| 224 | |
| 225 // The config should now be on A, and in A's direct dependent configs. | |
| 226 ASSERT_EQ(1u, a.configs().size()); | |
| 227 ASSERT_EQ(&direct, a.configs()[0].ptr); | |
| 228 ASSERT_EQ(1u, a.direct_dependent_configs().size()); | |
| 229 ASSERT_EQ(&direct, a.direct_dependent_configs()[0].ptr); | |
| 230 } | |
| 231 | |
| 232 TEST(Target, InheritLibs) { | 141 TEST(Target, InheritLibs) { |
| 233 TestWithScope setup; | 142 TestWithScope setup; |
| 234 Err err; | 143 Err err; |
| 235 | 144 |
| 236 // Create a dependency chain: | 145 // Create a dependency chain: |
| 237 // A (executable) -> B (shared lib) -> C (static lib) -> D (source set) | 146 // A (executable) -> B (shared lib) -> C (static lib) -> D (source set) |
| 238 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 147 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
| 239 a.set_output_type(Target::EXECUTABLE); | 148 a.set_output_type(Target::EXECUTABLE); |
| 149 a.visibility().SetPublic(); |
| 240 a.SetToolchain(setup.toolchain()); | 150 a.SetToolchain(setup.toolchain()); |
| 241 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 151 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
| 242 b.set_output_type(Target::SHARED_LIBRARY); | 152 b.set_output_type(Target::SHARED_LIBRARY); |
| 153 b.visibility().SetPublic(); |
| 243 b.SetToolchain(setup.toolchain()); | 154 b.SetToolchain(setup.toolchain()); |
| 244 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | 155 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); |
| 245 c.set_output_type(Target::STATIC_LIBRARY); | 156 c.set_output_type(Target::STATIC_LIBRARY); |
| 157 c.visibility().SetPublic(); |
| 246 c.SetToolchain(setup.toolchain()); | 158 c.SetToolchain(setup.toolchain()); |
| 247 Target d(setup.settings(), Label(SourceDir("//foo/"), "d")); | 159 Target d(setup.settings(), Label(SourceDir("//foo/"), "d")); |
| 248 d.set_output_type(Target::SOURCE_SET); | 160 d.set_output_type(Target::SOURCE_SET); |
| 161 d.visibility().SetPublic(); |
| 249 d.SetToolchain(setup.toolchain()); | 162 d.SetToolchain(setup.toolchain()); |
| 250 a.deps().push_back(LabelTargetPair(&b)); | 163 a.private_deps().push_back(LabelTargetPair(&b)); |
| 251 b.deps().push_back(LabelTargetPair(&c)); | 164 b.private_deps().push_back(LabelTargetPair(&c)); |
| 252 c.deps().push_back(LabelTargetPair(&d)); | 165 c.private_deps().push_back(LabelTargetPair(&d)); |
| 253 | 166 |
| 254 ASSERT_TRUE(d.OnResolved(&err)); | 167 ASSERT_TRUE(d.OnResolved(&err)); |
| 255 ASSERT_TRUE(c.OnResolved(&err)); | 168 ASSERT_TRUE(c.OnResolved(&err)); |
| 256 ASSERT_TRUE(b.OnResolved(&err)); | 169 ASSERT_TRUE(b.OnResolved(&err)); |
| 257 ASSERT_TRUE(a.OnResolved(&err)); | 170 ASSERT_TRUE(a.OnResolved(&err)); |
| 258 | 171 |
| 259 // C should have D in its inherited libs. | 172 // C should have D in its inherited libs. |
| 260 const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); | 173 const UniqueVector<const Target*>& c_inherited = c.inherited_libraries(); |
| 261 EXPECT_EQ(1u, c_inherited.size()); | 174 EXPECT_EQ(1u, c_inherited.size()); |
| 262 EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); | 175 EXPECT_TRUE(c_inherited.IndexOf(&d) != static_cast<size_t>(-1)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 275 } | 188 } |
| 276 | 189 |
| 277 TEST(Target, InheritCompleteStaticLib) { | 190 TEST(Target, InheritCompleteStaticLib) { |
| 278 TestWithScope setup; | 191 TestWithScope setup; |
| 279 Err err; | 192 Err err; |
| 280 | 193 |
| 281 // Create a dependency chain: | 194 // Create a dependency chain: |
| 282 // A (executable) -> B (complete static lib) -> C (source set) | 195 // A (executable) -> B (complete static lib) -> C (source set) |
| 283 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); | 196 Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
| 284 a.set_output_type(Target::EXECUTABLE); | 197 a.set_output_type(Target::EXECUTABLE); |
| 198 a.visibility().SetPublic(); |
| 285 a.SetToolchain(setup.toolchain()); | 199 a.SetToolchain(setup.toolchain()); |
| 286 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); | 200 Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
| 287 b.set_output_type(Target::STATIC_LIBRARY); | 201 b.set_output_type(Target::STATIC_LIBRARY); |
| 202 b.visibility().SetPublic(); |
| 288 b.set_complete_static_lib(true); | 203 b.set_complete_static_lib(true); |
| 289 b.SetToolchain(setup.toolchain()); | 204 b.SetToolchain(setup.toolchain()); |
| 290 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); | 205 Target c(setup.settings(), Label(SourceDir("//foo/"), "c")); |
| 291 c.set_output_type(Target::SOURCE_SET); | 206 c.set_output_type(Target::SOURCE_SET); |
| 207 c.visibility().SetPublic(); |
| 292 c.SetToolchain(setup.toolchain()); | 208 c.SetToolchain(setup.toolchain()); |
| 293 a.deps().push_back(LabelTargetPair(&b)); | 209 a.private_deps().push_back(LabelTargetPair(&b)); |
| 294 b.deps().push_back(LabelTargetPair(&c)); | 210 b.private_deps().push_back(LabelTargetPair(&c)); |
| 295 | 211 |
| 296 ASSERT_TRUE(c.OnResolved(&err)); | 212 ASSERT_TRUE(c.OnResolved(&err)); |
| 297 ASSERT_TRUE(b.OnResolved(&err)); | 213 ASSERT_TRUE(b.OnResolved(&err)); |
| 298 ASSERT_TRUE(a.OnResolved(&err)); | 214 ASSERT_TRUE(a.OnResolved(&err)); |
| 299 | 215 |
| 300 // B should have C in its inherited libs. | 216 // B should have C in its inherited libs. |
| 301 const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); | 217 const UniqueVector<const Target*>& b_inherited = b.inherited_libraries(); |
| 302 EXPECT_EQ(1u, b_inherited.size()); | 218 EXPECT_EQ(1u, b_inherited.size()); |
| 303 EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); | 219 EXPECT_TRUE(b_inherited.IndexOf(&c) != static_cast<size_t>(-1)); |
| 304 | 220 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); | 275 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); |
| 360 b.set_output_type(Target::STATIC_LIBRARY); | 276 b.set_output_type(Target::STATIC_LIBRARY); |
| 361 b.SetToolchain(setup.toolchain()); | 277 b.SetToolchain(setup.toolchain()); |
| 362 b.visibility().SetPrivate(b.label().dir()); | 278 b.visibility().SetPrivate(b.label().dir()); |
| 363 ASSERT_TRUE(b.OnResolved(&err)); | 279 ASSERT_TRUE(b.OnResolved(&err)); |
| 364 | 280 |
| 365 // Make a target depending on "b". The dependency must have an origin to mark | 281 // Make a target depending on "b". The dependency must have an origin to mark |
| 366 // it as user-set so we check visibility. This check should fail. | 282 // it as user-set so we check visibility. This check should fail. |
| 367 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | 283 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); |
| 368 a.set_output_type(Target::EXECUTABLE); | 284 a.set_output_type(Target::EXECUTABLE); |
| 369 a.deps().push_back(LabelTargetPair(&b)); | 285 a.private_deps().push_back(LabelTargetPair(&b)); |
| 370 IdentifierNode origin; // Dummy origin. | 286 IdentifierNode origin; // Dummy origin. |
| 371 a.deps()[0].origin = &origin; | 287 a.private_deps()[0].origin = &origin; |
| 372 a.SetToolchain(setup.toolchain()); | 288 a.SetToolchain(setup.toolchain()); |
| 373 ASSERT_FALSE(a.OnResolved(&err)); | 289 ASSERT_FALSE(a.OnResolved(&err)); |
| 374 } | 290 } |
| 375 | 291 |
| 376 // Test visibility with a single datadep. | 292 // Test visibility with a single datadep. |
| 377 TEST(Target, VisibilityDatadeps) { | 293 TEST(Target, VisibilityDatadeps) { |
| 378 TestWithScope setup; | 294 TestWithScope setup; |
| 379 Err err; | 295 Err err; |
| 380 | 296 |
| 381 Target b(setup.settings(), Label(SourceDir("//public/"), "b")); | 297 Target b(setup.settings(), Label(SourceDir("//public/"), "b")); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 408 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); | 324 Target b(setup.settings(), Label(SourceDir("//private/"), "b")); |
| 409 b.set_output_type(Target::STATIC_LIBRARY); | 325 b.set_output_type(Target::STATIC_LIBRARY); |
| 410 b.SetToolchain(setup.toolchain()); | 326 b.SetToolchain(setup.toolchain()); |
| 411 b.visibility().SetPrivate(b.label().dir()); | 327 b.visibility().SetPrivate(b.label().dir()); |
| 412 ASSERT_TRUE(b.OnResolved(&err)); | 328 ASSERT_TRUE(b.OnResolved(&err)); |
| 413 | 329 |
| 414 // The group has public visibility and depends on b. | 330 // The group has public visibility and depends on b. |
| 415 Target g(setup.settings(), Label(SourceDir("//private/"), "g")); | 331 Target g(setup.settings(), Label(SourceDir("//private/"), "g")); |
| 416 g.set_output_type(Target::GROUP); | 332 g.set_output_type(Target::GROUP); |
| 417 g.SetToolchain(setup.toolchain()); | 333 g.SetToolchain(setup.toolchain()); |
| 418 g.deps().push_back(LabelTargetPair(&b)); | 334 g.private_deps().push_back(LabelTargetPair(&b)); |
| 419 g.deps()[0].origin = &origin; | 335 g.private_deps()[0].origin = &origin; |
| 420 g.visibility().SetPublic(); | 336 g.visibility().SetPublic(); |
| 421 ASSERT_TRUE(b.OnResolved(&err)); | 337 ASSERT_TRUE(b.OnResolved(&err)); |
| 422 | 338 |
| 423 // Make a target depending on "g". This should succeed. | 339 // Make a target depending on "g". This should succeed. |
| 424 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); | 340 Target a(setup.settings(), Label(SourceDir("//app/"), "a")); |
| 425 a.set_output_type(Target::EXECUTABLE); | 341 a.set_output_type(Target::EXECUTABLE); |
| 426 a.deps().push_back(LabelTargetPair(&g)); | 342 a.private_deps().push_back(LabelTargetPair(&g)); |
| 427 a.deps()[0].origin = &origin; | 343 a.private_deps()[0].origin = &origin; |
| 428 a.SetToolchain(setup.toolchain()); | 344 a.SetToolchain(setup.toolchain()); |
| 429 ASSERT_TRUE(a.OnResolved(&err)); | 345 ASSERT_TRUE(a.OnResolved(&err)); |
| 430 } | 346 } |
| 431 | 347 |
| 432 // Verifies that only testonly targets can depend on other testonly targets. | 348 // Verifies that only testonly targets can depend on other testonly targets. |
| 433 // Many of the above dependency checking cases covered the non-testonly | 349 // Many of the above dependency checking cases covered the non-testonly |
| 434 // case. | 350 // case. |
| 435 TEST(Target, Testonly) { | 351 TEST(Target, Testonly) { |
| 436 TestWithScope setup; | 352 TestWithScope setup; |
| 437 Err err; | 353 Err err; |
| 438 | 354 |
| 439 // "testlib" is a test-only library. | 355 // "testlib" is a test-only library. |
| 440 Target testlib(setup.settings(), Label(SourceDir("//test/"), "testlib")); | 356 Target testlib(setup.settings(), Label(SourceDir("//test/"), "testlib")); |
| 441 testlib.set_testonly(true); | 357 testlib.set_testonly(true); |
| 442 testlib.set_output_type(Target::STATIC_LIBRARY); | 358 testlib.set_output_type(Target::STATIC_LIBRARY); |
| 359 testlib.visibility().SetPublic(); |
| 443 testlib.SetToolchain(setup.toolchain()); | 360 testlib.SetToolchain(setup.toolchain()); |
| 444 ASSERT_TRUE(testlib.OnResolved(&err)); | 361 ASSERT_TRUE(testlib.OnResolved(&err)); |
| 445 | 362 |
| 446 // "test" is a test-only executable depending on testlib, this is OK. | 363 // "test" is a test-only executable depending on testlib, this is OK. |
| 447 Target test(setup.settings(), Label(SourceDir("//test/"), "test")); | 364 Target test(setup.settings(), Label(SourceDir("//test/"), "test")); |
| 448 test.set_testonly(true); | 365 test.set_testonly(true); |
| 449 test.set_output_type(Target::EXECUTABLE); | 366 test.set_output_type(Target::EXECUTABLE); |
| 450 test.deps().push_back(LabelTargetPair(&testlib)); | 367 test.private_deps().push_back(LabelTargetPair(&testlib)); |
| 451 test.SetToolchain(setup.toolchain()); | 368 test.SetToolchain(setup.toolchain()); |
| 452 ASSERT_TRUE(test.OnResolved(&err)); | 369 ASSERT_TRUE(test.OnResolved(&err)); |
| 453 | 370 |
| 454 // "product" is a non-test depending on testlib. This should fail. | 371 // "product" is a non-test depending on testlib. This should fail. |
| 455 Target product(setup.settings(), Label(SourceDir("//app/"), "product")); | 372 Target product(setup.settings(), Label(SourceDir("//app/"), "product")); |
| 456 product.set_testonly(false); | 373 product.set_testonly(false); |
| 457 product.set_output_type(Target::EXECUTABLE); | 374 product.set_output_type(Target::EXECUTABLE); |
| 458 product.deps().push_back(LabelTargetPair(&testlib)); | 375 product.private_deps().push_back(LabelTargetPair(&testlib)); |
| 459 product.SetToolchain(setup.toolchain()); | 376 product.SetToolchain(setup.toolchain()); |
| 460 ASSERT_FALSE(product.OnResolved(&err)); | 377 ASSERT_FALSE(product.OnResolved(&err)); |
| 461 } | 378 } |
| OLD | NEW |