History

lib/tests: convert test_min_heap module to KUnit

Move lib/test_min_heap.c to lib/tests/min_heap_kunit.c and convert it to use KUnit. This change switches the ad-hoc test code to standard KUnit test cases. The test data remains the same, but the verification logic is updated to use KUNIT_EXPECT_* macros. Also remove CONFIG_TEST_MIN_HEAP from arch/*/configs/* because it is no longer used. The new CONFIG_MIN_HEAP_KUNIT_TEST will be automatically enabled by CONFIG_KUNIT_ALL_TESTS. The reasons for converting to KUnit are: 1. Standardization: Switching from ad-hoc printk-based reporting to the standard KTAP format makes it easier for CI systems to parse and report test results 2. Better Diagnostics: Using KUNIT_EXPECT_* macros automatically provides detailed diagnostics on failure. 3. Tooling Integration: It allows the test to be managed and executed using standard KUnit tools.

Ryota Sakamoto committed 10 months ago

Commit d30aca31 parent 0e7fd2319 files · +81 −106Browse files

Unified · Split

19 files
  1. MAINTAINERS +1 −1
  2. arch/m68k/configs/amiga_defconfig +0 −1
  3. arch/m68k/configs/apollo_defconfig +0 −1
  4. arch/m68k/configs/atari_defconfig +0 −1
  5. arch/m68k/configs/bvme6000_defconfig +0 −1
  6. arch/m68k/configs/hp300_defconfig +0 −1
  7. arch/m68k/configs/mac_defconfig +0 −1
  8. arch/m68k/configs/multi_defconfig +0 −1
  9. arch/m68k/configs/mvme147_defconfig +0 −1
  10. arch/m68k/configs/mvme16x_defconfig +0 −1
  11. arch/m68k/configs/q40_defconfig +0 −1
  12. arch/m68k/configs/sun3_defconfig +0 −1
  13. arch/m68k/configs/sun3x_defconfig +0 −1
  14. arch/powerpc/configs/ppc64_defconfig +0 −1
  15. arch/s390/configs/debug_defconfig +1 −1
  16. lib/Kconfig.debug +11 −10
  17. lib/Makefile +0 −1
  18. lib/tests/Makefile +1 −0
  19. lib/tests/min_heap_kunit.c +67 −80
MAINTAINERS+1−1
@@ -17456,7 +17456,7 @@ S: Maintained · 17455 unmodified lines
17456F: Documentation/core-api/min_heap.rst17456F: Documentation/core-api/min_heap.rst
17457F: include/linux/min_heap.h17457F: include/linux/min_heap.h
17458F: lib/min_heap.c17458F: lib/min_heap.c
17459F: lib/test_min_heap.c17459F: lib/tests/min_heap_kunit.c
17460 17460
17461MIPI CCS, SMIA AND SMIA++ IMAGE SENSOR DRIVER17461MIPI CCS, SMIA AND SMIA++ IMAGE SENSOR DRIVER
17462M: Sakari Ailus <sakari.ailus@linux.intel.com>17462M: Sakari Ailus <sakari.ailus@linux.intel.com>
arch/m68k/configs/amiga_defconfig+0−1
@@ -609,7 +609,6 @@ CONFIG_EARLY_PRINTK=y · 608 unmodified lines
609CONFIG_KUNIT=m609CONFIG_KUNIT=m
610CONFIG_KUNIT_ALL_TESTS=m610CONFIG_KUNIT_ALL_TESTS=m
611CONFIG_TEST_DHRY=m611CONFIG_TEST_DHRY=m
612CONFIG_TEST_MIN_HEAP=m
613CONFIG_TEST_DIV64=m612CONFIG_TEST_DIV64=m
614CONFIG_TEST_MULDIV64=m613CONFIG_TEST_MULDIV64=m
615CONFIG_REED_SOLOMON_TEST=m614CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/apollo_defconfig+0−1
@@ -566,7 +566,6 @@ CONFIG_EARLY_PRINTK=y · 565 unmodified lines
566CONFIG_KUNIT=m566CONFIG_KUNIT=m
567CONFIG_KUNIT_ALL_TESTS=m567CONFIG_KUNIT_ALL_TESTS=m
568CONFIG_TEST_DHRY=m568CONFIG_TEST_DHRY=m
569CONFIG_TEST_MIN_HEAP=m
570CONFIG_TEST_DIV64=m569CONFIG_TEST_DIV64=m
571CONFIG_TEST_MULDIV64=m570CONFIG_TEST_MULDIV64=m
572CONFIG_REED_SOLOMON_TEST=m571CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/atari_defconfig+0−1
@@ -586,7 +586,6 @@ CONFIG_EARLY_PRINTK=y · 585 unmodified lines
586CONFIG_KUNIT=m586CONFIG_KUNIT=m
587CONFIG_KUNIT_ALL_TESTS=m587CONFIG_KUNIT_ALL_TESTS=m
588CONFIG_TEST_DHRY=m588CONFIG_TEST_DHRY=m
589CONFIG_TEST_MIN_HEAP=m
590CONFIG_TEST_DIV64=m589CONFIG_TEST_DIV64=m
591CONFIG_TEST_MULDIV64=m590CONFIG_TEST_MULDIV64=m
592CONFIG_REED_SOLOMON_TEST=m591CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/bvme6000_defconfig+0−1
@@ -558,7 +558,6 @@ CONFIG_EARLY_PRINTK=y · 557 unmodified lines
558CONFIG_KUNIT=m558CONFIG_KUNIT=m
559CONFIG_KUNIT_ALL_TESTS=m559CONFIG_KUNIT_ALL_TESTS=m
560CONFIG_TEST_DHRY=m560CONFIG_TEST_DHRY=m
561CONFIG_TEST_MIN_HEAP=m
562CONFIG_TEST_DIV64=m561CONFIG_TEST_DIV64=m
563CONFIG_TEST_MULDIV64=m562CONFIG_TEST_MULDIV64=m
564CONFIG_REED_SOLOMON_TEST=m563CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/hp300_defconfig+0−1
@@ -568,7 +568,6 @@ CONFIG_EARLY_PRINTK=y · 567 unmodified lines
568CONFIG_KUNIT=m568CONFIG_KUNIT=m
569CONFIG_KUNIT_ALL_TESTS=m569CONFIG_KUNIT_ALL_TESTS=m
570CONFIG_TEST_DHRY=m570CONFIG_TEST_DHRY=m
571CONFIG_TEST_MIN_HEAP=m
572CONFIG_TEST_DIV64=m571CONFIG_TEST_DIV64=m
573CONFIG_TEST_MULDIV64=m572CONFIG_TEST_MULDIV64=m
574CONFIG_REED_SOLOMON_TEST=m573CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/mac_defconfig+0−1
@@ -585,7 +585,6 @@ CONFIG_EARLY_PRINTK=y · 584 unmodified lines
585CONFIG_KUNIT=m585CONFIG_KUNIT=m
586CONFIG_KUNIT_ALL_TESTS=m586CONFIG_KUNIT_ALL_TESTS=m
587CONFIG_TEST_DHRY=m587CONFIG_TEST_DHRY=m
588CONFIG_TEST_MIN_HEAP=m
589CONFIG_TEST_DIV64=m588CONFIG_TEST_DIV64=m
590CONFIG_TEST_MULDIV64=m589CONFIG_TEST_MULDIV64=m
591CONFIG_REED_SOLOMON_TEST=m590CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/multi_defconfig+0−1
@@ -672,7 +672,6 @@ CONFIG_EARLY_PRINTK=y · 671 unmodified lines
672CONFIG_KUNIT=m672CONFIG_KUNIT=m
673CONFIG_KUNIT_ALL_TESTS=m673CONFIG_KUNIT_ALL_TESTS=m
674CONFIG_TEST_DHRY=m674CONFIG_TEST_DHRY=m
675CONFIG_TEST_MIN_HEAP=m
676CONFIG_TEST_DIV64=m675CONFIG_TEST_DIV64=m
677CONFIG_TEST_MULDIV64=m676CONFIG_TEST_MULDIV64=m
678CONFIG_REED_SOLOMON_TEST=m677CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/mvme147_defconfig+0−1
@@ -558,7 +558,6 @@ CONFIG_EARLY_PRINTK=y · 557 unmodified lines
558CONFIG_KUNIT=m558CONFIG_KUNIT=m
559CONFIG_KUNIT_ALL_TESTS=m559CONFIG_KUNIT_ALL_TESTS=m
560CONFIG_TEST_DHRY=m560CONFIG_TEST_DHRY=m
561CONFIG_TEST_MIN_HEAP=m
562CONFIG_TEST_DIV64=m561CONFIG_TEST_DIV64=m
563CONFIG_TEST_MULDIV64=m562CONFIG_TEST_MULDIV64=m
564CONFIG_REED_SOLOMON_TEST=m563CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/mvme16x_defconfig+0−1
@@ -559,7 +559,6 @@ CONFIG_EARLY_PRINTK=y · 558 unmodified lines
559CONFIG_KUNIT=m559CONFIG_KUNIT=m
560CONFIG_KUNIT_ALL_TESTS=m560CONFIG_KUNIT_ALL_TESTS=m
561CONFIG_TEST_DHRY=m561CONFIG_TEST_DHRY=m
562CONFIG_TEST_MIN_HEAP=m
563CONFIG_TEST_DIV64=m562CONFIG_TEST_DIV64=m
564CONFIG_TEST_MULDIV64=m563CONFIG_TEST_MULDIV64=m
565CONFIG_REED_SOLOMON_TEST=m564CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/q40_defconfig+0−1
@@ -575,7 +575,6 @@ CONFIG_EARLY_PRINTK=y · 574 unmodified lines
575CONFIG_KUNIT=m575CONFIG_KUNIT=m
576CONFIG_KUNIT_ALL_TESTS=m576CONFIG_KUNIT_ALL_TESTS=m
577CONFIG_TEST_DHRY=m577CONFIG_TEST_DHRY=m
578CONFIG_TEST_MIN_HEAP=m
579CONFIG_TEST_DIV64=m578CONFIG_TEST_DIV64=m
580CONFIG_TEST_MULDIV64=m579CONFIG_TEST_MULDIV64=m
581CONFIG_REED_SOLOMON_TEST=m580CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/sun3_defconfig+0−1
@@ -555,7 +555,6 @@ CONFIG_WW_MUTEX_SELFTEST=m · 554 unmodified lines
555CONFIG_KUNIT=m555CONFIG_KUNIT=m
556CONFIG_KUNIT_ALL_TESTS=m556CONFIG_KUNIT_ALL_TESTS=m
557CONFIG_TEST_DHRY=m557CONFIG_TEST_DHRY=m
558CONFIG_TEST_MIN_HEAP=m
559CONFIG_TEST_DIV64=m558CONFIG_TEST_DIV64=m
560CONFIG_TEST_MULDIV64=m559CONFIG_TEST_MULDIV64=m
561CONFIG_REED_SOLOMON_TEST=m560CONFIG_REED_SOLOMON_TEST=m
arch/m68k/configs/sun3x_defconfig+0−1
@@ -556,7 +556,6 @@ CONFIG_EARLY_PRINTK=y · 555 unmodified lines
556CONFIG_KUNIT=m556CONFIG_KUNIT=m
557CONFIG_KUNIT_ALL_TESTS=m557CONFIG_KUNIT_ALL_TESTS=m
558CONFIG_TEST_DHRY=m558CONFIG_TEST_DHRY=m
559CONFIG_TEST_MIN_HEAP=m
560CONFIG_TEST_DIV64=m559CONFIG_TEST_DIV64=m
561CONFIG_TEST_MULDIV64=m560CONFIG_TEST_MULDIV64=m
562CONFIG_REED_SOLOMON_TEST=m561CONFIG_REED_SOLOMON_TEST=m
arch/powerpc/configs/ppc64_defconfig+0−1
@@ -426,7 +426,6 @@ CONFIG_BOOTX_TEXT=y · 425 unmodified lines
426CONFIG_KUNIT=m426CONFIG_KUNIT=m
427CONFIG_KUNIT_ALL_TESTS=m427CONFIG_KUNIT_ALL_TESTS=m
428CONFIG_LKDTM=m428CONFIG_LKDTM=m
429CONFIG_TEST_MIN_HEAP=m
430CONFIG_TEST_DIV64=m429CONFIG_TEST_DIV64=m
431CONFIG_BACKTRACE_SELF_TEST=m430CONFIG_BACKTRACE_SELF_TEST=m
432CONFIG_TEST_REF_TRACKER=m431CONFIG_TEST_REF_TRACKER=m
arch/s390/configs/debug_defconfig+1−1
@@ -921,7 +921,7 @@ CONFIG_FAULT_INJECTION_DEBUG_FS=y · 920 unmodified lines
921CONFIG_FAULT_INJECTION_CONFIGFS=y921CONFIG_FAULT_INJECTION_CONFIGFS=y
922CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y922CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
923CONFIG_LKDTM=m923CONFIG_LKDTM=m
924CONFIG_TEST_MIN_HEAP=y924CONFIG_MIN_HEAP_KUNIT_TEST=m
925CONFIG_KPROBES_SANITY_TEST=m925CONFIG_KPROBES_SANITY_TEST=m
926CONFIG_RBTREE_TEST=y926CONFIG_RBTREE_TEST=y
927CONFIG_INTERVAL_TREE_TEST=m927CONFIG_INTERVAL_TREE_TEST=m
lib/Kconfig.debug+11−10
@@ -2278,16 +2278,6 @@ config TEST_LIST_SORT · 2277 unmodified lines
2278 2278
2279 If unsure, say N.2279 If unsure, say N.
2280 2280
2281config TEST_MIN_HEAP
2282 tristate "Min heap test"
2283 depends on DEBUG_KERNEL || m
2284 help
2285 Enable this to turn on min heap function tests. This test is
2286 executed only once during system boot (so affects only boot time),
2287 or at module load time.
2288
2289 If unsure, say N.
2290
2291config TEST_SORT2281config TEST_SORT
2292 tristate "Array-based sort test" if !KUNIT_ALL_TESTS2282 tristate "Array-based sort test" if !KUNIT_ALL_TESTS
2293 depends on KUNIT2283 depends on KUNIT
@@ -2878,6 +2868,17 @@ config MEMCPY_KUNIT_TEST · 584 unmodified lines
2878 2868
2879 If unsure, say N.2869 If unsure, say N.
2880 2870
2871config MIN_HEAP_KUNIT_TEST
2872 tristate "Min heap test" if !KUNIT_ALL_TESTS
2873 depends on KUNIT
2874 default KUNIT_ALL_TESTS
2875 help
2876 This option enables the KUnit test suite for the min heap library
2877 which provides functions for creating and managing min heaps.
2878 The test suite checks the functionality of the min heap library.
2879
2880 If unsure, say N
2881
2881config IS_SIGNED_TYPE_KUNIT_TEST2882config IS_SIGNED_TYPE_KUNIT_TEST
2882 tristate "Test is_signed_type() macro" if !KUNIT_ALL_TESTS2883 tristate "Test is_signed_type() macro" if !KUNIT_ALL_TESTS
2883 depends on KUNIT2884 depends on KUNIT
lib/Makefile+0−1
@@ -75,7 +75,6 @@ obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o · 74 unmodified lines
75CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable)75CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable)
76UBSAN_SANITIZE_test_ubsan.o := y76UBSAN_SANITIZE_test_ubsan.o := y
77obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o77obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o
78obj-$(CONFIG_TEST_MIN_HEAP) += test_min_heap.o
79obj-$(CONFIG_TEST_LKM) += test_module.o78obj-$(CONFIG_TEST_LKM) += test_module.o
80obj-$(CONFIG_TEST_VMALLOC) += test_vmalloc.o79obj-$(CONFIG_TEST_VMALLOC) += test_vmalloc.o
81obj-$(CONFIG_TEST_RHASHTABLE) += test_rhashtable.o80obj-$(CONFIG_TEST_RHASHTABLE) += test_rhashtable.o
lib/tests/Makefile+1−0
@@ -33,6 +33,7 @@ CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes) · 32 unmodified lines
33obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o33obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o
34 34
35obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_kunit.o35obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_kunit.o
36obj-$(CONFIG_MIN_HEAP_KUNIT_TEST) += min_heap_kunit.o
36CFLAGS_overflow_kunit.o = $(call cc-disable-warning, tautological-constant-out-of-range-compare)37CFLAGS_overflow_kunit.o = $(call cc-disable-warning, tautological-constant-out-of-range-compare)
37obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o38obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o
38obj-$(CONFIG_PRINTF_KUNIT_TEST) += printf_kunit.o39obj-$(CONFIG_PRINTF_KUNIT_TEST) += printf_kunit.o
lib/tests/min_heap_kunit.crenamed from lib/test_min_heap.c+67−80
@@ -1,60 +1,66 @@
1// SPDX-License-Identifier: GPL-2.0-only1// SPDX-License-Identifier: GPL-2.0-only
2#define pr_fmt(fmt) "min_heap_test: " fmt
3
4/*2/*
5 * Test cases for the min max heap.3 * Test cases for the min max heap.
6 */4 */
7 5
8#include <linux/log2.h>6#include <kunit/test.h>
9#include <linux/min_heap.h>7#include <linux/min_heap.h>
10#include <linux/module.h>8#include <linux/module.h>
11#include <linux/printk.h>
12#include <linux/random.h>9#include <linux/random.h>
13 10
11struct min_heap_test_case {
12 const char *str;
13 bool min_heap;
14};
15
16static struct min_heap_test_case min_heap_cases[] = {
17 {
18 .str = "min",
19 .min_heap = true,
20 },
21 {
22 .str = "max",
23 .min_heap = false,
24 },
25};
26
27KUNIT_ARRAY_PARAM_DESC(min_heap, min_heap_cases, str);
28
14DEFINE_MIN_HEAP(int, min_heap_test);29DEFINE_MIN_HEAP(int, min_heap_test);
15 30
16static __init bool less_than(const void *lhs, const void *rhs, void __always_unused *args)31static bool less_than(const void *lhs, const void *rhs, void __always_unused *args)
17{32{
18 return *(int *)lhs < *(int *)rhs;33 return *(int *)lhs < *(int *)rhs;
19}34}
20 35
21static __init bool greater_than(const void *lhs, const void *rhs, void __always_unused *args)36static bool greater_than(const void *lhs, const void *rhs, void __always_unused *args)
22{37{
23 return *(int *)lhs > *(int *)rhs;38 return *(int *)lhs > *(int *)rhs;
24}39}
25 40
26static __init int pop_verify_heap(bool min_heap,41static void pop_verify_heap(struct kunit *test,
27 struct min_heap_test *heap,42 bool min_heap,
28 const struct min_heap_callbacks *funcs)43 struct min_heap_test *heap,
44 const struct min_heap_callbacks *funcs)
29{45{
30 int *values = heap->data;46 int *values = heap->data;
31 int err = 0;
32 int last;47 int last;
33 48
34 last = values[0];49 last = values[0];
35 min_heap_pop_inline(heap, funcs, NULL);50 min_heap_pop_inline(heap, funcs, NULL);
36 while (heap->nr > 0) {51 while (heap->nr > 0) {
37 if (min_heap) {52 if (min_heap)
38 if (last > values[0]) {53 KUNIT_EXPECT_LE(test, last, values[0]);
39 pr_err("error: expected %d <= %d\n", last,54 else
40 values[0]);55 KUNIT_EXPECT_GE(test, last, values[0]);
41 err++;
42 }
43 } else {
44 if (last < values[0]) {
45 pr_err("error: expected %d >= %d\n", last,
46 values[0]);
47 err++;
48 }
49 }
50 last = values[0];56 last = values[0];
51 min_heap_pop_inline(heap, funcs, NULL);57 min_heap_pop_inline(heap, funcs, NULL);
52 }58 }
53 return err;
54}59}
55 60
56static __init int test_heapify_all(bool min_heap)61static void test_heapify_all(struct kunit *test)
57{62{
63 const struct min_heap_test_case *params = test->param_value;
58 int values[] = { 3, 1, 2, 4, 0x8000000, 0x7FFFFFF, 0,64 int values[] = { 3, 1, 2, 4, 0x8000000, 0x7FFFFFF, 0,
59 -3, -1, -2, -4, 0x8000000, 0x7FFFFFF };65 -3, -1, -2, -4, 0x8000000, 0x7FFFFFF };
60 struct min_heap_test heap = {66 struct min_heap_test heap = {
@@ -63,15 +69,14 @@ static __init int test_heapify_all(bool min_heap) · 2 unmodified lines
63 .size = ARRAY_SIZE(values),69 .size = ARRAY_SIZE(values),
64 };70 };
65 struct min_heap_callbacks funcs = {71 struct min_heap_callbacks funcs = {
66 .less = min_heap ? less_than : greater_than,72 .less = params->min_heap ? less_than : greater_than,
67 .swp = NULL,73 .swp = NULL,
68 };74 };
69 int i, err;75 int i;
70 76
71 /* Test with known set of values. */77 /* Test with known set of values. */
72 min_heapify_all_inline(&heap, &funcs, NULL);78 min_heapify_all_inline(&heap, &funcs, NULL);
73 err = pop_verify_heap(min_heap, &heap, &funcs);79 pop_verify_heap(test, params->min_heap, &heap, &funcs);
74
75 80
76 /* Test with randomly generated values. */81 /* Test with randomly generated values. */
77 heap.nr = ARRAY_SIZE(values);82 heap.nr = ARRAY_SIZE(values);
@@ -79,13 +84,12 @@ static __init int test_heapify_all(bool min_heap) · 1 unmodified line
79 values[i] = get_random_u32();84 values[i] = get_random_u32();
80 85
81 min_heapify_all_inline(&heap, &funcs, NULL);86 min_heapify_all_inline(&heap, &funcs, NULL);
82 err += pop_verify_heap(min_heap, &heap, &funcs);87 pop_verify_heap(test, params->min_heap, &heap, &funcs);
83
84 return err;
85}88}
86 89
87static __init int test_heap_push(bool min_heap)90static void test_heap_push(struct kunit *test)
88{91{
92 const struct min_heap_test_case *params = test->param_value;
89 const int data[] = { 3, 1, 2, 4, 0x80000000, 0x7FFFFFFF, 0,93 const int data[] = { 3, 1, 2, 4, 0x80000000, 0x7FFFFFFF, 0,
90 -3, -1, -2, -4, 0x80000000, 0x7FFFFFFF };94 -3, -1, -2, -4, 0x80000000, 0x7FFFFFFF };
91 int values[ARRAY_SIZE(data)];95 int values[ARRAY_SIZE(data)];
@@ -95,29 +99,28 @@ static __init int test_heap_push(bool min_heap) · 3 unmodified lines
95 .size = ARRAY_SIZE(values),99 .size = ARRAY_SIZE(values),
96 };100 };
97 struct min_heap_callbacks funcs = {101 struct min_heap_callbacks funcs = {
98 .less = min_heap ? less_than : greater_than,102 .less = params->min_heap ? less_than : greater_than,
99 .swp = NULL,103 .swp = NULL,
100 };104 };
101 int i, temp, err;105 int i, temp;
102 106
103 /* Test with known set of values copied from data. */107 /* Test with known set of values copied from data. */
104 for (i = 0; i < ARRAY_SIZE(data); i++)108 for (i = 0; i < ARRAY_SIZE(data); i++)
105 min_heap_push_inline(&heap, &data[i], &funcs, NULL);109 min_heap_push_inline(&heap, &data[i], &funcs, NULL);
106 110
107 err = pop_verify_heap(min_heap, &heap, &funcs);111 pop_verify_heap(test, params->min_heap, &heap, &funcs);
108 112
109 /* Test with randomly generated values. */113 /* Test with randomly generated values. */
110 while (heap.nr < heap.size) {114 while (heap.nr < heap.size) {
111 temp = get_random_u32();115 temp = get_random_u32();
112 min_heap_push_inline(&heap, &temp, &funcs, NULL);116 min_heap_push_inline(&heap, &temp, &funcs, NULL);
113 }117 }
114 err += pop_verify_heap(min_heap, &heap, &funcs);118 pop_verify_heap(test, params->min_heap, &heap, &funcs);
115
116 return err;
117}119}
118 120
119static __init int test_heap_pop_push(bool min_heap)121static void test_heap_pop_push(struct kunit *test)
120{122{
123 const struct min_heap_test_case *params = test->param_value;
121 const int data[] = { 3, 1, 2, 4, 0x80000000, 0x7FFFFFFF, 0,124 const int data[] = { 3, 1, 2, 4, 0x80000000, 0x7FFFFFFF, 0,
122 -3, -1, -2, -4, 0x80000000, 0x7FFFFFFF };125 -3, -1, -2, -4, 0x80000000, 0x7FFFFFFF };
123 int values[ARRAY_SIZE(data)];126 int values[ARRAY_SIZE(data)];
@@ -127,13 +130,13 @@ static __init int test_heap_pop_push(bool min_heap) · 3 unmodified lines
127 .size = ARRAY_SIZE(values),130 .size = ARRAY_SIZE(values),
128 };131 };
129 struct min_heap_callbacks funcs = {132 struct min_heap_callbacks funcs = {
130 .less = min_heap ? less_than : greater_than,133 .less = params->min_heap ? less_than : greater_than,
131 .swp = NULL,134 .swp = NULL,
132 };135 };
133 int i, temp, err;136 int i, temp;
134 137
135 /* Fill values with data to pop and replace. */138 /* Fill values with data to pop and replace. */
136 temp = min_heap ? 0x80000000 : 0x7FFFFFFF;139 temp = params->min_heap ? 0x80000000 : 0x7FFFFFFF;
137 for (i = 0; i < ARRAY_SIZE(data); i++)140 for (i = 0; i < ARRAY_SIZE(data); i++)
138 min_heap_push_inline(&heap, &temp, &funcs, NULL);141 min_heap_push_inline(&heap, &temp, &funcs, NULL);
139 142
@@ -141,7 +144,7 @@ static __init int test_heap_pop_push(bool min_heap) · 1 unmodified line
141 for (i = 0; i < ARRAY_SIZE(data); i++)144 for (i = 0; i < ARRAY_SIZE(data); i++)
142 min_heap_pop_push_inline(&heap, &data[i], &funcs, NULL);145 min_heap_pop_push_inline(&heap, &data[i], &funcs, NULL);
143 146
144 err = pop_verify_heap(min_heap, &heap, &funcs);147 pop_verify_heap(test, params->min_heap, &heap, &funcs);
145 148
146 heap.nr = 0;149 heap.nr = 0;
147 for (i = 0; i < ARRAY_SIZE(data); i++)150 for (i = 0; i < ARRAY_SIZE(data); i++)
@@ -152,13 +155,12 @@ static __init int test_heap_pop_push(bool min_heap) · 4 unmodified lines
152 temp = get_random_u32();155 temp = get_random_u32();
153 min_heap_pop_push_inline(&heap, &temp, &funcs, NULL);156 min_heap_pop_push_inline(&heap, &temp, &funcs, NULL);
154 }157 }
155 err += pop_verify_heap(min_heap, &heap, &funcs);158 pop_verify_heap(test, params->min_heap, &heap, &funcs);
156
157 return err;
158}159}
159 160
160static __init int test_heap_del(bool min_heap)161static void test_heap_del(struct kunit *test)
161{162{
163 const struct min_heap_test_case *params = test->param_value;
162 int values[] = { 3, 1, 2, 4, 0x8000000, 0x7FFFFFF, 0,164 int values[] = { 3, 1, 2, 4, 0x8000000, 0x7FFFFFF, 0,
163 -3, -1, -2, -4, 0x8000000, 0x7FFFFFF };165 -3, -1, -2, -4, 0x8000000, 0x7FFFFFF };
164 struct min_heap_test heap;166 struct min_heap_test heap;
@@ -166,17 +168,16 @@ static __init int test_heap_del(bool min_heap) · 1 unmodified line
166 min_heap_init_inline(&heap, values, ARRAY_SIZE(values));168 min_heap_init_inline(&heap, values, ARRAY_SIZE(values));
167 heap.nr = ARRAY_SIZE(values);169 heap.nr = ARRAY_SIZE(values);
168 struct min_heap_callbacks funcs = {170 struct min_heap_callbacks funcs = {
169 .less = min_heap ? less_than : greater_than,171 .less = params->min_heap ? less_than : greater_than,
170 .swp = NULL,172 .swp = NULL,
171 };173 };
172 int i, err;174 int i;
173 175
174 /* Test with known set of values. */176 /* Test with known set of values. */
175 min_heapify_all_inline(&heap, &funcs, NULL);177 min_heapify_all_inline(&heap, &funcs, NULL);
176 for (i = 0; i < ARRAY_SIZE(values) / 2; i++)178 for (i = 0; i < ARRAY_SIZE(values) / 2; i++)
177 min_heap_del_inline(&heap, get_random_u32() % heap.nr, &funcs, NULL);179 min_heap_del_inline(&heap, get_random_u32() % heap.nr, &funcs, NULL);
178 err = pop_verify_heap(min_heap, &heap, &funcs);180 pop_verify_heap(test, params->min_heap, &heap, &funcs);
179
180 181
181 /* Test with randomly generated values. */182 /* Test with randomly generated values. */
182 heap.nr = ARRAY_SIZE(values);183 heap.nr = ARRAY_SIZE(values);
@@ -186,37 +187,23 @@ static __init int test_heap_del(bool min_heap) · 3 unmodified lines
186 187
187 for (i = 0; i < ARRAY_SIZE(values) / 2; i++)188 for (i = 0; i < ARRAY_SIZE(values) / 2; i++)
188 min_heap_del_inline(&heap, get_random_u32() % heap.nr, &funcs, NULL);189 min_heap_del_inline(&heap, get_random_u32() % heap.nr, &funcs, NULL);
189 err += pop_verify_heap(min_heap, &heap, &funcs);190 pop_verify_heap(test, params->min_heap, &heap, &funcs);
190
191 return err;
192}191}
193 192
194static int __init test_min_heap_init(void)193static struct kunit_case min_heap_test_cases[] = {
195{194 KUNIT_CASE_PARAM(test_heapify_all, min_heap_gen_params),
196 int err = 0;195 KUNIT_CASE_PARAM(test_heap_push, min_heap_gen_params),
197 196 KUNIT_CASE_PARAM(test_heap_pop_push, min_heap_gen_params),
198 err += test_heapify_all(true);197 KUNIT_CASE_PARAM(test_heap_del, min_heap_gen_params),
199 err += test_heapify_all(false);198 {},
200 err += test_heap_push(true);199};
201 err += test_heap_push(false);
202 err += test_heap_pop_push(true);
203 err += test_heap_pop_push(false);
204 err += test_heap_del(true);
205 err += test_heap_del(false);
206 if (err) {
207 pr_err("test failed with %d errors\n", err);
208 return -EINVAL;
209 }
210 pr_info("test passed\n");
211 return 0;
212}
213module_init(test_min_heap_init);
214 200
215static void __exit test_min_heap_exit(void)201static struct kunit_suite min_heap_test_suite = {
216{202 .name = "min_heap",
217 /* do nothing */203 .test_cases = min_heap_test_cases,
218}204};
219module_exit(test_min_heap_exit);205
206kunit_test_suite(min_heap_test_suite);
220 207
221MODULE_DESCRIPTION("Test cases for the min max heap");208MODULE_DESCRIPTION("Test cases for the min max heap");
222MODULE_LICENSE("GPL");209MODULE_LICENSE("GPL");