Skip to content

Commit b1a7b97

Browse files
broonietiwai
authored andcommitted
kselftest/alsa: Use card name rather than number in test names
Currently for the PCM and mixer tests we report test names which identify the card being tested with the card number. This ensures we have unique names but since card numbers are dynamically assigned at runtime the names we end up with will often not be stable on systems with multiple cards especially where those cards are provided by separate modules loeaded at runtime. This makes it difficult for automated systems and UIs to relate test results between runs on affected platforms. Address this by replacing our use of card numbers with card names which are more likely to be stable across runs. We use the card ID since it is guaranteed to be unique by default, unlike the long name. There is still some vulnerability to ordering issues if multiple cards with the same base ID are present in the system but have separate dependencies but not all drivers put distinguishing information in their long names. Signed-off-by: Mark Brown <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent d7063c0 commit b1a7b97

File tree

2 files changed

+104
-58
lines changed

2 files changed

+104
-58
lines changed

tools/testing/selftests/alsa/mixer-test.c

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
struct card_data {
3434
snd_ctl_t *handle;
3535
int card;
36+
snd_ctl_card_info_t *info;
37+
const char *card_name;
3638
struct pollfd pollfd;
3739
int num_ctls;
3840
snd_ctl_elem_list_t *ctls;
@@ -91,8 +93,26 @@ static void find_controls(void)
9193
err = snd_card_get_longname(card, &card_longname);
9294
if (err != 0)
9395
card_longname = "Unknown";
94-
ksft_print_msg("Card %d - %s (%s)\n", card,
95-
card_name, card_longname);
96+
97+
err = snd_ctl_card_info_malloc(&card_data->info);
98+
if (err != 0)
99+
ksft_exit_fail_msg("Failed to allocate card info: %d\n",
100+
err);
101+
102+
err = snd_ctl_card_info(card_data->handle, card_data->info);
103+
if (err == 0) {
104+
card_data->card_name = snd_ctl_card_info_get_id(card_data->info);
105+
if (!card_data->card_name)
106+
ksft_print_msg("Failed to get card ID\n");
107+
} else {
108+
ksft_print_msg("Failed to get card info: %d\n", err);
109+
}
110+
111+
if (!card_data->card_name)
112+
card_data->card_name = "Unknown";
113+
114+
ksft_print_msg("Card %d/%s - %s (%s)\n", card,
115+
card_data->card_name, card_name, card_longname);
96116

97117
/* Count controls */
98118
snd_ctl_elem_list_malloc(&card_data->ctls);
@@ -389,16 +409,16 @@ static void test_ctl_get_value(struct ctl_data *ctl)
389409
/* If the control is turned off let's be polite */
390410
if (snd_ctl_elem_info_is_inactive(ctl->info)) {
391411
ksft_print_msg("%s is inactive\n", ctl->name);
392-
ksft_test_result_skip("get_value.%d.%d\n",
393-
ctl->card->card, ctl->elem);
412+
ksft_test_result_skip("get_value.%s.%d\n",
413+
ctl->card->card_name, ctl->elem);
394414
return;
395415
}
396416

397417
/* Can't test reading on an unreadable control */
398418
if (!snd_ctl_elem_info_is_readable(ctl->info)) {
399419
ksft_print_msg("%s is not readable\n", ctl->name);
400-
ksft_test_result_skip("get_value.%d.%d\n",
401-
ctl->card->card, ctl->elem);
420+
ksft_test_result_skip("get_value.%s.%d\n",
421+
ctl->card->card_name, ctl->elem);
402422
return;
403423
}
404424

@@ -413,8 +433,8 @@ static void test_ctl_get_value(struct ctl_data *ctl)
413433
err = -EINVAL;
414434

415435
out:
416-
ksft_test_result(err >= 0, "get_value.%d.%d\n",
417-
ctl->card->card, ctl->elem);
436+
ksft_test_result(err >= 0, "get_value.%s.%d\n",
437+
ctl->card->card_name, ctl->elem);
418438
}
419439

420440
static bool strend(const char *haystack, const char *needle)
@@ -431,7 +451,7 @@ static void test_ctl_name(struct ctl_data *ctl)
431451
{
432452
bool name_ok = true;
433453

434-
ksft_print_msg("%d.%d %s\n", ctl->card->card, ctl->elem,
454+
ksft_print_msg("%s.%d %s\n", ctl->card->card_name, ctl->elem,
435455
ctl->name);
436456

437457
/* Only boolean controls should end in Switch */
@@ -453,8 +473,8 @@ static void test_ctl_name(struct ctl_data *ctl)
453473
}
454474
}
455475

456-
ksft_test_result(name_ok, "name.%d.%d\n",
457-
ctl->card->card, ctl->elem);
476+
ksft_test_result(name_ok, "name.%s.%d\n",
477+
ctl->card->card_name, ctl->elem);
458478
}
459479

460480
static void show_values(struct ctl_data *ctl, snd_ctl_elem_value_t *orig_val,
@@ -695,30 +715,30 @@ static void test_ctl_write_default(struct ctl_data *ctl)
695715
/* If the control is turned off let's be polite */
696716
if (snd_ctl_elem_info_is_inactive(ctl->info)) {
697717
ksft_print_msg("%s is inactive\n", ctl->name);
698-
ksft_test_result_skip("write_default.%d.%d\n",
699-
ctl->card->card, ctl->elem);
718+
ksft_test_result_skip("write_default.%s.%d\n",
719+
ctl->card->card_name, ctl->elem);
700720
return;
701721
}
702722

703723
if (!snd_ctl_elem_info_is_writable(ctl->info)) {
704724
ksft_print_msg("%s is not writeable\n", ctl->name);
705-
ksft_test_result_skip("write_default.%d.%d\n",
706-
ctl->card->card, ctl->elem);
725+
ksft_test_result_skip("write_default.%s.%d\n",
726+
ctl->card->card_name, ctl->elem);
707727
return;
708728
}
709729

710730
/* No idea what the default was for unreadable controls */
711731
if (!snd_ctl_elem_info_is_readable(ctl->info)) {
712732
ksft_print_msg("%s couldn't read default\n", ctl->name);
713-
ksft_test_result_skip("write_default.%d.%d\n",
714-
ctl->card->card, ctl->elem);
733+
ksft_test_result_skip("write_default.%s.%d\n",
734+
ctl->card->card_name, ctl->elem);
715735
return;
716736
}
717737

718738
err = write_and_verify(ctl, ctl->def_val, NULL);
719739

720-
ksft_test_result(err >= 0, "write_default.%d.%d\n",
721-
ctl->card->card, ctl->elem);
740+
ksft_test_result(err >= 0, "write_default.%s.%d\n",
741+
ctl->card->card_name, ctl->elem);
722742
}
723743

724744
static bool test_ctl_write_valid_boolean(struct ctl_data *ctl)
@@ -828,15 +848,15 @@ static void test_ctl_write_valid(struct ctl_data *ctl)
828848
/* If the control is turned off let's be polite */
829849
if (snd_ctl_elem_info_is_inactive(ctl->info)) {
830850
ksft_print_msg("%s is inactive\n", ctl->name);
831-
ksft_test_result_skip("write_valid.%d.%d\n",
832-
ctl->card->card, ctl->elem);
851+
ksft_test_result_skip("write_valid.%s.%d\n",
852+
ctl->card->card_name, ctl->elem);
833853
return;
834854
}
835855

836856
if (!snd_ctl_elem_info_is_writable(ctl->info)) {
837857
ksft_print_msg("%s is not writeable\n", ctl->name);
838-
ksft_test_result_skip("write_valid.%d.%d\n",
839-
ctl->card->card, ctl->elem);
858+
ksft_test_result_skip("write_valid.%s.%d\n",
859+
ctl->card->card_name, ctl->elem);
840860
return;
841861
}
842862

@@ -859,16 +879,16 @@ static void test_ctl_write_valid(struct ctl_data *ctl)
859879

860880
default:
861881
/* No tests for this yet */
862-
ksft_test_result_skip("write_valid.%d.%d\n",
863-
ctl->card->card, ctl->elem);
882+
ksft_test_result_skip("write_valid.%s.%d\n",
883+
ctl->card->card_name, ctl->elem);
864884
return;
865885
}
866886

867887
/* Restore the default value to minimise disruption */
868888
write_and_verify(ctl, ctl->def_val, NULL);
869889

870-
ksft_test_result(pass, "write_valid.%d.%d\n",
871-
ctl->card->card, ctl->elem);
890+
ksft_test_result(pass, "write_valid.%s.%d\n",
891+
ctl->card->card_name, ctl->elem);
872892
}
873893

874894
static bool test_ctl_write_invalid_value(struct ctl_data *ctl,
@@ -1040,15 +1060,15 @@ static void test_ctl_write_invalid(struct ctl_data *ctl)
10401060
/* If the control is turned off let's be polite */
10411061
if (snd_ctl_elem_info_is_inactive(ctl->info)) {
10421062
ksft_print_msg("%s is inactive\n", ctl->name);
1043-
ksft_test_result_skip("write_invalid.%d.%d\n",
1044-
ctl->card->card, ctl->elem);
1063+
ksft_test_result_skip("write_invalid.%s.%d\n",
1064+
ctl->card->card_name, ctl->elem);
10451065
return;
10461066
}
10471067

10481068
if (!snd_ctl_elem_info_is_writable(ctl->info)) {
10491069
ksft_print_msg("%s is not writeable\n", ctl->name);
1050-
ksft_test_result_skip("write_invalid.%d.%d\n",
1051-
ctl->card->card, ctl->elem);
1070+
ksft_test_result_skip("write_invalid.%s.%d\n",
1071+
ctl->card->card_name, ctl->elem);
10521072
return;
10531073
}
10541074

@@ -1071,28 +1091,28 @@ static void test_ctl_write_invalid(struct ctl_data *ctl)
10711091

10721092
default:
10731093
/* No tests for this yet */
1074-
ksft_test_result_skip("write_invalid.%d.%d\n",
1075-
ctl->card->card, ctl->elem);
1094+
ksft_test_result_skip("write_invalid.%s.%d\n",
1095+
ctl->card->card_name, ctl->elem);
10761096
return;
10771097
}
10781098

10791099
/* Restore the default value to minimise disruption */
10801100
write_and_verify(ctl, ctl->def_val, NULL);
10811101

1082-
ksft_test_result(pass, "write_invalid.%d.%d\n",
1083-
ctl->card->card, ctl->elem);
1102+
ksft_test_result(pass, "write_invalid.%s.%d\n",
1103+
ctl->card->card_name, ctl->elem);
10841104
}
10851105

10861106
static void test_ctl_event_missing(struct ctl_data *ctl)
10871107
{
1088-
ksft_test_result(!ctl->event_missing, "event_missing.%d.%d\n",
1089-
ctl->card->card, ctl->elem);
1108+
ksft_test_result(!ctl->event_missing, "event_missing.%s.%d\n",
1109+
ctl->card->card_name, ctl->elem);
10901110
}
10911111

10921112
static void test_ctl_event_spurious(struct ctl_data *ctl)
10931113
{
1094-
ksft_test_result(!ctl->event_spurious, "event_spurious.%d.%d\n",
1095-
ctl->card->card, ctl->elem);
1114+
ksft_test_result(!ctl->event_spurious, "event_spurious.%s.%d\n",
1115+
ctl->card->card_name, ctl->elem);
10961116
}
10971117

10981118
int main(void)

tools/testing/selftests/alsa/pcm-test.c

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ typedef struct timespec timestamp_t;
2424

2525
struct card_data {
2626
int card;
27+
snd_ctl_card_info_t *info;
28+
const char *name;
2729
pthread_t thread;
2830
struct card_data *next;
2931
};
@@ -35,6 +37,7 @@ struct pcm_data {
3537
int card;
3638
int device;
3739
int subdevice;
40+
const char *card_name;
3841
snd_pcm_stream_t stream;
3942
snd_config_t *pcm_config;
4043
struct pcm_data *next;
@@ -167,6 +170,10 @@ static void find_pcms(void)
167170
config = get_alsalib_config();
168171

169172
while (card >= 0) {
173+
card_data = calloc(1, sizeof(*card_data));
174+
if (!card_data)
175+
ksft_exit_fail_msg("Out of memory\n");
176+
170177
sprintf(name, "hw:%d", card);
171178

172179
err = snd_ctl_open_lconf(&handle, name, 0, config);
@@ -182,14 +189,29 @@ static void find_pcms(void)
182189
err = snd_card_get_longname(card, &card_longname);
183190
if (err != 0)
184191
card_longname = "Unknown";
185-
ksft_print_msg("Card %d - %s (%s)\n", card,
186-
card_name, card_longname);
192+
193+
err = snd_ctl_card_info_malloc(&card_data->info);
194+
if (err != 0)
195+
ksft_exit_fail_msg("Failed to allocate card info: %d\n",
196+
err);
197+
198+
err = snd_ctl_card_info(handle, card_data->info);
199+
if (err == 0) {
200+
card_data->name = snd_ctl_card_info_get_id(card_data->info);
201+
if (!card_data->name)
202+
ksft_print_msg("Failed to get card ID\n");
203+
} else {
204+
ksft_print_msg("Failed to get card info: %d\n", err);
205+
}
206+
207+
if (!card_data->name)
208+
card_data->name = "Unknown";
209+
210+
ksft_print_msg("Card %d/%s - %s (%s)\n", card,
211+
card_data->name, card_name, card_longname);
187212

188213
card_config = conf_by_card(card);
189214

190-
card_data = calloc(1, sizeof(*card_data));
191-
if (!card_data)
192-
ksft_exit_fail_msg("Out of memory\n");
193215
card_data->card = card;
194216
card_data->next = card_list;
195217
card_list = card_data;
@@ -232,6 +254,7 @@ static void find_pcms(void)
232254
pcm_data->card = card;
233255
pcm_data->device = dev;
234256
pcm_data->subdevice = subdev;
257+
pcm_data->card_name = card_data->name;
235258
pcm_data->stream = stream;
236259
pcm_data->pcm_config = conf_get_subtree(card_config, key, NULL);
237260
pcm_data->next = pcm_list;
@@ -294,9 +317,9 @@ static void test_pcm_time(struct pcm_data *data, enum test_class class,
294317

295318
desc = conf_get_string(pcm_cfg, "description", NULL, NULL);
296319
if (desc)
297-
ksft_print_msg("%s.%s.%d.%d.%d.%s - %s\n",
320+
ksft_print_msg("%s.%s.%s.%d.%d.%s - %s\n",
298321
test_class_name, test_name,
299-
data->card, data->device, data->subdevice,
322+
data->card_name, data->device, data->subdevice,
300323
snd_pcm_stream_name(data->stream),
301324
desc);
302325

@@ -352,9 +375,9 @@ static void test_pcm_time(struct pcm_data *data, enum test_class class,
352375
old_format = format;
353376
format = snd_pcm_format_value(alt_formats[i]);
354377
if (format != SND_PCM_FORMAT_UNKNOWN) {
355-
ksft_print_msg("%s.%d.%d.%d.%s.%s format %s -> %s\n",
378+
ksft_print_msg("%s.%s.%d.%d.%s.%s format %s -> %s\n",
356379
test_name,
357-
data->card, data->device, data->subdevice,
380+
data->card_name, data->device, data->subdevice,
358381
snd_pcm_stream_name(data->stream),
359382
snd_pcm_access_name(access),
360383
snd_pcm_format_name(old_format),
@@ -430,9 +453,9 @@ static void test_pcm_time(struct pcm_data *data, enum test_class class,
430453
goto __close;
431454
}
432455

433-
ksft_print_msg("%s.%s.%d.%d.%d.%s hw_params.%s.%s.%ld.%ld.%ld.%ld sw_params.%ld\n",
456+
ksft_print_msg("%s.%s.%s.%d.%d.%s hw_params.%s.%s.%ld.%ld.%ld.%ld sw_params.%ld\n",
434457
test_class_name, test_name,
435-
data->card, data->device, data->subdevice,
458+
data->card_name, data->device, data->subdevice,
436459
snd_pcm_stream_name(data->stream),
437460
snd_pcm_access_name(access),
438461
snd_pcm_format_name(format),
@@ -491,24 +514,27 @@ static void test_pcm_time(struct pcm_data *data, enum test_class class,
491514
* Anything specified as specific to this system
492515
* should always be supported.
493516
*/
494-
ksft_test_result(!skip, "%s.%s.%d.%d.%d.%s.params\n",
517+
ksft_test_result(!skip, "%s.%s.%s.%d.%d.%s.params\n",
495518
test_class_name, test_name,
496-
data->card, data->device, data->subdevice,
519+
data->card_name, data->device,
520+
data->subdevice,
497521
snd_pcm_stream_name(data->stream));
498522
break;
499523
default:
500524
break;
501525
}
502526

503527
if (!skip)
504-
ksft_test_result(pass, "%s.%s.%d.%d.%d.%s\n",
528+
ksft_test_result(pass, "%s.%s.%s.%d.%d.%s\n",
505529
test_class_name, test_name,
506-
data->card, data->device, data->subdevice,
530+
data->card_name, data->device,
531+
data->subdevice,
507532
snd_pcm_stream_name(data->stream));
508533
else
509-
ksft_test_result_skip("%s.%s.%d.%d.%d.%s\n",
534+
ksft_test_result_skip("%s.%s.%s.%d.%d.%s\n",
510535
test_class_name, test_name,
511-
data->card, data->device, data->subdevice,
536+
data->card_name, data->device,
537+
data->subdevice,
512538
snd_pcm_stream_name(data->stream));
513539

514540
if (msg[0])
@@ -609,8 +635,8 @@ int main(void)
609635
conf->filename, conf->config_id);
610636

611637
for (pcm = pcm_missing; pcm != NULL; pcm = pcm->next) {
612-
ksft_test_result(false, "test.missing.%d.%d.%d.%s\n",
613-
pcm->card, pcm->device, pcm->subdevice,
638+
ksft_test_result(false, "test.missing.%s.%d.%d.%s\n",
639+
pcm->card_name, pcm->device, pcm->subdevice,
614640
snd_pcm_stream_name(pcm->stream));
615641
}
616642

0 commit comments

Comments
 (0)