xref: /aosp_15_r20/external/kmod/testsuite/test-testsuite.c (revision cc4ad7da8cefe208cb129ac2aa9a357c7c72deb2)
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