[action] Add test for data_deps of an action target
Add a new test that shows how data_deps of an action are added as ninja
order-only deps for the rules created for the action.
This illustrates the currently behavior, where the order-only deps are
added to the stamp file rule, not to the action's own rule.
Change-Id: I0d9d7966621a5002e5f9df5b0718db7a8ea78e74
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/15740
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Commit-Queue: Aaron Wood <aaronwood@google.com>
diff --git a/src/gn/ninja_action_target_writer_unittest.cc b/src/gn/ninja_action_target_writer_unittest.cc
index d291dc8..d061e76 100644
--- a/src/gn/ninja_action_target_writer_unittest.cc
+++ b/src/gn/ninja_action_target_writer_unittest.cc
@@ -158,6 +158,67 @@
EXPECT_EQ(expected_linux, out.str());
}
+TEST(NinjaActionTargetWriter, ActionWithOrderOnlyDeps) {
+ Err err;
+ TestWithScope setup;
+
+ // Some dependencies that the action can depend on. Use actions for these
+ // so they have a nice platform-independent stamp file that can appear in the
+ // output (rather than having to worry about how the current platform names
+ // binaries).
+ Target dep(setup.settings(), Label(SourceDir("//foo/"), "dep"));
+ dep.set_output_type(Target::ACTION);
+ dep.visibility().SetPublic();
+ dep.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(dep.OnResolved(&err));
+
+ Target datadep(setup.settings(), Label(SourceDir("//foo/"), "datadep"));
+ datadep.set_output_type(Target::ACTION);
+ datadep.visibility().SetPublic();
+ datadep.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(datadep.OnResolved(&err));
+
+ Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
+ target.set_output_type(Target::ACTION);
+
+ target.action_values().set_script(SourceFile("//foo/script.py"));
+
+ target.sources().push_back(SourceFile("//foo/source.txt"));
+ target.config_values().inputs().push_back(SourceFile("//foo/included.txt"));
+
+ target.action_values().outputs() =
+ SubstitutionList::MakeForTest("//out/Debug/foo.out");
+
+ target.private_deps().push_back(LabelTargetPair(&dep));
+ target.data_deps().push_back(LabelTargetPair(&datadep));
+
+ target.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(target.OnResolved(&err));
+
+ setup.build_settings()->set_python_path(
+ base::FilePath(FILE_PATH_LITERAL("/usr/bin/python")));
+
+ std::ostringstream out;
+ NinjaActionTargetWriter writer(&target, out);
+ writer.Run();
+
+ const char expected[] =
+ "rule __foo_bar___rule\n"
+ " command = /usr/bin/python ../../foo/script.py\n"
+ " description = ACTION //foo:bar()\n"
+ " restat = 1\n"
+ "\n"
+ "build foo.out: __foo_bar___rule | ../../foo/script.py "
+ "../../foo/included.txt ../../foo/source.txt obj/foo/dep.stamp\n"
+ "\n"
+ "build obj/foo/bar.stamp: stamp foo.out || "
+ "obj/foo/datadep.stamp\n";
+
+ std::string out_str = out.str();
+ EXPECT_EQ(expected, out_str);
+}
+
+
TEST(NinjaActionTargetWriter, ForEach) {
Err err;
TestWithScope setup;