summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2025-05-05 16:11:07 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2025-05-06 13:09:36 +0200
commit169621189b6c35a1f15c16d3fe392732659ab5b0 (patch)
tree2229f727d49c7cba3c59c4ec92d13b058c5ad6bc /test
parent6cd39f9127da68fd55678fbc4a65e902989f7d9b (diff)
downloadjustbuild-169621189b6c35a1f15c16d3fe392732659ab5b0.tar.gz
Add end-to-end test verifying that analysis failure is reported in profile
Diffstat (limited to 'test')
-rw-r--r--test/end-to-end/profile/TARGETS9
-rw-r--r--test/end-to-end/profile/analysis.sh121
2 files changed, 129 insertions, 1 deletions
diff --git a/test/end-to-end/profile/TARGETS b/test/end-to-end/profile/TARGETS
index 9dfeb307..b49f3135 100644
--- a/test/end-to-end/profile/TARGETS
+++ b/test/end-to-end/profile/TARGETS
@@ -26,9 +26,16 @@
, "deps": [["", "mr-tool-under-test"], ["", "tool-under-test"]]
, "keep-dirs": ["log"]
}
+, "analysis":
+ { "type": ["@", "rules", "shell/test", "script"]
+ , "name": ["analysis"]
+ , "test": ["analysis.sh"]
+ , "deps": [["", "mr-tool-under-test"], ["", "tool-under-test"]]
+ , "keep-dirs": ["log"]
+ }
, "TESTS":
{ "type": ["@", "rules", "test", "suite"]
, "stage": ["profile"]
- , "deps": ["basic", "failing build", "time", "time, remote"]
+ , "deps": ["analysis", "basic", "failing build", "time", "time, remote"]
}
}
diff --git a/test/end-to-end/profile/analysis.sh b/test/end-to-end/profile/analysis.sh
new file mode 100644
index 00000000..eadf093a
--- /dev/null
+++ b/test/end-to-end/profile/analysis.sh
@@ -0,0 +1,121 @@
+#!/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 OUT="${TEST_TMPDIR}/out"
+
+# 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#/}"}
+ , "--profile": "profile.json"
+ }
+, "rc files": [{"root": "workspace", "path": "rc.json"}]
+, "just": {"root": "system", "path": "${JUST#/}"}
+, "local build root": {"root": "system", "path": "${LBR#/}"}
+, "local launcher": ["env", "PATH=${PATH}"]
+}
+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 > TARGETS <<'EOF'
+{ "flex file":
+ { "type": "generic"
+ , "arguments_config": ["FLEX_FILE"]
+ , "outs": [{"type": "var", "name": "FLEX_FILE"}]
+ , "cmds":
+ [ { "type": "join"
+ , "$1": ["echo content > ", {"type": "var", "name": "FLEX_FILE"}]
+ }
+ ]
+ }
+, "flex dir":
+ { "type": "generic"
+ , "arguments_config": ["FLEX_DIR"]
+ , "out_dirs": [{"type": "var", "name": "FLEX_DIR"}]
+ , "cmds":
+ [ { "type": "join_cmd"
+ , "$1": ["mkdir", "-p", {"type": "var", "name": "FLEX_DIR"}]
+ }
+ , { "type": "join"
+ , "$1":
+ ["echo content > ", {"type": "var", "name": "FLEX_DIR"}, "/foo.txt"]
+ }
+ , { "type": "join"
+ , "$1":
+ ["echo content > ", {"type": "var", "name": "FLEX_DIR"}, "/bar.txt"]
+ }
+ ]
+ }
+, "":
+ { "type": "generic"
+ , "outs": ["ls.txt"]
+ , "cmds": ["touch ls.txt", "find . -type f | sort > ls.txt"]
+ , "deps": ["flex file", "flex dir"]
+ }
+}
+EOF
+
+cat > rc.json <<'EOF'
+{"invocation log": {"project id": "good-build"}}
+EOF
+
+"${JUST_MR}" --rc "${RC}" build -p \
+ -D '{"FLEX_DIR": "some/dir", "FLEX_FILE": "path/to/file.txt"}' 2>&1
+INVOCATION_DIR="$(ls -d "${LOG_DIR}"/good-build/*)"
+PROFILE="${INVOCATION_DIR}/profile.json"
+cat "${PROFILE}"
+# exit code of just should be reported as 0
+[ $(jq '."exit code"' "${PROFILE}") -eq 0 ]
+# There should be no analysis errors
+[ $(jq '."analysis errors" | length' "${PROFILE}") -eq 0 ]
+
+
+cat > rc.json <<'EOF'
+{"invocation log": {"project id": "analysis"}}
+EOF
+
+"${JUST_MR}" --rc "${RC}" build -p \
+ -D '{"FLEX_DIR": "path/to/dir", "FLEX_FILE": "path/to/dir/file.txt"}' 2>&1 \
+ && exit 1 || :
+INVOCATION_DIR="$(ls -d "${LOG_DIR}"/analysis/*)"
+PROFILE="${INVOCATION_DIR}/profile.json"
+cat "${PROFILE}"
+# exit code of just should be reported as 8 (analysis)
+[ $(jq '."exit code"' "${PROFILE}") -eq 8 ]
+# we expect one entry in analysis errors
+[ $(jq '."analysis errors" | length' "${PROFILE}") -eq 1 ]
+# ... and the error message should describe the problem
+jq -r '."analysis errors"[0]' "${PROFILE}" | grep 'stag.*conflict.*path/to/dir'
+
+echo OK