Commit d8e2a76b authored by Brendan Higgins's avatar Brendan Higgins Committed by Shuah Khan
Browse files

kunit: test: add initial tests



Add a test for string stream along with a simpler example.

Signed-off-by: default avatarBrendan Higgins <brendanhiggins@google.com>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Reviewed-by: default avatarStephen Boyd <sboyd@kernel.org>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 84bc809e
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Example KUnit test to show how to use KUnit.
 *
 * Copyright (C) 2019, Google LLC.
 * Author: Brendan Higgins <brendanhiggins@google.com>
 */

#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 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * KUnit test for struct string_stream.
 *
 * Copyright (C) 2019, Google LLC.
 * Author: Brendan Higgins <brendanhiggins@google.com>
 */

#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);