[pulseaudio-discuss] [PATCH] tests: Add tests for alsa-mixer paths

David Henningsson david.henningsson at canonical.com
Fri Mar 22 11:43:43 PDT 2013


On 03/22/2013 07:00 PM, Tanu Kaskinen wrote:
> On Fri, 2013-03-22 at 15:37 +0100, David Henningsson wrote:
>> It checks all files in the mixer/paths directory and checks
>>   - that the file can be parsed without errors
>>   - that the file is actually shipped in the makefile
>>
>> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
>> ---
>>
>> After I realized that my previous headset-mic patch did not event ship the new file,
>> I also realized I might do the same mistake again.
>>
>> I guess this could be enhanced later with checking that profile-sets do not point
>> to non-existent paths etc, but this will do for now.
>>
>>   src/Makefile.am                  |    7 +++
>>   src/tests/alsa-mixer-path-test.c |  110 ++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 117 insertions(+)
>>   create mode 100644 src/tests/alsa-mixer-path-test.c
>>
>> diff --git a/src/Makefile.am b/src/Makefile.am
>> index 7685e0c..3326a2c 100644
>> --- a/src/Makefile.am
>> +++ b/src/Makefile.am
>> @@ -297,6 +297,8 @@ endif
>>   if HAVE_ALSA
>>   TESTS_norun += \
>>   		alsa-time-test
>> +TESTS_default += \
>> +		alsa-mixer-path-test
>>   endif
>>
>>   if HAVE_TESTS
>> @@ -545,6 +547,11 @@ alsa_time_test_LDADD = $(AM_LDADD) $(ASOUNDLIB_LIBS)
>>   alsa_time_test_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS)
>>   alsa_time_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS)
>>
>> +alsa_mixer_path_test_SOURCES = tests/alsa-mixer-path-test.c
>> +alsa_mixer_path_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) $(ASOUNDLIB_CFLAGS)
>> +alsa_mixer_path_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINOR@.la libpulse.la libpulsecommon- at PA_MAJORMINOR@.la libalsa-util.la
>> +alsa_mixer_path_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS)
>> +
>>   usergroup_test_SOURCES = tests/usergroup-test.c
>>   usergroup_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINOR@.la libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
>>   usergroup_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS)
>> diff --git a/src/tests/alsa-mixer-path-test.c b/src/tests/alsa-mixer-path-test.c
>> new file mode 100644
>> index 0000000..2460c66
>> --- /dev/null
>> +++ b/src/tests/alsa-mixer-path-test.c
>> @@ -0,0 +1,110 @@
>> +#ifdef HAVE_CONFIG_H
>> +#include <config.h>
>> +#endif
>> +
>> +#include <check.h>
>> +#include <dirent.h>
>> +#include <stdbool.h>
>> +#include <stdio.h>
>> +
>> +#include <pulse/pulseaudio.h>
>> +#include <pulsecore/log.h>
>> +#include <pulsecore/core-util.h>
>> +#include <pulsecore/strlist.h>
>> +#include <modules/alsa/alsa-mixer.h>
>> +
>> +
>> +static const char *get_default_paths_dir(void) {
>> +    if (pa_run_from_build_tree())
>> +        return PA_BUILDDIR "/modules/alsa/mixer/paths/";
>
> This doesn't work if the build directory is different from the source
> directory. Instead of PA_BUILDDIR, this should use PA_SRCDIR, which
> doesn't currently exist, but it should be possible to add it.

It is copy-pasted from existing pulseaudio code (in alsa-mixer.c, IIRC). 
If you fix it there, feel free to do so here to.

But I do an out-of-source build normally (according to Colin's old but 
excellent instructions), and my test worked siccessfully. I do remember 
though that Colin's instructions include making some related symlink.

>
>> +    else
>> +        return PA_ALSA_PATHS_DIR;
>> +}
>> +
>> +static pa_strlist *load_makefile() {
>> +    FILE *f;
>> +    bool lookforfiles = false;
>> +    char buf[2048];
>> +    pa_strlist *result = NULL;
>> +    const char *Makefile = PA_BUILDDIR "/Makefile";
>> +
>> +    f = pa_fopen_cloexec(Makefile, "r");
>> +    fail_unless(f != NULL); /* Consider skipping this test instead of failing if Makefile not found? */
>
> If you want my opinion to the question, I think it's fine to assume that
> Makefile is always found.

Ok.

>
>> +    while (!feof(f)) {
>> +        if (!fgets(buf, sizeof(buf), f)) {
>> +            fail_unless(feof(f));
>
> The loop condition is !feof(f), so this will always fail. The if could
> be replaced with fail_unless(fgets(buf, sizeof(buf), f));

Eh, I don't think so?

If you're sure, could you please correct the code in pa_config_parse 
which works the same way?

>> +            break;
>> +        }
>> +        if (strstr(buf, "dist_alsapaths_DATA = \\") != NULL) {
>> +           lookforfiles = true;
>> +           continue;
>> +        }
>> +        if (!lookforfiles)
>> +           continue;
>> +        if (!strstr(buf, "\\"))
>> +           lookforfiles = false;
>> +        else
>> +           strstr(buf, "\\")[0] = '\0';
>> +        pa_strip(buf);
>> +        pa_log_debug("Shipping file '%s'", pa_path_get_filename(buf));
>> +        result = pa_strlist_prepend(result, pa_path_get_filename(buf));
>> +    }
>> +    fclose(f);
>> +    return result;
>> +}
>> +
>> +
>> +START_TEST (mixer_path_test) {
>> +    DIR *dir;
>> +    struct dirent *ent;
>> +    pa_strlist *ship = load_makefile();
>
> This strlist is never freed.

Ok.

>
>> +    const char *pathsdir = get_default_paths_dir();
>> +    pa_log_debug("Analyzing directory: '%s'", pathsdir);
>> +
>> +    dir = opendir(pathsdir);
>> +    fail_unless(dir != NULL);
>> +    while ((ent = readdir(dir)) != NULL) {
>> +        pa_alsa_path *path;
>> +        if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
>
> pa_streq() could be used here.

Ok.

>
>> +            continue;
>> +        pa_log_debug("Analyzing file: '%s'", ent->d_name);
>> +
>> +        /* Can the file be parsed? */
>> +        path = pa_alsa_path_new(pathsdir, ent->d_name, PA_ALSA_DIRECTION_ANY);
>> +        fail_unless(path != NULL);
>> +
>> +        /* Is the file shipped? */
>> +        if (ship) {
>> +            pa_strlist *n;
>> +            bool found = false;
>> +            for (n = ship; n; n = pa_strlist_next(n))
>> +                found |= pa_streq(ent->d_name, pa_strlist_data(n));
>> +            fail_unless(found);
>> +        }
>> +    }
>> +    closedir(dir);
>> +}
>> +END_TEST
>> +
>> +int main(int argc, char *argv[]) {
>> +    int failed = 0;
>> +    Suite *s;
>> +    TCase *tc;
>> +    SRunner *sr;
>> +
>> +    if (!getenv("MAKE_CHECK"))
>> +        pa_log_set_level(PA_LOG_DEBUG);
>> +
>> +    s = suite_create("Alsa-mixer-path");
>> +    tc = tcase_create("alsa-mixer-path");
>> +    tcase_add_test(tc, mixer_path_test);
>> +    tcase_set_timeout(tc, 5 * 60);
>
> 5 minutes seems a bit excessive for this test...

Ok, 30 seconds will do.



-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list