Home | History | Annotate | Line # | Download | only in sysmon
t_swsensor.sh revision 1.10
      1 # $NetBSD: t_swsensor.sh,v 1.10 2020/03/19 20:10:49 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 	local v
     10 	v=$(get_sensor_info | grep -A1 $1 | grep integer | \
     11 	    sed -e 's;<[/a-z]*>;;g')
     12 	if [ -z "$v" ] ; then
     13 		v="key_$1_not_found"
     14 	fi
     15 	echo $v
     16 }
     17 
     18 get_powerd_event_count() {
     19 	grep "not running" powerd.log | wc -l
     20 }
     21 
     22 get_rnd_bits_count() {
     23 	env RUMPHIJACK=blanket=/dev/random:/dev/urandom	\
     24 	    RUMP_SERVER=unix://t_swsensor_socket	\
     25 	    LD_PRELOAD=/usr/lib/librumphijack.so	  rndctl -l | \
     26 	grep "swsensor-sensor" | \
     27 	awk '{print $2}'
     28 }
     29 
     30 check_powerd_event() {
     31 	event=$(grep "not running" powerd.log | \
     32 		sed -e "$1p" -e "d" )
     33 	event=${event##*//}
     34 	script=${event%% *}
     35 	event=${event#* }
     36 	device=${event%% *}
     37 	event=${event#* }
     38 	state=${event%% *}
     39 	sensor=${event#* }
     40 	sensor=${sensor% *}
     41 
     42 	if [ "${script}" != "sensor_indicator" ] ; then
     43 		echo "Event uses wrong script: ${script}"
     44 	elif [ "${device}" != "swsensor" ] ; then
     45 		echo "Event uses wrong device: ${device}"
     46 	elif [ "${sensor}" != "sensor" ] ; then
     47 		echo "Event uses wrong sensor: ${sensor}"
     48 	elif [ "${state}" != "$2" ] ; then
     49 		echo "Event uses wrong state: ${state}"
     50 	fi
     51 }
     52 
     53 # Start the rump server, then load the swsensor module with the
     54 # requested properties
     55 
     56 start_rump() {
     57 	rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER}
     58 	if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then
     59 		rump.modunload swsensor
     60 		rump.modload -f $1 swsensor
     61 	else
     62 		rump.modload $1 swsensor
     63 	fi
     64 	return $?
     65 }
     66 
     67 common_head() {
     68 	atf_set	descr		"$1"
     69 	atf_set	timeout		120
     70 	atf_set	require.progs	rump.powerd rump.envstat rump.modload	\
     71 				rump.halt   rump.sysctl  rump_server	\
     72 				sed         grep         awk		\
     73 				rndctl      expr
     74 }
     75 
     76 common_cleanup() {
     77 	rump.modunload swsensor
     78 	rump.halt
     79 }
     80 
     81 create_envsys_conf_files() {
     82 	cat << ENV0 > env0.conf
     83 	swsensor {
     84 		refresh-timeout = 2s;
     85 	}
     86 ENV0
     87 	cat << ENV1 > env1.conf
     88 	swsensor {
     89 		sensor0 { critical-min = $(( $1 - $2 )); }
     90 	}
     91 ENV1
     92 	cat << ENV2 > env2.conf
     93 	swsensor {
     94 		sensor0 { critical-min = $1; }
     95 	}
     96 ENV2
     97 }
     98 
     99 # Test body common to all sensors
    100 #	$1	sensor mode
    101 #	$2	initial sensor value
    102 #	$3	initial limit
    103 #	$4	amount to lower limit
    104 #	$5	difference from limit to trigger event
    105 #	$6	sensor flags, for FHAS_ENTROPY and FMONNOTSUPP
    106 
    107 common_body() {
    108 	# Start the rump-server process and load the module
    109 	modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}"
    110 	start_rump "$modload_args"
    111 
    112 	# create configuration files for updates
    113 	create_envsys_conf_files $3 $4
    114 
    115 	if [ $? -ne 0 ] ; then
    116 		atf_skip "Cannot set-up rump environment"
    117 	fi
    118 
    119 	# start powerd so we can detect sensor events
    120 	rump.powerd -n -d > powerd.log 2>&1 &
    121 	if [ -z "$(jobs)" ] ; then
    122 		skip_events=1
    123 		echo "Skipping event sub-tests - powerd did not start"
    124 	else
    125 		skip_events=0
    126 		expected_event=1
    127 	fi
    128 
    129 	# Step 0 - verify that sensor is registered
    130 	get_sensor_info | grep -q swsensor ||
    131 		atf_fail "0: Device swsensor not registered"
    132 
    133 	# Step 1 - update the refresh-timeout and verify
    134 	# (use $(( ... )) since the timeout is displayed in hex!)
    135 	rump.envstat -c env0.conf
    136 	if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then
    137 		atf_fail "1: Could not set refresh-timout to 2s"
    138 	fi
    139 
    140 	# Step 2 - verify that we can read sensor's value
    141 	if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then
    142 		atf_fail "2: Value not available"
    143 	fi
    144 
    145 	# Step 3 - verify that changes in sensor value are seen
    146 	rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 ))
    147 	if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then
    148 		atf_expect_fail "PR kern/55088"
    149 		atf_fail "3: Value not updated"
    150 	fi
    151 
    152 	# Step 4 - if sensor provides hw limit, make sure we can read it
    153 	if [ $1 -ne 0 ] ; then
    154 		if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
    155 			atf_fail "4: Limit not set by device"
    156 		fi
    157 	fi
    158 
    159 	# Step 5 - if sensor provides hw limit, make sure it works
    160 	if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
    161 		rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 ))
    162 		sleep 5
    163 		cnt=$(get_powerd_event_count)
    164 		if [ ${cnt} -lt ${expected_event} ] ; then
    165 			atf_fail "5: No event triggered"
    166 		elif [ ${cnt} -gt ${expected_event} ] ; then
    167 			atf_fail "5: Multiple events triggered"
    168 		fi
    169 		evt=$( check_powerd_event ${cnt} "critical-under")
    170 		if [ -n "${evt}" ] ; then
    171 			atf_fail "5: ${evt}"
    172 		fi
    173 		expected_event=$(( 1 + ${expected_event} ))
    174 	fi
    175 
    176 	# Step 6 - verify that we return to normal state
    177 	if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
    178 		rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 ))
    179 		sleep 5
    180 		cnt=$(get_powerd_event_count)
    181 		if [ ${cnt} -lt ${expected_event} ] ; then
    182 			atf_fail "6: No event triggered"
    183 		elif [ ${cnt} -gt ${expected_event} ] ; then
    184 			atf_fail "6: Multiple events triggered"
    185 		fi
    186 		evt=$( check_powerd_event ${cnt} "normal")
    187 		if [ -n "${evt}" ] ; then
    188 			atf_fail "6: ${evt}"
    189 		fi
    190 		expected_event=$(( 1 + ${expected_event} ))
    191 	fi
    192 
    193 	# Step 7 - verify that we can set our own limit
    194 
    195 	# Steps 7 thru 12 are skipped if the sensor cannot be monitored
    196 	if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then
    197 		rump.envstat -c env1.conf
    198 		if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
    199 			atf_fail "7: Limit not set by envstat -c"
    200 		fi
    201 
    202 	# Step 8 - make sure user-set limit works
    203 		if [ ${skip_events} -eq 0 ] ; then
    204 			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
    205 			sleep 5
    206 			cnt=$(get_powerd_event_count)
    207 			if [ ${cnt} -lt ${expected_event} ] ; then
    208 				atf_fail "8: No event triggered"
    209 			elif [ ${cnt} -gt ${expected_event} ] ; then
    210 				atf_fail "8: Multiple events triggered"
    211 			fi
    212 			evt=$( check_powerd_event ${cnt} "critical-under")
    213 			if [ -n "${evt}" ] ; then
    214 				atf_fail "8: ${evt}"
    215 			fi
    216 			expected_event=$(( 1 + ${expected_event} ))
    217 		fi
    218 
    219 	# Step 9 - verify that we return to normal state
    220 		if [ ${skip_events} -eq 0 ] ; then
    221 			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 ))
    222 			sleep 5
    223 			cnt=$(get_powerd_event_count)
    224 			if [ ${cnt} -lt ${expected_event} ] ; then
    225 				atf_fail "9: No event triggered"
    226 			elif [ ${cnt} -gt ${expected_event} ] ; then
    227 				atf_fail "9: Multiple events triggered"
    228 			fi
    229 			evt=$( check_powerd_event ${cnt} "normal")
    230 			if [ -n "${evt}" ] ; then
    231 				atf_fail "9: ${evt}"
    232 			fi
    233 			expected_event=$(( 1 + ${expected_event} ))
    234 		fi
    235 
    236 	# Step 10 - reset to defaults
    237 		rump.envstat -S
    238 		if [ $1 -eq 0 ] ; then
    239 			get_sensor_info | grep -q critical-min &&
    240 				atf_fail "10: Failed to clear a limit with envstat -S"
    241 		else
    242 			if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
    243 				atf_fail "10: Limit not reset to initial value"
    244 			fi
    245 		fi
    246 
    247 	# Step 11 - see if more events occur
    248 		if [ ${skip_events} -eq 0 ] ; then
    249 			rump.envstat -c env0.conf
    250 			rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
    251 			sleep 5
    252 			cnt=$(get_powerd_event_count)
    253 			if [ ${cnt} -ge ${expected_event} ] ; then
    254 				if [ $1 -ne 2 ] ; then
    255 					atf_fail "11b Event triggered after reset"
    256 				fi
    257 				evt=$( check_powerd_event ${cnt} "critical-under")
    258 				if [ -n "${evt}" ] ; then
    259 					atf_fail "11a: ${evt}"
    260 				fi
    261 			fi
    262 		fi
    263 
    264 	# Step 12 - make sure we can set new limits once more
    265 		rump.envstat -c env2.conf
    266 		if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
    267 			atf_fail "12a: Limit not reset to same value"
    268 		fi
    269 		rump.envstat -c env1.conf
    270 		if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
    271 			atf_fail "12b: Limit not reset to new value"
    272 		fi
    273 	fi
    274 
    275 	# Step 13 - confirm registration (or lack thereof) with rndctl
    276 	rnd_bits=$( get_rnd_bits_count )
    277 	if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then
    278 		if [ -z "$rnd_bits" ] ; then
    279 			atf_fail "13a: Not registered with rndctl"
    280 		fi
    281 	else
    282 		if [ -n "$rnd_bits" ] ; then
    283 			atf_fail "13b: Wrongly registered with rndctl"
    284 		fi
    285 	fi
    286 
    287 	# Steps 14 and 15 are only if sensor is providing entropy
    288 	if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then
    289 		return
    290 	fi
    291 
    292 	# Step 14 - make sure entropy collected when device is being polled
    293 	rump.envstat -c env0.conf
    294 	rump.sysctl -w hw.swsensor.cur_value=$3
    295 	sleep 5
    296 	rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
    297 	sleep 5
    298 	new_rnd_bits=$( get_rnd_bits_count )
    299 	if [ $new_rnd_bits -le $rnd_bits ] ; then
    300 		atf_expect_fail "PR kern/47661"
    301 		atf_fail "14a: entropy bits did not increase after polling"
    302 	fi
    303 	rnd_bits=$new_rnd_bits
    304 	sleep 5
    305 	new_rnd_bits=$( get_rnd_bits_count )
    306 	if [ $new_rnd_bits -gt $rnd_bits ] ; then
    307 		atf_expect_fail "PR kern/47661"
    308 		atf_fail "14b: entropy bits increased after poll with no value change"
    309 	fi
    310 
    311 	# Step 15 - make sure entropy collected when device is interrogated
    312 	# 
    313 	rump.envstat -c env0.conf
    314 	rump.sysctl -w hw.swsensor.cur_value=$3
    315 	get_sensor_key cur-value
    316 	rnd_bits=$( get_rnd_bits_count )
    317 	rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
    318 	get_sensor_key cur-value
    319 	new_rnd_bits=$( get_rnd_bits_count )
    320 	if [ $new_rnd_bits -le $rnd_bits ] ; then
    321 		atf_expect_fail "PR kern/47661"
    322 		atf_fail "15a: entropy bits did not increase after interrogation"
    323 	fi
    324 	rnd_bits=$new_rnd_bits
    325 	get_sensor_key cur-value
    326 	new_rnd_bits=$( get_rnd_bits_count )
    327 	if [ $new_rnd_bits -gt $rnd_bits ] ; then
    328 		atf_expect_fail "PR kern/47661"
    329 		atf_fail "15b: entropy bits increased after interrogation with no value change"
    330 	fi
    331 }
    332 
    333 atf_test_case simple_sensor cleanup
    334 simple_sensor_head() {
    335 	common_head "Test a simple sensor"
    336 }
    337 
    338 simple_sensor_body() {
    339 	common_body 0 50 30 10 1
    340 }
    341 
    342 simple_sensor_cleanup() {
    343 	common_cleanup
    344 }
    345 
    346 atf_test_case limit_sensor cleanup
    347 limit_sensor_head() {
    348 	common_head "Test a sensor with internal limit"
    349 }
    350 
    351 limit_sensor_body() {
    352 	common_body 1 45 25 8 2
    353 }
    354 
    355 limit_sensor_cleanup() {
    356 	common_cleanup
    357 }
    358 
    359 atf_test_case alarm_sensor cleanup
    360 alarm_sensor_head() {
    361 	common_head "Test a sensor with internal checking"
    362 }
    363 
    364 alarm_sensor_body() {
    365 	common_body 2 40 20 6 3
    366 }
    367 
    368 alarm_sensor_cleanup() {
    369 	common_cleanup
    370 }
    371 
    372 atf_test_case entropy_polled_sensor cleanup
    373 entropy_polled_sensor_head() {
    374 	common_head "Test a simple sensor that provides entropy"
    375 }
    376 
    377 entropy_polled_sensor_body() {
    378 	common_body 0 50 30 10 1 8192
    379 }
    380 
    381 entropy_polled_sensor_cleanup() {
    382 	common_cleanup
    383 }
    384 
    385 atf_test_case entropy_interrupt_sensor cleanup
    386 entropy_interrupt_sensor_head() {
    387 	common_head "Test a sensor that provides entropy without polling"
    388 }
    389 
    390 entropy_interrupt_sensor_body() {
    391 	common_body 0 50 30 10 1 10240
    392 }
    393 
    394 entropy_interrupt_sensor_cleanup() {
    395 	common_cleanup
    396 }
    397 
    398 atf_init_test_cases() {
    399 	RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER
    400 	atf_add_test_case simple_sensor
    401 	atf_add_test_case limit_sensor
    402 	atf_add_test_case alarm_sensor
    403 	atf_add_test_case entropy_polled_sensor
    404 	atf_add_test_case entropy_interrupt_sensor
    405 }
    406