Commit 5fb1a8c6 authored by Richard Fitzgerald's avatar Richard Fitzgerald Committed by Shuah Khan
Browse files

kunit: Add example of kunit_activate_static_stub() with pointer-to-function



Adds a variant of example_static_stub_test() that shows use of a
pointer-to-function with kunit_activate_static_stub().

A const pointer to the add_one() function is declared. This
pointer-to-function is passed to kunit_activate_static_stub() and
kunit_deactivate_static_stub() instead of passing add_one directly.

Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Reviewed-by: default avatarDavid Gow <davidgow@google.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent fcbac39b
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -168,6 +168,16 @@ static int subtract_one(int i)
	return i - 1;
}

/*
 * If the function to be replaced is static within a module it is
 * useful to export a pointer to that function instead of having
 * to change the static function to a non-static exported function.
 *
 * This pointer simulates a module exporting a pointer to a static
 * function.
 */
static int (* const add_one_fn_ptr)(int i) = add_one;

/*
 * This test shows the use of static stubs.
 */
@@ -187,6 +197,30 @@ static void example_static_stub_test(struct kunit *test)
	KUNIT_EXPECT_EQ(test, add_one(1), 2);
}

/*
 * This test shows the use of static stubs when the function being
 * replaced is provided as a pointer-to-function instead of the
 * actual function. This is useful for providing access to static
 * functions in a module by exporting a pointer to that function
 * instead of having to change the static function to a non-static
 * exported function.
 */
static void example_static_stub_using_fn_ptr_test(struct kunit *test)
{
	/* By default, function is not stubbed. */
	KUNIT_EXPECT_EQ(test, add_one(1), 2);

	/* Replace add_one() with subtract_one(). */
	kunit_activate_static_stub(test, add_one_fn_ptr, subtract_one);

	/* add_one() is now replaced. */
	KUNIT_EXPECT_EQ(test, add_one(1), 0);

	/* Return add_one() to normal. */
	kunit_deactivate_static_stub(test, add_one_fn_ptr);
	KUNIT_EXPECT_EQ(test, add_one(1), 2);
}

static const struct example_param {
	int value;
} example_params_array[] = {
@@ -259,6 +293,7 @@ static struct kunit_case example_test_cases[] = {
	KUNIT_CASE(example_mark_skipped_test),
	KUNIT_CASE(example_all_expect_macros_test),
	KUNIT_CASE(example_static_stub_test),
	KUNIT_CASE(example_static_stub_using_fn_ptr_test),
	KUNIT_CASE(example_priv_test),
	KUNIT_CASE_PARAM(example_params_test, example_gen_params),
	KUNIT_CASE_SLOW(example_slow_test),