t_swsensor.sh revision 272345
152284Sobrien# $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $
2169689Skan
352284Sobrienget_sensor_info() {
490075Sobrien	rump.envstat -x | \
552284Sobrien	sed -e "\;swsensor;,\;/array;p" -e "d"
652284Sobrien}
790075Sobrien
852284Sobrienget_sensor_key() {
990075Sobrien	get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g'
1090075Sobrien}
1152284Sobrien
1290075Sobrienget_powerd_event_count() {
1390075Sobrien	grep "not running" powerd.log | wc -l
1490075Sobrien}
1590075Sobrien
1690075Sobrienget_rnd_bits_count() {
1752284Sobrien	env RUMPHIJACK=blanket=/dev/random:/dev/urandom	\
18169689Skan	    RUMP_SERVER=unix://t_swsensor_socket	\
19169689Skan	    LD_PRELOAD=/usr/lib/librumphijack.so	  rndctl -l | \
20169689Skan	grep "swsensor-sensor" | \
21169689Skan	awk '{print $2}'
22169689Skan}
23169689Skan
24132718Skancheck_powerd_event() {
25132718Skan	event=$(grep "not running" powerd.log | \
26132718Skan		sed -e "$1p" -e "d" )
27132718Skan	event=${event##*//}
28132718Skan	script=${event%% *}
29132718Skan	event=${event#* }
30132718Skan	device=${event%% *}
31132718Skan	event=${event#* }
32132718Skan	state=${event%% *}
33132718Skan	sensor=${event#* }
34132718Skan	sensor=${sensor% *}
35132718Skan
36132718Skan	if [ "${script}" != "sensor_indicator" ] ; then
37132718Skan		echo "Event uses wrong script: ${script}"
3890075Sobrien	elif [ "${device}" != "swsensor" ] ; then
3990075Sobrien		echo "Event uses wrong device: ${device}"
40132718Skan	elif [ "${sensor}" != "sensor" ] ; then
4196263Sobrien		echo "Event uses wrong sensor: ${sensor}"
42132718Skan	elif [ "${state}" != "$2" ] ; then
4390075Sobrien		echo "Event uses wrong state: ${state}"
4490075Sobrien	fi
45132718Skan}
46132718Skan
47132718Skan# Start the rump server, then load the swsensor module with the
4852284Sobrien# requested properties
49132718Skan
50132718Skanstart_rump() {
51132718Skan	rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER}
5290075Sobrien	if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then
53132718Skan		rump.modunload swsensor
54132718Skan		rump.modload -f $1 swsensor
55132718Skan	else
56132718Skan		rump.modload $1 swsensor
57132718Skan	fi
5890075Sobrien	return $?
5990075Sobrien}
6090075Sobrien
61132718Skancommon_head() {
62132718Skan	atf_set	descr		"$1"
63132718Skan	atf_set	timeout		60
64132718Skan	atf_set	require.progs	rump.powerd rump.envstat rump.modload	\
65132718Skan				rump.halt   rump.sysctl  rump_server	\
6690075Sobrien				sed         grep         awk		\
6790075Sobrien				rndctl      expr
6890075Sobrien}
6990075Sobrien
70132718Skancommon_cleanup() {
7152284Sobrien	rump.modunload swsensor
72132718Skan	rump.halt
73132718Skan}
74132718Skan
75132718Skancreate_envsys_conf_files() {
76132718Skan	cat << ENV0 > env0.conf
77132718Skan	swsensor {
78132718Skan		refresh-timeout = 2s;
7952284Sobrien	}
80132718SkanENV0
8152284Sobrien	cat << ENV1 > env1.conf
82132718Skan	swsensor {
83169689Skan		sensor0 { critical-min = $(( $1 - $2 )); }
84132718Skan	}
85132718SkanENV1
86169689Skan	cat << ENV2 > env2.conf
87169689Skan	swsensor {
88132718Skan		sensor0 { critical-min = $1; }
8952284Sobrien	}
90132718SkanENV2
91132718Skan}
92132718Skan
93132718Skan# Test body common to all sensors
9452284Sobrien#	$1	sensor mode
95132718Skan#	$2	initial sensor value
96132718Skan#	$3	initial limit
9752284Sobrien#	$4	amount to lower limit
98132718Skan#	$5	difference from limit to trigger event
99132718Skan#	$6	sensor flags, for FHAS_ENTROPY and FMONNOTSUPP
100132718Skan
101132718Skancommon_body() {
102132718Skan	# Start the rump-server process and load the module
103132718Skan	modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}"
104132718Skan	start_rump "$modload_args"
105132718Skan
106132718Skan	# create configuration files for updates
107132718Skan	create_envsys_conf_files $3 $4
108132718Skan
109132718Skan	if [ $? -ne 0 ] ; then
110132718Skan		atf_skip "Cannot set-up rump environment"
11152284Sobrien	fi
112132718Skan
113132718Skan	# start powerd so we can detect sensor events
114132718Skan	rump.powerd -n -d > powerd.log 2>&1 &
11552284Sobrien	if [ -z "$(jobs)" ] ; then
116132718Skan		skip_events=1
11752284Sobrien		echo "Skipping event sub-tests - powerd did not start"
11852284Sobrien	else
119169689Skan		skip_events=0
120169689Skan		expected_event=1
121169689Skan	fi
122169689Skan
123169689Skan	# Step 0 - verify that sensor is registered
124169689Skan	get_sensor_info | grep -q swsensor ||
125132718Skan		atf_fail "0: Device swsensor not registered"
12652284Sobrien
127169689Skan	# Step 1 - update the refresh-timeout and verify
128169689Skan	# (use $(( ... )) since the timeout is displayed in hex!)
129169689Skan	rump.envstat -c env0.conf
130169689Skan	if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then
131169689Skan		atf_fail "1: Could not set refresh-timout to 2s"
132169689Skan	fi
133169689Skan
134169689Skan	# Step 2 - verify that we can read sensor's value
135169689Skan	if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then
136169689Skan		atf_fail "2: Value not available"
137169689Skan	fi
138169689Skan
139169689Skan	# Step 3 - verify that changes in sensor value are seen
140169689Skan	rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 ))
141169689Skan	if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then
142169689Skan		atf_fail "3: Value not updated"
143169689Skan	fi
144169689Skan
145169689Skan	# Step 4 - if sensor provides hw limit, make sure we can read it
146169689Skan	if [ $1 -ne 0 ] ; then
147169689Skan		if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
148169689Skan			atf_fail "4: Limit not set by device"
149169689Skan		fi
15090075Sobrien	fi
151
152	# Step 5 - if sensor provides hw limit, make sure it works
153	if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
154		rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 ))
155		sleep 5
156		cnt=$(get_powerd_event_count)
157		if [ ${cnt} -lt ${expected_event} ] ; then
158			atf_fail "5: No event triggered"
159		elif [ ${cnt} -gt ${expected_event} ] ; then
160			atf_fail "5: Multiple events triggered"
161		fi
162		evt=$( check_powerd_event ${cnt} "critical-under")
163		if [ -n "${evt}" ] ; then
164			atf_fail "5: ${evt}"
165		fi
166		expected_event=$(( 1 + ${expected_event} ))
167	fi
168
169	# Step 6 - verify that we return to normal state
170	if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
171		rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 ))
172		sleep 5
173		cnt=$(get_powerd_event_count)
174		if [ ${cnt} -lt ${expected_event} ] ; then
175			atf_fail "6: No event triggered"
176		elif [ ${cnt} -gt ${expected_event} ] ; then
177			atf_fail "6: Multiple events triggered"
178		fi
179		evt=$( check_powerd_event ${cnt} "normal")
180		if [ -n "${evt}" ] ; then
181			atf_fail "6: ${evt}"
182		fi
183		expected_event=$(( 1 + ${expected_event} ))
184	fi
185
186	# Step 7 - verify that we can set our own limit
187
188	# Steps 7 thru 12 are skipped if the sensor cannot be monitored
189	if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then
190		rump.envstat -c env1.conf
191		if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
192			atf_fail "7: Limit not set by envstat -c"
193		fi
194
195	# Step 8 - make sure user-set limit works
196		if [ ${skip_events} -eq 0 ] ; then
197			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
198			sleep 5
199			cnt=$(get_powerd_event_count)
200			if [ ${cnt} -lt ${expected_event} ] ; then
201				atf_fail "8: No event triggered"
202			elif [ ${cnt} -gt ${expected_event} ] ; then
203				atf_fail "8: Multiple events triggered"
204			fi
205			evt=$( check_powerd_event ${cnt} "critical-under")
206			if [ -n "${evt}" ] ; then
207				atf_fail "8: ${evt}"
208			fi
209			expected_event=$(( 1 + ${expected_event} ))
210		fi
211
212	# Step 9 - verify that we return to normal state
213		if [ ${skip_events} -eq 0 ] ; then
214			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 ))
215			sleep 5
216			cnt=$(get_powerd_event_count)
217			if [ ${cnt} -lt ${expected_event} ] ; then
218				atf_fail "9: No event triggered"
219			elif [ ${cnt} -gt ${expected_event} ] ; then
220				atf_fail "9: Multiple events triggered"
221			fi
222			evt=$( check_powerd_event ${cnt} "normal")
223			if [ -n "${evt}" ] ; then
224				atf_fail "9: ${evt}"
225			fi
226			expected_event=$(( 1 + ${expected_event} ))
227		fi
228
229	# Step 10 - reset to defaults
230		rump.envstat -S
231		if [ $1 -eq 0 ] ; then
232			get_sensor_info | grep -q critical-min &&
233				atf_fail "10: Failed to clear a limit with envstat -S"
234		else
235			if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
236				atf_fail "10: Limit not reset to initial value"
237			fi
238		fi
239
240	# Step 11 - see if more events occur
241		if [ ${skip_events} -eq 0 ] ; then
242			rump.envstat -c env0.conf
243			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
244			sleep 5
245			cnt=$(get_powerd_event_count)
246			if [ ${cnt} -ge ${expected_event} ] ; then
247				if [ $1 -ne 2 ] ; then
248					atf_fail "11b Event triggered after reset"
249				fi
250				evt=$( check_powerd_event ${cnt} "critical-under")
251				if [ -n "${evt}" ] ; then
252					atf_fail "11a: ${evt}"
253				fi
254			fi
255		fi
256
257	# Step 12 - make sure we can set new limits once more
258		rump.envstat -c env2.conf
259		if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
260			atf_fail "12a: Limit not reset to same value"
261		fi
262		rump.envstat -c env1.conf
263		if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
264			atf_fail "12b: Limit not reset to new value"
265		fi
266	fi
267
268	# Step 13 - confirm registration (or lack thereof) with rndctl
269	rnd_bits=$( get_rnd_bits_count )
270	if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then
271		if [ -z "$rnd_bits" ] ; then
272			atf_fail "13a: Not registered with rndctl"
273		fi
274	else
275		if [ -n "$rnd_bits" ] ; then
276			atf_fail "13b: Wrongly registered with rndctl"
277		fi
278	fi
279
280	# Steps 14 and 15 are only if sensor is providing entropy
281	if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then
282		return
283	fi
284
285	# Step 14 - make sure entropy collected when device is being polled
286	rump.envstat -c env0.conf
287	rump.sysctl -w hw.swsensor.cur_value=$3
288	sleep 5
289	rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
290	sleep 5
291	new_rnd_bits=$( get_rnd_bits_count )
292	if [ $new_rnd_bits -le $rnd_bits ] ; then
293		atf_expect_fail "PR kern/47661"
294		atf_fail "14a: entropy bits did not increase after polling"
295	fi
296	rnd_bits=$new_rnd_bits
297	sleep 5
298	new_rnd_bits=$( get_rnd_bits_count )
299	if [ $new_rnd_bits -gt $rnd_bits ] ; then
300		atf_expect_fail "PR kern/47661"
301		atf_fail "14b: entropy bits increased after poll with no value change"
302	fi
303
304	# Step 15 - make sure entropy collected when device is interrogated
305	# 
306	rump.envstat -c env0.conf
307	rump.sysctl -w hw.swsensor.cur_value=$3
308	get_sensor_key cur-value
309	rnd_bits=$( get_rnd_bits_count )
310	rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
311	get_sensor_key cur-value
312	new_rnd_bits=$( get_rnd_bits_count )
313	if [ $new_rnd_bits -le $rnd_bits ] ; then
314		atf_expect_fail "PR kern/47661"
315		atf_fail "15a: entropy bits did not increase after interrogation"
316	fi
317	rnd_bits=$new_rnd_bits
318	get_sensor_key cur-value
319	new_rnd_bits=$( get_rnd_bits_count )
320	if [ $new_rnd_bits -gt $rnd_bits ] ; then
321		atf_expect_fail "PR kern/47661"
322		atf_fail "15b: entropy bits increased after interrogation with no value change"
323	fi
324}
325
326atf_test_case simple_sensor cleanup
327simple_sensor_head() {
328	common_head "Test a simple sensor"
329}
330
331simple_sensor_body() {
332	common_body 0 50 30 10 1
333}
334
335simple_sensor_cleanup() {
336	common_cleanup
337}
338
339atf_test_case limit_sensor cleanup
340limit_sensor_head() {
341	common_head "Test a sensor with internal limit"
342}
343
344limit_sensor_body() {
345	common_body 1 45 25 8 2
346}
347
348limit_sensor_cleanup() {
349	common_cleanup
350}
351
352atf_test_case alarm_sensor cleanup
353alarm_sensor_head() {
354	common_head "Test a sensor with internal checking"
355}
356
357alarm_sensor_body() {
358	common_body 2 40 20 6 3
359}
360
361alarm_sensor_cleanup() {
362	common_cleanup
363}
364
365atf_test_case entropy_polled_sensor cleanup
366entropy_polled_sensor_head() {
367	common_head "Test a simple sensor that provides entropy"
368}
369
370entropy_polled_sensor_body() {
371	common_body 0 50 30 10 1 8192
372}
373
374entropy_polled_sensor_cleanup() {
375	common_cleanup
376}
377
378atf_test_case entropy_interrupt_sensor cleanup
379entropy_interrupt_sensor_head() {
380	common_head "Test a sensor that provides entropy without polling"
381}
382
383entropy_interrupt_sensor_body() {
384	common_body 0 50 30 10 1 10240
385}
386
387entropy_interrupt_sensor_cleanup() {
388	common_cleanup
389}
390
391atf_init_test_cases() {
392	RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER
393	atf_add_test_case simple_sensor
394	atf_add_test_case limit_sensor
395	atf_add_test_case alarm_sensor
396	atf_add_test_case entropy_polled_sensor
397	atf_add_test_case entropy_interrupt_sensor
398}
399