]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kunit: Add test for static stub
authorTzung-Bi Shih <tzungbi@kernel.org>
Thu, 12 Jun 2025 08:48:34 +0000 (08:48 +0000)
committerShuah Khan <skhan@linuxfoundation.org>
Wed, 18 Jun 2025 18:56:18 +0000 (12:56 -0600)
__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>
lib/kunit/kunit-test.c

index d9c781c859fde1f3623eb71b6829e82aa4803762..f8f567196ca93c112d13e190fe115340b9cf2d31 100644 (file)
@@ -8,6 +8,7 @@
 #include "linux/gfp_types.h"
 #include <kunit/test.h>
 #include <kunit/test-bug.h>
+#include <kunit/static_stub.h>
 
 #include <linux/device.h>
 #include <kunit/device.h>
@@ -868,10 +869,53 @@ static struct kunit_suite kunit_current_test_suite = {
        .test_cases = kunit_current_test_cases,
 };
 
+static void kunit_stub_test(struct kunit *test)
+{
+       struct kunit fake_test;
+       const unsigned long fake_real_fn_addr = 0x1234;
+       const unsigned long fake_replacement_addr = 0x5678;
+       struct kunit_resource *res;
+       struct {
+               void *real_fn_addr;
+               void *replacement_addr;
+       } *stub_ctx;
+
+       kunit_init_test(&fake_test, "kunit_stub_fake_test", NULL);
+       KUNIT_ASSERT_EQ(test, fake_test.status, KUNIT_SUCCESS);
+       KUNIT_ASSERT_EQ(test, list_count_nodes(&fake_test.resources), 0);
+
+       __kunit_activate_static_stub(&fake_test, (void *)fake_real_fn_addr,
+                                    (void *)fake_replacement_addr);
+       KUNIT_ASSERT_EQ(test, fake_test.status, KUNIT_SUCCESS);
+       KUNIT_ASSERT_EQ(test, list_count_nodes(&fake_test.resources), 1);
+
+       res = list_first_entry(&fake_test.resources, struct kunit_resource, node);
+       KUNIT_EXPECT_NOT_NULL(test, res);
+
+       stub_ctx = res->data;
+       KUNIT_EXPECT_NOT_NULL(test, stub_ctx);
+       KUNIT_EXPECT_EQ(test, (unsigned long)stub_ctx->real_fn_addr, fake_real_fn_addr);
+       KUNIT_EXPECT_EQ(test, (unsigned long)stub_ctx->replacement_addr, fake_replacement_addr);
+
+       __kunit_activate_static_stub(&fake_test, (void *)fake_real_fn_addr, NULL);
+       KUNIT_ASSERT_EQ(test, fake_test.status, KUNIT_SUCCESS);
+       KUNIT_ASSERT_EQ(test, list_count_nodes(&fake_test.resources), 0);
+}
+
+static struct kunit_case kunit_stub_test_cases[] = {
+       KUNIT_CASE(kunit_stub_test),
+       {}
+};
+
+static struct kunit_suite kunit_stub_test_suite = {
+       .name = "kunit_stub",
+       .test_cases = kunit_stub_test_cases,
+};
+
 kunit_test_suites(&kunit_try_catch_test_suite, &kunit_resource_test_suite,
                  &kunit_log_test_suite, &kunit_status_test_suite,
                  &kunit_current_test_suite, &kunit_device_test_suite,
-                 &kunit_fault_test_suite);
+                 &kunit_fault_test_suite, &kunit_stub_test_suite);
 
 MODULE_DESCRIPTION("KUnit test for core test infrastructure");
 MODULE_LICENSE("GPL v2");