]> git.ipfire.org Git - thirdparty/kmod.git/blobdiff - testsuite/test-init.c
libkmod: add weak dependecies
[thirdparty/kmod.git] / testsuite / test-init.c
index 24e70347aedec1a4567035834d6bee47a8a39785..edbfc233160165e567b203a8e4360cfbdb0fa729 100644 (file)
@@ -1,14 +1,73 @@
+/*
+ * Copyright (C) 2012-2013  ProFUSION embedded systems
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stddef.h>
 #include <string.h>
-#include <errno.h>
 #include <unistd.h>
-#include <libkmod.h>
+
+#include <shared/macro.h>
+
+#include <libkmod/libkmod.h>
 
 #include "testsuite.h"
 
-static int test_initlib(const struct test *t)
+static noreturn int test_load_resources(const struct test *t)
+{
+       struct kmod_ctx *ctx;
+       const char *null_config = NULL;
+       int err;
+
+       ctx = kmod_new(NULL, &null_config);
+       if (ctx == NULL)
+               exit(EXIT_FAILURE);
+
+       kmod_set_log_priority(ctx, 7);
+
+       err = kmod_load_resources(ctx);
+       if (err != 0) {
+               ERR("could not load libkmod resources: %s\n", strerror(-err));
+               exit(EXIT_FAILURE);
+       }
+
+       kmod_unref(ctx);
+
+       exit(EXIT_SUCCESS);
+}
+DEFINE_TEST(test_load_resources,
+           .description = "test if kmod_load_resources works (recent modprobe on kernel without modules.builtin.modinfo)",
+           .config = {
+               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-init-load-resources/",
+               [TC_UNAME_R] = "5.6.0",
+           },
+           .need_spawn = true);
+
+DEFINE_TEST(test_load_resources,
+           .description = "test if kmod_load_resources works with empty modules.builtin.aliases.bin (recent depmod on kernel without modules.builtin.modinfo)",
+           .config = {
+               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-init-load-resources-empty-builtin-aliases-bin/",
+               [TC_UNAME_R] = "5.6.0",
+           },
+           .need_spawn = true);
+
+static noreturn int test_initlib(const struct test *t)
 {
        struct kmod_ctx *ctx;
        const char *null_config = NULL;
@@ -21,13 +80,10 @@ static int test_initlib(const struct test *t)
 
        exit(EXIT_SUCCESS);
 }
-static const struct test stest_initlib = {
-       .name = "test_initlib",
-       .description = "test if libkmod's init function work",
-       .func = test_initlib,
-};
+DEFINE_TEST(test_initlib,
+               .description = "test if libkmod's init function work");
 
-static int test_insert(const struct test *t)
+static noreturn int test_insert(const struct test *t)
 {
        struct kmod_ctx *ctx;
        struct kmod_module *mod;
@@ -38,7 +94,7 @@ static int test_insert(const struct test *t)
        if (ctx == NULL)
                exit(EXIT_FAILURE);
 
-       err = kmod_module_new_from_path(ctx, "/ext4-x86_64.ko", &mod);
+       err = kmod_module_new_from_path(ctx, "/mod-simple.ko", &mod);
        if (err != 0) {
                ERR("could not create module from path: %m\n");
                exit(EXIT_FAILURE);
@@ -53,21 +109,19 @@ static int test_insert(const struct test *t)
 
        exit(EXIT_SUCCESS);
 }
-static const struct test stest_insert = {
-       .name = "test_insert",
+DEFINE_TEST(test_insert,
        .description = "test if libkmod's insert_module returns ok",
-       .func = test_insert,
        .config = {
-               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modinfo/",
+               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-init/",
                [TC_INIT_MODULE_RETCODES] = "bla:1:20",
        },
-       .need_spawn = true,
-};
+       .modules_loaded = "mod_simple",
+       .need_spawn = true);
 
-static int test_remove(const struct test *t)
+static noreturn int test_remove(const struct test *t)
 {
        struct kmod_ctx *ctx;
-       struct kmod_module *mod;
+       struct kmod_module *mod_simple, *mod_bla;
        const char *null_config = NULL;
        int err;
 
@@ -75,63 +129,41 @@ static int test_remove(const struct test *t)
        if (ctx == NULL)
                exit(EXIT_FAILURE);
 
-       err = kmod_module_new_from_name(ctx, "ext4", &mod);
+       err = kmod_module_new_from_name(ctx, "mod-simple", &mod_simple);
        if (err != 0) {
-               ERR("could not create module from name: %m\n");
+               ERR("could not create module from name: %s\n", strerror(-err));
                exit(EXIT_FAILURE);
        }
 
-       err = kmod_module_remove_module(mod, 0);
+       err = kmod_module_new_from_name(ctx, "bla", &mod_bla);
        if (err != 0) {
-               ERR("could not remove module: %m\n");
+               ERR("could not create module from name: %s\n", strerror(-err));
                exit(EXIT_FAILURE);
        }
+
+       err = kmod_module_remove_module(mod_simple, 0);
+       if (err != 0) {
+               ERR("could not remove module: %s\n", strerror(-err));
+               exit(EXIT_FAILURE);
+       }
+
+       err = kmod_module_remove_module(mod_bla, 0);
+       if (err != -ENOENT) {
+               ERR("wrong return code for failure test: %d\n", err);
+               exit(EXIT_FAILURE);
+       }
+
        kmod_unref(ctx);
 
        exit(EXIT_SUCCESS);
 }
-static const struct test stest_remove = {
-       .name = "test_remove",
+DEFINE_TEST(test_remove,
        .description = "test if libkmod's remove_module returns ok",
-       .func = test_remove,
        .config = {
-               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modinfo/",
-               [TC_DELETE_MODULE_RETCODES] = "bla:1:20",
+               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-remove/",
+               [TC_DELETE_MODULE_RETCODES] =
+                       "mod-simple:0:0:bla:-1:" STRINGIFY(ENOENT),
        },
-       .need_spawn = true,
-};
-
-static const struct test *tests[] = {
-       &stest_initlib,
-       &stest_insert,
-       &stest_remove,
-       NULL,
-};
-
-int main(int argc, char *argv[])
-{
-       const struct test *t;
-       int arg;
-       size_t i;
-
-       arg = test_init(argc, argv, tests);
-       if (arg == 0)
-               return 0;
-
-       if (arg < argc) {
-               t = test_find(tests, argv[arg]);
-               if (t == NULL) {
-                       fprintf(stderr, "could not find test %s\n", argv[arg]);
-                       exit(EXIT_FAILURE);
-               }
-
-               return test_run(t);
-       }
-
-       for (i = 0; tests[i] != NULL; i++) {
-               if (test_run(tests[i]) != 0)
-                       exit(EXIT_FAILURE);
-       }
+       .need_spawn = true);
 
-       exit(EXIT_SUCCESS);
-}
+TESTSUITE_MAIN();