| /* |
| * 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("/lib/modules/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("/lib/modules/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("/lib/modules/a", F_OK) < 0) { |
| ERR("access failed: %m\n"); |
| return EXIT_FAILURE; |
| } |
| |
| if (stat("/lib/modules/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(); |