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
153 lines
4.7 KiB
Bash
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" ""
|
|
}
|