summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2025-04-08 10:49:51 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2025-04-08 13:01:16 +0200
commite401d33c3266752aeb4cc4fc41b322df8ee3851b (patch)
treeede6a906c7382ff15cab5d2509acd9ece6ef1dc1 /test
parentc8523932a5cc319f2b3dffd1f5db3822c1788895 (diff)
downloadjustbuild-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')
-rw-r--r--test/end-to-end/actions/TARGETS8
-rw-r--r--test/end-to-end/actions/tree-conflicts.sh82
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