Files
stack/hw/test/resolver.bats
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

153 lines
4.7 KiB
Bash

#!/usr/bin/env bats
# Tests for drive-resolver.sh generation and execution
load test_helper
setup() {
setup_test_work
source_nanny_functions
# Populate a full drives.conf
cat > "$CONF" << 'DRIVES'
#
# Drive enrollment manifest
#
DRIVE_SATA_1=WD-S001|WD Blue SA510 2TB|0x5001|2000398934016|sata|enrolled_via=usb
DRIVE_SATA_2=WD-S002|WD Blue SA510 2TB|0x5002|2000398934016|sata|enrolled_via=usb
DRIVE_SATA_3=WD-S003|WD Blue SA510 2TB|0x5003|2000398934016|sata|enrolled_via=usb
DRIVE_SATA_4=WD-S004|WD Blue SA510 2TB|0x5004|2000398934016|sata|enrolled_via=usb
DRIVE_SATA_5=WD-S005|WD Blue SA510 2TB|0x5005|2000398934016|sata|enrolled_via=usb
DRIVE_SATA_6=WD-S006|WD Blue SA510 2TB|0x5006|2000398934016|sata|enrolled_via=usb
DRIVE_NVME_DOCKER=NVM-D001|WD SN770 2TB|none|2000398934016|nvme|enrolled_via=usb
DRIVE_HDD_BACKUP=HDD-B001|WD Red Plus 4TB|none|4000787030016|sata|enrolled_via=usb
DRIVES
}
teardown() {
teardown_test_work
}
# ─── Resolver generation ───
generate_resolver() {
# Replicate the resolver generation logic from nanny.sh
cat > "${TEST_WORK}/drive-resolver.sh" << 'RESOLVER_HEAD'
#!/bin/sh
resolve_drive() {
local target_serial="$1"
local result=""
for dev in /sys/block/*; do
[ -d "$dev" ] || continue
devname=$(basename "$dev")
case "$devname" in
loop*|ram*|dm-*|md*|sr*|zram*) continue ;;
esac
devpath="/dev/${devname}"
[ -b "$devpath" ] || continue
serial=$(lsblk -dno SERIAL "$devpath" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
if [ -z "$serial" ]; then
serial=$(udevadm info --query=property --name="$devpath" 2>/dev/null | grep "^ID_SERIAL_SHORT=" | cut -d= -f2)
fi
if [ "$serial" = "$target_serial" ]; then
result="$devpath"
break
fi
done
echo "$result"
}
RESOLVER_HEAD
{
echo "SATA_DRIVES=\"\""
for i in 1 2 3 4 5 6; do
line=$(grep "^DRIVE_SATA_${i}=" "$CONF")
serial=$(echo "$line" | cut -d= -f2 | cut -d'|' -f1)
echo "DEV_SATA_${i}=\$(resolve_drive \"${serial}\")"
echo "SATA_DRIVES=\"\${SATA_DRIVES} \${DEV_SATA_${i}}\""
done
echo "SATA_DRIVES=\$(echo \$SATA_DRIVES | sed 's/^ //')"
line=$(grep "^DRIVE_NVME_DOCKER=" "$CONF")
serial=$(echo "$line" | cut -d= -f2 | cut -d'|' -f1)
echo "DEV_NVME=\$(resolve_drive \"${serial}\")"
line=$(grep "^DRIVE_HDD_BACKUP=" "$CONF")
serial=$(echo "$line" | cut -d= -f2 | cut -d'|' -f1)
echo "DEV_HDD=\$(resolve_drive \"${serial}\")"
} >> "${TEST_WORK}/drive-resolver.sh"
chmod +x "${TEST_WORK}/drive-resolver.sh"
}
@test "resolver script is generated" {
generate_resolver
assert [ -f "${TEST_WORK}/drive-resolver.sh" ]
assert [ -x "${TEST_WORK}/drive-resolver.sh" ]
}
@test "resolver contains all 6 SATA serial lookups" {
generate_resolver
for i in 1 2 3 4 5 6; do
run grep "WD-S00${i}" "${TEST_WORK}/drive-resolver.sh"
assert_success
done
}
@test "resolver contains NVMe serial lookup" {
generate_resolver
run grep "NVM-D001" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
@test "resolver contains HDD serial lookup" {
generate_resolver
run grep "HDD-B001" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
@test "resolver defines SATA_DRIVES variable" {
generate_resolver
run grep "SATA_DRIVES=" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
@test "resolver defines DEV_NVME variable" {
generate_resolver
run grep "DEV_NVME=" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
@test "resolver defines DEV_HDD variable" {
generate_resolver
run grep "DEV_HDD=" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
@test "resolver skips virtual devices in resolve_drive" {
generate_resolver
run grep "loop\*|ram\*|dm-\*|md\*|sr\*|zram\*" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
@test "resolve_drive function tries lsblk then udevadm fallback" {
generate_resolver
run grep "ID_SERIAL_SHORT" "${TEST_WORK}/drive-resolver.sh"
assert_success
}
# ─── Resolver with mocked system ───
@test "resolve_drive returns empty for unknown serial" {
# Create a mock lsblk that returns known serials
create_smart_mock "lsblk" 'echo ""'
create_smart_mock "udevadm" 'echo ""'
# Source just the resolve_drive function
eval "$(head -30 <(generate_resolver; cat "${TEST_WORK}/drive-resolver.sh"))"
# This won't find anything since /sys/block is the real system
# but the mock ensures lsblk returns empty
result=$(resolve_drive "NONEXISTENT-SERIAL")
assert_equal "$result" ""
}