Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1#!/bin/bash
  2# daemon operations
  3# SPDX-License-Identifier: GPL-2.0
  4
  5check_line_first()
  6{
  7	local line=$1
  8	local name=$2
  9	local base=$3
 10	local output=$4
 11	local lock=$5
 12	local up=$6
 13
 14	local line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'`
 15	local line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'`
 16	local line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'`
 17	local line_lock=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'`
 18	local line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'`
 19
 20	if [ "${name}" != "${line_name}" ]; then
 21		echo "FAILED: wrong name"
 22		error=1
 23	fi
 24
 25	if [ "${base}" != "${line_base}" ]; then
 26		echo "FAILED: wrong base"
 27		error=1
 28	fi
 29
 30	if [ "${output}" != "${line_output}" ]; then
 31		echo "FAILED: wrong output"
 32		error=1
 33	fi
 34
 35	if [ "${lock}" != "${line_lock}" ]; then
 36		echo "FAILED: wrong lock"
 37		error=1
 38	fi
 39
 40	if [ "${up}" != "${line_up}" ]; then
 41		echo "FAILED: wrong up"
 42		error=1
 43	fi
 44}
 45
 46check_line_other()
 47{
 48	local line=$1
 49	local name=$2
 50	local run=$3
 51	local base=$4
 52	local output=$5
 53	local control=$6
 54	local ack=$7
 55	local up=$8
 56
 57	local line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'`
 58	local line_run=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'`
 59	local line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'`
 60	local line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'`
 61	local line_control=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'`
 62	local line_ack=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $7 }'`
 63	local line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $8 }'`
 64
 65	if [ "${name}" != "${line_name}" ]; then
 66		echo "FAILED: wrong name"
 67		error=1
 68	fi
 69
 70	if [ "${run}" != "${line_run}" ]; then
 71		echo "FAILED: wrong run"
 72		error=1
 73	fi
 74
 75	if [ "${base}" != "${line_base}" ]; then
 76		echo "FAILED: wrong base"
 77		error=1
 78	fi
 79
 80	if [ "${output}" != "${line_output}" ]; then
 81		echo "FAILED: wrong output"
 82		error=1
 83	fi
 84
 85	if [ "${control}" != "${line_control}" ]; then
 86		echo "FAILED: wrong control"
 87		error=1
 88	fi
 89
 90	if [ "${ack}" != "${line_ack}" ]; then
 91		echo "FAILED: wrong ack"
 92		error=1
 93	fi
 94
 95	if [ "${up}" != "${line_up}" ]; then
 96		echo "FAILED: wrong up"
 97		error=1
 98	fi
 99}
100
101daemon_exit()
102{
103	local config=$1
104
105	local line=`perf daemon --config ${config} -x: | head -1`
106	local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'`
107
108	# Reset trap handler.
109	trap - SIGINT SIGTERM
110
111	# stop daemon
112	perf daemon stop --config ${config}
113
114	# ... and wait for the pid to go away
115	tail --pid=${pid} -f /dev/null
116}
117
118daemon_start()
119{
120	local config=$1
121	local session=$2
122
123	perf daemon start --config ${config}
124
125	# Clean up daemon if interrupted.
126	trap "echo 'FAILED: Signal caught'; daemon_exit ${config}; exit 1" SIGINT SIGTERM
127
128	# wait for the session to ping
129	local state="FAIL"
130	local retries=0
131	while [ "${state}" != "OK" ]; do
132		state=`perf daemon ping --config ${config} --session ${session} | awk '{ print $1 }'`
133		sleep 0.05
134		retries=$((${retries} +1))
135		if [ ${retries} -ge 600 ]; then
136			echo "FAILED: Timeout waiting for daemon to ping"
137			daemon_exit ${config}
138			exit 1
139		fi
140	done
141}
142
143test_list()
144{
145	echo "test daemon list"
146
147	local config=$(mktemp /tmp/perf.daemon.config.XXX)
148	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
149
150	cat <<EOF > ${config}
151[daemon]
152base=BASE
153
154[session-size]
155run = -e cpu-clock -m 1 sleep 10
156
157[session-time]
158run = -e task-clock -m 1 sleep 10
159EOF
160
161	sed -i -e "s|BASE|${base}|" ${config}
162
163	# start daemon
164	daemon_start ${config} size
165
166	# check first line
167	# pid:daemon:base:base/output:base/lock
168	local line=`perf daemon --config ${config} -x: | head -1`
169	check_line_first ${line} daemon ${base} ${base}/output ${base}/lock "0"
170
171	# check 1st session
172	# pid:size:-e cpu-clock:base/size:base/size/output:base/size/control:base/size/ack:0
173	local line=`perf daemon --config ${config} -x: | head -2 | tail -1`
174	check_line_other "${line}" size "-e cpu-clock -m 1 sleep 10" ${base}/session-size \
175			 ${base}/session-size/output ${base}/session-size/control \
176			 ${base}/session-size/ack "0"
177
178	# check 2nd session
179	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0
180	local line=`perf daemon --config ${config} -x: | head -3 | tail -1`
181	check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \
182			 ${base}/session-time/output ${base}/session-time/control \
183			 ${base}/session-time/ack "0"
184
185	# stop daemon
186	daemon_exit ${config}
187
188	rm -rf ${base}
189	rm -f ${config}
190}
191
192test_reconfig()
193{
194	echo "test daemon reconfig"
195
196	local config=$(mktemp /tmp/perf.daemon.config.XXX)
197	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
198
199	# prepare config
200	cat <<EOF > ${config}
201[daemon]
202base=BASE
203
204[session-size]
205run = -e cpu-clock -m 1 sleep 10
206
207[session-time]
208run = -e task-clock -m 1 sleep 10
209EOF
210
211	sed -i -e "s|BASE|${base}|" ${config}
212
213	# start daemon
214	daemon_start ${config} size
215
216	# check 2nd session
217	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0
218	local line=`perf daemon --config ${config} -x: | head -3 | tail -1`
219	check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \
220			 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0"
221	local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'`
222
223	# prepare new config
224	local config_new=${config}.new
225	cat <<EOF > ${config_new}
226[daemon]
227base=BASE
228
229[session-size]
230run = -e cpu-clock -m 1 sleep 10
231
232[session-time]
233run = -e cpu-clock -m 1 sleep 10
234EOF
235
236	# TEST 1 - change config
237
238	sed -i -e "s|BASE|${base}|" ${config_new}
239	cp ${config_new} ${config}
240
241	# wait for old session to finish
242	tail --pid=${pid} -f /dev/null
243
244	# wait for new one to start
245	local state="FAIL"
246	while [ "${state}" != "OK" ]; do
247		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
248	done
249
250	# check reconfigured 2nd session
251	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0
252	local line=`perf daemon --config ${config} -x: | head -3 | tail -1`
253	check_line_other "${line}" time "-e cpu-clock -m 1 sleep 10" ${base}/session-time \
254			 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0"
255
256	# TEST 2 - empty config
257
258	local config_empty=${config}.empty
259	cat <<EOF > ${config_empty}
260[daemon]
261base=BASE
262EOF
263
264	# change config
265	sed -i -e "s|BASE|${base}|" ${config_empty}
266	cp ${config_empty} ${config}
267
268	# wait for sessions to finish
269	local state="OK"
270	while [ "${state}" != "FAIL" ]; do
271		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
272	done
273
274	local state="OK"
275	while [ "${state}" != "FAIL" ]; do
276		state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`
277	done
278
279	local one=`perf daemon --config ${config} -x: | wc -l`
280
281	if [ ${one} -ne "1" ]; then
282		echo "FAILED: wrong list output"
283		error=1
284	fi
285
286	# TEST 3 - config again
287
288	cp ${config_new} ${config}
289
290	# wait for size to start
291	local state="FAIL"
292	while [ "${state}" != "OK" ]; do
293		state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`
294	done
295
296	# wait for time to start
297	local state="FAIL"
298	while [ "${state}" != "OK" ]; do
299		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
300	done
301
302	# stop daemon
303	daemon_exit ${config}
304
305	rm -rf ${base}
306	rm -f ${config}
307	rm -f ${config_new}
308	rm -f ${config_empty}
309}
310
311test_stop()
312{
313	echo "test daemon stop"
314
315	local config=$(mktemp /tmp/perf.daemon.config.XXX)
316	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
317
318	# prepare config
319	cat <<EOF > ${config}
320[daemon]
321base=BASE
322
323[session-size]
324run = -e cpu-clock -m 1 sleep 10
325
326[session-time]
327run = -e task-clock -m 1 sleep 10
328EOF
329
330	sed -i -e "s|BASE|${base}|" ${config}
331
332	# start daemon
333	daemon_start ${config} size
334
335	local pid_size=`perf daemon --config ${config} -x: | head -2 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'`
336	local pid_time=`perf daemon --config ${config} -x: | head -3 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'`
337
338	# check that sessions are running
339	if [ ! -d "/proc/${pid_size}" ]; then
340		echo "FAILED: session size not up"
341	fi
342
343	if [ ! -d "/proc/${pid_time}" ]; then
344		echo "FAILED: session time not up"
345	fi
346
347	# stop daemon
348	daemon_exit ${config}
349
350	# check that sessions are gone
351	if [ -d "/proc/${pid_size}" ]; then
352		echo "FAILED: session size still up"
353	fi
354
355	if [ -d "/proc/${pid_time}" ]; then
356		echo "FAILED: session time still up"
357	fi
358
359	rm -rf ${base}
360	rm -f ${config}
361}
362
363test_signal()
364{
365	echo "test daemon signal"
366
367	local config=$(mktemp /tmp/perf.daemon.config.XXX)
368	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
369
370	# prepare config
371	cat <<EOF > ${config}
372[daemon]
373base=BASE
374
375[session-test]
376run = -e cpu-clock --switch-output -m 1 sleep 10
377EOF
378
379	sed -i -e "s|BASE|${base}|" ${config}
380
381	# start daemon
382	daemon_start ${config} test
383
384	# send 2 signals
385	perf daemon signal --config ${config} --session test
386	perf daemon signal --config ${config}
387
388	# stop daemon
389	daemon_exit ${config}
390
391	# count is 2 perf.data for signals and 1 for perf record finished
392	count=`ls ${base}/session-test/ | grep perf.data | wc -l`
393	if [ ${count} -ne 3 ]; then
394		error=1
395		echo "FAILED: perf data no generated"
396	fi
397
398	rm -rf ${base}
399	rm -f ${config}
400}
401
402test_ping()
403{
404	echo "test daemon ping"
405
406	local config=$(mktemp /tmp/perf.daemon.config.XXX)
407	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
408
409	# prepare config
410	cat <<EOF > ${config}
411[daemon]
412base=BASE
413
414[session-size]
415run = -e cpu-clock -m 1 sleep 10
416
417[session-time]
418run = -e task-clock -m 1 sleep 10
419EOF
420
421	sed -i -e "s|BASE|${base}|" ${config}
422
423	# start daemon
424	daemon_start ${config} size
425
426	size=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`
427	type=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
428
429	if [ ${size} != "OK" -o ${type} != "OK" ]; then
430		error=1
431		echo "FAILED: daemon ping failed"
432	fi
433
434	# stop daemon
435	daemon_exit ${config}
436
437	rm -rf ${base}
438	rm -f ${config}
439}
440
441test_lock()
442{
443	echo "test daemon lock"
444
445	local config=$(mktemp /tmp/perf.daemon.config.XXX)
446	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
447
448	# prepare config
449	cat <<EOF > ${config}
450[daemon]
451base=BASE
452
453[session-size]
454run = -e cpu-clock -m 1 sleep 10
455EOF
456
457	sed -i -e "s|BASE|${base}|" ${config}
458
459	# start daemon
460	daemon_start ${config} size
461
462	# start second daemon over the same config/base
463	failed=`perf daemon start --config ${config} 2>&1 | awk '{ print $1 }'`
464
465	# check that we failed properly
466	if [ ${failed} != "failed:" ]; then
467		error=1
468		echo "FAILED: daemon lock failed"
469	fi
470
471	# stop daemon
472	daemon_exit ${config}
473
474	rm -rf ${base}
475	rm -f ${config}
476}
477
478error=0
479
480test_list
481test_reconfig
482test_stop
483test_signal
484test_ping
485test_lock
486
487exit ${error}