Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kunit: Add test for static stub

__kunit_activate_static_stub() works effectively as
kunit_deactivate_static_stub() if `replacement_addr` is NULL.

Add a test case to catch the issue discovered in
commit 772e50a76ee6 ("kunit: Fix wrong parameter to kunit_deactivate_static_stub()").

For running the test:

$ ./tools/testing/kunit/kunit.py run \
--arch=x86_64 \
kunit_stub

Fixed change log:
Shuah Khan <skhan@linuxfoundation.org>

Link: https://lore.kernel.org/r/20250612084834.587576-1-tzungbi@kernel.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Tzung-Bi Shih and committed by
Shuah Khan
e42ad393 76ee96d3

+45 -1
+45 -1
lib/kunit/kunit-test.c
··· 8 8 #include "linux/gfp_types.h" 9 9 #include <kunit/test.h> 10 10 #include <kunit/test-bug.h> 11 + #include <kunit/static_stub.h> 11 12 12 13 #include <linux/device.h> 13 14 #include <kunit/device.h> ··· 869 868 .test_cases = kunit_current_test_cases, 870 869 }; 871 870 871 + static void kunit_stub_test(struct kunit *test) 872 + { 873 + struct kunit fake_test; 874 + const unsigned long fake_real_fn_addr = 0x1234; 875 + const unsigned long fake_replacement_addr = 0x5678; 876 + struct kunit_resource *res; 877 + struct { 878 + void *real_fn_addr; 879 + void *replacement_addr; 880 + } *stub_ctx; 881 + 882 + kunit_init_test(&fake_test, "kunit_stub_fake_test", NULL); 883 + KUNIT_ASSERT_EQ(test, fake_test.status, KUNIT_SUCCESS); 884 + KUNIT_ASSERT_EQ(test, list_count_nodes(&fake_test.resources), 0); 885 + 886 + __kunit_activate_static_stub(&fake_test, (void *)fake_real_fn_addr, 887 + (void *)fake_replacement_addr); 888 + KUNIT_ASSERT_EQ(test, fake_test.status, KUNIT_SUCCESS); 889 + KUNIT_ASSERT_EQ(test, list_count_nodes(&fake_test.resources), 1); 890 + 891 + res = list_first_entry(&fake_test.resources, struct kunit_resource, node); 892 + KUNIT_EXPECT_NOT_NULL(test, res); 893 + 894 + stub_ctx = res->data; 895 + KUNIT_EXPECT_NOT_NULL(test, stub_ctx); 896 + KUNIT_EXPECT_EQ(test, (unsigned long)stub_ctx->real_fn_addr, fake_real_fn_addr); 897 + KUNIT_EXPECT_EQ(test, (unsigned long)stub_ctx->replacement_addr, fake_replacement_addr); 898 + 899 + __kunit_activate_static_stub(&fake_test, (void *)fake_real_fn_addr, NULL); 900 + KUNIT_ASSERT_EQ(test, fake_test.status, KUNIT_SUCCESS); 901 + KUNIT_ASSERT_EQ(test, list_count_nodes(&fake_test.resources), 0); 902 + } 903 + 904 + static struct kunit_case kunit_stub_test_cases[] = { 905 + KUNIT_CASE(kunit_stub_test), 906 + {} 907 + }; 908 + 909 + static struct kunit_suite kunit_stub_test_suite = { 910 + .name = "kunit_stub", 911 + .test_cases = kunit_stub_test_cases, 912 + }; 913 + 872 914 kunit_test_suites(&kunit_try_catch_test_suite, &kunit_resource_test_suite, 873 915 &kunit_log_test_suite, &kunit_status_test_suite, 874 916 &kunit_current_test_suite, &kunit_device_test_suite, 875 - &kunit_fault_test_suite); 917 + &kunit_fault_test_suite, &kunit_stub_test_suite); 876 918 877 919 MODULE_DESCRIPTION("KUnit test for core test infrastructure"); 878 920 MODULE_LICENSE("GPL v2");