| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "test/test.h" |
| #include "tools/gn/scheduler.h" |
| #include "tools/gn/test_with_scheduler.h" |
| #include "tools/gn/test_with_scope.h" |
| |
| using ActionTargetGenerator = TestWithScheduler; |
| |
| // Tests that actions can't have output substitutions. |
| TEST_F(ActionTargetGenerator, ActionOutputSubstitutions) { |
| TestWithScope setup; |
| Scope::ItemVector items_; |
| setup.scope()->set_item_collector(&items_); |
| |
| // First test one with no substitutions, this should be valid. |
| TestParseInput input_good( |
| R"(action("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/one.txt" ] |
| })"); |
| ASSERT_FALSE(input_good.has_error()); |
| |
| // This should run fine. |
| Err err; |
| input_good.parsed()->Execute(setup.scope(), &err); |
| ASSERT_FALSE(err.has_error()) << err.message(); |
| |
| // Same thing with a pattern in the output should fail. |
| TestParseInput input_bad( |
| R"(action("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/{{source_name_part}}.txt" ] |
| })"); |
| ASSERT_FALSE(input_bad.has_error()); |
| |
| // This should run fine. |
| input_bad.parsed()->Execute(setup.scope(), &err); |
| ASSERT_TRUE(err.has_error()); |
| } |
| |
| // Tests that arg and response file substitutions are validated for |
| // action_foreach targets. |
| TEST_F(ActionTargetGenerator, ActionForeachSubstitutions) { |
| TestWithScope setup; |
| Scope::ItemVector items_; |
| setup.scope()->set_item_collector(&items_); |
| |
| // Args listing a response file but missing a response file definition should |
| // fail. |
| TestParseInput input_missing_resp_file( |
| R"(action_foreach("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/{{source_name_part}}" ] |
| args = [ "{{response_file_name}}" ] |
| })"); |
| ASSERT_FALSE(input_missing_resp_file.has_error()); |
| Err err; |
| input_missing_resp_file.parsed()->Execute(setup.scope(), &err); |
| ASSERT_TRUE(err.has_error()); |
| |
| // Adding a response file definition should pass. |
| err = Err(); |
| TestParseInput input_resp_file( |
| R"(action_foreach("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/{{source_name_part}}" ] |
| args = [ "{{response_file_name}}" ] |
| response_file_contents = [ "{{source_name_part}}" ] |
| })"); |
| ASSERT_FALSE(input_resp_file.has_error()); |
| input_resp_file.parsed()->Execute(setup.scope(), &err); |
| ASSERT_FALSE(err.has_error()) << err.message(); |
| |
| // Defining a response file but not referencing it should fail. |
| err = Err(); |
| TestParseInput input_missing_rsp_args( |
| R"(action_foreach("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/{{source_name_part}}" ] |
| args = [ "{{source_name_part}}" ] |
| response_file_contents = [ "{{source_name_part}}" ] |
| })"); |
| ASSERT_FALSE(input_missing_rsp_args.has_error()); |
| input_missing_rsp_args.parsed()->Execute(setup.scope(), &err); |
| ASSERT_TRUE(err.has_error()) << err.message(); |
| |
| // Bad substitutions in args. |
| err = Err(); |
| TestParseInput input_bad_args( |
| R"(action_foreach("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/{{source_name_part}}" ] |
| args = [ "{{response_file_name}} {{ldflags}}" ] |
| response_file_contents = [ "{{source_name_part}}" ] |
| })"); |
| ASSERT_FALSE(input_bad_args.has_error()); |
| input_bad_args.parsed()->Execute(setup.scope(), &err); |
| ASSERT_TRUE(err.has_error()) << err.message(); |
| |
| // Bad substitutions in response file contents. |
| err = Err(); |
| TestParseInput input_bad_rsp( |
| R"(action_foreach("foo") { |
| script = "//foo.py" |
| sources = [ "//bar.txt" ] |
| outputs = [ "//out/Debug/{{source_name_part}}" ] |
| args = [ "{{response_file_name}}" ] |
| response_file_contents = [ "{{source_name_part}} {{ldflags}}" ] |
| })"); |
| ASSERT_FALSE(input_bad_rsp.has_error()); |
| input_bad_rsp.parsed()->Execute(setup.scope(), &err); |
| ASSERT_TRUE(err.has_error()) << err.message(); |
| } |