diff options
Diffstat (limited to 'test/end-to-end/target-cache/serve-sync.sh')
-rw-r--r-- | test/end-to-end/target-cache/serve-sync.sh | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/test/end-to-end/target-cache/serve-sync.sh b/test/end-to-end/target-cache/serve-sync.sh new file mode 100644 index 00000000..7e5bd092 --- /dev/null +++ b/test/end-to-end/target-cache/serve-sync.sh @@ -0,0 +1,147 @@ +#!/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 -eu + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly LBR_LOCAL="${TEST_TMPDIR}/lbr.local" +readonly LBR="${TEST_TMPDIR}/lbr.with-serve" +readonly WRKDIR="${PWD}/work" +readonly LOCAL_SRC_DIR="${TEST_TMPDIR}/src" + + +if [ "${COMPATIBLE:-}" = "YES" ]; then + ARGS="--compatible" +else + ARGS="" +fi + + +RE_ARGS="${ARGS} -r ${REMOTE_EXECUTION_ADDRESS}" +SERVE_ARGS="${ARGS} -R ${SERVE} -r ${REMOTE_EXECUTION_ADDRESS}" + +mkdir -p "${LOCAL_SRC_DIR}" +cd "${LOCAL_SRC_DIR}" +git init +git config user.name "Nobody" +git config user.email "nobody@example.org" + +cat > TARGETS <<'EOF' +{ "local (unexported)": + { "type": ["@", "rules", "CC", "library"] + , "hdrs": ["bar.hpp"] + , "deps": [["@", "lib", "", ""]] + } +, "local": {"type": "export", "target": "local (unexported)"} +, "": + { "type": ["@", "rules", "CC", "binary"] + , "name": ["use"] + , "srcs": ["use.cpp"] + , "private-deps": ["local", ["@", "lib", "", ""]] + } +} +EOF +cat > bar.hpp <<'EOF' +int bar(int x) { return x+1;} +EOF +cat > use.cpp <<'EOF' +#include "foo.hpp" +#include "bar.hpp" + +#include <iostream> + +int main(int arc, char **argv) { + std::cout << "foo(2)=" << foo(2) << "\n"; + std::cout << "bar(2)=" << bar(2) << std::endl; + return 0; +} +EOF + +git add . +git commit -m 'Initial commit + +... of a repository available locally but not to serve.' +readonly COMMIT=$(git log --pretty=%H) + + + +mkdir -p "${WRKDIR}" +cd "${WRKDIR}" +touch ROOT + +# Set up repositories; everythig is content-fixed +# - "lib" is known to serve ahead of time +# - "rules" is "to_git", hence will be made known to the serve end point +# - "" is only known locally, not to the serve end point +cat > repos.json <<EOF +{ "repositories": + { "": + { "repository": + { "type": "git" + , "repository": "${LOCAL_SRC_DIR}" + , "branch": "master" + , "commit": "${COMMIT}" + } + , "bindings": {"rules": "rules", "lib": "lib"} + } + , "rules": + { "repository": + {"type": "file", "path": "../src/rules", "pragma": {"to_git": true}} + } + , "lib": + { "repository": + {"type": "file", "path": "../samplelib", "pragma": {"to_git": true}} + , "bindings": {"rules": "rules"} + } + } +} +EOF +cat repos.json + +# Our target structure is that +# - lib is a library, with a generated hdr file +# - local is a target with a public dependency on lib, hence +# forwarding the header files +# - the default target depends on both, hence the header file of lib and +# its reexported version of local must not conflict + +# Build all locally, demonstrating the extensional projection and +# that the export structure is correct. +"${JUST_MR}" --local-build-root "${LBR_LOCAL}" --just "${JUST}" \ + -L '["env", "PATH='"${PATH}"'"]' build 2>&1 +"${JUST_MR}" --local-build-root "${LBR_LOCAL}" --just "${JUST}" \ + -L '["env", "PATH='"${PATH}"'"]' build 2>&1 + + +echo +echo 'Serve build' +echo +# Now, with a completely fresh local build root, build the default target, using +# a serve endpoint which can provide ["@", "lib", "", ""], +# but not ["@", "", "", "local"]. +"${JUST_MR}" --local-build-root "${LBR}" --just "${JUST}" ${SERVE_ARGS} \ + -L '["env", "PATH='"${PATH}"'"]' build 2>&1 + +echo 'remote build (same endpoint)' +echo +# Now, when continuing without serve (but still using remote-exection), things +# should still be in a consistent state, without causing staging conflicts. +echo +"${JUST_MR}" --local-build-root "${LBR}" --just "${JUST}" ${RE_ARGS} \ + -L '["env", "PATH='"${PATH}"'"]' build 2>&1 + + +echo OK |