From patchwork Fri Mar 7 11:27:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 14006319 Received: from mail-qv1-f44.google.com (mail-qv1-f44.google.com [209.85.219.44]) (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 0CF7F21767C; Fri, 7 Mar 2025 11:27:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346871; cv=none; b=Kku4ODuCrZahQuNFxmDSPI6DWKpQjdW88cpjWgP9s5bCTwdCcOEC/d8Odlq77pHBjtafyaBKOKKh7/m+WAKBczjGwqPquCfH+yEHvf1M6p8j1Nr9O7OOeuy9rcta2Rsx7MOe6nFk5+SDmTswi5dIfrSlbDjZ4exw359YjI9wttk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346871; c=relaxed/simple; bh=Xq1CgqkhKVay0fmc3VZLK9DJdEUj+jB1Kujma3ZvEBo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KqT4r7zmwicQ15Pc/CP+vTm1EyXRYiXqQwfhJlLCXV7gU7Eh5UfOGb9SKHyPEOS50PQ9RiWaeSHG4Y8tJBL+bDkOvIhLog4+IyXtZXP2rYbt986asGZaakGY/alSw2guefwCAztxlOalOigIL3nByGaIiGv0HrKMyUARnG8LkNY= 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=H4jDiw6o; arc=none smtp.client-ip=209.85.219.44 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="H4jDiw6o" Received: by mail-qv1-f44.google.com with SMTP id 6a1803df08f44-6e8fb83e137so10236076d6.0; Fri, 07 Mar 2025 03:27:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741346868; x=1741951668; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Yv/FuUw1j15MVfw0RP9extfwGFNvHE/nh1IKfaWNJPs=; b=H4jDiw6ohaImPSsqFYXPju3GW3PinzSis/HJbGAiC3PHuqnLY9hUn0W/qCTHH9jMLW qO+L+/XhXH48UJdngjJfrjjHxAM/E2drZNHXLgMjg3uFg+Eh4LSQh+4OCZR9rnRRXmBF tcEb9xj62zy6GJaYSdsGy2X+F5GXUShoqUNJ78PmYAqVgCPq1qt6Xwcz6MdJr/1ymWXG NzlPi31Ta9HcGjdbCv/7dn6voFCdHm+G8cAfeTmFcMqHQ5RPQyAPGWUnFp1d4woIh1ZD LvuakMSlbTUcqQnizbmXREAppBliDICItB1j0LVHRYNO1OeDuJ5WhbJCPwFM+MIWVGFh i7Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741346868; x=1741951668; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Yv/FuUw1j15MVfw0RP9extfwGFNvHE/nh1IKfaWNJPs=; b=TP2W6zgyhqnPdLBoq8vIVCEZghesiPVilueYSksPahC8y1yqCRbPnTyaq/jQMTX5FI 83NK5oRrVX75tWQ8OHoXnVo3YbjNFq5FdsBk06LRodEwdbwj1gp0e0KA5sm0L79puMlg 40SEFhYAZNlYpp66JiVmydbWCoga+owsImvGa4kdXEnnXiyIg7sLR3RrYUoxoeaevm6r PCaapCY+TlDy8IDh7UgXPUpd92e9fL6uD/zqdV06wz4cKac/CllonmvCBwWsCQ0fsXE6 8mdDoQdFhmEuUeUR9qHYHyOdOQK/Qu2OyDwuNmlvwWwVhrHItI8hqlmaAlE9EQSsRK2b QjRA== X-Forwarded-Encrypted: i=1; AJvYcCVS+3ltlhMZyaiLIpljp5f4FSPNCSkjkg1U5d48FVXI/H4uFMZwgB9gO4l38JNBOJF/qjFXZSxqrPuQR2K4G6I1@vger.kernel.org, AJvYcCXpporVZEk8qng3l/U4nQl+r7IVfjs3R9pySPwkoRnmqsQCH0gkbJjP4R5N5BOOA7CkTiO7aCoh2rN7jg8=@vger.kernel.org X-Gm-Message-State: AOJu0YxG83DuDLeUGIrBpLLyP6EM4GvafJS832OQTm+mPI2gPckWty+a 1YMuBDQZZq42t5lBQX4IxAC4NnpEvT18iJ+yqyIbpxVpJ4OlhrL6IOUqGat9+lM= X-Gm-Gg: ASbGnctwYPECpzqIeC4Ku5E3mxuYVzdOqeSsSpuhqTK8GJbY2rxHQL7PvUEYVOt9xqy cm2z/imrpRIbeqaQ0sWB3e1yfcq2vZUXR4lkbyPPOtMvsnG5+j4UNGXlC7XVQ710HEwf3QgMVL5 a3lzx78rbOHcojkueP3qOuZsfo6ItDrlJQxEcepOkrPx0rPxc7bDgIJV6Cjp8MJ2UQk4QrhNzAT Wgkyp3KTfu+Cy4aKifWvG4LzaI1H8zLrH0xpiBaErsoQrP3xg4TUQI9pp63mW8H1fXCbzRxPmHr 2BWThqTaz+1zhBO0akUdcFHDgFB2/G5qykQP0EfpGeGfS2edbRtqQcH9BX8s4XuBPJ0= X-Google-Smtp-Source: AGHT+IGCKCP58Au7POQ5+P4R8NPFSZly8QjaikPhj6dM5ZcGsyMPEmvswiQqFeiZ2UjvRbib422I4Q== X-Received: by 2002:a05:6214:2584:b0:6e8:fb7e:d335 with SMTP id 6a1803df08f44-6e9004df813mr40029296d6.0.1741346868300; Fri, 07 Mar 2025 03:27:48 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:f0dd:49a0:8ab6:b3b6]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e8f70a446dsm18509416d6.56.2025.03.07.03.27.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Mar 2025 03:27:47 -0800 (PST) From: Tamir Duberstein Date: Fri, 07 Mar 2025 06:27:34 -0500 Subject: [PATCH v9 1/6] scanf: implicate test line in failure messages Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250307-scanf-kunit-convert-v9-1-b98820fa39ff@gmail.com> References: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> In-Reply-To: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev This improves the failure output by pointing to the failing line at the top level of the test. Reviewed-by: Petr Mladek Tested-by: Petr Mladek Signed-off-by: Tamir Duberstein --- lib/test_scanf.c | 66 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/test_scanf.c b/lib/test_scanf.c index 44f8508c9d88..e65b10c3dc11 100644 --- a/lib/test_scanf.c +++ b/lib/test_scanf.c @@ -24,12 +24,12 @@ static char *test_buffer __initdata; static char *fmt_buffer __initdata; static struct rnd_state rnd_state __initdata; -typedef int (*check_fn)(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap); +typedef int (*check_fn)(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap); -static void __scanf(4, 6) __init -_test(check_fn fn, const void *check_data, const char *string, const char *fmt, - int n_args, ...) +static void __scanf(6, 8) __init +_test(const char *file, const int line, check_fn fn, const void *check_data, const char *string, + const char *fmt, int n_args, ...) { va_list ap, ap_copy; int ret; @@ -42,12 +42,12 @@ _test(check_fn fn, const void *check_data, const char *string, const char *fmt, va_end(ap_copy); if (ret != n_args) { - pr_warn("vsscanf(\"%s\", \"%s\", ...) returned %d expected %d\n", - string, fmt, ret, n_args); + pr_warn("%s:%d: vsscanf(\"%s\", \"%s\", ...) returned %d expected %d\n", + file, line, string, fmt, ret, n_args); goto fail; } - ret = (*fn)(check_data, string, fmt, n_args, ap); + ret = (*fn)(file, line, check_data, string, fmt, n_args, ap); if (ret) goto fail; @@ -67,88 +67,88 @@ do { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ pr_debug("\t" arg_fmt "\n", got); \ if (got != *expect) { \ - pr_warn("vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ - str, fmt, *expect, got); \ + pr_warn("%s:%d, vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ + file, line, str, fmt, *expect, got); \ return 1; \ } \ } \ return 0; \ } while (0) -static int __init check_ull(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ull(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned long long *pval = check_data; _check_numbers_template("%llu", pval, string, fmt, n_args, ap); } -static int __init check_ll(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ll(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long long *pval = check_data; _check_numbers_template("%lld", pval, string, fmt, n_args, ap); } -static int __init check_ulong(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ulong(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned long *pval = check_data; _check_numbers_template("%lu", pval, string, fmt, n_args, ap); } -static int __init check_long(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_long(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long *pval = check_data; _check_numbers_template("%ld", pval, string, fmt, n_args, ap); } -static int __init check_uint(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_uint(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned int *pval = check_data; _check_numbers_template("%u", pval, string, fmt, n_args, ap); } -static int __init check_int(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_int(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const int *pval = check_data; _check_numbers_template("%d", pval, string, fmt, n_args, ap); } -static int __init check_ushort(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ushort(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned short *pval = check_data; _check_numbers_template("%hu", pval, string, fmt, n_args, ap); } -static int __init check_short(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_short(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const short *pval = check_data; _check_numbers_template("%hd", pval, string, fmt, n_args, ap); } -static int __init check_uchar(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_uchar(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned char *pval = check_data; _check_numbers_template("%hhu", pval, string, fmt, n_args, ap); } -static int __init check_char(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_char(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const signed char *pval = check_data; @@ -196,7 +196,7 @@ do { \ T result = ~expect_val; /* should be overwritten */ \ \ snprintf(test_buffer, BUF_SIZE, gen_fmt, expect_val); \ - _test(fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result); \ + _test(__FILE__, __LINE__, fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result); \ } while (0) #define simple_numbers_loop(T, gen_fmt, scan_fmt, fn) \ @@ -344,7 +344,7 @@ static void __init append_delim(char *str_buf, int *str_buf_pos, int str_buf_len #define test_array_8(fn, check_data, string, fmt, arr) \ do { \ BUILD_BUG_ON(ARRAY_SIZE(arr) != 8); \ - _test(fn, check_data, string, fmt, 8, \ + _test(__FILE__, __LINE__, fn, check_data, string, fmt, 8, \ &(arr)[0], &(arr)[1], &(arr)[2], &(arr)[3], \ &(arr)[4], &(arr)[5], &(arr)[6], &(arr)[7]); \ } while (0) @@ -608,7 +608,7 @@ do { \ const T expect[2] = { expect0, expect1 }; \ T result[2] = { (T)~expect[0], (T)~expect[1] }; \ \ - _test(fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]); \ + _test(__FILE__, __LINE__, fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]); \ } while (0) /* From patchwork Fri Mar 7 11:27:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 14006320 Received: from mail-qv1-f51.google.com (mail-qv1-f51.google.com [209.85.219.51]) (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 9E155217F40; Fri, 7 Mar 2025 11:27:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346874; cv=none; b=UXwOn8nvTKMoeIExudEc8wA7/X/0bz0WjUhhDpLofdpa+HDC6VgqItY8grM1/o+xvRryim4/v6vgTh5c0hdDIka3rS+3lNK8WcC7Bxompf7nGqeFmT6T4nc4jT+lchFvVx8tB8g9fnqwCYGAehfq+hlWr/pyFOLbFnt7HhK6iGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346874; c=relaxed/simple; bh=n9gPbH2KRGPAhOb7xFcYWxt07vCwPYapd6uXvy48A6g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SvfK2d02jzgY5aUsv1X9h+Vj4rimByMFp2yuwfAiXQFir1H6XuIh7RqETy/bQfhx6zLaYw80rvVIM7m+vExaosQzh996CSDtRDbCxOQ/wxxMw6x+KV+KW3TWgs1oanO6jrMPKWBu8NjFeupcar9UWstcSRCzG/Z3NyAbLVcVTYU= 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=niOnerZ4; arc=none smtp.client-ip=209.85.219.51 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="niOnerZ4" Received: by mail-qv1-f51.google.com with SMTP id 6a1803df08f44-6e8fce04655so10400586d6.3; Fri, 07 Mar 2025 03:27:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741346871; x=1741951671; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=GNlOIuhqf+m77H9e5k86VtJMdPB8YXoMMeSA64b6Md0=; b=niOnerZ4OvYtgR4qvPnKNh+IYZ7UEfLdvvmvZ3LPdHTEdMrKBKpAvohfnA3oy9Sbud TA0XGN4SzKyhC/l/Qgtqnl47rizi7MOGMfpTsTA+NdKYMaXi+DaahF7BRCUwWZ+86hZF Brbr/XwCYn2vDBf4CD8vTXMheC6FRuB3LoJxbrzVTgctLmQwAC9XY88A/RSps6VezdWB 4ez5AKhpYosKehAYW7QmaBBIIgX2nykPfcyu/WV2ugKGiTNNXCmTUVXdFeNRTWE4O5AB hfVuyGTjKeeJhLbS3erArumKZyZDszr/xNdE7RN8wowtgqzyY7glk256tkdpIb4jOkMs Y5Mw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741346871; x=1741951671; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GNlOIuhqf+m77H9e5k86VtJMdPB8YXoMMeSA64b6Md0=; b=Bcf7+UdfgEBO5iI9nNGdXOnypRnASUnC9rciNYYw2ot/54u6+5nND4+XaWkKAdn6eS yoEwCCfAG3M/05r35YZ3xY2MY9mFDO+AZQ1jAG/XdijcHEUSU283s/pfCtNRTh5lmiAh Prl1WT66VAJBK5AlPbS6BSrh9t4QFvP1BTXfFvQBCXGXYmNpZbMhK2/rjFNvaPIXY5je UZ/QzbEICN69DDs6TDd54cAwMpGW1J7L/uZhL5Qv9SRxAW16QIfYc7cb/W4u5jn07XIb yAo8zmelqh7KOItcwae7C4npmosThjhYbnZi6XKeiE8Rowj8LZXqV/OZVSaPPCECiGoF /QJQ== X-Forwarded-Encrypted: i=1; AJvYcCWJCkYc7/U4IDIHBjnUTV+KiIekbsprHSYIK/hJT1wVQRiGW+GFpumgTcVG3ZFLXnhT49De0RK7Obk5Hxs=@vger.kernel.org, AJvYcCWbkIiR8hWYDbUyDkmzEYIcJv/kYd+SGrl8sBQ7Bxy/qgwSPdds91xgP7KOZEAZfpujy6Yl89+HIBPnmhRqhWQZ@vger.kernel.org X-Gm-Message-State: AOJu0YzAojkzTmS7PLjW4WyN9zB5/MJELrX/TupWsqb6Mj44BA4p8vgt QoyljqZbFL2GGr6tEYB6FrZUMH7nln/jnP24v/kWjZ09dsegTZdBGQ5WaGIcS1U= X-Gm-Gg: ASbGncsj48zpJYS6/rBBPlW8ZHfpIa1COvoTDqP/1e/OyL+C6WQUiZa4RjLdxe+tw7O xGmlJVqOVYNiJgKBRe8FKih+qSoDo+3hPqgaJjxTHS7HW+OhGZM6qFRy4XT6lplIipYmb++VyXq uwYYdhozCCfrB2wcXJ9NLFz5iL7KP8zCjmwzbtjHl/vHCo5s7njXEBokRthl6YmoqUdWGPRh3Vl sAKpDSFjkP8A2rhhR60azKG6nwFv/jgLPfet5UGaW9jo2aaeyB9NDOV61KcpsjCHlyGHIKDbwgu eO49kN6v1yFAe3tTkZJa+qBxw1nnXPsNqPk3PwF5oAIOdSP1y0DiNZKkUPwy97z3j9Y= X-Google-Smtp-Source: AGHT+IF50GorM8FtTVkQSHHZeZbovohTOGSrw1UH9q95ZQ6eM053pu/3qfgM3YPUmQVajkH5HhII7g== X-Received: by 2002:a05:6214:c83:b0:6e8:9dfa:d932 with SMTP id 6a1803df08f44-6e9005f7710mr39023866d6.15.1741346870920; Fri, 07 Mar 2025 03:27:50 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:f0dd:49a0:8ab6:b3b6]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e8f70a446dsm18509416d6.56.2025.03.07.03.27.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Mar 2025 03:27:49 -0800 (PST) From: Tamir Duberstein Date: Fri, 07 Mar 2025 06:27:35 -0500 Subject: [PATCH v9 2/6] scanf: remove redundant debug logs Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250307-scanf-kunit-convert-v9-2-b98820fa39ff@gmail.com> References: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> In-Reply-To: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Remove `pr_debug` calls which emit information already contained in `pr_warn` calls that occur on test failure. This reduces unhelpful test verbosity. Note that a `pr_debug` removed from `_check_numbers_template` appears to have been the only guard against silent false positives, but in fact this condition is handled in `_test`; it is only possible for `n_args` to be `0` in `_check_numbers_template` if the test explicitly expects it *and* `vsscanf` returns `0`, matching the expectation. Reviewed-by: Petr Mladek Signed-off-by: Tamir Duberstein --- lib/test_scanf.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/test_scanf.c b/lib/test_scanf.c index e65b10c3dc11..cb0b57dc7383 100644 --- a/lib/test_scanf.c +++ b/lib/test_scanf.c @@ -62,10 +62,8 @@ _test(const char *file, const int line, check_fn fn, const void *check_data, con #define _check_numbers_template(arg_fmt, expect, str, fmt, n_args, ap) \ do { \ - pr_debug("\"%s\", \"%s\" ->\n", str, fmt); \ for (; n_args > 0; n_args--, expect++) { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ - pr_debug("\t" arg_fmt "\n", got); \ if (got != *expect) { \ pr_warn("%s:%d, vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ file, line, str, fmt, *expect, got); \ @@ -689,7 +687,6 @@ do { \ total_tests++; \ len = snprintf(test_buffer, BUF_SIZE, gen_fmt, expect); \ got = (fn)(test_buffer, &endp, base); \ - pr_debug(#fn "(\"%s\", %d) -> " gen_fmt "\n", test_buffer, base, got); \ if (got != (expect)) { \ fail = true; \ pr_warn(#fn "(\"%s\", %d): got " gen_fmt " expected " gen_fmt "\n", \ From patchwork Fri Mar 7 11:27:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 14006321 Received: from mail-qv1-f41.google.com (mail-qv1-f41.google.com [209.85.219.41]) (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 A941C2185B4; Fri, 7 Mar 2025 11:27:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346877; cv=none; b=Oe5L4E7VfSXaMD2wG0OFgqQOZOdR9nv8RyWhozy4VQuKtAqHMA1XjJE/FQjtJY0bvK+Gd/ew2sGRrjrsP4nAm3o2gW3W13Id8GwE0zradQnC77pG9wTYU63d3YXFjIMoSSqsC/AFa0xjXqrcDGtb2rI5N4VOUlrP876pPsPP2OA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346877; c=relaxed/simple; bh=5YhZ8QYP0De0dhqPxmOCdz+AsNKMw+0QJRVPGabu4mI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=COw1/Gv/BZh3r46tqYzIqg9JjDRtnVP1nASwGrQZxC6J4CqFGOXtunBQkMPxtypmqitGhmhvayCBaHgVbiRCNP81SmSi8cKX3/c33U45RksBevvIHpWYaT7KKBueKZPqUPYxFXMVUdpNnlHJmewQHLZCVYoQ10bYJKDw6CLi9OY= 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=hlyBn0px; arc=none smtp.client-ip=209.85.219.41 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="hlyBn0px" Received: by mail-qv1-f41.google.com with SMTP id 6a1803df08f44-6e8f7019422so14651236d6.1; Fri, 07 Mar 2025 03:27:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741346873; x=1741951673; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=gPU7bedmhEsbsN84NlPVMhzfXQ4kaWRHoNbK0IaYbP4=; b=hlyBn0pxn2HShG49B2Sm1nc53xyJHP0zDdoAuZB/+0ew38plHzwVW56+7E3IJNiOfm ifD7VOF/umhIpI5hd+b0szpGW5Yt6IZBfxwI9pYTsKorljKAxgwwlL7V3SX4QdMC1Zs6 vqt0PV18XqIQbZZMybQ+otpmv6C59ELHJBlJNJ8s9MpgeFOYf1+iXoazbcBszRhyNnzv eswdhKAH92wof05EW0C8H9ekZrArdOapUpWWlHmipQbCku2FhyCYV19+S9NRjhtvwT3R zK2efJfIGq2QGu78I7q6KB2aZW611b2a6wzSkcBGoTRJnLuZR1KkyrW02ai/DGATQkvD W8mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741346873; x=1741951673; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gPU7bedmhEsbsN84NlPVMhzfXQ4kaWRHoNbK0IaYbP4=; b=Q34HZgIXrxdXPQh6WB/jU3JeC1lKXFNSLcXKrHaHeqnTP7hspMWMtsm4eX+DIwdCI4 7wtM3L0rNa22XOvPBM5600PNNtR3tjo6DBlOjw0YSWGMKXp6kYqfmc1TPOqfAOLdLPTQ qwlvJ0eHmUE3C+5wVmPoRfUNTvW2MZKfKceC6A/y1DvHDnrVrn2sGpQJHEHxAe89ErzC q36K8EV3VjZBGj0DfOYsKLhxvRY4rVnHwAqz4B9HpiwTK/iqFeeCVTAyd1Loh9TjMg3y 2xSeo3vwUqgpihfw5qoupRek9DkGSP38qilaRiTr8iRN9sqRrfFZb9Pp3SS3Zc5CWAAr IQ5A== X-Forwarded-Encrypted: i=1; AJvYcCUgv0QcN8ZPD53zdQSCF/8k4t9gSArAsw2/CU4a3ebl1naSfK1MFvKqhQmlwYaeYrjURqTrnT1IJt6dgIDWKHsR@vger.kernel.org, AJvYcCXJr/enEmM4QBDdjwxoubyKDIXS9Sx+Y+/GKlY5HRfkfDaLzHOj9PHOhFcOGuQOoM3QReB3XvKyf75RAN0=@vger.kernel.org X-Gm-Message-State: AOJu0YxOebeuRrOJZul9llrMn6DDAGXCmdxKXjiYyDjgqQvjLH0hw5Gl ViNxnfVmC88dqIW+pZd9TkygxGC/1JnbergTcVuIBV6e7RzOqLccz7ljvKPt9fA= X-Gm-Gg: ASbGncsyJYmVqMSJXH5Z4W3fwwj7/2vWYituME+V6yJ0ZnEHserahIOFXhhiwUqC+db AIsUFxAxdQixcOpUPUY1RAz/1bsbJTby97zWNCiJjbFNKI5QtQ6CMvAsHfASOsffw189SMo6o25 gzyz/DSnCJmh2Ky1Vf3k3Do6RdZcwkwxBaTLVQcmc5B+6+JjcbfNHAgMErCC1bc7n0pK+o2vYGf syOUA80hdznPm5FminCck0JgpVdFkIz9d3+oAjOLhe93vUwIZXvXh1noPzYnX6x4GoWG6PVilnU PolLEMZY4B30XhykI8+ERA/UUu561GR/BVxiKYjZw7V0g+Ugf7VRBbKZSdsUrFgD3FQ= X-Google-Smtp-Source: AGHT+IEUs3JjgPBHIdeoWzzKtspjxKuIiGb8J2kg/3wkJWFtotznvYZKr9yAnQQDgt+aw0L8Uzfy6g== X-Received: by 2002:a05:6214:d48:b0:6e8:f60c:5879 with SMTP id 6a1803df08f44-6e9006f1fadmr34586356d6.42.1741346872807; Fri, 07 Mar 2025 03:27:52 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:f0dd:49a0:8ab6:b3b6]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e8f70a446dsm18509416d6.56.2025.03.07.03.27.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Mar 2025 03:27:51 -0800 (PST) From: Tamir Duberstein Date: Fri, 07 Mar 2025 06:27:36 -0500 Subject: [PATCH v9 3/6] scanf: convert self-test to KUnit Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250307-scanf-kunit-convert-v9-3-b98820fa39ff@gmail.com> References: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> In-Reply-To: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Convert the scanf() self-test to a KUnit test. In the interest of keeping the patch reasonably-sized this doesn't refactor the tests into proper parameterized tests - it's all one big test case. Reviewed-by: David Gow Reviewed-by: Petr Mladek Tested-by: Petr Mladek Signed-off-by: Tamir Duberstein --- MAINTAINERS | 2 +- lib/Kconfig.debug | 12 +- lib/Makefile | 1 - lib/tests/Makefile | 1 + lib/{test_scanf.c => tests/scanf_kunit.c} | 252 +++++++++++++++--------------- tools/testing/selftests/lib/Makefile | 2 +- tools/testing/selftests/lib/config | 1 - tools/testing/selftests/lib/scanf.sh | 4 - 8 files changed, 134 insertions(+), 141 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 4e9e0e52f92e..f5e2c420ed5d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -25599,8 +25599,8 @@ R: Sergey Senozhatsky S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux.git F: Documentation/core-api/printk-formats.rst +F: lib/tests/scanf_kunit.c F: lib/test_printf.c -F: lib/test_scanf.c F: lib/vsprintf.c VT1211 HARDWARE MONITOR DRIVER diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index ebb5b190e9f9..af6262f84af6 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2436,6 +2436,15 @@ config ASYNC_RAID6_TEST config TEST_HEXDUMP tristate "Test functions located in the hexdump module at runtime" +config SCANF_KUNIT_TEST + tristate "KUnit test scanf() family of functions at runtime" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + help + Enable this option to test the scanf functions at runtime. + + If unsure, say N. + config STRING_KUNIT_TEST tristate "KUnit test string functions at runtime" if !KUNIT_ALL_TESTS depends on KUNIT @@ -2452,9 +2461,6 @@ config TEST_KSTRTOX config TEST_PRINTF tristate "Test printf() family of functions at runtime" -config TEST_SCANF - tristate "Test scanf() family of functions at runtime" - config TEST_BITMAP tristate "Test bitmap_*() family of functions at runtime" help diff --git a/lib/Makefile b/lib/Makefile index 7bab71e59019..821dd8447f11 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -78,7 +78,6 @@ obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_keys.o obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_key_base.o obj-$(CONFIG_TEST_DYNAMIC_DEBUG) += test_dynamic_debug.o obj-$(CONFIG_TEST_PRINTF) += test_printf.o -obj-$(CONFIG_TEST_SCANF) += test_scanf.o obj-$(CONFIG_TEST_BITMAP) += test_bitmap.o ifeq ($(CONFIG_CC_IS_CLANG)$(CONFIG_KASAN),yy) diff --git a/lib/tests/Makefile b/lib/tests/Makefile index 8961fbcff7a4..db9b685f2d88 100644 --- a/lib/tests/Makefile +++ b/lib/tests/Makefile @@ -30,6 +30,7 @@ obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_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_SCANF_KUNIT_TEST) += scanf_kunit.o obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o obj-$(CONFIG_SLUB_KUNIT_TEST) += slub_kunit.o obj-$(CONFIG_TEST_SORT) += test_sort.o diff --git a/lib/test_scanf.c b/lib/tests/scanf_kunit.c similarity index 78% rename from lib/test_scanf.c rename to lib/tests/scanf_kunit.c index cb0b57dc7383..94eb5ec80fdb 100644 --- a/lib/test_scanf.c +++ b/lib/tests/scanf_kunit.c @@ -3,60 +3,44 @@ * Test cases for sscanf facility. */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - +#include #include -#include #include #include #include -#include #include #include #include -#include "../tools/testing/selftests/kselftest_module.h" - #define BUF_SIZE 1024 -KSTM_MODULE_GLOBALS(); -static char *test_buffer __initdata; -static char *fmt_buffer __initdata; -static struct rnd_state rnd_state __initdata; +static char *test_buffer; +static char *fmt_buffer; +static struct rnd_state rnd_state; -typedef int (*check_fn)(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap); +typedef void (*check_fn)(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap); -static void __scanf(6, 8) __init -_test(const char *file, const int line, check_fn fn, const void *check_data, const char *string, - const char *fmt, int n_args, ...) +static void __scanf(7, 9) +_test(struct kunit *test, const char *file, const int line, check_fn fn, const void *check_data, + const char *string, const char *fmt, int n_args, ...) { va_list ap, ap_copy; int ret; - total_tests++; - va_start(ap, n_args); va_copy(ap_copy, ap); ret = vsscanf(string, fmt, ap_copy); va_end(ap_copy); if (ret != n_args) { - pr_warn("%s:%d: vsscanf(\"%s\", \"%s\", ...) returned %d expected %d\n", - file, line, string, fmt, ret, n_args); - goto fail; + KUNIT_FAIL(test, "%s:%d: vsscanf(\"%s\", \"%s\", ...) returned %d expected %d", + file, line, string, fmt, ret, n_args); + } else { + (*fn)(test, file, line, check_data, string, fmt, n_args, ap); } - ret = (*fn)(file, line, check_data, string, fmt, n_args, ap); - if (ret) - goto fail; - - va_end(ap); - - return; - -fail: - failed_tests++; va_end(ap); } @@ -65,88 +49,92 @@ do { \ for (; n_args > 0; n_args--, expect++) { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ if (got != *expect) { \ - pr_warn("%s:%d, vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ - file, line, str, fmt, *expect, got); \ - return 1; \ + KUNIT_FAIL(test, \ + "%s:%d: vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt, \ + file, line, str, fmt, *expect, got); \ + return; \ } \ } \ - return 0; \ } while (0) -static int __init check_ull(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ull(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned long long *pval = check_data; _check_numbers_template("%llu", pval, string, fmt, n_args, ap); } -static int __init check_ll(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ll(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long long *pval = check_data; _check_numbers_template("%lld", pval, string, fmt, n_args, ap); } -static int __init check_ulong(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ulong(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const unsigned long *pval = check_data; _check_numbers_template("%lu", pval, string, fmt, n_args, ap); } -static int __init check_long(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_long(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long *pval = check_data; _check_numbers_template("%ld", pval, string, fmt, n_args, ap); } -static int __init check_uint(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_uint(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned int *pval = check_data; _check_numbers_template("%u", pval, string, fmt, n_args, ap); } -static int __init check_int(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_int(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const int *pval = check_data; _check_numbers_template("%d", pval, string, fmt, n_args, ap); } -static int __init check_ushort(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ushort(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const unsigned short *pval = check_data; _check_numbers_template("%hu", pval, string, fmt, n_args, ap); } -static int __init check_short(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_short(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const short *pval = check_data; _check_numbers_template("%hd", pval, string, fmt, n_args, ap); } -static int __init check_uchar(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_uchar(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const unsigned char *pval = check_data; _check_numbers_template("%hhu", pval, string, fmt, n_args, ap); } -static int __init check_char(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_char(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const signed char *pval = check_data; @@ -154,7 +142,7 @@ static int __init check_char(const char *file, const int line, const void *check } /* Selection of interesting numbers to test, copied from test-kstrtox.c */ -static const unsigned long long numbers[] __initconst = { +static const unsigned long long numbers[] = { 0x0ULL, 0x1ULL, 0x7fULL, @@ -194,7 +182,7 @@ do { \ T result = ~expect_val; /* should be overwritten */ \ \ snprintf(test_buffer, BUF_SIZE, gen_fmt, expect_val); \ - _test(__FILE__, __LINE__, fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result); \ + _test(test, __FILE__, __LINE__, fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result);\ } while (0) #define simple_numbers_loop(T, gen_fmt, scan_fmt, fn) \ @@ -212,7 +200,7 @@ do { \ } \ } while (0) -static void __init numbers_simple(void) +static void numbers_simple(struct kunit *test) { simple_numbers_loop(unsigned long long, "%llu", "llu", check_ull); simple_numbers_loop(long long, "%lld", "lld", check_ll); @@ -265,14 +253,14 @@ static void __init numbers_simple(void) * the raw prandom*() functions (Not mathematically rigorous!!). * Variabilty of length and value is more important than perfect randomness. */ -static u32 __init next_test_random(u32 max_bits) +static u32 next_test_random(u32 max_bits) { u32 n_bits = hweight32(prandom_u32_state(&rnd_state)) % (max_bits + 1); return prandom_u32_state(&rnd_state) & GENMASK(n_bits, 0); } -static unsigned long long __init next_test_random_ull(void) +static unsigned long long next_test_random_ull(void) { u32 rand1 = prandom_u32_state(&rnd_state); u32 n_bits = (hweight32(rand1) * 3) % 64; @@ -309,7 +297,7 @@ do { \ * updating buf_pos and returning the number of characters appended. * On error buf_pos is not changed and return value is 0. */ -static int __init __printf(4, 5) +static int __printf(4, 5) append_fmt(char *buf, int *buf_pos, int buf_len, const char *val_fmt, ...) { va_list ap; @@ -331,7 +319,7 @@ append_fmt(char *buf, int *buf_pos, int buf_len, const char *val_fmt, ...) * Convenience function to append the field delimiter string * to both the value string and format string buffers. */ -static void __init append_delim(char *str_buf, int *str_buf_pos, int str_buf_len, +static void append_delim(char *str_buf, int *str_buf_pos, int str_buf_len, char *fmt_buf, int *fmt_buf_pos, int fmt_buf_len, const char *delim_str) { @@ -342,7 +330,7 @@ static void __init append_delim(char *str_buf, int *str_buf_pos, int str_buf_len #define test_array_8(fn, check_data, string, fmt, arr) \ do { \ BUILD_BUG_ON(ARRAY_SIZE(arr) != 8); \ - _test(__FILE__, __LINE__, fn, check_data, string, fmt, 8, \ + _test(test, __FILE__, __LINE__, fn, check_data, string, fmt, 8, \ &(arr)[0], &(arr)[1], &(arr)[2], &(arr)[3], \ &(arr)[4], &(arr)[5], &(arr)[6], &(arr)[7]); \ } while (0) @@ -396,7 +384,7 @@ do { \ test_array_8(fn, expect, test_buffer, fmt_buffer, result); \ } while (0) -static void __init numbers_list_ll(const char *delim) +static void numbers_list_ll(struct kunit *test, const char *delim) { numbers_list_8(unsigned long long, "%llu", delim, "llu", check_ull); numbers_list_8(long long, "%lld", delim, "lld", check_ll); @@ -406,7 +394,7 @@ static void __init numbers_list_ll(const char *delim) numbers_list_8(long long, "0x%llx", delim, "lli", check_ll); } -static void __init numbers_list_l(const char *delim) +static void numbers_list_l(struct kunit *test, const char *delim) { numbers_list_8(unsigned long, "%lu", delim, "lu", check_ulong); numbers_list_8(long, "%ld", delim, "ld", check_long); @@ -416,7 +404,7 @@ static void __init numbers_list_l(const char *delim) numbers_list_8(long, "0x%lx", delim, "li", check_long); } -static void __init numbers_list_d(const char *delim) +static void numbers_list_d(struct kunit *test, const char *delim) { numbers_list_8(unsigned int, "%u", delim, "u", check_uint); numbers_list_8(int, "%d", delim, "d", check_int); @@ -426,7 +414,7 @@ static void __init numbers_list_d(const char *delim) numbers_list_8(int, "0x%x", delim, "i", check_int); } -static void __init numbers_list_h(const char *delim) +static void numbers_list_h(struct kunit *test, const char *delim) { numbers_list_8(unsigned short, "%hu", delim, "hu", check_ushort); numbers_list_8(short, "%hd", delim, "hd", check_short); @@ -436,7 +424,7 @@ static void __init numbers_list_h(const char *delim) numbers_list_8(short, "0x%hx", delim, "hi", check_short); } -static void __init numbers_list_hh(const char *delim) +static void numbers_list_hh(struct kunit *test, const char *delim) { numbers_list_8(unsigned char, "%hhu", delim, "hhu", check_uchar); numbers_list_8(signed char, "%hhd", delim, "hhd", check_char); @@ -446,16 +434,16 @@ static void __init numbers_list_hh(const char *delim) numbers_list_8(signed char, "0x%hhx", delim, "hhi", check_char); } -static void __init numbers_list(const char *delim) +static void numbers_list(struct kunit *test, const char *delim) { - numbers_list_ll(delim); - numbers_list_l(delim); - numbers_list_d(delim); - numbers_list_h(delim); - numbers_list_hh(delim); + numbers_list_ll(test, delim); + numbers_list_l(test, delim); + numbers_list_d(test, delim); + numbers_list_h(test, delim); + numbers_list_hh(test, delim); } -static void __init numbers_list_field_width_ll(const char *delim) +static void numbers_list_field_width_ll(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned long long, "%llu", delim, 20, "llu", check_ull); numbers_list_fix_width(long long, "%lld", delim, 20, "lld", check_ll); @@ -465,7 +453,7 @@ static void __init numbers_list_field_width_ll(const char *delim) numbers_list_fix_width(long long, "0x%llx", delim, 18, "lli", check_ll); } -static void __init numbers_list_field_width_l(const char *delim) +static void numbers_list_field_width_l(struct kunit *test, const char *delim) { #if BITS_PER_LONG == 64 numbers_list_fix_width(unsigned long, "%lu", delim, 20, "lu", check_ulong); @@ -484,7 +472,7 @@ static void __init numbers_list_field_width_l(const char *delim) #endif } -static void __init numbers_list_field_width_d(const char *delim) +static void numbers_list_field_width_d(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned int, "%u", delim, 10, "u", check_uint); numbers_list_fix_width(int, "%d", delim, 11, "d", check_int); @@ -494,7 +482,7 @@ static void __init numbers_list_field_width_d(const char *delim) numbers_list_fix_width(int, "0x%x", delim, 10, "i", check_int); } -static void __init numbers_list_field_width_h(const char *delim) +static void numbers_list_field_width_h(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned short, "%hu", delim, 5, "hu", check_ushort); numbers_list_fix_width(short, "%hd", delim, 6, "hd", check_short); @@ -504,7 +492,7 @@ static void __init numbers_list_field_width_h(const char *delim) numbers_list_fix_width(short, "0x%hx", delim, 6, "hi", check_short); } -static void __init numbers_list_field_width_hh(const char *delim) +static void numbers_list_field_width_hh(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned char, "%hhu", delim, 3, "hhu", check_uchar); numbers_list_fix_width(signed char, "%hhd", delim, 4, "hhd", check_char); @@ -518,16 +506,16 @@ static void __init numbers_list_field_width_hh(const char *delim) * List of numbers separated by delim. Each field width specifier is the * maximum possible digits for the given type and base. */ -static void __init numbers_list_field_width_typemax(const char *delim) +static void numbers_list_field_width_typemax(struct kunit *test, const char *delim) { - numbers_list_field_width_ll(delim); - numbers_list_field_width_l(delim); - numbers_list_field_width_d(delim); - numbers_list_field_width_h(delim); - numbers_list_field_width_hh(delim); + numbers_list_field_width_ll(test, delim); + numbers_list_field_width_l(test, delim); + numbers_list_field_width_d(test, delim); + numbers_list_field_width_h(test, delim); + numbers_list_field_width_hh(test, delim); } -static void __init numbers_list_field_width_val_ll(const char *delim) +static void numbers_list_field_width_val_ll(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned long long, "%llu", delim, "llu", check_ull); numbers_list_val_width(long long, "%lld", delim, "lld", check_ll); @@ -537,7 +525,7 @@ static void __init numbers_list_field_width_val_ll(const char *delim) numbers_list_val_width(long long, "0x%llx", delim, "lli", check_ll); } -static void __init numbers_list_field_width_val_l(const char *delim) +static void numbers_list_field_width_val_l(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned long, "%lu", delim, "lu", check_ulong); numbers_list_val_width(long, "%ld", delim, "ld", check_long); @@ -547,7 +535,7 @@ static void __init numbers_list_field_width_val_l(const char *delim) numbers_list_val_width(long, "0x%lx", delim, "li", check_long); } -static void __init numbers_list_field_width_val_d(const char *delim) +static void numbers_list_field_width_val_d(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned int, "%u", delim, "u", check_uint); numbers_list_val_width(int, "%d", delim, "d", check_int); @@ -557,7 +545,7 @@ static void __init numbers_list_field_width_val_d(const char *delim) numbers_list_val_width(int, "0x%x", delim, "i", check_int); } -static void __init numbers_list_field_width_val_h(const char *delim) +static void numbers_list_field_width_val_h(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned short, "%hu", delim, "hu", check_ushort); numbers_list_val_width(short, "%hd", delim, "hd", check_short); @@ -567,7 +555,7 @@ static void __init numbers_list_field_width_val_h(const char *delim) numbers_list_val_width(short, "0x%hx", delim, "hi", check_short); } -static void __init numbers_list_field_width_val_hh(const char *delim) +static void numbers_list_field_width_val_hh(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned char, "%hhu", delim, "hhu", check_uchar); numbers_list_val_width(signed char, "%hhd", delim, "hhd", check_char); @@ -581,13 +569,13 @@ static void __init numbers_list_field_width_val_hh(const char *delim) * List of numbers separated by delim. Each field width specifier is the * exact length of the corresponding value digits in the string being scanned. */ -static void __init numbers_list_field_width_val_width(const char *delim) +static void numbers_list_field_width_val_width(struct kunit *test, const char *delim) { - numbers_list_field_width_val_ll(delim); - numbers_list_field_width_val_l(delim); - numbers_list_field_width_val_d(delim); - numbers_list_field_width_val_h(delim); - numbers_list_field_width_val_hh(delim); + numbers_list_field_width_val_ll(test, delim); + numbers_list_field_width_val_l(test, delim); + numbers_list_field_width_val_d(test, delim); + numbers_list_field_width_val_h(test, delim); + numbers_list_field_width_val_hh(test, delim); } /* @@ -596,9 +584,9 @@ static void __init numbers_list_field_width_val_width(const char *delim) * of digits. For example the hex values c0,3,bf01,303 would have a * string representation of "c03bf01303" and extracted with "%2x%1x%4x%3x". */ -static void __init numbers_slice(void) +static void numbers_slice(struct kunit *test) { - numbers_list_field_width_val_width(""); + numbers_list_field_width_val_width(test, ""); } #define test_number_prefix(T, str, scan_fmt, expect0, expect1, n_args, fn) \ @@ -606,14 +594,14 @@ do { \ const T expect[2] = { expect0, expect1 }; \ T result[2] = { (T)~expect[0], (T)~expect[1] }; \ \ - _test(__FILE__, __LINE__, fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]); \ + _test(test, __FILE__, __LINE__, fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]);\ } while (0) /* * Number prefix is >= field width. * Expected behaviour is derived from testing userland sscanf. */ -static void __init numbers_prefix_overflow(void) +static void numbers_prefix_overflow(struct kunit *test) { /* * Negative decimal with a field of width 1, should quit scanning @@ -682,24 +670,17 @@ do { \ T got; \ char *endp; \ int len; \ - bool fail = false; \ \ - total_tests++; \ len = snprintf(test_buffer, BUF_SIZE, gen_fmt, expect); \ got = (fn)(test_buffer, &endp, base); \ if (got != (expect)) { \ - fail = true; \ - pr_warn(#fn "(\"%s\", %d): got " gen_fmt " expected " gen_fmt "\n", \ - test_buffer, base, got, expect); \ + KUNIT_FAIL(test, #fn "(\"%s\", %d): got " gen_fmt " expected " gen_fmt, \ + test_buffer, base, got, expect); \ } else if (endp != test_buffer + len) { \ - fail = true; \ - pr_warn(#fn "(\"%s\", %d) startp=0x%px got endp=0x%px expected 0x%px\n", \ - test_buffer, base, test_buffer, \ - test_buffer + len, endp); \ + KUNIT_FAIL(test, #fn "(\"%s\", %d) startp=0x%px got endp=0x%px expected 0x%px", \ + test_buffer, base, test_buffer, \ + test_buffer + len, endp); \ } \ - \ - if (fail) \ - failed_tests++; \ } while (0) #define test_simple_strtoxx(T, fn, gen_fmt, base) \ @@ -715,7 +696,7 @@ do { \ } \ } while (0) -static void __init test_simple_strtoull(void) +static void test_simple_strtoull(struct kunit *test) { test_simple_strtoxx(unsigned long long, simple_strtoull, "%llu", 10); test_simple_strtoxx(unsigned long long, simple_strtoull, "%llu", 0); @@ -724,7 +705,7 @@ static void __init test_simple_strtoull(void) test_simple_strtoxx(unsigned long long, simple_strtoull, "0x%llx", 0); } -static void __init test_simple_strtoll(void) +static void test_simple_strtoll(struct kunit *test) { test_simple_strtoxx(long long, simple_strtoll, "%lld", 10); test_simple_strtoxx(long long, simple_strtoll, "%lld", 0); @@ -733,7 +714,7 @@ static void __init test_simple_strtoll(void) test_simple_strtoxx(long long, simple_strtoll, "0x%llx", 0); } -static void __init test_simple_strtoul(void) +static void test_simple_strtoul(struct kunit *test) { test_simple_strtoxx(unsigned long, simple_strtoul, "%lu", 10); test_simple_strtoxx(unsigned long, simple_strtoul, "%lu", 0); @@ -742,7 +723,7 @@ static void __init test_simple_strtoul(void) test_simple_strtoxx(unsigned long, simple_strtoul, "0x%lx", 0); } -static void __init test_simple_strtol(void) +static void test_simple_strtol(struct kunit *test) { test_simple_strtoxx(long, simple_strtol, "%ld", 10); test_simple_strtoxx(long, simple_strtol, "%ld", 0); @@ -752,35 +733,35 @@ static void __init test_simple_strtol(void) } /* Selection of common delimiters/separators between numbers in a string. */ -static const char * const number_delimiters[] __initconst = { +static const char * const number_delimiters[] = { " ", ":", ",", "-", "/", }; -static void __init test_numbers(void) +static void test_numbers(struct kunit *test) { int i; /* String containing only one number. */ - numbers_simple(); + numbers_simple(test); /* String with multiple numbers separated by delimiter. */ for (i = 0; i < ARRAY_SIZE(number_delimiters); i++) { - numbers_list(number_delimiters[i]); + numbers_list(test, number_delimiters[i]); /* Field width may be longer than actual field digits. */ - numbers_list_field_width_typemax(number_delimiters[i]); + numbers_list_field_width_typemax(test, number_delimiters[i]); /* Each field width exactly length of actual field digits. */ - numbers_list_field_width_val_width(number_delimiters[i]); + numbers_list_field_width_val_width(test, number_delimiters[i]); } /* Slice continuous sequence of digits using field widths. */ - numbers_slice(); + numbers_slice(test); - numbers_prefix_overflow(); + numbers_prefix_overflow(test); } -static void __init selftest(void) +static void scanf_test(struct kunit *test) { test_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!test_buffer) @@ -794,18 +775,29 @@ static void __init selftest(void) prandom_seed_state(&rnd_state, 3141592653589793238ULL); - test_numbers(); + test_numbers(test); - test_simple_strtoull(); - test_simple_strtoll(); - test_simple_strtoul(); - test_simple_strtol(); + test_simple_strtoull(test); + test_simple_strtoll(test); + test_simple_strtoul(test); + test_simple_strtol(test); kfree(fmt_buffer); kfree(test_buffer); } -KSTM_MODULE_LOADERS(test_scanf); +static struct kunit_case scanf_test_cases[] = { + KUNIT_CASE(scanf_test), + {} +}; + +static struct kunit_suite scanf_test_suite = { + .name = "scanf", + .test_cases = scanf_test_cases, +}; + +kunit_test_suite(scanf_test_suite); + MODULE_AUTHOR("Richard Fitzgerald "); MODULE_DESCRIPTION("Test cases for sscanf facility"); MODULE_LICENSE("GPL v2"); diff --git a/tools/testing/selftests/lib/Makefile b/tools/testing/selftests/lib/Makefile index 66dcbe2e39fa..dda63c32c0f0 100644 --- a/tools/testing/selftests/lib/Makefile +++ b/tools/testing/selftests/lib/Makefile @@ -4,5 +4,5 @@ # No binaries, but make sure arg-less "make" doesn't trigger "run_tests" all: -TEST_PROGS := printf.sh bitmap.sh scanf.sh +TEST_PROGS := printf.sh bitmap.sh include ../lib.mk diff --git a/tools/testing/selftests/lib/config b/tools/testing/selftests/lib/config index 306a3d4dca98..1d17fa85de8f 100644 --- a/tools/testing/selftests/lib/config +++ b/tools/testing/selftests/lib/config @@ -1,4 +1,3 @@ CONFIG_TEST_PRINTF=m -CONFIG_TEST_SCANF=m CONFIG_TEST_BITMAP=m CONFIG_TEST_BITOPS=m diff --git a/tools/testing/selftests/lib/scanf.sh b/tools/testing/selftests/lib/scanf.sh deleted file mode 100755 index b59b8ba561c3..000000000000 --- a/tools/testing/selftests/lib/scanf.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Tests the scanf infrastructure using test_scanf kernel module. -$(dirname $0)/../kselftest/module.sh "scanf" test_scanf From patchwork Fri Mar 7 11:27:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 14006323 Received: from mail-qv1-f53.google.com (mail-qv1-f53.google.com [209.85.219.53]) (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 B6B5F218AC3; Fri, 7 Mar 2025 11:27:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346880; cv=none; b=ZJIJKOl+NXjrZOdVaeqWORo8+LOe6doBmPYt7GOhlRKl/pGmvBvWWd52kiE625OxY4ZgNh7fBasOKKittHOgAsXmdRsiTbfjlxDE5CtfXgEm78VDn3GlYTng/huG4FIrOd/DR3j2JHP8XT0T5mkksmByh3dIA6NAsmkljXrS9Fw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346880; c=relaxed/simple; bh=jPDi4O/0gzr8AA3nOlR2uQcvGYlMJqx/kSoTPPODlqw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o03ssWdwLU9mmfE416Jn+fcAg3Q896uS/UxKaoOgITeJZL6snbnNSr5gX+OYAhguWlu3M3pnOGp76mB0vSU4D9uY3lzLKBa703cwNKBxrcU6dbFOyLdG9AEL9qTQDNwso/1ZEjDc9iHsdyhi3Ad4PPKwacLcFy1NGXgx4CHbx/A= 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=VEYRMH70; arc=none smtp.client-ip=209.85.219.53 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="VEYRMH70" Received: by mail-qv1-f53.google.com with SMTP id 6a1803df08f44-6e8f254b875so13150846d6.1; Fri, 07 Mar 2025 03:27:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741346874; x=1741951674; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=WmEtBG3++BrDY8zHLVCnDV8Bx3aQKhFduVfIbo1A7yg=; b=VEYRMH70c02XfqJtR8Gm1xOy45X99FyzRvl/e7Co5jvso7IavtqFzglpFy132V7KZP lXoorZYGLIOnPNPB0WqLpwTGOB4dhNrBJuF+UdoGOfJUqcnVWzfWz4soYe/n5mPFySp5 5xYfshOo3s/K44iwAinZ4QfxEQAsCnaAo3lwvu7OJ+NDUvmdr90IpXOxRsnndx/q2RrG lpxnBzMQcGrWJB5s4jerw4yQ3Flve31/zs7egX7WvspnLsEfi7DeKNtBbpKCRtlADJIq sex1oEY2ogyWDPW7wuCKwtulxTQ0tuUedPP4Xtzk9RJOPkaZE+nsbWzB19TiCs5BP9Ti YwXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741346874; x=1741951674; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WmEtBG3++BrDY8zHLVCnDV8Bx3aQKhFduVfIbo1A7yg=; b=hSjRkB9E1B+F6DSlJIson7rQFtKXYggzhJb+a1AaoPN9K5CICn0PGG/Va/DSFSpCHW tER5KlAJWehQqWh+MbF5EAB2vjj8UhgDFQDhKTfESKSObqx9IJQA4CKpmf36/Vg+3YYe +zyk73ieXCZSV2WM68/qb6eiu6mDhXw5zfeZ7HP5EplEMGIHOCNfMmR4rEdwMWpXiA3G cGDmwcf2zL2vDhRQhHa7uLcEVX5fBkXn9E8VvNutCQECkfOE6EBT2Nmy55srzRYxk1oP LmX7AvSGfBn1MXt60dImoJaOIzIfSBsW4LxWkZiAf7cu71q/5RSgNTzzt3pbsonnKF7Q w+IA== X-Forwarded-Encrypted: i=1; AJvYcCV68YIEprYVm7uR3IOhEkTAknY34NBl3W0fIM3wZq/4Aovk2ftZTJkFBtA4KO3VJu0PKwyDixIv4SivQ5qwgDd/@vger.kernel.org, AJvYcCXbM5Zc4X609XJViI/Zk7cZ2AndNKcDZKmu5pPbvPToxVBK0Pub+A4KwLQD5cMTJLkiREKZM3Oja5p/RUU=@vger.kernel.org X-Gm-Message-State: AOJu0YzFbfUQ+cMmtyBd2NwvhpRAo12rg0IPxEktyfW3Bs/c9fdwITLj uf14eQnyXwHWQPGJwW0dm4icUzaR3qa0HJJ8gQmtE3jivgzYq9a5DBv/aso1Q7Y= X-Gm-Gg: ASbGncu0fbL7/Frk3aQg0XsUTTWPPb1kDQg/rolrmfDSxH75FqausYHp+KwrLdYtyaV ilT+SOpd5UW2hjTpGdEQDzsPCjXYp5pRi6hdki0lbQl/hb70B/yPK+3poiBoY00+lupD5E3f41B atlS7un3Y2FqJDw8TEyYM9cp1PYgsa73vi/0bSD700+vNxWLksBjfCyLU3wUI7XgFXFRWnYsJpF vgZZVLg4M38VdTUBwKv5gtL0aCY5DjldkYWh6k807o4CVfrrIpEGNPCwAD82Z2WVKDxb638hrVm wlzRJ4+0R5hxIDnTmnHfg9IlRey3Zwchsm+UbY8TlRcLI1ZXLt5YwheRCBzFugawkgw= X-Google-Smtp-Source: AGHT+IEl8KUDSEiJVuaJBtf+4CkyxC17rhLhsKu9ZcFRgUVYyLXP1aIjWRNK9jZNKWPDQ5YRn+WSuw== X-Received: by 2002:a05:6214:1d02:b0:6e8:ebc6:fd5f with SMTP id 6a1803df08f44-6e9006326e9mr42657496d6.20.1741346874602; Fri, 07 Mar 2025 03:27:54 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:f0dd:49a0:8ab6:b3b6]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e8f70a446dsm18509416d6.56.2025.03.07.03.27.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Mar 2025 03:27:54 -0800 (PST) From: Tamir Duberstein Date: Fri, 07 Mar 2025 06:27:37 -0500 Subject: [PATCH v9 4/6] scanf: break kunit into test cases Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250307-scanf-kunit-convert-v9-4-b98820fa39ff@gmail.com> References: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> In-Reply-To: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Use `suite_init` and move some tests into `scanf_test_cases`. This gives us nicer output in the event of a failure. Reviewed-by: David Gow Signed-off-by: Tamir Duberstein --- lib/tests/scanf_kunit.c | 82 ++++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/lib/tests/scanf_kunit.c b/lib/tests/scanf_kunit.c index 94eb5ec80fdb..e9a36ed80575 100644 --- a/lib/tests/scanf_kunit.c +++ b/lib/tests/scanf_kunit.c @@ -434,8 +434,11 @@ static void numbers_list_hh(struct kunit *test, const char *delim) numbers_list_8(signed char, "0x%hhx", delim, "hhi", check_char); } -static void numbers_list(struct kunit *test, const char *delim) +static void numbers_list(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_ll(test, delim); numbers_list_l(test, delim); numbers_list_d(test, delim); @@ -506,8 +509,11 @@ static void numbers_list_field_width_hh(struct kunit *test, const char *delim) * List of numbers separated by delim. Each field width specifier is the * maximum possible digits for the given type and base. */ -static void numbers_list_field_width_typemax(struct kunit *test, const char *delim) +static void numbers_list_field_width_typemax(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_field_width_ll(test, delim); numbers_list_field_width_l(test, delim); numbers_list_field_width_d(test, delim); @@ -569,8 +575,11 @@ static void numbers_list_field_width_val_hh(struct kunit *test, const char *deli * List of numbers separated by delim. Each field width specifier is the * exact length of the corresponding value digits in the string being scanned. */ -static void numbers_list_field_width_val_width(struct kunit *test, const char *delim) +static void numbers_list_field_width_val_width(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_field_width_val_ll(test, delim); numbers_list_field_width_val_l(test, delim); numbers_list_field_width_val_d(test, delim); @@ -586,7 +595,12 @@ static void numbers_list_field_width_val_width(struct kunit *test, const char *d */ static void numbers_slice(struct kunit *test) { - numbers_list_field_width_val_width(test, ""); + const char *delim = ""; + + KUNIT_ASSERT_PTR_EQ(test, test->param_value, NULL); + test->param_value = &delim; + + numbers_list_field_width_val_width(test); } #define test_number_prefix(T, str, scan_fmt, expect0, expect1, n_args, fn) \ @@ -737,62 +751,60 @@ static const char * const number_delimiters[] = { " ", ":", ",", "-", "/", }; -static void test_numbers(struct kunit *test) +static void number_delimiter_param_desc(const char * const *param, + char *desc) { - int i; + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "\"%s\"", *param); +} - /* String containing only one number. */ - numbers_simple(test); +KUNIT_ARRAY_PARAM(number_delimiters, number_delimiters, number_delimiter_param_desc); +static struct kunit_case scanf_test_cases[] = { + KUNIT_CASE(numbers_simple), /* String with multiple numbers separated by delimiter. */ - for (i = 0; i < ARRAY_SIZE(number_delimiters); i++) { - numbers_list(test, number_delimiters[i]); - - /* Field width may be longer than actual field digits. */ - numbers_list_field_width_typemax(test, number_delimiters[i]); - - /* Each field width exactly length of actual field digits. */ - numbers_list_field_width_val_width(test, number_delimiters[i]); - } - + KUNIT_CASE_PARAM(numbers_list, number_delimiters_gen_params), + /* Field width may be longer than actual field digits. */ + KUNIT_CASE_PARAM(numbers_list_field_width_typemax, number_delimiters_gen_params), + /* Each field width exactly length of actual field digits. */ + KUNIT_CASE_PARAM(numbers_list_field_width_val_width, number_delimiters_gen_params), /* Slice continuous sequence of digits using field widths. */ - numbers_slice(test); + KUNIT_CASE(numbers_slice), + KUNIT_CASE(numbers_prefix_overflow), - numbers_prefix_overflow(test); -} + KUNIT_CASE(test_simple_strtoull), + KUNIT_CASE(test_simple_strtoll), + KUNIT_CASE(test_simple_strtoul), + KUNIT_CASE(test_simple_strtol), + {} +}; -static void scanf_test(struct kunit *test) +static int scanf_suite_init(struct kunit_suite *suite) { test_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!test_buffer) - return; + return -ENOMEM; fmt_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!fmt_buffer) { kfree(test_buffer); - return; + return -ENOMEM; } prandom_seed_state(&rnd_state, 3141592653589793238ULL); - test_numbers(test); - - test_simple_strtoull(test); - test_simple_strtoll(test); - test_simple_strtoul(test); - test_simple_strtol(test); + return 0; +} +static void scanf_suite_exit(struct kunit_suite *suite) +{ kfree(fmt_buffer); kfree(test_buffer); } -static struct kunit_case scanf_test_cases[] = { - KUNIT_CASE(scanf_test), - {} -}; - static struct kunit_suite scanf_test_suite = { .name = "scanf", + .suite_init = scanf_suite_init, + .suite_exit = scanf_suite_exit, .test_cases = scanf_test_cases, }; From patchwork Fri Mar 7 11:27:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 14006322 Received: from mail-qt1-f182.google.com (mail-qt1-f182.google.com [209.85.160.182]) (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 62134218AB9; Fri, 7 Mar 2025 11:27:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346880; cv=none; b=dbPuFSe5Du8MM+EoYs09aeOJhIiUT2INwoVJFr6+vGX+C5dGyLqBM3D5o3phWgYALeMrgEVVlZ811HMDfQJ725AElljtYSX0XEUeT9odssFENTC8qbg9zb5bsijGMO+ry6+crgsvJDhwbuzV7XTNIZZnpBp/gXf8QvZntJuCtwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346880; c=relaxed/simple; bh=XAPt2hMRpJcoX7Q/8QZUNRBbEIb2Ha291wFDULtaVjU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=szEWD4AOs53Ae//cGKTva4wn2hMzQ4F0TP4mrVSj+kgP63FnGC+K4GUCxvWKAQxqZZnjBLhr61j1Qj8HsRj5NpuKwRxukhgUchsG4gkO8tp5cORiRShmGs9krN282+wcOSGLNKtjFkr9a8T19PicdNR0ZNWR0bRZQTX1zE3zNEM= 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=ihGuXyDm; arc=none smtp.client-ip=209.85.160.182 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="ihGuXyDm" Received: by mail-qt1-f182.google.com with SMTP id d75a77b69052e-4750bc8d102so17088781cf.1; Fri, 07 Mar 2025 03:27:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741346876; x=1741951676; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=31PomiHHU86LsHEGynVcWWWqYDG8021vY4wNIw/Q+wI=; b=ihGuXyDm3jsXXfB/01l8c5ZTvxn9+UvjfrABPUih99lpQBpRK0ej3quKZm7f2SCpBK sz0tnsRYmCJfXMCFUT7NkRH3vGdCh2OteCU6Zyrg1xpx/BH0PcdbtHZIIzHNkr/c3qrI BpitiK6XCKhd5FOx3OsHJvOGOjoX1VcLqdIHUpahV2qB2IG76Cs5x5alVcRtz4gQG3dl jTUrG/X3JroZYlaadUrSusFTEtKWZ+N6V1VLE9C+x7hjib56h4YH/sU0uP98LE9ksSfn pFg1LEItlzXywsmsR7gLQlyk41dAhAbHOlcWVX1lej2TkhikkZeyYBTR+/HWbwIBGZHU NBaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741346876; x=1741951676; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=31PomiHHU86LsHEGynVcWWWqYDG8021vY4wNIw/Q+wI=; b=QpFtu1y6lh2iz+ziwmymG64fnbwoIX6e2Bh0NBF1opqlq+zO7aQ9azKxU9ESwJZHo0 m472lnAHQMENrOVx9KTPQZ/cgViDwh3rUs/qCaR8Sr0FW1bFabT11s5DQMJ8j8V93tf9 5jYDoSeoFFoFDWHb+I9/pXqIsC3DW4VFSoWYfq7DN/Ed1qfI3fUBFuIetH7gJzV/6B9O ZotBYQ8XEra4tHbVXLFcJnX6YXCziwl52lo29aIXwCK6Bm8ApSoBswkPIPoPJDsseEyQ flSTwDlG4PdLS7qLIQRbt4q2m/V5QxmbRlzCu2W/xRCiSbQIIN2snLKk6/UwD0EaoAn2 uajw== X-Forwarded-Encrypted: i=1; AJvYcCUVNRIQmfmCkjKdMSgRDKZIu5W6t0zNnGhBflCyIM32eUdnWyXVK1eVYtIYdP3ybaKXeewd5v6cYg2OTCzdmOa4@vger.kernel.org, AJvYcCXwYezGDtO/UmxqwQRdagCtwlCY9+MByQVUYZxz/43F2lP/H5OWGEvJr7poo7JvdJIaECBjQYi8rwpM+dI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy56g/WHq40amnU/mhBbBPgWVTAoidEX/1JO9+Dc6sNHF8/SMi/ MJ+FtkyYfD18ybUG/tlJjPwMF8xLVn07sMTD9PwpZ5uH0j9LaARlA/B97EtaguE= X-Gm-Gg: ASbGnctItkHCA6db5+Nh6clIb+ThshVn9GEk8Z6cJMS5yltEsHAUDscJiigZjBsPjcC mqZ1gbnOjz+etrKtWIv7sKuz9IqrFZCe1ILt64Uv048j4WyZxmndbh7xofW4As1v4xuSg3zIyk0 XRrla5c7VI+9R8kE3crNORjWkEEypfseAeIK5sSeVsk8kO8G4WMqKTp4plBkbOs/jsyD1j01qcI 70dedkELrs5iasHwF0rriLQrS7DSpL+rLl21J42nahrkn87GWy0idVh2Oyw595FrQRkm4egUUpu DRuKhqyCrxGzSvRoGhV4Yv8Ghk+u2ABc0BVvVvx/ps1xq+uMfJANE5kyAVwNHuP8vDw= X-Google-Smtp-Source: AGHT+IEqhaq3ZgA/0PcbCayAXpD+pLQMctKa8GTROYQoX8uqkKxEST1IZc507Aqnlx5ErlKEPTvBSA== X-Received: by 2002:ad4:500c:0:b0:6e6:6c7c:984a with SMTP id 6a1803df08f44-6e9006776admr24793786d6.29.1741346876387; Fri, 07 Mar 2025 03:27:56 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:f0dd:49a0:8ab6:b3b6]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e8f70a446dsm18509416d6.56.2025.03.07.03.27.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Mar 2025 03:27:55 -0800 (PST) From: Tamir Duberstein Date: Fri, 07 Mar 2025 06:27:38 -0500 Subject: [PATCH v9 5/6] scanf: tidy header `#include`s Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250307-scanf-kunit-convert-v9-5-b98820fa39ff@gmail.com> References: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> In-Reply-To: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Remove the unused `kernel.h`. Replace `string.h` with `sprintf.h` as the former doesn't seem to be used directly. Signed-off-by: Tamir Duberstein --- lib/tests/scanf_kunit.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/tests/scanf_kunit.c b/lib/tests/scanf_kunit.c index e9a36ed80575..d96d7ca85b52 100644 --- a/lib/tests/scanf_kunit.c +++ b/lib/tests/scanf_kunit.c @@ -5,12 +5,11 @@ #include #include -#include #include #include #include #include -#include +#include #define BUF_SIZE 1024 From patchwork Fri Mar 7 11:27:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 14006324 Received: from mail-qv1-f46.google.com (mail-qv1-f46.google.com [209.85.219.46]) (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 CA94D218AC4; Fri, 7 Mar 2025 11:28:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346883; cv=none; b=IpU8ZCNKv3+M/Dfh4X+gj/Y8oEdo02M7+10fnjymPpJiLXL/MBSrLnS1rEewhDlhqqWWDg3R4Mb4mQBF95B70oz6ktZZAaqM+Zu5LpkonuMD3kgQjWzQlhxn3xjKnLMsVIcSiTwPXXdl4xDqgV9/U8xRQI6W1udw/Ot1LtKRiIM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741346883; c=relaxed/simple; bh=WMRpjACzk4VO0An9XD7k3Ws5EqbeN/Qdyl5iBDK/vAI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hzXhNqjJVm9zfY0JB4QFwrFXyuao0kGlVi3uaM8ieeLef4yaIR/kbaS4kxWKUTFiCuWknVdK9SCP5NJktM0HKVN5IORELUYDPbEKe2FJCxMJRjbVR/bp91MPR4lB4xSK5Ufl1+mwpPgsHzY8VPJ8kYeIsGosCxqn8z1LUlg9EGY= 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=VuZ7/pji; arc=none smtp.client-ip=209.85.219.46 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="VuZ7/pji" Received: by mail-qv1-f46.google.com with SMTP id 6a1803df08f44-6dd01781b56so19059466d6.0; Fri, 07 Mar 2025 03:28:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741346879; x=1741951679; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ayI/af+TSyQ1KE77y+2nHn400A/mD2p9rOFZzbDzfrs=; b=VuZ7/pji+c1AKvxUWvvEEG4aCNvzoyWC02r6qsaOtZvA6Y2rSBIRL1DOV+tZzTVBRa 0/NHjpdfjfE4ZIfXsV6r5yh0v43h5D/JTePLDMiH+F2SfucCudWM/EKKbe2S6nPJ7ZIu iWgge5RH0P/uW2dN9npv0B6NwXyHTuz8KCASfdJK/Woihc/9MkLYM3xMqUpjINbQvRYh hwBwWvAlZr3Rjw5aZ9Z3nxaoIsz46fONHj0/oxwik83KO0lOR9u+do+Z1Sm2rrcPgqC9 RLu0ygX2iZxf9aWfN0T0wvLKeGULnNy7jI33s9eFOUgK4jCUIftzmYgrtE0GHQCIyUR/ nxbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741346879; x=1741951679; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ayI/af+TSyQ1KE77y+2nHn400A/mD2p9rOFZzbDzfrs=; b=lVbxriRRNp5wYCyrZ+jCImpn/jZoh5zY8sVoZRsXqxMQyWuD7Fy7tW6NIFwZ5c0q1t BFrIxugUaatYHtbN520l0KBx4W4jbKjyg6hvHRGZm+fjg4siSt1xOc+nzsTC7O9FyoVw yhbSKT44bpqcrY42s6cXkapsf9In2+fyX07XHWoL7T92HWLyf3sd9grh9zgoAcDvIh1p uuyWWjNLCqqyef1//rJPMlB+YYBFGGnHGCo8DOsTrGgwDUtKRT4OOqMjpiFuh5bPXZjW 4CJwYGYFOu8jq0SXDfVd5PBsPlGIXRS0T8M0uOxvoHwU3oRcAavOFpjIlJVi9l63oa3B 4IHg== X-Forwarded-Encrypted: i=1; AJvYcCU68KgCHVcgLkqNv1tWYTpDbQJWpnwxs6VxL7F7vG0cvo0Kl1DxRmux+rEM/YkTioLaS28M55X9xMyZw4T3iz/m@vger.kernel.org, AJvYcCUcL4em76cxZW8e4CdYckdtk52Cgs8AO53GQKw2WcpoqTw4uX6AbSwhHOZteWEN0wannDRC2tG+pG/3PIc=@vger.kernel.org X-Gm-Message-State: AOJu0YwtBlx3ub7mIQfRv+uKTRxR7Hd5aAVZ60dbJ2/G9TXPsf3RFfWV pghGh0HsWK99H1DFMJJCsHRKjH2mHmgPfv0P0/Z3BbnRKwZx0HGbuD3lS6jd7EI= X-Gm-Gg: ASbGnctHQ6WGNIQRQFt5KAipvcORLlH4TTK+g3Th/1Ve115xVF1ddqRwEOsHxZax8Gz eTZYVfTRW34DEH2Lxr7zdmxoq2zFIbeDzv1g9PsNU92Xc7pYqqJnd5uDxxPTWbEEuXpDU+ABJUI k48DTkNT6SN3CWrz9BqEvmBeEkKlLpjM4KJQoxrjna3+xROQ5ZSC2k9FRIZfX23NEunMlXIGtcB WkekyAo9986qTgYoNcsEB6MrZ3D5tGw6GiCpDkByHUM6GLVDpv1urA7loH+yD8LClctSXMMBtxG ZGFwwvBUmAIkbO/K5H23PBArrMZ9wuYJZ700nRe49KfI5jaCc8+7SBUIRaMAsMiBpTs= X-Google-Smtp-Source: AGHT+IHwrYuYUInVetAgUWMiXJhkVXRVylqnhUV+4QY+2mH3K0buQDTc+qLsoHa7qXkQOV2kdyXJNQ== X-Received: by 2002:a05:6214:212b:b0:6e4:4393:de7 with SMTP id 6a1803df08f44-6e9005b5e1emr30380416d6.2.1741346879049; Fri, 07 Mar 2025 03:27:59 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:f0dd:49a0:8ab6:b3b6]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e8f70a446dsm18509416d6.56.2025.03.07.03.27.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Mar 2025 03:27:57 -0800 (PST) From: Tamir Duberstein Date: Fri, 07 Mar 2025 06:27:39 -0500 Subject: [PATCH v9 6/6] scanf: further break kunit into test cases Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250307-scanf-kunit-convert-v9-6-b98820fa39ff@gmail.com> References: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> In-Reply-To: <20250307-scanf-kunit-convert-v9-0-b98820fa39ff@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev This gives us more granular test output. Output before: > KTAP version 1 > 1..1 > KTAP version 1 > # Subtest: scanf > # module: scanf_kunit > 1..10 > ok 1 numbers_simple > KTAP version 1 > # Subtest: numbers_list > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list: pass:5 fail:0 skip:0 total:5 > ok 2 numbers_list > KTAP version 1 > # Subtest: numbers_list_field_width_typemax > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_typemax: pass:5 fail:0 skip:0 total:5 > ok 3 numbers_list_field_width_typemax > KTAP version 1 > # Subtest: numbers_list_field_width_val_width > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_val_width: pass:5 fail:0 skip:0 total:5 > ok 4 numbers_list_field_width_val_width > ok 5 numbers_slice > ok 6 numbers_prefix_overflow > ok 7 test_simple_strtoull > ok 8 test_simple_strtoll > ok 9 test_simple_strtoul > ok 10 test_simple_strtol > # scanf: pass:10 fail:0 skip:0 total:10 > # Totals: pass:22 fail:0 skip:0 total:22 > ok 1 scanf Output after: > KTAP version 1 > 1..1 > KTAP version 1 > # Subtest: scanf > # module: scanf_kunit > 1..21 > ok 1 numbers_simple > KTAP version 1 > # Subtest: numbers_list_ll > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_ll: pass:5 fail:0 skip:0 total:5 > ok 2 numbers_list_ll > KTAP version 1 > # Subtest: numbers_list_l > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_l: pass:5 fail:0 skip:0 total:5 > ok 3 numbers_list_l > KTAP version 1 > # Subtest: numbers_list_d > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_d: pass:5 fail:0 skip:0 total:5 > ok 4 numbers_list_d > KTAP version 1 > # Subtest: numbers_list_h > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_h: pass:5 fail:0 skip:0 total:5 > ok 5 numbers_list_h > KTAP version 1 > # Subtest: numbers_list_hh > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_hh: pass:5 fail:0 skip:0 total:5 > ok 6 numbers_list_hh > KTAP version 1 > # Subtest: numbers_list_field_width_ll > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_ll: pass:5 fail:0 skip:0 total:5 > ok 7 numbers_list_field_width_ll > KTAP version 1 > # Subtest: numbers_list_field_width_l > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_l: pass:5 fail:0 skip:0 total:5 > ok 8 numbers_list_field_width_l > KTAP version 1 > # Subtest: numbers_list_field_width_d > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_d: pass:5 fail:0 skip:0 total:5 > ok 9 numbers_list_field_width_d > KTAP version 1 > # Subtest: numbers_list_field_width_h > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_h: pass:5 fail:0 skip:0 total:5 > ok 10 numbers_list_field_width_h > KTAP version 1 > # Subtest: numbers_list_field_width_hh > ok 1 " " > ok 2 ":" > ok 3 "," > ok 4 "-" > ok 5 "/" > # numbers_list_field_width_hh: pass:5 fail:0 skip:0 total:5 > ok 11 numbers_list_field_width_hh > KTAP version 1 > # Subtest: numbers_list_field_width_val_ll > ok 1 "" > ok 2 " " > ok 3 ":" > ok 4 "," > ok 5 "-" > ok 6 "/" > # numbers_list_field_width_val_ll: pass:6 fail:0 skip:0 total:6 > ok 12 numbers_list_field_width_val_ll > KTAP version 1 > # Subtest: numbers_list_field_width_val_l > ok 1 "" > ok 2 " " > ok 3 ":" > ok 4 "," > ok 5 "-" > ok 6 "/" > # numbers_list_field_width_val_l: pass:6 fail:0 skip:0 total:6 > ok 13 numbers_list_field_width_val_l > KTAP version 1 > # Subtest: numbers_list_field_width_val_d > ok 1 "" > ok 2 " " > ok 3 ":" > ok 4 "," > ok 5 "-" > ok 6 "/" > # numbers_list_field_width_val_d: pass:6 fail:0 skip:0 total:6 > ok 14 numbers_list_field_width_val_d > KTAP version 1 > # Subtest: numbers_list_field_width_val_h > ok 1 "" > ok 2 " " > ok 3 ":" > ok 4 "," > ok 5 "-" > ok 6 "/" > # numbers_list_field_width_val_h: pass:6 fail:0 skip:0 total:6 > ok 15 numbers_list_field_width_val_h > KTAP version 1 > # Subtest: numbers_list_field_width_val_hh > ok 1 "" > ok 2 " " > ok 3 ":" > ok 4 "," > ok 5 "-" > ok 6 "/" > # numbers_list_field_width_val_hh: pass:6 fail:0 skip:0 total:6 > ok 16 numbers_list_field_width_val_hh > ok 17 numbers_prefix_overflow > ok 18 test_simple_strtoull > ok 19 test_simple_strtoll > ok 20 test_simple_strtoul > ok 21 test_simple_strtol > # scanf: pass:21 fail:0 skip:0 total:21 > # Totals: pass:86 fail:0 skip:0 total:86 > ok 1 scanf Signed-off-by: Tamir Duberstein --- lib/tests/scanf_kunit.c | 170 ++++++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 76 deletions(-) diff --git a/lib/tests/scanf_kunit.c b/lib/tests/scanf_kunit.c index d96d7ca85b52..2193937039a4 100644 --- a/lib/tests/scanf_kunit.c +++ b/lib/tests/scanf_kunit.c @@ -383,8 +383,11 @@ do { \ test_array_8(fn, expect, test_buffer, fmt_buffer, result); \ } while (0) -static void numbers_list_ll(struct kunit *test, const char *delim) +static void numbers_list_ll(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_8(unsigned long long, "%llu", delim, "llu", check_ull); numbers_list_8(long long, "%lld", delim, "lld", check_ll); numbers_list_8(long long, "%lld", delim, "lli", check_ll); @@ -393,8 +396,11 @@ static void numbers_list_ll(struct kunit *test, const char *delim) numbers_list_8(long long, "0x%llx", delim, "lli", check_ll); } -static void numbers_list_l(struct kunit *test, const char *delim) +static void numbers_list_l(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_8(unsigned long, "%lu", delim, "lu", check_ulong); numbers_list_8(long, "%ld", delim, "ld", check_long); numbers_list_8(long, "%ld", delim, "li", check_long); @@ -403,8 +409,11 @@ static void numbers_list_l(struct kunit *test, const char *delim) numbers_list_8(long, "0x%lx", delim, "li", check_long); } -static void numbers_list_d(struct kunit *test, const char *delim) +static void numbers_list_d(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_8(unsigned int, "%u", delim, "u", check_uint); numbers_list_8(int, "%d", delim, "d", check_int); numbers_list_8(int, "%d", delim, "i", check_int); @@ -413,8 +422,11 @@ static void numbers_list_d(struct kunit *test, const char *delim) numbers_list_8(int, "0x%x", delim, "i", check_int); } -static void numbers_list_h(struct kunit *test, const char *delim) +static void numbers_list_h(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_8(unsigned short, "%hu", delim, "hu", check_ushort); numbers_list_8(short, "%hd", delim, "hd", check_short); numbers_list_8(short, "%hd", delim, "hi", check_short); @@ -423,8 +435,11 @@ static void numbers_list_h(struct kunit *test, const char *delim) numbers_list_8(short, "0x%hx", delim, "hi", check_short); } -static void numbers_list_hh(struct kunit *test, const char *delim) +static void numbers_list_hh(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_8(unsigned char, "%hhu", delim, "hhu", check_uchar); numbers_list_8(signed char, "%hhd", delim, "hhd", check_char); numbers_list_8(signed char, "%hhd", delim, "hhi", check_char); @@ -433,20 +448,11 @@ static void numbers_list_hh(struct kunit *test, const char *delim) numbers_list_8(signed char, "0x%hhx", delim, "hhi", check_char); } -static void numbers_list(struct kunit *test) +static void numbers_list_field_width_ll(struct kunit *test) { const char * const *param = test->param_value; const char *delim = *param; - numbers_list_ll(test, delim); - numbers_list_l(test, delim); - numbers_list_d(test, delim); - numbers_list_h(test, delim); - numbers_list_hh(test, delim); -} - -static void numbers_list_field_width_ll(struct kunit *test, const char *delim) -{ numbers_list_fix_width(unsigned long long, "%llu", delim, 20, "llu", check_ull); numbers_list_fix_width(long long, "%lld", delim, 20, "lld", check_ll); numbers_list_fix_width(long long, "%lld", delim, 20, "lli", check_ll); @@ -455,8 +461,11 @@ static void numbers_list_field_width_ll(struct kunit *test, const char *delim) numbers_list_fix_width(long long, "0x%llx", delim, 18, "lli", check_ll); } -static void numbers_list_field_width_l(struct kunit *test, const char *delim) +static void numbers_list_field_width_l(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + #if BITS_PER_LONG == 64 numbers_list_fix_width(unsigned long, "%lu", delim, 20, "lu", check_ulong); numbers_list_fix_width(long, "%ld", delim, 20, "ld", check_long); @@ -474,8 +483,11 @@ static void numbers_list_field_width_l(struct kunit *test, const char *delim) #endif } -static void numbers_list_field_width_d(struct kunit *test, const char *delim) +static void numbers_list_field_width_d(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_fix_width(unsigned int, "%u", delim, 10, "u", check_uint); numbers_list_fix_width(int, "%d", delim, 11, "d", check_int); numbers_list_fix_width(int, "%d", delim, 11, "i", check_int); @@ -484,8 +496,11 @@ static void numbers_list_field_width_d(struct kunit *test, const char *delim) numbers_list_fix_width(int, "0x%x", delim, 10, "i", check_int); } -static void numbers_list_field_width_h(struct kunit *test, const char *delim) +static void numbers_list_field_width_h(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_fix_width(unsigned short, "%hu", delim, 5, "hu", check_ushort); numbers_list_fix_width(short, "%hd", delim, 6, "hd", check_short); numbers_list_fix_width(short, "%hd", delim, 6, "hi", check_short); @@ -494,8 +509,11 @@ static void numbers_list_field_width_h(struct kunit *test, const char *delim) numbers_list_fix_width(short, "0x%hx", delim, 6, "hi", check_short); } -static void numbers_list_field_width_hh(struct kunit *test, const char *delim) +static void numbers_list_field_width_hh(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_fix_width(unsigned char, "%hhu", delim, 3, "hhu", check_uchar); numbers_list_fix_width(signed char, "%hhd", delim, 4, "hhd", check_char); numbers_list_fix_width(signed char, "%hhd", delim, 4, "hhi", check_char); @@ -504,24 +522,11 @@ static void numbers_list_field_width_hh(struct kunit *test, const char *delim) numbers_list_fix_width(signed char, "0x%hhx", delim, 4, "hhi", check_char); } -/* - * List of numbers separated by delim. Each field width specifier is the - * maximum possible digits for the given type and base. - */ -static void numbers_list_field_width_typemax(struct kunit *test) +static void numbers_list_field_width_val_ll(struct kunit *test) { const char * const *param = test->param_value; const char *delim = *param; - numbers_list_field_width_ll(test, delim); - numbers_list_field_width_l(test, delim); - numbers_list_field_width_d(test, delim); - numbers_list_field_width_h(test, delim); - numbers_list_field_width_hh(test, delim); -} - -static void numbers_list_field_width_val_ll(struct kunit *test, const char *delim) -{ numbers_list_val_width(unsigned long long, "%llu", delim, "llu", check_ull); numbers_list_val_width(long long, "%lld", delim, "lld", check_ll); numbers_list_val_width(long long, "%lld", delim, "lli", check_ll); @@ -530,8 +535,11 @@ static void numbers_list_field_width_val_ll(struct kunit *test, const char *deli numbers_list_val_width(long long, "0x%llx", delim, "lli", check_ll); } -static void numbers_list_field_width_val_l(struct kunit *test, const char *delim) +static void numbers_list_field_width_val_l(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_val_width(unsigned long, "%lu", delim, "lu", check_ulong); numbers_list_val_width(long, "%ld", delim, "ld", check_long); numbers_list_val_width(long, "%ld", delim, "li", check_long); @@ -540,8 +548,11 @@ static void numbers_list_field_width_val_l(struct kunit *test, const char *delim numbers_list_val_width(long, "0x%lx", delim, "li", check_long); } -static void numbers_list_field_width_val_d(struct kunit *test, const char *delim) +static void numbers_list_field_width_val_d(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_val_width(unsigned int, "%u", delim, "u", check_uint); numbers_list_val_width(int, "%d", delim, "d", check_int); numbers_list_val_width(int, "%d", delim, "i", check_int); @@ -550,8 +561,11 @@ static void numbers_list_field_width_val_d(struct kunit *test, const char *delim numbers_list_val_width(int, "0x%x", delim, "i", check_int); } -static void numbers_list_field_width_val_h(struct kunit *test, const char *delim) +static void numbers_list_field_width_val_h(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_val_width(unsigned short, "%hu", delim, "hu", check_ushort); numbers_list_val_width(short, "%hd", delim, "hd", check_short); numbers_list_val_width(short, "%hd", delim, "hi", check_short); @@ -560,8 +574,11 @@ static void numbers_list_field_width_val_h(struct kunit *test, const char *delim numbers_list_val_width(short, "0x%hx", delim, "hi", check_short); } -static void numbers_list_field_width_val_hh(struct kunit *test, const char *delim) +static void numbers_list_field_width_val_hh(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_val_width(unsigned char, "%hhu", delim, "hhu", check_uchar); numbers_list_val_width(signed char, "%hhd", delim, "hhd", check_char); numbers_list_val_width(signed char, "%hhd", delim, "hhi", check_char); @@ -570,38 +587,6 @@ static void numbers_list_field_width_val_hh(struct kunit *test, const char *deli numbers_list_val_width(signed char, "0x%hhx", delim, "hhi", check_char); } -/* - * List of numbers separated by delim. Each field width specifier is the - * exact length of the corresponding value digits in the string being scanned. - */ -static void numbers_list_field_width_val_width(struct kunit *test) -{ - const char * const *param = test->param_value; - const char *delim = *param; - - numbers_list_field_width_val_ll(test, delim); - numbers_list_field_width_val_l(test, delim); - numbers_list_field_width_val_d(test, delim); - numbers_list_field_width_val_h(test, delim); - numbers_list_field_width_val_hh(test, delim); -} - -/* - * Slice a continuous string of digits without field delimiters, containing - * numbers of varying length, using the field width to extract each group - * of digits. For example the hex values c0,3,bf01,303 would have a - * string representation of "c03bf01303" and extracted with "%2x%1x%4x%3x". - */ -static void numbers_slice(struct kunit *test) -{ - const char *delim = ""; - - KUNIT_ASSERT_PTR_EQ(test, test->param_value, NULL); - test->param_value = &delim; - - numbers_list_field_width_val_width(test); -} - #define test_number_prefix(T, str, scan_fmt, expect0, expect1, n_args, fn) \ do { \ const T expect[2] = { expect0, expect1 }; \ @@ -758,16 +743,49 @@ static void number_delimiter_param_desc(const char * const *param, KUNIT_ARRAY_PARAM(number_delimiters, number_delimiters, number_delimiter_param_desc); +static const void *optional_number_delimiters_gen_params(const void *prev, char *desc) +{ + static const char * const blank = ""; + + if (prev == NULL) { + number_delimiter_param_desc(&blank, desc); + return ␣ + } + if (prev == &blank) + return number_delimiters_gen_params(NULL, desc); + return number_delimiters_gen_params(prev, desc); +} + static struct kunit_case scanf_test_cases[] = { KUNIT_CASE(numbers_simple), /* String with multiple numbers separated by delimiter. */ - KUNIT_CASE_PARAM(numbers_list, number_delimiters_gen_params), - /* Field width may be longer than actual field digits. */ - KUNIT_CASE_PARAM(numbers_list_field_width_typemax, number_delimiters_gen_params), - /* Each field width exactly length of actual field digits. */ - KUNIT_CASE_PARAM(numbers_list_field_width_val_width, number_delimiters_gen_params), - /* Slice continuous sequence of digits using field widths. */ - KUNIT_CASE(numbers_slice), + KUNIT_CASE_PARAM(numbers_list_ll, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_l, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_d, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_h, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_hh, number_delimiters_gen_params), + + /* + * Lists of numbers separated by delim. Each field width specifier is the + * maximum possible digits for the given type and base. + */ + KUNIT_CASE_PARAM(numbers_list_field_width_ll, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_l, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_d, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_h, number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_hh, number_delimiters_gen_params), + + /* + * Lists of numbers separated by delim. Each field width specifier is the + * exact length of the corresponding value digits in the string being scanned. + * The empty string is included in the list of delimiters. + */ + KUNIT_CASE_PARAM(numbers_list_field_width_val_ll, optional_number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_val_l, optional_number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_val_d, optional_number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_val_h, optional_number_delimiters_gen_params), + KUNIT_CASE_PARAM(numbers_list_field_width_val_hh, optional_number_delimiters_gen_params), + KUNIT_CASE(numbers_prefix_overflow), KUNIT_CASE(test_simple_strtoull),