diff options
4 files changed, 90 insertions, 1 deletions
diff --git a/test/buildtool/build_engine/target_map/data_targets/simple_targets/TARGETS b/test/buildtool/build_engine/target_map/data_targets/simple_targets/TARGETS index 0001a223..b549a8a1 100644 --- a/test/buildtool/build_engine/target_map/data_targets/simple_targets/TARGETS +++ b/test/buildtool/build_engine/target_map/data_targets/simple_targets/TARGETS @@ -70,4 +70,6 @@ } , "generate file": {"type": "file_gen", "name": "generated.txt", "data": "Hello World!"} +, "generate symlink": + {"type": "symlink", "name": "generated_link", "data": "dummy_link_target"} } diff --git a/test/buildtool/build_engine/target_map/target_map.test.cpp b/test/buildtool/build_engine/target_map/target_map.test.cpp index 98d3a938..bd868b48 100644 --- a/test/buildtool/build_engine/target_map/target_map.test.cpp +++ b/test/buildtool/build_engine/target_map/target_map.test.cpp @@ -629,6 +629,32 @@ TEST_CASE("built-in rules") { CHECK(result->Blobs()[0] == "Hello World!"); } + SECTION("symlink") { + error = false; + error_msg = "NONE"; + { + TaskSystem ts; + target_map.ConsumeAfterKeysReady( + &ts, + {BuildMaps::Target::ConfiguredTarget{ + .target = + BuildMaps::Base::EntityName{ + "", "simple_targets", "generate symlink"}, + .config = empty_config}}, + [&result](auto values) { result = *values[0]; }, + [&error, &error_msg](std::string const& msg, bool /*unused*/) { + error = true; + error_msg = msg; + }); + } + CHECK(!error); + CHECK(error_msg == "NONE"); + CHECK(result->Artifacts()->ToJson()["generated_link"]["type"] == + "KNOWN"); + CHECK(result->Blobs().size() == 1); + CHECK(result->Blobs()[0] == "dummy_link_target"); + } + SECTION("configure") { auto target = BuildMaps::Base::EntityName{"", "config_targets", "bar in foo"}; diff --git a/test/end-to-end/built-in-rules/TARGETS b/test/end-to-end/built-in-rules/TARGETS index e4322e15..f37849ae 100644 --- a/test/end-to-end/built-in-rules/TARGETS +++ b/test/end-to-end/built-in-rules/TARGETS @@ -16,9 +16,15 @@ , "test": ["tree.sh"] , "deps": [["end-to-end", "tool-under-test"]] } +, "symlink_config": + { "type": ["@", "rules", "shell/test", "script"] + , "name": ["symlink_config"] + , "test": ["symlink_config.sh"] + , "deps": [["end-to-end", "tool-under-test"]] + } , "TESTS": { "type": "install" , "tainted": ["test"] - , "deps": ["generic_out_dirs", "filegen_config", "tree"] + , "deps": ["generic_out_dirs", "filegen_config", "tree", "symlink_config"] } } diff --git a/test/end-to-end/built-in-rules/symlink_config.sh b/test/end-to-end/built-in-rules/symlink_config.sh new file mode 100755 index 00000000..2af9240f --- /dev/null +++ b/test/end-to-end/built-in-rules/symlink_config.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# Copyright 2022 Huawei Cloud Computing Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +set -e + +readonly LBRDIR="$TMPDIR/local-build-root" + +touch ROOT + +cat <<'EOF' > TARGETS +{ "": + { "type": "symlink" + , "name": "read-runfiles" + , "data": + { "type": "join" + , "separator": ";" + , "$1": {"type": "runfiles", "dep": "uses config"} + } + , "deps": ["uses config"] + } +, "uses config": + { "type": "symlink" + , "arguments_config": ["NAME"] + , "name": {"type": "var", "name": "NAME", "default": "null"} + , "data": "irrelevant" + } +} +EOF + +bin/tool-under-test analyse -D '{"NAME": "here/../be/../dragons"}' \ + --local-build-root "$LBRDIR" --dump-targets targets.json --dump-blobs blobs.json 2>&1 +echo +echo "Blobs" +cat blobs.json +[ $(jq '. == ["here/../be/../dragons"]' blobs.json) = "true" ] +echo + +echo "Targets" +cat targets.json +[ $(jq '."@"."".""."" == [{"NAME": "here/../be/../dragons"}]' targets.json) = "true" ] + +echo OK |