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