t_swsensor.sh revision 303975
118334Speter# $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $
290075Sobrien
3169689Skanget_sensor_info() {
418334Speter	rump.envstat -x | \
590075Sobrien	sed -e "\;swsensor;,\;/array;p" -e "d"
618334Speter}
790075Sobrien
890075Sobrienget_sensor_key() {
990075Sobrien	get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g'
1090075Sobrien}
1118334Speter
1290075Sobrienget_powerd_event_count() {
1390075Sobrien	grep "not running" powerd.log | wc -l
1490075Sobrien}
1590075Sobrien
1618334Speterget_rnd_bits_count() {
1790075Sobrien	env RUMPHIJACK=blanket=/dev/random:/dev/urandom	\
1890075Sobrien	    RUMP_SERVER=unix://t_swsensor_socket	\
19169689Skan	    LD_PRELOAD=/usr/lib/librumphijack.so	  rndctl -l | \
20169689Skan	grep "swsensor-sensor" | \
2118334Speter	awk '{print $2}'
2218334Speter}
2390075Sobrien
2490075Sobriencheck_powerd_event() {
2590075Sobrien	event=$(grep "not running" powerd.log | \
2690075Sobrien		sed -e "$1p" -e "d" )
2718334Speter	event=${event##*//}
2890075Sobrien	script=${event%% *}
2990075Sobrien	event=${event#* }
3090075Sobrien	device=${event%% *}
3190075Sobrien	event=${event#* }
3290075Sobrien	state=${event%% *}
3390075Sobrien	sensor=${event#* }
3418334Speter	sensor=${sensor% *}
3590075Sobrien
3690075Sobrien	if [ "${script}" != "sensor_indicator" ] ; then
3718334Speter		echo "Event uses wrong script: ${script}"
3818334Speter	elif [ "${device}" != "swsensor" ] ; then
3918334Speter		echo "Event uses wrong device: ${device}"
4018334Speter	elif [ "${sensor}" != "sensor" ] ; then
4190075Sobrien		echo "Event uses wrong sensor: ${sensor}"
4290075Sobrien	elif [ "${state}" != "$2" ] ; then
4318334Speter		echo "Event uses wrong state: ${state}"
4490075Sobrien	fi
4590075Sobrien}
46117395Skan
4718334Speter# Start the rump server, then load the swsensor module with the
4890075Sobrien# requested properties
4990075Sobrien
50117395Skanstart_rump() {
5190075Sobrien	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
5450397Sobrien		rump.modload -f $1 swsensor
55132718Skan	else
56132718Skan		rump.modload $1 swsensor
5718334Speter	fi
5890075Sobrien	return $?
5990075Sobrien}
6018334Speter
6152284Sobriencommon_head() {
6252284Sobrien	atf_set	descr		"$1"
6352284Sobrien	atf_set	timeout		60
6490075Sobrien	atf_set	require.progs	rump.powerd rump.envstat rump.modload	\
65132718Skan				rump.halt   rump.sysctl  rump_server	\
6690075Sobrien				sed         grep         awk		\
6718334Speter				rndctl      expr
6890075Sobrien}
6990075Sobrien
7090075Sobriencommon_cleanup() {
7190075Sobrien	rump.modunload swsensor
7290075Sobrien	rump.halt
7318334Speter}
7490075Sobrien
7590075Sobriencreate_envsys_conf_files() {
7690075Sobrien	cat << ENV0 > env0.conf
7718334Speter	swsensor {
7890075Sobrien		refresh-timeout = 2s;
7990075Sobrien	}
8090075SobrienENV0
8190075Sobrien	cat << ENV1 > env1.conf
8218334Speter	swsensor {
8390075Sobrien		sensor0 { critical-min = $(( $1 - $2 )); }
8490075Sobrien	}
8590075SobrienENV1
86169689Skan	cat << ENV2 > env2.conf
8790075Sobrien	swsensor {
8890075Sobrien		sensor0 { critical-min = $1; }
89169689Skan	}
9090075SobrienENV2
9190075Sobrien}
9290075Sobrien
9318334Speter# Test body common to all sensors
9490075Sobrien#	$1	sensor mode
9590075Sobrien#	$2	initial sensor value
96169689Skan#	$3	initial limit
9790075Sobrien#	$4	amount to lower limit
9890075Sobrien#	$5	difference from limit to trigger event
9990075Sobrien#	$6	sensor flags, for FHAS_ENTROPY and FMONNOTSUPP
10090075Sobrien
10190075Sobriencommon_body() {
10290075Sobrien	# Start the rump-server process and load the module
103169689Skan	modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}"
104169689Skan	start_rump "$modload_args"
10590075Sobrien
10690075Sobrien	# create configuration files for updates
10790075Sobrien	create_envsys_conf_files $3 $4
10890075Sobrien
10990075Sobrien	if [ $? -ne 0 ] ; then
11090075Sobrien		atf_skip "Cannot set-up rump environment"
11190075Sobrien	fi
11290075Sobrien
11390075Sobrien	# start powerd so we can detect sensor events
11490075Sobrien	rump.powerd -n -d > powerd.log 2>&1 &
11590075Sobrien	if [ -z "$(jobs)" ] ; then
11690075Sobrien		skip_events=1
11790075Sobrien		echo "Skipping event sub-tests - powerd did not start"
11890075Sobrien	else
11990075Sobrien		skip_events=0
12090075Sobrien		expected_event=1
12190075Sobrien	fi
12290075Sobrien
12390075Sobrien	# Step 0 - verify that sensor is registered
12418334Speter	get_sensor_info | grep -q swsensor ||
12518334Speter		atf_fail "0: Device swsensor not registered"
12690075Sobrien
12790075Sobrien	# Step 1 - update the refresh-timeout and verify
12890075Sobrien	# (use $(( ... )) since the timeout is displayed in hex!)
12990075Sobrien	rump.envstat -c env0.conf
13090075Sobrien	if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then
13190075Sobrien		atf_fail "1: Could not set refresh-timout to 2s"
13290075Sobrien	fi
13390075Sobrien
13490075Sobrien	# Step 2 - verify that we can read sensor's value
13590075Sobrien	if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then
13618334Speter		atf_fail "2: Value not available"
13718334Speter	fi
13890075Sobrien
13918334Speter	# Step 3 - verify that changes in sensor value are seen
14018334Speter	rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 ))
14190075Sobrien	if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then
14218334Speter		atf_fail "3: Value not updated"
14318334Speter	fi
14418334Speter
14590075Sobrien	# Step 4 - if sensor provides hw limit, make sure we can read it
14690075Sobrien	if [ $1 -ne 0 ] ; then
14790075Sobrien		if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
14818334Speter			atf_fail "4: Limit not set by device"
14990075Sobrien		fi
15090075Sobrien	fi
15190075Sobrien
15218334Speter	# Step 5 - if sensor provides hw limit, make sure it works
15390075Sobrien	if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
15490075Sobrien		rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 ))
15518334Speter		sleep 5
15618334Speter		cnt=$(get_powerd_event_count)
15718334Speter		if [ ${cnt} -lt ${expected_event} ] ; then
15818334Speter			atf_fail "5: No event triggered"
15918334Speter		elif [ ${cnt} -gt ${expected_event} ] ; then
16018334Speter			atf_fail "5: Multiple events triggered"
16118334Speter		fi
16218334Speter		evt=$( check_powerd_event ${cnt} "critical-under")
16318334Speter		if [ -n "${evt}" ] ; then
16418334Speter			atf_fail "5: ${evt}"
16518334Speter		fi
16618334Speter		expected_event=$(( 1 + ${expected_event} ))
16790075Sobrien	fi
16890075Sobrien
16990075Sobrien	# Step 6 - verify that we return to normal state
17090075Sobrien	if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
17190075Sobrien		rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 ))
17290075Sobrien		sleep 5
17318334Speter		cnt=$(get_powerd_event_count)
174169689Skan		if [ ${cnt} -lt ${expected_event} ] ; then
17518334Speter			atf_fail "6: No event triggered"
176169689Skan		elif [ ${cnt} -gt ${expected_event} ] ; then
177169689Skan			atf_fail "6: Multiple events triggered"
178169689Skan		fi
179169689Skan		evt=$( check_powerd_event ${cnt} "normal")
180169689Skan		if [ -n "${evt}" ] ; then
181169689Skan			atf_fail "6: ${evt}"
182169689Skan		fi
183169689Skan		expected_event=$(( 1 + ${expected_event} ))
184169689Skan	fi
185169689Skan
186169689Skan	# Step 7 - verify that we can set our own limit
187169689Skan
188169689Skan	# Steps 7 thru 12 are skipped if the sensor cannot be monitored
189169689Skan	if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then
190169689Skan		rump.envstat -c env1.conf
191169689Skan		if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
192169689Skan			atf_fail "7: Limit not set by envstat -c"
193169689Skan		fi
194169689Skan
195169689Skan	# Step 8 - make sure user-set limit works
196169689Skan		if [ ${skip_events} -eq 0 ] ; then
197169689Skan			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
198169689Skan			sleep 5
199169689Skan			cnt=$(get_powerd_event_count)
200169689Skan			if [ ${cnt} -lt ${expected_event} ] ; then
201169689Skan				atf_fail "8: No event triggered"
202169689Skan			elif [ ${cnt} -gt ${expected_event} ] ; then
203169689Skan				atf_fail "8: Multiple events triggered"
204169689Skan			fi
205169689Skan			evt=$( check_powerd_event ${cnt} "critical-under")
206169689Skan			if [ -n "${evt}" ] ; then
207169689Skan				atf_fail "8: ${evt}"
208169689Skan			fi
209169689Skan			expected_event=$(( 1 + ${expected_event} ))
210169689Skan		fi
211169689Skan
212169689Skan	# Step 9 - verify that we return to normal state
213169689Skan		if [ ${skip_events} -eq 0 ] ; then
214169689Skan			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 ))
215169689Skan			sleep 5
216169689Skan			cnt=$(get_powerd_event_count)
217169689Skan			if [ ${cnt} -lt ${expected_event} ] ; then
218169689Skan				atf_fail "9: No event triggered"
219169689Skan			elif [ ${cnt} -gt ${expected_event} ] ; then
220169689Skan				atf_fail "9: Multiple events triggered"
221169689Skan			fi
222169689Skan			evt=$( check_powerd_event ${cnt} "normal")
223169689Skan			if [ -n "${evt}" ] ; then
224169689Skan				atf_fail "9: ${evt}"
225169689Skan			fi
226169689Skan			expected_event=$(( 1 + ${expected_event} ))
227169689Skan		fi
228169689Skan
229169689Skan	# Step 10 - reset to defaults
230169689Skan		rump.envstat -S
231169689Skan		if [ $1 -eq 0 ] ; then
232169689Skan			get_sensor_info | grep -q critical-min &&
233169689Skan				atf_fail "10: Failed to clear a limit with envstat -S"
23418334Speter		else
235169689Skan			if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
236169689Skan				atf_fail "10: Limit not reset to initial value"
237169689Skan			fi
238169689Skan		fi
23918334Speter
240169689Skan	# Step 11 - see if more events occur
241169689Skan		if [ ${skip_events} -eq 0 ] ; then
242169689Skan			rump.envstat -c env0.conf
243169689Skan			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
244169689Skan			sleep 5
245169689Skan			cnt=$(get_powerd_event_count)
246169689Skan			if [ ${cnt} -ge ${expected_event} ] ; then
247169689Skan				if [ $1 -ne 2 ] ; then
24818334Speter					atf_fail "11b Event triggered after reset"
249169689Skan				fi
250169689Skan				evt=$( check_powerd_event ${cnt} "critical-under")
251169689Skan				if [ -n "${evt}" ] ; then
252169689Skan					atf_fail "11a: ${evt}"
253169689Skan				fi
254169689Skan			fi
255169689Skan		fi
256169689Skan
257169689Skan	# Step 12 - make sure we can set new limits once more
258169689Skan		rump.envstat -c env2.conf
259169689Skan		if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
26090075Sobrien			atf_fail "12a: Limit not reset to same value"
261169689Skan		fi
262169689Skan		rump.envstat -c env1.conf
263169689Skan		if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
264169689Skan			atf_fail "12b: Limit not reset to new value"
265169689Skan		fi
266169689Skan	fi
267169689Skan
268169689Skan	# Step 13 - confirm registration (or lack thereof) with rndctl
269169689Skan	rnd_bits=$( get_rnd_bits_count )
270169689Skan	if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then
27190075Sobrien		if [ -z "$rnd_bits" ] ; then
272169689Skan			atf_fail "13a: Not registered with rndctl"
273169689Skan		fi
274169689Skan	else
275169689Skan		if [ -n "$rnd_bits" ] ; then
276169689Skan			atf_fail "13b: Wrongly registered with rndctl"
277169689Skan		fi
278169689Skan	fi
279169689Skan
280169689Skan	# Steps 14 and 15 are only if sensor is providing entropy
281169689Skan	if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then
282169689Skan		return
283169689Skan	fi
284169689Skan
285169689Skan	# Step 14 - make sure entropy collected when device is being polled
286169689Skan	rump.envstat -c env0.conf
287169689Skan	rump.sysctl -w hw.swsensor.cur_value=$3
288169689Skan	sleep 5
289169689Skan	rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
290169689Skan	sleep 5
291169689Skan	new_rnd_bits=$( get_rnd_bits_count )
292169689Skan	if [ $new_rnd_bits -le $rnd_bits ] ; then
293169689Skan		atf_expect_fail "PR kern/47661"
294169689Skan		atf_fail "14a: entropy bits did not increase after polling"
295169689Skan	fi
296169689Skan	rnd_bits=$new_rnd_bits
297169689Skan	sleep 5
298169689Skan	new_rnd_bits=$( get_rnd_bits_count )
299169689Skan	if [ $new_rnd_bits -gt $rnd_bits ] ; then
300169689Skan		atf_expect_fail "PR kern/47661"
301169689Skan		atf_fail "14b: entropy bits increased after poll with no value change"
302169689Skan	fi
303169689Skan
304169689Skan	# Step 15 - make sure entropy collected when device is interrogated
305169689Skan	# 
306169689Skan	rump.envstat -c env0.conf
307169689Skan	rump.sysctl -w hw.swsensor.cur_value=$3
308169689Skan	get_sensor_key cur-value
309169689Skan	rnd_bits=$( get_rnd_bits_count )
310169689Skan	rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
311169689Skan	get_sensor_key cur-value
312169689Skan	new_rnd_bits=$( get_rnd_bits_count )
313169689Skan	if [ $new_rnd_bits -le $rnd_bits ] ; then
314169689Skan		atf_expect_fail "PR kern/47661"
315169689Skan		atf_fail "15a: entropy bits did not increase after interrogation"
316169689Skan	fi
317169689Skan	rnd_bits=$new_rnd_bits
318169689Skan	get_sensor_key cur-value
319169689Skan	new_rnd_bits=$( get_rnd_bits_count )
320169689Skan	if [ $new_rnd_bits -gt $rnd_bits ] ; then
321169689Skan		atf_expect_fail "PR kern/47661"
322169689Skan		atf_fail "15b: entropy bits increased after interrogation with no value change"
323169689Skan	fi
324169689Skan}
325169689Skan
326169689Skanatf_test_case simple_sensor cleanup
327169689Skansimple_sensor_head() {
328169689Skan	common_head "Test a simple sensor"
329169689Skan}
330169689Skan
331169689Skansimple_sensor_body() {
332169689Skan	common_body 0 50 30 10 1
333169689Skan}
334169689Skan
335169689Skansimple_sensor_cleanup() {
336169689Skan	common_cleanup
337169689Skan}
338169689Skan
339169689Skanatf_test_case limit_sensor cleanup
340169689Skanlimit_sensor_head() {
341169689Skan	common_head "Test a sensor with internal limit"
342169689Skan}
343169689Skan
344169689Skanlimit_sensor_body() {
345169689Skan	common_body 1 45 25 8 2
346169689Skan}
347169689Skan
348169689Skanlimit_sensor_cleanup() {
349169689Skan	common_cleanup
350169689Skan}
351169689Skan
352169689Skanatf_test_case alarm_sensor cleanup
353169689Skanalarm_sensor_head() {
354169689Skan	common_head "Test a sensor with internal checking"
355169689Skan}
356169689Skan
357169689Skanalarm_sensor_body() {
358169689Skan	common_body 2 40 20 6 3
359169689Skan}
360169689Skan
361169689Skanalarm_sensor_cleanup() {
362169689Skan	common_cleanup
363169689Skan}
364169689Skan
365169689Skanatf_test_case entropy_polled_sensor cleanup
366169689Skanentropy_polled_sensor_head() {
367169689Skan	common_head "Test a simple sensor that provides entropy"
368169689Skan}
369169689Skan
370169689Skanentropy_polled_sensor_body() {
371169689Skan	common_body 0 50 30 10 1 8192
372169689Skan}
373169689Skan
374169689Skanentropy_polled_sensor_cleanup() {
375169689Skan	common_cleanup
376169689Skan}
377169689Skan
378169689Skanatf_test_case entropy_interrupt_sensor cleanup
379169689Skanentropy_interrupt_sensor_head() {
380169689Skan	common_head "Test a sensor that provides entropy without polling"
381169689Skan}
382169689Skan
383169689Skanentropy_interrupt_sensor_body() {
384169689Skan	common_body 0 50 30 10 1 10240
385169689Skan}
386169689Skan
387169689Skanentropy_interrupt_sensor_cleanup() {
388169689Skan	common_cleanup
389169689Skan}
390169689Skan
391169689Skanatf_init_test_cases() {
392169689Skan	RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER
393169689Skan	atf_add_test_case simple_sensor
394169689Skan	atf_add_test_case limit_sensor
395169689Skan	atf_add_test_case alarm_sensor
396169689Skan	atf_add_test_case entropy_polled_sensor
397169689Skan	atf_add_test_case entropy_interrupt_sensor
398169689Skan}
399169689Skan