Skip to content

Commit

Permalink
Kunit to check the longest symbol length
Browse files Browse the repository at this point in the history
 Kunit test to check the maximum longest symbol length

Signed-off-by: Sergio González Collado <[email protected]>
  • Loading branch information
sergiocollado committed Feb 4, 2023
1 parent 3dfc5eb commit 92c3858
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 0 deletions.
9 changes: 9 additions & 0 deletions lib/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -2582,6 +2582,15 @@ config FORTIFY_KUNIT_TEST
by the str*() and mem*() family of functions. For testing runtime
traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests.

config LONGEST_SYM_KUNIT_TEST
tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS
depends on KUNIT
default KUNIT_ALL_TESTS
help
Tests the longest symbol possible

If unsure, say N.

config HW_BREAKPOINT_KUNIT_TEST
bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS
depends on HAVE_HW_BREAKPOINT
Expand Down
1 change: 1 addition & 0 deletions lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,7 @@ obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o
CFLAGS_stackinit_kunit.o += $(call cc-disable-warning, switch-unreachable)
obj-$(CONFIG_STACKINIT_KUNIT_TEST) += stackinit_kunit.o
obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o

obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o

Expand Down
77 changes: 77 additions & 0 deletions lib/longest_symbol_kunit.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Test the longest symbol length
*/

#include <kunit/test.h>
#include <linux/stringify.h>
#include <linux/kallsyms.h>

#define DI(name) s##name##name
#define DDI(name) DI(n##name##name)
#define DDDI(name) DDI(n##name##name)
#define DDDDI(name) DDDI(n##name##name)
#define DDDDDI(name) DDDDI(n##name##name)

#define PLUS1(name) name##e

/*Generate a symbol whose name length is 511 */
#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n)

/*Generate a symbol whose name length is 512 */
#define LONGEST_SYM_PLUS1 PLUS1(LONGEST_SYM_NAME)

int noinline LONGEST_SYM_NAME(void)
{
return 424242;
}

int noinline LONGEST_SYM_NAME_PLUS1(void)
{
return 434343;
}

_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN, \
"Incorrect symbol length found. Expected KSYM_NAME_LEN: " \
__stringify(KSYM_NAME) ", but found: " \
__stringify(sizeof(LONGEST_SYM_NAME)));

static void test_longest_symbol(struct kunit *test)
{
KUNIT_EXPECT_EQ(test, 424242, LONGEST_SYM_NAME());
};

static void test_longest_symbol_kallsyms(struct kunit *test)
{
static int (*longest_sym)(void);
longest_sym = \
(void*) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME));
KUNIT_EXPECT_EQ(test, 424242, longest_sym());
};

static void test_longest_symbol_plus1(struct kunit *test)
{
KUNIT_EXPECT_EQ(test, 434343, LONGEST_SYM_NAME_PLUS1());
};

static void test_longest_symbol_plus1_kallsyms(struct kunit *test)
{
static int (*longest_sym_plus1)(void);
longest_sym_plus1 = \
(void*) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME_PLUS1));
KUNIT_EXPECT_EQ(test, 434343, longest_sym_plus1());
};

static struct kunit_case longest_symbol_test_cases[] = {
KUNIT_CASE(test_longest_symbol),
KUNIT_CASE(test_longest_symbol_kallsyms),
KUNIT_CASE(test_longest_symbol_plus1),
KUNIT_CASE(test_longest_symbol_plus1_kallsyms),
{}
};

static struct kunit_suite longest_symbol_test_suite = {
.name = "longest-symbol",
.test_cases = longest_symbol_test_cases,
};
kunit_test_suite(longest_symbol_test_suite);

0 comments on commit 92c3858

Please sign in to comment.