t_swsensor.sh revision 303975
118334Speter# $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $ 290075Sobrien 3169689Skanget_sensor_info() { 418334Speter rump.envstat -x | \ 590075Sobrien sed -e "\;swsensor;,\;/array;p" -e "d" 618334Speter} 790075Sobrien 890075Sobrienget_sensor_key() { 990075Sobrien get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g' 1090075Sobrien} 1118334Speter 1290075Sobrienget_powerd_event_count() { 1390075Sobrien grep "not running" powerd.log | wc -l 1490075Sobrien} 1590075Sobrien 1618334Speterget_rnd_bits_count() { 1790075Sobrien env RUMPHIJACK=blanket=/dev/random:/dev/urandom \ 1890075Sobrien RUMP_SERVER=unix://t_swsensor_socket \ 19169689Skan LD_PRELOAD=/usr/lib/librumphijack.so rndctl -l | \ 20169689Skan grep "swsensor-sensor" | \ 2118334Speter awk '{print $2}' 2218334Speter} 2390075Sobrien 2490075Sobriencheck_powerd_event() { 2590075Sobrien event=$(grep "not running" powerd.log | \ 2690075Sobrien sed -e "$1p" -e "d" ) 2718334Speter event=${event##*//} 2890075Sobrien script=${event%% *} 2990075Sobrien event=${event#* } 3090075Sobrien device=${event%% *} 3190075Sobrien event=${event#* } 3290075Sobrien state=${event%% *} 3390075Sobrien sensor=${event#* } 3418334Speter sensor=${sensor% *} 3590075Sobrien 3690075Sobrien if [ "${script}" != "sensor_indicator" ] ; then 3718334Speter echo "Event uses wrong script: ${script}" 3818334Speter elif [ "${device}" != "swsensor" ] ; then 3918334Speter echo "Event uses wrong device: ${device}" 4018334Speter elif [ "${sensor}" != "sensor" ] ; then 4190075Sobrien echo "Event uses wrong sensor: ${sensor}" 4290075Sobrien elif [ "${state}" != "$2" ] ; then 4318334Speter echo "Event uses wrong state: ${state}" 4490075Sobrien fi 4590075Sobrien} 46117395Skan 4718334Speter# Start the rump server, then load the swsensor module with the 4890075Sobrien# requested properties 4990075Sobrien 50117395Skanstart_rump() { 5190075Sobrien rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER} 5290075Sobrien if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then 53132718Skan rump.modunload swsensor 5450397Sobrien rump.modload -f $1 swsensor 55132718Skan else 56132718Skan rump.modload $1 swsensor 5718334Speter fi 5890075Sobrien return $? 5990075Sobrien} 6018334Speter 6152284Sobriencommon_head() { 6252284Sobrien atf_set descr "$1" 6352284Sobrien atf_set timeout 60 6490075Sobrien atf_set require.progs rump.powerd rump.envstat rump.modload \ 65132718Skan rump.halt rump.sysctl rump_server \ 6690075Sobrien sed grep awk \ 6718334Speter rndctl expr 6890075Sobrien} 6990075Sobrien 7090075Sobriencommon_cleanup() { 7190075Sobrien rump.modunload swsensor 7290075Sobrien rump.halt 7318334Speter} 7490075Sobrien 7590075Sobriencreate_envsys_conf_files() { 7690075Sobrien cat << ENV0 > env0.conf 7718334Speter swsensor { 7890075Sobrien refresh-timeout = 2s; 7990075Sobrien } 8090075SobrienENV0 8190075Sobrien cat << ENV1 > env1.conf 8218334Speter swsensor { 8390075Sobrien sensor0 { critical-min = $(( $1 - $2 )); } 8490075Sobrien } 8590075SobrienENV1 86169689Skan cat << ENV2 > env2.conf 8790075Sobrien swsensor { 8890075Sobrien sensor0 { critical-min = $1; } 89169689Skan } 9090075SobrienENV2 9190075Sobrien} 9290075Sobrien 9318334Speter# Test body common to all sensors 9490075Sobrien# $1 sensor mode 9590075Sobrien# $2 initial sensor value 96169689Skan# $3 initial limit 9790075Sobrien# $4 amount to lower limit 9890075Sobrien# $5 difference from limit to trigger event 9990075Sobrien# $6 sensor flags, for FHAS_ENTROPY and FMONNOTSUPP 10090075Sobrien 10190075Sobriencommon_body() { 10290075Sobrien # Start the rump-server process and load the module 103169689Skan modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}" 104169689Skan start_rump "$modload_args" 10590075Sobrien 10690075Sobrien # create configuration files for updates 10790075Sobrien create_envsys_conf_files $3 $4 10890075Sobrien 10990075Sobrien if [ $? -ne 0 ] ; then 11090075Sobrien atf_skip "Cannot set-up rump environment" 11190075Sobrien fi 11290075Sobrien 11390075Sobrien # start powerd so we can detect sensor events 11490075Sobrien rump.powerd -n -d > powerd.log 2>&1 & 11590075Sobrien if [ -z "$(jobs)" ] ; then 11690075Sobrien skip_events=1 11790075Sobrien echo "Skipping event sub-tests - powerd did not start" 11890075Sobrien else 11990075Sobrien skip_events=0 12090075Sobrien expected_event=1 12190075Sobrien fi 12290075Sobrien 12390075Sobrien # Step 0 - verify that sensor is registered 12418334Speter get_sensor_info | grep -q swsensor || 12518334Speter atf_fail "0: Device swsensor not registered" 12690075Sobrien 12790075Sobrien # Step 1 - update the refresh-timeout and verify 12890075Sobrien # (use $(( ... )) since the timeout is displayed in hex!) 12990075Sobrien rump.envstat -c env0.conf 13090075Sobrien if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then 13190075Sobrien atf_fail "1: Could not set refresh-timout to 2s" 13290075Sobrien fi 13390075Sobrien 13490075Sobrien # Step 2 - verify that we can read sensor's value 13590075Sobrien if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then 13618334Speter atf_fail "2: Value not available" 13718334Speter fi 13890075Sobrien 13918334Speter # Step 3 - verify that changes in sensor value are seen 14018334Speter rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) 14190075Sobrien if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then 14218334Speter atf_fail "3: Value not updated" 14318334Speter fi 14418334Speter 14590075Sobrien # Step 4 - if sensor provides hw limit, make sure we can read it 14690075Sobrien if [ $1 -ne 0 ] ; then 14790075Sobrien if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 14818334Speter atf_fail "4: Limit not set by device" 14990075Sobrien fi 15090075Sobrien fi 15190075Sobrien 15218334Speter # Step 5 - if sensor provides hw limit, make sure it works 15390075Sobrien if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 15490075Sobrien rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) 15518334Speter sleep 5 15618334Speter cnt=$(get_powerd_event_count) 15718334Speter if [ ${cnt} -lt ${expected_event} ] ; then 15818334Speter atf_fail "5: No event triggered" 15918334Speter elif [ ${cnt} -gt ${expected_event} ] ; then 16018334Speter atf_fail "5: Multiple events triggered" 16118334Speter fi 16218334Speter evt=$( check_powerd_event ${cnt} "critical-under") 16318334Speter if [ -n "${evt}" ] ; then 16418334Speter atf_fail "5: ${evt}" 16518334Speter fi 16618334Speter expected_event=$(( 1 + ${expected_event} )) 16790075Sobrien fi 16890075Sobrien 16990075Sobrien # Step 6 - verify that we return to normal state 17090075Sobrien if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 17190075Sobrien rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) 17290075Sobrien sleep 5 17318334Speter cnt=$(get_powerd_event_count) 174169689Skan if [ ${cnt} -lt ${expected_event} ] ; then 17518334Speter atf_fail "6: No event triggered" 176169689Skan elif [ ${cnt} -gt ${expected_event} ] ; then 177169689Skan atf_fail "6: Multiple events triggered" 178169689Skan fi 179169689Skan evt=$( check_powerd_event ${cnt} "normal") 180169689Skan if [ -n "${evt}" ] ; then 181169689Skan atf_fail "6: ${evt}" 182169689Skan fi 183169689Skan expected_event=$(( 1 + ${expected_event} )) 184169689Skan fi 185169689Skan 186169689Skan # Step 7 - verify that we can set our own limit 187169689Skan 188169689Skan # Steps 7 thru 12 are skipped if the sensor cannot be monitored 189169689Skan if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then 190169689Skan rump.envstat -c env1.conf 191169689Skan if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 192169689Skan atf_fail "7: Limit not set by envstat -c" 193169689Skan fi 194169689Skan 195169689Skan # Step 8 - make sure user-set limit works 196169689Skan if [ ${skip_events} -eq 0 ] ; then 197169689Skan rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 198169689Skan sleep 5 199169689Skan cnt=$(get_powerd_event_count) 200169689Skan if [ ${cnt} -lt ${expected_event} ] ; then 201169689Skan atf_fail "8: No event triggered" 202169689Skan elif [ ${cnt} -gt ${expected_event} ] ; then 203169689Skan atf_fail "8: Multiple events triggered" 204169689Skan fi 205169689Skan evt=$( check_powerd_event ${cnt} "critical-under") 206169689Skan if [ -n "${evt}" ] ; then 207169689Skan atf_fail "8: ${evt}" 208169689Skan fi 209169689Skan expected_event=$(( 1 + ${expected_event} )) 210169689Skan fi 211169689Skan 212169689Skan # Step 9 - verify that we return to normal state 213169689Skan if [ ${skip_events} -eq 0 ] ; then 214169689Skan rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) 215169689Skan sleep 5 216169689Skan cnt=$(get_powerd_event_count) 217169689Skan if [ ${cnt} -lt ${expected_event} ] ; then 218169689Skan atf_fail "9: No event triggered" 219169689Skan elif [ ${cnt} -gt ${expected_event} ] ; then 220169689Skan atf_fail "9: Multiple events triggered" 221169689Skan fi 222169689Skan evt=$( check_powerd_event ${cnt} "normal") 223169689Skan if [ -n "${evt}" ] ; then 224169689Skan atf_fail "9: ${evt}" 225169689Skan fi 226169689Skan expected_event=$(( 1 + ${expected_event} )) 227169689Skan fi 228169689Skan 229169689Skan # Step 10 - reset to defaults 230169689Skan rump.envstat -S 231169689Skan if [ $1 -eq 0 ] ; then 232169689Skan get_sensor_info | grep -q critical-min && 233169689Skan atf_fail "10: Failed to clear a limit with envstat -S" 23418334Speter else 235169689Skan if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 236169689Skan atf_fail "10: Limit not reset to initial value" 237169689Skan fi 238169689Skan fi 23918334Speter 240169689Skan # Step 11 - see if more events occur 241169689Skan if [ ${skip_events} -eq 0 ] ; then 242169689Skan rump.envstat -c env0.conf 243169689Skan rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 244169689Skan sleep 5 245169689Skan cnt=$(get_powerd_event_count) 246169689Skan if [ ${cnt} -ge ${expected_event} ] ; then 247169689Skan if [ $1 -ne 2 ] ; then 24818334Speter atf_fail "11b Event triggered after reset" 249169689Skan fi 250169689Skan evt=$( check_powerd_event ${cnt} "critical-under") 251169689Skan if [ -n "${evt}" ] ; then 252169689Skan atf_fail "11a: ${evt}" 253169689Skan fi 254169689Skan fi 255169689Skan fi 256169689Skan 257169689Skan # Step 12 - make sure we can set new limits once more 258169689Skan rump.envstat -c env2.conf 259169689Skan if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 26090075Sobrien atf_fail "12a: Limit not reset to same value" 261169689Skan fi 262169689Skan rump.envstat -c env1.conf 263169689Skan if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 264169689Skan atf_fail "12b: Limit not reset to new value" 265169689Skan fi 266169689Skan fi 267169689Skan 268169689Skan # Step 13 - confirm registration (or lack thereof) with rndctl 269169689Skan rnd_bits=$( get_rnd_bits_count ) 270169689Skan if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then 27190075Sobrien if [ -z "$rnd_bits" ] ; then 272169689Skan atf_fail "13a: Not registered with rndctl" 273169689Skan fi 274169689Skan else 275169689Skan if [ -n "$rnd_bits" ] ; then 276169689Skan atf_fail "13b: Wrongly registered with rndctl" 277169689Skan fi 278169689Skan fi 279169689Skan 280169689Skan # Steps 14 and 15 are only if sensor is providing entropy 281169689Skan if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then 282169689Skan return 283169689Skan fi 284169689Skan 285169689Skan # Step 14 - make sure entropy collected when device is being polled 286169689Skan rump.envstat -c env0.conf 287169689Skan rump.sysctl -w hw.swsensor.cur_value=$3 288169689Skan sleep 5 289169689Skan rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 290169689Skan sleep 5 291169689Skan new_rnd_bits=$( get_rnd_bits_count ) 292169689Skan if [ $new_rnd_bits -le $rnd_bits ] ; then 293169689Skan atf_expect_fail "PR kern/47661" 294169689Skan atf_fail "14a: entropy bits did not increase after polling" 295169689Skan fi 296169689Skan rnd_bits=$new_rnd_bits 297169689Skan sleep 5 298169689Skan new_rnd_bits=$( get_rnd_bits_count ) 299169689Skan if [ $new_rnd_bits -gt $rnd_bits ] ; then 300169689Skan atf_expect_fail "PR kern/47661" 301169689Skan atf_fail "14b: entropy bits increased after poll with no value change" 302169689Skan fi 303169689Skan 304169689Skan # Step 15 - make sure entropy collected when device is interrogated 305169689Skan # 306169689Skan rump.envstat -c env0.conf 307169689Skan rump.sysctl -w hw.swsensor.cur_value=$3 308169689Skan get_sensor_key cur-value 309169689Skan rnd_bits=$( get_rnd_bits_count ) 310169689Skan rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 311169689Skan get_sensor_key cur-value 312169689Skan new_rnd_bits=$( get_rnd_bits_count ) 313169689Skan if [ $new_rnd_bits -le $rnd_bits ] ; then 314169689Skan atf_expect_fail "PR kern/47661" 315169689Skan atf_fail "15a: entropy bits did not increase after interrogation" 316169689Skan fi 317169689Skan rnd_bits=$new_rnd_bits 318169689Skan get_sensor_key cur-value 319169689Skan new_rnd_bits=$( get_rnd_bits_count ) 320169689Skan if [ $new_rnd_bits -gt $rnd_bits ] ; then 321169689Skan atf_expect_fail "PR kern/47661" 322169689Skan atf_fail "15b: entropy bits increased after interrogation with no value change" 323169689Skan fi 324169689Skan} 325169689Skan 326169689Skanatf_test_case simple_sensor cleanup 327169689Skansimple_sensor_head() { 328169689Skan common_head "Test a simple sensor" 329169689Skan} 330169689Skan 331169689Skansimple_sensor_body() { 332169689Skan common_body 0 50 30 10 1 333169689Skan} 334169689Skan 335169689Skansimple_sensor_cleanup() { 336169689Skan common_cleanup 337169689Skan} 338169689Skan 339169689Skanatf_test_case limit_sensor cleanup 340169689Skanlimit_sensor_head() { 341169689Skan common_head "Test a sensor with internal limit" 342169689Skan} 343169689Skan 344169689Skanlimit_sensor_body() { 345169689Skan common_body 1 45 25 8 2 346169689Skan} 347169689Skan 348169689Skanlimit_sensor_cleanup() { 349169689Skan common_cleanup 350169689Skan} 351169689Skan 352169689Skanatf_test_case alarm_sensor cleanup 353169689Skanalarm_sensor_head() { 354169689Skan common_head "Test a sensor with internal checking" 355169689Skan} 356169689Skan 357169689Skanalarm_sensor_body() { 358169689Skan common_body 2 40 20 6 3 359169689Skan} 360169689Skan 361169689Skanalarm_sensor_cleanup() { 362169689Skan common_cleanup 363169689Skan} 364169689Skan 365169689Skanatf_test_case entropy_polled_sensor cleanup 366169689Skanentropy_polled_sensor_head() { 367169689Skan common_head "Test a simple sensor that provides entropy" 368169689Skan} 369169689Skan 370169689Skanentropy_polled_sensor_body() { 371169689Skan common_body 0 50 30 10 1 8192 372169689Skan} 373169689Skan 374169689Skanentropy_polled_sensor_cleanup() { 375169689Skan common_cleanup 376169689Skan} 377169689Skan 378169689Skanatf_test_case entropy_interrupt_sensor cleanup 379169689Skanentropy_interrupt_sensor_head() { 380169689Skan common_head "Test a sensor that provides entropy without polling" 381169689Skan} 382169689Skan 383169689Skanentropy_interrupt_sensor_body() { 384169689Skan common_body 0 50 30 10 1 10240 385169689Skan} 386169689Skan 387169689Skanentropy_interrupt_sensor_cleanup() { 388169689Skan common_cleanup 389169689Skan} 390169689Skan 391169689Skanatf_init_test_cases() { 392169689Skan RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER 393169689Skan atf_add_test_case simple_sensor 394169689Skan atf_add_test_case limit_sensor 395169689Skan atf_add_test_case alarm_sensor 396169689Skan atf_add_test_case entropy_polled_sensor 397169689Skan atf_add_test_case entropy_interrupt_sensor 398169689Skan} 399169689Skan