Skip to content

Commit

Permalink
kunit: test: add initial tests
Browse files Browse the repository at this point in the history
Add a test for string stream along with a simpler example.

Signed-off-by: Brendan Higgins <[email protected]>
Reviewed-by: Greg Kroah-Hartman <[email protected]>
Reviewed-by: Logan Gunthorpe <[email protected]>
Reviewed-by: Stephen Boyd <[email protected]>
Signed-off-by: Shuah Khan <[email protected]>
  • Loading branch information
bjh83 authored and shuahkh committed Sep 30, 2019
1 parent 84bc809 commit d8e2a76
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 0 deletions.
23 changes: 23 additions & 0 deletions lib/kunit/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,26 @@ menuconfig KUNIT
special hardware when using UML. Can also be used on most other
architectures. For more information, please see
Documentation/dev-tools/kunit/.

if KUNIT

config KUNIT_TEST
bool "KUnit test for KUnit"
help
Enables the unit tests for the KUnit test framework. These tests test
the KUnit test framework itself; the tests are both written using
KUnit and test KUnit. This option should only be enabled for testing
purposes by developers interested in testing that KUnit works as
expected.

config KUNIT_EXAMPLE_TEST
bool "Example test for KUnit"
help
Enables an example unit test that illustrates some of the basic
features of KUnit. This test only exists to help new users understand
what KUnit is and how it is used. Please refer to the example test
itself, lib/kunit/example-test.c, for more information. This option
is intended for curious hackers who would like to understand how to
use KUnit for kernel development.

endif # KUNIT
4 changes: 4 additions & 0 deletions lib/kunit/Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
obj-$(CONFIG_KUNIT) += test.o \
string-stream.o \
assert.o

obj-$(CONFIG_KUNIT_TEST) += string-stream-test.o

obj-$(CONFIG_KUNIT_EXAMPLE_TEST) += example-test.o
88 changes: 88 additions & 0 deletions lib/kunit/example-test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Example KUnit test to show how to use KUnit.
*
* Copyright (C) 2019, Google LLC.
* Author: Brendan Higgins <[email protected]>
*/

#include <kunit/test.h>

/*
* This is the most fundamental element of KUnit, the test case. A test case
* makes a set EXPECTATIONs and ASSERTIONs about the behavior of some code; if
* any expectations or assertions are not met, the test fails; otherwise, the
* test passes.
*
* In KUnit, a test case is just a function with the signature
* `void (*)(struct kunit *)`. `struct kunit` is a context object that stores
* information about the current test.
*/
static void example_simple_test(struct kunit *test)
{
/*
* This is an EXPECTATION; it is how KUnit tests things. When you want
* to test a piece of code, you set some expectations about what the
* code should do. KUnit then runs the test and verifies that the code's
* behavior matched what was expected.
*/
KUNIT_EXPECT_EQ(test, 1 + 1, 2);
}

/*
* This is run once before each test case, see the comment on
* example_test_suite for more information.
*/
static int example_test_init(struct kunit *test)
{
kunit_info(test, "initializing\n");

return 0;
}

/*
* Here we make a list of all the test cases we want to add to the test suite
* below.
*/
static struct kunit_case example_test_cases[] = {
/*
* This is a helper to create a test case object from a test case
* function; its exact function is not important to understand how to
* use KUnit, just know that this is how you associate test cases with a
* test suite.
*/
KUNIT_CASE(example_simple_test),
{}
};

/*
* This defines a suite or grouping of tests.
*
* Test cases are defined as belonging to the suite by adding them to
* `kunit_cases`.
*
* Often it is desirable to run some function which will set up things which
* will be used by every test; this is accomplished with an `init` function
* which runs before each test case is invoked. Similarly, an `exit` function
* may be specified which runs after every test case and can be used to for
* cleanup. For clarity, running tests in a test suite would behave as follows:
*
* suite.init(test);
* suite.test_case[0](test);
* suite.exit(test);
* suite.init(test);
* suite.test_case[1](test);
* suite.exit(test);
* ...;
*/
static struct kunit_suite example_test_suite = {
.name = "example",
.init = example_test_init,
.test_cases = example_test_cases,
};

/*
* This registers the above test suite telling KUnit that this is a suite of
* tests that need to be run.
*/
kunit_test_suite(example_test_suite);
52 changes: 52 additions & 0 deletions lib/kunit/string-stream-test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// SPDX-License-Identifier: GPL-2.0
/*
* KUnit test for struct string_stream.
*
* Copyright (C) 2019, Google LLC.
* Author: Brendan Higgins <[email protected]>
*/

#include <kunit/string-stream.h>
#include <kunit/test.h>
#include <linux/slab.h>

static void string_stream_test_empty_on_creation(struct kunit *test)
{
struct string_stream *stream = alloc_string_stream(test, GFP_KERNEL);

KUNIT_EXPECT_TRUE(test, string_stream_is_empty(stream));
}

static void string_stream_test_not_empty_after_add(struct kunit *test)
{
struct string_stream *stream = alloc_string_stream(test, GFP_KERNEL);

string_stream_add(stream, "Foo");

KUNIT_EXPECT_FALSE(test, string_stream_is_empty(stream));
}

static void string_stream_test_get_string(struct kunit *test)
{
struct string_stream *stream = alloc_string_stream(test, GFP_KERNEL);
char *output;

string_stream_add(stream, "Foo");
string_stream_add(stream, " %s", "bar");

output = string_stream_get_string(stream);
KUNIT_EXPECT_STREQ(test, output, "Foo bar");
}

static struct kunit_case string_stream_test_cases[] = {
KUNIT_CASE(string_stream_test_empty_on_creation),
KUNIT_CASE(string_stream_test_not_empty_after_add),
KUNIT_CASE(string_stream_test_get_string),
{}
};

static struct kunit_suite string_stream_test_suite = {
.name = "string-stream-test",
.test_cases = string_stream_test_cases
};
kunit_test_suite(string_stream_test_suite);

0 comments on commit d8e2a76

Please sign in to comment.