xref: /aosp_15_r20/external/kmod/testsuite/test-modprobe.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 <errno.h>
19*cc4ad7daSAndroid Build Coastguard Worker #include <inttypes.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 
26*cc4ad7daSAndroid Build Coastguard Worker #include "testsuite.h"
27*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_show_depends(const struct test * t)28*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_show_depends(const struct test *t)
29*cc4ad7daSAndroid Build Coastguard Worker {
30*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
31*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
32*cc4ad7daSAndroid Build Coastguard Worker 		progname,
33*cc4ad7daSAndroid Build Coastguard Worker 		"--show-depends", "mod-loop-a",
34*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
35*cc4ad7daSAndroid Build Coastguard Worker 	};
36*cc4ad7daSAndroid Build Coastguard Worker 
37*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
38*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
39*cc4ad7daSAndroid Build Coastguard Worker }
40*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_show_depends,
41*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if output for modprobe --show-depends is correct for loaded modules",
42*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
43*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
44*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/show-depends",
45*cc4ad7daSAndroid Build Coastguard Worker 	},
46*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
47*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/show-depends/correct.txt",
48*cc4ad7daSAndroid Build Coastguard Worker 	});
49*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_show_depends2(const struct test * t)50*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_show_depends2(const struct test *t)
51*cc4ad7daSAndroid Build Coastguard Worker {
52*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
53*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
54*cc4ad7daSAndroid Build Coastguard Worker 		progname,
55*cc4ad7daSAndroid Build Coastguard Worker 		"--show-depends", "mod-simple",
56*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
57*cc4ad7daSAndroid Build Coastguard Worker 	};
58*cc4ad7daSAndroid Build Coastguard Worker 
59*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
60*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
61*cc4ad7daSAndroid Build Coastguard Worker }
62*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_show_depends2,
63*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if output for modprobe --show-depends is correct",
64*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
65*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
66*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/show-depends",
67*cc4ad7daSAndroid Build Coastguard Worker 	},
68*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
69*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/show-depends/correct-mod-simple.txt",
70*cc4ad7daSAndroid Build Coastguard Worker 	});
71*cc4ad7daSAndroid Build Coastguard Worker 
72*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_show_alias_to_none(const struct test * t)73*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_show_alias_to_none(const struct test *t)
74*cc4ad7daSAndroid Build Coastguard Worker {
75*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
76*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
77*cc4ad7daSAndroid Build Coastguard Worker 		progname,
78*cc4ad7daSAndroid Build Coastguard Worker 		"--show-depends", "--ignore-install", "--quiet", "mod-simple",
79*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
80*cc4ad7daSAndroid Build Coastguard Worker 	};
81*cc4ad7daSAndroid Build Coastguard Worker 
82*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
83*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
84*cc4ad7daSAndroid Build Coastguard Worker }
85*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_show_alias_to_none,
86*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if modprobe --show-depends doesn't explode with an alias to nothing",
87*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
88*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
89*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/alias-to-none",
90*cc4ad7daSAndroid Build Coastguard Worker 	},
91*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
92*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/alias-to-none/correct.txt",
93*cc4ad7daSAndroid Build Coastguard Worker 	},
94*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
95*cc4ad7daSAndroid Build Coastguard Worker 	);
96*cc4ad7daSAndroid Build Coastguard Worker 
97*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_show_exports(const struct test * t)98*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_show_exports(const struct test *t)
99*cc4ad7daSAndroid Build Coastguard Worker {
100*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
101*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
102*cc4ad7daSAndroid Build Coastguard Worker 		progname,
103*cc4ad7daSAndroid Build Coastguard Worker 		"--show-exports", "--quiet", "/mod-loop-a.ko",
104*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
105*cc4ad7daSAndroid Build Coastguard Worker 	};
106*cc4ad7daSAndroid Build Coastguard Worker 
107*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
108*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
109*cc4ad7daSAndroid Build Coastguard Worker }
110*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_show_exports,
111*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if modprobe --show-depends doesn't explode with an alias to nothing",
112*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
113*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/show-exports",
114*cc4ad7daSAndroid Build Coastguard Worker 	},
115*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
116*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/show-exports/correct.txt",
117*cc4ad7daSAndroid Build Coastguard Worker 		.regex = true,
118*cc4ad7daSAndroid Build Coastguard Worker 	});
119*cc4ad7daSAndroid Build Coastguard Worker 
120*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_builtin(const struct test * t)121*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_builtin(const struct test *t)
122*cc4ad7daSAndroid Build Coastguard Worker {
123*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
124*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
125*cc4ad7daSAndroid Build Coastguard Worker 		progname,
126*cc4ad7daSAndroid Build Coastguard Worker 		"unix",
127*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
128*cc4ad7daSAndroid Build Coastguard Worker 	};
129*cc4ad7daSAndroid Build Coastguard Worker 
130*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
131*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
132*cc4ad7daSAndroid Build Coastguard Worker }
133*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_builtin,
134*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if modprobe return 0 for builtin",
135*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
136*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
137*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/builtin",
138*cc4ad7daSAndroid Build Coastguard Worker 	});
139*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_builtin_lookup_only(const struct test * t)140*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_builtin_lookup_only(const struct test *t)
141*cc4ad7daSAndroid Build Coastguard Worker {
142*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
143*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
144*cc4ad7daSAndroid Build Coastguard Worker 		progname,
145*cc4ad7daSAndroid Build Coastguard Worker 		"-R", "unix",
146*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
147*cc4ad7daSAndroid Build Coastguard Worker 	};
148*cc4ad7daSAndroid Build Coastguard Worker 
149*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
150*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
151*cc4ad7daSAndroid Build Coastguard Worker }
152*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_builtin_lookup_only,
153*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if modprobe -R correctly returns the builtin module",
154*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
155*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
156*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/builtin",
157*cc4ad7daSAndroid Build Coastguard Worker 	},
158*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
159*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/builtin/correct.txt",
160*cc4ad7daSAndroid Build Coastguard Worker 	});
161*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_softdep_loop(const struct test * t)162*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_softdep_loop(const struct test *t)
163*cc4ad7daSAndroid Build Coastguard Worker {
164*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
165*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
166*cc4ad7daSAndroid Build Coastguard Worker 		progname,
167*cc4ad7daSAndroid Build Coastguard Worker 		"mod-loop-b",
168*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
169*cc4ad7daSAndroid Build Coastguard Worker 	};
170*cc4ad7daSAndroid Build Coastguard Worker 
171*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
172*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
173*cc4ad7daSAndroid Build Coastguard Worker }
174*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_softdep_loop,
175*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if modprobe breaks softdep loop",
176*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
177*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
178*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/softdep-loop",
179*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
180*cc4ad7daSAndroid Build Coastguard Worker 	},
181*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-loop-a,mod-loop-b",
182*cc4ad7daSAndroid Build Coastguard Worker 	);
183*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_install_cmd_loop(const struct test * t)184*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_install_cmd_loop(const struct test *t)
185*cc4ad7daSAndroid Build Coastguard Worker {
186*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
187*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
188*cc4ad7daSAndroid Build Coastguard Worker 		progname,
189*cc4ad7daSAndroid Build Coastguard Worker 		"mod-loop-a",
190*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
191*cc4ad7daSAndroid Build Coastguard Worker 	};
192*cc4ad7daSAndroid Build Coastguard Worker 
193*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
194*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
195*cc4ad7daSAndroid Build Coastguard Worker }
196*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_install_cmd_loop,
197*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if modprobe breaks install-commands loop",
198*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
199*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
200*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/install-cmd-loop",
201*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
202*cc4ad7daSAndroid Build Coastguard Worker 	},
203*cc4ad7daSAndroid Build Coastguard Worker 	.env_vars = (const struct keyval[]) {
204*cc4ad7daSAndroid Build Coastguard Worker 		{ "MODPROBE", ABS_TOP_BUILDDIR "/tools/modprobe" },
205*cc4ad7daSAndroid Build Coastguard Worker 		{ }
206*cc4ad7daSAndroid Build Coastguard Worker 		},
207*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-loop-b,mod-loop-a",
208*cc4ad7daSAndroid Build Coastguard Worker 	);
209*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_param_kcmdline_show_deps(const struct test * t)210*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_param_kcmdline_show_deps(const struct test *t)
211*cc4ad7daSAndroid Build Coastguard Worker {
212*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
213*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
214*cc4ad7daSAndroid Build Coastguard Worker 		progname,
215*cc4ad7daSAndroid Build Coastguard Worker 		"--show-depends", "mod-simple",
216*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
217*cc4ad7daSAndroid Build Coastguard Worker 	};
218*cc4ad7daSAndroid Build Coastguard Worker 
219*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
220*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
221*cc4ad7daSAndroid Build Coastguard Worker }
222*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_param_kcmdline_show_deps,
223*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if params from kcmdline are passed to (f)init_module call",
224*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
225*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
226*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline",
227*cc4ad7daSAndroid Build Coastguard Worker 	},
228*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
229*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline/correct.txt",
230*cc4ad7daSAndroid Build Coastguard Worker 	},
231*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
232*cc4ad7daSAndroid Build Coastguard Worker 	);
233*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_param_kcmdline(const struct test * t)234*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_param_kcmdline(const struct test *t)
235*cc4ad7daSAndroid Build Coastguard Worker {
236*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
237*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
238*cc4ad7daSAndroid Build Coastguard Worker 		progname,
239*cc4ad7daSAndroid Build Coastguard Worker 		"-c",
240*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
241*cc4ad7daSAndroid Build Coastguard Worker 	};
242*cc4ad7daSAndroid Build Coastguard Worker 
243*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
244*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
245*cc4ad7daSAndroid Build Coastguard Worker }
246*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline2, modprobe_param_kcmdline,
247*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if params with no value are parsed correctly from kcmdline",
248*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
249*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
250*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline2",
251*cc4ad7daSAndroid Build Coastguard Worker 	},
252*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
253*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline2/correct.txt",
254*cc4ad7daSAndroid Build Coastguard Worker 	},
255*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
256*cc4ad7daSAndroid Build Coastguard Worker 	);
257*cc4ad7daSAndroid Build Coastguard Worker 
258*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline3, modprobe_param_kcmdline,
259*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if unrelated strings in kcmdline are correctly ignored",
260*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
261*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
262*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline3",
263*cc4ad7daSAndroid Build Coastguard Worker 	},
264*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
265*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline3/correct.txt",
266*cc4ad7daSAndroid Build Coastguard Worker 	},
267*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
268*cc4ad7daSAndroid Build Coastguard Worker 	);
269*cc4ad7daSAndroid Build Coastguard Worker 
270*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline4, modprobe_param_kcmdline,
271*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if unrelated strings in kcmdline are correctly ignored",
272*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
273*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
274*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline4",
275*cc4ad7daSAndroid Build Coastguard Worker 	},
276*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
277*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline4/correct.txt",
278*cc4ad7daSAndroid Build Coastguard Worker 	},
279*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
280*cc4ad7daSAndroid Build Coastguard Worker 	);
281*cc4ad7daSAndroid Build Coastguard Worker 
282*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline5, modprobe_param_kcmdline,
283*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if params with spaces are parsed correctly from kcmdline",
284*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
285*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
286*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline5",
287*cc4ad7daSAndroid Build Coastguard Worker 	},
288*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
289*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline5/correct.txt",
290*cc4ad7daSAndroid Build Coastguard Worker 	},
291*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
292*cc4ad7daSAndroid Build Coastguard Worker 	);
293*cc4ad7daSAndroid Build Coastguard Worker 
294*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline6, modprobe_param_kcmdline,
295*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if dots on other parts of kcmdline don't confuse our parser",
296*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
297*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
298*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline6",
299*cc4ad7daSAndroid Build Coastguard Worker 	},
300*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
301*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline6/correct.txt",
302*cc4ad7daSAndroid Build Coastguard Worker 	},
303*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
304*cc4ad7daSAndroid Build Coastguard Worker 	);
305*cc4ad7daSAndroid Build Coastguard Worker 
306*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline7, modprobe_param_kcmdline,
307*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if dots on other parts of kcmdline don't confuse our parser",
308*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
309*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
310*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline7",
311*cc4ad7daSAndroid Build Coastguard Worker 	},
312*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
313*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline7/correct.txt",
314*cc4ad7daSAndroid Build Coastguard Worker 	},
315*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
316*cc4ad7daSAndroid Build Coastguard Worker 	);
317*cc4ad7daSAndroid Build Coastguard Worker 
318*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST_WITH_FUNC(modprobe_param_kcmdline8, modprobe_param_kcmdline,
319*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check if dots on other parts of kcmdline don't confuse our parser",
320*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
321*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
322*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline8",
323*cc4ad7daSAndroid Build Coastguard Worker 	},
324*cc4ad7daSAndroid Build Coastguard Worker 	.output = {
325*cc4ad7daSAndroid Build Coastguard Worker 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline8/correct.txt",
326*cc4ad7daSAndroid Build Coastguard Worker 	},
327*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "",
328*cc4ad7daSAndroid Build Coastguard Worker 	);
329*cc4ad7daSAndroid Build Coastguard Worker 
330*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_force(const struct test * t)331*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_force(const struct test *t)
332*cc4ad7daSAndroid Build Coastguard Worker {
333*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
334*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
335*cc4ad7daSAndroid Build Coastguard Worker 		progname,
336*cc4ad7daSAndroid Build Coastguard Worker 		"--force", "mod-simple",
337*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
338*cc4ad7daSAndroid Build Coastguard Worker 	};
339*cc4ad7daSAndroid Build Coastguard Worker 
340*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
341*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
342*cc4ad7daSAndroid Build Coastguard Worker }
343*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_force,
344*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check modprobe --force",
345*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
346*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
347*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/force",
348*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
349*cc4ad7daSAndroid Build Coastguard Worker 	},
350*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-simple",
351*cc4ad7daSAndroid Build Coastguard Worker 	);
352*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_oldkernel(const struct test * t)353*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_oldkernel(const struct test *t)
354*cc4ad7daSAndroid Build Coastguard Worker {
355*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
356*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
357*cc4ad7daSAndroid Build Coastguard Worker 		progname,
358*cc4ad7daSAndroid Build Coastguard Worker 		"mod-simple",
359*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
360*cc4ad7daSAndroid Build Coastguard Worker 	};
361*cc4ad7daSAndroid Build Coastguard Worker 
362*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
363*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
364*cc4ad7daSAndroid Build Coastguard Worker }
365*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_oldkernel,
366*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check modprobe with kernel without finit_module()",
367*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
368*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "3.3.3",
369*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/oldkernel",
370*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
371*cc4ad7daSAndroid Build Coastguard Worker 	},
372*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-simple",
373*cc4ad7daSAndroid Build Coastguard Worker 	);
374*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_oldkernel_force(const struct test * t)375*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_oldkernel_force(const struct test *t)
376*cc4ad7daSAndroid Build Coastguard Worker {
377*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
378*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
379*cc4ad7daSAndroid Build Coastguard Worker 		progname,
380*cc4ad7daSAndroid Build Coastguard Worker 		"--force", "mod-simple",
381*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
382*cc4ad7daSAndroid Build Coastguard Worker 	};
383*cc4ad7daSAndroid Build Coastguard Worker 
384*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
385*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
386*cc4ad7daSAndroid Build Coastguard Worker }
387*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_oldkernel_force,
388*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check modprobe --force with kernel without finit_module()",
389*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
390*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "3.3.3",
391*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/oldkernel-force",
392*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
393*cc4ad7daSAndroid Build Coastguard Worker 	},
394*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-simple",
395*cc4ad7daSAndroid Build Coastguard Worker 	);
396*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_external(const struct test * t)397*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_external(const struct test *t)
398*cc4ad7daSAndroid Build Coastguard Worker {
399*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
400*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
401*cc4ad7daSAndroid Build Coastguard Worker 		progname,
402*cc4ad7daSAndroid Build Coastguard Worker 		"mod-simple",
403*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
404*cc4ad7daSAndroid Build Coastguard Worker 	};
405*cc4ad7daSAndroid Build Coastguard Worker 
406*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
407*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
408*cc4ad7daSAndroid Build Coastguard Worker }
409*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_external,
410*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check modprobe able to load external module",
411*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
412*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
413*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/external",
414*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
415*cc4ad7daSAndroid Build Coastguard Worker 	},
416*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-simple",
417*cc4ad7daSAndroid Build Coastguard Worker 	);
418*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_module_from_abspath(const struct test * t)419*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_module_from_abspath(const struct test *t)
420*cc4ad7daSAndroid Build Coastguard Worker {
421*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
422*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
423*cc4ad7daSAndroid Build Coastguard Worker 		progname,
424*cc4ad7daSAndroid Build Coastguard Worker 		"/home/foo/mod-simple.ko",
425*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
426*cc4ad7daSAndroid Build Coastguard Worker 	};
427*cc4ad7daSAndroid Build Coastguard Worker 
428*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
429*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
430*cc4ad7daSAndroid Build Coastguard Worker }
431*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_module_from_abspath,
432*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check modprobe able to load module given as an absolute path",
433*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
434*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
435*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-from-abspath",
436*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
437*cc4ad7daSAndroid Build Coastguard Worker 	},
438*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-simple",
439*cc4ad7daSAndroid Build Coastguard Worker 	);
440*cc4ad7daSAndroid Build Coastguard Worker 
modprobe_module_from_relpath(const struct test * t)441*cc4ad7daSAndroid Build Coastguard Worker static noreturn int modprobe_module_from_relpath(const struct test *t)
442*cc4ad7daSAndroid Build Coastguard Worker {
443*cc4ad7daSAndroid Build Coastguard Worker 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
444*cc4ad7daSAndroid Build Coastguard Worker 	const char *const args[] = {
445*cc4ad7daSAndroid Build Coastguard Worker 		progname,
446*cc4ad7daSAndroid Build Coastguard Worker 		"./mod-simple.ko",
447*cc4ad7daSAndroid Build Coastguard Worker 		NULL,
448*cc4ad7daSAndroid Build Coastguard Worker 	};
449*cc4ad7daSAndroid Build Coastguard Worker 
450*cc4ad7daSAndroid Build Coastguard Worker 	if (chdir("/home/foo") != 0) {
451*cc4ad7daSAndroid Build Coastguard Worker 		perror("failed to change into /home/foo");
452*cc4ad7daSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
453*cc4ad7daSAndroid Build Coastguard Worker 	}
454*cc4ad7daSAndroid Build Coastguard Worker 
455*cc4ad7daSAndroid Build Coastguard Worker 	test_spawn_prog(progname, args);
456*cc4ad7daSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
457*cc4ad7daSAndroid Build Coastguard Worker }
458*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(modprobe_module_from_relpath,
459*cc4ad7daSAndroid Build Coastguard Worker 	.description = "check modprobe able to load module given as a relative path",
460*cc4ad7daSAndroid Build Coastguard Worker 	.config = {
461*cc4ad7daSAndroid Build Coastguard Worker 		[TC_UNAME_R] = "4.4.4",
462*cc4ad7daSAndroid Build Coastguard Worker 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-from-relpath",
463*cc4ad7daSAndroid Build Coastguard Worker 		[TC_INIT_MODULE_RETCODES] = "",
464*cc4ad7daSAndroid Build Coastguard Worker 	},
465*cc4ad7daSAndroid Build Coastguard Worker 	.need_spawn = true,
466*cc4ad7daSAndroid Build Coastguard Worker 	.modules_loaded = "mod-simple",
467*cc4ad7daSAndroid Build Coastguard Worker 	);
468*cc4ad7daSAndroid Build Coastguard Worker 
469*cc4ad7daSAndroid Build Coastguard Worker TESTSUITE_MAIN();
470