diff options
Diffstat (limited to 'test/end-to-end/tree-structure')
-rw-r--r-- | test/end-to-end/tree-structure/TARGETS | 8 | ||||
-rw-r--r-- | test/end-to-end/tree-structure/mr_setup.sh | 172 |
2 files changed, 179 insertions, 1 deletions
diff --git a/test/end-to-end/tree-structure/TARGETS b/test/end-to-end/tree-structure/TARGETS index b971a0ff..d164d1c8 100644 --- a/test/end-to-end/tree-structure/TARGETS +++ b/test/end-to-end/tree-structure/TARGETS @@ -4,9 +4,15 @@ , "test": ["basic.sh"] , "deps": [["", "tool-under-test"]] } +, "mr_setup": + { "type": ["@", "rules", "shell/test", "script"] + , "name": ["mr_setup"] + , "test": ["mr_setup.sh"] + , "deps": [["", "mr-tool-under-test"], ["", "tool-under-test"]] + } , "TESTS": { "type": ["@", "rules", "test", "suite"] , "stage": ["tree-structure"] - , "deps": ["basic"] + , "deps": ["basic", "mr_setup"] } } diff --git a/test/end-to-end/tree-structure/mr_setup.sh b/test/end-to-end/tree-structure/mr_setup.sh new file mode 100644 index 00000000..2573932d --- /dev/null +++ b/test/end-to-end/tree-structure/mr_setup.sh @@ -0,0 +1,172 @@ +#!/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 JUST_MR="${ROOT}/bin/mr-tool-under-test" +readonly OUT="${ROOT}/out" +mkdir -p "${OUT}" + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +readonly TARGET_ROOT="${ROOT}/target_root" +mkdir -p "${TARGET_ROOT}" +cd "${TARGET_ROOT}" +cat > "TARGETS.install_structure" << 'EOF' +{ "": {"type": "export", "target": "test"} + , "test": + { "type": "install" + , "deps": [["TREE", null, "test_dir"]] + } +} +EOF + +echo "TARGETS.install_structure": +cat "TARGETS.install_structure" +echo + +cat > "TARGETS.ls_structure" << 'EOF' +{ "": {"type": "export", "target": "generate"} + , "generate": + { "type": "generic" + , "deps": [["TREE", null, "test_dir"]] + , "outs": ["result.txt"] + , "cmds": ["ls -R test_dir > result.txt"] + } +} +EOF + +echo "TARGETS.ls_structure": +cat "TARGETS.ls_structure" +echo + +# Create source directories that have the same structure, but different content +# of the file: +readonly SRC_DIR="${ROOT}/src" +readonly NESTED_DIR="test_dir/nested_dir/nested_dir_2" +mkdir -p "${SRC_DIR}/${NESTED_DIR}" +echo "initial content" > "${SRC_DIR}/${NESTED_DIR}/file" + +readonly SRC_DIR_2="${ROOT}/src2" +mkdir -p "${SRC_DIR}/${NESTED_DIR}" +cp -R "${SRC_DIR}" "${SRC_DIR_2}" +echo "updated content" > "${SRC_DIR_2}/${NESTED_DIR}/file" + +readonly MAIN_ROOT="${ROOT}/main" +mkdir -p "${MAIN_ROOT}" +cd "${MAIN_ROOT}" + +echo "Creating repo-config at ${MAIN_ROOT}:" +cat > repo-config.json << EOF +{ "repositories": + { "targets": + { "repository": + { "type": "file" + , "path": "${TARGET_ROOT}" + , "pragma": {"to_git": true} + } + } + , "initial_sources": + { "repository": + { "type": "file" + , "path": "${SRC_DIR}" + , "pragma": {"to_git": true} + } + , "target_root": "targets" + , "target_file_name": "TARGETS.install_structure" + } + , "updated_sources": + { "repository": + { "type": "file" + , "path": "${SRC_DIR_2}" + , "pragma": {"to_git": true} + } + , "target_root": "targets" + , "target_file_name": "TARGETS.install_structure" + } + , "tree_structure_1": + { "repository": + { "type": "tree structure" + , "repo": "initial_sources" + } + , "target_root": "targets" + , "target_file_name": "TARGETS.ls_structure" + } + , "tree_structure_2": + { "repository": + { "type": "tree structure" + , "repo": "updated_sources" + } + , "target_root": "targets" + , "target_file_name": "TARGETS.ls_structure" + } + } +} +EOF +cat repo-config.json +echo + +# initial_sources and updated_sources have obviously different workspace roots: +# the files have different content, so the respective trees are different +# as well. +# BUT tree_structure_1 and tree_structure_2 produce the same result, since +# they rely on the "tree structure" of the sources, which are the same. +# Even so tree_structure_2 doesn't get built directly, it still can be taken +# from cache, since tree_structure_1 is keyed in the same way as +# tree_structure_2 is. + +echo "JustMR setup for tree_structure_1:" +readonly CONF_1=$("${JUST_MR}" --norc --local-build-root "${LBRDIR}" \ + -C repo-config.json --main tree_structure_1 setup) +cat "${CONF_1}" +echo + +echo "Building tree_structure_1 (expected a new cache entry):" +echo +("${JUST_MR}" --norc --local-build-root "${LBRDIR}" -C repo-config.json \ + --main tree_structure_1 --just "${JUST}" \ + install -L '["env", "PATH='"${PATH}"'"]' "${COMPAT}" \ + --log-limit 4 -o "${OUT}/tree_structure_1" 2>&1) > "${OUT}/log" + +cat "${OUT}/log" +echo +grep 'Export target \["@","tree_structure_1","",""\] registered for caching' \ + "${OUT}/log" + +echo "JustMR setup for tree_structure_2:" +readonly CONF_2=$("${JUST_MR}" --norc --local-build-root "${LBRDIR}" \ + -C repo-config.json --main tree_structure_2 setup) +cat "${CONF_2}" +echo + +echo "Building tree_structure_2 (expected to be taken from cache):" +echo +("${JUST_MR}" --norc --local-build-root "${LBRDIR}" -C repo-config.json \ + --main tree_structure_2 --just "${JUST}" \ + install -L '["env", "PATH='"${PATH}"'"]' "${COMPAT}" \ + --log-limit 4 -o "${OUT}/tree_structure_2" 2>&1) > "${OUT}/log2" + +cat "${OUT}/log2" +echo +grep 'Export target \["@","tree_structure_2","",""\] taken from cache' \ + "${OUT}/log2" + +echo OK |