1#ifdef HAVE_CONFIG_H
2#include <config.h>
3#endif
4
5#include <check.h>
6#include <dirent.h>
7#include <stdbool.h>
8#include <stdio.h>
9
10#include <pulse/pulseaudio.h>
11#include <pulsecore/log.h>
12#include <pulsecore/core-util.h>
13#include <pulsecore/strlist.h>
14#include <modules/alsa/alsa-mixer.h>
15
16/* This test inspects the Makefile, so this is not applicable when using
17 * Meson. */
18#ifndef MESON_BUILD
19
20static const char *get_default_paths_dir(void) {
21    if (pa_run_from_build_tree())
22        return PA_SRCDIR "/modules/alsa/mixer/paths/";
23    else
24        return PA_ALSA_PATHS_DIR;
25}
26
27static pa_strlist *load_makefile() {
28    FILE *f;
29    bool lookforfiles = false;
30    char buf[2048];
31    pa_strlist *result = NULL;
32    const char *Makefile = PA_BUILDDIR "/Makefile";
33
34    f = pa_fopen_cloexec(Makefile, "r");
35    fail_unless(f != NULL); /* Consider skipping this test instead of failing if Makefile not found? */
36    while (!feof(f)) {
37        if (!fgets(buf, sizeof(buf), f)) {
38            fail_unless(feof(f));
39            break;
40        }
41        if (strstr(buf, "dist_alsapaths_DATA = \\") != NULL) {
42           lookforfiles = true;
43           continue;
44        }
45        if (!lookforfiles)
46           continue;
47        if (!strstr(buf, "\\"))
48           lookforfiles = false;
49        else
50           strstr(buf, "\\")[0] = '\0';
51        pa_strip(buf);
52        pa_log_debug("Shipping file '%s'", pa_path_get_filename(buf));
53        result = pa_strlist_prepend(result, pa_path_get_filename(buf));
54    }
55    fclose(f);
56    return result;
57}
58#endif /* end of #ifndef MESON_BUILD */
59
60START_TEST (mixer_path_test) {
61#ifdef MESON_BUILD
62    pa_log_info("Test disabled for meson build");
63    return;
64#else
65    DIR *dir;
66    struct dirent *ent;
67    pa_strlist *ship = load_makefile();
68    const char *pathsdir = get_default_paths_dir();
69    pa_log_debug("Analyzing directory: '%s'", pathsdir);
70
71    dir = opendir(pathsdir);
72    fail_unless(dir != NULL);
73    while ((ent = readdir(dir)) != NULL) {
74        pa_alsa_path *path;
75        if (pa_streq(ent->d_name, ".") || pa_streq(ent->d_name, ".."))
76            continue;
77        pa_log_debug("Analyzing file: '%s'", ent->d_name);
78
79        /* Can the file be parsed? */
80        path = pa_alsa_path_new(pathsdir, ent->d_name, PA_ALSA_DIRECTION_ANY);
81        fail_unless(path != NULL);
82
83        /* Is the file shipped? */
84        if (ship) {
85            pa_strlist *n;
86            bool found = false;
87            for (n = ship; n; n = pa_strlist_next(n))
88                found |= pa_streq(ent->d_name, pa_strlist_data(n));
89            fail_unless(found);
90        }
91    }
92    closedir(dir);
93    pa_strlist_free(ship);
94#endif
95}
96END_TEST
97
98int main(int argc, char *argv[]) {
99    int failed = 0;
100    Suite *s;
101    TCase *tc;
102    SRunner *sr;
103
104    if (!getenv("MAKE_CHECK"))
105        pa_log_set_level(PA_LOG_DEBUG);
106
107    s = suite_create("Alsa-mixer-path");
108    tc = tcase_create("alsa-mixer-path");
109    tcase_add_test(tc, mixer_path_test);
110    tcase_set_timeout(tc, 30);
111    suite_add_tcase(s, tc);
112
113    sr = srunner_create(s);
114    srunner_run_all(sr, CK_NORMAL);
115    failed = srunner_ntests_failed(sr);
116    srunner_free(sr);
117
118    return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
119}
120