selftests: alsa: Start validating control names
authorMark Brown <broonie@kernel.org>
Thu, 21 Apr 2022 11:50:20 +0000 (12:50 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 25 Apr 2022 05:52:05 +0000 (07:52 +0200)
Not much of a test but we keep on getting problems with boolean controls
not being called Switches so let's add a few basic checks to help people
spot problems.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20220421115020.14118-1-broonie@kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
tools/testing/selftests/alsa/mixer-test.c

index eb22135..a38b89c 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "../kselftest.h"
 
-#define TESTS_PER_CONTROL 6
+#define TESTS_PER_CONTROL 7
 
 struct card_data {
        snd_ctl_t *handle;
@@ -456,6 +456,44 @@ out:
                         ctl->card->card, ctl->elem);
 }
 
+static bool strend(const char *haystack, const char *needle)
+{
+       size_t haystack_len = strlen(haystack);
+       size_t needle_len = strlen(needle);
+
+       if (needle_len > haystack_len)
+               return false;
+       return strcmp(haystack + haystack_len - needle_len, needle) == 0;
+}
+
+static void test_ctl_name(struct ctl_data *ctl)
+{
+       bool name_ok = true;
+       bool check;
+
+       /* Only boolean controls should end in Switch */
+       if (strend(ctl->name, " Switch")) {
+               if (snd_ctl_elem_info_get_type(ctl->info) != SND_CTL_ELEM_TYPE_BOOLEAN) {
+                       ksft_print_msg("%d.%d %s ends in Switch but is not boolean\n",
+                                      ctl->card->card, ctl->elem, ctl->name);
+                       name_ok = false;
+               }
+       }
+
+       /* Writeable boolean controls should end in Switch */
+       if (snd_ctl_elem_info_get_type(ctl->info) == SND_CTL_ELEM_TYPE_BOOLEAN &&
+           snd_ctl_elem_info_is_writable(ctl->info)) {
+               if (!strend(ctl->name, " Switch")) {
+                       ksft_print_msg("%d.%d %s is a writeable boolean but not a Switch\n",
+                                      ctl->card->card, ctl->elem, ctl->name);
+                       name_ok = false;
+               }
+       }
+
+       ksft_test_result(name_ok, "name.%d.%d\n",
+                        ctl->card->card, ctl->elem);
+}
+
 static bool show_mismatch(struct ctl_data *ctl, int index,
                          snd_ctl_elem_value_t *read_val,
                          snd_ctl_elem_value_t *expected_val)
@@ -1062,6 +1100,7 @@ int main(void)
                 * test stores the default value for later cleanup.
                 */
                test_ctl_get_value(ctl);
+               test_ctl_name(ctl);
                test_ctl_write_default(ctl);
                test_ctl_write_valid(ctl);
                test_ctl_write_invalid(ctl);