lib/test: convert test_sort.c to use KUnit
authorDaniel Latypov <dlatypov@google.com>
Wed, 8 Sep 2021 02:58:48 +0000 (19:58 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Sep 2021 18:50:26 +0000 (11:50 -0700)
This follows up commit ebd09577be6c ("lib/test: convert
lib/test_list_sort.c to use KUnit").

Converting this test to KUnit makes the test a bit shorter, standardizes
how it reports pass/fail, and adds an easier way to run the test [1].

Like ebd09577be6c, this leaves the file and Kconfig option name the same,
but slightly changes their dependencies (needs CONFIG_KUNIT).

[1] Can be run via
$ ./tools/testing/kunit/kunit.py run --kunitconfig /dev/stdin <<EOF
CONFIG_KUNIT=y
CONFIG_TEST_SORT=y
EOF

[11:30:27] Starting KUnit Kernel ...
[11:30:30] ============================================================
[11:30:30] ======== [PASSED] lib_sort ========
[11:30:30] [PASSED] test_sort
[11:30:30] ============================================================
[11:30:30] Testing complete. 1 tests run. 0 failed. 0 crashed. 0 skipped.
[11:30:30] Elapsed time: 37.032s total, 0.001s configuring, 34.090s building, 0.000s running

Note: this is the time it took after a `make mrproper`.

With an incremental rebuild, this looks more like:
[11:38:58] Elapsed time: 6.444s total, 0.001s configuring, 3.416s building, 0.000s running

Since the test has no dependencies, it can also be run (with some other
tests) with just:
$ ./tools/testing/kunit/kunit.py run

Link: https://lkml.kernel.org/r/20210715232441.1380885-1-dlatypov@google.com
Signed-off-by: Daniel Latypov <dlatypov@google.com>
Cc: Pravin Shedge <pravin.shedge4linux@gmail.com>
Cc: Brendan Higgins <brendanhiggins@google.com>
Cc: David Gow <davidgow@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/Kconfig.debug
lib/test_sort.c

index 021bc9c..84e0500 100644 (file)
@@ -2078,8 +2078,9 @@ config TEST_MIN_HEAP
          If unsure, say N.
 
 config TEST_SORT
          If unsure, say N.
 
 config TEST_SORT
-       tristate "Array-based sort test"
-       depends on DEBUG_KERNEL || m
+       tristate "Array-based sort test" if !KUNIT_ALL_TESTS
+       depends on KUNIT
+       default KUNIT_ALL_TESTS
        help
          This option enables the self-test function of 'sort()' at boot,
          or at module load time.
        help
          This option enables the self-test function of 'sort()' at boot,
          or at module load time.
index 52edbe1..be02e3a 100644 (file)
@@ -1,4 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 // SPDX-License-Identifier: GPL-2.0-only
+
+#include <kunit/test.h>
+
 #include <linux/sort.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/sort.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 
 #define TEST_LEN 1000
 
 
 #define TEST_LEN 1000
 
-static int __init cmpint(const void *a, const void *b)
+static int cmpint(const void *a, const void *b)
 {
        return *(int *)a - *(int *)b;
 }
 
 {
        return *(int *)a - *(int *)b;
 }
 
-static int __init test_sort_init(void)
+static void test_sort(struct kunit *test)
 {
 {
-       int *a, i, r = 1, err = -ENOMEM;
+       int *a, i, r = 1;
 
 
-       a = kmalloc_array(TEST_LEN, sizeof(*a), GFP_KERNEL);
-       if (!a)
-               return err;
+       a = kunit_kmalloc_array(test, TEST_LEN, sizeof(*a), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, a);
 
        for (i = 0; i < TEST_LEN; i++) {
                r = (r * 725861) % 6599;
 
        for (i = 0; i < TEST_LEN; i++) {
                r = (r * 725861) % 6599;
@@ -27,24 +29,20 @@ static int __init test_sort_init(void)
 
        sort(a, TEST_LEN, sizeof(*a), cmpint, NULL);
 
 
        sort(a, TEST_LEN, sizeof(*a), cmpint, NULL);
 
-       err = -EINVAL;
        for (i = 0; i < TEST_LEN-1; i++)
        for (i = 0; i < TEST_LEN-1; i++)
-               if (a[i] > a[i+1]) {
-                       pr_err("test has failed\n");
-                       goto exit;
-               }
-       err = 0;
-       pr_info("test passed\n");
-exit:
-       kfree(a);
-       return err;
+               KUNIT_ASSERT_LE(test, a[i], a[i + 1]);
 }
 
 }
 
-static void __exit test_sort_exit(void)
-{
-}
+static struct kunit_case sort_test_cases[] = {
+       KUNIT_CASE(test_sort),
+       {}
+};
+
+static struct kunit_suite sort_test_suite = {
+       .name = "lib_sort",
+       .test_cases = sort_test_cases,
+};
 
 
-module_init(test_sort_init);
-module_exit(test_sort_exit);
+kunit_test_suites(&sort_test_suite);
 
 MODULE_LICENSE("GPL");
 
 MODULE_LICENSE("GPL");