diff --git a/DEVELOPERS b/DEVELOPERS index af1749b23b..7c4a5f4501 100644 --- a/DEVELOPERS +++ b/DEVELOPERS @@ -1805,6 +1805,8 @@ F: support/testing/tests/package/test_jq.py F: support/testing/tests/package/test_jq/ F: support/testing/tests/package/test_kexec.py F: support/testing/tests/package/test_kexec/ +F: support/testing/tests/package/test_kmod.py +F: support/testing/tests/package/test_kmod/ F: support/testing/tests/package/test_kmscube.py F: support/testing/tests/package/test_kmscube/ F: support/testing/tests/package/test_less.py diff --git a/support/testing/tests/package/test_kmod.py b/support/testing/tests/package/test_kmod.py new file mode 100644 index 0000000000..1d9ea535fc --- /dev/null +++ b/support/testing/tests/package/test_kmod.py @@ -0,0 +1,97 @@ +import os + +import infra.basetest + + +class TestKmod(infra.basetest.BRTest): + # This test uses the "virtio_net" driver compiled as a module. We + # need to recompile a Kernel for that. + kernel_fragment = \ + infra.filepath("tests/package/test_kmod/linux-virtio-net.fragment") + config = \ + f""" + BR2_aarch64=y + BR2_TOOLCHAIN_EXTERNAL=y + BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0" + BR2_LINUX_KERNEL=y + BR2_LINUX_KERNEL_CUSTOM_VERSION=y + BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.6.35" + BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y + BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/aarch64-virt/linux.config" + BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="{kernel_fragment}" + BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y + BR2_PACKAGE_KMOD=y + BR2_PACKAGE_KMOD_TOOLS=y + BR2_TARGET_ROOTFS_EXT2=y + BR2_TARGET_ROOTFS_EXT2_4=y + # BR2_TARGET_ROOTFS_TAR is not set + """ + + def test_run(self): + drive = os.path.join(self.builddir, "images", "rootfs.ext4") + kern = os.path.join(self.builddir, "images", "Image") + self.emulator.boot(arch="aarch64", + kernel=kern, + kernel_cmdline=["root=/dev/vda console=ttyAMA0"], + options=["-M", "virt", + "-cpu", "cortex-a57", + "-m", "256M", + "-drive", f"file={drive},if=virtio,format=raw"]) + self.emulator.login() + + # We check the kmod program can run. Busybox does not have a + # kmod applet, so there is no possible confusion. + self.assertRunOk("kmod --version") + + # We check the "modprobe" is the one from kmod, rather than + # the Busybox applet version. + out, ret = self.emulator.run("modprobe --version") + self.assertEqual(ret, 0) + self.assertTrue(out[0].startswith("kmod version")) + + # List modules with "kmod list", the virtio-net module should + # NOT be loaded yet. + out, ret = self.emulator.run("kmod list") + self.assertEqual(ret, 0) + self.assertNotIn("virtio_net", "\n".join(out)) + + # Get module info with modinfo. + out, ret = self.emulator.run("modinfo virtio-net") + self.assertEqual(ret, 0) + lsmod_out = "\n".join(out) + self.assertRegex(lsmod_out, r'name: *virtio_net') + self.assertRegex(lsmod_out, r'description: *Virtio network driver') + + # With this test configuration, we are not supposed to have an + # eth0 Ethernet interface yet. Attempting to show info on this + # interface is expected to fail . + _, ret = self.emulator.run("ip link show dev eth0") + self.assertNotEqual(ret, 0) + + # We try to load the module. + self.assertRunOk("modprobe virtio-net") + + # We should now see the module in the list. This time, we use + # the "lsmod" command. + out, ret = self.emulator.run("lsmod") + self.assertEqual(ret, 0) + self.assertIn("virtio_net", "\n".join(out)) + + # The eth0 interface is supposed to be available, after the + # module loading. We configure the emulator user network to + # test the driver networking functionality. See: + # https://wiki.qemu.org/Documentation/Networking + self.assertRunOk("ip addr add dev eth0 10.0.2.15/24") + self.assertRunOk("ip link set dev eth0 up") + + # We check we can ping the emulator. + ping_cmd = "ping -i 0.3 -c 2 10.0.2.2" + self.assertRunOk(ping_cmd) + + # We check we can unload the driver. + self.assertRunOk("modprobe -r virtio-net") + + # Now the driver is unloaded, we should no longer be able to + # ping the emulator. + _, ret = self.emulator.run(ping_cmd) + self.assertNotEqual(ret, 0) diff --git a/support/testing/tests/package/test_kmod/linux-virtio-net.fragment b/support/testing/tests/package/test_kmod/linux-virtio-net.fragment new file mode 100644 index 0000000000..170da19d65 --- /dev/null +++ b/support/testing/tests/package/test_kmod/linux-virtio-net.fragment @@ -0,0 +1 @@ +CONFIG_VIRTIO_NET=m