summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/end-to-end/target-cache/TARGETS14
-rw-r--r--test/end-to-end/target-cache/data/TARGETS2
-rw-r--r--test/end-to-end/target-cache/data/samplelib/TARGETS14
-rw-r--r--test/end-to-end/target-cache/data/samplelib/foo.cpp19
-rw-r--r--test/end-to-end/target-cache/serve-sync.sh147
5 files changed, 195 insertions, 1 deletions
diff --git a/test/end-to-end/target-cache/TARGETS b/test/end-to-end/target-cache/TARGETS
index 36f8a59b..3a02df18 100644
--- a/test/end-to-end/target-cache/TARGETS
+++ b/test/end-to-end/target-cache/TARGETS
@@ -16,6 +16,18 @@
, "bootstrap-src-staged"
]
}
+, "serve-sync":
+ { "type": ["end-to-end", "with serve"]
+ , "name": ["serve-sync"]
+ , "test": ["serve-sync.sh"]
+ , "deps":
+ [ ["", "tool-under-test"]
+ , ["", "mr-tool-under-test"]
+ , ["./", "data", "lib with generated hdr"]
+ , "bootstrap-src-staged"
+ ]
+ , "repos": [["./", "data", "lib with generated hdr"]]
+ }
, "export-extern":
{ "type": ["@", "rules", "shell/test", "script"]
, "name": ["export-extern"]
@@ -35,7 +47,7 @@
, { "type": "if"
, "cond": {"type": "var", "name": "TEST_BOOTSTRAP_JUST_MR"}
, "then": []
- , "else": ["artifacts-sync"]
+ , "else": ["artifacts-sync", "serve-sync"]
}
]
}
diff --git a/test/end-to-end/target-cache/data/TARGETS b/test/end-to-end/target-cache/data/TARGETS
index d04fc3aa..d449bc81 100644
--- a/test/end-to-end/target-cache/data/TARGETS
+++ b/test/end-to-end/target-cache/data/TARGETS
@@ -1,4 +1,6 @@
{ "greetlib":
{"type": "install", "dirs": [[["TREE", null, "./greetlib"], "."]]}
, "pydicts": {"type": "install", "dirs": [[["TREE", null, "./pydicts"], "."]]}
+, "lib with generated hdr":
+ {"type": "install", "dirs": [[["TREE", null, "./samplelib"], "."]]}
}
diff --git a/test/end-to-end/target-cache/data/samplelib/TARGETS b/test/end-to-end/target-cache/data/samplelib/TARGETS
new file mode 100644
index 00000000..ee123a71
--- /dev/null
+++ b/test/end-to-end/target-cache/data/samplelib/TARGETS
@@ -0,0 +1,14 @@
+{ "": {"type": "export", "target": "lib"}
+, "lib":
+ { "type": ["@", "rules", "CC", "library"]
+ , "name": ["foo"]
+ , "srcs": ["foo.cpp"]
+ , "hdrs": ["foo.hpp"]
+ }
+, "foo.hpp":
+ { "type": "generic"
+ , "outs": ["foo.hpp"]
+ , "cmds":
+ ["echo '// generated file' > foo.hpp", "echo 'int foo(int x);' >> foo.hpp"]
+ }
+}
diff --git a/test/end-to-end/target-cache/data/samplelib/foo.cpp b/test/end-to-end/target-cache/data/samplelib/foo.cpp
new file mode 100644
index 00000000..8ad192c3
--- /dev/null
+++ b/test/end-to-end/target-cache/data/samplelib/foo.cpp
@@ -0,0 +1,19 @@
+// 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.
+
+#include "foo.hpp"
+
+int foo(int x) {
+ return x*x;
+}
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