diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-04-08 10:49:51 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-04-08 13:01:16 +0200 |
commit | e401d33c3266752aeb4cc4fc41b322df8ee3851b (patch) | |
tree | ede6a906c7382ff15cab5d2509acd9ece6ef1dc1 /test/end-to-end | |
parent | c8523932a5cc319f2b3dffd1f5db3822c1788895 (diff) | |
download | justbuild-e401d33c3266752aeb4cc4fc41b322df8ee3851b.tar.gz |
Add end-to-end test for disjoint_tree_overlay
... and verify that
- spurious conflicts do not cause failure but instead are handled
correctly, and
- real conflicts are detected and reported properly.
Diffstat (limited to 'test/end-to-end')
-rw-r--r-- | test/end-to-end/actions/TARGETS | 8 | ||||
-rw-r--r-- | test/end-to-end/actions/tree-conflicts.sh | 82 |
2 files changed, 90 insertions, 0 deletions
diff --git a/test/end-to-end/actions/TARGETS b/test/end-to-end/actions/TARGETS index 23b1be4f..5258dc0c 100644 --- a/test/end-to-end/actions/TARGETS +++ b/test/end-to-end/actions/TARGETS @@ -97,6 +97,13 @@ , "deps": [["", "tool-under-test"]] , "keep": ["out/graph.json", "out/artifacts.json"] } +, "tree-conflicts": + { "type": ["@", "rules", "shell/test", "script"] + , "name": ["tree-conflcits"] + , "test": ["tree-conflicts.sh"] + , "deps": [["", "tool-under-test"]] + , "keep": ["out/graph.json", "out/artifacts.json", "out/log"] + } , "TESTS": { "type": ["@", "rules", "test", "suite"] , "arguments_config": ["DROP_IO_HEAVY_TESTS"] @@ -109,6 +116,7 @@ , "equality-properties" , "trees" , "tree-ops" + , "tree-conflicts" , "conflicts" , "incomplete-retry" , "error-reporting" diff --git a/test/end-to-end/actions/tree-conflicts.sh b/test/end-to-end/actions/tree-conflicts.sh new file mode 100644 index 00000000..87b1f489 --- /dev/null +++ b/test/end-to-end/actions/tree-conflicts.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# Copyright 2025 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 ROOT="$(pwd)" +readonly LBR="${TMPDIR}/local-build-root" +readonly OUT="${ROOT}/out" +mkdir -p "${OUT}" +readonly JUST="${ROOT}/bin/tool-under-test" + +mkdir work +cd work +touch ROOT + +cat > TARGETS <<'EOF' +{ "foo": + { "type": "generic" + , "out_dirs": ["out"] + , "cmds": ["mkdir -p out", "echo FOO > out/foo", "echo FOOBAR > out/foobar"] + } +, "good bar": + { "type": "generic" + , "out_dirs": ["out"] + , "cmds": ["mkdir -p out", "echo BAR > out/bar", "echo FOOBAR > out/foobar"] + } +, "bad bar": + { "type": "generic" + , "out_dirs": ["out"] + , "cmds": ["mkdir -p out", "echo BAR > out/bar", "echo foobar > out/foobar"] + } +, "spurious conflict": + { "type": "disjoint_tree_overlay" + , "name": "merge" + , "deps": ["foo", "good bar"] + } +, "real conflict": + { "type": "disjoint_tree_overlay" + , "name": "merge" + , "deps": ["foo", "bad bar"] + } +} +EOF + +# In case of a spourious conflict, things should just build +"${JUST}" install --local-build-root "${LBR}" -o "${OUT}/spurious" \ + -L '["env", "PATH='"${PATH}"'"]' 'spurious conflict' 2>&1 +grep FOO "${OUT}/spurious/merge/out/foo" +grep BAR "${OUT}/spurious/merge/out/bar" +grep FOOBAR "${OUT}/spurious/merge/out/foobar" + +# In case of a real conflict, analysis should still work +"${JUST}" analyse --local-build-root "${LBR}" \ + --dump-graph "${OUT}/graph.json" \ + --dump-artifacts-to-build "${OUT}/artifacts.json" \ + 'real conflict' 2>&1 +echo +[ "$(jq -r '.merge.type' "${OUT}/artifacts.json")" = TREE_OVERLAY ] +OVERLAY_ID=$(jq -r '.merge.data.id' "${OUT}/artifacts.json") +[ "$(jq '."tree_overlays"."'"${OVERLAY_ID}"'".trees | length' "${OUT}/graph.json")" -eq 2 ] + +# Building should fail, however +"${JUST}" build --local-build-root "${LBR}" \ + -f "${OUT}/log" \ + -L '["env", "PATH='"${PATH}"'"]' 'real conflict' 2>&1 && exit 1 || : +echo +grep 'foobar' "${OUT}/log" # The location of the conflict should be mentioned + +echo +echo OK |