Home | History | Annotate | Line # | Download | only in sysmon
t_swsensor.sh revision 1.1
      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