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