Skip to content

Commit 6b22684

Browse files
committed
Fix AudioRecord testcase ID collision for LAVA CI
- Add RESULT_TESTNAME variable to support unique testcase IDs - Add --lava-testcase-id CLI parameter - Add LAVA_TESTCASE_ID parameter to AudioRecord.yaml - Update Read_me.md with LAVA_TESTCASE_ID documentation Resolves issue qualcomm-linux#378 by ensuring unique testcase IDs in LAVA when running multiple AudioRecord configurations in parallel. Signed-off-by: Teja Swaroop Moida <tmoida@qti.qualcomm.com>
1 parent de26162 commit 6b22684

3 files changed

Lines changed: 66 additions & 27 deletions

File tree

Runner/suites/Multimedia/Audio/AudioRecord/AudioRecord.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ params:
2020
DMESG_SCAN: 1 # Scan dmesg for errors after recording, default: 1
2121
VERBOSE: 0 # Enable verbose logging, default: 0
2222
RES_SUFFIX: "" # Suffix for unique result file and log directory (e.g., "Config1" generates AudioRecord_Config1.res and results/AudioRecord_Config1/), default: unset
23+
LAVA_TESTCASE_ID: "AudioRecord" # Unique testcase ID written into the .res file for LAVA, default: AudioRecord
2324

2425
run:
2526
steps:
2627
- REPO_PATH=$PWD
2728
- cd Runner/suites/Multimedia/Audio/AudioRecord/
28-
- ./run.sh --backend "${AUDIO_BACKEND}" --source "${SOURCE_CHOICE}" --config-name "${CONFIG_NAMES}" --config-filter "${CONFIG_FILTER}" --record-seconds "${RECORD_SECONDS}" --loops "${LOOPS}" --timeout "${TIMEOUT}" --strict "${STRICT}" --res-suffix "${RES_SUFFIX}" || true
29+
- ./run.sh --backend "${AUDIO_BACKEND}" --source "${SOURCE_CHOICE}" --config-name "${CONFIG_NAMES}" --config-filter "${CONFIG_FILTER}" --record-seconds "${RECORD_SECONDS}" --loops "${LOOPS}" --timeout "${TIMEOUT}" --strict "${STRICT}" --res-suffix "${RES_SUFFIX}" --lava-testcase-id "${LAVA_TESTCASE_ID}" || true
2930
- $REPO_PATH/Runner/utils/send-to-lava.sh AudioRecord${RES_SUFFIX:+_${RES_SUFFIX}}.res

Runner/suites/Multimedia/Audio/AudioRecord/Read_me.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ This suite automates the validation of audio recording capabilities on Qualcomm
1313
- Use descriptive names (e.g., record_48KHz_2ch) for specific formats
1414
- Auto-discovery mode tests all available configs
1515
- **Config filtering**: Filter tests by sample rate or channel configuration
16+
- **CI/LAVA integration**:
17+
- Unique result file suffixes prevent file collisions in parallel test runs
18+
- Unique testcase IDs prevent LAVA testcase ID collisions
19+
- Enables running multiple AudioRecord configurations simultaneously in CI
1620
- Records audio with configurable duration and loop count
1721
- Automatically detects and routes to appropriate source (e.g., mic, null)
1822
- Validates recording using multiple evidence sources:
@@ -185,6 +189,7 @@ DMESG_SCAN Scan dmesg for errors after recording
185189
VERBOSE Enable verbose logging 0
186190
JUNIT_OUT Path to write JUnit XML output unset
187191
RES_SUFFIX Suffix for unique result file and log directory unset
192+
LAVA_TESTCASE_ID Unique testcase ID written into the .res file for LAVA AudioRecord
188193
189194
190195
CLI Options:
@@ -200,6 +205,7 @@ Option Description
200205
--strict [0|1] Enable strict mode (0=disabled, 1=enabled)
201206
--no-dmesg Disable dmesg scan
202207
--res-suffix <suffix> Suffix for unique result file and log directory (e.g., "Config01" generates AudioRecord_Config01.res and results/AudioRecord_Config01/)
208+
--lava-testcase-id <id> Unique testcase ID written into the .res file for LAVA (e.g., "AudioRecord_Config01")
203209
--junit <file.xml> Write JUnit XML output
204210
--verbose Enable verbose logging
205211
--help Show usage instructions
@@ -310,7 +316,32 @@ AudioRecord_Config01.res
310316
AudioRecord_Config07.res
311317
```
312318

313-
**Example 7: Testing all 10 configs with short duration**
319+
**Example 7: CI/LAVA workflow with unique testcase IDs (prevents LAVA collisions)**
320+
```
321+
# Using --lava-testcase-id ensures unique testcase IDs in LAVA results
322+
# This prevents testcase ID collisions when running multiple AudioRecord configs in parallel
323+
324+
sh-5.3# ./run.sh --config-name "record_config1" --res-suffix "Config01" --lava-testcase-id "AudioRecord_Config01" --record-seconds 10s
325+
[INFO] 2026-01-12 07:20:15 - Using unique result file: ./AudioRecord_Config01.res
326+
[PASS] 2026-01-12 07:20:25 - AudioRecord PASS
327+
328+
sh-5.3# cat AudioRecord_Config01.res
329+
AudioRecord_Config01 PASS
330+
331+
sh-5.3# ./run.sh --config-name "record_config7" --res-suffix "Config07" --lava-testcase-id "AudioRecord_Config07" --record-seconds 10s
332+
[INFO] 2026-01-12 07:21:30 - Using unique result file: ./AudioRecord_Config07.res
333+
[PASS] 2026-01-12 07:21:40 - AudioRecord PASS
334+
335+
sh-5.3# cat AudioRecord_Config07.res
336+
AudioRecord_Config07 PASS
337+
338+
# LAVA will receive unique testcase IDs:
339+
# - AudioRecord_Config01 PASS
340+
# - AudioRecord_Config07 PASS
341+
# No testcase ID collisions!
342+
```
343+
344+
**Example 8: Testing all 10 configs with short duration**
314345
```
315346
sh-5.3# ./run.sh --record-seconds 3s
316347
[INFO] 2026-01-02 12:05:26 - Auto-detected config discovery mode (testing all 10 record configs)

Runner/suites/Multimedia/Audio/AudioRecord/run.sh

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,20 @@ if [ -d /run/systemd/system ] && command -v systemctl >/dev/null 2>&1; then
3939
fi
4040

4141
TESTNAME="AudioRecord"
42+
RESULT_TESTNAME="$TESTNAME"
4243
RES_SUFFIX="" # Optional suffix for unique result files (e.g., "Config1")
4344
# RES_FILE will be set after parsing command-line arguments
4445

45-
# Pre-parse --res-suffix for early failure handling
46-
# This ensures unique result files even if setup fails in parallel CI runs
46+
# Pre-parse --res-suffix and --lava-testcase-id for early failure handling
47+
# This ensures unique result files and unique testcase IDs even if setup fails in parallel CI runs
4748
prev_arg=""
4849
for arg in "$@"; do
4950
case "$prev_arg" in
5051
--res-suffix)
5152
RES_SUFFIX="$arg"
52-
break
53+
;;
54+
--lava-testcase-id)
55+
RESULT_TESTNAME="$arg"
5356
;;
5457
esac
5558
prev_arg="$arg"
@@ -145,6 +148,10 @@ while [ $# -gt 0 ]; do
145148
RES_SUFFIX="$2"
146149
shift 2
147150
;;
151+
--lava-testcase-id)
152+
RESULT_TESTNAME="$2"
153+
shift 2
154+
;;
148155
--durations)
149156
DURATIONS="$2"
150157
USE_CONFIG_DISCOVERY=false # Explicit durations = use old matrix mode
@@ -254,7 +261,7 @@ trap 'audio_cleanup_started_daemons' EXIT HUP INT TERM
254261
test_path="$(find_test_case_by_name "$TESTNAME" 2>/dev/null || echo "$SCRIPT_DIR")"
255262
if ! cd "$test_path"; then
256263
log_error "cd failed: $test_path"
257-
echo "$TESTNAME FAIL" > "$RES_FILE"
264+
echo "$RESULT_TESTNAME FAIL" > "$RES_FILE"
258265
exit 1
259266
fi
260267

@@ -273,7 +280,7 @@ fi
273280
if { [ -n "$CONFIG_NAMES" ] || [ -n "$CONFIG_FILTER" ]; } && [ -n "$DURATIONS" ]; then
274281
log_error "Cannot mix config discovery parameters (--config-name, --config-filter) with legacy matrix parameters (--durations)"
275282
log_error "Please use either config discovery mode OR legacy matrix mode, not both"
276-
echo "$TESTNAME SKIP" > "$RES_FILE"
283+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
277284
exit 0
278285
fi
279286

@@ -335,7 +342,7 @@ if [ -z "$AUDIO_BACKEND" ]; then
335342
log_warn "$TESTNAME: no managed audio backend running - using direct ALSA capture path"
336343
else
337344
log_skip "$TESTNAME SKIP - no audio backend running and ALSA capture probe failed: ${AUDIO_ALSA_CAPTURE_REASON:-capture path unavailable}"
338-
echo "$TESTNAME SKIP" > "$RES_FILE"
345+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
339346
exit 0
340347
fi
341348
fi
@@ -403,7 +410,7 @@ if [ "$backend_ok" -ne 1 ]; then
403410
else
404411
log_skip "$TESTNAME SKIP - backend not available: $AUDIO_BACKEND"
405412
fi
406-
echo "$TESTNAME SKIP" > "$RES_FILE"
413+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
407414
exit 0
408415
fi
409416

@@ -412,27 +419,27 @@ case "$AUDIO_BACKEND" in
412419
pipewire)
413420
if ! check_dependencies wpctl pw-record; then
414421
log_skip "$TESTNAME SKIP - missing PipeWire utils"
415-
echo "$TESTNAME SKIP" > "$RES_FILE"
422+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
416423
exit 0
417424
fi
418425
;;
419426
pulseaudio)
420427
if ! check_dependencies pactl parecord; then
421428
log_skip "$TESTNAME SKIP - missing PulseAudio utils"
422-
echo "$TESTNAME SKIP" > "$RES_FILE"
429+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
423430
exit 0
424431
fi
425432
;;
426433
alsa)
427434
if ! check_dependencies arecord; then
428435
log_skip "$TESTNAME SKIP - missing arecord"
429-
echo "$TESTNAME SKIP" > "$RES_FILE"
436+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
430437
exit 0
431438
fi
432439
;;
433440
*)
434441
log_skip "$TESTNAME SKIP - unsupported backend: $AUDIO_BACKEND"
435-
echo "$TESTNAME SKIP" > "$RES_FILE"
442+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
436443
exit 0
437444
;;
438445
esac
@@ -452,7 +459,7 @@ if [ "$AUDIO_BACKEND" = "pipewire" ]; then
452459
fi
453460
if ! audio_pw_ctl_ok 2>/dev/null; then
454461
log_skip "$TESTNAME SKIP - PipeWire control-plane not responsive"
455-
echo "$TESTNAME SKIP" > "$RES_FILE"
462+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
456463
exit 0
457464
fi
458465
fi
@@ -470,7 +477,7 @@ elif [ "$AUDIO_BACKEND" = "pulseaudio" ]; then
470477
fi
471478
if ! audio_pa_ctl_ok 2>/dev/null; then
472479
log_skip "$TESTNAME SKIP - PulseAudio control-plane not responsive"
473-
echo "$TESTNAME SKIP" > "$RES_FILE"
480+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
474481
exit 0
475482
fi
476483
fi
@@ -543,7 +550,7 @@ fi
543550
# Only skip if no source AND not on PipeWire.
544551
if [ -z "$SRC_ID" ] && [ "$AUDIO_BACKEND" != "pipewire" ]; then
545552
log_skip "$TESTNAME SKIP - requested source '$SRC_CHOICE' not available on any backend (${BACKENDS_TO_TRY:-unknown})"
546-
echo "$TESTNAME SKIP" > "$RES_FILE"
553+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
547554
exit 0
548555
fi
549556

@@ -574,7 +581,7 @@ if [ "$AUDIO_BACKEND" = "alsa" ]; then
574581
log_info "ALSA auto-pick: using $SRC_ID"
575582
else
576583
log_skip "$TESTNAME SKIP - no valid ALSA capture device found"
577-
echo "$TESTNAME SKIP" > "$RES_FILE"
584+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
578585
exit 0
579586
fi
580587
;;
@@ -606,21 +613,21 @@ case "$AUDIO_BACKEND" in
606613
pipewire)
607614
if ! check_dependencies wpctl pw-record; then
608615
log_skip "$TESTNAME SKIP - missing PipeWire utils"
609-
echo "$TESTNAME SKIP" > "$RES_FILE"
616+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
610617
exit 0
611618
fi
612619
;;
613620
pulseaudio)
614621
if ! check_dependencies pactl parecord; then
615622
log_skip "$TESTNAME SKIP - missing PulseAudio utils"
616-
echo "$TESTNAME SKIP" > "$RES_FILE"
623+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
617624
exit 0
618625
fi
619626
;;
620627
alsa)
621628
if ! check_dependencies arecord; then
622629
log_skip "$TESTNAME SKIP - missing arecord"
623-
echo "$TESTNAME SKIP" > "$RES_FILE"
630+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
624631
exit 0
625632
fi
626633
;;
@@ -696,20 +703,20 @@ if [ "$USE_CONFIG_DISCOVERY" = "true" ]; then
696703
if [ -n "$CONFIG_NAMES" ] || [ -n "$CONFIG_FILTER" ]; then
697704
CONFIGS_TO_TEST="$(discover_and_filter_record_configs "$CONFIG_NAMES" "$CONFIG_FILTER")" || {
698705
log_skip "$TESTNAME SKIP - Invalid config name(s) provided"
699-
echo "$TESTNAME SKIP" > "$RES_FILE"
706+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
700707
exit 0
701708
}
702709
else
703710
CONFIGS_TO_TEST="$(discover_record_configs)" || {
704711
log_skip "$TESTNAME SKIP - No record configs found"
705-
echo "$TESTNAME SKIP" > "$RES_FILE"
712+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
706713
exit 0
707714
}
708715
fi
709716

710717
if [ -z "$CONFIGS_TO_TEST" ]; then
711718
log_skip "$TESTNAME SKIP - No valid record configs found"
712-
echo "$TESTNAME SKIP" > "$RES_FILE"
719+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
713720
exit 0
714721
fi
715722

@@ -1334,22 +1341,22 @@ log_info "Summary: total=$total pass=$pass fail=$fail skip=$skip"
13341341
# --- Proper exit codes: PASS=0, FAIL=1, SKIP-only=0 ---
13351342
if [ "$total" -eq 0 ] && [ "$pass" -eq 0 ] && [ "$fail" -eq 0 ]; then
13361343
log_skip "$TESTNAME SKIP - no runnable record testcases"
1337-
echo "$TESTNAME SKIP" > "$RES_FILE"
1344+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
13381345
exit 0
13391346
fi
13401347

13411348
if [ "$pass" -eq 0 ] && [ "$fail" -eq 0 ] && [ "$skip" -gt 0 ]; then
13421349
log_skip "$TESTNAME SKIP"
1343-
echo "$TESTNAME SKIP" > "$RES_FILE"
1350+
echo "$RESULT_TESTNAME SKIP" > "$RES_FILE"
13441351
exit 0
13451352
fi
13461353

13471354
if [ "$suite_rc" -eq 0 ]; then
13481355
log_pass "$TESTNAME PASS"
1349-
echo "$TESTNAME PASS" > "$RES_FILE"
1356+
echo "$RESULT_TESTNAME PASS" > "$RES_FILE"
13501357
exit 0
13511358
fi
13521359

13531360
log_fail "$TESTNAME FAIL"
1354-
echo "$TESTNAME FAIL" > "$RES_FILE"
1361+
echo "$RESULT_TESTNAME FAIL" > "$RES_FILE"
13551362
exit 1

0 commit comments

Comments
 (0)