1*cc4ad7daSAndroid Build Coastguard Worker /*
2*cc4ad7daSAndroid Build Coastguard Worker * Copyright (C) 2012-2013 ProFUSION embedded systems
3*cc4ad7daSAndroid Build Coastguard Worker *
4*cc4ad7daSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or
5*cc4ad7daSAndroid Build Coastguard Worker * modify it under the terms of the GNU Lesser General Public
6*cc4ad7daSAndroid Build Coastguard Worker * License as published by the Free Software Foundation; either
7*cc4ad7daSAndroid Build Coastguard Worker * version 2.1 of the License, or (at your option) any later version.
8*cc4ad7daSAndroid Build Coastguard Worker *
9*cc4ad7daSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
10*cc4ad7daSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*cc4ad7daSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12*cc4ad7daSAndroid Build Coastguard Worker * Lesser General Public License for more details.
13*cc4ad7daSAndroid Build Coastguard Worker *
14*cc4ad7daSAndroid Build Coastguard Worker * You should have received a copy of the GNU Lesser General Public
15*cc4ad7daSAndroid Build Coastguard Worker * License along with this library; if not, see <http://www.gnu.org/licenses/>.
16*cc4ad7daSAndroid Build Coastguard Worker */
17*cc4ad7daSAndroid Build Coastguard Worker
18*cc4ad7daSAndroid Build Coastguard Worker #include <dirent.h>
19*cc4ad7daSAndroid Build Coastguard Worker #include <errno.h>
20*cc4ad7daSAndroid Build Coastguard Worker #include <stddef.h>
21*cc4ad7daSAndroid Build Coastguard Worker #include <stdio.h>
22*cc4ad7daSAndroid Build Coastguard Worker #include <stdlib.h>
23*cc4ad7daSAndroid Build Coastguard Worker #include <string.h>
24*cc4ad7daSAndroid Build Coastguard Worker #include <unistd.h>
25*cc4ad7daSAndroid Build Coastguard Worker #include <sys/stat.h>
26*cc4ad7daSAndroid Build Coastguard Worker #include <sys/types.h>
27*cc4ad7daSAndroid Build Coastguard Worker #include <sys/utsname.h>
28*cc4ad7daSAndroid Build Coastguard Worker
29*cc4ad7daSAndroid Build Coastguard Worker #include <shared/util.h>
30*cc4ad7daSAndroid Build Coastguard Worker
31*cc4ad7daSAndroid Build Coastguard Worker #include <libkmod/libkmod.h>
32*cc4ad7daSAndroid Build Coastguard Worker
33*cc4ad7daSAndroid Build Coastguard Worker #include "testsuite.h"
34*cc4ad7daSAndroid Build Coastguard Worker
35*cc4ad7daSAndroid Build Coastguard Worker
36*cc4ad7daSAndroid Build Coastguard Worker #define TEST_UNAME "4.0.20-kmod"
testsuite_uname(const struct test * t)37*cc4ad7daSAndroid Build Coastguard Worker static noreturn int testsuite_uname(const struct test *t)
38*cc4ad7daSAndroid Build Coastguard Worker {
39*cc4ad7daSAndroid Build Coastguard Worker struct utsname u;
40*cc4ad7daSAndroid Build Coastguard Worker int err = uname(&u);
41*cc4ad7daSAndroid Build Coastguard Worker
42*cc4ad7daSAndroid Build Coastguard Worker if (err < 0)
43*cc4ad7daSAndroid Build Coastguard Worker exit(EXIT_FAILURE);
44*cc4ad7daSAndroid Build Coastguard Worker
45*cc4ad7daSAndroid Build Coastguard Worker if (!streq(u.release, TEST_UNAME)) {
46*cc4ad7daSAndroid Build Coastguard Worker char *ldpreload = getenv("LD_PRELOAD");
47*cc4ad7daSAndroid Build Coastguard Worker ERR("u.release=%s should be %s\n", u.release, TEST_UNAME);
48*cc4ad7daSAndroid Build Coastguard Worker ERR("LD_PRELOAD=%s\n", ldpreload);
49*cc4ad7daSAndroid Build Coastguard Worker exit(EXIT_FAILURE);
50*cc4ad7daSAndroid Build Coastguard Worker }
51*cc4ad7daSAndroid Build Coastguard Worker
52*cc4ad7daSAndroid Build Coastguard Worker exit(EXIT_SUCCESS);
53*cc4ad7daSAndroid Build Coastguard Worker }
54*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(testsuite_uname,
55*cc4ad7daSAndroid Build Coastguard Worker .description = "test if trap to uname() works",
56*cc4ad7daSAndroid Build Coastguard Worker .config = {
57*cc4ad7daSAndroid Build Coastguard Worker [TC_UNAME_R] = TEST_UNAME,
58*cc4ad7daSAndroid Build Coastguard Worker },
59*cc4ad7daSAndroid Build Coastguard Worker .need_spawn = true);
60*cc4ad7daSAndroid Build Coastguard Worker
testsuite_rootfs_fopen(const struct test * t)61*cc4ad7daSAndroid Build Coastguard Worker static int testsuite_rootfs_fopen(const struct test *t)
62*cc4ad7daSAndroid Build Coastguard Worker {
63*cc4ad7daSAndroid Build Coastguard Worker FILE *fp;
64*cc4ad7daSAndroid Build Coastguard Worker char s[100];
65*cc4ad7daSAndroid Build Coastguard Worker int n;
66*cc4ad7daSAndroid Build Coastguard Worker
67*cc4ad7daSAndroid Build Coastguard Worker fp = fopen(MODULE_DIRECTORY "/a", "r");
68*cc4ad7daSAndroid Build Coastguard Worker if (fp == NULL)
69*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;;
70*cc4ad7daSAndroid Build Coastguard Worker
71*cc4ad7daSAndroid Build Coastguard Worker n = fscanf(fp, "%s", s);
72*cc4ad7daSAndroid Build Coastguard Worker if (n != 1)
73*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
74*cc4ad7daSAndroid Build Coastguard Worker
75*cc4ad7daSAndroid Build Coastguard Worker if (!streq(s, "kmod-test-chroot-works"))
76*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
77*cc4ad7daSAndroid Build Coastguard Worker
78*cc4ad7daSAndroid Build Coastguard Worker return EXIT_SUCCESS;
79*cc4ad7daSAndroid Build Coastguard Worker }
80*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(testsuite_rootfs_fopen,
81*cc4ad7daSAndroid Build Coastguard Worker .description = "test if rootfs works - fopen()",
82*cc4ad7daSAndroid Build Coastguard Worker .config = {
83*cc4ad7daSAndroid Build Coastguard Worker [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/",
84*cc4ad7daSAndroid Build Coastguard Worker },
85*cc4ad7daSAndroid Build Coastguard Worker .need_spawn = true);
86*cc4ad7daSAndroid Build Coastguard Worker
testsuite_rootfs_open(const struct test * t)87*cc4ad7daSAndroid Build Coastguard Worker static int testsuite_rootfs_open(const struct test *t)
88*cc4ad7daSAndroid Build Coastguard Worker {
89*cc4ad7daSAndroid Build Coastguard Worker char buf[100];
90*cc4ad7daSAndroid Build Coastguard Worker int fd, done;
91*cc4ad7daSAndroid Build Coastguard Worker
92*cc4ad7daSAndroid Build Coastguard Worker fd = open(MODULE_DIRECTORY "/a", O_RDONLY);
93*cc4ad7daSAndroid Build Coastguard Worker if (fd < 0)
94*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
95*cc4ad7daSAndroid Build Coastguard Worker
96*cc4ad7daSAndroid Build Coastguard Worker for (done = 0;;) {
97*cc4ad7daSAndroid Build Coastguard Worker int r = read(fd, buf + done, sizeof(buf) - 1 - done);
98*cc4ad7daSAndroid Build Coastguard Worker if (r == 0)
99*cc4ad7daSAndroid Build Coastguard Worker break;
100*cc4ad7daSAndroid Build Coastguard Worker if (r == -EAGAIN)
101*cc4ad7daSAndroid Build Coastguard Worker continue;
102*cc4ad7daSAndroid Build Coastguard Worker
103*cc4ad7daSAndroid Build Coastguard Worker done += r;
104*cc4ad7daSAndroid Build Coastguard Worker }
105*cc4ad7daSAndroid Build Coastguard Worker
106*cc4ad7daSAndroid Build Coastguard Worker buf[done] = '\0';
107*cc4ad7daSAndroid Build Coastguard Worker
108*cc4ad7daSAndroid Build Coastguard Worker if (!streq(buf, "kmod-test-chroot-works\n"))
109*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
110*cc4ad7daSAndroid Build Coastguard Worker
111*cc4ad7daSAndroid Build Coastguard Worker return EXIT_SUCCESS;
112*cc4ad7daSAndroid Build Coastguard Worker }
113*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(testsuite_rootfs_open,
114*cc4ad7daSAndroid Build Coastguard Worker .description = "test if rootfs works - open()",
115*cc4ad7daSAndroid Build Coastguard Worker .config = {
116*cc4ad7daSAndroid Build Coastguard Worker [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/",
117*cc4ad7daSAndroid Build Coastguard Worker },
118*cc4ad7daSAndroid Build Coastguard Worker .need_spawn = true);
119*cc4ad7daSAndroid Build Coastguard Worker
testsuite_rootfs_stat_access(const struct test * t)120*cc4ad7daSAndroid Build Coastguard Worker static int testsuite_rootfs_stat_access(const struct test *t)
121*cc4ad7daSAndroid Build Coastguard Worker {
122*cc4ad7daSAndroid Build Coastguard Worker struct stat st;
123*cc4ad7daSAndroid Build Coastguard Worker
124*cc4ad7daSAndroid Build Coastguard Worker if (access(MODULE_DIRECTORY "/a", F_OK) < 0) {
125*cc4ad7daSAndroid Build Coastguard Worker ERR("access failed: %m\n");
126*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
127*cc4ad7daSAndroid Build Coastguard Worker }
128*cc4ad7daSAndroid Build Coastguard Worker
129*cc4ad7daSAndroid Build Coastguard Worker if (stat(MODULE_DIRECTORY "/a", &st) < 0) {
130*cc4ad7daSAndroid Build Coastguard Worker ERR("stat failed: %m\n");
131*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
132*cc4ad7daSAndroid Build Coastguard Worker }
133*cc4ad7daSAndroid Build Coastguard Worker
134*cc4ad7daSAndroid Build Coastguard Worker return EXIT_SUCCESS;
135*cc4ad7daSAndroid Build Coastguard Worker }
136*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(testsuite_rootfs_stat_access,
137*cc4ad7daSAndroid Build Coastguard Worker .description = "test if rootfs works - stat() and access()",
138*cc4ad7daSAndroid Build Coastguard Worker .config = {
139*cc4ad7daSAndroid Build Coastguard Worker [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/",
140*cc4ad7daSAndroid Build Coastguard Worker },
141*cc4ad7daSAndroid Build Coastguard Worker .need_spawn = true);
142*cc4ad7daSAndroid Build Coastguard Worker
testsuite_rootfs_opendir(const struct test * t)143*cc4ad7daSAndroid Build Coastguard Worker static int testsuite_rootfs_opendir(const struct test *t)
144*cc4ad7daSAndroid Build Coastguard Worker {
145*cc4ad7daSAndroid Build Coastguard Worker DIR *d;
146*cc4ad7daSAndroid Build Coastguard Worker
147*cc4ad7daSAndroid Build Coastguard Worker d = opendir("/testdir");
148*cc4ad7daSAndroid Build Coastguard Worker if (d == NULL) {
149*cc4ad7daSAndroid Build Coastguard Worker ERR("opendir failed: %m\n");
150*cc4ad7daSAndroid Build Coastguard Worker return EXIT_FAILURE;
151*cc4ad7daSAndroid Build Coastguard Worker }
152*cc4ad7daSAndroid Build Coastguard Worker
153*cc4ad7daSAndroid Build Coastguard Worker closedir(d);
154*cc4ad7daSAndroid Build Coastguard Worker return EXIT_SUCCESS;
155*cc4ad7daSAndroid Build Coastguard Worker }
156*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(testsuite_rootfs_opendir,
157*cc4ad7daSAndroid Build Coastguard Worker .description = "test if rootfs works - opendir()",
158*cc4ad7daSAndroid Build Coastguard Worker .config = {
159*cc4ad7daSAndroid Build Coastguard Worker [TC_ROOTFS] = TESTSUITE_ROOTFS "test-rootfs/",
160*cc4ad7daSAndroid Build Coastguard Worker },
161*cc4ad7daSAndroid Build Coastguard Worker .need_spawn = true);
162*cc4ad7daSAndroid Build Coastguard Worker
163*cc4ad7daSAndroid Build Coastguard Worker TESTSUITE_MAIN();
164