1 1.7 martin # $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $ 2 1.1 pgoyette 3 1.1 pgoyette get_sensor_info() { 4 1.1 pgoyette rump.envstat -x | \ 5 1.1 pgoyette sed -e "\;swsensor;,\;/array;p" -e "d" 6 1.1 pgoyette } 7 1.1 pgoyette 8 1.1 pgoyette get_sensor_key() { 9 1.1 pgoyette get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g' 10 1.1 pgoyette } 11 1.1 pgoyette 12 1.1 pgoyette get_powerd_event_count() { 13 1.1 pgoyette grep "not running" powerd.log | wc -l 14 1.1 pgoyette } 15 1.1 pgoyette 16 1.5 pgoyette get_rnd_bits_count() { 17 1.5 pgoyette env RUMPHIJACK=blanket=/dev/random:/dev/urandom \ 18 1.5 pgoyette RUMP_SERVER=unix://t_swsensor_socket \ 19 1.5 pgoyette LD_PRELOAD=/usr/lib/librumphijack.so rndctl -l | \ 20 1.5 pgoyette grep "swsensor-sensor" | \ 21 1.5 pgoyette awk '{print $2}' 22 1.5 pgoyette } 23 1.5 pgoyette 24 1.1 pgoyette check_powerd_event() { 25 1.1 pgoyette event=$(grep "not running" powerd.log | \ 26 1.1 pgoyette sed -e "$1p" -e "d" ) 27 1.1 pgoyette event=${event##*//} 28 1.1 pgoyette script=${event%% *} 29 1.1 pgoyette event=${event#* } 30 1.1 pgoyette device=${event%% *} 31 1.1 pgoyette event=${event#* } 32 1.1 pgoyette state=${event%% *} 33 1.1 pgoyette sensor=${event#* } 34 1.1 pgoyette sensor=${sensor% *} 35 1.1 pgoyette 36 1.1 pgoyette if [ "${script}" != "sensor_indicator" ] ; then 37 1.1 pgoyette echo "Event uses wrong script: ${script}" 38 1.1 pgoyette elif [ "${device}" != "swsensor" ] ; then 39 1.1 pgoyette echo "Event uses wrong device: ${device}" 40 1.1 pgoyette elif [ "${sensor}" != "sensor" ] ; then 41 1.1 pgoyette echo "Event uses wrong sensor: ${sensor}" 42 1.1 pgoyette elif [ "${state}" != "$2" ] ; then 43 1.1 pgoyette echo "Event uses wrong state: ${state}" 44 1.1 pgoyette fi 45 1.1 pgoyette } 46 1.1 pgoyette 47 1.1 pgoyette # Start the rump server, then load the swsensor module with the 48 1.1 pgoyette # requested properties 49 1.1 pgoyette 50 1.1 pgoyette start_rump() { 51 1.5 pgoyette rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER} 52 1.1 pgoyette if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then 53 1.1 pgoyette rump.modunload swsensor 54 1.1 pgoyette rump.modload -f $1 swsensor 55 1.1 pgoyette else 56 1.1 pgoyette rump.modload $1 swsensor 57 1.1 pgoyette fi 58 1.1 pgoyette return $? 59 1.1 pgoyette } 60 1.1 pgoyette 61 1.1 pgoyette common_head() { 62 1.1 pgoyette atf_set descr "$1" 63 1.1 pgoyette atf_set timeout 60 64 1.4 pgoyette atf_set require.progs rump.powerd rump.envstat rump.modload \ 65 1.4 pgoyette rump.halt rump.sysctl rump_server \ 66 1.5 pgoyette sed grep awk \ 67 1.5 pgoyette rndctl expr 68 1.1 pgoyette } 69 1.1 pgoyette 70 1.1 pgoyette common_cleanup() { 71 1.1 pgoyette rump.modunload swsensor 72 1.1 pgoyette rump.halt 73 1.1 pgoyette } 74 1.1 pgoyette 75 1.1 pgoyette create_envsys_conf_files() { 76 1.1 pgoyette cat << ENV0 > env0.conf 77 1.1 pgoyette swsensor { 78 1.1 pgoyette refresh-timeout = 2s; 79 1.1 pgoyette } 80 1.1 pgoyette ENV0 81 1.1 pgoyette cat << ENV1 > env1.conf 82 1.1 pgoyette swsensor { 83 1.1 pgoyette sensor0 { critical-min = $(( $1 - $2 )); } 84 1.1 pgoyette } 85 1.1 pgoyette ENV1 86 1.1 pgoyette cat << ENV2 > env2.conf 87 1.1 pgoyette swsensor { 88 1.1 pgoyette sensor0 { critical-min = $1; } 89 1.1 pgoyette } 90 1.1 pgoyette ENV2 91 1.1 pgoyette } 92 1.1 pgoyette 93 1.1 pgoyette # Test body common to all sensors 94 1.1 pgoyette # $1 sensor mode 95 1.1 pgoyette # $2 initial sensor value 96 1.1 pgoyette # $3 initial limit 97 1.1 pgoyette # $4 amount to lower limit 98 1.1 pgoyette # $5 difference from limit to trigger event 99 1.5 pgoyette # $6 sensor flags, for FHAS_ENTROPY and FMONNOTSUPP 100 1.1 pgoyette 101 1.1 pgoyette common_body() { 102 1.1 pgoyette # Start the rump-server process and load the module 103 1.5 pgoyette modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}" 104 1.5 pgoyette start_rump "$modload_args" 105 1.1 pgoyette 106 1.1 pgoyette # create configuration files for updates 107 1.1 pgoyette create_envsys_conf_files $3 $4 108 1.1 pgoyette 109 1.1 pgoyette if [ $? -ne 0 ] ; then 110 1.1 pgoyette atf_skip "Cannot set-up rump environment" 111 1.1 pgoyette fi 112 1.1 pgoyette 113 1.1 pgoyette # start powerd so we can detect sensor events 114 1.1 pgoyette rump.powerd -n -d > powerd.log 2>&1 & 115 1.1 pgoyette if [ -z "$(jobs)" ] ; then 116 1.1 pgoyette skip_events=1 117 1.1 pgoyette echo "Skipping event sub-tests - powerd did not start" 118 1.1 pgoyette else 119 1.1 pgoyette skip_events=0 120 1.1 pgoyette expected_event=1 121 1.1 pgoyette fi 122 1.1 pgoyette 123 1.1 pgoyette # Step 0 - verify that sensor is registered 124 1.1 pgoyette get_sensor_info | grep -q swsensor || 125 1.1 pgoyette atf_fail "0: Device swsensor not registered" 126 1.1 pgoyette 127 1.1 pgoyette # Step 1 - update the refresh-timeout and verify 128 1.1 pgoyette # (use $(( ... )) since the timeout is displayed in hex!) 129 1.1 pgoyette rump.envstat -c env0.conf 130 1.1 pgoyette if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then 131 1.1 pgoyette atf_fail "1: Could not set refresh-timout to 2s" 132 1.1 pgoyette fi 133 1.1 pgoyette 134 1.1 pgoyette # Step 2 - verify that we can read sensor's value 135 1.1 pgoyette if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then 136 1.1 pgoyette atf_fail "2: Value not available" 137 1.1 pgoyette fi 138 1.1 pgoyette 139 1.1 pgoyette # Step 3 - verify that changes in sensor value are seen 140 1.1 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) 141 1.1 pgoyette if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then 142 1.1 pgoyette atf_fail "3: Value not updated" 143 1.1 pgoyette fi 144 1.1 pgoyette 145 1.1 pgoyette # Step 4 - if sensor provides hw limit, make sure we can read it 146 1.1 pgoyette if [ $1 -ne 0 ] ; then 147 1.1 pgoyette if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 148 1.1 pgoyette atf_fail "4: Limit not set by device" 149 1.1 pgoyette fi 150 1.1 pgoyette fi 151 1.1 pgoyette 152 1.1 pgoyette # Step 5 - if sensor provides hw limit, make sure it works 153 1.1 pgoyette if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 154 1.1 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) 155 1.3 pgoyette sleep 5 156 1.1 pgoyette cnt=$(get_powerd_event_count) 157 1.1 pgoyette if [ ${cnt} -lt ${expected_event} ] ; then 158 1.1 pgoyette atf_fail "5: No event triggered" 159 1.1 pgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 160 1.1 pgoyette atf_fail "5: Multiple events triggered" 161 1.1 pgoyette fi 162 1.1 pgoyette evt=$( check_powerd_event ${cnt} "critical-under") 163 1.1 pgoyette if [ -n "${evt}" ] ; then 164 1.1 pgoyette atf_fail "5: ${evt}" 165 1.1 pgoyette fi 166 1.1 pgoyette expected_event=$(( 1 + ${expected_event} )) 167 1.1 pgoyette fi 168 1.1 pgoyette 169 1.1 pgoyette # Step 6 - verify that we return to normal state 170 1.1 pgoyette if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 171 1.1 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) 172 1.1 pgoyette sleep 5 173 1.1 pgoyette cnt=$(get_powerd_event_count) 174 1.1 pgoyette if [ ${cnt} -lt ${expected_event} ] ; then 175 1.1 pgoyette atf_fail "6: No event triggered" 176 1.1 pgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 177 1.1 pgoyette atf_fail "6: Multiple events triggered" 178 1.1 pgoyette fi 179 1.1 pgoyette evt=$( check_powerd_event ${cnt} "normal") 180 1.1 pgoyette if [ -n "${evt}" ] ; then 181 1.1 pgoyette atf_fail "6: ${evt}" 182 1.1 pgoyette fi 183 1.1 pgoyette expected_event=$(( 1 + ${expected_event} )) 184 1.1 pgoyette fi 185 1.1 pgoyette 186 1.1 pgoyette # Step 7 - verify that we can set our own limit 187 1.5 pgoyette 188 1.5 pgoyette # Steps 7 thru 12 are skipped if the sensor cannot be monitored 189 1.5 pgoyette if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then 190 1.5 pgoyette rump.envstat -c env1.conf 191 1.5 pgoyette if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 192 1.5 pgoyette atf_fail "7: Limit not set by envstat -c" 193 1.5 pgoyette fi 194 1.1 pgoyette 195 1.1 pgoyette # Step 8 - make sure user-set limit works 196 1.5 pgoyette if [ ${skip_events} -eq 0 ] ; then 197 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 198 1.5 pgoyette sleep 5 199 1.5 pgoyette cnt=$(get_powerd_event_count) 200 1.5 pgoyette if [ ${cnt} -lt ${expected_event} ] ; then 201 1.5 pgoyette atf_fail "8: No event triggered" 202 1.5 pgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 203 1.5 pgoyette atf_fail "8: Multiple events triggered" 204 1.5 pgoyette fi 205 1.5 pgoyette evt=$( check_powerd_event ${cnt} "critical-under") 206 1.5 pgoyette if [ -n "${evt}" ] ; then 207 1.5 pgoyette atf_fail "8: ${evt}" 208 1.5 pgoyette fi 209 1.5 pgoyette expected_event=$(( 1 + ${expected_event} )) 210 1.5 pgoyette fi 211 1.5 pgoyette 212 1.5 pgoyette # Step 9 - verify that we return to normal state 213 1.5 pgoyette if [ ${skip_events} -eq 0 ] ; then 214 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) 215 1.5 pgoyette sleep 5 216 1.5 pgoyette cnt=$(get_powerd_event_count) 217 1.5 pgoyette if [ ${cnt} -lt ${expected_event} ] ; then 218 1.5 pgoyette atf_fail "9: No event triggered" 219 1.5 pgoyette elif [ ${cnt} -gt ${expected_event} ] ; then 220 1.5 pgoyette atf_fail "9: Multiple events triggered" 221 1.5 pgoyette fi 222 1.5 pgoyette evt=$( check_powerd_event ${cnt} "normal") 223 1.5 pgoyette if [ -n "${evt}" ] ; then 224 1.5 pgoyette atf_fail "9: ${evt}" 225 1.5 pgoyette fi 226 1.5 pgoyette expected_event=$(( 1 + ${expected_event} )) 227 1.5 pgoyette fi 228 1.5 pgoyette 229 1.5 pgoyette # Step 10 - reset to defaults 230 1.5 pgoyette rump.envstat -S 231 1.5 pgoyette if [ $1 -eq 0 ] ; then 232 1.5 pgoyette get_sensor_info | grep -q critical-min && 233 1.5 pgoyette atf_fail "10: Failed to clear a limit with envstat -S" 234 1.5 pgoyette else 235 1.5 pgoyette if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 236 1.5 pgoyette atf_fail "10: Limit not reset to initial value" 237 1.5 pgoyette fi 238 1.1 pgoyette fi 239 1.5 pgoyette 240 1.5 pgoyette # Step 11 - see if more events occur 241 1.5 pgoyette if [ ${skip_events} -eq 0 ] ; then 242 1.5 pgoyette rump.envstat -c env0.conf 243 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 244 1.5 pgoyette sleep 5 245 1.5 pgoyette cnt=$(get_powerd_event_count) 246 1.5 pgoyette if [ ${cnt} -ge ${expected_event} ] ; then 247 1.5 pgoyette if [ $1 -ne 2 ] ; then 248 1.5 pgoyette atf_fail "11b Event triggered after reset" 249 1.5 pgoyette fi 250 1.5 pgoyette evt=$( check_powerd_event ${cnt} "critical-under") 251 1.5 pgoyette if [ -n "${evt}" ] ; then 252 1.5 pgoyette atf_fail "11a: ${evt}" 253 1.5 pgoyette fi 254 1.5 pgoyette fi 255 1.1 pgoyette fi 256 1.1 pgoyette 257 1.5 pgoyette # Step 12 - make sure we can set new limits once more 258 1.5 pgoyette rump.envstat -c env2.conf 259 1.5 pgoyette if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 260 1.5 pgoyette atf_fail "12a: Limit not reset to same value" 261 1.1 pgoyette fi 262 1.5 pgoyette rump.envstat -c env1.conf 263 1.5 pgoyette if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 264 1.5 pgoyette atf_fail "12b: Limit not reset to new value" 265 1.1 pgoyette fi 266 1.1 pgoyette fi 267 1.1 pgoyette 268 1.5 pgoyette # Step 13 - confirm registration (or lack thereof) with rndctl 269 1.5 pgoyette rnd_bits=$( get_rnd_bits_count ) 270 1.5 pgoyette if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then 271 1.5 pgoyette if [ -z "$rnd_bits" ] ; then 272 1.5 pgoyette atf_fail "13a: Not registered with rndctl" 273 1.5 pgoyette fi 274 1.1 pgoyette else 275 1.5 pgoyette if [ -n "$rnd_bits" ] ; then 276 1.5 pgoyette atf_fail "13b: Wrongly registered with rndctl" 277 1.1 pgoyette fi 278 1.1 pgoyette fi 279 1.1 pgoyette 280 1.5 pgoyette # Steps 14 and 15 are only if sensor is providing entropy 281 1.5 pgoyette if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then 282 1.5 pgoyette return 283 1.5 pgoyette fi 284 1.5 pgoyette 285 1.5 pgoyette # Step 14 - make sure entropy collected when device is being polled 286 1.5 pgoyette rump.envstat -c env0.conf 287 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$3 288 1.5 pgoyette sleep 5 289 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 290 1.5 pgoyette sleep 5 291 1.5 pgoyette new_rnd_bits=$( get_rnd_bits_count ) 292 1.5 pgoyette if [ $new_rnd_bits -le $rnd_bits ] ; then 293 1.7 martin atf_expect_fail "PR kern/47661" 294 1.5 pgoyette atf_fail "14a: entropy bits did not increase after polling" 295 1.5 pgoyette fi 296 1.5 pgoyette rnd_bits=$new_rnd_bits 297 1.5 pgoyette sleep 5 298 1.5 pgoyette new_rnd_bits=$( get_rnd_bits_count ) 299 1.5 pgoyette if [ $new_rnd_bits -gt $rnd_bits ] ; then 300 1.7 martin atf_expect_fail "PR kern/47661" 301 1.5 pgoyette atf_fail "14b: entropy bits increased after poll with no value change" 302 1.1 pgoyette fi 303 1.1 pgoyette 304 1.5 pgoyette # Step 15 - make sure entropy collected when device is interrogated 305 1.5 pgoyette # 306 1.5 pgoyette rump.envstat -c env0.conf 307 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$3 308 1.5 pgoyette get_sensor_key cur-value 309 1.5 pgoyette rnd_bits=$( get_rnd_bits_count ) 310 1.5 pgoyette rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 )) 311 1.5 pgoyette get_sensor_key cur-value 312 1.5 pgoyette new_rnd_bits=$( get_rnd_bits_count ) 313 1.5 pgoyette if [ $new_rnd_bits -le $rnd_bits ] ; then 314 1.7 martin atf_expect_fail "PR kern/47661" 315 1.5 pgoyette atf_fail "15a: entropy bits did not increase after interrogation" 316 1.5 pgoyette fi 317 1.5 pgoyette rnd_bits=$new_rnd_bits 318 1.5 pgoyette get_sensor_key cur-value 319 1.5 pgoyette new_rnd_bits=$( get_rnd_bits_count ) 320 1.5 pgoyette if [ $new_rnd_bits -gt $rnd_bits ] ; then 321 1.7 martin atf_expect_fail "PR kern/47661" 322 1.5 pgoyette atf_fail "15b: entropy bits increased after interrogation with no value change" 323 1.1 pgoyette fi 324 1.1 pgoyette } 325 1.1 pgoyette 326 1.1 pgoyette atf_test_case simple_sensor cleanup 327 1.1 pgoyette simple_sensor_head() { 328 1.1 pgoyette common_head "Test a simple sensor" 329 1.1 pgoyette } 330 1.1 pgoyette 331 1.1 pgoyette simple_sensor_body() { 332 1.1 pgoyette common_body 0 50 30 10 1 333 1.1 pgoyette } 334 1.1 pgoyette 335 1.1 pgoyette simple_sensor_cleanup() { 336 1.1 pgoyette common_cleanup 337 1.1 pgoyette } 338 1.1 pgoyette 339 1.1 pgoyette atf_test_case limit_sensor cleanup 340 1.1 pgoyette limit_sensor_head() { 341 1.1 pgoyette common_head "Test a sensor with internal limit" 342 1.1 pgoyette } 343 1.1 pgoyette 344 1.1 pgoyette limit_sensor_body() { 345 1.1 pgoyette common_body 1 45 25 8 2 346 1.1 pgoyette } 347 1.1 pgoyette 348 1.1 pgoyette limit_sensor_cleanup() { 349 1.1 pgoyette common_cleanup 350 1.1 pgoyette } 351 1.1 pgoyette 352 1.1 pgoyette atf_test_case alarm_sensor cleanup 353 1.1 pgoyette alarm_sensor_head() { 354 1.1 pgoyette common_head "Test a sensor with internal checking" 355 1.1 pgoyette } 356 1.1 pgoyette 357 1.1 pgoyette alarm_sensor_body() { 358 1.1 pgoyette common_body 2 40 20 6 3 359 1.1 pgoyette } 360 1.1 pgoyette 361 1.1 pgoyette alarm_sensor_cleanup() { 362 1.1 pgoyette common_cleanup 363 1.1 pgoyette } 364 1.1 pgoyette 365 1.5 pgoyette atf_test_case entropy_polled_sensor cleanup 366 1.5 pgoyette entropy_polled_sensor_head() { 367 1.5 pgoyette common_head "Test a simple sensor that provides entropy" 368 1.5 pgoyette } 369 1.5 pgoyette 370 1.5 pgoyette entropy_polled_sensor_body() { 371 1.5 pgoyette common_body 0 50 30 10 1 8192 372 1.5 pgoyette } 373 1.5 pgoyette 374 1.5 pgoyette entropy_polled_sensor_cleanup() { 375 1.5 pgoyette common_cleanup 376 1.5 pgoyette } 377 1.5 pgoyette 378 1.5 pgoyette atf_test_case entropy_interrupt_sensor cleanup 379 1.5 pgoyette entropy_interrupt_sensor_head() { 380 1.5 pgoyette common_head "Test a sensor that provides entropy without polling" 381 1.5 pgoyette } 382 1.5 pgoyette 383 1.5 pgoyette entropy_interrupt_sensor_body() { 384 1.5 pgoyette common_body 0 50 30 10 1 10240 385 1.5 pgoyette } 386 1.5 pgoyette 387 1.5 pgoyette entropy_interrupt_sensor_cleanup() { 388 1.5 pgoyette common_cleanup 389 1.5 pgoyette } 390 1.5 pgoyette 391 1.1 pgoyette atf_init_test_cases() { 392 1.2 pgoyette RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER 393 1.1 pgoyette atf_add_test_case simple_sensor 394 1.1 pgoyette atf_add_test_case limit_sensor 395 1.1 pgoyette atf_add_test_case alarm_sensor 396 1.5 pgoyette atf_add_test_case entropy_polled_sensor 397 1.5 pgoyette atf_add_test_case entropy_interrupt_sensor 398 1.1 pgoyette } 399