538 lines · 11.3 KB · Shell
RawDownload
#!/bin/bash# daemon operations# SPDX-License-Identifier: GPL-2.0 check_line_first(){	local line=$1	local name=$2	local base=$3	local output=$4	local lock=$5	local up=$6 	local line_name	line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'`	local line_base	line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'`	local line_output	line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'`	local line_lock	line_lock=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'`	local line_up	line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'` 	if [ "${name}" != "${line_name}" ]; then		echo "FAILED: wrong name"		error=1	fi 	if [ "${base}" != "${line_base}" ]; then		echo "FAILED: wrong base"		error=1	fi 	if [ "${output}" != "${line_output}" ]; then		echo "FAILED: wrong output"		error=1	fi 	if [ "${lock}" != "${line_lock}" ]; then		echo "FAILED: wrong lock"		error=1	fi 	if [ "${up}" != "${line_up}" ]; then		echo "FAILED: wrong up"		error=1	fi} check_line_other(){	local line=$1	local name=$2	local run=$3	local base=$4	local output=$5	local control=$6	local ack=$7	local up=$8 	local line_name	line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'`	local line_run	line_run=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'`	local line_base	line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'`	local line_output	line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'`	local line_control	line_control=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'`	local line_ack	line_ack=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $7 }'`	local line_up	line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $8 }'` 	if [ "${name}" != "${line_name}" ]; then		echo "FAILED: wrong name"		error=1	fi 	if [ "${run}" != "${line_run}" ]; then		echo "FAILED: wrong run"		error=1	fi 	if [ "${base}" != "${line_base}" ]; then		echo "FAILED: wrong base"		error=1	fi 	if [ "${output}" != "${line_output}" ]; then		echo "FAILED: wrong output"		error=1	fi 	if [ "${control}" != "${line_control}" ]; then		echo "FAILED: wrong control"		error=1	fi 	if [ "${ack}" != "${line_ack}" ]; then		echo "FAILED: wrong ack"		error=1	fi 	if [ "${up}" != "${line_up}" ]; then		echo "FAILED: wrong up"		error=1	fi} daemon_exit(){	local config=$1 	local line	line=`perf daemon --config ${config} -x: | head -1`	local pid	pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'` 	# Reset trap handler.	trap - SIGINT SIGTERM 	# stop daemon	perf daemon stop --config ${config} 	# ... and wait for the pid to go away	tail --pid=${pid} -f /dev/null} daemon_start(){	local config=$1	local session=$2 	perf daemon start --config ${config} 	# Clean up daemon if interrupted.	trap 'echo "FAILED: Signal caught"; daemon_exit "${config}"; exit 1' SIGINT SIGTERM 	# wait for the session to ping	local state="FAIL"	local retries=0	while [ "${state}" != "OK" ]; do		state=`perf daemon ping --config ${config} --session ${session} | awk '{ print $1 }'`		sleep 0.05		retries=$((${retries} +1))		if [ ${retries} -ge 600 ]; then			echo "FAILED: Timeout waiting for daemon to ping"			daemon_exit ${config}			exit 1		fi	done} test_list(){	echo "test daemon list" 	local config	config=$(mktemp /tmp/perf.daemon.config.XXX)	local base	base=$(mktemp -d /tmp/perf.daemon.base.XXX) 	cat <<EOF > ${config}[daemon]base=BASE [session-size]run = -e cpu-clock -m 1 sleep 10 [session-time]run = -e task-clock -m 1 sleep 10EOF 	sed -i -e "s|BASE|${base}|" ${config} 	# start daemon	daemon_start ${config} size 	# check first line	# pid:daemon:base:base/output:base/lock	local line	line=`perf daemon --config ${config} -x: | head -1`	check_line_first ${line} daemon ${base} ${base}/output ${base}/lock "0" 	# check 1st session	# pid:size:-e cpu-clock:base/size:base/size/output:base/size/control:base/size/ack:0	local line	line=`perf daemon --config ${config} -x: | head -2 | tail -1`	check_line_other "${line}" size "-e cpu-clock -m 1 sleep 10" ${base}/session-size \			 ${base}/session-size/output ${base}/session-size/control \			 ${base}/session-size/ack "0" 	# check 2nd session	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0	local line	line=`perf daemon --config ${config} -x: | head -3 | tail -1`	check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \			 ${base}/session-time/output ${base}/session-time/control \			 ${base}/session-time/ack "0" 	# stop daemon	daemon_exit ${config} 	rm -rf ${base}	rm -f ${config}} test_reconfig(){	echo "test daemon reconfig" 	local config	config=$(mktemp /tmp/perf.daemon.config.XXX)	local base	base=$(mktemp -d /tmp/perf.daemon.base.XXX) 	# prepare config	cat <<EOF > ${config}[daemon]base=BASE [session-size]run = -e cpu-clock -m 1 sleep 10 [session-time]run = -e task-clock -m 1 sleep 10EOF 	sed -i -e "s|BASE|${base}|" ${config} 	# start daemon	daemon_start ${config} size 	# check 2nd session	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0	local line	line=`perf daemon --config ${config} -x: | head -3 | tail -1`	check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \			 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0"	local pid	pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'` 	# prepare new config	local config_new=${config}.new	cat <<EOF > ${config_new}[daemon]base=BASE [session-size]run = -e cpu-clock -m 1 sleep 10 [session-time]run = -e cpu-clock -m 1 sleep 10EOF 	# TEST 1 - change config 	sed -i -e "s|BASE|${base}|" ${config_new}	cp ${config_new} ${config} 	# wait for old session to finish	tail --pid=${pid} -f /dev/null 	# wait for new one to start	local state="FAIL"	while [ "${state}" != "OK" ]; do		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`	done 	# check reconfigured 2nd session	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0	local line	line=`perf daemon --config ${config} -x: | head -3 | tail -1`	check_line_other "${line}" time "-e cpu-clock -m 1 sleep 10" ${base}/session-time \			 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0" 	# TEST 2 - empty config 	local config_empty=${config}.empty	cat <<EOF > ${config_empty}[daemon]base=BASEEOF 	# change config	sed -i -e "s|BASE|${base}|" ${config_empty}	cp ${config_empty} ${config} 	# wait for sessions to finish	local state="OK"	while [ "${state}" != "FAIL" ]; do		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`	done 	local state="OK"	while [ "${state}" != "FAIL" ]; do		state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`	done 	local one	one=`perf daemon --config ${config} -x: | wc -l` 	if [ ${one} -ne "1" ]; then		echo "FAILED: wrong list output"		error=1	fi 	# TEST 3 - config again 	cp ${config_new} ${config} 	# wait for size to start	local state="FAIL"	while [ "${state}" != "OK" ]; do		state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`	done 	# wait for time to start	local state="FAIL"	while [ "${state}" != "OK" ]; do		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`	done 	# stop daemon	daemon_exit ${config} 	rm -rf ${base}	rm -f ${config}	rm -f ${config_new}	rm -f ${config_empty}} test_stop(){	echo "test daemon stop" 	local config	config=$(mktemp /tmp/perf.daemon.config.XXX)	local base	base=$(mktemp -d /tmp/perf.daemon.base.XXX) 	# prepare config	cat <<EOF > ${config}[daemon]base=BASE [session-size]run = -e cpu-clock -m 1 sleep 10 [session-time]run = -e task-clock -m 1 sleep 10EOF 	sed -i -e "s|BASE|${base}|" ${config} 	# start daemon	daemon_start ${config} size 	local pid_size	pid_size=`perf daemon --config ${config} -x: | head -2 | tail -1 |		  awk 'BEGIN { FS = ":" } ; { print $1 }'`	local pid_time	pid_time=`perf daemon --config ${config} -x: | head -3 | tail -1 |		  awk 'BEGIN { FS = ":" } ; { print $1 }'` 	# check that sessions are running	if [ ! -d "/proc/${pid_size}" ]; then		echo "FAILED: session size not up"	fi 	if [ ! -d "/proc/${pid_time}" ]; then		echo "FAILED: session time not up"	fi 	# stop daemon	daemon_exit ${config} 	# check that sessions are gone	if [ -d "/proc/${pid_size}" ]; then		echo "FAILED: session size still up"	fi 	if [ -d "/proc/${pid_time}" ]; then		echo "FAILED: session time still up"	fi 	rm -rf ${base}	rm -f ${config}} test_signal(){	echo "test daemon signal" 	local config	config=$(mktemp /tmp/perf.daemon.config.XXX)	local base	base=$(mktemp -d /tmp/perf.daemon.base.XXX) 	# prepare config	cat <<EOF > ${config}[daemon]base=BASE [session-test]run = -e cpu-clock --switch-output -m 1 sleep 10EOF 	sed -i -e "s|BASE|${base}|" ${config} 	# start daemon	daemon_start ${config} test         # send 2 signals then exit. Do this in a loop watching the number of        # files to avoid races. If the loop retries more than 600 times then        # give up.	local retries=0	local signals=0	local success=0	while [ ${retries} -lt 600 ] && [ ${success} -eq 0 ]; do		local files		files=`ls ${base}/session-test/*perf.data* 2> /dev/null | wc -l`		if [ ${signals} -eq 0 ]; then			perf daemon signal --config ${config} --session test			signals=1		elif [ ${signals} -eq 1 ] && [ $files -ge 1 ]; then			perf daemon signal --config ${config}			signals=2		elif [ ${signals} -eq 2 ] && [ $files -ge 2 ]; then			daemon_exit ${config}			signals=3		elif [ ${signals} -eq 3 ] && [ $files -ge 3 ]; then			success=1		fi		retries=$((${retries} +1))	done	if [ ${success} -eq 0 ]; then		error=1		echo "FAILED: perf data no generated"	fi 	rm -rf ${base}	rm -f ${config}} test_ping(){	echo "test daemon ping" 	local config	config=$(mktemp /tmp/perf.daemon.config.XXX)	local base	base=$(mktemp -d /tmp/perf.daemon.base.XXX) 	# prepare config	cat <<EOF > ${config}[daemon]base=BASE [session-size]run = -e cpu-clock -m 1 sleep 10 [session-time]run = -e task-clock -m 1 sleep 10EOF 	sed -i -e "s|BASE|${base}|" ${config} 	# start daemon	daemon_start ${config} size 	size=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`	type=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` 	if [ ${size} != "OK" ] || [ ${type} != "OK" ]; then		error=1		echo "FAILED: daemon ping failed"	fi 	# stop daemon	daemon_exit ${config} 	rm -rf ${base}	rm -f ${config}} test_lock(){	echo "test daemon lock" 	local config	config=$(mktemp /tmp/perf.daemon.config.XXX)	local base	base=$(mktemp -d /tmp/perf.daemon.base.XXX) 	# prepare config	cat <<EOF > ${config}

Lines 1–500 of 538.