From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BE477260F for ; Mon, 22 Dec 2025 03:50:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766375423; cv=none; b=ZodwCHLU/2az1VXctT0NbRiO/lfRK1rNihdgI/HJrF7jmqVeFeB8V1vhDXNqzH07D6Rrzp8VwbzCcCFjLxT9gq6oQexecmE/5L/XZdmx3AHDtwaNevnVjdZllRlSlNg7u095rU3yc0lwVCQVZ/OzJOooBLkVBZ2r3XPNTtR1bkE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766375423; c=relaxed/simple; bh=en4Sk1au3z10vxZ6rbHML36qDHPaV694g1IhmfkI4Jc=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=JCl9SEn09at5uXBPugiuZHffR/rtrV3hx38Ud6obnZu+erNR4CFXRLs8TZ0jkAZfMMFN5t+4gbI70yKvCpadvwVZOln9U8pBAd3JyBxYpigKC6FdrfTdJugpISN51VTixqtnQl8G5RLeB3xGohjH91vTIehzwcvplpmmcJHMurQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=UQHB0N1t; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UQHB0N1t" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2a110548cdeso49797925ad.0 for ; Sun, 21 Dec 2025 19:50:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1766375420; x=1766980220; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=EWc4zbMT2rVqilj94nSv4w2JLSUtdNkt/B2p+bwkj9Y=; b=UQHB0N1tAliaFoLP4bE9lxq4CvpLSo7QJTrk4RoVFYjLdlditMFjDPJnLzFDC8EGCx mOdXpi7n7N7SJ6hJqTMOncdYTjTc73824aP/US+3VAw1/S3tSJB/ZGulMUwYNziPX3mX vsm/h8MIpiPV4fbb5tI+BDFFA8FfpgTdR9e82+jt/mfm2rCR/triW688hrqyTep8pcaN WHsWWaTeHZsW88I6uapOmxDdXqIXiDpn0hpbBQ5tbPIksdKIkEf/F9QsdKsOkwY0ALxE VjzZkchvBq7TqCDNIDAW2bx54WJS733otrrmA6Zrl+ISp8VtkcaYv0cUCl4rZaS9I4vH mJ6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766375420; x=1766980220; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EWc4zbMT2rVqilj94nSv4w2JLSUtdNkt/B2p+bwkj9Y=; b=EESeiBsFdqh0JjvRbX8hMzITgC2T+4W9wsg8bjLDKnKa3xc4lzf9Bm/Lm+w3qLIF5U nXlUQ+Dpa2pqKNUu2jed4fO0HbpW69ZFaQsZiFVerYUrNM7bIbskJhs20Np4XArjwSUM YUUv/nNUhKzFCjOvFjSzmN/I21g5vweZ6I5rGCxJNbFVxw0WncfVFSS0/EdQDjACryX7 KprsFNht0T46kfFdXv00klnepPBPTByzclNOWk69kDENPHm3jI0X0aC/9tF5EQ4rMvdL lJlcu7D1qLUrQEbgL0zTAcxCUSMZLwgXfI8/TJXFEkxQWaBIqZQIxAQJGeV3goTq4uG5 ZMiA== X-Forwarded-Encrypted: i=1; AJvYcCUSUnahOo22+wxC3efRib3S6onn43YqG00g1tnbCTRLMU39vatmbtSF1MTVnQDVDXagCkDbotCVUWELwZw=@vger.kernel.org X-Gm-Message-State: AOJu0YyZfJsyOtyCTOc2K4AexB3UK/nzKKyZTyhsvxKafYFKxwIVxnlZ WXLlpptEG+dBhtywus0k5igqO9m94NkEZC0FQe8QT+5XtFoeFV5MlgI6 X-Gm-Gg: AY/fxX7ZK4bqCCWcnXvaWvc4euOfRy2RX+a4ok4Wqd6B5YwM5YGRiRk316I3f+lWnFr 4wYBs9q9ph1K2bkoNUOGmi9H02Xx3JKvTNw/CRmHOE7wnBhxZT4cbx0gXgv+imQOnklZe+7zpHb /cWiDn2RzPs1hGJwYu6XNrOx/uWb8McIDE1C9AQr8fknAGwfxMAqLjOr+8qzT8zMmaeYq3UjmoI CcEVJY3MG+LEknbBHsAniowkfvGQT5sOxhEBh5pYoRGTLCuxrE7SVWpwiP4IRdUy2PTepw3PJDw 33ru58txRlqh3wv0dKDGEn/ZcVfVgnKAH0CasszbAHP7TXD6mHp2eTU6YChQEDpIQSPrVjJsIUQ 20X8GO9FDbtoodJBPnL/I8bVFwoWX7pVc4Ogwov3Uf7gLTTFhCpWBvei3jX4ljFH6JLMMyqCHMZ /35xyFmMN1t8zBCxbozW0= X-Google-Smtp-Source: AGHT+IH7LPmx8hfNwauJniEZudMqBVm67Trx9QpyWWb2ZeuQNu2QEMUTf/gZXFadQ0GFIxMclkiMjg== X-Received: by 2002:a17:903:fad:b0:271:479d:3dcb with SMTP id d9443c01a7336-2a2f2212bc9mr105471565ad.6.1766375420250; Sun, 21 Dec 2025 19:50:20 -0800 (PST) Received: from google.com ([2401:fa00:95:201:716:7495:4657:d836]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a2f3d5d663sm81798265ad.77.2025.12.21.19.50.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Dec 2025 19:50:19 -0800 (PST) Date: Mon, 22 Dec 2025 11:50:14 +0800 From: Kuan-Wei Chiu To: Ryota Sakamoto Cc: Andrew Morton , Geert Uytterhoeven , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , David Gow , linux-kernel@vger.kernel.org Subject: Re: [PATCH] lib/tests: convert test_min_heap module to KUnit Message-ID: References: <20251221133516.321846-1-sakamo.ryota@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20251221133516.321846-1-sakamo.ryota@gmail.com> Hi Ryota, On Sun, Dec 21, 2025 at 01:35:16PM +0000, Ryota Sakamoto wrote: > 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. Thanks for the patch. While the change itself looks good, the commit message focuses heavily on *what* the patch does. I would prefer to see an explanation of *why* this patch is needed. Specifically, what are the benefits of converting to kunit compared to the original implementation? Regards, Kuan-Wei > > Signed-off-by: Ryota Sakamoto > --- > MAINTAINERS | 2 +- > arch/m68k/configs/amiga_defconfig | 1 - > arch/m68k/configs/apollo_defconfig | 1 - > arch/m68k/configs/atari_defconfig | 1 - > arch/m68k/configs/bvme6000_defconfig | 1 - > arch/m68k/configs/hp300_defconfig | 1 - > arch/m68k/configs/mac_defconfig | 1 - > arch/m68k/configs/multi_defconfig | 1 - > arch/m68k/configs/mvme147_defconfig | 1 - > arch/m68k/configs/mvme16x_defconfig | 1 - > arch/m68k/configs/q40_defconfig | 1 - > arch/m68k/configs/sun3_defconfig | 1 - > arch/m68k/configs/sun3x_defconfig | 1 - > arch/powerpc/configs/ppc64_defconfig | 1 - > arch/s390/configs/debug_defconfig | 2 +- > lib/Kconfig.debug | 21 +-- > lib/Makefile | 1 - > lib/tests/Makefile | 1 + > .../min_heap_kunit.c} | 147 ++++++++---------- > 19 files changed, 81 insertions(+), 106 deletions(-) > rename lib/{test_min_heap.c => tests/min_heap_kunit.c} (58%) > > diff --git a/MAINTAINERS b/MAINTAINERS > index dc731d37c8fe..b56106383ccc 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -17443,7 +17443,7 @@ S: Maintained > F: Documentation/core-api/min_heap.rst > F: include/linux/min_heap.h > F: lib/min_heap.c > -F: lib/test_min_heap.c > +F: lib/tests/min_heap_kunit.c > > MIPI CCS, SMIA AND SMIA++ IMAGE SENSOR DRIVER > M: Sakari Ailus > diff --git a/arch/m68k/configs/amiga_defconfig b/arch/m68k/configs/amiga_defconfig > index bfc1ee7c8158..902bec313c79 100644 > --- a/arch/m68k/configs/amiga_defconfig > +++ b/arch/m68k/configs/amiga_defconfig > @@ -609,7 +609,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/apollo_defconfig b/arch/m68k/configs/apollo_defconfig > index d9d1f3c4c70d..0bd3d944fc02 100644 > --- a/arch/m68k/configs/apollo_defconfig > +++ b/arch/m68k/configs/apollo_defconfig > @@ -566,7 +566,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig > index 523205adccc8..9db566fc3281 100644 > --- a/arch/m68k/configs/atari_defconfig > +++ b/arch/m68k/configs/atari_defconfig > @@ -586,7 +586,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/bvme6000_defconfig b/arch/m68k/configs/bvme6000_defconfig > index 7b0a4ef0b010..9f927a87efd1 100644 > --- a/arch/m68k/configs/bvme6000_defconfig > +++ b/arch/m68k/configs/bvme6000_defconfig > @@ -558,7 +558,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig > index 089c5c394c62..b8993c80199e 100644 > --- a/arch/m68k/configs/hp300_defconfig > +++ b/arch/m68k/configs/hp300_defconfig > @@ -568,7 +568,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig > index 5f2484c36733..d1c1eb9cfbb0 100644 > --- a/arch/m68k/configs/mac_defconfig > +++ b/arch/m68k/configs/mac_defconfig > @@ -585,7 +585,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig > index 74f0a1f6d871..e2b76fe694af 100644 > --- a/arch/m68k/configs/multi_defconfig > +++ b/arch/m68k/configs/multi_defconfig > @@ -672,7 +672,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/mvme147_defconfig b/arch/m68k/configs/mvme147_defconfig > index 4bee18c820e4..d9cfa59cb2ba 100644 > --- a/arch/m68k/configs/mvme147_defconfig > +++ b/arch/m68k/configs/mvme147_defconfig > @@ -558,7 +558,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/mvme16x_defconfig b/arch/m68k/configs/mvme16x_defconfig > index 322c17e55c9a..6f77ca6d8fb4 100644 > --- a/arch/m68k/configs/mvme16x_defconfig > +++ b/arch/m68k/configs/mvme16x_defconfig > @@ -559,7 +559,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig > index 82f9baab8fea..1729b63b1095 100644 > --- a/arch/m68k/configs/q40_defconfig > +++ b/arch/m68k/configs/q40_defconfig > @@ -575,7 +575,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/sun3_defconfig b/arch/m68k/configs/sun3_defconfig > index f94ad226cb5b..ff18caa6d5f8 100644 > --- a/arch/m68k/configs/sun3_defconfig > +++ b/arch/m68k/configs/sun3_defconfig > @@ -555,7 +555,6 @@ CONFIG_WW_MUTEX_SELFTEST=m > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/m68k/configs/sun3x_defconfig b/arch/m68k/configs/sun3x_defconfig > index a5ecfc505ab2..b8bbdd9564aa 100644 > --- a/arch/m68k/configs/sun3x_defconfig > +++ b/arch/m68k/configs/sun3x_defconfig > @@ -556,7 +556,6 @@ CONFIG_EARLY_PRINTK=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_TEST_DHRY=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_TEST_MULDIV64=m > CONFIG_REED_SOLOMON_TEST=m > diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig > index 2d92c11eea7e..226b6233cccb 100644 > --- a/arch/powerpc/configs/ppc64_defconfig > +++ b/arch/powerpc/configs/ppc64_defconfig > @@ -426,7 +426,6 @@ CONFIG_BOOTX_TEXT=y > CONFIG_KUNIT=m > CONFIG_KUNIT_ALL_TESTS=m > CONFIG_LKDTM=m > -CONFIG_TEST_MIN_HEAP=m > CONFIG_TEST_DIV64=m > CONFIG_BACKTRACE_SELF_TEST=m > CONFIG_TEST_REF_TRACKER=m > diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_defconfig > index 0713914b25b4..4be3a7540909 100644 > --- a/arch/s390/configs/debug_defconfig > +++ b/arch/s390/configs/debug_defconfig > @@ -921,7 +921,7 @@ CONFIG_FAULT_INJECTION_DEBUG_FS=y > CONFIG_FAULT_INJECTION_CONFIGFS=y > CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y > CONFIG_LKDTM=m > -CONFIG_TEST_MIN_HEAP=y > +CONFIG_MIN_HEAP_KUNIT_TEST=m > CONFIG_KPROBES_SANITY_TEST=m > CONFIG_RBTREE_TEST=y > CONFIG_INTERVAL_TREE_TEST=m > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index ba36939fda79..20ba718473c5 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -2277,16 +2277,6 @@ config TEST_LIST_SORT > > If unsure, say N. > > -config TEST_MIN_HEAP > - tristate "Min heap test" > - depends on DEBUG_KERNEL || m > - help > - Enable this to turn on min heap function tests. This test is > - executed only once during system boot (so affects only boot time), > - or at module load time. > - > - If unsure, say N. > - > config TEST_SORT > tristate "Array-based sort test" if !KUNIT_ALL_TESTS > depends on KUNIT > @@ -2880,6 +2870,17 @@ config MEMCPY_KUNIT_TEST > > If unsure, say N. > > +config MIN_HEAP_KUNIT_TEST > + tristate "Min heap test" if !KUNIT_ALL_TESTS > + depends on KUNIT > + default KUNIT_ALL_TESTS > + help > + This option enables the KUnit test suite for the min heap library > + which provides functions for creating and managing min heaps. > + The test suite checks the functionality of the min heap library. > + > + If unsure, say N > + > config IS_SIGNED_TYPE_KUNIT_TEST > tristate "Test is_signed_type() macro" if !KUNIT_ALL_TESTS > depends on KUNIT > diff --git a/lib/Makefile b/lib/Makefile > index aaf677cf4527..d876ca8d347d 100644 > --- a/lib/Makefile > +++ b/lib/Makefile > @@ -75,7 +75,6 @@ obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o > CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable) > UBSAN_SANITIZE_test_ubsan.o := y > obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o > -obj-$(CONFIG_TEST_MIN_HEAP) += test_min_heap.o > obj-$(CONFIG_TEST_LKM) += test_module.o > obj-$(CONFIG_TEST_VMALLOC) += test_vmalloc.o > obj-$(CONFIG_TEST_RHASHTABLE) += test_rhashtable.o > diff --git a/lib/tests/Makefile b/lib/tests/Makefile > index 601dba4b7d96..11c416488c2e 100644 > --- a/lib/tests/Makefile > +++ b/lib/tests/Makefile > @@ -33,6 +33,7 @@ CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes) > obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o > > obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_kunit.o > +obj-$(CONFIG_MIN_HEAP_KUNIT_TEST) += min_heap_kunit.o > CFLAGS_overflow_kunit.o = $(call cc-disable-warning, tautological-constant-out-of-range-compare) > obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o > obj-$(CONFIG_PRINTF_KUNIT_TEST) += printf_kunit.o > diff --git a/lib/test_min_heap.c b/lib/tests/min_heap_kunit.c > similarity index 58% > rename from lib/test_min_heap.c > rename to lib/tests/min_heap_kunit.c > index a9c4a74d3898..9c1122661698 100644 > --- a/lib/test_min_heap.c > +++ b/lib/tests/min_heap_kunit.c > @@ -1,60 +1,66 @@ > // SPDX-License-Identifier: GPL-2.0-only > -#define pr_fmt(fmt) "min_heap_test: " fmt > - > /* > * Test cases for the min max heap. > */ > > -#include > +#include > #include > #include > -#include > #include > > +struct min_heap_test_case { > + const char *str; > + bool min_heap; > +}; > + > +static struct min_heap_test_case min_heap_cases[] = { > + { > + .str = "min", > + .min_heap = true, > + }, > + { > + .str = "max", > + .min_heap = false, > + }, > +}; > + > +KUNIT_ARRAY_PARAM_DESC(min_heap, min_heap_cases, str); > + > DEFINE_MIN_HEAP(int, min_heap_test); > > -static __init bool less_than(const void *lhs, const void *rhs, void __always_unused *args) > +static bool less_than(const void *lhs, const void *rhs, void __always_unused *args) > { > return *(int *)lhs < *(int *)rhs; > } > > -static __init bool greater_than(const void *lhs, const void *rhs, void __always_unused *args) > +static bool greater_than(const void *lhs, const void *rhs, void __always_unused *args) > { > return *(int *)lhs > *(int *)rhs; > } > > -static __init int pop_verify_heap(bool min_heap, > - struct min_heap_test *heap, > - const struct min_heap_callbacks *funcs) > +static void pop_verify_heap(struct kunit *test, > + bool min_heap, > + struct min_heap_test *heap, > + const struct min_heap_callbacks *funcs) > { > int *values = heap->data; > - int err = 0; > int last; > > last = values[0]; > min_heap_pop_inline(heap, funcs, NULL); > while (heap->nr > 0) { > - if (min_heap) { > - if (last > values[0]) { > - pr_err("error: expected %d <= %d\n", last, > - values[0]); > - err++; > - } > - } else { > - if (last < values[0]) { > - pr_err("error: expected %d >= %d\n", last, > - values[0]); > - err++; > - } > - } > + if (min_heap) > + KUNIT_EXPECT_LE(test, last, values[0]); > + else > + KUNIT_EXPECT_GE(test, last, values[0]); > last = values[0]; > min_heap_pop_inline(heap, funcs, NULL); > } > - return err; > } > > -static __init int test_heapify_all(bool min_heap) > +static void test_heapify_all(struct kunit *test) > { > + const struct min_heap_test_case *params = test->param_value; > int values[] = { 3, 1, 2, 4, 0x8000000, 0x7FFFFFF, 0, > -3, -1, -2, -4, 0x8000000, 0x7FFFFFF }; > struct min_heap_test heap = { > @@ -63,15 +69,14 @@ static __init int test_heapify_all(bool min_heap) > .size = ARRAY_SIZE(values), > }; > struct min_heap_callbacks funcs = { > - .less = min_heap ? less_than : greater_than, > + .less = params->min_heap ? less_than : greater_than, > .swp = NULL, > }; > - int i, err; > + int i; > > /* Test with known set of values. */ > min_heapify_all_inline(&heap, &funcs, NULL); > - err = pop_verify_heap(min_heap, &heap, &funcs); > - > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > > /* Test with randomly generated values. */ > heap.nr = ARRAY_SIZE(values); > @@ -79,13 +84,12 @@ static __init int test_heapify_all(bool min_heap) > values[i] = get_random_u32(); > > min_heapify_all_inline(&heap, &funcs, NULL); > - err += pop_verify_heap(min_heap, &heap, &funcs); > - > - return err; > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > } > > -static __init int test_heap_push(bool min_heap) > +static void test_heap_push(struct kunit *test) > { > + const struct min_heap_test_case *params = test->param_value; > const int data[] = { 3, 1, 2, 4, 0x80000000, 0x7FFFFFFF, 0, > -3, -1, -2, -4, 0x80000000, 0x7FFFFFFF }; > int values[ARRAY_SIZE(data)]; > @@ -95,29 +99,28 @@ static __init int test_heap_push(bool min_heap) > .size = ARRAY_SIZE(values), > }; > struct min_heap_callbacks funcs = { > - .less = min_heap ? less_than : greater_than, > + .less = params->min_heap ? less_than : greater_than, > .swp = NULL, > }; > - int i, temp, err; > + int i, temp; > > /* Test with known set of values copied from data. */ > for (i = 0; i < ARRAY_SIZE(data); i++) > min_heap_push_inline(&heap, &data[i], &funcs, NULL); > > - err = pop_verify_heap(min_heap, &heap, &funcs); > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > > /* Test with randomly generated values. */ > while (heap.nr < heap.size) { > temp = get_random_u32(); > min_heap_push_inline(&heap, &temp, &funcs, NULL); > } > - err += pop_verify_heap(min_heap, &heap, &funcs); > - > - return err; > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > } > > -static __init int test_heap_pop_push(bool min_heap) > +static void test_heap_pop_push(struct kunit *test) > { > + const struct min_heap_test_case *params = test->param_value; > const int data[] = { 3, 1, 2, 4, 0x80000000, 0x7FFFFFFF, 0, > -3, -1, -2, -4, 0x80000000, 0x7FFFFFFF }; > int values[ARRAY_SIZE(data)]; > @@ -127,13 +130,13 @@ static __init int test_heap_pop_push(bool min_heap) > .size = ARRAY_SIZE(values), > }; > struct min_heap_callbacks funcs = { > - .less = min_heap ? less_than : greater_than, > + .less = params->min_heap ? less_than : greater_than, > .swp = NULL, > }; > - int i, temp, err; > + int i, temp; > > /* Fill values with data to pop and replace. */ > - temp = min_heap ? 0x80000000 : 0x7FFFFFFF; > + temp = params->min_heap ? 0x80000000 : 0x7FFFFFFF; > for (i = 0; i < ARRAY_SIZE(data); i++) > min_heap_push_inline(&heap, &temp, &funcs, NULL); > > @@ -141,7 +144,7 @@ static __init int test_heap_pop_push(bool min_heap) > for (i = 0; i < ARRAY_SIZE(data); i++) > min_heap_pop_push_inline(&heap, &data[i], &funcs, NULL); > > - err = pop_verify_heap(min_heap, &heap, &funcs); > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > > heap.nr = 0; > for (i = 0; i < ARRAY_SIZE(data); i++) > @@ -152,13 +155,12 @@ static __init int test_heap_pop_push(bool min_heap) > temp = get_random_u32(); > min_heap_pop_push_inline(&heap, &temp, &funcs, NULL); > } > - err += pop_verify_heap(min_heap, &heap, &funcs); > - > - return err; > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > } > > -static __init int test_heap_del(bool min_heap) > +static void test_heap_del(struct kunit *test) > { > + const struct min_heap_test_case *params = test->param_value; > int values[] = { 3, 1, 2, 4, 0x8000000, 0x7FFFFFF, 0, > -3, -1, -2, -4, 0x8000000, 0x7FFFFFF }; > struct min_heap_test heap; > @@ -166,17 +168,16 @@ static __init int test_heap_del(bool min_heap) > min_heap_init_inline(&heap, values, ARRAY_SIZE(values)); > heap.nr = ARRAY_SIZE(values); > struct min_heap_callbacks funcs = { > - .less = min_heap ? less_than : greater_than, > + .less = params->min_heap ? less_than : greater_than, > .swp = NULL, > }; > - int i, err; > + int i; > > /* Test with known set of values. */ > min_heapify_all_inline(&heap, &funcs, NULL); > for (i = 0; i < ARRAY_SIZE(values) / 2; i++) > min_heap_del_inline(&heap, get_random_u32() % heap.nr, &funcs, NULL); > - err = pop_verify_heap(min_heap, &heap, &funcs); > - > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > > /* Test with randomly generated values. */ > heap.nr = ARRAY_SIZE(values); > @@ -186,37 +187,23 @@ static __init int test_heap_del(bool min_heap) > > for (i = 0; i < ARRAY_SIZE(values) / 2; i++) > min_heap_del_inline(&heap, get_random_u32() % heap.nr, &funcs, NULL); > - err += pop_verify_heap(min_heap, &heap, &funcs); > - > - return err; > + pop_verify_heap(test, params->min_heap, &heap, &funcs); > } > > -static int __init test_min_heap_init(void) > -{ > - int err = 0; > - > - err += test_heapify_all(true); > - err += test_heapify_all(false); > - err += test_heap_push(true); > - err += test_heap_push(false); > - err += test_heap_pop_push(true); > - err += test_heap_pop_push(false); > - err += test_heap_del(true); > - err += test_heap_del(false); > - if (err) { > - pr_err("test failed with %d errors\n", err); > - return -EINVAL; > - } > - pr_info("test passed\n"); > - return 0; > -} > -module_init(test_min_heap_init); > +static struct kunit_case min_heap_test_cases[] = { > + KUNIT_CASE_PARAM(test_heapify_all, min_heap_gen_params), > + KUNIT_CASE_PARAM(test_heap_push, min_heap_gen_params), > + KUNIT_CASE_PARAM(test_heap_pop_push, min_heap_gen_params), > + KUNIT_CASE_PARAM(test_heap_del, min_heap_gen_params), > + {}, > +}; > > -static void __exit test_min_heap_exit(void) > -{ > - /* do nothing */ > -} > -module_exit(test_min_heap_exit); > +static struct kunit_suite min_heap_test_suite = { > + .name = "min_heap", > + .test_cases = min_heap_test_cases, > +}; > + > +kunit_test_suite(min_heap_test_suite); > > MODULE_DESCRIPTION("Test cases for the min max heap"); > MODULE_LICENSE("GPL"); > -- > 2.34.1 >