#!/bin/bash set -euo pipefail ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) TMP=$(mktemp -d) trap 'rm -rf "$TMP"' EXIT mkdir "$TMP/bin" export MOCK_NM_LOG="$TMP/nmcli.log" export MOCK_NM_STATE="$TMP/nm-state" export MOCK_NM_READS="$TMP/nm-reads" cat > "$TMP/bin/nmcli" <<'EOF' #!/bin/bash printf '%s\n' "$*" >> "$MOCK_NM_LOG" case "$*" in 'radio wifi on') printf 'on\n' > "$MOCK_NM_STATE" ;; 'device set wlan0 managed yes') ;; '-g GENERAL.STATE device show wlan0') [ "$(cat "$MOCK_NM_STATE")" = on ] || { echo '20 (unavailable)'; exit 0; } reads=$(cat "$MOCK_NM_READS" 2>/dev/null || echo 0) reads=$((reads + 1)); printf '%s\n' "$reads" > "$MOCK_NM_READS" if [ "$reads" -lt "${MOCK_NM_AVAILABLE_AFTER:-3}" ]; then echo '20 (unavailable)'; else echo '30 (disconnected)'; fi ;; 'radio') echo 'WIFI-HW WIFI'; echo 'enabled enabled' ;; 'device status') echo 'DEVICE TYPE STATE'; echo 'wlan0 wifi unavailable' ;; '-f GENERAL.STATE,GENERAL.REASON device show wlan0') echo 'GENERAL.STATE: 20 (unavailable)'; echo 'GENERAL.REASON: 2 (unknown)' ;; 'connection up pivilion-hotspot ifname wlan0') ;; esac EOF cat > "$TMP/bin/rfkill" <<'EOF' #!/bin/sh echo '0: phy0: Wireless LAN' echo 'Soft blocked: no' echo 'Hard blocked: no' EOF cat > "$TMP/bin/sleep" <<'EOF' #!/bin/sh exit 0 EOF chmod +x "$TMP/bin/"* PATH="$TMP/bin:$PATH" export PATH source "$ROOT/usr/local/lib/pivilion/networkmanager.sh" # The mock starts software-disabled and becomes available after a delay. PIVILION_NM_READY_TIMEOUT=5 pivilion_nm_prepare_interface wlan0 [ "$(cat "$MOCK_NM_STATE")" = on ] [ "$(cat "$MOCK_NM_READS")" -eq 3 ] sed -n '1p' "$MOCK_NM_LOG" | grep -Fqx 'radio wifi on' sed -n '2p' "$MOCK_NM_LOG" | grep -Fqx 'device set wlan0 managed yes' pivilion_nm_connection_up pivilion-hotspot wlan0 grep -Fqx 'connection up pivilion-hotspot ifname wlan0' "$MOCK_NM_LOG" # A device that remains unavailable fails within the configured bound and logs # the complete NetworkManager/rfkill snapshot. : > "$MOCK_NM_LOG" : > "$MOCK_NM_READS" if MOCK_NM_AVAILABLE_AFTER=99 PIVILION_NM_READY_TIMEOUT=2 pivilion_nm_prepare_interface wlan0 >"$TMP/timeout.log" 2>&1; then exit 1; fi grep -q 'Timed out after 2s' "$TMP/timeout.log" grep -q '^-- nmcli radio --$' "$TMP/timeout.log" grep -q '^-- nmcli device status --$' "$TMP/timeout.log" grep -q '^-- wlan0 state and reason --$' "$TMP/timeout.log" grep -q '^-- rfkill Wi-Fi state --$' "$TMP/timeout.log"