t_swsensor.sh revision 272345
152284Sobrien# $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $ 2169689Skan 352284Sobrienget_sensor_info() { 490075Sobrien rump.envstat -x | \ 552284Sobrien sed -e "\;swsensor;,\;/array;p" -e "d" 652284Sobrien} 790075Sobrien 852284Sobrienget_sensor_key() { 990075Sobrien get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g' 1090075Sobrien} 1152284Sobrien 1290075Sobrienget_powerd_event_count() { 1390075Sobrien grep "not running" powerd.log | wc -l 1490075Sobrien} 1590075Sobrien 1690075Sobrienget_rnd_bits_count() { 1752284Sobrien env RUMPHIJACK=blanket=/dev/random:/dev/urandom \ 18169689Skan RUMP_SERVER=unix://t_swsensor_socket \ 19169689Skan LD_PRELOAD=/usr/lib/librumphijack.so rndctl -l | \ 20169689Skan grep "swsensor-sensor" | \ 21169689Skan awk '{print $2}' 22169689Skan} 23169689Skan 24132718Skancheck_powerd_event() { 25132718Skan event=$(grep "not running" powerd.log | \ 26132718Skan sed -e "$1p" -e "d" ) 27132718Skan event=${event##*//} 28132718Skan script=${event%% *} 29132718Skan event=${event#* } 30132718Skan device=${event%% *} 31132718Skan event=${event#* } 32132718Skan state=${event%% *} 33132718Skan sensor=${event#* } 34132718Skan sensor=${sensor% *} 35132718Skan 36132718Skan if [ "${script}" != "sensor_indicator" ] ; then 37132718Skan echo "Event uses wrong script: ${script}" 3890075Sobrien elif [ "${device}" != "swsensor" ] ; then 3990075Sobrien echo "Event uses wrong device: ${device}" 40132718Skan elif [ "${sensor}" != "sensor" ] ; then 4196263Sobrien echo "Event uses wrong sensor: ${sensor}" 42132718Skan elif [ "${state}" != "$2" ] ; then 4390075Sobrien echo "Event uses wrong state: ${state}" 4490075Sobrien fi 45132718Skan} 46132718Skan 47132718Skan# Start the rump server, then load the swsensor module with the 4852284Sobrien# requested properties 49132718Skan 50132718Skanstart_rump() { 51132718Skan 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 54132718Skan rump.modload -f $1 swsensor 55132718Skan else 56132718Skan rump.modload $1 swsensor 57132718Skan fi 5890075Sobrien return $? 5990075Sobrien} 6090075Sobrien 61132718Skancommon_head() { 62132718Skan atf_set descr "$1" 63132718Skan atf_set timeout 60 64132718Skan atf_set require.progs rump.powerd rump.envstat rump.modload \ 65132718Skan rump.halt rump.sysctl rump_server \ 6690075Sobrien sed grep awk \ 6790075Sobrien rndctl expr 6890075Sobrien} 6990075Sobrien 70132718Skancommon_cleanup() { 7152284Sobrien rump.modunload swsensor 72132718Skan rump.halt 73132718Skan} 74132718Skan 75132718Skancreate_envsys_conf_files() { 76132718Skan cat << ENV0 > env0.conf 77132718Skan swsensor { 78132718Skan refresh-timeout = 2s; 7952284Sobrien } 80132718SkanENV0 8152284Sobrien cat << ENV1 > env1.conf 82132718Skan swsensor { 83169689Skan sensor0 { critical-min = $(( $1 - $2 )); } 84132718Skan } 85132718SkanENV1 86169689Skan cat << ENV2 > env2.conf 87169689Skan swsensor { 88132718Skan sensor0 { critical-min = $1; } 8952284Sobrien } 90132718SkanENV2 91132718Skan} 92132718Skan 93132718Skan# Test body common to all sensors 9452284Sobrien# $1 sensor mode 95132718Skan# $2 initial sensor value 96132718Skan# $3 initial limit 9752284Sobrien# $4 amount to lower limit 98132718Skan# $5 difference from limit to trigger event 99132718Skan# $6 sensor flags, for FHAS_ENTROPY and FMONNOTSUPP 100132718Skan 101132718Skancommon_body() { 102132718Skan # Start the rump-server process and load the module 103132718Skan modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}" 104132718Skan start_rump "$modload_args" 105132718Skan 106132718Skan # create configuration files for updates 107132718Skan create_envsys_conf_files $3 $4 108132718Skan 109132718Skan if [ $? -ne 0 ] ; then 110132718Skan atf_skip "Cannot set-up rump environment" 11152284Sobrien fi 112132718Skan 113132718Skan # start powerd so we can detect sensor events 114132718Skan rump.powerd -n -d > powerd.log 2>&1 & 11552284Sobrien if [ -z "$(jobs)" ] ; then 116132718Skan skip_events=1 11752284Sobrien echo "Skipping event sub-tests - powerd did not start" 11852284Sobrien else 119169689Skan skip_events=0 120169689Skan expected_event=1 121169689Skan fi 122169689Skan 123169689Skan # Step 0 - verify that sensor is registered 124169689Skan get_sensor_info | grep -q swsensor || 125132718Skan atf_fail "0: Device swsensor not registered" 12652284Sobrien 127169689Skan # Step 1 - update the refresh-timeout and verify 128169689Skan # (use $(( ... )) since the timeout is displayed in hex!) 129169689Skan rump.envstat -c env0.conf 130169689Skan if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then 131169689Skan atf_fail "1: Could not set refresh-timout to 2s" 132169689Skan fi 133169689Skan 134169689Skan # Step 2 - verify that we can read sensor's value 135169689Skan if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then 136169689Skan atf_fail "2: Value not available" 137169689Skan fi 138169689Skan 139169689Skan # Step 3 - verify that changes in sensor value are seen 140169689Skan rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) 141169689Skan if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then 142169689Skan atf_fail "3: Value not updated" 143169689Skan fi 144169689Skan 145169689Skan # Step 4 - if sensor provides hw limit, make sure we can read it 146169689Skan if [ $1 -ne 0 ] ; then 147169689Skan if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 148169689Skan atf_fail "4: Limit not set by device" 149169689Skan fi 15090075Sobrien fi 151 152 # Step 5 - if sensor provides hw limit, make sure it works 153 if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 154 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) 155 sleep 5 156 cnt=$(get_powerd_event_count) 157 if [ ${cnt} -lt ${expected_event} ] ; then 158 atf_fail "5: No event triggered" 159 elif [ ${cnt} -gt ${expected_event} ] ; then 160 atf_fail "5: Multiple events triggered" 161 fi 162 evt=$( check_powerd_event ${cnt} "critical-under") 163 if [ -n "${evt}" ] ; then 164 atf_fail "5: ${evt}" 165 fi 166 expected_event=$(( 1 + ${expected_event} )) 167 fi 168 169 # Step 6 - verify that we return to normal state 170 if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 171 rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) 172 sleep 5 173 cnt=$(get_powerd_event_count) 174 if [ ${cnt} -lt ${expected_event} ] ; then 175 atf_fail "6: No event triggered" 176 elif [ ${cnt} -gt ${expected_event} ] ; then 177 atf_fail "6: Multiple events triggered" 178 fi 179 evt=$( check_powerd_event ${cnt} "normal") 180 if [ -n "${evt}" ] ; then 181 atf_fail "6: ${evt}" 182 fi 183 expected_event=$(( 1 + ${expected_event} )) 184 fi 185 186 # Step 7 - verify that we can set our own limit 187 188 # Steps 7 thru 12 are skipped if the sensor cannot be monitored 189 if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then 190 rump.envstat -c env1.conf 191 if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 192 atf_fail "7: Limit not set by envstat -c" 193 fi 194 195 # Step 8 - make sure user-set limit works 196 if [ ${skip_events} -eq 0 ] ; then 197 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 198 sleep 5 199 cnt=$(get_powerd_event_count) 200 if [ ${cnt} -lt ${expected_event} ] ; then 201 atf_fail "8: No event triggered" 202 elif [ ${cnt} -gt ${expected_event} ] ; then 203 atf_fail "8: Multiple events triggered" 204 fi 205 evt=$( check_powerd_event ${cnt} "critical-under") 206 if [ -n "${evt}" ] ; then 207 atf_fail "8: ${evt}" 208 fi 209 expected_event=$(( 1 + ${expected_event} )) 210 fi 211 212 # Step 9 - verify that we return to normal state 213 if [ ${skip_events} -eq 0 ] ; then 214 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) 215 sleep 5 216 cnt=$(get_powerd_event_count) 217 if [ ${cnt} -lt ${expected_event} ] ; then 218 atf_fail "9: No event triggered" 219 elif [ ${cnt} -gt ${expected_event} ] ; then 220 atf_fail "9: Multiple events triggered" 221 fi 222 evt=$( check_powerd_event ${cnt} "normal") 223 if [ -n "${evt}" ] ; then 224 atf_fail "9: ${evt}" 225 fi 226 expected_event=$(( 1 + ${expected_event} )) 227 fi 228 229 # Step 10 - reset to defaults 230 rump.envstat -S 231 if [ $1 -eq 0 ] ; then 232 get_sensor_info | grep -q critical-min && 233 atf_fail "10: Failed to clear a limit with envstat -S" 234 else 235 if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 236 atf_fail "10: Limit not reset to initial value" 237 fi 238 fi 239 240 # Step 11 - see if more events occur 241 if [ ${skip_events} -eq 0 ] ; then 242 rump.envstat -c env0.conf 243 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 244 sleep 5 245 cnt=$(get_powerd_event_count) 246 if [ ${cnt} -ge ${expected_event} ] ; then 247 if [ $1 -ne 2 ] ; then 248 atf_fail "11b Event triggered after reset" 249 fi 250 evt=$( check_powerd_event ${cnt} "critical-under") 251 if [ -n "${evt}" ] ; then 252 atf_fail "11a: ${evt}" 253 fi 254 fi 255 fi 256 257 # Step 12 - make sure we can set new limits once more 258 rump.envstat -c env2.conf 259 if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 260 atf_fail "12a: Limit not reset to same value" 261 fi 262 rump.envstat -c env1.conf 263 if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 264 atf_fail "12b: Limit not reset to new value" 265 fi 266 fi 267 268 # Step 13 - confirm registration (or lack thereof) with rndctl 269 rnd_bits=$( get_rnd_bits_count ) 270 if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then 271 if [ -z "$rnd_bits" ] ; then 272 atf_fail "13a: Not registered with rndctl" 273 fi 274 else 275 if [ -n "$rnd_bits" ] ; then 276 atf_fail "13b: Wrongly registered with rndctl" 277 fi 278 fi 279 280 # Steps 14 and 15 are only if sensor is providing entropy 281 if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then 282 return 283 fi 284 285 # Step 14 - make sure entropy collected when device is being polled 286 rump.envstat -c env0.conf 287 rump.sysctl -w hw.swsensor.cur_value=$3 288 sleep 5 289 rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 290 sleep 5 291 new_rnd_bits=$( get_rnd_bits_count ) 292 if [ $new_rnd_bits -le $rnd_bits ] ; then 293 atf_expect_fail "PR kern/47661" 294 atf_fail "14a: entropy bits did not increase after polling" 295 fi 296 rnd_bits=$new_rnd_bits 297 sleep 5 298 new_rnd_bits=$( get_rnd_bits_count ) 299 if [ $new_rnd_bits -gt $rnd_bits ] ; then 300 atf_expect_fail "PR kern/47661" 301 atf_fail "14b: entropy bits increased after poll with no value change" 302 fi 303 304 # Step 15 - make sure entropy collected when device is interrogated 305 # 306 rump.envstat -c env0.conf 307 rump.sysctl -w hw.swsensor.cur_value=$3 308 get_sensor_key cur-value 309 rnd_bits=$( get_rnd_bits_count ) 310 rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 311 get_sensor_key cur-value 312 new_rnd_bits=$( get_rnd_bits_count ) 313 if [ $new_rnd_bits -le $rnd_bits ] ; then 314 atf_expect_fail "PR kern/47661" 315 atf_fail "15a: entropy bits did not increase after interrogation" 316 fi 317 rnd_bits=$new_rnd_bits 318 get_sensor_key cur-value 319 new_rnd_bits=$( get_rnd_bits_count ) 320 if [ $new_rnd_bits -gt $rnd_bits ] ; then 321 atf_expect_fail "PR kern/47661" 322 atf_fail "15b: entropy bits increased after interrogation with no value change" 323 fi 324} 325 326atf_test_case simple_sensor cleanup 327simple_sensor_head() { 328 common_head "Test a simple sensor" 329} 330 331simple_sensor_body() { 332 common_body 0 50 30 10 1 333} 334 335simple_sensor_cleanup() { 336 common_cleanup 337} 338 339atf_test_case limit_sensor cleanup 340limit_sensor_head() { 341 common_head "Test a sensor with internal limit" 342} 343 344limit_sensor_body() { 345 common_body 1 45 25 8 2 346} 347 348limit_sensor_cleanup() { 349 common_cleanup 350} 351 352atf_test_case alarm_sensor cleanup 353alarm_sensor_head() { 354 common_head "Test a sensor with internal checking" 355} 356 357alarm_sensor_body() { 358 common_body 2 40 20 6 3 359} 360 361alarm_sensor_cleanup() { 362 common_cleanup 363} 364 365atf_test_case entropy_polled_sensor cleanup 366entropy_polled_sensor_head() { 367 common_head "Test a simple sensor that provides entropy" 368} 369 370entropy_polled_sensor_body() { 371 common_body 0 50 30 10 1 8192 372} 373 374entropy_polled_sensor_cleanup() { 375 common_cleanup 376} 377 378atf_test_case entropy_interrupt_sensor cleanup 379entropy_interrupt_sensor_head() { 380 common_head "Test a sensor that provides entropy without polling" 381} 382 383entropy_interrupt_sensor_body() { 384 common_body 0 50 30 10 1 10240 385} 386 387entropy_interrupt_sensor_cleanup() { 388 common_cleanup 389} 390 391atf_init_test_cases() { 392 RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER 393 atf_add_test_case simple_sensor 394 atf_add_test_case limit_sensor 395 atf_add_test_case alarm_sensor 396 atf_add_test_case entropy_polled_sensor 397 atf_add_test_case entropy_interrupt_sensor 398} 399