• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012-2013  ProFUSION embedded systems
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include <errno.h>
19 #include <inttypes.h>
20 #include <stddef.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25 
26 #include "testsuite.h"
27 
modprobe_show_depends(const struct test * t)28 static noreturn int modprobe_show_depends(const struct test *t)
29 {
30 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
31 	const char *const args[] = {
32 		progname,
33 		"--show-depends", "mod-loop-a",
34 		NULL,
35 	};
36 
37 	test_spawn_prog(progname, args);
38 	exit(EXIT_FAILURE);
39 }
40 DEFINE_TEST(modprobe_show_depends,
41 	.description = "check if output for modprobe --show-depends is correct for loaded modules",
42 	.config = {
43 		[TC_UNAME_R] = "4.4.4",
44 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/show-depends",
45 	},
46 	.output = {
47 		.out = TESTSUITE_ROOTFS "test-modprobe/show-depends/correct.txt",
48 	});
49 
modprobe_show_depends2(const struct test * t)50 static noreturn int modprobe_show_depends2(const struct test *t)
51 {
52 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
53 	const char *const args[] = {
54 		progname,
55 		"--show-depends", "mod-simple",
56 		NULL,
57 	};
58 
59 	test_spawn_prog(progname, args);
60 	exit(EXIT_FAILURE);
61 }
62 DEFINE_TEST(modprobe_show_depends2,
63 	.description = "check if output for modprobe --show-depends is correct",
64 	.config = {
65 		[TC_UNAME_R] = "4.4.4",
66 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/show-depends",
67 	},
68 	.output = {
69 		.out = TESTSUITE_ROOTFS "test-modprobe/show-depends/correct-mod-simple.txt",
70 	});
71 
72 
modprobe_show_alias_to_none(const struct test * t)73 static noreturn int modprobe_show_alias_to_none(const struct test *t)
74 {
75 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
76 	const char *const args[] = {
77 		progname,
78 		"--show-depends", "--ignore-install", "--quiet", "mod-simple",
79 		NULL,
80 	};
81 
82 	test_spawn_prog(progname, args);
83 	exit(EXIT_FAILURE);
84 }
85 DEFINE_TEST(modprobe_show_alias_to_none,
86 	.description = "check if modprobe --show-depends doesn't explode with an alias to nothing",
87 	.config = {
88 		[TC_UNAME_R] = "4.4.4",
89 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/alias-to-none",
90 	},
91 	.output = {
92 		.out = TESTSUITE_ROOTFS "test-modprobe/alias-to-none/correct.txt",
93 	},
94 	.modules_loaded = "",
95 	);
96 
97 
modprobe_builtin(const struct test * t)98 static noreturn int modprobe_builtin(const struct test *t)
99 {
100 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
101 	const char *const args[] = {
102 		progname,
103 		"unix",
104 		NULL,
105 	};
106 
107 	test_spawn_prog(progname, args);
108 	exit(EXIT_FAILURE);
109 }
110 DEFINE_TEST(modprobe_builtin,
111 	.description = "check if modprobe return 0 for builtin",
112 	.config = {
113 		[TC_UNAME_R] = "4.4.4",
114 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/builtin",
115 	});
116 
modprobe_builtin_lookup_only(const struct test * t)117 static noreturn int modprobe_builtin_lookup_only(const struct test *t)
118 {
119 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
120 	const char *const args[] = {
121 		progname,
122 		"-R", "unix",
123 		NULL,
124 	};
125 
126 	test_spawn_prog(progname, args);
127 	exit(EXIT_FAILURE);
128 }
129 DEFINE_TEST(modprobe_builtin_lookup_only,
130 	.description = "check if modprobe -R correctly returns the builtin module",
131 	.config = {
132 		[TC_UNAME_R] = "4.4.4",
133 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/builtin",
134 	},
135 	.output = {
136 		.out = TESTSUITE_ROOTFS "test-modprobe/builtin/correct.txt",
137 	});
138 
modprobe_softdep_loop(const struct test * t)139 static noreturn int modprobe_softdep_loop(const struct test *t)
140 {
141 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
142 	const char *const args[] = {
143 		progname,
144 		"mod-loop-b",
145 		NULL,
146 	};
147 
148 	test_spawn_prog(progname, args);
149 	exit(EXIT_FAILURE);
150 }
151 DEFINE_TEST(modprobe_softdep_loop,
152 	.description = "check if modprobe breaks softdep loop",
153 	.config = {
154 		[TC_UNAME_R] = "4.4.4",
155 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/softdep-loop",
156 		[TC_INIT_MODULE_RETCODES] = "",
157 	},
158 	.modules_loaded = "mod-loop-a,mod-loop-b",
159 	);
160 
modprobe_install_cmd_loop(const struct test * t)161 static noreturn int modprobe_install_cmd_loop(const struct test *t)
162 {
163 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
164 	const char *const args[] = {
165 		progname,
166 		"mod-loop-a",
167 		NULL,
168 	};
169 
170 	test_spawn_prog(progname, args);
171 	exit(EXIT_FAILURE);
172 }
173 DEFINE_TEST(modprobe_install_cmd_loop,
174 	.description = "check if modprobe breaks install-commands loop",
175 	.config = {
176 		[TC_UNAME_R] = "4.4.4",
177 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/install-cmd-loop",
178 		[TC_INIT_MODULE_RETCODES] = "",
179 	},
180 	.env_vars = (const struct keyval[]) {
181 		{ "MODPROBE", ABS_TOP_BUILDDIR "/tools/modprobe" },
182 		{ }
183 		},
184 	.modules_loaded = "mod-loop-b,mod-loop-a",
185 	);
186 
modprobe_param_kcmdline(const struct test * t)187 static noreturn int modprobe_param_kcmdline(const struct test *t)
188 {
189 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
190 	const char *const args[] = {
191 		progname,
192 		"--show-depends", "mod-simple",
193 		NULL,
194 	};
195 
196 	test_spawn_prog(progname, args);
197 	exit(EXIT_FAILURE);
198 }
199 DEFINE_TEST(modprobe_param_kcmdline,
200 	.description = "check if params from kcmdline are passed to (f)init_module call",
201 	.config = {
202 		[TC_UNAME_R] = "4.4.4",
203 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline",
204 	},
205 	.output = {
206 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline/correct.txt",
207 	},
208 	.modules_loaded = "",
209 	);
210 
modprobe_param_kcmdline2(const struct test * t)211 static noreturn int modprobe_param_kcmdline2(const struct test *t)
212 {
213 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
214 	const char *const args[] = {
215 		progname,
216 		"-c",
217 		NULL,
218 	};
219 
220 	test_spawn_prog(progname, args);
221 	exit(EXIT_FAILURE);
222 }
223 DEFINE_TEST(modprobe_param_kcmdline2,
224 	.description = "check if params with no value are parsed correctly from kcmdline",
225 	.config = {
226 		[TC_UNAME_R] = "4.4.4",
227 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline2",
228 	},
229 	.output = {
230 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline2/correct.txt",
231 	},
232 	.modules_loaded = "",
233 	);
234 
modprobe_param_kcmdline3(const struct test * t)235 static noreturn int modprobe_param_kcmdline3(const struct test *t)
236 {
237 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
238 	const char *const args[] = {
239 		progname,
240 		"-c",
241 		NULL,
242 	};
243 
244 	test_spawn_prog(progname, args);
245 	exit(EXIT_FAILURE);
246 }
247 DEFINE_TEST(modprobe_param_kcmdline3,
248 	.description = "check if unrelated strings in kcmdline are correctly ignored",
249 	.config = {
250 		[TC_UNAME_R] = "4.4.4",
251 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline3",
252 	},
253 	.output = {
254 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline3/correct.txt",
255 	},
256 	.modules_loaded = "",
257 	);
258 
modprobe_param_kcmdline4(const struct test * t)259 static noreturn int modprobe_param_kcmdline4(const struct test *t)
260 {
261 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
262 	const char *const args[] = {
263 		progname,
264 		"-c",
265 		NULL,
266 	};
267 
268 	test_spawn_prog(progname, args);
269 	exit(EXIT_FAILURE);
270 }
271 DEFINE_TEST(modprobe_param_kcmdline4,
272 	.description = "check if unrelated strings in kcmdline are correctly ignored",
273 	.config = {
274 		[TC_UNAME_R] = "4.4.4",
275 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline4",
276 	},
277 	.output = {
278 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline4/correct.txt",
279 	},
280 	.modules_loaded = "",
281 	);
282 
modprobe_param_kcmdline5(const struct test * t)283 static noreturn int modprobe_param_kcmdline5(const struct test *t)
284 {
285 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
286 	const char *const args[] = {
287 		progname,
288 		"-c",
289 		NULL,
290 	};
291 
292 	test_spawn_prog(progname, args);
293 	exit(EXIT_FAILURE);
294 }
295 DEFINE_TEST(modprobe_param_kcmdline5,
296 	.description = "check if params with spaces are parsed correctly from kcmdline",
297 	.config = {
298 		[TC_UNAME_R] = "4.4.4",
299 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline5",
300 	},
301 	.output = {
302 		.out = TESTSUITE_ROOTFS "test-modprobe/module-param-kcmdline5/correct.txt",
303 	},
304 	.modules_loaded = "",
305 	);
306 
307 
modprobe_force(const struct test * t)308 static noreturn int modprobe_force(const struct test *t)
309 {
310 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
311 	const char *const args[] = {
312 		progname,
313 		"--force", "mod-simple",
314 		NULL,
315 	};
316 
317 	test_spawn_prog(progname, args);
318 	exit(EXIT_FAILURE);
319 }
320 DEFINE_TEST(modprobe_force,
321 	.description = "check modprobe --force",
322 	.config = {
323 		[TC_UNAME_R] = "4.4.4",
324 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/force",
325 		[TC_INIT_MODULE_RETCODES] = "",
326 	},
327 	.modules_loaded = "mod-simple",
328 	);
329 
modprobe_oldkernel(const struct test * t)330 static noreturn int modprobe_oldkernel(const struct test *t)
331 {
332 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
333 	const char *const args[] = {
334 		progname,
335 		"mod-simple",
336 		NULL,
337 	};
338 
339 	test_spawn_prog(progname, args);
340 	exit(EXIT_FAILURE);
341 }
342 DEFINE_TEST(modprobe_oldkernel,
343 	.description = "check modprobe with kernel without finit_module()",
344 	.config = {
345 		[TC_UNAME_R] = "3.3.3",
346 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/oldkernel",
347 		[TC_INIT_MODULE_RETCODES] = "",
348 	},
349 	.modules_loaded = "mod-simple",
350 	);
351 
modprobe_oldkernel_force(const struct test * t)352 static noreturn int modprobe_oldkernel_force(const struct test *t)
353 {
354 	const char *progname = ABS_TOP_BUILDDIR "/tools/modprobe";
355 	const char *const args[] = {
356 		progname,
357 		"--force", "mod-simple",
358 		NULL,
359 	};
360 
361 	test_spawn_prog(progname, args);
362 	exit(EXIT_FAILURE);
363 }
364 DEFINE_TEST(modprobe_oldkernel_force,
365 	.description = "check modprobe --force with kernel without finit_module()",
366 	.config = {
367 		[TC_UNAME_R] = "3.3.3",
368 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/oldkernel-force",
369 		[TC_INIT_MODULE_RETCODES] = "",
370 	},
371 	.modules_loaded = "mod-simple",
372 	);
373 
374 TESTSUITE_MAIN();
375