Files
cozystack/hack/cozyreport-talos.bats
Myasnikov Daniil cc942fed68 test(tests): run unit suites with Bats and retain POSIX coverage
The shell translator rewrites test bodies and loses Bats reporting.
The unit lane needs complete TAP results and JUnit reports without
changing how live-cluster suites run.

Sourced production helpers still need a dash pass, and unit test bodies
need nounset without exporting shell options into subprocesses.

Assisted-by: LLM
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
2026-10-07 11:04:00 +03:00

87 lines
3.8 KiB
Bash

#!/usr/bin/env bats
# Regression coverage for host-node Talos diagnostics in hack/cozyreport.sh.
# The full report needs a cluster; this test sources only the focused helper and
# replaces talosctl with a shell function that records the exact argument vector.
load test_helper
HACK_DIR="$(cd "$(dirname "${BATS_TEST_FILENAME:-$0}")" && pwd)"
SCRIPT="$HACK_DIR/cozyreport.sh"
COZYREPORT_LIB=1
# shellcheck source=/dev/null
. "$SCRIPT"
# A PATH stub, not a shell function. These reads now go through the bounded
# reader, which runs them under `timeout` -- an external binary that execs its
# argument and therefore cannot see a function defined in this shell. A function
# mock is not merely bypassed, it is bypassed SILENTLY: the real talosctl runs, and
# what the test then reports is whatever the machine happens to have installed.
#
# cozytest.sh's parser ends an @test block at the first bare `}`, so the helper
# stays at top level rather than nested inside a test.
talos_stub_dir() {
_td=$1
mkdir -p "$_td/bin"
cat > "$_td/bin/talosctl" <<'STUB'
#!/bin/sh
printf '%s\n' "$*" >> "$TALOSCTL_CALLS"
[ -z "${TALOSCTL_FAIL:-}" ] && exit 0
echo 'error: rpc error: code = Unavailable desc = connection refused' >&2
exit 1
STUB
chmod +x "$_td/bin/talosctl"
# And a `timeout` that runs its command rather than timing it, so the assertions
# do not depend on the host having GNU coreutils.
printf '#!/bin/sh\n[ "$1" = "-k" ] && shift 2\nshift\nexec "$@"\n' > "$_td/bin/timeout"
chmod +x "$_td/bin/timeout"
COZYREPORT_BOUND="timeout -k 5 $COZYREPORT_READ_TIMEOUT"
}
@test "Talos host diagnostics pass an endpoint and use valid dmesg flags" {
# Cleanup at the end of the body, never a `trap ... EXIT`. An EXIT trap inside
# an @test replaces the one the bats binary installs for its own bookkeeping, and
# a test that then fails prints no TAP line at all -- it does not appear as
# `not ok`, it disappears, so a reader grepping the output sees a green suite.
# See docs/agents/e2e-testing.md. Both runners set `set -e`, so on a failure the
# cleanup line is never reached and the directory survives for inspection, which
# is what you want from a test that just failed.
tmp=$(mktemp -d)
talos_stub_dir "$tmp"
calls="$tmp/talosctl.calls"
TALOSCTL_CALLS="$calls" PATH="$tmp/bin:$PATH" \
cozyreport_collect_talos_node /workspace/talosconfig 192.0.2.11 "$tmp"
[ "$(sed -n '1p' "$calls")" = "--talosconfig /workspace/talosconfig -e 192.0.2.11 -n 192.0.2.11 dmesg" ]
[ "$(sed -n '2p' "$calls")" = "--talosconfig /workspace/talosconfig -e 192.0.2.11 -n 192.0.2.11 logs kubelet --tail=500" ]
[ "$(sed -n '3p' "$calls")" = "--talosconfig /workspace/talosconfig -e 192.0.2.11 -n 192.0.2.11 logs containerd --tail=500" ]
case "$(sed -n '1p' "$calls")" in *--tail*)
echo "dmesg must not receive the boolean --tail flag" >&2
false
esac
rm -rf "$tmp"
}
@test "a Talos node that refuses the connection leaves the reason in its files" {
tmp=$(mktemp -d)
talos_stub_dir "$tmp"
calls="$tmp/talosctl.calls"
TALOSCTL_FAIL=1 TALOSCTL_CALLS="$calls" PATH="$tmp/bin:$PATH" \
cozyreport_collect_talos_node /workspace/talosconfig 192.0.2.11 "$tmp"
# The reads are best-effort and must not abort the report, but "did not abort"
# and "produced nothing" are different outcomes and only one of them is about
# the node. Each read merges stderr into its own file, so a node that refused
# the connection says so where a reader looking for its dmesg will find it,
# rather than leaving three empty files that read like a quiet node.
for f in dmesg.txt kubelet.log containerd.log; do
t="$tmp/talos-192.0.2.11-$f"
[ -s "$t" ] || { echo "FAIL: $t is empty on a refused connection"; false; }
grep -q 'connection refused' "$t" || { echo "FAIL: $t does not carry the reason"; cat "$t"; false; }
done
rm -rf "$tmp"
}