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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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