summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/end-to-end/just-mr/TARGETS12
-rw-r--r--test/end-to-end/just-mr/stay-local.sh124
-rw-r--r--test/utils/TARGETS5
-rwxr-xr-xtest/utils/connection_documenting_server.py34
4 files changed, 175 insertions, 0 deletions
diff --git a/test/end-to-end/just-mr/TARGETS b/test/end-to-end/just-mr/TARGETS
index 203f79c4..1fa1cb13 100644
--- a/test/end-to-end/just-mr/TARGETS
+++ b/test/end-to-end/just-mr/TARGETS
@@ -203,6 +203,17 @@
, "fetch-absent (data)"
]
}
+, "stay-local":
+ { "type": ["end-to-end", "with remote"]
+ , "name": ["stay-local"]
+ , "test": ["stay-local.sh"]
+ , "deps":
+ [ ["end-to-end", "tool-under-test"]
+ , ["end-to-end", "mr-tool-under-test"]
+ , "fetch-absent (data)"
+ , ["utils", "null server"]
+ ]
+ }
, "TESTS":
{ "type": "install"
, "tainted": ["test"]
@@ -240,6 +251,7 @@
, "fetch-absent-archives"
, "fetch-absent-archives-symlinks"
, "fetch-absent-distdir-archive"
+ , "stay-local"
]
}
]
diff --git a/test/end-to-end/just-mr/stay-local.sh b/test/end-to-end/just-mr/stay-local.sh
new file mode 100644
index 00000000..1e411780
--- /dev/null
+++ b/test/end-to-end/just-mr/stay-local.sh
@@ -0,0 +1,124 @@
+#!/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
+
+env
+
+readonly JUST="${PWD}/bin/tool-under-test"
+readonly JUST_MR="${PWD}/bin/mr-tool-under-test"
+readonly LBR="${TEST_TMPDIR}/local-build-root"
+readonly LBR2="${TEST_TMPDIR}/local-build-root-2"
+readonly OUT="${TEST_TMPDIR}/out"
+readonly OUT2="${TEST_TMPDIR}/out-2"
+readonly LOG="${TEST_TMPDIR}/log"
+readonly EMPTY="${TEST_TMPDIR}/empty-directory"
+readonly SERVER="${PWD}/utils/null-server"
+readonly SERVER_STATE="${TEST_TMPDIR}/server"
+
+COMPAT=""
+if [ "${COMPATIBLE:-}" = "YES" ]; then
+ COMPAT="--compatible"
+fi
+
+ARCHIVE_CONTENT=$(git hash-object src/data.tar)
+echo "Archive has content $ARCHIVE_CONTENT"
+
+mkdir -p "${SERVER_STATE}"
+"${SERVER}" "${SERVER_STATE}/port" "${SERVER_STATE}/access" & server_pid=$!
+trap "kill $server_pid" INT TERM EXIT
+while [ '!' -f "${SERVER_STATE}/port" ]
+do
+ sleep 1s
+done
+# get port number as variable
+port="$(cat "${SERVER_STATE}/port")"
+echo "Server up and listening at port ${port}"
+
+mkdir work
+cd work
+touch ROOT
+cat > repos.json <<EOF
+{ "repositories":
+ { "archive":
+ { "repository":
+ { "type": "archive"
+ , "content": "${ARCHIVE_CONTENT}"
+ , "fetch": "http://non-existent.example.org/data.tar"
+ }
+ }
+ , "targets": {"repository": {"type": "file", "path": "targets"}}
+ , "":
+ { "repository": {"type": "distdir", "repositories": ["archive"]}
+ , "target_root": "targets"
+ }
+ }
+}
+EOF
+mkdir targets
+cat > targets/TARGETS <<'EOF'
+{ "":
+ { "type": "generic"
+ , "outs": ["archive_id"]
+ , "cmds": ["git hash-object data.tar > archive_id"]
+ , "deps": ["data.tar"]
+ }
+}
+EOF
+
+echo
+cat repos.json
+echo
+mkdir -p "${LOG}"
+"${JUST_MR}" --norc --local-build-root "${LBR}" \
+ -r "127.0.0.1:${port}" ${COMPAT} \
+ --log-limit 5 -f "${LOG}/log" \
+ --distdir ../src \
+ setup > conf.json
+echo
+cat "${LOG}/log"
+echo
+cat conf.json
+echo
+cat $(cat conf.json)
+echo
+# As a distdir (local directory!) was provided with all needed files,
+# no attempty should be made to contact the remote-execution endpoint
+echo
+[ -f "${SERVER_STATE}/access" ] && cat "${SERVER_STATE}/access" && exit 1 || :
+
+# The obtained configuraiton should be suitable for building, also remotely
+"${JUST}" install -C "$(cat conf.json)" -o "${OUT}" \
+ --local-build-root "${LBR}" \
+ -r "${REMOTE_EXECUTION_ADDRESS}" $COMPAT 2>&1
+echo
+cat "${OUT}/archive_id"
+[ $(cat "${OUT}/archive_id") = "${ARCHIVE_CONTENT}" ]
+echo
+
+# As the archive in question was input to an action, setup via the
+# remote-execution endpoint should work now, even if the provided
+# distdir is empty
+mkdir -p "${EMPTY}"
+"${JUST_MR}" --norc --just "${JUST}" --local-build-root "${LBR2}" \
+ -r "${REMOTE_EXECUTION_ADDRESS}" $COMPAT \
+ --distdir ${EMPTY} \
+ install -o "${OUT2}" 2>&1
+cat "${OUT2}/archive_id"
+[ $(cat "${OUT2}/archive_id") = "${ARCHIVE_CONTENT}" ]
+echo
+
+echo OK
diff --git a/test/utils/TARGETS b/test/utils/TARGETS
index 94fb936f..7651d6a0 100644
--- a/test/utils/TARGETS
+++ b/test/utils/TARGETS
@@ -83,6 +83,11 @@
, "tainted": ["test"]
, "files": {"utils/run_test_server.py": "run_test_server.py"}
}
+, "null server":
+ { "type": "install"
+ , "tainted": ["test"]
+ , "files": {"utils/null-server": "connection_documenting_server.py"}
+ }
, "shell_quoting":
{ "type": ["@", "rules", "CC", "library"]
, "name": ["shell_quoting"]
diff --git a/test/utils/connection_documenting_server.py b/test/utils/connection_documenting_server.py
new file mode 100755
index 00000000..102c0e8c
--- /dev/null
+++ b/test/utils/connection_documenting_server.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+# 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.
+
+import sys
+import socketserver
+
+
+log_file = "access.log"
+
+class MyTCPHandler(socketserver.BaseRequestHandler):
+ def handle(self):
+ with open(log_file, "a") as f:
+ f.write("Connected from {}\n".format(self.client_address,))
+ self.request.sendall(b"Wrong, but thanks for playing")
+
+log_file = sys.argv[2]
+
+with socketserver.TCPServer(("127.0.0.1", 0), MyTCPHandler) as server:
+ socket_info = server.socket.getsockname()
+ with open(sys.argv[1], "w") as f:
+ f.write("%d" % (socket_info[1],))
+ server.serve_forever()