Files
PFVCluster/tests/unit/lmsensors.sh
T
mrcharles 333f2ae51b feat(sensors): lm-sensors+TEMPer SNMP extend on 6 hosts with scoped ACLs [#341][#439][#458][#459]
Native lm-sensors output plus optional TEMPer USB probe, unified in
lm-sensors format behind one snmpd extend (lmsensors). Idempotent
deploy binds snmpd to explicit LAN+Tailscale addresses only and
source-scopes the community to the pollers (LibreNMS, Home Assistant
app-connector LAN IP, admin workstation, Cloudron) per the founder's
security ruling. TDD unit suite included; fleet verified live (6 hosts)
and negative-tested (refused source).

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 10:46:57 -05:00

156 lines
4.7 KiB
Bash

#!/bin/bash
# Unit tests for the lm-sensors extend wrapper (dcinfra/sensors/temper) [#341/#439]
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SCRIPT="$PROJECT_ROOT/dcinfra/sensors/temper/lmsensors-extend.sh"
failed=0
# Script must exist and source cleanly (main guarded for sourcing)
if [[ -f "$SCRIPT" ]] && (source "$SCRIPT"); then
echo "✅ script exists + sources cleanly"
else
echo "❌ script missing or fails to source: $SCRIPT"
exit 1
fi
# shellcheck disable=SC1091
source "$SCRIPT"
# lm-sensors format block: chip, adapter, one line per sensor, +X.X°C
test_format_two_sensors() {
local got expected
expected=$(printf 'temper-usb-1\nAdapter: USB adapter\nInternal: +23.5°C\nExternal: +18.2°C')
got="$(format_block "23.5" "18.2")"
if [[ "$got" == "$expected" ]]; then
echo "✅ format_block renders two-sensor lm-sensors output"
else
echo "❌ format_block two-sensor output mismatch"
printf 'got:\n%s\nexpected:\n%s\n' "$got" "$expected"
((++failed))
fi
}
test_format_single_sensor() {
local got expected
expected=$(printf 'temper-usb-1\nAdapter: USB adapter\nInternal: +23.5°C')
got="$(format_block "23.5" "")"
if [[ "$got" == "$expected" ]]; then
echo "✅ format_block omits absent external sensor"
else
echo "❌ format_block single-sensor output mismatch"
printf 'got:\n%s\nexpected:\n%s\n' "$got" "$expected"
((++failed))
fi
}
test_format_negative() {
if format_block "-5.0" | grep -q 'Internal: -5.0°C'; then
echo "✅ format_block handles negative temps"
else
echo "❌ format_block mangles negative temps"
((++failed))
fi
}
test_format_garbage_rejected() {
if format_block "not-a-number" >/dev/null 2>&1; then
echo "❌ format_block accepted non-numeric input"
((++failed))
else
echo "✅ format_block rejects non-numeric input"
fi
}
# main() composition with stubbed binaries via PATH + env overrides
STUB_DIR="$(mktemp -d "/tmp/lmsensors-test-$$-XXXXXX")"
trap 'rm -rf "$STUB_DIR"' EXIT
make_stub_lsusb() {
if [[ "${1:-}" == "probe" ]]; then
printf '#!/bin/bash\necho "Bus 001 Device 007: ID 0c45:7401 Microdia TEMPer Temperature Sensor"\n' >"$STUB_DIR/lsusb"
else
printf '#!/bin/bash\nexit 0\n' >"$STUB_DIR/lsusb"
fi
chmod +x "$STUB_DIR/lsusb"
}
make_stub_sensors() {
printf '#!/bin/bash\nprintf "coretemp-isa-0000\\nAdapter: ISA adapter\\nPackage id 0: +45.0°C\\nCore 0: +41.0°C\\n"\n' >"$STUB_DIR/sensors"
chmod +x "$STUB_DIR/sensors"
}
make_stub_python() {
printf '#!/bin/bash\necho "23.5 18.2"\n' >"$STUB_DIR/fakepython"
chmod +x "$STUB_DIR/fakepython"
}
test_main_native_only() {
make_stub_lsusb noprobe
make_stub_sensors
local got
got="$(PATH="$STUB_DIR:$PATH" NATIVE_SENSORS_BIN="$STUB_DIR/sensors" \
VENV_PY=/nonexistent main)"
if grep -q 'Package id 0' <<<"$got" && ! grep -q 'temper-usb-1' <<<"$got"; then
echo "✅ main: native sensors only (no probe)"
else
echo "❌ main: native-only composition wrong"
((++failed))
fi
}
test_main_temper_only() {
make_stub_lsusb probe
make_stub_python
local got
got="$(PATH="$STUB_DIR:$PATH" NATIVE_SENSORS_BIN=/nonexistent \
VENV_PY="$STUB_DIR/fakepython" main)"
if grep -q 'Internal: +23.5°C' <<<"$got" && ! grep -q 'Package id 0' <<<"$got"; then
echo "✅ main: TEMPer only (no lm-sensors bin)"
else
echo "❌ main: temper-only composition wrong"
((++failed))
fi
}
test_main_merge() {
make_stub_lsusb probe
make_stub_sensors
make_stub_python
local got
got="$(PATH="$STUB_DIR:$PATH" NATIVE_SENSORS_BIN="$STUB_DIR/sensors" \
VENV_PY="$STUB_DIR/fakepython" main)"
if grep -q 'Package id 0' <<<"$got" && grep -q 'Internal: +23.5°C' <<<"$got"; then
echo "✅ main: native + TEMPer merged"
else
echo "❌ main: merge composition wrong"
((++failed))
fi
}
test_main_neither_fails() {
make_stub_lsusb noprobe
if PATH="$STUB_DIR:$PATH" NATIVE_SENSORS_BIN=/nonexistent \
VENV_PY=/nonexistent main >/dev/null 2>&1; then
echo "❌ main: succeeded with no sensor sources"
((++failed))
else
echo "✅ main: fails cleanly with no sensor sources"
fi
}
test_format_two_sensors
test_format_single_sensor
test_format_negative
test_format_garbage_rejected
test_main_native_only
test_main_temper_only
test_main_merge
test_main_neither_fails
if ((failed > 0)); then
echo "❌ lm-sensors extend: $failed test(s) failed"
exit 1
fi
echo "PASS: lm-sensors extend unit tests"