diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2024-02-21 11:38:48 +0100 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2024-02-27 14:35:44 +0100 |
commit | bd15e736cf720df2748629c91a2ac58f7aa0fec6 (patch) | |
tree | 692f0c0a2621e3890cd47988b9fd01fa2e6546bb | |
parent | 1394c3d9016373ef727feac9d1aed514e1f89f53 (diff) | |
download | justbuild-bd15e736cf720df2748629c91a2ac58f7aa0fec6.tar.gz |
test just-mr and serve: Check archive repository root creation
Extends test coverage for the interaction between 'just-mr setup'
and the serve endpoint for archive repositories.
10 files changed, 1148 insertions, 0 deletions
diff --git a/test/end-to-end/serve-service/TARGETS b/test/end-to-end/serve-service/TARGETS index 47424d71..9ad5128c 100644 --- a/test/end-to-end/serve-service/TARGETS +++ b/test/end-to-end/serve-service/TARGETS @@ -136,5 +136,6 @@ } ] } + , "dirs": [[["./", "serve-archive-root", "TESTS"], "serve-archive-root"]] } } diff --git a/test/end-to-end/serve-service/serve-archive-root/TARGETS b/test/end-to-end/serve-service/serve-archive-root/TARGETS new file mode 100644 index 00000000..f5753214 --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/TARGETS @@ -0,0 +1,115 @@ +{ "serve-tree-syms (repo)": + { "type": "generic" + , "out_dirs": ["src"] + , "cmds": ["for i in `seq 1 5` ; do ln -s $i.txt src/link-$i ; done"] + , "deps": [["end-to-end/serve-service", "serve-target-remote-build (repo)"]] + } +, "serve-tree-syms (data)": + {"type": "install", "dirs": [["serve-tree-syms (repo)", "repo"]]} +, "serve-tree-syms (archive)": + { "type": "generic" + , "outs": ["src.tar"] + , "cmds": ["tar cf src.tar repo"] + , "deps": ["serve-tree-syms (data)"] + } +, "unresolved-present": + { "type": ["end-to-end", "with serve"] + , "name": ["unresolved-present"] + , "test": ["unresolved-present.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , ["end-to-end/serve-service", "serve-tree (archive)"] + ] + , "repos": [["end-to-end/serve-service", "serve-tree (archive)"]] + } +, "unresolved-absent": + { "type": ["end-to-end", "with serve"] + , "name": ["unresolved-absent"] + , "test": ["unresolved-absent.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , ["end-to-end/serve-service", "serve-tree (archive)"] + ] + , "repos": [["end-to-end/serve-service", "serve-tree (archive)"]] + } +, "unresolved-absent-known": + { "type": ["end-to-end", "with serve"] + , "name": ["unresolved-absent-known"] + , "test": ["unresolved-absent-known.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , ["end-to-end/serve-service", "serve-tree (archive)"] + ] + , "repos": [["end-to-end/serve-service", "serve-tree (archive)"]] + } +, "unresolved-absent-known-upload": + { "type": ["end-to-end", "with serve"] + , "name": ["unresolved-absent-known-upload"] + , "test": ["unresolved-absent-known-upload.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , ["end-to-end/serve-service", "serve-tree (archive)"] + ] + } +, "resolved-present": + { "type": ["end-to-end", "with serve"] + , "name": ["resolved-present"] + , "test": ["resolved-present.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , "serve-tree-syms (archive)" + ] + , "repos": ["serve-tree-syms (archive)"] + } +, "resolved-absent": + { "type": ["end-to-end", "with serve"] + , "name": ["resolved-absent"] + , "test": ["resolved-absent.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , "serve-tree-syms (archive)" + ] + , "repos": ["serve-tree-syms (archive)"] + } +, "resolved-absent-known": + { "type": ["end-to-end", "with serve"] + , "name": ["resolved-absent-known"] + , "test": ["resolved-absent-known.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , "serve-tree-syms (archive)" + ] + , "repos": ["serve-tree-syms (archive)"] + } +, "resolved-absent-known-upload": + { "type": ["end-to-end", "with serve"] + , "name": ["resolved-absent-known-upload"] + , "test": ["resolved-absent-known-upload.sh"] + , "deps": + [ ["end-to-end", "mr-tool-under-test"] + , ["end-to-end", "tool-under-test"] + , "serve-tree-syms (archive)" + ] + } +, "TESTS": + { "type": "install" + , "tainted": ["test"] + , "deps": + [ "unresolved-present" + , "unresolved-absent" + , "unresolved-absent-known" + , "unresolved-absent-known-upload" + , "resolved-present" + , "resolved-absent" + , "resolved-absent-known" + , "resolved-absent-known-upload" + ] + } +} diff --git a/test/end-to-end/serve-service/serve-archive-root/resolved-absent-known-upload.sh b/test/end-to-end/serve-service/serve-archive-root/resolved-absent-known-upload.sh new file mode 100644 index 00000000..d5cbd61d --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/resolved-absent-known-upload.sh @@ -0,0 +1,130 @@ +#!/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. + + +### +# This test checks that an absent root can successfully be made in the presence +# of the serve endpoint in the situation where we already have the file +# association (i.e., we know the unresolved root tree) and the serve endpoint +# does not know the archive. The upload can only happen in native mode. +# +# The test archive contains symlinks to be resolved, which tests also the +# resolved tree file association. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "present": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely"} + } + } + , "absent": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely", "absent": true} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup present) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.present.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# While keeping the file association, ask serve endpoint to provide the root as +# absent. For a serve endpoint that does not have the archive blob available, +# this will require uploading the locally-known root tree to remote CAS, from +# where the serve endpoint will pick it up. This can only happen in native mode. +if [ -z "${COMPAT}" ]; then + + ${JUST} gc --local-build-root ${LBR} 2>&1 + ${JUST} gc --local-build-root ${LBR} 2>&1 + + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent) + cat "${CONF}" + echo + test $(jq -r '.repositories.absent.workspace_root[1]' "${CONF}") = "${TREE}" + +else + + echo --- + echo Checking expected failures + + ${JUST} gc --local-build-root ${LBR} 2>&1 + ${JUST} gc --local-build-root ${LBR} 2>&1 + + "${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent 2>&1 && exit 1 || : + echo Failed as expected +fi + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/resolved-absent-known.sh b/test/end-to-end/serve-service/serve-archive-root/resolved-absent-known.sh new file mode 100644 index 00000000..b6b65cc5 --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/resolved-absent-known.sh @@ -0,0 +1,111 @@ +#!/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. + + +### +# This test checks that an absent root can successfully be made in the presence +# of the serve endpoint in the situation where we already have the file +# association (i.e., we know the unresolved root tree) and the serve endpoint +# knows the archive. +# +# The test archive contains symlinks to be resolved, which tests also the +# resolved tree file association. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "present": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely"} + } + } + , "absent": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely", "absent": true} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup present) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.present.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# While keeping the file association, ask serve endpoint to provide the root as +# absent. This serve endpoint known already the archive, so it should be able to +# set it up even if in compatible mode. +${JUST} gc --local-build-root ${LBR} 2>&1 +${JUST} gc --local-build-root ${LBR} 2>&1 + +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent) +cat "${CONF}" +echo +test $(jq -r '.repositories.absent.workspace_root[1]' "${CONF}") = "${TREE}" + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/resolved-absent.sh b/test/end-to-end/serve-service/serve-archive-root/resolved-absent.sh new file mode 100644 index 00000000..7bb5d882 --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/resolved-absent.sh @@ -0,0 +1,135 @@ +#!/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. + + +### +# This test checks that an absent root can successfully be made by asking +# the serve endpoint to set it up for us when we have no local knowledge. +# +# The test archive contains symlinks to be resolved, which tests also the +# resolved tree file association. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "present": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely"} + } + } + , "absent": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely", "absent": true} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup present) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.present.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# Compute absent root by asking serve to set it up from scratch. This works also +# in compatible mode, as the serve endpoint has the archive in Git cache. +rm -rf "${LBR}" + +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent) +cat "${CONF}" +echo +test $(jq -r '.repositories.absent.workspace_root[1]' "${CONF}") = "${TREE}" + +# Check that serve can provide this tree as present in a clean build root. This +# can happen however only in native mode. +if [ -z "${COMPAT}" ]; then + + rm -rf "${LBR}" + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup present) + cat "${CONF}" + echo + test $(jq -r '.repositories.present.workspace_root[1]' "${CONF}") = "${TREE}" + +else + + echo --- + echo Checking expected failures + + rm -rf "${LBR}" + "${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup present 2>&1 && exit 1 || : + echo Failed as expected +fi + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/resolved-present.sh b/test/end-to-end/serve-service/serve-archive-root/resolved-present.sh new file mode 100644 index 00000000..ec234e26 --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/resolved-present.sh @@ -0,0 +1,144 @@ +#!/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. + + +### +# This test checks 3 of the options to make a present root for an archive, where: +# - archive is in local distfile; +# - there is already a file association to the unresolved root tree; +# - we receive the archive content from serve endpoint via the remote CAS. +# +# The test archive contains symlinks to be resolved, which tests also the +# resolved tree file association. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "main": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"special": "resolve-completely"} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup main) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.main.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# Compute present root locally from stored file association +${JUST} gc --local-build-root ${LBR} 2>&1 +${JUST} gc --local-build-root ${LBR} 2>&1 + +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + setup main) +cat "${CONF}" +echo +test $(jq -r '.repositories.main.workspace_root[1]' "${CONF}") = "${TREE}" + +# We now test if the serve endpoint can provide us the root. This can only +# happen in we're in native mode. +if [ -z "${COMPAT}" ]; then + + # In a clean build root, ask serve to set up the root for us, from scratch + rm -rf "${LBR}" + + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup main) + cat "${CONF}" + echo + test $(jq -r '.repositories.main.workspace_root[1]' "${CONF}") = "${TREE}" + + # Double-check the file association was created and root remains available + # without the remote endpoints + ${JUST} gc --local-build-root ${LBR} 2>&1 + ${JUST} gc --local-build-root ${LBR} 2>&1 + + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + setup main) + cat "${CONF}" + echo + test $(jq -r '.repositories.main.workspace_root[1]' "${CONF}") = "${TREE}" + +else + + echo --- + echo Checking expected failures + + rm -rf "${LBR}" + "${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup main 2>&1 && exit 1 || : + echo Failed as expected +fi + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/unresolved-absent-known-upload.sh b/test/end-to-end/serve-service/serve-archive-root/unresolved-absent-known-upload.sh new file mode 100644 index 00000000..fe5f3d59 --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/unresolved-absent-known-upload.sh @@ -0,0 +1,128 @@ +#!/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. + + +### +# This test checks that an absent root can successfully be made in the presence +# of the serve endpoint in the situation where we already have the file +# association (i.e., we know the unresolved root tree) and the serve endpoint +# does not know the archive. The upload can only happen in native mode. +# +# The test archive does not contain symlinks. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "present": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + } + } + , "absent": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"absent": true} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup present) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.present.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# While keeping the file association, ask serve endpoint to provide the root as +# absent. For a serve endpoint that does not have the archive blob available, +# this will require uploading the locally-known root tree to remote CAS, from +# where the serve endpoint will pick it up. This can only happen in native mode. +if [ -z "${COMPAT}" ]; then + + ${JUST} gc --local-build-root ${LBR} 2>&1 + ${JUST} gc --local-build-root ${LBR} 2>&1 + + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent) + cat "${CONF}" + echo + test $(jq -r '.repositories.absent.workspace_root[1]' "${CONF}") = "${TREE}" + +else + + echo --- + echo Checking expected failures + + ${JUST} gc --local-build-root ${LBR} 2>&1 + ${JUST} gc --local-build-root ${LBR} 2>&1 + + "${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent 2>&1 && exit 1 || : + echo Failed as expected +fi + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/unresolved-absent-known.sh b/test/end-to-end/serve-service/serve-archive-root/unresolved-absent-known.sh new file mode 100644 index 00000000..b0d912fa --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/unresolved-absent-known.sh @@ -0,0 +1,109 @@ +#!/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. + + +### +# This test checks that an absent root can successfully be made in the presence +# of the serve endpoint in the situation where we already have the file +# association (i.e., we know the unresolved root tree) and the serve endpoint +# knows the archive. +# +# The test archive does not contain symlinks. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "present": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + } + } + , "absent": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"absent": true} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup present) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.present.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# While keeping the file association, ask serve endpoint to provide the root as +# absent. This serve endpoint known already the archive, so it should be able to +# set it up even if in compatible mode. +${JUST} gc --local-build-root ${LBR} 2>&1 +${JUST} gc --local-build-root ${LBR} 2>&1 + +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent) +cat "${CONF}" +echo +test $(jq -r '.repositories.absent.workspace_root[1]' "${CONF}") = "${TREE}" + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/unresolved-absent.sh b/test/end-to-end/serve-service/serve-archive-root/unresolved-absent.sh new file mode 100644 index 00000000..02f355fe --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/unresolved-absent.sh @@ -0,0 +1,133 @@ +#!/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. + + +### +# This test checks that an absent root can successfully be made by asking +# the serve endpoint to set it up for us when we have no local knowledge. +# +# The test archive does not contain symlinks. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "present": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + } + } + , "absent": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + , "pragma": {"absent": true} + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup present) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.present.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# Compute absent root by asking serve to set it up from scratch. This works also +# in compatible mode, as the serve endpoint has the archive in Git cache. +rm -rf "${LBR}" + +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup absent) +cat "${CONF}" +echo +test $(jq -r '.repositories.absent.workspace_root[1]' "${CONF}") = "${TREE}" + +# Check that serve can provide this tree as present in a clean build root. This +# can happen however only in native mode. +if [ -z "${COMPAT}" ]; then + + rm -rf "${LBR}" + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup present) + cat "${CONF}" + echo + test $(jq -r '.repositories.present.workspace_root[1]' "${CONF}") = "${TREE}" + +else + + echo --- + echo Checking expected failures + + rm -rf "${LBR}" + "${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup present 2>&1 && exit 1 || : + echo Failed as expected +fi + +echo OK diff --git a/test/end-to-end/serve-service/serve-archive-root/unresolved-present.sh b/test/end-to-end/serve-service/serve-archive-root/unresolved-present.sh new file mode 100644 index 00000000..abb00eba --- /dev/null +++ b/test/end-to-end/serve-service/serve-archive-root/unresolved-present.sh @@ -0,0 +1,142 @@ +#!/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. + + +### +# This test checks 3 of the options to make a present root for an archive, where: +# - archive is in local distfile; +# - there is already a file association to the unresolved root tree; +# - we receive the archive content from serve endpoint via the remote CAS. +# +# The test archive does not contain symlinks. +## + +set -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly LBR="${TEST_TMPDIR}/local-build-root" + +mkdir -p "${DISTDIR}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +ENDPOINT_ARGS="-r ${REMOTE_EXECUTION_ADDRESS} -R ${SERVE} ${COMPAT}" + +### +# Setup sample repos config with present and absent repos +## + +cp src.tar "${DISTDIR}" +HASH=$(git hash-object src.tar) + +mkdir work +cd work + +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "main": + { "repository": + { "type": "archive" + , "content": "$HASH" + , "fetch": "http://example.org/src.tar" + , "subdir": "repo" + } + } + } +} +EOF + +### +# Run the checks +## + +# Compute present root locally from scratch (via distfile) +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --distdir "${DISTDIR}" \ + --log-limit 6 \ + setup main) +cat "${CONF}" +echo +TREE=$(jq -r '.repositories.main.workspace_root[1]' "${CONF}") + +# Remove the distdir +rm -rf "${DISTDIR}" + +# Compute present root locally from stored file association +${JUST} gc --local-build-root ${LBR} 2>&1 +${JUST} gc --local-build-root ${LBR} 2>&1 + +CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + setup main) +cat "${CONF}" +echo +test $(jq -r '.repositories.main.workspace_root[1]' "${CONF}") = "${TREE}" + +# We now test if the serve endpoint can provide us the root. This can only +# happen in we're in native mode. +if [ -z "${COMPAT}" ]; then + + # In a clean build root, ask serve to set up the root for us, from scratch + rm -rf "${LBR}" + + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup main) + cat "${CONF}" + echo + test $(jq -r '.repositories.main.workspace_root[1]' "${CONF}") = "${TREE}" + + # Double-check the file association was created and root remains available + # without the remote endpoints + ${JUST} gc --local-build-root ${LBR} 2>&1 + ${JUST} gc --local-build-root ${LBR} 2>&1 + + CONF=$("${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + setup main) + cat "${CONF}" + echo + test $(jq -r '.repositories.main.workspace_root[1]' "${CONF}") = "${TREE}" + +else + + echo --- + echo Checking expected failures + + rm -rf "${LBR}" + "${JUST_MR}" --norc -C repos.json \ + --just "${JUST}" \ + --local-build-root "${LBR}" \ + --log-limit 6 \ + ${ENDPOINT_ARGS} setup main 2>&1 && exit 1 || : + echo Failed as expected +fi + +echo OK |