summaryrefslogtreecommitdiff
path: root/test/end-to-end
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-11-28 11:01:57 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-11-28 16:43:50 +0100
commitade61e8c44b19591dae8d4513d6c9924fb5e0050 (patch)
treedc473e9da0937686b5ace9b1b7114357c6c09e88 /test/end-to-end
parent8a4fb82d7376c08b0473df3899803fc68e5578f0 (diff)
downloadjustbuild-ade61e8c44b19591dae8d4513d6c9924fb5e0050.tar.gz
Add basic test ensuring computed roots work for remote building
While still doing some unnecessary file operations in the local build root, computed roots work also for remote execution, both in native and in compatible mode, also for roots with non-trivial depth. Add a basic test ensuring we do not regress there.
Diffstat (limited to 'test/end-to-end')
-rw-r--r--test/end-to-end/TARGETS4
-rw-r--r--test/end-to-end/computed-roots/TARGETS19
-rw-r--r--test/end-to-end/computed-roots/remote.sh162
3 files changed, 172 insertions, 13 deletions
diff --git a/test/end-to-end/TARGETS b/test/end-to-end/TARGETS
index 93f0a01c..c78d2c05 100644
--- a/test/end-to-end/TARGETS
+++ b/test/end-to-end/TARGETS
@@ -27,7 +27,8 @@
, { "type": "if"
, "cond": {"type": "var", "name": "TEST_BOOTSTRAP_JUST_MR"}
, "then": []
- , "else": [["./", "serve-service", "TESTS"]]
+ , "else":
+ [["./", "serve-service", "TESTS"], ["./", "computed-roots", "TESTS"]]
}
]
}
@@ -61,7 +62,6 @@
, ["./", "build-fails", "TESTS"]
, ["./", "built-in-rules", "TESTS"]
, ["./", "cli", "TESTS"]
- , ["./", "computed-roots", "TESTS"]
, ["./", "execution-service", "TESTS"]
, ["./", "gc", "TESTS"]
, ["./", "generated-binary", "TESTS"]
diff --git a/test/end-to-end/computed-roots/TARGETS b/test/end-to-end/computed-roots/TARGETS
index 5a5535cf..0bf9c685 100644
--- a/test/end-to-end/computed-roots/TARGETS
+++ b/test/end-to-end/computed-roots/TARGETS
@@ -26,20 +26,17 @@
, "keep":
["out/not-export.log", "out/not-content-fixed.log", "out/cycle.log"]
}
+, "basic remote build":
+ { "type": ["end-to-end", "with remote"]
+ , "name": ["remote"]
+ , "test": ["remote.sh"]
+ , "deps": [["", "tool-under-test"]]
+ , "keep": ["out/log", "out/log.root"]
+ }
, "TESTS":
{ "type": ["@", "rules", "test", "suite"]
, "stage": ["computed-roots"]
- , "arguments_config": ["TEST_BOOTSTRAP_JUST_MR"]
, "deps":
- { "type": "++"
- , "$1":
- [ ["basic", "error-reporting"]
- , { "type": "if"
- , "cond": {"type": "var", "name": "TEST_BOOTSTRAP_JUST_MR"}
- , "then": []
- , "else": ["mr_computed_setup"]
- }
- ]
- }
+ ["basic", "basic remote build", "error-reporting", "mr_computed_setup"]
}
}
diff --git a/test/end-to-end/computed-roots/remote.sh b/test/end-to-end/computed-roots/remote.sh
new file mode 100644
index 00000000..59a0f123
--- /dev/null
+++ b/test/end-to-end/computed-roots/remote.sh
@@ -0,0 +1,162 @@
+#!/bin/sh
+# Copyright 2024 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 LBRDIR="$TMPDIR/local-build-root"
+readonly JUST="${ROOT}/bin/tool-under-test"
+readonly OUT="${ROOT}/out"
+
+REMOTE_ARGS="-r ${REMOTE_EXECUTION_ADDRESS}"
+if [ -n "${COMPATIBLE:-}" ]
+then
+ REMOTE_ARGS="${REMOTE_ARGS} --compatible"
+fi
+echo Using ${REMOTE_ARGS}
+
+readonly BASE_ROOT="${ROOT}/base"
+mkdir -p "${BASE_ROOT}"
+cd "${BASE_ROOT}"
+cat > generate.py <<'EOF'
+import json
+import sys
+
+COUNT = int(sys.argv[1])
+targets = {}
+for i in range(COUNT):
+ targets["%d" % i] = {"type": "generic", "outs": ["%d.txt" %i],
+ "cmds": ["sh bin/seqfile.sh %d" % (i,)],
+ "deps": ["bin/seqfile.sh"]}
+targets[""] = {"type": "generic",
+ "deps": ["%d" % i for i in range(COUNT)],
+ "cmds": [" ".join(["cat"] + ["%d.txt" % i for i in range(COUNT)]
+ + ["> out"])],
+ "outs": ["out"]}
+print (json.dumps(targets, indent=2))
+EOF
+cat > TARGETS <<'EOF'
+{ "": {"type": "export", "flexible_config": ["COUNT"], "target": "root"}
+, "root":
+ { "type": "install"
+ , "files": {"TARGETS": "targets", "bin/seqfile.sh": "seqfile"}
+ }
+, "targets":
+ { "type": "generic"
+ , "arguments_config": ["COUNT"]
+ , "outs": ["TARGETS"]
+ , "deps": ["generate.py"]
+ , "cmds":
+ [ { "type": "join"
+ , "separator": " "
+ , "$1":
+ [ "python3"
+ , "generate.py"
+ , {"type": "var", "name": "COUNT"}
+ , ">"
+ , "TARGETS"
+ ]
+ }
+ ]
+ }
+, "seqfile":
+ {"type": "file_gen", "name": "bin/seqfile.sh", "data": "seq 0 $1 > $1.txt"}
+}
+EOF
+git init 2>&1
+git branch -m stable-1.0 2>&1
+git config user.email "nobody@example.org" 2>&1
+git config user.name "Nobody" 2>&1
+git add . 2>&1
+git commit -m "Initial commit" 2>&1
+GIT_TREE=$(git log -n 1 --format="%T")
+
+
+mkdir -p "${ROOT}/main"
+cd "${ROOT}/main"
+
+cat > repo-config.json <<EOF
+{ "repositories":
+ { "base":
+ {"workspace_root": ["git tree", "${GIT_TREE}", "${BASE_ROOT}/.git"]}
+ , "derived":
+ {"workspace_root": ["computed", "base", "", "", {"COUNT": "10"}]}
+ , "other derived":
+ {"workspace_root": ["computed", "base", "", "", {"COUNT": "12"}]}
+ }
+}
+EOF
+cat repo-config.json
+
+echo
+echo Building base, putting the export target to cache
+echo
+"${JUST}" install ${REMOTE_ARGS} \
+ --local-build-root "${LBRDIR}" -C repo-config.json \
+ --main base -D '{"COUNT": "10"}' -o "${OUT}/base" 2>&1
+echo
+
+echo
+echo Building computed
+echo
+"${JUST}" install ${REMOTE_ARGS} \
+ --local-build-root "${LBRDIR}" -C repo-config.json \
+ --log-limit 4 -f "${OUT}/computed.log" \
+ --main derived -o "${OUT}/derived" 2>&1
+echo
+[ "$(cat "${OUT}/derived/out" | wc -l)" -eq 55 ]
+
+# Given the previous build, some form of cache hit is expected
+grep 'from cache' "${OUT}/computed.log"
+
+echo
+echo Building a different computed root, without previous build
+echo
+"${JUST}" install ${REMOTE_ARGS} \
+ --local-build-root "${LBRDIR}" -C repo-config.json \
+ --log-limit 4 -f "${OUT}/log" \
+ --main 'other derived' -o "${OUT}/other-derived" 2>&1
+echo
+
+[ "$(cat "${OUT}/other-derived/out" | wc -l)" -eq 78 ]
+
+echo
+echo Sanity-check of the log
+echo
+# As this target was never built before, there can't be a cache hit,
+# hence we expect a reference to an evaluation log.
+grep '[Rr]oot.*base.*evaluted.*' "${OUT}/log" > "${TMPDIR}/log_line"
+cat "${TMPDIR}/log_line"
+sed -i 's/.*log //' "${TMPDIR}/log_line"
+"${JUST}" install-cas --local-build-root "${LBRDIR}" \
+ ${REMOTE_ARGS} \
+ -o "${OUT}/log.root" $(cat "${TMPDIR}/log_line")
+echo
+cat "${OUT}/log.root"
+echo
+grep '[Dd]iscovered.*1 action' "${OUT}/log.root"
+grep '0 cache hit' "${OUT}/log.root"
+
+echo
+echo Building computed root again, expecting a hit
+echo
+"${JUST}" build ${REMOTE_ARGS} \
+ --local-build-root "${LBRDIR}" -C repo-config.json \
+ --log-limit 4 -f "${OUT}/log2" \
+ --main 'other derived' 2>&1
+echo
+grep 'from cache' "${OUT}/log2"
+
+echo OK