From 06689b5d686799ce2c8c9b2955b075433641dc62 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Tue, 21 Nov 2017 11:22:07 +0000 Subject: [PATCH] tests: Add kernel module tests for all supported kernels Also add libelf-dev as this is needed for ORC_UNWINDER. While this is only a feature of 4.14.x we added it to all Dockerfiles to keep things in synch. Signed-off-by: Rolf Neugebauer --- .../020_kernel/010_kmod_4.4.x/Dockerfile | 23 ++++++++++++++ .../check.sh | 0 .../src/Makefile | 0 .../src/hello_world.c | 0 .../test.sh | 0 test/cases/020_kernel/010_kmod_4.4.x/test.yml | 20 ++++++++++++ .../Dockerfile | 4 +-- test/cases/020_kernel/011_kmod_4.9.x/check.sh | 15 +++++++++ .../020_kernel/011_kmod_4.9.x/src/Makefile | 6 ++++ .../011_kmod_4.9.x/src/hello_world.c | 22 +++++++++++++ test/cases/020_kernel/011_kmod_4.9.x/test.sh | 31 +++++++++++++++++++ .../test.yml | 2 +- .../020_kernel/015_kmod_4.13.x/Dockerfile | 23 ++++++++++++++ .../cases/020_kernel/015_kmod_4.13.x/check.sh | 15 +++++++++ .../020_kernel/015_kmod_4.13.x/src/Makefile | 6 ++++ .../015_kmod_4.13.x/src/hello_world.c | 22 +++++++++++++ test/cases/020_kernel/015_kmod_4.13.x/test.sh | 31 +++++++++++++++++++ .../cases/020_kernel/015_kmod_4.13.x/test.yml | 20 ++++++++++++ .../020_kernel/016_kmod_4.14.x/Dockerfile | 23 ++++++++++++++ .../cases/020_kernel/016_kmod_4.14.x/check.sh | 15 +++++++++ .../020_kernel/016_kmod_4.14.x/src/Makefile | 6 ++++ .../016_kmod_4.14.x/src/hello_world.c | 22 +++++++++++++ test/cases/020_kernel/016_kmod_4.14.x/test.sh | 31 +++++++++++++++++++ .../cases/020_kernel/016_kmod_4.14.x/test.yml | 20 ++++++++++++ 24 files changed, 354 insertions(+), 3 deletions(-) create mode 100644 test/cases/020_kernel/010_kmod_4.4.x/Dockerfile rename test/cases/020_kernel/{010_kmod_4.9.x => 010_kmod_4.4.x}/check.sh (100%) rename test/cases/020_kernel/{010_kmod_4.9.x => 010_kmod_4.4.x}/src/Makefile (100%) rename test/cases/020_kernel/{010_kmod_4.9.x => 010_kmod_4.4.x}/src/hello_world.c (100%) rename test/cases/020_kernel/{010_kmod_4.9.x => 010_kmod_4.4.x}/test.sh (100%) create mode 100644 test/cases/020_kernel/010_kmod_4.4.x/test.yml rename test/cases/020_kernel/{010_kmod_4.9.x => 011_kmod_4.9.x}/Dockerfile (88%) create mode 100755 test/cases/020_kernel/011_kmod_4.9.x/check.sh create mode 100644 test/cases/020_kernel/011_kmod_4.9.x/src/Makefile create mode 100644 test/cases/020_kernel/011_kmod_4.9.x/src/hello_world.c create mode 100644 test/cases/020_kernel/011_kmod_4.9.x/test.sh rename test/cases/020_kernel/{010_kmod_4.9.x => 011_kmod_4.9.x}/test.yml (93%) create mode 100644 test/cases/020_kernel/015_kmod_4.13.x/Dockerfile create mode 100755 test/cases/020_kernel/015_kmod_4.13.x/check.sh create mode 100644 test/cases/020_kernel/015_kmod_4.13.x/src/Makefile create mode 100644 test/cases/020_kernel/015_kmod_4.13.x/src/hello_world.c create mode 100644 test/cases/020_kernel/015_kmod_4.13.x/test.sh create mode 100644 test/cases/020_kernel/015_kmod_4.13.x/test.yml create mode 100644 test/cases/020_kernel/016_kmod_4.14.x/Dockerfile create mode 100755 test/cases/020_kernel/016_kmod_4.14.x/check.sh create mode 100644 test/cases/020_kernel/016_kmod_4.14.x/src/Makefile create mode 100644 test/cases/020_kernel/016_kmod_4.14.x/src/hello_world.c create mode 100644 test/cases/020_kernel/016_kmod_4.14.x/test.sh create mode 100644 test/cases/020_kernel/016_kmod_4.14.x/test.yml diff --git a/test/cases/020_kernel/010_kmod_4.4.x/Dockerfile b/test/cases/020_kernel/010_kmod_4.4.x/Dockerfile new file mode 100644 index 000000000..217ef0655 --- /dev/null +++ b/test/cases/020_kernel/010_kmod_4.4.x/Dockerfile @@ -0,0 +1,23 @@ +# This Dockerfile extracts the kernel headers from the kernel image +# and then compiles a simple hello world kernel module against them. +# In the last stage, it creates a package, which can be used for +# testing. + +FROM linuxkit/kernel:4.4.100 AS ksrc + +# Extract headers and compile module +FROM linuxkit/alpine:07f7d136e427dc68154cd5edbb2b9576f9ac5213 AS build +RUN apk add build-base libelf-dev + +COPY --from=ksrc /kernel-dev.tar / +RUN tar xf kernel-dev.tar + +WORKDIR /kmod +COPY ./src/* ./ +RUN make all + +# Package +FROM alpine:3.5 +COPY --from=build /kmod/hello_world.ko / +COPY check.sh /check.sh +ENTRYPOINT ["/bin/sh", "/check.sh"] diff --git a/test/cases/020_kernel/010_kmod_4.9.x/check.sh b/test/cases/020_kernel/010_kmod_4.4.x/check.sh similarity index 100% rename from test/cases/020_kernel/010_kmod_4.9.x/check.sh rename to test/cases/020_kernel/010_kmod_4.4.x/check.sh diff --git a/test/cases/020_kernel/010_kmod_4.9.x/src/Makefile b/test/cases/020_kernel/010_kmod_4.4.x/src/Makefile similarity index 100% rename from test/cases/020_kernel/010_kmod_4.9.x/src/Makefile rename to test/cases/020_kernel/010_kmod_4.4.x/src/Makefile diff --git a/test/cases/020_kernel/010_kmod_4.9.x/src/hello_world.c b/test/cases/020_kernel/010_kmod_4.4.x/src/hello_world.c similarity index 100% rename from test/cases/020_kernel/010_kmod_4.9.x/src/hello_world.c rename to test/cases/020_kernel/010_kmod_4.4.x/src/hello_world.c diff --git a/test/cases/020_kernel/010_kmod_4.9.x/test.sh b/test/cases/020_kernel/010_kmod_4.4.x/test.sh similarity index 100% rename from test/cases/020_kernel/010_kmod_4.9.x/test.sh rename to test/cases/020_kernel/010_kmod_4.4.x/test.sh diff --git a/test/cases/020_kernel/010_kmod_4.4.x/test.yml b/test/cases/020_kernel/010_kmod_4.4.x/test.yml new file mode 100644 index 000000000..beaf6f284 --- /dev/null +++ b/test/cases/020_kernel/010_kmod_4.4.x/test.yml @@ -0,0 +1,20 @@ +kernel: + image: linuxkit/kernel:4.4.100 + cmdline: "console=ttyS0" +init: + - linuxkit/init:42a92119e1ca10380e0d33e26c0cbcf85b9b3558 + - linuxkit/runc:1b0741d07949c0acc444cd6a04ee7f833443579d +onboot: + - name: check + image: kmod-test + binds: + - /dev:/dev + - /lib/modules:/lib/modules + capabilities: + - all + - name: poweroff + image: linuxkit/poweroff:280bd01daa8776fbe1f4d912977f1886b8374834 + command: ["/bin/sh", "/poweroff.sh", "3"] +trust: + org: + - linuxkit diff --git a/test/cases/020_kernel/010_kmod_4.9.x/Dockerfile b/test/cases/020_kernel/011_kmod_4.9.x/Dockerfile similarity index 88% rename from test/cases/020_kernel/010_kmod_4.9.x/Dockerfile rename to test/cases/020_kernel/011_kmod_4.9.x/Dockerfile index 2e6b6ba22..abca4bcd7 100644 --- a/test/cases/020_kernel/010_kmod_4.9.x/Dockerfile +++ b/test/cases/020_kernel/011_kmod_4.9.x/Dockerfile @@ -3,11 +3,11 @@ # In the last stage, it creates a package, which can be used for # testing. -FROM linuxkit/kernel:4.9.62 AS ksrc +FROM linuxkit/kernel:4.9.64 AS ksrc # Extract headers and compile module FROM linuxkit/alpine:07f7d136e427dc68154cd5edbb2b9576f9ac5213 AS build -RUN apk add build-base +RUN apk add build-base libelf-dev COPY --from=ksrc /kernel-dev.tar / RUN tar xf kernel-dev.tar diff --git a/test/cases/020_kernel/011_kmod_4.9.x/check.sh b/test/cases/020_kernel/011_kmod_4.9.x/check.sh new file mode 100755 index 000000000..02e491624 --- /dev/null +++ b/test/cases/020_kernel/011_kmod_4.9.x/check.sh @@ -0,0 +1,15 @@ +#!/bin/sh +function failed { + printf "Kernel module test suite FAILED\n" + /sbin/poweroff -f +} + +uname -a +modinfo hello_world.ko || failed +insmod hello_world.ko || failed +[ -n "$(dmesg | grep -o 'Hello LinuxKit')" ] || failed +rmmod hello_world || failed + +printf "Kernel module test suite PASSED\n" + +/sbin/poweroff -f diff --git a/test/cases/020_kernel/011_kmod_4.9.x/src/Makefile b/test/cases/020_kernel/011_kmod_4.9.x/src/Makefile new file mode 100644 index 000000000..31c8215dd --- /dev/null +++ b/test/cases/020_kernel/011_kmod_4.9.x/src/Makefile @@ -0,0 +1,6 @@ +obj-m += hello_world.o +KVER=$(shell basename /usr/src/linux-headers-*) +all: + make -C /usr/src/$(KVER) M=$(PWD) modules +clean: + make -C /usr/src/$(KVER) M=$(PWD) clean diff --git a/test/cases/020_kernel/011_kmod_4.9.x/src/hello_world.c b/test/cases/020_kernel/011_kmod_4.9.x/src/hello_world.c new file mode 100644 index 000000000..7dd6d3ee2 --- /dev/null +++ b/test/cases/020_kernel/011_kmod_4.9.x/src/hello_world.c @@ -0,0 +1,22 @@ +/* + * A simple Hello World kernel module + */ +#include +#include + +int init_hello(void) +{ + printk(KERN_INFO "Hello LinuxKit\n"); + return 0; +} + +void exit_hello(void) +{ + printk(KERN_INFO "Goodbye LinuxKit.\n"); +} + +module_init(init_hello); +module_exit(exit_hello); +MODULE_AUTHOR("Rolf Neugebauer "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("A simple Hello World kernel module for testing"); diff --git a/test/cases/020_kernel/011_kmod_4.9.x/test.sh b/test/cases/020_kernel/011_kmod_4.9.x/test.sh new file mode 100644 index 000000000..e845162e5 --- /dev/null +++ b/test/cases/020_kernel/011_kmod_4.9.x/test.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# SUMMARY: Test build and insertion of kernel modules +# LABELS: +# REPEAT: + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +NAME=kmod +IMAGE_NAME=kmod-test + +clean_up() { + docker rmi ${IMAGE_NAME} || true + rm -rf ${NAME}-* +} +trap clean_up EXIT + +# Make sure we have the latest kernel image +docker pull linuxkit/kernel:4.9.62 +# Build a package +docker build -t ${IMAGE_NAME} . + +# Build and run a LinuxKit image with kernel module (and test script) +linuxkit build -format kernel+initrd -name "${NAME}" test.yml +RESULT="$(linuxkit run ${NAME})" +echo "${RESULT}" | grep -q "Hello LinuxKit" + +exit 0 diff --git a/test/cases/020_kernel/010_kmod_4.9.x/test.yml b/test/cases/020_kernel/011_kmod_4.9.x/test.yml similarity index 93% rename from test/cases/020_kernel/010_kmod_4.9.x/test.yml rename to test/cases/020_kernel/011_kmod_4.9.x/test.yml index d4b02cc3e..3983e0729 100644 --- a/test/cases/020_kernel/010_kmod_4.9.x/test.yml +++ b/test/cases/020_kernel/011_kmod_4.9.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:4.9.62 + image: linuxkit/kernel:4.9.64 cmdline: "console=ttyS0" init: - linuxkit/init:42a92119e1ca10380e0d33e26c0cbcf85b9b3558 diff --git a/test/cases/020_kernel/015_kmod_4.13.x/Dockerfile b/test/cases/020_kernel/015_kmod_4.13.x/Dockerfile new file mode 100644 index 000000000..7e2cf90c8 --- /dev/null +++ b/test/cases/020_kernel/015_kmod_4.13.x/Dockerfile @@ -0,0 +1,23 @@ +# This Dockerfile extracts the kernel headers from the kernel image +# and then compiles a simple hello world kernel module against them. +# In the last stage, it creates a package, which can be used for +# testing. + +FROM linuxkit/kernel:4.13.15 AS ksrc + +# Extract headers and compile module +FROM linuxkit/alpine:07f7d136e427dc68154cd5edbb2b9576f9ac5213 AS build +RUN apk add build-base libelf-dev + +COPY --from=ksrc /kernel-dev.tar / +RUN tar xf kernel-dev.tar + +WORKDIR /kmod +COPY ./src/* ./ +RUN make all + +# Package +FROM alpine:3.5 +COPY --from=build /kmod/hello_world.ko / +COPY check.sh /check.sh +ENTRYPOINT ["/bin/sh", "/check.sh"] diff --git a/test/cases/020_kernel/015_kmod_4.13.x/check.sh b/test/cases/020_kernel/015_kmod_4.13.x/check.sh new file mode 100755 index 000000000..02e491624 --- /dev/null +++ b/test/cases/020_kernel/015_kmod_4.13.x/check.sh @@ -0,0 +1,15 @@ +#!/bin/sh +function failed { + printf "Kernel module test suite FAILED\n" + /sbin/poweroff -f +} + +uname -a +modinfo hello_world.ko || failed +insmod hello_world.ko || failed +[ -n "$(dmesg | grep -o 'Hello LinuxKit')" ] || failed +rmmod hello_world || failed + +printf "Kernel module test suite PASSED\n" + +/sbin/poweroff -f diff --git a/test/cases/020_kernel/015_kmod_4.13.x/src/Makefile b/test/cases/020_kernel/015_kmod_4.13.x/src/Makefile new file mode 100644 index 000000000..31c8215dd --- /dev/null +++ b/test/cases/020_kernel/015_kmod_4.13.x/src/Makefile @@ -0,0 +1,6 @@ +obj-m += hello_world.o +KVER=$(shell basename /usr/src/linux-headers-*) +all: + make -C /usr/src/$(KVER) M=$(PWD) modules +clean: + make -C /usr/src/$(KVER) M=$(PWD) clean diff --git a/test/cases/020_kernel/015_kmod_4.13.x/src/hello_world.c b/test/cases/020_kernel/015_kmod_4.13.x/src/hello_world.c new file mode 100644 index 000000000..7dd6d3ee2 --- /dev/null +++ b/test/cases/020_kernel/015_kmod_4.13.x/src/hello_world.c @@ -0,0 +1,22 @@ +/* + * A simple Hello World kernel module + */ +#include +#include + +int init_hello(void) +{ + printk(KERN_INFO "Hello LinuxKit\n"); + return 0; +} + +void exit_hello(void) +{ + printk(KERN_INFO "Goodbye LinuxKit.\n"); +} + +module_init(init_hello); +module_exit(exit_hello); +MODULE_AUTHOR("Rolf Neugebauer "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("A simple Hello World kernel module for testing"); diff --git a/test/cases/020_kernel/015_kmod_4.13.x/test.sh b/test/cases/020_kernel/015_kmod_4.13.x/test.sh new file mode 100644 index 000000000..e845162e5 --- /dev/null +++ b/test/cases/020_kernel/015_kmod_4.13.x/test.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# SUMMARY: Test build and insertion of kernel modules +# LABELS: +# REPEAT: + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +NAME=kmod +IMAGE_NAME=kmod-test + +clean_up() { + docker rmi ${IMAGE_NAME} || true + rm -rf ${NAME}-* +} +trap clean_up EXIT + +# Make sure we have the latest kernel image +docker pull linuxkit/kernel:4.9.62 +# Build a package +docker build -t ${IMAGE_NAME} . + +# Build and run a LinuxKit image with kernel module (and test script) +linuxkit build -format kernel+initrd -name "${NAME}" test.yml +RESULT="$(linuxkit run ${NAME})" +echo "${RESULT}" | grep -q "Hello LinuxKit" + +exit 0 diff --git a/test/cases/020_kernel/015_kmod_4.13.x/test.yml b/test/cases/020_kernel/015_kmod_4.13.x/test.yml new file mode 100644 index 000000000..1533a465f --- /dev/null +++ b/test/cases/020_kernel/015_kmod_4.13.x/test.yml @@ -0,0 +1,20 @@ +kernel: + image: linuxkit/kernel:4.13.15 + cmdline: "console=ttyS0" +init: + - linuxkit/init:42a92119e1ca10380e0d33e26c0cbcf85b9b3558 + - linuxkit/runc:1b0741d07949c0acc444cd6a04ee7f833443579d +onboot: + - name: check + image: kmod-test + binds: + - /dev:/dev + - /lib/modules:/lib/modules + capabilities: + - all + - name: poweroff + image: linuxkit/poweroff:280bd01daa8776fbe1f4d912977f1886b8374834 + command: ["/bin/sh", "/poweroff.sh", "3"] +trust: + org: + - linuxkit diff --git a/test/cases/020_kernel/016_kmod_4.14.x/Dockerfile b/test/cases/020_kernel/016_kmod_4.14.x/Dockerfile new file mode 100644 index 000000000..31244e20d --- /dev/null +++ b/test/cases/020_kernel/016_kmod_4.14.x/Dockerfile @@ -0,0 +1,23 @@ +# This Dockerfile extracts the kernel headers from the kernel image +# and then compiles a simple hello world kernel module against them. +# In the last stage, it creates a package, which can be used for +# testing. + +FROM linuxkit/kernel:4.14.1 AS ksrc + +# Extract headers and compile module +FROM linuxkit/alpine:07f7d136e427dc68154cd5edbb2b9576f9ac5213 AS build +RUN apk add build-base libelf-dev + +COPY --from=ksrc /kernel-dev.tar / +RUN tar xf kernel-dev.tar + +WORKDIR /kmod +COPY ./src/* ./ +RUN make all + +# Package +FROM alpine:3.5 +COPY --from=build /kmod/hello_world.ko / +COPY check.sh /check.sh +ENTRYPOINT ["/bin/sh", "/check.sh"] diff --git a/test/cases/020_kernel/016_kmod_4.14.x/check.sh b/test/cases/020_kernel/016_kmod_4.14.x/check.sh new file mode 100755 index 000000000..02e491624 --- /dev/null +++ b/test/cases/020_kernel/016_kmod_4.14.x/check.sh @@ -0,0 +1,15 @@ +#!/bin/sh +function failed { + printf "Kernel module test suite FAILED\n" + /sbin/poweroff -f +} + +uname -a +modinfo hello_world.ko || failed +insmod hello_world.ko || failed +[ -n "$(dmesg | grep -o 'Hello LinuxKit')" ] || failed +rmmod hello_world || failed + +printf "Kernel module test suite PASSED\n" + +/sbin/poweroff -f diff --git a/test/cases/020_kernel/016_kmod_4.14.x/src/Makefile b/test/cases/020_kernel/016_kmod_4.14.x/src/Makefile new file mode 100644 index 000000000..31c8215dd --- /dev/null +++ b/test/cases/020_kernel/016_kmod_4.14.x/src/Makefile @@ -0,0 +1,6 @@ +obj-m += hello_world.o +KVER=$(shell basename /usr/src/linux-headers-*) +all: + make -C /usr/src/$(KVER) M=$(PWD) modules +clean: + make -C /usr/src/$(KVER) M=$(PWD) clean diff --git a/test/cases/020_kernel/016_kmod_4.14.x/src/hello_world.c b/test/cases/020_kernel/016_kmod_4.14.x/src/hello_world.c new file mode 100644 index 000000000..7dd6d3ee2 --- /dev/null +++ b/test/cases/020_kernel/016_kmod_4.14.x/src/hello_world.c @@ -0,0 +1,22 @@ +/* + * A simple Hello World kernel module + */ +#include +#include + +int init_hello(void) +{ + printk(KERN_INFO "Hello LinuxKit\n"); + return 0; +} + +void exit_hello(void) +{ + printk(KERN_INFO "Goodbye LinuxKit.\n"); +} + +module_init(init_hello); +module_exit(exit_hello); +MODULE_AUTHOR("Rolf Neugebauer "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("A simple Hello World kernel module for testing"); diff --git a/test/cases/020_kernel/016_kmod_4.14.x/test.sh b/test/cases/020_kernel/016_kmod_4.14.x/test.sh new file mode 100644 index 000000000..e845162e5 --- /dev/null +++ b/test/cases/020_kernel/016_kmod_4.14.x/test.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# SUMMARY: Test build and insertion of kernel modules +# LABELS: +# REPEAT: + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +NAME=kmod +IMAGE_NAME=kmod-test + +clean_up() { + docker rmi ${IMAGE_NAME} || true + rm -rf ${NAME}-* +} +trap clean_up EXIT + +# Make sure we have the latest kernel image +docker pull linuxkit/kernel:4.9.62 +# Build a package +docker build -t ${IMAGE_NAME} . + +# Build and run a LinuxKit image with kernel module (and test script) +linuxkit build -format kernel+initrd -name "${NAME}" test.yml +RESULT="$(linuxkit run ${NAME})" +echo "${RESULT}" | grep -q "Hello LinuxKit" + +exit 0 diff --git a/test/cases/020_kernel/016_kmod_4.14.x/test.yml b/test/cases/020_kernel/016_kmod_4.14.x/test.yml new file mode 100644 index 000000000..b1b99d421 --- /dev/null +++ b/test/cases/020_kernel/016_kmod_4.14.x/test.yml @@ -0,0 +1,20 @@ +kernel: + image: linuxkit/kernel:4.14.1 + cmdline: "console=ttyS0" +init: + - linuxkit/init:42a92119e1ca10380e0d33e26c0cbcf85b9b3558 + - linuxkit/runc:1b0741d07949c0acc444cd6a04ee7f833443579d +onboot: + - name: check + image: kmod-test + binds: + - /dev:/dev + - /lib/modules:/lib/modules + capabilities: + - all + - name: poweroff + image: linuxkit/poweroff:280bd01daa8776fbe1f4d912977f1886b8374834 + command: ["/bin/sh", "/poweroff.sh", "3"] +trust: + org: + - linuxkit