| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "tools/gn/runtime_deps.h" | 10 #include "tools/gn/runtime_deps.h" |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 // Tests that the search for dependencies terminates at a bundle target, | 261 // Tests that the search for dependencies terminates at a bundle target, |
| 262 // ignoring any shared libraries or loadable modules that get copied into the | 262 // ignoring any shared libraries or loadable modules that get copied into the |
| 263 // bundle. | 263 // bundle. |
| 264 TEST(RuntimeDeps, CreateBundle) { | 264 TEST(RuntimeDeps, CreateBundle) { |
| 265 TestWithScope setup; | 265 TestWithScope setup; |
| 266 Err err; | 266 Err err; |
| 267 | 267 |
| 268 // Dependency hierarchy: | 268 // Dependency hierarchy: |
| 269 // main(exe) -> dep(bundle) -> dep(shared_library) -> dep(source set) | 269 // main(exe) -> dep(bundle) -> dep(shared_library) -> dep(source set) |
| 270 // -> dep(bundle_data) -> dep(loadable_module) | 270 // -> dep(bundle_data) -> dep(loadable_module) |
| 271 // -> data(lm.data) |
| 272 // -> datadep(datadep) -> data(dd.data) |
| 271 | 273 |
| 272 const SourceDir source_dir("//"); | 274 const SourceDir source_dir("//"); |
| 273 const std::string& build_dir = setup.build_settings()->build_dir().value(); | 275 const std::string& build_dir = setup.build_settings()->build_dir().value(); |
| 274 | 276 |
| 275 Target loadable_module(setup.settings(), | 277 Target loadable_module(setup.settings(), |
| 276 Label(source_dir, "loadable_module")); | 278 Label(source_dir, "loadable_module")); |
| 277 InitTargetWithType(setup, &loadable_module, Target::LOADABLE_MODULE); | 279 InitTargetWithType(setup, &loadable_module, Target::LOADABLE_MODULE); |
| 280 loadable_module.data().push_back("//lm.data"); |
| 278 ASSERT_TRUE(loadable_module.OnResolved(&err)); | 281 ASSERT_TRUE(loadable_module.OnResolved(&err)); |
| 279 | 282 |
| 280 Target module_data(setup.settings(), Label(source_dir, "module_data")); | 283 Target module_data(setup.settings(), Label(source_dir, "module_data")); |
| 281 InitTargetWithType(setup, &module_data, Target::BUNDLE_DATA); | 284 InitTargetWithType(setup, &module_data, Target::BUNDLE_DATA); |
| 282 module_data.private_deps().push_back(LabelTargetPair(&loadable_module)); | 285 module_data.private_deps().push_back(LabelTargetPair(&loadable_module)); |
| 283 module_data.bundle_data().file_rules().push_back(BundleFileRule( | 286 module_data.bundle_data().file_rules().push_back(BundleFileRule( |
| 284 std::vector<SourceFile>{SourceFile(build_dir + "loadable_module.so")}, | 287 std::vector<SourceFile>{SourceFile(build_dir + "loadable_module.so")}, |
| 285 SubstitutionPattern::MakeForTest("{{bundle_resources_dir}}"))); | 288 SubstitutionPattern::MakeForTest("{{bundle_resources_dir}}"))); |
| 286 ASSERT_TRUE(module_data.OnResolved(&err)); | 289 ASSERT_TRUE(module_data.OnResolved(&err)); |
| 287 | 290 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 299 ASSERT_TRUE(dylib.OnResolved(&err)); | 302 ASSERT_TRUE(dylib.OnResolved(&err)); |
| 300 | 303 |
| 301 Target dylib_data(setup.settings(), Label(source_dir, "dylib_data")); | 304 Target dylib_data(setup.settings(), Label(source_dir, "dylib_data")); |
| 302 InitTargetWithType(setup, &dylib_data, Target::BUNDLE_DATA); | 305 InitTargetWithType(setup, &dylib_data, Target::BUNDLE_DATA); |
| 303 dylib_data.private_deps().push_back(LabelTargetPair(&dylib)); | 306 dylib_data.private_deps().push_back(LabelTargetPair(&dylib)); |
| 304 dylib_data.bundle_data().file_rules().push_back(BundleFileRule( | 307 dylib_data.bundle_data().file_rules().push_back(BundleFileRule( |
| 305 std::vector<SourceFile>{SourceFile(build_dir + "dylib")}, | 308 std::vector<SourceFile>{SourceFile(build_dir + "dylib")}, |
| 306 SubstitutionPattern::MakeForTest("{{bundle_executable_dir}}"))); | 309 SubstitutionPattern::MakeForTest("{{bundle_executable_dir}}"))); |
| 307 ASSERT_TRUE(dylib_data.OnResolved(&err)); | 310 ASSERT_TRUE(dylib_data.OnResolved(&err)); |
| 308 | 311 |
| 312 Target data_dep(setup.settings(), Label(source_dir, "datadep")); |
| 313 InitTargetWithType(setup, &data_dep, Target::EXECUTABLE); |
| 314 data_dep.data().push_back("//dd.data"); |
| 315 ASSERT_TRUE(data_dep.OnResolved(&err)); |
| 316 |
| 309 Target bundle(setup.settings(), Label(source_dir, "bundle")); | 317 Target bundle(setup.settings(), Label(source_dir, "bundle")); |
| 310 InitTargetWithType(setup, &bundle, Target::CREATE_BUNDLE); | 318 InitTargetWithType(setup, &bundle, Target::CREATE_BUNDLE); |
| 311 const std::string root_dir(build_dir + "Bundle.framework/Versions/A/"); | 319 const std::string root_dir(build_dir + "Bundle.framework/Versions/A/"); |
| 312 bundle.bundle_data().root_dir() = SourceDir(root_dir); | 320 bundle.bundle_data().root_dir() = SourceDir(root_dir); |
| 313 bundle.bundle_data().resources_dir() = SourceDir(root_dir + "Resources"); | 321 bundle.bundle_data().resources_dir() = SourceDir(root_dir + "Resources"); |
| 314 bundle.bundle_data().executable_dir() = SourceDir(root_dir + "MacOS"); | 322 bundle.bundle_data().executable_dir() = SourceDir(root_dir + "MacOS"); |
| 315 bundle.private_deps().push_back(LabelTargetPair(&dylib_data)); | 323 bundle.private_deps().push_back(LabelTargetPair(&dylib_data)); |
| 316 bundle.private_deps().push_back(LabelTargetPair(&module_data)); | 324 bundle.private_deps().push_back(LabelTargetPair(&module_data)); |
| 325 bundle.data_deps().push_back(LabelTargetPair(&data_dep)); |
| 326 bundle.data().push_back("//b.data"); |
| 317 ASSERT_TRUE(bundle.OnResolved(&err)); | 327 ASSERT_TRUE(bundle.OnResolved(&err)); |
| 318 | 328 |
| 319 Target main(setup.settings(), Label(source_dir, "main")); | 329 Target main(setup.settings(), Label(source_dir, "main")); |
| 320 InitTargetWithType(setup, &main, Target::EXECUTABLE); | 330 InitTargetWithType(setup, &main, Target::EXECUTABLE); |
| 321 main.data_deps().push_back(LabelTargetPair(&bundle)); | 331 main.data_deps().push_back(LabelTargetPair(&bundle)); |
| 322 ASSERT_TRUE(main.OnResolved(&err)); | 332 ASSERT_TRUE(main.OnResolved(&err)); |
| 323 | 333 |
| 324 std::vector<std::pair<OutputFile, const Target*>> result = | 334 std::vector<std::pair<OutputFile, const Target*>> result = |
| 325 ComputeRuntimeDeps(&main); | 335 ComputeRuntimeDeps(&main); |
| 326 | 336 |
| 327 // The result should have deps of main, datadep, final_in.dat | 337 // The result should have deps of main, datadep, final_in.dat |
| 328 ASSERT_EQ(2u, result.size()) << GetVectorDescription(result); | 338 ASSERT_EQ(5u, result.size()) << GetVectorDescription(result); |
| 329 | 339 |
| 330 // The first one should always be the main exe. | 340 // The first one should always be the main exe. |
| 331 EXPECT_EQ(MakePair("./main", &main), result[0]); | 341 EXPECT_EQ(MakePair("./main", &main), result[0]); |
| 332 | 342 |
| 333 // The second one should be the framework bundle, not its included | 343 // The rest of the ordering is undefined. |
| 334 // loadable_module or its intermediate shared_library. | 344 |
| 335 EXPECT_EQ(MakePair("Bundle.framework/", &bundle), result[1]); | 345 // The framework bundle's internal dependencies should not be incldued. |
| 346 EXPECT_TRUE(std::find(result.begin(), result.end(), |
| 347 MakePair("Bundle.framework/", &bundle)) != |
| 348 result.end()) << GetVectorDescription(result); |
| 349 // But direct data and data dependencies should be. |
| 350 EXPECT_TRUE(std::find(result.begin(), result.end(), |
| 351 MakePair("./datadep", &data_dep)) != |
| 352 result.end()) << GetVectorDescription(result); |
| 353 EXPECT_TRUE(std::find(result.begin(), result.end(), |
| 354 MakePair("../../dd.data", &data_dep)) != |
| 355 result.end()) << GetVectorDescription(result); |
| 356 EXPECT_TRUE(std::find(result.begin(), result.end(), |
| 357 MakePair("../../b.data", &bundle)) != |
| 358 result.end()) << GetVectorDescription(result); |
| 336 } | 359 } |
| 337 | 360 |
| 338 // Tests that a dependency duplicated in regular and data deps is processed | 361 // Tests that a dependency duplicated in regular and data deps is processed |
| 339 // as a data dep. | 362 // as a data dep. |
| 340 TEST(RuntimeDeps, Dupe) { | 363 TEST(RuntimeDeps, Dupe) { |
| 341 TestWithScope setup; | 364 TestWithScope setup; |
| 342 Err err; | 365 Err err; |
| 343 | 366 |
| 344 Target action(setup.settings(), Label(SourceDir("//"), "action")); | 367 Target action(setup.settings(), Label(SourceDir("//"), "action")); |
| 345 InitTargetWithType(setup, &action, Target::ACTION); | 368 InitTargetWithType(setup, &action, Target::ACTION); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 err = Err(); | 404 err = Err(); |
| 382 EXPECT_TRUE(setup.ExecuteSnippet( | 405 EXPECT_TRUE(setup.ExecuteSnippet( |
| 383 "if (true) {\n" | 406 "if (true) {\n" |
| 384 " group(\"foo\") { write_runtime_deps = \"//out/Debug/foo.txt\" }\n" | 407 " group(\"foo\") { write_runtime_deps = \"//out/Debug/foo.txt\" }\n" |
| 385 "} else {\n" | 408 "} else {\n" |
| 386 " group(\"bar\") { write_runtime_deps = \"//out/Debug/bar.txt\" }\n" | 409 " group(\"bar\") { write_runtime_deps = \"//out/Debug/bar.txt\" }\n" |
| 387 "}", &err)); | 410 "}", &err)); |
| 388 EXPECT_EQ(1U, setup.items().size()); | 411 EXPECT_EQ(1U, setup.items().size()); |
| 389 EXPECT_EQ(1U, scheduler.GetWriteRuntimeDepsTargets().size()); | 412 EXPECT_EQ(1U, scheduler.GetWriteRuntimeDepsTargets().size()); |
| 390 } | 413 } |
| OLD | NEW |