1c475c77dSAlan Maguire // SPDX-License-Identifier: GPL-2.0
2c475c77dSAlan Maguire /*
3c475c77dSAlan Maguire * Example KUnit test to show how to use KUnit.
4c475c77dSAlan Maguire *
5c475c77dSAlan Maguire * Copyright (C) 2019, Google LLC.
6c475c77dSAlan Maguire * Author: Brendan Higgins <[email protected]>
7c475c77dSAlan Maguire */
8c475c77dSAlan Maguire
9c475c77dSAlan Maguire #include <kunit/test.h>
10e047c5eaSDavid Gow #include <kunit/static_stub.h>
11c475c77dSAlan Maguire
12c475c77dSAlan Maguire /*
13c475c77dSAlan Maguire * This is the most fundamental element of KUnit, the test case. A test case
14c475c77dSAlan Maguire * makes a set EXPECTATIONs and ASSERTIONs about the behavior of some code; if
15c475c77dSAlan Maguire * any expectations or assertions are not met, the test fails; otherwise, the
16c475c77dSAlan Maguire * test passes.
17c475c77dSAlan Maguire *
18c475c77dSAlan Maguire * In KUnit, a test case is just a function with the signature
19c475c77dSAlan Maguire * `void (*)(struct kunit *)`. `struct kunit` is a context object that stores
20c475c77dSAlan Maguire * information about the current test.
21c475c77dSAlan Maguire */
example_simple_test(struct kunit * test)22c475c77dSAlan Maguire static void example_simple_test(struct kunit *test)
23c475c77dSAlan Maguire {
24c475c77dSAlan Maguire /*
25c475c77dSAlan Maguire * This is an EXPECTATION; it is how KUnit tests things. When you want
26c475c77dSAlan Maguire * to test a piece of code, you set some expectations about what the
27c475c77dSAlan Maguire * code should do. KUnit then runs the test and verifies that the code's
28c475c77dSAlan Maguire * behavior matched what was expected.
29c475c77dSAlan Maguire */
30c475c77dSAlan Maguire KUNIT_EXPECT_EQ(test, 1 + 1, 2);
31c475c77dSAlan Maguire }
32c475c77dSAlan Maguire
33c475c77dSAlan Maguire /*
34c475c77dSAlan Maguire * This is run once before each test case, see the comment on
35c475c77dSAlan Maguire * example_test_suite for more information.
36c475c77dSAlan Maguire */
example_test_init(struct kunit * test)37c475c77dSAlan Maguire static int example_test_init(struct kunit *test)
38c475c77dSAlan Maguire {
39c475c77dSAlan Maguire kunit_info(test, "initializing\n");
40c475c77dSAlan Maguire
41c475c77dSAlan Maguire return 0;
42c475c77dSAlan Maguire }
43c475c77dSAlan Maguire
44c475c77dSAlan Maguire /*
45a5ce66adSDavid Gow * This is run once after each test case, see the comment on
46a5ce66adSDavid Gow * example_test_suite for more information.
47a5ce66adSDavid Gow */
example_test_exit(struct kunit * test)48a5ce66adSDavid Gow static void example_test_exit(struct kunit *test)
49a5ce66adSDavid Gow {
50a5ce66adSDavid Gow kunit_info(test, "cleaning up\n");
51a5ce66adSDavid Gow }
52a5ce66adSDavid Gow
53a5ce66adSDavid Gow
54a5ce66adSDavid Gow /*
551cdba21dSDaniel Latypov * This is run once before all test cases in the suite.
561cdba21dSDaniel Latypov * See the comment on example_test_suite for more information.
571cdba21dSDaniel Latypov */
example_test_init_suite(struct kunit_suite * suite)581cdba21dSDaniel Latypov static int example_test_init_suite(struct kunit_suite *suite)
591cdba21dSDaniel Latypov {
601cdba21dSDaniel Latypov kunit_info(suite, "initializing suite\n");
611cdba21dSDaniel Latypov
621cdba21dSDaniel Latypov return 0;
631cdba21dSDaniel Latypov }
641cdba21dSDaniel Latypov
651cdba21dSDaniel Latypov /*
66a5ce66adSDavid Gow * This is run once after all test cases in the suite.
67a5ce66adSDavid Gow * See the comment on example_test_suite for more information.
68a5ce66adSDavid Gow */
example_test_exit_suite(struct kunit_suite * suite)69a5ce66adSDavid Gow static void example_test_exit_suite(struct kunit_suite *suite)
70a5ce66adSDavid Gow {
71a5ce66adSDavid Gow kunit_info(suite, "exiting suite\n");
72a5ce66adSDavid Gow }
73a5ce66adSDavid Gow
74a5ce66adSDavid Gow
75a5ce66adSDavid Gow /*
76d99ea675SDavid Gow * This test should always be skipped.
77d99ea675SDavid Gow */
example_skip_test(struct kunit * test)78d99ea675SDavid Gow static void example_skip_test(struct kunit *test)
79d99ea675SDavid Gow {
80d99ea675SDavid Gow /* This line should run */
81d99ea675SDavid Gow kunit_info(test, "You should not see a line below.");
82d99ea675SDavid Gow
83d99ea675SDavid Gow /* Skip (and abort) the test */
84d99ea675SDavid Gow kunit_skip(test, "this test should be skipped");
85d99ea675SDavid Gow
86d99ea675SDavid Gow /* This line should not execute */
87d99ea675SDavid Gow KUNIT_FAIL(test, "You should not see this line.");
88d99ea675SDavid Gow }
89d99ea675SDavid Gow
90d99ea675SDavid Gow /*
91d99ea675SDavid Gow * This test should always be marked skipped.
92d99ea675SDavid Gow */
example_mark_skipped_test(struct kunit * test)93d99ea675SDavid Gow static void example_mark_skipped_test(struct kunit *test)
94d99ea675SDavid Gow {
95d99ea675SDavid Gow /* This line should run */
96d99ea675SDavid Gow kunit_info(test, "You should see a line below.");
97d99ea675SDavid Gow
98d99ea675SDavid Gow /* Skip (but do not abort) the test */
99d99ea675SDavid Gow kunit_mark_skipped(test, "this test should be skipped");
100d99ea675SDavid Gow
101d99ea675SDavid Gow /* This line should run */
102d99ea675SDavid Gow kunit_info(test, "You should see this line.");
103d99ea675SDavid Gow }
1047b339105SDaniel Latypov
1057b339105SDaniel Latypov /*
1067b339105SDaniel Latypov * This test shows off all the types of KUNIT_EXPECT macros.
1077b339105SDaniel Latypov */
example_all_expect_macros_test(struct kunit * test)1087b339105SDaniel Latypov static void example_all_expect_macros_test(struct kunit *test)
1097b339105SDaniel Latypov {
1103b30fb62SMaíra Canal const u32 array1[] = { 0x0F, 0xFF };
1113b30fb62SMaíra Canal const u32 array2[] = { 0x1F, 0xFF };
1123b30fb62SMaíra Canal
1137b339105SDaniel Latypov /* Boolean assertions */
1147b339105SDaniel Latypov KUNIT_EXPECT_TRUE(test, true);
1157b339105SDaniel Latypov KUNIT_EXPECT_FALSE(test, false);
1167b339105SDaniel Latypov
1177b339105SDaniel Latypov /* Integer assertions */
1187b339105SDaniel Latypov KUNIT_EXPECT_EQ(test, 1, 1); /* check == */
1197b339105SDaniel Latypov KUNIT_EXPECT_GE(test, 1, 1); /* check >= */
1207b339105SDaniel Latypov KUNIT_EXPECT_LE(test, 1, 1); /* check <= */
1217b339105SDaniel Latypov KUNIT_EXPECT_NE(test, 1, 0); /* check != */
1227b339105SDaniel Latypov KUNIT_EXPECT_GT(test, 1, 0); /* check > */
1237b339105SDaniel Latypov KUNIT_EXPECT_LT(test, 0, 1); /* check < */
1247b339105SDaniel Latypov
1257b339105SDaniel Latypov /* Pointer assertions */
1267b339105SDaniel Latypov KUNIT_EXPECT_NOT_ERR_OR_NULL(test, test);
1277b339105SDaniel Latypov KUNIT_EXPECT_PTR_EQ(test, NULL, NULL);
1287b339105SDaniel Latypov KUNIT_EXPECT_PTR_NE(test, test, NULL);
129de82c15dSRicardo Ribalda KUNIT_EXPECT_NULL(test, NULL);
130de82c15dSRicardo Ribalda KUNIT_EXPECT_NOT_NULL(test, test);
1317b339105SDaniel Latypov
1327b339105SDaniel Latypov /* String assertions */
1337b339105SDaniel Latypov KUNIT_EXPECT_STREQ(test, "hi", "hi");
1347b339105SDaniel Latypov KUNIT_EXPECT_STRNEQ(test, "hi", "bye");
1357b339105SDaniel Latypov
1363b30fb62SMaíra Canal /* Memory block assertions */
1373b30fb62SMaíra Canal KUNIT_EXPECT_MEMEQ(test, array1, array1, sizeof(array1));
1383b30fb62SMaíra Canal KUNIT_EXPECT_MEMNEQ(test, array1, array2, sizeof(array1));
1393b30fb62SMaíra Canal
1407b339105SDaniel Latypov /*
1417b339105SDaniel Latypov * There are also ASSERT variants of all of the above that abort test
1427b339105SDaniel Latypov * execution if they fail. Useful for memory allocations, etc.
1437b339105SDaniel Latypov */
1447b339105SDaniel Latypov KUNIT_ASSERT_GT(test, sizeof(char), 0);
1457b339105SDaniel Latypov
1467b339105SDaniel Latypov /*
1477b339105SDaniel Latypov * There are also _MSG variants of all of the above that let you include
1487b339105SDaniel Latypov * additional text on failure.
1497b339105SDaniel Latypov */
1507b339105SDaniel Latypov KUNIT_EXPECT_GT_MSG(test, sizeof(int), 0, "Your ints are 0-bit?!");
1517b339105SDaniel Latypov KUNIT_ASSERT_GT_MSG(test, sizeof(int), 0, "Your ints are 0-bit?!");
1527b339105SDaniel Latypov }
1537b339105SDaniel Latypov
154e047c5eaSDavid Gow /* This is a function we'll replace with static stubs. */
add_one(int i)155e047c5eaSDavid Gow static int add_one(int i)
156e047c5eaSDavid Gow {
157e047c5eaSDavid Gow /* This will trigger the stub if active. */
158e047c5eaSDavid Gow KUNIT_STATIC_STUB_REDIRECT(add_one, i);
159e047c5eaSDavid Gow
160e047c5eaSDavid Gow return i + 1;
161e047c5eaSDavid Gow }
162e047c5eaSDavid Gow
163e047c5eaSDavid Gow /* This is used as a replacement for the above function. */
subtract_one(int i)164e047c5eaSDavid Gow static int subtract_one(int i)
165e047c5eaSDavid Gow {
166e047c5eaSDavid Gow /* We don't need to trigger the stub from the replacement. */
167e047c5eaSDavid Gow
168e047c5eaSDavid Gow return i - 1;
169e047c5eaSDavid Gow }
170e047c5eaSDavid Gow
171e047c5eaSDavid Gow /*
1725fb1a8c6SRichard Fitzgerald * If the function to be replaced is static within a module it is
1735fb1a8c6SRichard Fitzgerald * useful to export a pointer to that function instead of having
1745fb1a8c6SRichard Fitzgerald * to change the static function to a non-static exported function.
1755fb1a8c6SRichard Fitzgerald *
1765fb1a8c6SRichard Fitzgerald * This pointer simulates a module exporting a pointer to a static
1775fb1a8c6SRichard Fitzgerald * function.
1785fb1a8c6SRichard Fitzgerald */
1795fb1a8c6SRichard Fitzgerald static int (* const add_one_fn_ptr)(int i) = add_one;
1805fb1a8c6SRichard Fitzgerald
1815fb1a8c6SRichard Fitzgerald /*
182e047c5eaSDavid Gow * This test shows the use of static stubs.
183e047c5eaSDavid Gow */
example_static_stub_test(struct kunit * test)184e047c5eaSDavid Gow static void example_static_stub_test(struct kunit *test)
185e047c5eaSDavid Gow {
186e047c5eaSDavid Gow /* By default, function is not stubbed. */
187e047c5eaSDavid Gow KUNIT_EXPECT_EQ(test, add_one(1), 2);
188e047c5eaSDavid Gow
189e047c5eaSDavid Gow /* Replace add_one() with subtract_one(). */
190e047c5eaSDavid Gow kunit_activate_static_stub(test, add_one, subtract_one);
191e047c5eaSDavid Gow
192e047c5eaSDavid Gow /* add_one() is now replaced. */
193e047c5eaSDavid Gow KUNIT_EXPECT_EQ(test, add_one(1), 0);
194e047c5eaSDavid Gow
195e047c5eaSDavid Gow /* Return add_one() to normal. */
196e047c5eaSDavid Gow kunit_deactivate_static_stub(test, add_one);
197e047c5eaSDavid Gow KUNIT_EXPECT_EQ(test, add_one(1), 2);
198e047c5eaSDavid Gow }
199e047c5eaSDavid Gow
2005fb1a8c6SRichard Fitzgerald /*
2015fb1a8c6SRichard Fitzgerald * This test shows the use of static stubs when the function being
2025fb1a8c6SRichard Fitzgerald * replaced is provided as a pointer-to-function instead of the
2035fb1a8c6SRichard Fitzgerald * actual function. This is useful for providing access to static
2045fb1a8c6SRichard Fitzgerald * functions in a module by exporting a pointer to that function
2055fb1a8c6SRichard Fitzgerald * instead of having to change the static function to a non-static
2065fb1a8c6SRichard Fitzgerald * exported function.
2075fb1a8c6SRichard Fitzgerald */
example_static_stub_using_fn_ptr_test(struct kunit * test)2085fb1a8c6SRichard Fitzgerald static void example_static_stub_using_fn_ptr_test(struct kunit *test)
2095fb1a8c6SRichard Fitzgerald {
2105fb1a8c6SRichard Fitzgerald /* By default, function is not stubbed. */
2115fb1a8c6SRichard Fitzgerald KUNIT_EXPECT_EQ(test, add_one(1), 2);
2125fb1a8c6SRichard Fitzgerald
2135fb1a8c6SRichard Fitzgerald /* Replace add_one() with subtract_one(). */
2145fb1a8c6SRichard Fitzgerald kunit_activate_static_stub(test, add_one_fn_ptr, subtract_one);
2155fb1a8c6SRichard Fitzgerald
2165fb1a8c6SRichard Fitzgerald /* add_one() is now replaced. */
2175fb1a8c6SRichard Fitzgerald KUNIT_EXPECT_EQ(test, add_one(1), 0);
2185fb1a8c6SRichard Fitzgerald
2195fb1a8c6SRichard Fitzgerald /* Return add_one() to normal. */
2205fb1a8c6SRichard Fitzgerald kunit_deactivate_static_stub(test, add_one_fn_ptr);
2215fb1a8c6SRichard Fitzgerald KUNIT_EXPECT_EQ(test, add_one(1), 2);
2225fb1a8c6SRichard Fitzgerald }
2235fb1a8c6SRichard Fitzgerald
224d273b728SMichal Wajdeczko static const struct example_param {
225d273b728SMichal Wajdeczko int value;
226d273b728SMichal Wajdeczko } example_params_array[] = {
227ee5f8cc2SMichal Wajdeczko { .value = 3, },
228d273b728SMichal Wajdeczko { .value = 2, },
229d273b728SMichal Wajdeczko { .value = 1, },
230d273b728SMichal Wajdeczko { .value = 0, },
231d273b728SMichal Wajdeczko };
232d273b728SMichal Wajdeczko
example_param_get_desc(const struct example_param * p,char * desc)233d273b728SMichal Wajdeczko static void example_param_get_desc(const struct example_param *p, char *desc)
234d273b728SMichal Wajdeczko {
235d273b728SMichal Wajdeczko snprintf(desc, KUNIT_PARAM_DESC_SIZE, "example value %d", p->value);
236d273b728SMichal Wajdeczko }
237d273b728SMichal Wajdeczko
238d273b728SMichal Wajdeczko KUNIT_ARRAY_PARAM(example, example_params_array, example_param_get_desc);
239d273b728SMichal Wajdeczko
240d273b728SMichal Wajdeczko /*
241d273b728SMichal Wajdeczko * This test shows the use of params.
242d273b728SMichal Wajdeczko */
example_params_test(struct kunit * test)243d273b728SMichal Wajdeczko static void example_params_test(struct kunit *test)
244d273b728SMichal Wajdeczko {
245d273b728SMichal Wajdeczko const struct example_param *param = test->param_value;
246d273b728SMichal Wajdeczko
247d273b728SMichal Wajdeczko /* By design, param pointer will not be NULL */
248d273b728SMichal Wajdeczko KUNIT_ASSERT_NOT_NULL(test, param);
249d273b728SMichal Wajdeczko
250d273b728SMichal Wajdeczko /* Test can be skipped on unsupported param values */
251ee5f8cc2SMichal Wajdeczko if (!is_power_of_2(param->value))
252ee5f8cc2SMichal Wajdeczko kunit_skip(test, "unsupported param value %d", param->value);
253d273b728SMichal Wajdeczko
254d273b728SMichal Wajdeczko /* You can use param values for parameterized testing */
255d273b728SMichal Wajdeczko KUNIT_EXPECT_EQ(test, param->value % param->value, 0);
256d273b728SMichal Wajdeczko }
257d273b728SMichal Wajdeczko
258d99ea675SDavid Gow /*
2592b61582aSMichal Wajdeczko * This test shows the use of test->priv.
2602b61582aSMichal Wajdeczko */
example_priv_test(struct kunit * test)2612b61582aSMichal Wajdeczko static void example_priv_test(struct kunit *test)
2622b61582aSMichal Wajdeczko {
2632b61582aSMichal Wajdeczko /* unless setup in suite->init(), test->priv is NULL */
2642b61582aSMichal Wajdeczko KUNIT_ASSERT_NULL(test, test->priv);
2652b61582aSMichal Wajdeczko
2662b61582aSMichal Wajdeczko /* but can be used to pass arbitrary data to other functions */
2672b61582aSMichal Wajdeczko test->priv = kunit_kzalloc(test, 1, GFP_KERNEL);
2682b61582aSMichal Wajdeczko KUNIT_EXPECT_NOT_NULL(test, test->priv);
2692b61582aSMichal Wajdeczko KUNIT_ASSERT_PTR_EQ(test, test->priv, kunit_get_current_test()->priv);
2702b61582aSMichal Wajdeczko }
2712b61582aSMichal Wajdeczko
2722b61582aSMichal Wajdeczko /*
27302c2d0c2SRae Moar * This test should always pass. Can be used to practice filtering attributes.
27402c2d0c2SRae Moar */
example_slow_test(struct kunit * test)27502c2d0c2SRae Moar static void example_slow_test(struct kunit *test)
27602c2d0c2SRae Moar {
27702c2d0c2SRae Moar KUNIT_EXPECT_EQ(test, 1 + 1, 2);
27802c2d0c2SRae Moar }
27902c2d0c2SRae Moar
28002c2d0c2SRae Moar /*
281c475c77dSAlan Maguire * Here we make a list of all the test cases we want to add to the test suite
282c475c77dSAlan Maguire * below.
283c475c77dSAlan Maguire */
284c475c77dSAlan Maguire static struct kunit_case example_test_cases[] = {
285c475c77dSAlan Maguire /*
286c475c77dSAlan Maguire * This is a helper to create a test case object from a test case
287c475c77dSAlan Maguire * function; its exact function is not important to understand how to
288c475c77dSAlan Maguire * use KUnit, just know that this is how you associate test cases with a
289c475c77dSAlan Maguire * test suite.
290c475c77dSAlan Maguire */
291c475c77dSAlan Maguire KUNIT_CASE(example_simple_test),
292d99ea675SDavid Gow KUNIT_CASE(example_skip_test),
293d99ea675SDavid Gow KUNIT_CASE(example_mark_skipped_test),
2947b339105SDaniel Latypov KUNIT_CASE(example_all_expect_macros_test),
295e047c5eaSDavid Gow KUNIT_CASE(example_static_stub_test),
2965fb1a8c6SRichard Fitzgerald KUNIT_CASE(example_static_stub_using_fn_ptr_test),
2972b61582aSMichal Wajdeczko KUNIT_CASE(example_priv_test),
298d273b728SMichal Wajdeczko KUNIT_CASE_PARAM(example_params_test, example_gen_params),
29902c2d0c2SRae Moar KUNIT_CASE_SLOW(example_slow_test),
300c475c77dSAlan Maguire {}
301c475c77dSAlan Maguire };
302c475c77dSAlan Maguire
303c475c77dSAlan Maguire /*
304c475c77dSAlan Maguire * This defines a suite or grouping of tests.
305c475c77dSAlan Maguire *
306c475c77dSAlan Maguire * Test cases are defined as belonging to the suite by adding them to
307c475c77dSAlan Maguire * `kunit_cases`.
308c475c77dSAlan Maguire *
309c475c77dSAlan Maguire * Often it is desirable to run some function which will set up things which
310c475c77dSAlan Maguire * will be used by every test; this is accomplished with an `init` function
311c475c77dSAlan Maguire * which runs before each test case is invoked. Similarly, an `exit` function
312c475c77dSAlan Maguire * may be specified which runs after every test case and can be used to for
313c475c77dSAlan Maguire * cleanup. For clarity, running tests in a test suite would behave as follows:
314c475c77dSAlan Maguire *
3151cdba21dSDaniel Latypov * suite.suite_init(suite);
316c475c77dSAlan Maguire * suite.init(test);
317c475c77dSAlan Maguire * suite.test_case[0](test);
318c475c77dSAlan Maguire * suite.exit(test);
319c475c77dSAlan Maguire * suite.init(test);
320c475c77dSAlan Maguire * suite.test_case[1](test);
321c475c77dSAlan Maguire * suite.exit(test);
3221cdba21dSDaniel Latypov * suite.suite_exit(suite);
323c475c77dSAlan Maguire * ...;
324c475c77dSAlan Maguire */
325c475c77dSAlan Maguire static struct kunit_suite example_test_suite = {
326c475c77dSAlan Maguire .name = "example",
327c475c77dSAlan Maguire .init = example_test_init,
328a5ce66adSDavid Gow .exit = example_test_exit,
3291cdba21dSDaniel Latypov .suite_init = example_test_init_suite,
330a5ce66adSDavid Gow .suite_exit = example_test_exit_suite,
331c475c77dSAlan Maguire .test_cases = example_test_cases,
332c475c77dSAlan Maguire };
333c475c77dSAlan Maguire
334c475c77dSAlan Maguire /*
335c475c77dSAlan Maguire * This registers the above test suite telling KUnit that this is a suite of
336c475c77dSAlan Maguire * tests that need to be run.
337c475c77dSAlan Maguire */
338c475c77dSAlan Maguire kunit_test_suites(&example_test_suite);
339c475c77dSAlan Maguire
init_add(int x,int y)3402cf45281SRae Moar static int __init init_add(int x, int y)
3412cf45281SRae Moar {
3422cf45281SRae Moar return (x + y);
3432cf45281SRae Moar }
3442cf45281SRae Moar
3452cf45281SRae Moar /*
3462cf45281SRae Moar * This test should always pass. Can be used to test init suites.
3472cf45281SRae Moar */
example_init_test(struct kunit * test)3482cf45281SRae Moar static void __init example_init_test(struct kunit *test)
3492cf45281SRae Moar {
3502cf45281SRae Moar KUNIT_EXPECT_EQ(test, init_add(1, 1), 2);
3512cf45281SRae Moar }
3522cf45281SRae Moar
3532cf45281SRae Moar /*
3542cf45281SRae Moar * The kunit_case struct cannot be marked as __initdata as this will be
3552cf45281SRae Moar * used in debugfs to retrieve results after test has run
3562cf45281SRae Moar */
3572cf45281SRae Moar static struct kunit_case __refdata example_init_test_cases[] = {
3582cf45281SRae Moar KUNIT_CASE(example_init_test),
3592cf45281SRae Moar {}
3602cf45281SRae Moar };
3612cf45281SRae Moar
3622cf45281SRae Moar /*
3632cf45281SRae Moar * The kunit_suite struct cannot be marked as __initdata as this will be
3642cf45281SRae Moar * used in debugfs to retrieve results after test has run
3652cf45281SRae Moar */
3662cf45281SRae Moar static struct kunit_suite example_init_test_suite = {
3672cf45281SRae Moar .name = "example_init",
3682cf45281SRae Moar .test_cases = example_init_test_cases,
3692cf45281SRae Moar };
3702cf45281SRae Moar
3712cf45281SRae Moar /*
3722cf45281SRae Moar * This registers the test suite and marks the suite as using init data
3732cf45281SRae Moar * and/or functions.
3742cf45281SRae Moar */
3752cf45281SRae Moar kunit_test_init_section_suites(&example_init_test_suite);
3762cf45281SRae Moar
377*a5217468SJeff Johnson MODULE_DESCRIPTION("Example KUnit test suite");
378c475c77dSAlan Maguire MODULE_LICENSE("GPL v2");
379