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_start() 102{ 103 local config=$1 104 local session=$2 105 106 perf daemon start --config ${config} 107 108 # wait for the session to ping 109 local state="FAIL" 110 while [ "${state}" != "OK" ]; do 111 state=`perf daemon ping --config ${config} --session ${session} | awk '{ print $1 }'` 112 sleep 0.05 113 done 114} 115 116daemon_exit() 117{ 118 local base=$1 119 local config=$2 120 121 local line=`perf daemon --config ${config} -x: | head -1` 122 local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'` 123 124 # stop daemon 125 perf daemon stop --config ${config} 126 127 # ... and wait for the pid to go away 128 tail --pid=${pid} -f /dev/null 129} 130 131test_list() 132{ 133 echo "test daemon list" 134 135 local config=$(mktemp /tmp/perf.daemon.config.XXX) 136 local base=$(mktemp -d /tmp/perf.daemon.base.XXX) 137 138 cat <<EOF > ${config} 139[daemon] 140base=BASE 141 142[session-size] 143run = -e cpu-clock -m 1 sleep 10 144 145[session-time] 146run = -e task-clock -m 1 sleep 10 147EOF 148 149 sed -i -e "s|BASE|${base}|" ${config} 150 151 # start daemon 152 daemon_start ${config} size 153 154 # check first line 155 # pid:daemon:base:base/output:base/lock 156 local line=`perf daemon --config ${config} -x: | head -1` 157 check_line_first ${line} daemon ${base} ${base}/output ${base}/lock "0" 158 159 # check 1st session 160 # pid:size:-e cpu-clock:base/size:base/size/output:base/size/control:base/size/ack:0 161 local line=`perf daemon --config ${config} -x: | head -2 | tail -1` 162 check_line_other "${line}" size "-e cpu-clock -m 1 sleep 10" ${base}/session-size \ 163 ${base}/session-size/output ${base}/session-size/control \ 164 ${base}/session-size/ack "0" 165 166 # check 2nd session 167 # pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0 168 local line=`perf daemon --config ${config} -x: | head -3 | tail -1` 169 check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \ 170 ${base}/session-time/output ${base}/session-time/control \ 171 ${base}/session-time/ack "0" 172 173 # stop daemon 174 daemon_exit ${base} ${config} 175 176 rm -rf ${base} 177 rm -f ${config} 178} 179 180test_reconfig() 181{ 182 echo "test daemon reconfig" 183 184 local config=$(mktemp /tmp/perf.daemon.config.XXX) 185 local base=$(mktemp -d /tmp/perf.daemon.base.XXX) 186 187 # prepare config 188 cat <<EOF > ${config} 189[daemon] 190base=BASE 191 192[session-size] 193run = -e cpu-clock -m 1 sleep 10 194 195[session-time] 196run = -e task-clock -m 1 sleep 10 197EOF 198 199 sed -i -e "s|BASE|${base}|" ${config} 200 201 # start daemon 202 daemon_start ${config} size 203 204 # check 2nd session 205 # pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0 206 local line=`perf daemon --config ${config} -x: | head -3 | tail -1` 207 check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \ 208 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0" 209 local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'` 210 211 # prepare new config 212 local config_new=${config}.new 213 cat <<EOF > ${config_new} 214[daemon] 215base=BASE 216 217[session-size] 218run = -e cpu-clock -m 1 sleep 10 219 220[session-time] 221run = -e cpu-clock -m 1 sleep 10 222EOF 223 224 # TEST 1 - change config 225 226 sed -i -e "s|BASE|${base}|" ${config_new} 227 cp ${config_new} ${config} 228 229 # wait for old session to finish 230 tail --pid=${pid} -f /dev/null 231 232 # wait for new one to start 233 local state="FAIL" 234 while [ "${state}" != "OK" ]; do 235 state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` 236 done 237 238 # check reconfigured 2nd session 239 # pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0 240 local line=`perf daemon --config ${config} -x: | head -3 | tail -1` 241 check_line_other "${line}" time "-e cpu-clock -m 1 sleep 10" ${base}/session-time \ 242 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0" 243 244 # TEST 2 - empty config 245 246 local config_empty=${config}.empty 247 cat <<EOF > ${config_empty} 248[daemon] 249base=BASE 250EOF 251 252 # change config 253 sed -i -e "s|BASE|${base}|" ${config_empty} 254 cp ${config_empty} ${config} 255 256 # wait for sessions to finish 257 local state="OK" 258 while [ "${state}" != "FAIL" ]; do 259 state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` 260 done 261 262 local state="OK" 263 while [ "${state}" != "FAIL" ]; do 264 state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'` 265 done 266 267 local one=`perf daemon --config ${config} -x: | wc -l` 268 269 if [ ${one} -ne "1" ]; then 270 echo "FAILED: wrong list output" 271 error=1 272 fi 273 274 # TEST 3 - config again 275 276 cp ${config_new} ${config} 277 278 # wait for size to start 279 local state="FAIL" 280 while [ "${state}" != "OK" ]; do 281 state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'` 282 done 283 284 # wait for time to start 285 local state="FAIL" 286 while [ "${state}" != "OK" ]; do 287 state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` 288 done 289 290 # stop daemon 291 daemon_exit ${base} ${config} 292 293 rm -rf ${base} 294 rm -f ${config} 295 rm -f ${config_new} 296 rm -f ${config_empty} 297} 298 299test_stop() 300{ 301 echo "test daemon stop" 302 303 local config=$(mktemp /tmp/perf.daemon.config.XXX) 304 local base=$(mktemp -d /tmp/perf.daemon.base.XXX) 305 306 # prepare config 307 cat <<EOF > ${config} 308[daemon] 309base=BASE 310 311[session-size] 312run = -e cpu-clock -m 1 sleep 10 313 314[session-time] 315run = -e task-clock -m 1 sleep 10 316EOF 317 318 sed -i -e "s|BASE|${base}|" ${config} 319 320 # start daemon 321 daemon_start ${config} size 322 323 local pid_size=`perf daemon --config ${config} -x: | head -2 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'` 324 local pid_time=`perf daemon --config ${config} -x: | head -3 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'` 325 326 # check that sessions are running 327 if [ ! -d "/proc/${pid_size}" ]; then 328 echo "FAILED: session size not up" 329 fi 330 331 if [ ! -d "/proc/${pid_time}" ]; then 332 echo "FAILED: session time not up" 333 fi 334 335 # stop daemon 336 daemon_exit ${base} ${config} 337 338 # check that sessions are gone 339 if [ -d "/proc/${pid_size}" ]; then 340 echo "FAILED: session size still up" 341 fi 342 343 if [ -d "/proc/${pid_time}" ]; then 344 echo "FAILED: session time still up" 345 fi 346 347 rm -rf ${base} 348 rm -f ${config} 349} 350 351test_signal() 352{ 353 echo "test daemon signal" 354 355 local config=$(mktemp /tmp/perf.daemon.config.XXX) 356 local base=$(mktemp -d /tmp/perf.daemon.base.XXX) 357 358 # prepare config 359 cat <<EOF > ${config} 360[daemon] 361base=BASE 362 363[session-test] 364run = -e cpu-clock --switch-output -m 1 sleep 10 365EOF 366 367 sed -i -e "s|BASE|${base}|" ${config} 368 369 # start daemon 370 daemon_start ${config} test 371 372 # send 2 signals 373 perf daemon signal --config ${config} --session test 374 perf daemon signal --config ${config} 375 376 # stop daemon 377 daemon_exit ${base} ${config} 378 379 # count is 2 perf.data for signals and 1 for perf record finished 380 count=`ls ${base}/session-test/ | grep perf.data | wc -l` 381 if [ ${count} -ne 3 ]; then 382 error=1 383 echo "FAILED: perf data no generated" 384 fi 385 386 rm -rf ${base} 387 rm -f ${config} 388} 389 390test_ping() 391{ 392 echo "test daemon ping" 393 394 local config=$(mktemp /tmp/perf.daemon.config.XXX) 395 local base=$(mktemp -d /tmp/perf.daemon.base.XXX) 396 397 # prepare config 398 cat <<EOF > ${config} 399[daemon] 400base=BASE 401 402[session-size] 403run = -e cpu-clock -m 1 sleep 10 404 405[session-time] 406run = -e task-clock -m 1 sleep 10 407EOF 408 409 sed -i -e "s|BASE|${base}|" ${config} 410 411 # start daemon 412 daemon_start ${config} size 413 414 size=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'` 415 type=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` 416 417 if [ ${size} != "OK" -o ${type} != "OK" ]; then 418 error=1 419 echo "FAILED: daemon ping failed" 420 fi 421 422 # stop daemon 423 daemon_exit ${base} ${config} 424 425 rm -rf ${base} 426 rm -f ${config} 427} 428 429test_lock() 430{ 431 echo "test daemon lock" 432 433 local config=$(mktemp /tmp/perf.daemon.config.XXX) 434 local base=$(mktemp -d /tmp/perf.daemon.base.XXX) 435 436 # prepare config 437 cat <<EOF > ${config} 438[daemon] 439base=BASE 440 441[session-size] 442run = -e cpu-clock -m 1 sleep 10 443EOF 444 445 sed -i -e "s|BASE|${base}|" ${config} 446 447 # start daemon 448 daemon_start ${config} size 449 450 # start second daemon over the same config/base 451 failed=`perf daemon start --config ${config} 2>&1 | awk '{ print $1 }'` 452 453 # check that we failed properly 454 if [ ${failed} != "failed:" ]; then 455 error=1 456 echo "FAILED: daemon lock failed" 457 fi 458 459 # stop daemon 460 daemon_exit ${base} ${config} 461 462 rm -rf ${base} 463 rm -f ${config} 464} 465 466error=0 467 468test_list 469test_reconfig 470test_stop 471test_signal 472test_ping 473test_lock 474 475exit ${error} 476