Module Name: src Committed By: pgoyette Date: Mon Dec 20 04:56:18 UTC 2010
Modified Files: src/distrib/sets/lists/tests: mi src/tests/dev/sysmon: Makefile Added Files: src/tests/dev/sysmon: t_swsensor.sh Log Message: Add a rump-based set of tests for sysmon_envsys(8) + powerd(8) + swsensor(4) To generate a diff of this commit: cvs rdiff -u -r1.180 -r1.181 src/distrib/sets/lists/tests/mi cvs rdiff -u -r1.1 -r1.2 src/tests/dev/sysmon/Makefile cvs rdiff -u -r0 -r1.1 src/tests/dev/sysmon/t_swsensor.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/tests/mi diff -u src/distrib/sets/lists/tests/mi:1.180 src/distrib/sets/lists/tests/mi:1.181 --- src/distrib/sets/lists/tests/mi:1.180 Fri Dec 17 19:13:48 2010 +++ src/distrib/sets/lists/tests/mi Mon Dec 20 04:56:18 2010 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.180 2010/12/17 19:13:48 pooka Exp $ +# $NetBSD: mi,v 1.181 2010/12/20 04:56:18 pgoyette Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -223,6 +223,7 @@ ./usr/libdata/debug/usr/tests/dev/scsipi tests-fs-debug ./usr/libdata/debug/usr/tests/dev/scsipi/t_cd.debug tests-fs-debug debug,atf ./usr/libdata/debug/usr/tests/dev/sysmon tests-fs-debug +./usr/libdata/debug/usr/tests/dev/sysmon/t_swsensor.debug tests-fs-debug debug,atf ./usr/libdata/debug/usr/tests/dev/sysmon/t_swwdog.debug tests-fs-debug debug,atf ./usr/libdata/debug/usr/tests/fs/ffs tests-fs-debug ./usr/libdata/debug/usr/tests/fs/ffs/t_fifos.debug tests-fs-debug debug,atf @@ -1056,6 +1057,7 @@ ./usr/tests/dev/scsipi/t_cd tests-fs-tests atf ./usr/tests/dev/sysmon tests-fs-tests ./usr/tests/dev/sysmon/Atffile tests-fs-tests atf +./usr/tests/dev/sysmon/t_swsensor tests-fs-tests atf ./usr/tests/dev/sysmon/t_swwdog tests-fs-tests atf ./usr/tests/fs tests-fs-tests ./usr/tests/fs/Atffile tests-fs-tests atf Index: src/tests/dev/sysmon/Makefile diff -u src/tests/dev/sysmon/Makefile:1.1 src/tests/dev/sysmon/Makefile:1.2 --- src/tests/dev/sysmon/Makefile:1.1 Fri Aug 6 16:13:26 2010 +++ src/tests/dev/sysmon/Makefile Mon Dec 20 04:56:18 2010 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.1 2010/08/06 16:13:26 pooka Exp $ +# $NetBSD: Makefile,v 1.2 2010/12/20 04:56:18 pgoyette Exp $ # .include <bsd.own.mk> @@ -13,4 +13,6 @@ WARNS= 4 +TESTS_SH= t_swsensor + .include <bsd.test.mk> Added files: Index: src/tests/dev/sysmon/t_swsensor.sh diff -u /dev/null src/tests/dev/sysmon/t_swsensor.sh:1.1 --- /dev/null Mon Dec 20 04:56:18 2010 +++ src/tests/dev/sysmon/t_swsensor.sh Mon Dec 20 04:56:18 2010 @@ -0,0 +1,302 @@ +# $NetBSD: t_swsensor.sh,v 1.1 2010/12/20 04:56:18 pgoyette Exp $ + +get_sensor_info() { + rump.envstat -x | \ + sed -e "\;swsensor;,\;/array;p" -e "d" +} + +get_sensor_key() { + get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g' +} + +get_powerd_event_count() { + grep "not running" powerd.log | wc -l +} + +check_powerd_event() { + event=$(grep "not running" powerd.log | \ + sed -e "$1p" -e "d" ) + event=${event##*//} + script=${event%% *} + event=${event#* } + device=${event%% *} + event=${event#* } + state=${event%% *} + sensor=${event#* } + sensor=${sensor% *} + + if [ "${script}" != "sensor_indicator" ] ; then + echo "Event uses wrong script: ${script}" + elif [ "${device}" != "swsensor" ] ; then + echo "Event uses wrong device: ${device}" + elif [ "${sensor}" != "sensor" ] ; then + echo "Event uses wrong sensor: ${sensor}" + elif [ "${state}" != "$2" ] ; then + echo "Event uses wrong state: ${state}" + fi +} + +# Start the rump server, then load the swsensor module with the +# requested properties + +start_rump() { + rump_allserver ${RUMP_SERVER} + if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then + rump.modunload swsensor + rump.modload -f $1 swsensor + else + rump.modload $1 swsensor + fi + return $? +} + +common_head() { + atf_set descr "$1" + atf_set timeout 60 + atf_set require.progs rump.powerd rump.envstat rump.modload \ + rump.halt rump.sysctl rump_allserver \ + sed grep + atf_set require.user root +} + +common_cleanup() { + if [ -n "$(jobs)" ] ; then + kill %1 # get rid of our rump.powerd + fi + + rump.modunload swsensor + rump.halt + rm -f ${RUMP_SERVER} +} + +create_envsys_conf_files() { + cat << ENV0 > env0.conf + swsensor { + refresh-timeout = 2s; + } +ENV0 + cat << ENV1 > env1.conf + swsensor { + sensor0 { critical-min = $(( $1 - $2 )); } + } +ENV1 + cat << ENV2 > env2.conf + swsensor { + sensor0 { critical-min = $1; } + } +ENV2 +} + +# Test body common to all sensors +# $1 sensor mode +# $2 initial sensor value +# $3 initial limit +# $4 amount to lower limit +# $5 difference from limit to trigger event + +common_body() { + if [ $1 -ne 0 ] ; then + atf_skip "rump.modload doesn't pass proplist attributes" + fi + + # Start the rump-server process and load the module + start_rump "-i mode=$1 -i value=$2 -i limit=$3" + + # create configuration files for updates + create_envsys_conf_files $3 $4 + + if [ $? -ne 0 ] ; then + atf_skip "Cannot set-up rump environment" + fi + + # start powerd so we can detect sensor events + rump.powerd -n -d > powerd.log 2>&1 & + if [ -z "$(jobs)" ] ; then + skip_events=1 + echo "Skipping event sub-tests - powerd did not start" + else + skip_events=0 + expected_event=1 + fi + + # Step 0 - verify that sensor is registered + get_sensor_info | grep -q swsensor || + atf_fail "0: Device swsensor not registered" + + # Step 1 - update the refresh-timeout and verify + # (use $(( ... )) since the timeout is displayed in hex!) + rump.envstat -c env0.conf + if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then + atf_fail "1: Could not set refresh-timout to 2s" + fi + + # Step 2 - verify that we can read sensor's value + if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then + atf_fail "2: Value not available" + fi + + # Step 3 - verify that changes in sensor value are seen + rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 )) + if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then + atf_fail "3: Value not updated" + fi + + # Step 4 - if sensor provides hw limit, make sure we can read it + if [ $1 -ne 0 ] ; then + if [ $( get_sensor_key critical-min ) -ne $3 ] ; then + atf_fail "4: Limit not set by device" + fi + fi + + # Step 5 - if sensor provides hw limit, make sure it works + if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then + rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 )) + sleep 5 + cnt=$(get_powerd_event_count) + if [ ${cnt} -lt ${expected_event} ] ; then + atf_fail "5: No event triggered" + elif [ ${cnt} -gt ${expected_event} ] ; then + atf_fail "5: Multiple events triggered" + fi + evt=$( check_powerd_event ${cnt} "critical-under") + if [ -n "${evt}" ] ; then + atf_fail "5: ${evt}" + fi + expected_event=$(( 1 + ${expected_event} )) + fi + + # Step 6 - verify that we return to normal state + if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then + rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 )) + sleep 5 + cnt=$(get_powerd_event_count) + if [ ${cnt} -lt ${expected_event} ] ; then + atf_fail "6: No event triggered" + elif [ ${cnt} -gt ${expected_event} ] ; then + atf_fail "6: Multiple events triggered" + fi + evt=$( check_powerd_event ${cnt} "normal") + if [ -n "${evt}" ] ; then + atf_fail "6: ${evt}" + fi + expected_event=$(( 1 + ${expected_event} )) + fi + + # Step 7 - verify that we can set our own limit + rump.envstat -c env1.conf + if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then + atf_fail "7: Limit not set by envstat -c" + fi + + # Step 8 - make sure user-set limit works + if [ ${skip_events} -eq 0 ] ; then + rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) + sleep 5 + cnt=$(get_powerd_event_count) + if [ ${cnt} -lt ${expected_event} ] ; then + atf_fail "8: No event triggered" + elif [ ${cnt} -gt ${expected_event} ] ; then + atf_fail "8: Multiple events triggered" + fi + evt=$( check_powerd_event ${cnt} "critical-under") + if [ -n "${evt}" ] ; then + atf_fail "8: ${evt}" + fi + expected_event=$(( 1 + ${expected_event} )) + fi + + # Step 9 - verify that we return to normal state + if [ ${skip_events} -eq 0 ] ; then + rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 )) + sleep 5 + cnt=$(get_powerd_event_count) + if [ ${cnt} -lt ${expected_event} ] ; then + atf_fail "9: No event triggered" + elif [ ${cnt} -gt ${expected_event} ] ; then + atf_fail "9: Multiple events triggered" + fi + evt=$( check_powerd_event ${cnt} "normal") + if [ -n "${evt}" ] ; then + atf_fail "9: ${evt}" + fi + expected_event=$(( 1 + ${expected_event} )) + fi + + # Step 10 - reset to defaults + rump.envstat -S + if [ $1 -eq 0 ] ; then + get_sensor_info | grep -q critical-min && + atf_fail "10: Failed to clear a limit with envstat -S" + else + if [ $( get_sensor_key critical-min ) -ne $3 ] ; then + atf_fail "10: Limit not reset to initial value" + fi + fi + + # Step 11 - see if more events occur + if [ ${skip_events} -eq 0 ] ; then + rump.envstat -c env0.conf + rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 )) + sleep 5 + cnt=$(get_powerd_event_count) + if [ ${cnt} -ge ${expected_event} ] ; then + atf_fail "9: Event triggered after reset" + fi + fi + + # Step 12 - make sure we can set new limits once more + rump.envstat -c env2.conf + if [ $( get_sensor_key critical-min ) -ne $3 ] ; then + atf_fail "12a: Limit not reset to same value" + fi + rump.envstat -c env1.conf + if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then + atf_fail "12b: Limit not reset to new value" + fi +} + +atf_test_case simple_sensor cleanup +simple_sensor_head() { + common_head "Test a simple sensor" +} + +simple_sensor_body() { + common_body 0 50 30 10 1 +} + +simple_sensor_cleanup() { + common_cleanup +} + +atf_test_case limit_sensor cleanup +limit_sensor_head() { + common_head "Test a sensor with internal limit" +} + +limit_sensor_body() { + common_body 1 45 25 8 2 +} + +limit_sensor_cleanup() { + common_cleanup +} + +atf_test_case alarm_sensor cleanup +alarm_sensor_head() { + common_head "Test a sensor with internal checking" +} + +alarm_sensor_body() { + common_body 2 40 20 6 3 +} + +alarm_sensor_cleanup() { + common_cleanup +} + +atf_init_test_cases() { + RUMP_SERVER="unix:///tmp/t_swsensor" ; export RUMP_SERVER + atf_add_test_case simple_sensor + atf_add_test_case limit_sensor + atf_add_test_case alarm_sensor +}