linux-stable/tools/testing/selftests/kselftest_module.h
Tobin C. Harding eebf4dd452 kselftest: Add test module framework header
kselftest runs as a userspace process.  Sometimes we need to test things
from kernel space.  One way of doing this is by creating a test module.
Currently doing so requires developers to write a bunch of boiler plate
in the module if kselftest is to be used to run the tests.  This means
we currently have a load of duplicate code to achieve these ends.  If we
have a uniform method for implementing test modules then we can reduce
code duplication, ensure uniformity in the test framework, ease code
maintenance, and reduce the work required to create tests.  This all
helps to encourage developers to write and run tests.

Add a C header file that can be included in test modules.  This provides
a single point for common test functions/macros.  Implement a few macros
that make up the start of the test framework.

Add documentation for new kselftest header to kselftest documentation.

Acked-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Tobin C. Harding <tobin@kernel.org>
Signed-off-by: Shuah Khan <shuah@kernel.org>
2019-04-08 16:44:20 -06:00

48 lines
1.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef __KSELFTEST_MODULE_H
#define __KSELFTEST_MODULE_H
#include <linux/module.h>
/*
* Test framework for writing test modules to be loaded by kselftest.
* See Documentation/dev-tools/kselftest.rst for an example test module.
*/
#define KSTM_MODULE_GLOBALS() \
static unsigned int total_tests __initdata; \
static unsigned int failed_tests __initdata
#define KSTM_CHECK_ZERO(x) do { \
total_tests++; \
if (x) { \
pr_warn("TC failed at %s:%d\n", __func__, __LINE__); \
failed_tests++; \
} \
} while (0)
static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests)
{
if (failed_tests == 0)
pr_info("all %u tests passed\n", total_tests);
else
pr_warn("failed %u out of %u tests\n", failed_tests, total_tests);
return failed_tests ? -EINVAL : 0;
}
#define KSTM_MODULE_LOADERS(__module) \
static int __init __module##_init(void) \
{ \
pr_info("loaded.\n"); \
selftest(); \
return kstm_report(total_tests, failed_tests); \
} \
static void __exit __module##_exit(void) \
{ \
pr_info("unloaded.\n"); \
} \
module_init(__module##_init); \
module_exit(__module##_exit)
#endif /* __KSELFTEST_MODULE_H */