xref: /netbsd-src/tests/dev/sysmon/t_swsensor.sh (revision ee1e1b3d69409b0b3a99fe61788d0561aa13c8b2)
1# $NetBSD: t_swsensor.sh,v 1.4 2010/12/31 00:35:42 pgoyette Exp $
2
3get_sensor_info() {
4	rump.envstat -x | \
5	sed -e "\;swsensor;,\;/array;p" -e "d"
6}
7
8get_sensor_key() {
9	get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g'
10}
11
12get_powerd_event_count() {
13	grep "not running" powerd.log | wc -l
14}
15
16check_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
42start_rump() {
43	rump_server -l rumpvfs -l rumpdev -l rumpdev_sysmon ${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
53common_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_server	\
58				sed         grep
59}
60
61common_cleanup() {
62	rump.modunload swsensor
63	rump.halt
64}
65
66create_envsys_conf_files() {
67	cat << ENV0 > env0.conf
68	swsensor {
69		refresh-timeout = 2s;
70	}
71ENV0
72	cat << ENV1 > env1.conf
73	swsensor {
74		sensor0 { critical-min = $(( $1 - $2 )); }
75	}
76ENV1
77	cat << ENV2 > env2.conf
78	swsensor {
79		sensor0 { critical-min = $1; }
80	}
81ENV2
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
91common_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 5
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
254atf_test_case simple_sensor cleanup
255simple_sensor_head() {
256	common_head "Test a simple sensor"
257}
258
259simple_sensor_body() {
260	common_body 0 50 30 10 1
261}
262
263simple_sensor_cleanup() {
264	common_cleanup
265}
266
267atf_test_case limit_sensor cleanup
268limit_sensor_head() {
269	common_head "Test a sensor with internal limit"
270}
271
272limit_sensor_body() {
273	common_body 1 45 25 8 2
274}
275
276limit_sensor_cleanup() {
277	common_cleanup
278}
279
280atf_test_case alarm_sensor cleanup
281alarm_sensor_head() {
282	common_head "Test a sensor with internal checking"
283}
284
285alarm_sensor_body() {
286	common_body 2 40 20 6 3
287}
288
289alarm_sensor_cleanup() {
290	common_cleanup
291}
292
293atf_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