summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2025-02-20 10:38:37 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2025-03-10 16:28:59 +0100
commite45883f88fe02906abaee763146aee770e62ef05 (patch)
tree5858e07bb003f52acd74bef75bab8f422e78be0f
parent860c684582eaac0c94d6004dd9afeaccc43bc4ff (diff)
downloadjustbuild-e45883f88fe02906abaee763146aee770e62ef05.tar.gz
Add basic end-to-end test verifying invocation logging
-rw-r--r--test/end-to-end/just-mr/TARGETS9
-rw-r--r--test/end-to-end/just-mr/invocation-log.sh117
2 files changed, 126 insertions, 0 deletions
diff --git a/test/end-to-end/just-mr/TARGETS b/test/end-to-end/just-mr/TARGETS
index c0c5bad3..856367a8 100644
--- a/test/end-to-end/just-mr/TARGETS
+++ b/test/end-to-end/just-mr/TARGETS
@@ -232,6 +232,14 @@
, "test": ["ignore-special.sh"]
, "deps": [["", "mr-tool-under-test"], ["", "tool-under-test"]]
}
+, "invocation-log":
+ { "type": ["@", "rules", "shell/test", "script"]
+ , "name": ["invocation-log"]
+ , "test": ["invocation-log.sh"]
+ , "deps": [["", "mr-tool-under-test"], ["", "tool-under-test"]]
+ , "keep-dirs": ["log"]
+ , "keep": ["out/just-repo-config.json"]
+ }
, "TESTS":
{ "type": ["@", "rules", "test", "suite"]
, "arguments_config": ["TEST_BOOTSTRAP_JUST_MR", "TEST_COMPATIBLE_REMOTE"]
@@ -259,6 +267,7 @@
, "gc-repo"
, "repeated-gc"
, "gc-drop"
+ , "invocation-log"
]
, { "type": "if"
, "cond": {"type": "var", "name": "TEST_COMPATIBLE_REMOTE"}
diff --git a/test/end-to-end/just-mr/invocation-log.sh b/test/end-to-end/just-mr/invocation-log.sh
new file mode 100644
index 00000000..1b4aea08
--- /dev/null
+++ b/test/end-to-end/just-mr/invocation-log.sh
@@ -0,0 +1,117 @@
+#!/bin/sh
+# Copyright 2025 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="${TEST_TMPDIR}/local-build-root"
+readonly LOG_DIR="${PWD}/log"
+readonly ETC_DIR="${PWD}/etc"
+readonly WRK_DIR="${PWD}/work"
+readonly REPORTED_CONFIG="${PWD}/out/just-repo-config.json"
+readonly OUT_GRAPH="${TEST_TMPDIR}/cmdline-option-graph.json"
+
+# Set up an rc file, requesting invocation logging
+mkdir -p "${ETC_DIR}"
+readonly RC="${ETC_DIR}/rc.json"
+cat > "${RC}" <<EOF
+{ "invocation log":
+ { "directory": {"root": "system", "path": "${LOG_DIR#/}"}
+ , "meta data": "meta.json"
+ , "--dump-graph": "graph.json"
+ , "--profile": "profile.json"
+ }
+, "rc files": [{"root": "workspace", "path": "rc.json"}]
+, "just": {"root": "system", "path": "${JUST#/}"}
+, "local build root": {"root": "system", "path": "${LBR#/}"}
+}
+EOF
+cat "${RC}"
+
+# Setup basic project, setting project id
+mkdir -p "${WRK_DIR}"
+cd "${WRK_DIR}"
+touch ROOT
+cat > repos.json <<'EOF'
+{"repositories": {"": {"repository": {"type": "file", "path": "."}}}}
+EOF
+
+cat > rc.json <<'EOF'
+{"invocation log": {"project id": "invocation-log-test"}}
+EOF
+
+cat > TARGETS <<'EOF'
+{ "upper":
+ { "type": "generic"
+ , "deps": ["data.txt"]
+ , "outs": ["upper.txt"]
+ , "cmds": ["cat data.txt | tr a-z A-Z > upper.txt"]
+ }
+}
+EOF
+echo blablabla > data.txt
+
+# Call analyse via just-mr
+"${JUST_MR}" --rc "${RC}" analyse --dump-graph "${OUT_GRAPH}" upper 2>&1
+
+# As this is the first invocation, we can find the invocation-log dir by a glob
+INVOCATION_DIR="$(ls -d "${LOG_DIR}"/invocation-log-test/*)"
+
+# ... this should create a meta-data file.
+META_DATA_FILE="${INVOCATION_DIR}/meta.json"
+echo "Meta data file ${META_DATA_FILE}"
+cat "${META_DATA_FILE}"
+echo
+
+# Sanity check: the local build root must occur in the command line as
+# it was specified in the rc file.
+[ $(jq '.cmdline | contains(["'"${LBR}"'"])' "${META_DATA_FILE}") = true ]
+
+# Install the referenced configuration
+
+"${JUST_MR}" --rc "${RC}" install-cas -o "${REPORTED_CONFIG}" \
+ $(jq -r '.configuration' "${META_DATA_FILE}") 2>&1
+
+echo
+cat "${REPORTED_CONFIG}"
+echo
+
+# ... and verify that the file repository contains the correct path
+[ "$(jq -r '.repositories.""."workspace_root"[1]' "${REPORTED_CONFIG}")" = "${WRK_DIR}" ]
+
+# Verify the presence of graph file
+GRAPH_FILE="${INVOCATION_DIR}/graph.json"
+[ -f "${GRAPH_FILE}" ]
+echo "Graph file ${GRAPH_FILE}"
+cat "${GRAPH_FILE}"
+
+# ... and do some basic sanity check
+[ $(jq '.actions | keys | length' "${GRAPH_FILE}") -eq 1 ]
+ACTION_KEY="$(jq '.actions | keys | .[0]' "${GRAPH_FILE}")"
+[ "$(jq -r '.actions.'"${ACTION_KEY}"'.output[0]' "${GRAPH_FILE}")" = "upper.txt" ]
+
+# Also verify that the passed graph option is honored as well
+[ -f "${OUT_GRAPH}" ]
+cmp "${GRAPH_FILE}" "${OUT_GRAPH}"
+
+# Verify the profile file
+PROFILE_FILE="${INVOCATION_DIR}/profile.json"
+cat "${PROFILE_FILE}"
+[ $(jq '."exit code"' "${PROFILE_FILE}") -eq 0 ]
+[ $(jq -r '."target"[3]' "${PROFILE_FILE}") = "upper" ]
+
+echo OK