forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'linux-kselftest-kunit-5.13-rc1' of git://git.kernel.org/pu…
…b/scm/linux/kernel/git/shuah/linux-kselftest Pull KUnit updates from Shuah Khan: "Several fixes and a new feature to support failure from dynamic analysis tools such as UBSAN and fake ops for testing. - a fake ops struct for testing a "free" function to complain if it was called with an invalid argument, or caught a double-free. Most return void and have no normal means of signalling failure (e.g. super_operations, iommu_ops, etc.)" * tag 'linux-kselftest-kunit-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest: Documentation: kunit: add tips for using current->kunit_test kunit: fix -Wunused-function warning for __kunit_fail_current_test kunit: support failure from dynamic analysis tools kunit: tool: make --kunitconfig accept dirs, add lib/kunit fragment kunit: make KUNIT_EXPECT_STREQ() quote values, don't print literals kunit: Match parenthesis alignment to improve code readability
- Loading branch information
Showing
8 changed files
with
198 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -78,8 +78,82 @@ Similarly to the above, it can be useful to add test-specific logic. | |
void test_only_hook(void) { } | ||
#endif | ||
TODO([email protected]): add an example of using ``current->kunit_test`` in | ||
such a hook when it's not only updated for ``CONFIG_KASAN=y``. | ||
This test-only code can be made more useful by accessing the current kunit | ||
test, see below. | ||
|
||
Accessing the current test | ||
-------------------------- | ||
|
||
In some cases, you need to call test-only code from outside the test file, e.g. | ||
like in the example above or if you're providing a fake implementation of an | ||
ops struct. | ||
There is a ``kunit_test`` field in ``task_struct``, so you can access it via | ||
``current->kunit_test``. | ||
|
||
Here's a slightly in-depth example of how one could implement "mocking": | ||
|
||
.. code-block:: c | ||
#include <linux/sched.h> /* for current */ | ||
struct test_data { | ||
int foo_result; | ||
int want_foo_called_with; | ||
}; | ||
static int fake_foo(int arg) | ||
{ | ||
struct kunit *test = current->kunit_test; | ||
struct test_data *test_data = test->priv; | ||
KUNIT_EXPECT_EQ(test, test_data->want_foo_called_with, arg); | ||
return test_data->foo_result; | ||
} | ||
static void example_simple_test(struct kunit *test) | ||
{ | ||
/* Assume priv is allocated in the suite's .init */ | ||
struct test_data *test_data = test->priv; | ||
test_data->foo_result = 42; | ||
test_data->want_foo_called_with = 1; | ||
/* In a real test, we'd probably pass a pointer to fake_foo somewhere | ||
* like an ops struct, etc. instead of calling it directly. */ | ||
KUNIT_EXPECT_EQ(test, fake_foo(1), 42); | ||
} | ||
Note: here we're able to get away with using ``test->priv``, but if you wanted | ||
something more flexible you could use a named ``kunit_resource``, see :doc:`api/test`. | ||
|
||
Failing the current test | ||
------------------------ | ||
|
||
But sometimes, you might just want to fail the current test. In that case, we | ||
have ``kunit_fail_current_test(fmt, args...)`` which is defined in ``<kunit/test-bug.h>`` and | ||
doesn't require pulling in ``<kunit/test.h>``. | ||
|
||
E.g. say we had an option to enable some extra debug checks on some data structure: | ||
|
||
.. code-block:: c | ||
#include <kunit/test-bug.h> | ||
#ifdef CONFIG_EXTRA_DEBUG_CHECKS | ||
static void validate_my_data(struct data *data) | ||
{ | ||
if (is_valid(data)) | ||
return; | ||
kunit_fail_current_test("data %p is invalid", data); | ||
/* Normal, non-KUnit, error reporting code here. */ | ||
} | ||
#else | ||
static void my_debug_function(void) { } | ||
#endif | ||
Customizing error messages | ||
-------------------------- | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* KUnit API allowing dynamic analysis tools to interact with KUnit tests | ||
* | ||
* Copyright (C) 2020, Google LLC. | ||
* Author: Uriel Guajardo <[email protected]> | ||
*/ | ||
|
||
#ifndef _KUNIT_TEST_BUG_H | ||
#define _KUNIT_TEST_BUG_H | ||
|
||
#define kunit_fail_current_test(fmt, ...) \ | ||
__kunit_fail_current_test(__FILE__, __LINE__, fmt, ##__VA_ARGS__) | ||
|
||
#if IS_BUILTIN(CONFIG_KUNIT) | ||
|
||
extern __printf(3, 4) void __kunit_fail_current_test(const char *file, int line, | ||
const char *fmt, ...); | ||
|
||
#else | ||
|
||
static inline __printf(3, 4) void __kunit_fail_current_test(const char *file, int line, | ||
const char *fmt, ...) | ||
{ | ||
} | ||
|
||
#endif | ||
|
||
#endif /* _KUNIT_TEST_BUG_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
CONFIG_KUNIT=y | ||
CONFIG_KUNIT_TEST=y | ||
CONFIG_KUNIT_EXAMPLE_TEST=y |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters