1 # $NetBSD: t_swsensor.sh,v 1.1 2010/12/20 04:56:18 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 get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g' 10 } 11 12 get_powerd_event_count() { 13 grep "not running" powerd.log | wc -l 14 } 15 16 check_powerd_event() { 17 event=$(grep "not running" powerd.log | \ 18 sed -e "$1p" -e "d" ) 19 event=${event##*//} 20 script=${event%% *} 21 event=${event#* } 22 device=${event%% *} 23 event=${event#* } 24 state=${event%% *} 25 sensor=${event#* } 26 sensor=${sensor% *} 27 28 if [ "${script}" != "sensor_indicator" ] ; then 29 echo "Event uses wrong script: ${script}" 30 elif [ "${device}" != "swsensor" ] ; then 31 echo "Event uses wrong device: ${device}" 32 elif [ "${sensor}" != "sensor" ] ; then 33 echo "Event uses wrong sensor: ${sensor}" 34 elif [ "${state}" != "$2" ] ; then 35 echo "Event uses wrong state: ${state}" 36 fi 37 } 38 39 # Start the rump server, then load the swsensor module with the 40 # requested properties 41 42 start_rump() { 43 rump_allserver ${RUMP_SERVER} 44 if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then 45 rump.modunload swsensor 46 rump.modload -f $1 swsensor 47 else 48 rump.modload $1 swsensor 49 fi 50 return $? 51 } 52 53 common_head() { 54 atf_set descr "$1" 55 atf_set timeout 60 56 atf_set require.progs rump.powerd rump.envstat rump.modload \ 57 rump.halt rump.sysctl rump_allserver \ 58 sed grep 59 atf_set require.user root 60 } 61 62 common_cleanup() { 63 if [ -n "$(jobs)" ] ; then 64 kill %1 # get rid of our rump.powerd 65 fi 66 67 rump.modunload swsensor 68 rump.halt 69 rm -f ${RUMP_SERVER} 70 } 71 72 create_envsys_conf_files() { 73 cat << ENV0 > env0.conf 74 swsensor { 75 refresh-timeout = 2s; 76 } 77 ENV0 78 cat << ENV1 > env1.conf 79 swsensor { 80 sensor0 { critical-min = $(( $1 - $2 )); } 81 } 82 ENV1 83 cat << ENV2 > env2.conf 84 swsensor { 85 sensor0 { critical-min = $1; } 86 } 87 ENV2 88 } 89 90 # Test body common to all sensors 91 # $1 sensor mode 92 # $2 initial sensor value 93 # $3 initial limit 94 # $4 amount to lower limit 95 # $5 difference from limit to trigger event 96 97 common_body() { 98 if [ $1 -ne 0 ] ; then 99 atf_skip "rump.modload doesn't pass proplist attributes" 100 fi 101 102 # Start the rump-server process and load the module 103 start_rump "-i mode=$1 -i value=$2 -i limit=$3" 104 105 # create configuration files for updates 106 create_envsys_conf_files $3 $4 107 108 if [ $? -ne 0 ] ; then 109 atf_skip "Cannot set-up rump environment" 110 fi 111 112 # start powerd so we can detect sensor events 113 rump.powerd -n -d > powerd.log 2>&1 & 114 if [ -z "$(jobs)" ] ; then 115 skip_events=1 116 echo "Skipping event sub-tests - powerd did not start" 117 else 118 skip_events=0 119 expected_event=1 120 fi 121 122 # Step 0 - verify that sensor is registered 123 get_sensor_info | grep -q swsensor || 124 atf_fail "0: Device swsensor not registered" 125 126 # Step 1 - update the refresh-timeout and verify 127 # (use $(( ... )) since the timeout is displayed in hex!) 128 rump.envstat -c env0.conf 129 if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then 130 atf_fail "1: Could not set refresh-timout to 2s" 131 fi 132 133 # Step 2 - verify that we can read sensor's value 134 if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then 135 atf_fail "2: Value not available" 136 fi 137 138 # Step 3 - verify that changes in sensor value are seen 139 rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) 140 if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then 141 atf_fail "3: Value not updated" 142 fi 143 144 # Step 4 - if sensor provides hw limit, make sure we can read it 145 if [ $1 -ne 0 ] ; then 146 if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 147 atf_fail "4: Limit not set by device" 148 fi 149 fi 150 151 # Step 5 - if sensor provides hw limit, make sure it works 152 if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 153 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) 154 sleep 5 155 cnt=$(get_powerd_event_count) 156 if [ ${cnt} -lt ${expected_event} ] ; then 157 atf_fail "5: No event triggered" 158 elif [ ${cnt} -gt ${expected_event} ] ; then 159 atf_fail "5: Multiple events triggered" 160 fi 161 evt=$( check_powerd_event ${cnt} "critical-under") 162 if [ -n "${evt}" ] ; then 163 atf_fail "5: ${evt}" 164 fi 165 expected_event=$(( 1 + ${expected_event} )) 166 fi 167 168 # Step 6 - verify that we return to normal state 169 if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then 170 rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) 171 sleep 5 172 cnt=$(get_powerd_event_count) 173 if [ ${cnt} -lt ${expected_event} ] ; then 174 atf_fail "6: No event triggered" 175 elif [ ${cnt} -gt ${expected_event} ] ; then 176 atf_fail "6: Multiple events triggered" 177 fi 178 evt=$( check_powerd_event ${cnt} "normal") 179 if [ -n "${evt}" ] ; then 180 atf_fail "6: ${evt}" 181 fi 182 expected_event=$(( 1 + ${expected_event} )) 183 fi 184 185 # Step 7 - verify that we can set our own limit 186 rump.envstat -c env1.conf 187 if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 188 atf_fail "7: Limit not set by envstat -c" 189 fi 190 191 # Step 8 - make sure user-set limit works 192 if [ ${skip_events} -eq 0 ] ; then 193 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 194 sleep 5 195 cnt=$(get_powerd_event_count) 196 if [ ${cnt} -lt ${expected_event} ] ; then 197 atf_fail "8: No event triggered" 198 elif [ ${cnt} -gt ${expected_event} ] ; then 199 atf_fail "8: Multiple events triggered" 200 fi 201 evt=$( check_powerd_event ${cnt} "critical-under") 202 if [ -n "${evt}" ] ; then 203 atf_fail "8: ${evt}" 204 fi 205 expected_event=$(( 1 + ${expected_event} )) 206 fi 207 208 # Step 9 - verify that we return to normal state 209 if [ ${skip_events} -eq 0 ] ; then 210 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) 211 sleep 5 212 cnt=$(get_powerd_event_count) 213 if [ ${cnt} -lt ${expected_event} ] ; then 214 atf_fail "9: No event triggered" 215 elif [ ${cnt} -gt ${expected_event} ] ; then 216 atf_fail "9: Multiple events triggered" 217 fi 218 evt=$( check_powerd_event ${cnt} "normal") 219 if [ -n "${evt}" ] ; then 220 atf_fail "9: ${evt}" 221 fi 222 expected_event=$(( 1 + ${expected_event} )) 223 fi 224 225 # Step 10 - reset to defaults 226 rump.envstat -S 227 if [ $1 -eq 0 ] ; then 228 get_sensor_info | grep -q critical-min && 229 atf_fail "10: Failed to clear a limit with envstat -S" 230 else 231 if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 232 atf_fail "10: Limit not reset to initial value" 233 fi 234 fi 235 236 # Step 11 - see if more events occur 237 if [ ${skip_events} -eq 0 ] ; then 238 rump.envstat -c env0.conf 239 rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) 240 sleep 5 241 cnt=$(get_powerd_event_count) 242 if [ ${cnt} -ge ${expected_event} ] ; then 243 atf_fail "9: Event triggered after reset" 244 fi 245 fi 246 247 # Step 12 - make sure we can set new limits once more 248 rump.envstat -c env2.conf 249 if [ $( get_sensor_key critical-min ) -ne $3 ] ; then 250 atf_fail "12a: Limit not reset to same value" 251 fi 252 rump.envstat -c env1.conf 253 if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then 254 atf_fail "12b: Limit not reset to new value" 255 fi 256 } 257 258 atf_test_case simple_sensor cleanup 259 simple_sensor_head() { 260 common_head "Test a simple sensor" 261 } 262 263 simple_sensor_body() { 264 common_body 0 50 30 10 1 265 } 266 267 simple_sensor_cleanup() { 268 common_cleanup 269 } 270 271 atf_test_case limit_sensor cleanup 272 limit_sensor_head() { 273 common_head "Test a sensor with internal limit" 274 } 275 276 limit_sensor_body() { 277 common_body 1 45 25 8 2 278 } 279 280 limit_sensor_cleanup() { 281 common_cleanup 282 } 283 284 atf_test_case alarm_sensor cleanup 285 alarm_sensor_head() { 286 common_head "Test a sensor with internal checking" 287 } 288 289 alarm_sensor_body() { 290 common_body 2 40 20 6 3 291 } 292 293 alarm_sensor_cleanup() { 294 common_cleanup 295 } 296 297 atf_init_test_cases() { 298 RUMP_SERVER="unix:///tmp/t_swsensor" ; export RUMP_SERVER 299 atf_add_test_case simple_sensor 300 atf_add_test_case limit_sensor 301 atf_add_test_case alarm_sensor 302 } 303