From 0aa7b2d01f064ebabfb63b98c40a10ea008142a9 Mon Sep 17 00:00:00 2001 From: Lukasz Mrugala Date: Mon, 16 Jun 2025 21:06:22 +0000 Subject: [PATCH] alsa: Restore test settings after each test Currently, some tests change ALSABAT settings during their execution, but do not restore them to their prior state. This causes tests that occur later in the execution order to intermittently fail. To remedy this, all tests that use ALSA now use a common save_alsa_state function, which shall save current ALSA state to a file and then restore that state on the bash script EXIT signal. Signed-off-by: Lukasz Mrugala --- case-lib/hijack.sh | 5 ++++ case-lib/lib.sh | 26 +++++++++++++++++++ test-case/check-alsabat.sh | 1 + test-case/check-audio-equalizer.sh | 1 + test-case/check-capture.sh | 1 + test-case/check-fw-echo-reference.sh | 1 + test-case/check-keyword-detection.sh | 1 + .../check-kmod-load-unload-after-playback.sh | 1 + test-case/check-kmod-load-unload.sh | 1 + .../check-pause-release-suspend-resume.sh | 1 + test-case/check-pause-resume.sh | 1 + test-case/check-performance.sh | 1 + test-case/check-playback.sh | 1 + test-case/check-runtime-pm-double-active.sh | 1 + test-case/check-runtime-pm-status.sh | 1 + test-case/check-signal-stop-start.sh | 1 + test-case/check-smart-amplifier.sh | 1 + test-case/check-sof-logger.sh | 3 ++- test-case/check-suspend-resume-with-audio.sh | 2 +- test-case/check-userspace-cardinfo.sh | 1 + test-case/check-userspace-paplay.sh | 1 + test-case/check-userspace-parecord.sh | 1 + test-case/check-volume-levels.sh | 1 + test-case/check-xrun-injection.sh | 1 + test-case/latency-metrics.sh | 1 + test-case/multiple-pause-resume.sh | 4 +-- test-case/multiple-pipeline.sh | 2 +- test-case/simultaneous-playback-capture.sh | 2 +- test-case/test-speaker.sh | 1 + test-case/verify-bootsequence.sh | 1 + test-case/verify-pcm-list.sh | 1 + test-case/verify-sof-firmware-load.sh | 1 + test-case/verify-ucm-config.sh | 1 + test-case/volume-basic-test.sh | 1 + 34 files changed, 65 insertions(+), 6 deletions(-) diff --git a/case-lib/hijack.sh b/case-lib/hijack.sh index 264edb4b..a6ae13b4 100644 --- a/case-lib/hijack.sh +++ b/case-lib/hijack.sh @@ -185,6 +185,11 @@ function func_exit_handler() fi } + # Restore ALSA settings after execution if state file exists + if [ -f "${SOF_TEST_ALSA_STATE_FILENAME}" ]; then + restore_alsa_state + fi + print_test_result_exit $exit_status } diff --git a/case-lib/lib.sh b/case-lib/lib.sh index 5b381eda..2dde327d 100644 --- a/case-lib/lib.sh +++ b/case-lib/lib.sh @@ -8,6 +8,8 @@ SCRIPT_HOME=$(cd "$SCRIPT_HOME/.." && pwd) SCRIPT_NAME="$0" # get test-case script load name # shellcheck disable=SC2034 # external script can use it SCRIPT_PRAM="$*" # get test-case parameter +# shellcheck disable=SC2034 # external script can use it +SOF_TEST_ALSA_STATE_FILENAME=/tmp/"${SCRIPT_NAME##*/}".$$.state # Source from the relative path of current folder # shellcheck source=case-lib/config.sh @@ -1187,3 +1189,27 @@ perf_analyze() fi } +# Restore the machine state from a file. +# Should be triggered at the end of +# every test touching ALSA. +# Couple with save_machine_state. +restore_alsa_state() +{ + dlogi "restore_alsa_state called in ${SOF_TEST_ALSA_STATE_FILENAME}" + if [ -f "${SOF_TEST_ALSA_STATE_FILENAME}" ]; then + dlogi "restore_alsa_state found a relevant state file." + alsactl restore --file "${SOF_TEST_ALSA_STATE_FILENAME}" --pedantic --no-ucm --no-init-fallback || dlogi "alsactl state restoration failed!" + rm "${SOF_TEST_ALSA_STATE_FILENAME}" || dlogi "Old state file removal failed!" + fi +} + +# Save the machine state to a file. +# Should be used at the start of +# every test touching ALSA. +# Coupled with restore_machine_state +# on an exit signal inside func_exit_handler. +save_alsa_state() +{ + dlogi "save_alsa_state called in ${SOF_TEST_ALSA_STATE_FILENAME}" + alsactl store --file "${SOF_TEST_ALSA_STATE_FILENAME}" || dlogi "alsactl state storage failed!" +} diff --git a/test-case/check-alsabat.sh b/test-case/check-alsabat.sh index 9aadb863..48f833b9 100755 --- a/test-case/check-alsabat.sh +++ b/test-case/check-alsabat.sh @@ -74,6 +74,7 @@ sigmak=${OPT_VAL['k']} frames=${OPT_VAL['n']} start_test +save_alsa_state if [ "$pcm_p" = "" ]||[ "$pcm_c" = "" ]; then diff --git a/test-case/check-audio-equalizer.sh b/test-case/check-audio-equalizer.sh index 1b4a4ad3..a3a7dd62 100755 --- a/test-case/check-audio-equalizer.sh +++ b/test-case/check-audio-equalizer.sh @@ -43,6 +43,7 @@ func_pipeline_export "$tplg" "eq:any" sofcard=${SOFCARD:-0} start_test +save_alsa_state setup_kernel_check_point # Test equalizer diff --git a/test-case/check-capture.sh b/test-case/check-capture.sh index 444e5d4c..57fa24aa 100755 --- a/test-case/check-capture.sh +++ b/test-case/check-capture.sh @@ -58,6 +58,7 @@ out_dir=${OPT_VAL['o']} file_prefix=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect setup_kernel_check_point diff --git a/test-case/check-fw-echo-reference.sh b/test-case/check-fw-echo-reference.sh index 1e8ace9f..606f29c8 100755 --- a/test-case/check-fw-echo-reference.sh +++ b/test-case/check-fw-echo-reference.sh @@ -41,6 +41,7 @@ frames=${OPT_VAL['n']} frequency=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "echo:any" diff --git a/test-case/check-keyword-detection.sh b/test-case/check-keyword-detection.sh index ebcad8fd..6adeb85b 100755 --- a/test-case/check-keyword-detection.sh +++ b/test-case/check-keyword-detection.sh @@ -54,6 +54,7 @@ preamble_time=${OPT_VAL['p']} duration=${OPT_VAL['d']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "kpb:any" diff --git a/test-case/check-kmod-load-unload-after-playback.sh b/test-case/check-kmod-load-unload-after-playback.sh index e7aa542b..c9d3298a 100755 --- a/test-case/check-kmod-load-unload-after-playback.sh +++ b/test-case/check-kmod-load-unload-after-playback.sh @@ -55,6 +55,7 @@ loop_cnt=${OPT_VAL['l']} pb_duration=${OPT_VAL['d']} start_test +save_alsa_state func_pipeline_export "$tplg" "type:playback" diff --git a/test-case/check-kmod-load-unload.sh b/test-case/check-kmod-load-unload.sh index 9e51729a..8f6e3d65 100755 --- a/test-case/check-kmod-load-unload.sh +++ b/test-case/check-kmod-load-unload.sh @@ -39,6 +39,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state loop_cnt=${OPT_VAL['l']} diff --git a/test-case/check-pause-release-suspend-resume.sh b/test-case/check-pause-release-suspend-resume.sh index db2c804d..af1f97e5 100755 --- a/test-case/check-pause-release-suspend-resume.sh +++ b/test-case/check-pause-release-suspend-resume.sh @@ -95,6 +95,7 @@ test_mode=${OPT_VAL['m']} file_name=${OPT_VAL['F']} start_test +save_alsa_state case $test_mode in "playback") diff --git a/test-case/check-pause-resume.sh b/test-case/check-pause-resume.sh index 17c49ffc..6015bfc8 100755 --- a/test-case/check-pause-resume.sh +++ b/test-case/check-pause-resume.sh @@ -58,6 +58,7 @@ rnd_min=${OPT_VAL['i']} rnd_max=${OPT_VAL['a']} start_test +save_alsa_state rnd_range=$(( rnd_max - rnd_min )) [[ $rnd_range -le 0 ]] && dlogw "Error random range scope [ min:$rnd_min - max:$rnd_max ]" && exit 2 diff --git a/test-case/check-performance.sh b/test-case/check-performance.sh index 2b0eecfc..037d956d 100755 --- a/test-case/check-performance.sh +++ b/test-case/check-performance.sh @@ -42,6 +42,7 @@ tplg=${OPT_VAL['t']} duration=${OPT_VAL['d']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect setup_kernel_check_point diff --git a/test-case/check-playback.sh b/test-case/check-playback.sh index 0958647b..1b1e4986 100755 --- a/test-case/check-playback.sh +++ b/test-case/check-playback.sh @@ -54,6 +54,7 @@ loop_cnt=${OPT_VAL['l']} file=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect # checking if source file exists diff --git a/test-case/check-runtime-pm-double-active.sh b/test-case/check-runtime-pm-double-active.sh index 51b99b86..6a7f73f2 100755 --- a/test-case/check-runtime-pm-double-active.sh +++ b/test-case/check-runtime-pm-double-active.sh @@ -60,6 +60,7 @@ tplg=${OPT_VAL['t']} loop_count=${OPT_VAL['l']} start_test +save_alsa_state [[ -z $tplg ]] && dloge "Miss tplg file to run" && exit 2 diff --git a/test-case/check-runtime-pm-status.sh b/test-case/check-runtime-pm-status.sh index f9b83fa4..469aa20e 100755 --- a/test-case/check-runtime-pm-status.sh +++ b/test-case/check-runtime-pm-status.sh @@ -56,6 +56,7 @@ tplg=${OPT_VAL['t']} loop_count=${OPT_VAL['l']} start_test +save_alsa_state [[ -z $tplg ]] && die "Miss tplg file to run" diff --git a/test-case/check-signal-stop-start.sh b/test-case/check-signal-stop-start.sh index 0aa79fb0..68132586 100755 --- a/test-case/check-signal-stop-start.sh +++ b/test-case/check-signal-stop-start.sh @@ -44,6 +44,7 @@ interval=${OPT_VAL['i']} test_mode=${OPT_VAL['m']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect case $test_mode in diff --git a/test-case/check-smart-amplifier.sh b/test-case/check-smart-amplifier.sh index 41a9b345..412f16d8 100755 --- a/test-case/check-smart-amplifier.sh +++ b/test-case/check-smart-amplifier.sh @@ -57,6 +57,7 @@ loop_cnt=${OPT_VAL['l']} tplg=${OPT_VAL['t']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "smart_amp:any" diff --git a/test-case/check-sof-logger.sh b/test-case/check-sof-logger.sh index 23c9a5d5..c7fc2217 100755 --- a/test-case/check-sof-logger.sh +++ b/test-case/check-sof-logger.sh @@ -28,6 +28,7 @@ source "${TOPDIR}"/case-lib/lib.sh func_opt_parse_option "$@" start_test +save_alsa_state # check sof-logger location type -a sof-logger || @@ -72,7 +73,7 @@ sof_alsa_card_found() # - /proc/asound/sofsoundwire/id # - /proc/asound/sofhdadsp/id # - https://github.com/thesofproject/sof-test/issues/1243 - # Designed to support multiple SOF instances with SOF probes + # Designed to support multiple SOF instances with SOF probes for i in /proc/asound/sof*/id; do if test -e "$i"; then return 0; fi done diff --git a/test-case/check-suspend-resume-with-audio.sh b/test-case/check-suspend-resume-with-audio.sh index 40397a54..c20f363b 100755 --- a/test-case/check-suspend-resume-with-audio.sh +++ b/test-case/check-suspend-resume-with-audio.sh @@ -63,6 +63,7 @@ func_lib_check_sudo tplg=${OPT_VAL['t']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect # overwrite the subscript: test-case LOG_ROOT environment @@ -139,4 +140,3 @@ do dlogi "Killing $cmd_args" kill -9 $process_id || true done - diff --git a/test-case/check-userspace-cardinfo.sh b/test-case/check-userspace-cardinfo.sh index 1a1c36c8..3a5a6aca 100755 --- a/test-case/check-userspace-cardinfo.sh +++ b/test-case/check-userspace-cardinfo.sh @@ -23,6 +23,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state # check pulseaudio runs properly or not func_lib_check_pa || die "Please check whether pulseaudio runs correctly or not" diff --git a/test-case/check-userspace-paplay.sh b/test-case/check-userspace-paplay.sh index 4bfc158f..2d7dbb7c 100755 --- a/test-case/check-userspace-paplay.sh +++ b/test-case/check-userspace-paplay.sh @@ -45,6 +45,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state round_cnt=${OPT_VAL['r']} duration=${OPT_VAL['d']} diff --git a/test-case/check-userspace-parecord.sh b/test-case/check-userspace-parecord.sh index 2b660a49..c757de72 100755 --- a/test-case/check-userspace-parecord.sh +++ b/test-case/check-userspace-parecord.sh @@ -52,6 +52,7 @@ rate=${OPT_VAL['R']} channel=${OPT_VAL['C']} start_test +save_alsa_state [[ -e $file ]] || { dlogw "$file does not exist, use /dev/zero as dummy playback source" && file=/dev/null; } diff --git a/test-case/check-volume-levels.sh b/test-case/check-volume-levels.sh index b421dff1..0486f849 100755 --- a/test-case/check-volume-levels.sh +++ b/test-case/check-volume-levels.sh @@ -59,6 +59,7 @@ ARECORD_WAV2=$(mktemp --suffix=.wav) ARECORD_WAV3=$(mktemp --suffix=.wav) start_test +save_alsa_state # # Main test procedure diff --git a/test-case/check-xrun-injection.sh b/test-case/check-xrun-injection.sh index 30a2b045..02d1d2e0 100755 --- a/test-case/check-xrun-injection.sh +++ b/test-case/check-xrun-injection.sh @@ -43,6 +43,7 @@ count=${OPT_VAL['c']} interval=${OPT_VAL['i']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect setup_kernel_check_point diff --git a/test-case/latency-metrics.sh b/test-case/latency-metrics.sh index 0a288177..29696654 100755 --- a/test-case/latency-metrics.sh +++ b/test-case/latency-metrics.sh @@ -274,6 +274,7 @@ main() setup_kernel_check_point start_test + save_alsa_state logger_disabled || func_lib_start_log_collect diff --git a/test-case/multiple-pause-resume.sh b/test-case/multiple-pause-resume.sh index e79701e2..989bdff2 100755 --- a/test-case/multiple-pause-resume.sh +++ b/test-case/multiple-pause-resume.sh @@ -56,6 +56,7 @@ rnd_max=${OPT_VAL['a']} rnd_range=$((rnd_max - rnd_min)) start_test +save_alsa_state [[ $rnd_range -le 0 ]] && dlogw "Error random range scope [ min:$rnd_min - max:$rnd_max ]" && exit 2 @@ -140,7 +141,7 @@ func_pause_resume_pipeline() } # to prevent infinite loop, 5 second per a repeat is plenty -max_wait_time=$((5 * repeat_count)) +max_wait_time=$((5 * repeat_count)) for i in $(seq 1 "$loop_count") do @@ -203,4 +204,3 @@ do # check kernel log for each iteration to catch issues sof-kernel-log-check.sh "$KERNEL_CHECKPOINT" || die "Caught error in kernel log" done - diff --git a/test-case/multiple-pipeline.sh b/test-case/multiple-pipeline.sh index b7dd22d0..b31673c3 100755 --- a/test-case/multiple-pipeline.sh +++ b/test-case/multiple-pipeline.sh @@ -61,6 +61,7 @@ tplg=${OPT_VAL['t']} f_arg=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect # skip the Echo Reference pipeline @@ -222,4 +223,3 @@ do # check kernel log for each iteration to catch issues sof-kernel-log-check.sh "$KERNEL_CHECKPOINT" || die "Caught error in kernel log" done - diff --git a/test-case/simultaneous-playback-capture.sh b/test-case/simultaneous-playback-capture.sh index d1e3189f..e59f4836 100755 --- a/test-case/simultaneous-playback-capture.sh +++ b/test-case/simultaneous-playback-capture.sh @@ -41,6 +41,7 @@ wait_time=${OPT_VAL['w']} loop_cnt=${OPT_VAL['l']} start_test +save_alsa_state # get 'both' pcm, it means pcm have same id with different type declare -A tmp_id_lst @@ -120,4 +121,3 @@ do # check kernel log for each iteration to catch issues sof-kernel-log-check.sh "$KERNEL_CHECKPOINT" || die "Caught error in kernel log" done - diff --git a/test-case/test-speaker.sh b/test-case/test-speaker.sh index 6e0df8ab..7ddab0ac 100755 --- a/test-case/test-speaker.sh +++ b/test-case/test-speaker.sh @@ -32,6 +32,7 @@ func_opt_parse_option "$@" tplg=${OPT_VAL['t']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "type:playback" diff --git a/test-case/verify-bootsequence.sh b/test-case/verify-bootsequence.sh index 5fd77b3d..f58d71e3 100755 --- a/test-case/verify-bootsequence.sh +++ b/test-case/verify-bootsequence.sh @@ -33,6 +33,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state main() { diff --git a/test-case/verify-pcm-list.sh b/test-case/verify-pcm-list.sh index 88abb8d4..1197949f 100755 --- a/test-case/verify-pcm-list.sh +++ b/test-case/verify-pcm-list.sh @@ -27,6 +27,7 @@ func_opt_parse_option "$@" tplg=${OPT_VAL['t']} start_test +save_alsa_state tplg_path=$(func_lib_get_tplg_path "$tplg") || die "No available topology for this test case" diff --git a/test-case/verify-sof-firmware-load.sh b/test-case/verify-sof-firmware-load.sh index d6866a44..555b59d7 100755 --- a/test-case/verify-sof-firmware-load.sh +++ b/test-case/verify-sof-firmware-load.sh @@ -22,6 +22,7 @@ func_opt_parse_option "$@" disable_kernel_check_point start_test +save_alsa_state cmd="journalctl_cmd" diff --git a/test-case/verify-ucm-config.sh b/test-case/verify-ucm-config.sh index 1d7e7f09..ae9154c8 100755 --- a/test-case/verify-ucm-config.sh +++ b/test-case/verify-ucm-config.sh @@ -28,6 +28,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state declare -A verb_array diff --git a/test-case/volume-basic-test.sh b/test-case/volume-basic-test.sh index 1f013b2c..5e3962f7 100755 --- a/test-case/volume-basic-test.sh +++ b/test-case/volume-basic-test.sh @@ -38,6 +38,7 @@ tplg=${OPT_VAL['t']} maxloop=${OPT_VAL['l']} start_test +save_alsa_state func_error_exit() {