1*8589c043Smsaitoh# $NetBSD: t_swsensor.sh,v 1.13 2021/12/05 08:16:10 msaitoh Exp $ 22fbd2852Spgoyette 32fbd2852Spgoyetteget_sensor_info() { 42fbd2852Spgoyette rump.envstat -x | \ 52fbd2852Spgoyette sed -e "\;swsensor;,\;/array;p" -e "d" 62fbd2852Spgoyette} 72fbd2852Spgoyette 82fbd2852Spgoyetteget_sensor_key() { 97f8653d8Spgoyette local v 107f8653d8Spgoyette v=$(get_sensor_info | grep -A1 $1 | grep integer | \ 117f8653d8Spgoyette sed -e 's;<[/a-z]*>;;g') 127f8653d8Spgoyette if [ -z "$v" ] ; then 137f8653d8Spgoyette v="key_$1_not_found" 147f8653d8Spgoyette fi 157f8653d8Spgoyette echo $v 162fbd2852Spgoyette} 172fbd2852Spgoyette 182fbd2852Spgoyetteget_powerd_event_count() { 192fbd2852Spgoyette grep "not running" powerd.log | wc -l 202fbd2852Spgoyette} 212fbd2852Spgoyette 22198966caSpgoyetteget_rnd_bits_count() { 23198966caSpgoyette env RUMPHIJACK=blanket=/dev/random:/dev/urandom \ 24198966caSpgoyette RUMP_SERVER=unix://t_swsensor_socket \ 25198966caSpgoyette LD_PRELOAD=/usr/lib/librumphijack.so rndctl -l | \ 26198966caSpgoyette grep "swsensor-sensor" | \ 278c611a8aSriastradh awk '{print $3}' 28198966caSpgoyette} 29198966caSpgoyette 302fbd2852Spgoyettecheck_powerd_event() { 312fbd2852Spgoyette event=$(grep "not running" powerd.log | \ 322fbd2852Spgoyette sed -e "$1p" -e "d" ) 332fbd2852Spgoyette event=${event##*//} 342fbd2852Spgoyette script=${event%% *} 352fbd2852Spgoyette event=${event#* } 362fbd2852Spgoyette device=${event%% *} 372fbd2852Spgoyette event=${event#* } 382fbd2852Spgoyette state=${event%% *} 392fbd2852Spgoyette sensor=${event#* } 402fbd2852Spgoyette sensor=${sensor% *} 412fbd2852Spgoyette 422fbd2852Spgoyette if [ "${script}" != "sensor_indicator" ] ; then 432fbd2852Spgoyette echo "Event uses wrong script: ${script}" 442fbd2852Spgoyette elif [ "${device}" != "swsensor" ] ; then 452fbd2852Spgoyette echo "Event uses wrong device: ${device}" 462fbd2852Spgoyette elif [ "${sensor}" != "sensor" ] ; then 472fbd2852Spgoyette echo "Event uses wrong sensor: ${sensor}" 482fbd2852Spgoyette elif [ "${state}" != "$2" ] ; then 492fbd2852Spgoyette echo "Event uses wrong state: ${state}" 502fbd2852Spgoyette fi 512fbd2852Spgoyette} 522fbd2852Spgoyette 532fbd2852Spgoyette# Start the rump server, then load the swsensor module with the 542fbd2852Spgoyette# requested properties 552fbd2852Spgoyette 562fbd2852Spgoyettestart_rump() { 57198966caSpgoyette rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER} 582fbd2852Spgoyette if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then 592fbd2852Spgoyette rump.modunload swsensor 602fbd2852Spgoyette rump.modload -f $1 swsensor 612fbd2852Spgoyette else 622fbd2852Spgoyette rump.modload $1 swsensor 632fbd2852Spgoyette fi 642fbd2852Spgoyette return $? 652fbd2852Spgoyette} 662fbd2852Spgoyette 672fbd2852Spgoyettecommon_head() { 682fbd2852Spgoyette atf_set descr "$1" 69610137e5Smartin atf_set timeout 120 702fbd2852Spgoyette atf_set require.progs rump.powerd rump.envstat rump.modload \ 71ee1e1b3dSpgoyette rump.halt rump.sysctl rump_server \ 72198966caSpgoyette sed grep awk \ 73198966caSpgoyette rndctl expr 742fbd2852Spgoyette} 752fbd2852Spgoyette 762fbd2852Spgoyettecommon_cleanup() { 772fbd2852Spgoyette rump.modunload swsensor 782fbd2852Spgoyette rump.halt 792fbd2852Spgoyette} 802fbd2852Spgoyette 812fbd2852Spgoyettecreate_envsys_conf_files() { 822fbd2852Spgoyette cat << ENV0 > env0.conf 832fbd2852Spgoyette swsensor { 842fbd2852Spgoyette refresh-timeout = 2s; 852fbd2852Spgoyette } 862fbd2852SpgoyetteENV0 872fbd2852Spgoyette cat << ENV1 > env1.conf 882fbd2852Spgoyette swsensor { 892fbd2852Spgoyette sensor0 { critical-min = $(( $1 - $2 )); } 902fbd2852Spgoyette } 912fbd2852SpgoyetteENV1 922fbd2852Spgoyette cat << ENV2 > env2.conf 932fbd2852Spgoyette swsensor { 942fbd2852Spgoyette sensor0 { critical-min = $1; } 952fbd2852Spgoyette } 962fbd2852SpgoyetteENV2 972fbd2852Spgoyette} 982fbd2852Spgoyette 992fbd2852Spgoyette# Test body common to all sensors 1002fbd2852Spgoyette# $1 sensor mode 1012fbd2852Spgoyette# $2 initial sensor value 1022fbd2852Spgoyette# $3 initial limit 1032fbd2852Spgoyette# $4 amount to lower limit 1042fbd2852Spgoyette# $5 difference from limit to trigger event 105198966caSpgoyette# $6 sensor flags, for FHAS_ENTROPY and FMONNOTSUPP 1062fbd2852Spgoyette 1072fbd2852Spgoyettecommon_body() { 1082fbd2852Spgoyette # Start the rump-server process and load the module 109198966caSpgoyette modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}" 110198966caSpgoyette start_rump "$modload_args" 1112fbd2852Spgoyette 1122fbd2852Spgoyette # create configuration files for updates 1132fbd2852Spgoyette create_envsys_conf_files $3 $4 1142fbd2852Spgoyette 1152fbd2852Spgoyette if [ $? -ne 0 ] ; then 1162fbd2852Spgoyette atf_skip "Cannot set-up rump environment" 1172fbd2852Spgoyette fi 1182fbd2852Spgoyette 1192fbd2852Spgoyette # start powerd so we can detect sensor events 1202fbd2852Spgoyette rump.powerd -n -d > powerd.log 2>&1 & 1212fbd2852Spgoyette if [ -z "$(jobs)" ] ; then 1222fbd2852Spgoyette skip_events=1 1232fbd2852Spgoyette echo "Skipping event sub-tests - powerd did not start" 1242fbd2852Spgoyette else 1252fbd2852Spgoyette skip_events=0 1262fbd2852Spgoyette expected_event=1 1272fbd2852Spgoyette fi 1282fbd2852Spgoyette 1292fbd2852Spgoyette # Step 0 - verify that sensor is registered 1302fbd2852Spgoyette get_sensor_info | grep -q swsensor || 1312fbd2852Spgoyette atf_fail "0: Device swsensor not registered" 1322fbd2852Spgoyette 1332fbd2852Spgoyette # Step 1 - update the refresh-timeout and verify 1342fbd2852Spgoyette # (use $(( ... )) since the timeout is displayed in hex!) 1352fbd2852Spgoyette rump.envstat -c env0.conf 1362fbd2852Spgoyette if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then 137*8589c043Smsaitoh atf_fail "1: Could not set refresh-timeout to 2s" 1382fbd2852Spgoyette fi 1392fbd2852Spgoyette 1402fbd2852Spgoyette # Step 2 - verify that we can read sensor's value 1412fbd2852Spgoyette if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then 1422fbd2852Spgoyette atf_fail "2: Value not available" 1432fbd2852Spgoyette fi 1442fbd2852Spgoyette 1452fbd2852Spgoyette # Step 3 - verify that changes in sensor value are seen 1462fbd2852Spgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) 1472fbd2852Spgoyette if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then 1482fbd2852Spgoyette atf_fail "3: Value not updated" 1492fbd2852Spgoyette fi 1502fbd2852Spgoyette 1512fbd2852Spgoyette # Step 4 - if sensor provides hw limit, make sure we can read it 1522fbd2852Spgoyette if [ $1 -ne 0 ] ; then 1532fbd2852Spgoyette if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 1542fbd2852Spgoyette atf_fail "4: Limit not set by device" 1552fbd2852Spgoyette fi 1562fbd2852Spgoyette fi 1572fbd2852Spgoyette 1582fbd2852Spgoyette # Step 5 - if sensor provides hw limit, make sure it works 1592fbd2852Spgoyette if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 1602fbd2852Spgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) 1619231586dSpgoyette sleep 5 1622fbd2852Spgoyette cnt=$(get_powerd_event_count) 1632fbd2852Spgoyette if [ ${cnt} -lt ${expected_event} ] ; then 1642fbd2852Spgoyette atf_fail "5: No event triggered" 1652fbd2852Spgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 1662fbd2852Spgoyette atf_fail "5: Multiple events triggered" 1672fbd2852Spgoyette fi 1682fbd2852Spgoyette evt=$( check_powerd_event ${cnt} "critical-under") 1692fbd2852Spgoyette if [ -n "${evt}" ] ; then 1702fbd2852Spgoyette atf_fail "5: ${evt}" 1712fbd2852Spgoyette fi 1722fbd2852Spgoyette expected_event=$(( 1 + ${expected_event} )) 1732fbd2852Spgoyette fi 1742fbd2852Spgoyette 1752fbd2852Spgoyette # Step 6 - verify that we return to normal state 1762fbd2852Spgoyette if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 1772fbd2852Spgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) 1782fbd2852Spgoyette sleep 5 1792fbd2852Spgoyette cnt=$(get_powerd_event_count) 1802fbd2852Spgoyette if [ ${cnt} -lt ${expected_event} ] ; then 1812fbd2852Spgoyette atf_fail "6: No event triggered" 1822fbd2852Spgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 1832fbd2852Spgoyette atf_fail "6: Multiple events triggered" 1842fbd2852Spgoyette fi 1852fbd2852Spgoyette evt=$( check_powerd_event ${cnt} "normal") 1862fbd2852Spgoyette if [ -n "${evt}" ] ; then 1872fbd2852Spgoyette atf_fail "6: ${evt}" 1882fbd2852Spgoyette fi 1892fbd2852Spgoyette expected_event=$(( 1 + ${expected_event} )) 1902fbd2852Spgoyette fi 1912fbd2852Spgoyette 1922fbd2852Spgoyette # Step 7 - verify that we can set our own limit 193198966caSpgoyette 194198966caSpgoyette # Steps 7 thru 12 are skipped if the sensor cannot be monitored 195198966caSpgoyette if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then 1962fbd2852Spgoyette rump.envstat -c env1.conf 1972fbd2852Spgoyette if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 1982fbd2852Spgoyette atf_fail "7: Limit not set by envstat -c" 1992fbd2852Spgoyette fi 2002fbd2852Spgoyette 2012fbd2852Spgoyette # Step 8 - make sure user-set limit works 2022fbd2852Spgoyette if [ ${skip_events} -eq 0 ] ; then 2032fbd2852Spgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 2042fbd2852Spgoyette sleep 5 2052fbd2852Spgoyette cnt=$(get_powerd_event_count) 2062fbd2852Spgoyette if [ ${cnt} -lt ${expected_event} ] ; then 2072fbd2852Spgoyette atf_fail "8: No event triggered" 2082fbd2852Spgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 2092fbd2852Spgoyette atf_fail "8: Multiple events triggered" 2102fbd2852Spgoyette fi 2112fbd2852Spgoyette evt=$( check_powerd_event ${cnt} "critical-under") 2122fbd2852Spgoyette if [ -n "${evt}" ] ; then 2132fbd2852Spgoyette atf_fail "8: ${evt}" 2142fbd2852Spgoyette fi 2152fbd2852Spgoyette expected_event=$(( 1 + ${expected_event} )) 2162fbd2852Spgoyette fi 2172fbd2852Spgoyette 2182fbd2852Spgoyette # Step 9 - verify that we return to normal state 2192fbd2852Spgoyette if [ ${skip_events} -eq 0 ] ; then 2202fbd2852Spgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) 2212fbd2852Spgoyette sleep 5 2222fbd2852Spgoyette cnt=$(get_powerd_event_count) 2232fbd2852Spgoyette if [ ${cnt} -lt ${expected_event} ] ; then 2242fbd2852Spgoyette atf_fail "9: No event triggered" 2252fbd2852Spgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 2262fbd2852Spgoyette atf_fail "9: Multiple events triggered" 2272fbd2852Spgoyette fi 2282fbd2852Spgoyette evt=$( check_powerd_event ${cnt} "normal") 2292fbd2852Spgoyette if [ -n "${evt}" ] ; then 2302fbd2852Spgoyette atf_fail "9: ${evt}" 2312fbd2852Spgoyette fi 2322fbd2852Spgoyette expected_event=$(( 1 + ${expected_event} )) 2332fbd2852Spgoyette fi 2342fbd2852Spgoyette 2352fbd2852Spgoyette # Step 10 - reset to defaults 2362fbd2852Spgoyette rump.envstat -S 2372fbd2852Spgoyette if [ $1 -eq 0 ] ; then 2382fbd2852Spgoyette get_sensor_info | grep -q critical-min && 2392fbd2852Spgoyette atf_fail "10: Failed to clear a limit with envstat -S" 2402fbd2852Spgoyette else 2412fbd2852Spgoyette if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 2422fbd2852Spgoyette atf_fail "10: Limit not reset to initial value" 2432fbd2852Spgoyette fi 2442fbd2852Spgoyette fi 2452fbd2852Spgoyette 2462fbd2852Spgoyette # Step 11 - see if more events occur 2472fbd2852Spgoyette if [ ${skip_events} -eq 0 ] ; then 2482fbd2852Spgoyette rump.envstat -c env0.conf 2492fbd2852Spgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 2502fbd2852Spgoyette sleep 5 2512fbd2852Spgoyette cnt=$(get_powerd_event_count) 2522fbd2852Spgoyette if [ ${cnt} -ge ${expected_event} ] ; then 2530e0fe099Spgoyette if [ $1 -ne 2 ] ; then 2540e0fe099Spgoyette atf_fail "11b Event triggered after reset" 2550e0fe099Spgoyette fi 2560e0fe099Spgoyette evt=$( check_powerd_event ${cnt} "critical-under") 2570e0fe099Spgoyette if [ -n "${evt}" ] ; then 2580e0fe099Spgoyette atf_fail "11a: ${evt}" 2590e0fe099Spgoyette fi 2602fbd2852Spgoyette fi 2612fbd2852Spgoyette fi 2622fbd2852Spgoyette 2632fbd2852Spgoyette # Step 12 - make sure we can set new limits once more 2642fbd2852Spgoyette rump.envstat -c env2.conf 2652fbd2852Spgoyette if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 2662fbd2852Spgoyette atf_fail "12a: Limit not reset to same value" 2672fbd2852Spgoyette fi 2682fbd2852Spgoyette rump.envstat -c env1.conf 2692fbd2852Spgoyette if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 2702fbd2852Spgoyette atf_fail "12b: Limit not reset to new value" 2712fbd2852Spgoyette fi 272198966caSpgoyette fi 273198966caSpgoyette 274198966caSpgoyette # Step 13 - confirm registration (or lack thereof) with rndctl 275198966caSpgoyette rnd_bits=$( get_rnd_bits_count ) 276198966caSpgoyette if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then 277198966caSpgoyette if [ -z "$rnd_bits" ] ; then 278198966caSpgoyette atf_fail "13a: Not registered with rndctl" 279198966caSpgoyette fi 280198966caSpgoyette else 281198966caSpgoyette if [ -n "$rnd_bits" ] ; then 282198966caSpgoyette atf_fail "13b: Wrongly registered with rndctl" 283198966caSpgoyette fi 284198966caSpgoyette fi 285198966caSpgoyette 286198966caSpgoyette # Steps 14 and 15 are only if sensor is providing entropy 287198966caSpgoyette if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then 288198966caSpgoyette return 289198966caSpgoyette fi 290198966caSpgoyette 291198966caSpgoyette # Step 14 - make sure entropy collected when device is being polled 292198966caSpgoyette rump.envstat -c env0.conf 293198966caSpgoyette rump.sysctl -w hw.swsensor.cur_value=$3 294198966caSpgoyette sleep 5 295198966caSpgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 296198966caSpgoyette sleep 5 297198966caSpgoyette new_rnd_bits=$( get_rnd_bits_count ) 298198966caSpgoyette if [ $new_rnd_bits -le $rnd_bits ] ; then 299198966caSpgoyette atf_fail "14a: entropy bits did not increase after polling" 300198966caSpgoyette fi 301198966caSpgoyette rnd_bits=$new_rnd_bits 302198966caSpgoyette sleep 5 303198966caSpgoyette new_rnd_bits=$( get_rnd_bits_count ) 304198966caSpgoyette if [ $new_rnd_bits -gt $rnd_bits ] ; then 305198966caSpgoyette atf_fail "14b: entropy bits increased after poll with no value change" 306198966caSpgoyette fi 307198966caSpgoyette 308198966caSpgoyette # Step 15 - make sure entropy collected when device is interrogated 309198966caSpgoyette rump.envstat -c env0.conf 310198966caSpgoyette rump.sysctl -w hw.swsensor.cur_value=$3 311198966caSpgoyette get_sensor_key cur-value 312198966caSpgoyette rnd_bits=$( get_rnd_bits_count ) 313198966caSpgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 314198966caSpgoyette get_sensor_key cur-value 315198966caSpgoyette new_rnd_bits=$( get_rnd_bits_count ) 316198966caSpgoyette if [ $new_rnd_bits -le $rnd_bits ] ; then 317198966caSpgoyette atf_fail "15a: entropy bits did not increase after interrogation" 318198966caSpgoyette fi 319198966caSpgoyette rnd_bits=$new_rnd_bits 320198966caSpgoyette get_sensor_key cur-value 321198966caSpgoyette new_rnd_bits=$( get_rnd_bits_count ) 322198966caSpgoyette if [ $new_rnd_bits -gt $rnd_bits ] ; then 323198966caSpgoyette atf_fail "15b: entropy bits increased after interrogation with no value change" 324198966caSpgoyette fi 3252fbd2852Spgoyette} 3262fbd2852Spgoyette 3272fbd2852Spgoyetteatf_test_case simple_sensor cleanup 3282fbd2852Spgoyettesimple_sensor_head() { 3292fbd2852Spgoyette common_head "Test a simple sensor" 3302fbd2852Spgoyette} 3312fbd2852Spgoyette 3322fbd2852Spgoyettesimple_sensor_body() { 3332fbd2852Spgoyette common_body 0 50 30 10 1 3342fbd2852Spgoyette} 3352fbd2852Spgoyette 3362fbd2852Spgoyettesimple_sensor_cleanup() { 3372fbd2852Spgoyette common_cleanup 3382fbd2852Spgoyette} 3392fbd2852Spgoyette 3402fbd2852Spgoyetteatf_test_case limit_sensor cleanup 3412fbd2852Spgoyettelimit_sensor_head() { 3422fbd2852Spgoyette common_head "Test a sensor with internal limit" 3432fbd2852Spgoyette} 3442fbd2852Spgoyette 3452fbd2852Spgoyettelimit_sensor_body() { 3462fbd2852Spgoyette common_body 1 45 25 8 2 3472fbd2852Spgoyette} 3482fbd2852Spgoyette 3492fbd2852Spgoyettelimit_sensor_cleanup() { 3502fbd2852Spgoyette common_cleanup 3512fbd2852Spgoyette} 3522fbd2852Spgoyette 3532fbd2852Spgoyetteatf_test_case alarm_sensor cleanup 3542fbd2852Spgoyettealarm_sensor_head() { 3552fbd2852Spgoyette common_head "Test a sensor with internal checking" 3562fbd2852Spgoyette} 3572fbd2852Spgoyette 3582fbd2852Spgoyettealarm_sensor_body() { 3592fbd2852Spgoyette common_body 2 40 20 6 3 3602fbd2852Spgoyette} 3612fbd2852Spgoyette 3622fbd2852Spgoyettealarm_sensor_cleanup() { 3632fbd2852Spgoyette common_cleanup 3642fbd2852Spgoyette} 3652fbd2852Spgoyette 366198966caSpgoyetteatf_test_case entropy_polled_sensor cleanup 367198966caSpgoyetteentropy_polled_sensor_head() { 368198966caSpgoyette common_head "Test a simple sensor that provides entropy" 369198966caSpgoyette} 370198966caSpgoyette 371198966caSpgoyetteentropy_polled_sensor_body() { 372198966caSpgoyette common_body 0 50 30 10 1 8192 373198966caSpgoyette} 374198966caSpgoyette 375198966caSpgoyetteentropy_polled_sensor_cleanup() { 376198966caSpgoyette common_cleanup 377198966caSpgoyette} 378198966caSpgoyette 379198966caSpgoyetteatf_test_case entropy_interrupt_sensor cleanup 380198966caSpgoyetteentropy_interrupt_sensor_head() { 381198966caSpgoyette common_head "Test a sensor that provides entropy without polling" 382198966caSpgoyette} 383198966caSpgoyette 384198966caSpgoyetteentropy_interrupt_sensor_body() { 385198966caSpgoyette common_body 0 50 30 10 1 10240 386198966caSpgoyette} 387198966caSpgoyette 388198966caSpgoyetteentropy_interrupt_sensor_cleanup() { 389198966caSpgoyette common_cleanup 390198966caSpgoyette} 391198966caSpgoyette 3922fbd2852Spgoyetteatf_init_test_cases() { 3930e0fe099Spgoyette RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER 3942fbd2852Spgoyette atf_add_test_case simple_sensor 3952fbd2852Spgoyette atf_add_test_case limit_sensor 3962fbd2852Spgoyette atf_add_test_case alarm_sensor 397198966caSpgoyette atf_add_test_case entropy_polled_sensor 398198966caSpgoyette atf_add_test_case entropy_interrupt_sensor 3992fbd2852Spgoyette} 400