diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:03:56 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:03:56 +0000 |
commit | 18da3ffcd7f3c8a0c5f790c801b5813503c2273d (patch) | |
tree | 84caf98dc5cef3d123c56ba12e35fd67026e0693 /testsuite/test-testsuite.c | |
parent | Initial commit. (diff) | |
download | kmod-18da3ffcd7f3c8a0c5f790c801b5813503c2273d.tar.xz kmod-18da3ffcd7f3c8a0c5f790c801b5813503c2273d.zip |
Adding upstream version 31+20240202.upstream/31+20240202
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testsuite/test-testsuite.c')
-rw-r--r-- | testsuite/test-testsuite.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/testsuite/test-testsuite.c b/testsuite/test-testsuite.c new file mode 100644 index 0000000..c77c4bb --- /dev/null +++ b/testsuite/test-testsuite.c @@ -0,0 +1,163 @@ +/* + * 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 <dirent.h> +#include <errno.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/utsname.h> + +#include <shared/util.h> + +#include <libkmod/libkmod.h> + +#include "testsuite.h" + + +#define TEST_UNAME "4.0.20-kmod" +static noreturn int testsuite_uname(const struct test *t) +{ + struct utsname u; + int err = uname(&u); + + if (err < 0) + exit(EXIT_FAILURE); + + if (!streq(u.release, TEST_UNAME)) { + char *ldpreload = getenv("LD_PRELOAD"); + ERR("u.release=%s should be %s\n", u.release, TEST_UNAME); + ERR("LD_PRELOAD=%s\n", ldpreload); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} +DEFINE_TEST(testsuite_uname, + .description = "test if trap to uname() works", + .config = { + [TC_UNAME_R] = TEST_UNAME, + }, + .need_spawn = true); + +static int testsuite_rootfs_fopen(const struct test *t) +{ + FILE *fp; + char s[100]; + int n; + + fp = fopen(MODULE_DIRECTORY "/a", "r"); + if (fp == NULL) + return EXIT_FAILURE;; + + n = fscanf(fp, "%s", s); + if (n != 1) + return EXIT_FAILURE; + + if (!streq(s, "kmod-test-chroot-works")) + return EXIT_FAILURE; + + return EXIT_SUCCESS; +} +DEFINE_TEST(testsuite_rootfs_fopen, + .description = "test if rootfs works - fopen()", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/", + }, + .need_spawn = true); + +static int testsuite_rootfs_open(const struct test *t) +{ + char buf[100]; + int fd, done; + + fd = open(MODULE_DIRECTORY "/a", O_RDONLY); + if (fd < 0) + return EXIT_FAILURE; + + for (done = 0;;) { + int r = read(fd, buf + done, sizeof(buf) - 1 - done); + if (r == 0) + break; + if (r == -EAGAIN) + continue; + + done += r; + } + + buf[done] = '\0'; + + if (!streq(buf, "kmod-test-chroot-works\n")) + return EXIT_FAILURE; + + return EXIT_SUCCESS; +} +DEFINE_TEST(testsuite_rootfs_open, + .description = "test if rootfs works - open()", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/", + }, + .need_spawn = true); + +static int testsuite_rootfs_stat_access(const struct test *t) +{ + struct stat st; + + if (access(MODULE_DIRECTORY "/a", F_OK) < 0) { + ERR("access failed: %m\n"); + return EXIT_FAILURE; + } + + if (stat(MODULE_DIRECTORY "/a", &st) < 0) { + ERR("stat failed: %m\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} +DEFINE_TEST(testsuite_rootfs_stat_access, + .description = "test if rootfs works - stat() and access()", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/", + }, + .need_spawn = true); + +static int testsuite_rootfs_opendir(const struct test *t) +{ + DIR *d; + + d = opendir("/testdir"); + if (d == NULL) { + ERR("opendir failed: %m\n"); + return EXIT_FAILURE; + } + + closedir(d); + return EXIT_SUCCESS; +} +DEFINE_TEST(testsuite_rootfs_opendir, + .description = "test if rootfs works - opendir()", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/", + }, + .need_spawn = true); + +TESTSUITE_MAIN(); |