#!/bin/sh

if dpkg --print-architecture | grep s390; then
    echo "Skipping rfkill tests on s390 (LP: #1855009)"
    exit 77
fi

if dpkg --print-architecture | grep i386; then
    echo "Skipping rfkill tests on i386 (LP: #1855183)"
    exit 77
fi

set -e

make -f debian/tests/Makefile fake-rfkill
# poor man's dependency resolver
DEPS=$(modinfo debian/tests/fake-rfkill.ko | sed -n '/depends:/ {s/^.*://; s/[[:space:]]*$//; p}')
[ -z "$DEPS" ] || modprobe "$DEPS"
insmod debian/tests/fake-rfkill.ko

fake_id=$(rfkill list | grep fake | awk -F: '{ print $1; }')

service network-manager start
sleep 30

# test blocking the device
rfkill block $fake_id
if ! rfkill list $fake_id | grep 'Soft' | awk '{ print $3; }' | grep -qc yes; then
	echo "ERROR: could not block fake device"
	rmmod fake-rfkill || true
	exit 1
fi

# The systemd-rfkill service starts up whenever rfkill changes state, so on a
# 1-cpu system that might delay the event change from reaching nm before the
# check below, causing this test to fail.  The settle added here delays the
# nmcli check until after the rfkill uevent has definitely been processed.
udevadm settle

if ! LC_MESSAGES=C nmcli radio wifi | grep -qc disabled; then
	echo "ERROR: NM could not track device state."
	rmmod fake-rfkill || true
	exit 1
fi

# test unblocking the device
rfkill unblock $fake_id
if ! rfkill list $fake_id | grep 'Soft' | awk '{ print $3; }' | grep -qc no; then
	echo "ERROR: could not unblock fake device"
	rmmod fake-rfkill || true
	exit 1
fi

# same reason as above, however since systemd-rfkill stays running for 30 secs or so
# it's unlikely that it would start up again here, but it's still safer to call settle
udevadm settle

if ! LC_MESSAGES=C nmcli radio wifi | grep -qc enabled; then
	echo "ERROR: NM could not track device state to enabled."
	rmmod fake-rfkill || true
	exit 1
fi

rmmod fake-rfkill
make -f debian/tests/Makefile clean-rfkill

echo OK
