Files
stack/hw/test/test_helper.bash
kert 59eb56f659
Some checks failed
CI / skinny-install (aco) (push) Successful in 1m18s
CI / skinny-install (api) (push) Successful in 40s
CI / skinny-install (bcda) (push) Successful in 35s
CI / skinny-install (bib) (push) Successful in 38s
CI / skinny-install (cli) (push) Successful in 46s
CI / skinny-install (conf) (push) Successful in 36s
CI / skinny-install (opps) (push) Successful in 38s
CI / skinny-install (pfs) (push) Successful in 47s
CI / skinny-install (rex) (push) Successful in 35s
Infra CI / notebooks (push) Successful in 3m17s
CI / lint-test (push) Failing after 3m30s
CI / skinny-install (bls) (push) Successful in 34s
CI / skinny-install (ccw) (push) Successful in 45s
CI / skinny-install (cms) (push) Successful in 32s
CI / skinny-install (perf) (push) Successful in 43s
Deploy / build-scan-report (push) Has been cancelled
Infra CI / docs (push) Failing after 20s
Infra CI / api (push) Successful in 16s
Infra CI / mc (push) Successful in 12s
Package Supply Chain / pkg-supply-chain (push) Successful in 1m27s
Infra CI / zotero (push) Successful in 6m10s
chore: hw provisioning, test coverage, deps
2026-04-09 22:26:31 -04:00

154 lines
4.6 KiB
Bash

#!/bin/bash
# test_helper.bash — Common setup for all nanny.sh tests
BATS_SUPPORT="${BATS_TEST_DIRNAME}/../node_modules/bats-support"
BATS_ASSERT="${BATS_TEST_DIRNAME}/../node_modules/bats-assert"
load "${BATS_SUPPORT}/load.bash"
load "${BATS_ASSERT}/load.bash"
# Test working directory — isolated per test
TEST_WORK=""
setup_test_work() {
TEST_WORK=$(mktemp -d)
export WORK="$TEST_WORK"
export CONF="${TEST_WORK}/drives.conf"
export YKCONF="${TEST_WORK}/yubikeys.conf"
export CFCONF="${TEST_WORK}/cloudflare.conf"
export STATE="${TEST_WORK}/nanny.state"
export LOG="${TEST_WORK}/nanny.log"
touch "$STATE" "$LOG"
# Mock bin directory — prepended to PATH
MOCK_BIN="${TEST_WORK}/mock-bin"
mkdir -p "$MOCK_BIN"
export PATH="${MOCK_BIN}:${PATH}"
}
teardown_test_work() {
[ -n "$TEST_WORK" ] && rm -rf "$TEST_WORK"
}
# Source just the functions from nanny.sh without running main logic.
# We extract functions by sourcing with a guard.
source_nanny_functions() {
# Create a version of nanny.sh that only defines functions
local func_file="${TEST_WORK}/nanny_functions.bash"
cat > "$func_file" << 'FUNCS'
# State management
state_done() {
grep -qx "$1" "$STATE" 2>/dev/null
}
state_mark() {
if ! state_done "$1"; then
echo "$1" >> "$STATE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] STATE: $1 completed" >> "$LOG"
fi
}
# Drive helpers
snapshot_devices() {
lsblk -dno NAME,TYPE 2>/dev/null | awk '$2=="disk"{print $1}' | sort
}
is_serial_enrolled() {
grep -q "|${1}|" "$CONF" 2>/dev/null || grep -q "=${1}|" "$CONF" 2>/dev/null
}
get_drive_info() {
local dev="$1"
local devpath="/dev/${dev}"
DRIVE_MODEL=$(lsblk -dno MODEL "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
DRIVE_SERIAL=$(lsblk -dno SERIAL "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
DRIVE_SIZE=$(lsblk -dno SIZE "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
DRIVE_SIZE_BYTES=$(blockdev --getsize64 "$devpath" 2>/dev/null || echo "unknown")
DRIVE_TRAN=$(lsblk -dno TRAN "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
DRIVE_WWN=$(lsblk -dno WWN "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
DRIVE_REV=$(lsblk -dno REV "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
DRIVE_VENDOR=$(lsblk -dno VENDOR "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
if [[ "$dev" == nvme* ]]; then
DRIVE_TRAN="nvme"
fi
if [ -z "$DRIVE_SERIAL" ] || [ "$DRIVE_SERIAL" = "" ]; then
DRIVE_SERIAL=$(udevadm info --query=property --name="$devpath" 2>/dev/null | grep "^ID_SERIAL_SHORT=" | cut -d= -f2)
fi
if [ -z "$DRIVE_SERIAL" ] || [ "$DRIVE_SERIAL" = "" ]; then
DRIVE_SERIAL=$(udevadm info --query=property --name="$devpath" 2>/dev/null | grep "^ID_SERIAL=" | cut -d= -f2)
fi
if [ -z "$DRIVE_WWN" ] || [ "$DRIVE_WWN" = "" ]; then
DRIVE_WWN=$(udevadm info --query=property --name="$devpath" 2>/dev/null | grep "^ID_WWN=" | cut -d= -f2)
fi
}
FUNCS
source "$func_file"
}
# Create a mock command that records calls and returns preset output
create_mock() {
local cmd_name="$1"
local output="$2"
local exit_code="${3:-0}"
cat > "${MOCK_BIN}/${cmd_name}" << MOCK
#!/bin/bash
echo "\$0 \$@" >> "${TEST_WORK}/mock_calls.log"
echo "${output}"
exit ${exit_code}
MOCK
chmod +x "${MOCK_BIN}/${cmd_name}"
}
# Create a mock that behaves differently based on arguments
create_smart_mock() {
local cmd_name="$1"
local script_body="$2"
cat > "${MOCK_BIN}/${cmd_name}" << MOCK
#!/bin/bash
echo "\$0 \$@" >> "${TEST_WORK}/mock_calls.log"
${script_body}
MOCK
chmod +x "${MOCK_BIN}/${cmd_name}"
}
# Check if a mock was called with specific arguments
assert_mock_called_with() {
local pattern="$1"
grep -q "$pattern" "${TEST_WORK}/mock_calls.log" 2>/dev/null
}
# Count mock calls
mock_call_count() {
local cmd="$1"
grep -c "$cmd" "${TEST_WORK}/mock_calls.log" 2>/dev/null || echo 0
}
# Create a fake drives.conf with N enrolled drives
create_enrolled_drives() {
local count="${1:-6}"
cat > "$CONF" << 'HEADER'
#
# Drive enrollment manifest — generated by nanny.sh
#
HEADER
for i in $(seq 1 "$count"); do
echo "DRIVE_SATA_${i}=WD-SERIAL${i}|WD Blue SA510|0x5000|2000000000000|sata|enrolled_via=usb" >> "$CONF"
done
}
# Create a fake yubikeys.conf
create_enrolled_yubikeys() {
cat > "$YKCONF" << 'YK'
#
# YubiKey enrollment manifest
#
YUBIKEY_1=12345678|YubiKey 5 NFC|5.4.3|yubikey1_storagenode.pub
YUBIKEY_2=87654321|YubiKey 5C|5.4.3|yubikey2_storagenode.pub
YK
}