t_swsensor.sh revision 272343
1272343Sngie# $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $ 2272343Sngie 3272343Sngieget_sensor_info() { 4272343Sngie rump.envstat -x | \ 5272343Sngie sed -e "\;swsensor;,\;/array;p" -e "d" 6272343Sngie} 7272343Sngie 8272343Sngieget_sensor_key() { 9272343Sngie get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g' 10272343Sngie} 11272343Sngie 12272343Sngieget_powerd_event_count() { 13272343Sngie grep "not running" powerd.log | wc -l 14272343Sngie} 15272343Sngie 16272343Sngieget_rnd_bits_count() { 17272343Sngie env RUMPHIJACK=blanket=/dev/random:/dev/urandom \ 18272343Sngie RUMP_SERVER=unix://t_swsensor_socket \ 19272343Sngie LD_PRELOAD=/usr/lib/librumphijack.so rndctl -l | \ 20272343Sngie grep "swsensor-sensor" | \ 21272343Sngie awk '{print $2}' 22272343Sngie} 23272343Sngie 24272343Sngiecheck_powerd_event() { 25272343Sngie event=$(grep "not running" powerd.log | \ 26272343Sngie sed -e "$1p" -e "d" ) 27272343Sngie event=${event##*//} 28272343Sngie script=${event%% *} 29272343Sngie event=${event#* } 30272343Sngie device=${event%% *} 31272343Sngie event=${event#* } 32272343Sngie state=${event%% *} 33272343Sngie sensor=${event#* } 34272343Sngie sensor=${sensor% *} 35272343Sngie 36272343Sngie if [ "${script}" != "sensor_indicator" ] ; then 37272343Sngie echo "Event uses wrong script: ${script}" 38272343Sngie elif [ "${device}" != "swsensor" ] ; then 39272343Sngie echo "Event uses wrong device: ${device}" 40272343Sngie elif [ "${sensor}" != "sensor" ] ; then 41272343Sngie echo "Event uses wrong sensor: ${sensor}" 42272343Sngie elif [ "${state}" != "$2" ] ; then 43272343Sngie echo "Event uses wrong state: ${state}" 44272343Sngie fi 45272343Sngie} 46272343Sngie 47272343Sngie# Start the rump server, then load the swsensor module with the 48272343Sngie# requested properties 49272343Sngie 50272343Sngiestart_rump() { 51272343Sngie rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER} 52272343Sngie if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then 53272343Sngie rump.modunload swsensor 54272343Sngie rump.modload -f $1 swsensor 55272343Sngie else 56272343Sngie rump.modload $1 swsensor 57272343Sngie fi 58272343Sngie return $? 59272343Sngie} 60272343Sngie 61272343Sngiecommon_head() { 62272343Sngie atf_set descr "$1" 63272343Sngie atf_set timeout 60 64272343Sngie atf_set require.progs rump.powerd rump.envstat rump.modload \ 65272343Sngie rump.halt rump.sysctl rump_server \ 66272343Sngie sed grep awk \ 67272343Sngie rndctl expr 68272343Sngie} 69272343Sngie 70272343Sngiecommon_cleanup() { 71272343Sngie rump.modunload swsensor 72272343Sngie rump.halt 73272343Sngie} 74272343Sngie 75272343Sngiecreate_envsys_conf_files() { 76272343Sngie cat << ENV0 > env0.conf 77272343Sngie swsensor { 78272343Sngie refresh-timeout = 2s; 79272343Sngie } 80272343SngieENV0 81272343Sngie cat << ENV1 > env1.conf 82272343Sngie swsensor { 83272343Sngie sensor0 { critical-min = $(( $1 - $2 )); } 84272343Sngie } 85272343SngieENV1 86272343Sngie cat << ENV2 > env2.conf 87272343Sngie swsensor { 88272343Sngie sensor0 { critical-min = $1; } 89272343Sngie } 90272343SngieENV2 91272343Sngie} 92272343Sngie 93272343Sngie# Test body common to all sensors 94272343Sngie# $1 sensor mode 95272343Sngie# $2 initial sensor value 96272343Sngie# $3 initial limit 97272343Sngie# $4 amount to lower limit 98272343Sngie# $5 difference from limit to trigger event 99272343Sngie# $6 sensor flags, for FHAS_ENTROPY and FMONNOTSUPP 100272343Sngie 101272343Sngiecommon_body() { 102272343Sngie # Start the rump-server process and load the module 103272343Sngie modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}" 104272343Sngie start_rump "$modload_args" 105272343Sngie 106272343Sngie # create configuration files for updates 107272343Sngie create_envsys_conf_files $3 $4 108272343Sngie 109272343Sngie if [ $? -ne 0 ] ; then 110272343Sngie atf_skip "Cannot set-up rump environment" 111272343Sngie fi 112272343Sngie 113272343Sngie # start powerd so we can detect sensor events 114272343Sngie rump.powerd -n -d > powerd.log 2>&1 & 115272343Sngie if [ -z "$(jobs)" ] ; then 116272343Sngie skip_events=1 117272343Sngie echo "Skipping event sub-tests - powerd did not start" 118272343Sngie else 119272343Sngie skip_events=0 120272343Sngie expected_event=1 121272343Sngie fi 122272343Sngie 123272343Sngie # Step 0 - verify that sensor is registered 124272343Sngie get_sensor_info | grep -q swsensor || 125272343Sngie atf_fail "0: Device swsensor not registered" 126272343Sngie 127272343Sngie # Step 1 - update the refresh-timeout and verify 128272343Sngie # (use $(( ... )) since the timeout is displayed in hex!) 129272343Sngie rump.envstat -c env0.conf 130272343Sngie if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then 131272343Sngie atf_fail "1: Could not set refresh-timout to 2s" 132272343Sngie fi 133272343Sngie 134272343Sngie # Step 2 - verify that we can read sensor's value 135272343Sngie if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then 136272343Sngie atf_fail "2: Value not available" 137272343Sngie fi 138272343Sngie 139272343Sngie # Step 3 - verify that changes in sensor value are seen 140272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) 141272343Sngie if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then 142272343Sngie atf_fail "3: Value not updated" 143272343Sngie fi 144272343Sngie 145272343Sngie # Step 4 - if sensor provides hw limit, make sure we can read it 146272343Sngie if [ $1 -ne 0 ] ; then 147272343Sngie if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 148272343Sngie atf_fail "4: Limit not set by device" 149272343Sngie fi 150272343Sngie fi 151272343Sngie 152272343Sngie # Step 5 - if sensor provides hw limit, make sure it works 153272343Sngie if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 154272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) 155272343Sngie sleep 5 156272343Sngie cnt=$(get_powerd_event_count) 157272343Sngie if [ ${cnt} -lt ${expected_event} ] ; then 158272343Sngie atf_fail "5: No event triggered" 159272343Sngie elif [ ${cnt} -gt ${expected_event} ] ; then 160272343Sngie atf_fail "5: Multiple events triggered" 161272343Sngie fi 162272343Sngie evt=$( check_powerd_event ${cnt} "critical-under") 163272343Sngie if [ -n "${evt}" ] ; then 164272343Sngie atf_fail "5: ${evt}" 165272343Sngie fi 166272343Sngie expected_event=$(( 1 + ${expected_event} )) 167272343Sngie fi 168272343Sngie 169272343Sngie # Step 6 - verify that we return to normal state 170272343Sngie if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 171272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) 172272343Sngie sleep 5 173272343Sngie cnt=$(get_powerd_event_count) 174272343Sngie if [ ${cnt} -lt ${expected_event} ] ; then 175272343Sngie atf_fail "6: No event triggered" 176272343Sngie elif [ ${cnt} -gt ${expected_event} ] ; then 177272343Sngie atf_fail "6: Multiple events triggered" 178272343Sngie fi 179272343Sngie evt=$( check_powerd_event ${cnt} "normal") 180272343Sngie if [ -n "${evt}" ] ; then 181272343Sngie atf_fail "6: ${evt}" 182272343Sngie fi 183272343Sngie expected_event=$(( 1 + ${expected_event} )) 184272343Sngie fi 185272343Sngie 186272343Sngie # Step 7 - verify that we can set our own limit 187272343Sngie 188272343Sngie # Steps 7 thru 12 are skipped if the sensor cannot be monitored 189272343Sngie if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then 190272343Sngie rump.envstat -c env1.conf 191272343Sngie if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 192272343Sngie atf_fail "7: Limit not set by envstat -c" 193272343Sngie fi 194272343Sngie 195272343Sngie # Step 8 - make sure user-set limit works 196272343Sngie if [ ${skip_events} -eq 0 ] ; then 197272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 198272343Sngie sleep 5 199272343Sngie cnt=$(get_powerd_event_count) 200272343Sngie if [ ${cnt} -lt ${expected_event} ] ; then 201272343Sngie atf_fail "8: No event triggered" 202272343Sngie elif [ ${cnt} -gt ${expected_event} ] ; then 203272343Sngie atf_fail "8: Multiple events triggered" 204272343Sngie fi 205272343Sngie evt=$( check_powerd_event ${cnt} "critical-under") 206272343Sngie if [ -n "${evt}" ] ; then 207272343Sngie atf_fail "8: ${evt}" 208272343Sngie fi 209272343Sngie expected_event=$(( 1 + ${expected_event} )) 210272343Sngie fi 211272343Sngie 212272343Sngie # Step 9 - verify that we return to normal state 213272343Sngie if [ ${skip_events} -eq 0 ] ; then 214272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) 215272343Sngie sleep 5 216272343Sngie cnt=$(get_powerd_event_count) 217272343Sngie if [ ${cnt} -lt ${expected_event} ] ; then 218272343Sngie atf_fail "9: No event triggered" 219272343Sngie elif [ ${cnt} -gt ${expected_event} ] ; then 220272343Sngie atf_fail "9: Multiple events triggered" 221272343Sngie fi 222272343Sngie evt=$( check_powerd_event ${cnt} "normal") 223272343Sngie if [ -n "${evt}" ] ; then 224272343Sngie atf_fail "9: ${evt}" 225272343Sngie fi 226272343Sngie expected_event=$(( 1 + ${expected_event} )) 227272343Sngie fi 228272343Sngie 229272343Sngie # Step 10 - reset to defaults 230272343Sngie rump.envstat -S 231272343Sngie if [ $1 -eq 0 ] ; then 232272343Sngie get_sensor_info | grep -q critical-min && 233272343Sngie atf_fail "10: Failed to clear a limit with envstat -S" 234272343Sngie else 235272343Sngie if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 236272343Sngie atf_fail "10: Limit not reset to initial value" 237272343Sngie fi 238272343Sngie fi 239272343Sngie 240272343Sngie # Step 11 - see if more events occur 241272343Sngie if [ ${skip_events} -eq 0 ] ; then 242272343Sngie rump.envstat -c env0.conf 243272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 244272343Sngie sleep 5 245272343Sngie cnt=$(get_powerd_event_count) 246272343Sngie if [ ${cnt} -ge ${expected_event} ] ; then 247272343Sngie if [ $1 -ne 2 ] ; then 248272343Sngie atf_fail "11b Event triggered after reset" 249272343Sngie fi 250272343Sngie evt=$( check_powerd_event ${cnt} "critical-under") 251272343Sngie if [ -n "${evt}" ] ; then 252272343Sngie atf_fail "11a: ${evt}" 253272343Sngie fi 254272343Sngie fi 255272343Sngie fi 256272343Sngie 257272343Sngie # Step 12 - make sure we can set new limits once more 258272343Sngie rump.envstat -c env2.conf 259272343Sngie if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 260272343Sngie atf_fail "12a: Limit not reset to same value" 261272343Sngie fi 262272343Sngie rump.envstat -c env1.conf 263272343Sngie if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 264272343Sngie atf_fail "12b: Limit not reset to new value" 265272343Sngie fi 266272343Sngie fi 267272343Sngie 268272343Sngie # Step 13 - confirm registration (or lack thereof) with rndctl 269272343Sngie rnd_bits=$( get_rnd_bits_count ) 270272343Sngie if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then 271272343Sngie if [ -z "$rnd_bits" ] ; then 272272343Sngie atf_fail "13a: Not registered with rndctl" 273272343Sngie fi 274272343Sngie else 275272343Sngie if [ -n "$rnd_bits" ] ; then 276272343Sngie atf_fail "13b: Wrongly registered with rndctl" 277272343Sngie fi 278272343Sngie fi 279272343Sngie 280272343Sngie # Steps 14 and 15 are only if sensor is providing entropy 281272343Sngie if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then 282272343Sngie return 283272343Sngie fi 284272343Sngie 285272343Sngie # Step 14 - make sure entropy collected when device is being polled 286272343Sngie rump.envstat -c env0.conf 287272343Sngie rump.sysctl -w hw.swsensor.cur_value=$3 288272343Sngie sleep 5 289272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 290272343Sngie sleep 5 291272343Sngie new_rnd_bits=$( get_rnd_bits_count ) 292272343Sngie if [ $new_rnd_bits -le $rnd_bits ] ; then 293272343Sngie atf_expect_fail "PR kern/47661" 294272343Sngie atf_fail "14a: entropy bits did not increase after polling" 295272343Sngie fi 296272343Sngie rnd_bits=$new_rnd_bits 297272343Sngie sleep 5 298272343Sngie new_rnd_bits=$( get_rnd_bits_count ) 299272343Sngie if [ $new_rnd_bits -gt $rnd_bits ] ; then 300272343Sngie atf_expect_fail "PR kern/47661" 301272343Sngie atf_fail "14b: entropy bits increased after poll with no value change" 302272343Sngie fi 303272343Sngie 304272343Sngie # Step 15 - make sure entropy collected when device is interrogated 305272343Sngie # 306272343Sngie rump.envstat -c env0.conf 307272343Sngie rump.sysctl -w hw.swsensor.cur_value=$3 308272343Sngie get_sensor_key cur-value 309272343Sngie rnd_bits=$( get_rnd_bits_count ) 310272343Sngie rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 311272343Sngie get_sensor_key cur-value 312272343Sngie new_rnd_bits=$( get_rnd_bits_count ) 313272343Sngie if [ $new_rnd_bits -le $rnd_bits ] ; then 314272343Sngie atf_expect_fail "PR kern/47661" 315272343Sngie atf_fail "15a: entropy bits did not increase after interrogation" 316272343Sngie fi 317272343Sngie rnd_bits=$new_rnd_bits 318272343Sngie get_sensor_key cur-value 319272343Sngie new_rnd_bits=$( get_rnd_bits_count ) 320272343Sngie if [ $new_rnd_bits -gt $rnd_bits ] ; then 321272343Sngie atf_expect_fail "PR kern/47661" 322272343Sngie atf_fail "15b: entropy bits increased after interrogation with no value change" 323272343Sngie fi 324272343Sngie} 325272343Sngie 326272343Sngieatf_test_case simple_sensor cleanup 327272343Sngiesimple_sensor_head() { 328272343Sngie common_head "Test a simple sensor" 329272343Sngie} 330272343Sngie 331272343Sngiesimple_sensor_body() { 332272343Sngie common_body 0 50 30 10 1 333272343Sngie} 334272343Sngie 335272343Sngiesimple_sensor_cleanup() { 336272343Sngie common_cleanup 337272343Sngie} 338272343Sngie 339272343Sngieatf_test_case limit_sensor cleanup 340272343Sngielimit_sensor_head() { 341272343Sngie common_head "Test a sensor with internal limit" 342272343Sngie} 343272343Sngie 344272343Sngielimit_sensor_body() { 345272343Sngie common_body 1 45 25 8 2 346272343Sngie} 347272343Sngie 348272343Sngielimit_sensor_cleanup() { 349272343Sngie common_cleanup 350272343Sngie} 351272343Sngie 352272343Sngieatf_test_case alarm_sensor cleanup 353272343Sngiealarm_sensor_head() { 354272343Sngie common_head "Test a sensor with internal checking" 355272343Sngie} 356272343Sngie 357272343Sngiealarm_sensor_body() { 358272343Sngie common_body 2 40 20 6 3 359272343Sngie} 360272343Sngie 361272343Sngiealarm_sensor_cleanup() { 362272343Sngie common_cleanup 363272343Sngie} 364272343Sngie 365272343Sngieatf_test_case entropy_polled_sensor cleanup 366272343Sngieentropy_polled_sensor_head() { 367272343Sngie common_head "Test a simple sensor that provides entropy" 368272343Sngie} 369272343Sngie 370272343Sngieentropy_polled_sensor_body() { 371272343Sngie common_body 0 50 30 10 1 8192 372272343Sngie} 373272343Sngie 374272343Sngieentropy_polled_sensor_cleanup() { 375272343Sngie common_cleanup 376272343Sngie} 377272343Sngie 378272343Sngieatf_test_case entropy_interrupt_sensor cleanup 379272343Sngieentropy_interrupt_sensor_head() { 380272343Sngie common_head "Test a sensor that provides entropy without polling" 381272343Sngie} 382272343Sngie 383272343Sngieentropy_interrupt_sensor_body() { 384272343Sngie common_body 0 50 30 10 1 10240 385272343Sngie} 386272343Sngie 387272343Sngieentropy_interrupt_sensor_cleanup() { 388272343Sngie common_cleanup 389272343Sngie} 390272343Sngie 391272343Sngieatf_init_test_cases() { 392272343Sngie RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER 393272343Sngie atf_add_test_case simple_sensor 394272343Sngie atf_add_test_case limit_sensor 395272343Sngie atf_add_test_case alarm_sensor 396272343Sngie atf_add_test_case entropy_polled_sensor 397272343Sngie atf_add_test_case entropy_interrupt_sensor 398272343Sngie} 399