.. SPDX-License-Identifier: GPL-2.0

===============
Getting Started
===============

Installing dependencies
=======================
KUnit has the same dependencies as the Linux kernel. As long as you can build
the kernel, you can run KUnit.

KUnit Wrapper
=============
Included with KUnit is a simple Python wrapper that helps format the output to
easily use and read KUnit output. It handles building and running the kernel, as
well as formatting the output.

The wrapper can be run with:

.. code-block:: bash

	 ./tools/testing/kunit/kunit.py run

Creating a kunitconfig
======================
The Python script is a thin wrapper around Kbuild as such, it needs to be
configured with a ``kunitconfig`` file. This file essentially contains the
regular Kernel config, with the specific test targets as well.

.. code-block:: bash

	git clone -b kunit/alpha/master https://kunit.googlesource.com/kunitconfig $PATH_TO_KUNITCONFIG_REPO
	cd $PATH_TO_LINUX_REPO
	ln -s $PATH_TO_KUNIT_CONFIG_REPO/kunitconfig kunitconfig

You may want to add kunitconfig to your local gitignore.

Verifying KUnit Works
-------------------------

To make sure that everything is set up correctly, simply invoke the Python
wrapper from your kernel repo:

.. code-block:: bash

	./tools/testing/kunit/kunit.py

.. note::
   You may want to run ``make mrproper`` first.

If everything worked correctly, you should see the following:

.. code-block:: bash

	Generating .config ...
	Building KUnit Kernel ...
	Starting KUnit Kernel ...

followed by a list of tests that are run. All of them should be passing.

.. note::
   Because it is building a lot of sources for the first time, the ``Building
   kunit kernel`` step may take a while.

Writing your first test
==========================

In your kernel repo let's add some code that we can test. Create a file
``drivers/misc/example.h`` with the contents:

.. code-block:: c

	struct misc_example {
		int (*misc_example_foo)(struct misc_example *, int);
	};

	int misc_example_bar(struct misc_example *example);

create a file ``drivers/misc/example.c``:

.. code-block:: c

	#include <linux/errno.h>

	#include "example.h"

	int misc_example_bar(struct misc_example *example)
	{
		if (example->misc_example_foo(example, 5))
			return -EIO;
		else
			return 0;
	}

Now add the following lines to ``drivers/misc/Kconfig``:

.. code-block:: kconfig

	config MISC_EXAMPLE
		bool "My example"

and the following lines to ``drivers/misc/Makefile``:

.. code-block:: make

	obj-$(CONFIG_MISC_EXAMPLE) += example.o

Now we are ready to write the test. The test will be in
``drivers/misc/example-test.c``:

.. code-block:: c

	#include <linux/test.h>
	#include <linux/mock.h>
	#include "example.h"

	/* Define the mock. */

	DECLARE_STRUCT_CLASS_MOCK_PREREQS(misc_example);

	DEFINE_STRUCT_CLASS_MOCK(METHOD(misc_example_foo), CLASS(misc_example),
				 RETURNS(int),
				 PARAMS(struct misc_example *, int));

	static int misc_example_init(struct MOCK(misc_example) *mock_example)
	{
		struct misc_example *example = mock_get_trgt(mock_example);

		example->misc_example_foo = misc_example_foo;
		return 0;
	}

	DEFINE_STRUCT_CLASS_MOCK_INIT(misc_example, misc_example_init);

	/* Define the test cases. */

	static void misc_example_bar_test_success(struct test *test)
	{
		struct MOCK(misc_example) *mock_example = test->priv;
		struct misc_example *example = mock_get_trgt(mock_example);
		struct mock_expectation *handle;

		handle = EXPECT_CALL(misc_example_foo(mock_get_ctrl(mock_example),
						      int_eq(test, 5)));
		handle->action = int_return(test, 0);

		EXPECT_EQ(test, 0, misc_example_bar(example));
	}

	static void misc_example_bar_test_failure(struct test *test)
	{
		struct MOCK(misc_example) *mock_example = test->priv;
		struct misc_example *example = mock_get_trgt(mock_example);
		struct mock_expectation *handle;

		handle = EXPECT_CALL(misc_example_foo(mock_get_ctrl(mock_example),
						      int_eq(test, 5)));
		handle->action = int_return(test, -EINVAL);

		EXPECT_EQ(test, -EINVAL, misc_example_bar(example));
	}

	static int misc_example_test_init(struct test *test)
	{
		test->priv = CONSTRUCT_MOCK(misc_example, test);
		if (!test->priv)
			return -EINVAL;

		return 0;
	}

	static void misc_example_test_exit(struct test *test)
	{
	}

	static struct test_case misc_example_test_cases[] = {
		TEST_CASE(misc_example_bar_test_success),
		TEST_CASE(misc_example_bar_test_failure),
		{},
	};

	static struct test_module misc_example_test_module = {
		.name = "misc-example",
		.init = misc_example_test_init,
		.exit = misc_example_test_exit,
		.test_cases = misc_example_test_cases,
	};
	module_test(misc_example_test_module);

Now add the following to ``drivers/misc/Kconfig``:

.. code-block:: kconfig

	config MISC_EXAMPLE_TEST
		bool "Test for my example"
		depends on MISC_EXAMPLE && TEST

and the following to ``drivers/misc/Makefile``:

.. code-block:: make

	obj-$(CONFIG_MISC_EXAMPLE_TEST) += example-test.o

Now add it to your ``kunitconfig``:

.. code-block:: none

	CONFIG_MISC_EXAMPLE=y
	CONFIG_MISC_EXAMPLE_TEST=y

Now you can run the test:

.. code-block:: bash

	./tools/testing/kunit/kunit.py

You should see the following failure:

.. code-block:: none

	...
	kunit misc-example: misc_example_bar_test_success passed
	kunit misc-example: EXPECTATION FAILED at drivers/misc/example-test.c:48
		Expected -22 == misc_example_bar(example), but
			-22 == -22
			misc_example_bar(example) == -5
	kunit misc-example: misc_example_bar_test_failure failed
	kunit misc-example: one or more tests failed

Congrats! You just wrote your first KUnit test!

Next Steps
=============
*   Check out the :doc:`usage` page for a more
    in-depth explanation of KUnit.
